efc_sm.c (1124B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term 4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 5 */ 6 7/* 8 * Generic state machine framework. 9 */ 10#include "efc.h" 11#include "efc_sm.h" 12 13/** 14 * efc_sm_post_event() - Post an event to a context. 15 * 16 * @ctx: State machine context 17 * @evt: Event to post 18 * @data: Event-specific data (if any) 19 */ 20int 21efc_sm_post_event(struct efc_sm_ctx *ctx, 22 enum efc_sm_event evt, void *data) 23{ 24 if (!ctx->current_state) 25 return -EIO; 26 27 ctx->current_state(ctx, evt, data); 28 return 0; 29} 30 31void 32efc_sm_transition(struct efc_sm_ctx *ctx, 33 void (*state)(struct efc_sm_ctx *, 34 enum efc_sm_event, void *), void *data) 35 36{ 37 if (ctx->current_state == state) { 38 efc_sm_post_event(ctx, EFC_EVT_REENTER, data); 39 } else { 40 efc_sm_post_event(ctx, EFC_EVT_EXIT, data); 41 ctx->current_state = state; 42 efc_sm_post_event(ctx, EFC_EVT_ENTER, data); 43 } 44} 45 46static char *event_name[] = EFC_SM_EVENT_NAME; 47 48const char *efc_sm_event_name(enum efc_sm_event evt) 49{ 50 if (evt > EFC_EVT_LAST) 51 return "unknown"; 52 53 return event_name[evt]; 54}