| // 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]; |
| } |