]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
dcc21cc0 LW |
2 | /* |
3 | * Header file for the compaq Micro MFD | |
4 | */ | |
5 | ||
6 | #ifndef _MFD_IPAQ_MICRO_H_ | |
7 | #define _MFD_IPAQ_MICRO_H_ | |
8 | ||
9 | #include <linux/spinlock.h> | |
10 | #include <linux/completion.h> | |
11 | #include <linux/list.h> | |
12 | ||
13 | #define TX_BUF_SIZE 32 | |
14 | #define RX_BUF_SIZE 16 | |
15 | #define CHAR_SOF 0x02 | |
16 | ||
17 | /* | |
18 | * These are the different messages that can be sent to the microcontroller | |
19 | * to control various aspects. | |
20 | */ | |
21 | #define MSG_VERSION 0x0 | |
22 | #define MSG_KEYBOARD 0x2 | |
23 | #define MSG_TOUCHSCREEN 0x3 | |
24 | #define MSG_EEPROM_READ 0x4 | |
25 | #define MSG_EEPROM_WRITE 0x5 | |
26 | #define MSG_THERMAL_SENSOR 0x6 | |
27 | #define MSG_NOTIFY_LED 0x8 | |
28 | #define MSG_BATTERY 0x9 | |
29 | #define MSG_SPI_READ 0xb | |
30 | #define MSG_SPI_WRITE 0xc | |
31 | #define MSG_BACKLIGHT 0xd /* H3600 only */ | |
32 | #define MSG_CODEC_CTRL 0xe /* H3100 only */ | |
33 | #define MSG_DISPLAY_CTRL 0xf /* H3100 only */ | |
34 | ||
35 | /* state of receiver parser */ | |
36 | enum rx_state { | |
37 | STATE_SOF = 0, /* Next byte should be start of frame */ | |
38 | STATE_ID, /* Next byte is ID & message length */ | |
39 | STATE_DATA, /* Next byte is a data byte */ | |
40 | STATE_CHKSUM /* Next byte should be checksum */ | |
41 | }; | |
42 | ||
43 | /** | |
44 | * struct ipaq_micro_txdev - TX state | |
45 | * @len: length of message in TX buffer | |
46 | * @index: current index into TX buffer | |
47 | * @buf: TX buffer | |
48 | */ | |
49 | struct ipaq_micro_txdev { | |
50 | u8 len; | |
51 | u8 index; | |
52 | u8 buf[TX_BUF_SIZE]; | |
53 | }; | |
54 | ||
55 | /** | |
56 | * struct ipaq_micro_rxdev - RX state | |
57 | * @state: context of RX state machine | |
58 | * @chksum: calculated checksum | |
59 | * @id: message ID from packet | |
60 | * @len: RX buffer length | |
61 | * @index: RX buffer index | |
62 | * @buf: RX buffer | |
63 | */ | |
64 | struct ipaq_micro_rxdev { | |
65 | enum rx_state state; | |
66 | unsigned char chksum; | |
67 | u8 id; | |
68 | unsigned int len; | |
69 | unsigned int index; | |
70 | u8 buf[RX_BUF_SIZE]; | |
71 | }; | |
72 | ||
73 | /** | |
74 | * struct ipaq_micro_msg - message to the iPAQ microcontroller | |
75 | * @id: 4-bit ID of the message | |
76 | * @tx_len: length of TX data | |
77 | * @tx_data: TX data to send | |
78 | * @rx_len: length of receieved RX data | |
79 | * @rx_data: RX data to recieve | |
80 | * @ack: a completion that will be completed when RX is complete | |
81 | * @node: list node if message gets queued | |
82 | */ | |
83 | struct ipaq_micro_msg { | |
84 | u8 id; | |
85 | u8 tx_len; | |
86 | u8 tx_data[TX_BUF_SIZE]; | |
87 | u8 rx_len; | |
88 | u8 rx_data[RX_BUF_SIZE]; | |
89 | struct completion ack; | |
90 | struct list_head node; | |
91 | }; | |
92 | ||
93 | /** | |
94 | * struct ipaq_micro - iPAQ microcontroller state | |
95 | * @dev: corresponding platform device | |
96 | * @base: virtual memory base for underlying serial device | |
97 | * @sdlc: virtual memory base for Synchronous Data Link Controller | |
98 | * @version: version string | |
99 | * @tx: TX state | |
100 | * @rx: RX state | |
101 | * @lock: lock for this state container | |
102 | * @msg: current message | |
103 | * @queue: message queue | |
104 | * @key: callback for asynchronous key events | |
105 | * @key_data: data to pass along with key events | |
106 | * @ts: callback for asynchronous touchscreen events | |
107 | * @ts_data: data to pass along with key events | |
108 | */ | |
109 | struct ipaq_micro { | |
110 | struct device *dev; | |
111 | void __iomem *base; | |
112 | void __iomem *sdlc; | |
113 | char version[5]; | |
114 | struct ipaq_micro_txdev tx; /* transmit ISR state */ | |
115 | struct ipaq_micro_rxdev rx; /* receive ISR state */ | |
116 | spinlock_t lock; | |
117 | struct ipaq_micro_msg *msg; | |
118 | struct list_head queue; | |
119 | void (*key) (void *data, int len, unsigned char *rxdata); | |
120 | void *key_data; | |
121 | void (*ts) (void *data, int len, unsigned char *rxdata); | |
122 | void *ts_data; | |
123 | }; | |
124 | ||
125 | extern int | |
126 | ipaq_micro_tx_msg(struct ipaq_micro *micro, struct ipaq_micro_msg *msg); | |
127 | ||
128 | static inline int | |
129 | ipaq_micro_tx_msg_sync(struct ipaq_micro *micro, | |
130 | struct ipaq_micro_msg *msg) | |
131 | { | |
132 | int ret; | |
133 | ||
134 | init_completion(&msg->ack); | |
135 | ret = ipaq_micro_tx_msg(micro, msg); | |
136 | wait_for_completion(&msg->ack); | |
137 | ||
138 | return ret; | |
139 | } | |
140 | ||
141 | static inline int | |
142 | ipaq_micro_tx_msg_async(struct ipaq_micro *micro, | |
143 | struct ipaq_micro_msg *msg) | |
144 | { | |
145 | init_completion(&msg->ack); | |
146 | return ipaq_micro_tx_msg(micro, msg); | |
147 | } | |
148 | ||
149 | #endif /* _MFD_IPAQ_MICRO_H_ */ |