1 #include <minix/audio_fw.h>
2
3 /*
4 * - From audio_fw.h:
5 * EXTERN drv_t drv;
6 * EXTERN sub_dev_t sub_dev[];
7 */
8
9 /* State management helpers */
10 static int is_read_pending;
11 static int is_write_pending;
load_state_info(void)12 static void load_state_info(void)
13 {
14 int i, dma_mode, found_pending;
15
16 /* Check if reads or writes are pending. */
17 is_read_pending = FALSE;
18 is_write_pending = FALSE;
19 found_pending = FALSE;
20 for (i = 0; i < drv.NrOfSubDevices && !found_pending; i++) {
21 if(sub_dev[i].RevivePending) {
22 dma_mode = sub_dev[i].DmaMode;
23
24 if(dma_mode == READ_DMA) {
25 is_read_pending = TRUE;
26 }
27 else if (dma_mode == WRITE_DMA){
28 is_write_pending = TRUE;
29 }
30 }
31
32 found_pending = (is_read_pending && is_write_pending);
33 }
34 }
35
36 /* Custom states definition. */
37 #define AUDIO_STATE_READ_REQUEST_FREE (SEF_LU_STATE_CUSTOM_BASE + 0)
38 #define AUDIO_STATE_WRITE_REQUEST_FREE (SEF_LU_STATE_CUSTOM_BASE + 1)
39 #define AUDIO_STATE_IS_CUSTOM(s) \
40 ((s) >= AUDIO_STATE_READ_REQUEST_FREE && (s) <=AUDIO_STATE_WRITE_REQUEST_FREE)
41
42 /*===========================================================================*
43 * sef_cb_lu_prepare *
44 *===========================================================================*/
sef_cb_lu_prepare(int state)45 int sef_cb_lu_prepare(int state)
46 {
47 int is_ready;
48
49 /* Load state information. */
50 load_state_info();
51
52 /* Check if we are ready for the target state. */
53 is_ready = FALSE;
54 switch(state) {
55 /* Standard states. */
56 case SEF_LU_STATE_REQUEST_FREE:
57 is_ready = (!is_read_pending && !is_write_pending);
58 break;
59
60 case SEF_LU_STATE_PROTOCOL_FREE:
61 is_ready = (!is_read_pending && !is_write_pending);
62 break;
63
64 /* Custom states. */
65 case AUDIO_STATE_READ_REQUEST_FREE:
66 is_ready = (!is_read_pending);
67 break;
68
69 case AUDIO_STATE_WRITE_REQUEST_FREE:
70 is_ready = (!is_write_pending);
71 break;
72 }
73
74 /* Tell SEF if we are ready. */
75 return is_ready ? OK : ENOTREADY;
76 }
77
78 /*===========================================================================*
79 * sef_cb_lu_state_isvalid *
80 *===========================================================================*/
sef_cb_lu_state_isvalid(int state,int __unused flags)81 int sef_cb_lu_state_isvalid(int state, int __unused flags)
82 {
83 return SEF_LU_STATE_IS_STANDARD(state) || AUDIO_STATE_IS_CUSTOM(state);
84 }
85
86 /*===========================================================================*
87 * sef_cb_lu_state_dump *
88 *===========================================================================*/
sef_cb_lu_state_dump(int state)89 void sef_cb_lu_state_dump(int state)
90 {
91 /* Load state information. */
92 load_state_info();
93
94 sef_lu_dprint("audio: live update state = %d\n", state);
95 sef_lu_dprint("audio: is_read_pending = %d\n", is_read_pending);
96 sef_lu_dprint("audio: is_write_pending = %d\n", is_write_pending);
97
98 sef_lu_dprint("audio: SEF_LU_STATE_WORK_FREE(%d) reached = %d\n",
99 SEF_LU_STATE_WORK_FREE, TRUE);
100 sef_lu_dprint("audio: SEF_LU_STATE_REQUEST_FREE(%d) reached = %d\n",
101 SEF_LU_STATE_REQUEST_FREE, (!is_read_pending && !is_write_pending));
102 sef_lu_dprint("audio: SEF_LU_STATE_PROTOCOL_FREE(%d) reached = %d\n",
103 SEF_LU_STATE_PROTOCOL_FREE, (!is_read_pending && !is_write_pending));
104 sef_lu_dprint("audio: AUDIO_STATE_READ_REQUEST_FREE(%d) reached = %d\n",
105 AUDIO_STATE_READ_REQUEST_FREE, (!is_read_pending));
106 sef_lu_dprint("audio: AUDIO_STATE_WRITE_REQUEST_FREE(%d) reached = %d\n",
107 AUDIO_STATE_WRITE_REQUEST_FREE, (!is_write_pending));
108 }
109
110