| // SPDX-License-Identifier: GPL-2.0 | |
| /* | |
| * Copyright (C) 2021 Broadcom. All Rights Reserved. The term | |
| * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. | |
| */ | |
| /* | |
| * Generic state machine framework. | |
| */ | |
| #include "efc.h" | |
| #include "efc_sm.h" | |
| /** | |
| * efc_sm_post_event() - Post an event to a context. | |
| * | |
| * @ctx: State machine context | |
| * @evt: Event to post | |
| * @data: Event-specific data (if any) | |
| */ | |
| int | |
| efc_sm_post_event(struct efc_sm_ctx *ctx, | |
| enum efc_sm_event evt, void *data) | |
| { | |
| if (!ctx->current_state) | |
| return -EIO; | |
| ctx->current_state(ctx, evt, data); | |
| return 0; | |
| } | |
| void | |
| efc_sm_transition(struct efc_sm_ctx *ctx, | |
| void (*state)(struct efc_sm_ctx *, | |
| enum efc_sm_event, void *), void *data) | |
| { | |
| if (ctx->current_state == state) { | |
| efc_sm_post_event(ctx, EFC_EVT_REENTER, data); | |
| } else { | |
| efc_sm_post_event(ctx, EFC_EVT_EXIT, data); | |
| ctx->current_state = state; | |
| efc_sm_post_event(ctx, EFC_EVT_ENTER, data); | |
| } | |
| } | |
| static char *event_name[] = EFC_SM_EVENT_NAME; | |
| const char *efc_sm_event_name(enum efc_sm_event evt) | |
| { | |
| if (evt > EFC_EVT_LAST) | |
| return "unknown"; | |
| return event_name[evt]; | |
| } |