1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
/*
* Copyright (C) ST-Ericsson SA 2011
*
* Author: Chris Blair <chris.blair@stericsson.com> for ST-Ericsson
*
* License terms: GNU General Public License (GPL) version 2
*
* Modem IPC driver protocol interface header:
* statemachine functionality.
*/
#ifndef _MODEM_STATEMACHINE_H_
#define _MODEM_STATEMACHINE_H_
#include <linux/kernel.h>
/* valid states for the driver state machine */
enum ipc_sm_state_id {
IPC_SM_INIT,
IPC_SM_HALT,
IPC_SM_RESET,
IPC_SM_WAIT_SLAVE_STABLE,
IPC_SM_WAIT_HANDSHAKE_INACTIVE,
IPC_SM_SLW_TX_BOOTREQ,
IPC_SM_ACT_TX_BOOTREQ,
IPC_SM_SLW_RX_BOOTRESP,
IPC_SM_ACT_RX_BOOTRESP,
IPC_SM_IDL,
IPC_SM_SLW_TX_WR_CMD,
IPC_SM_ACT_TX_WR_CMD,
IPC_SM_SLW_TX_WR_DAT,
IPC_SM_ACT_TX_WR_DAT,
IPC_SM_SLW_TX_RD_CMD,
IPC_SM_ACT_TX_RD_CMD,
IPC_SM_SLW_RX_WR_CMD,
IPC_SM_ACT_RX_WR_CMD,
IPC_SM_ACT_RX_WR_DAT,
IPC_SM_STATE_ID_NBR
};
/* state machine trigger causes events */
#define IPC_SM_RUN_NONE (0x00)
#define IPC_SM_RUN_SLAVE_IRQ (0x01)
#define IPC_SM_RUN_TFR_COMPLETE (0x02)
#define IPC_SM_RUN_TX_REQ (0x04)
#define IPC_SM_RUN_INIT (0x08)
#define IPC_SM_RUN_ABORT (0x10)
#define IPC_SM_RUN_COMMS_TMO (0x20)
#define IPC_SM_RUN_STABLE_TMO (0x40)
#define IPC_SM_RUN_RESET (0x80)
struct ipc_link_context; /* forward declaration */
typedef u8 (*ipc_sm_enter_func)(u8 event, struct ipc_link_context *context);
typedef const struct ipc_sm_state *(*ipc_sm_exit_func)(u8 event,
struct ipc_link_context *context);
struct ipc_sm_state {
enum ipc_sm_state_id id;
ipc_sm_enter_func enter;
ipc_sm_exit_func exit;
u8 events;
};
const struct ipc_sm_state *ipc_sm_idle_state(struct ipc_link_context *context);
const struct ipc_sm_state *ipc_sm_init_state(struct ipc_link_context *context);
const struct ipc_sm_state *ipc_sm_state(u8 id);
bool ipc_sm_valid_for_state(u8 event, const struct ipc_sm_state *state);
void ipc_sm_kick(u8 event, struct ipc_link_context *context);
#endif /* _MODEM_STATEMACHINE_H_ */
|