Commit c8602edf3f9471466755329b78d309f2a01dd449
Committed by
Thomas Kunze
1 parent
1d0ad843b0
Exists in
master
and in
39 other branches
move drivers/mfd/*.h to include/linux/mfd
So drivers like collie_battery driver can use those files easier.
Showing 9 changed files with 328 additions and 326 deletions Side-by-side Diff
drivers/mfd/mcp-core.c
... | ... | @@ -17,11 +17,11 @@ |
17 | 17 | #include <linux/device.h> |
18 | 18 | #include <linux/slab.h> |
19 | 19 | #include <linux/string.h> |
20 | +#include <linux/mfd/mcp.h> | |
20 | 21 | |
21 | 22 | #include <mach/dma.h> |
22 | 23 | #include <asm/system.h> |
23 | 24 | |
24 | -#include "mcp.h" | |
25 | 25 | |
26 | 26 | #define to_mcp(d) container_of(d, struct mcp, attached_device) |
27 | 27 | #define to_mcp_driver(d) container_of(d, struct mcp_driver, drv) |
drivers/mfd/mcp-sa11x0.c
... | ... | @@ -19,6 +19,7 @@ |
19 | 19 | #include <linux/spinlock.h> |
20 | 20 | #include <linux/slab.h> |
21 | 21 | #include <linux/platform_device.h> |
22 | +#include <linux/mfd/mcp.h> | |
22 | 23 | |
23 | 24 | #include <mach/dma.h> |
24 | 25 | #include <mach/hardware.h> |
... | ... | @@ -28,7 +29,6 @@ |
28 | 29 | |
29 | 30 | #include <mach/assabet.h> |
30 | 31 | |
31 | -#include "mcp.h" | |
32 | 32 | |
33 | 33 | struct mcp_sa11x0 { |
34 | 34 | u32 mccr0; |
drivers/mfd/mcp.h
1 | -/* | |
2 | - * linux/drivers/mfd/mcp.h | |
3 | - * | |
4 | - * Copyright (C) 2001 Russell King, All Rights Reserved. | |
5 | - * | |
6 | - * This program is free software; you can redistribute it and/or modify | |
7 | - * it under the terms of the GNU General Public License as published by | |
8 | - * the Free Software Foundation; either version 2 of the License. | |
9 | - */ | |
10 | -#ifndef MCP_H | |
11 | -#define MCP_H | |
12 | - | |
13 | -struct mcp_ops; | |
14 | - | |
15 | -struct mcp { | |
16 | - struct module *owner; | |
17 | - struct mcp_ops *ops; | |
18 | - spinlock_t lock; | |
19 | - int use_count; | |
20 | - unsigned int sclk_rate; | |
21 | - unsigned int rw_timeout; | |
22 | - dma_device_t dma_audio_rd; | |
23 | - dma_device_t dma_audio_wr; | |
24 | - dma_device_t dma_telco_rd; | |
25 | - dma_device_t dma_telco_wr; | |
26 | - struct device attached_device; | |
27 | -}; | |
28 | - | |
29 | -struct mcp_ops { | |
30 | - void (*set_telecom_divisor)(struct mcp *, unsigned int); | |
31 | - void (*set_audio_divisor)(struct mcp *, unsigned int); | |
32 | - void (*reg_write)(struct mcp *, unsigned int, unsigned int); | |
33 | - unsigned int (*reg_read)(struct mcp *, unsigned int); | |
34 | - void (*enable)(struct mcp *); | |
35 | - void (*disable)(struct mcp *); | |
36 | -}; | |
37 | - | |
38 | -void mcp_set_telecom_divisor(struct mcp *, unsigned int); | |
39 | -void mcp_set_audio_divisor(struct mcp *, unsigned int); | |
40 | -void mcp_reg_write(struct mcp *, unsigned int, unsigned int); | |
41 | -unsigned int mcp_reg_read(struct mcp *, unsigned int); | |
42 | -void mcp_enable(struct mcp *); | |
43 | -void mcp_disable(struct mcp *); | |
44 | -#define mcp_get_sclk_rate(mcp) ((mcp)->sclk_rate) | |
45 | - | |
46 | -struct mcp *mcp_host_alloc(struct device *, size_t); | |
47 | -int mcp_host_register(struct mcp *); | |
48 | -void mcp_host_unregister(struct mcp *); | |
49 | - | |
50 | -struct mcp_driver { | |
51 | - struct device_driver drv; | |
52 | - int (*probe)(struct mcp *); | |
53 | - void (*remove)(struct mcp *); | |
54 | - int (*suspend)(struct mcp *, pm_message_t); | |
55 | - int (*resume)(struct mcp *); | |
56 | -}; | |
57 | - | |
58 | -int mcp_driver_register(struct mcp_driver *); | |
59 | -void mcp_driver_unregister(struct mcp_driver *); | |
60 | - | |
61 | -#define mcp_get_drvdata(mcp) dev_get_drvdata(&(mcp)->attached_device) | |
62 | -#define mcp_set_drvdata(mcp,d) dev_set_drvdata(&(mcp)->attached_device, d) | |
63 | - | |
64 | -#define mcp_priv(mcp) ((void *)((mcp)+1)) | |
65 | - | |
66 | -#endif |
drivers/mfd/ucb1x00-assabet.c
... | ... | @@ -14,10 +14,10 @@ |
14 | 14 | #include <linux/fs.h> |
15 | 15 | #include <linux/proc_fs.h> |
16 | 16 | #include <linux/device.h> |
17 | +#include <linux/mfd/ucb1x00.h> | |
17 | 18 | |
18 | 19 | #include <mach/dma.h> |
19 | 20 | |
20 | -#include "ucb1x00.h" | |
21 | 21 | |
22 | 22 | #define UCB1X00_ATTR(name,input)\ |
23 | 23 | static ssize_t name##_show(struct device *dev, struct device_attribute *attr, \ |
drivers/mfd/ucb1x00-core.c
... | ... | @@ -25,11 +25,11 @@ |
25 | 25 | #include <linux/interrupt.h> |
26 | 26 | #include <linux/device.h> |
27 | 27 | #include <linux/mutex.h> |
28 | +#include <linux/mfd/ucb1x00.h> | |
28 | 29 | |
29 | 30 | #include <mach/dma.h> |
30 | 31 | #include <mach/hardware.h> |
31 | 32 | |
32 | -#include "ucb1x00.h" | |
33 | 33 | |
34 | 34 | static DEFINE_MUTEX(ucb1x00_mutex); |
35 | 35 | static LIST_HEAD(ucb1x00_drivers); |
drivers/mfd/ucb1x00-ts.c
... | ... | @@ -30,12 +30,12 @@ |
30 | 30 | #include <linux/freezer.h> |
31 | 31 | #include <linux/slab.h> |
32 | 32 | #include <linux/kthread.h> |
33 | +#include <linux/mfd/ucb1x00.h> | |
33 | 34 | |
34 | 35 | #include <mach/dma.h> |
35 | 36 | #include <mach/collie.h> |
36 | 37 | #include <asm/mach-types.h> |
37 | 38 | |
38 | -#include "ucb1x00.h" | |
39 | 39 | |
40 | 40 | |
41 | 41 | struct ucb1x00_ts { |
drivers/mfd/ucb1x00.h
1 | -/* | |
2 | - * linux/drivers/mfd/ucb1x00.h | |
3 | - * | |
4 | - * Copyright (C) 2001 Russell King, All Rights Reserved. | |
5 | - * | |
6 | - * This program is free software; you can redistribute it and/or modify | |
7 | - * it under the terms of the GNU General Public License as published by | |
8 | - * the Free Software Foundation; either version 2 of the License. | |
9 | - */ | |
10 | -#ifndef UCB1200_H | |
11 | -#define UCB1200_H | |
12 | - | |
13 | -#define UCB_IO_DATA 0x00 | |
14 | -#define UCB_IO_DIR 0x01 | |
15 | - | |
16 | -#define UCB_IO_0 (1 << 0) | |
17 | -#define UCB_IO_1 (1 << 1) | |
18 | -#define UCB_IO_2 (1 << 2) | |
19 | -#define UCB_IO_3 (1 << 3) | |
20 | -#define UCB_IO_4 (1 << 4) | |
21 | -#define UCB_IO_5 (1 << 5) | |
22 | -#define UCB_IO_6 (1 << 6) | |
23 | -#define UCB_IO_7 (1 << 7) | |
24 | -#define UCB_IO_8 (1 << 8) | |
25 | -#define UCB_IO_9 (1 << 9) | |
26 | - | |
27 | -#define UCB_IE_RIS 0x02 | |
28 | -#define UCB_IE_FAL 0x03 | |
29 | -#define UCB_IE_STATUS 0x04 | |
30 | -#define UCB_IE_CLEAR 0x04 | |
31 | -#define UCB_IE_ADC (1 << 11) | |
32 | -#define UCB_IE_TSPX (1 << 12) | |
33 | -#define UCB_IE_TSMX (1 << 13) | |
34 | -#define UCB_IE_TCLIP (1 << 14) | |
35 | -#define UCB_IE_ACLIP (1 << 15) | |
36 | - | |
37 | -#define UCB_IRQ_TSPX 12 | |
38 | - | |
39 | -#define UCB_TC_A 0x05 | |
40 | -#define UCB_TC_A_LOOP (1 << 7) /* UCB1200 */ | |
41 | -#define UCB_TC_A_AMPL (1 << 7) /* UCB1300 */ | |
42 | - | |
43 | -#define UCB_TC_B 0x06 | |
44 | -#define UCB_TC_B_VOICE_ENA (1 << 3) | |
45 | -#define UCB_TC_B_CLIP (1 << 4) | |
46 | -#define UCB_TC_B_ATT (1 << 6) | |
47 | -#define UCB_TC_B_SIDE_ENA (1 << 11) | |
48 | -#define UCB_TC_B_MUTE (1 << 13) | |
49 | -#define UCB_TC_B_IN_ENA (1 << 14) | |
50 | -#define UCB_TC_B_OUT_ENA (1 << 15) | |
51 | - | |
52 | -#define UCB_AC_A 0x07 | |
53 | -#define UCB_AC_B 0x08 | |
54 | -#define UCB_AC_B_LOOP (1 << 8) | |
55 | -#define UCB_AC_B_MUTE (1 << 13) | |
56 | -#define UCB_AC_B_IN_ENA (1 << 14) | |
57 | -#define UCB_AC_B_OUT_ENA (1 << 15) | |
58 | - | |
59 | -#define UCB_TS_CR 0x09 | |
60 | -#define UCB_TS_CR_TSMX_POW (1 << 0) | |
61 | -#define UCB_TS_CR_TSPX_POW (1 << 1) | |
62 | -#define UCB_TS_CR_TSMY_POW (1 << 2) | |
63 | -#define UCB_TS_CR_TSPY_POW (1 << 3) | |
64 | -#define UCB_TS_CR_TSMX_GND (1 << 4) | |
65 | -#define UCB_TS_CR_TSPX_GND (1 << 5) | |
66 | -#define UCB_TS_CR_TSMY_GND (1 << 6) | |
67 | -#define UCB_TS_CR_TSPY_GND (1 << 7) | |
68 | -#define UCB_TS_CR_MODE_INT (0 << 8) | |
69 | -#define UCB_TS_CR_MODE_PRES (1 << 8) | |
70 | -#define UCB_TS_CR_MODE_POS (2 << 8) | |
71 | -#define UCB_TS_CR_BIAS_ENA (1 << 11) | |
72 | -#define UCB_TS_CR_TSPX_LOW (1 << 12) | |
73 | -#define UCB_TS_CR_TSMX_LOW (1 << 13) | |
74 | - | |
75 | -#define UCB_ADC_CR 0x0a | |
76 | -#define UCB_ADC_SYNC_ENA (1 << 0) | |
77 | -#define UCB_ADC_VREFBYP_CON (1 << 1) | |
78 | -#define UCB_ADC_INP_TSPX (0 << 2) | |
79 | -#define UCB_ADC_INP_TSMX (1 << 2) | |
80 | -#define UCB_ADC_INP_TSPY (2 << 2) | |
81 | -#define UCB_ADC_INP_TSMY (3 << 2) | |
82 | -#define UCB_ADC_INP_AD0 (4 << 2) | |
83 | -#define UCB_ADC_INP_AD1 (5 << 2) | |
84 | -#define UCB_ADC_INP_AD2 (6 << 2) | |
85 | -#define UCB_ADC_INP_AD3 (7 << 2) | |
86 | -#define UCB_ADC_EXT_REF (1 << 5) | |
87 | -#define UCB_ADC_START (1 << 7) | |
88 | -#define UCB_ADC_ENA (1 << 15) | |
89 | - | |
90 | -#define UCB_ADC_DATA 0x0b | |
91 | -#define UCB_ADC_DAT_VAL (1 << 15) | |
92 | -#define UCB_ADC_DAT(x) (((x) & 0x7fe0) >> 5) | |
93 | - | |
94 | -#define UCB_ID 0x0c | |
95 | -#define UCB_ID_1200 0x1004 | |
96 | -#define UCB_ID_1300 0x1005 | |
97 | -#define UCB_ID_TC35143 0x9712 | |
98 | - | |
99 | -#define UCB_MODE 0x0d | |
100 | -#define UCB_MODE_DYN_VFLAG_ENA (1 << 12) | |
101 | -#define UCB_MODE_AUD_OFF_CAN (1 << 13) | |
102 | - | |
103 | -#include "mcp.h" | |
104 | - | |
105 | -struct ucb1x00_irq { | |
106 | - void *devid; | |
107 | - void (*fn)(int, void *); | |
108 | -}; | |
109 | - | |
110 | -struct ucb1x00 { | |
111 | - spinlock_t lock; | |
112 | - struct mcp *mcp; | |
113 | - unsigned int irq; | |
114 | - struct semaphore adc_sem; | |
115 | - spinlock_t io_lock; | |
116 | - u16 id; | |
117 | - u16 io_dir; | |
118 | - u16 io_out; | |
119 | - u16 adc_cr; | |
120 | - u16 irq_fal_enbl; | |
121 | - u16 irq_ris_enbl; | |
122 | - struct ucb1x00_irq irq_handler[16]; | |
123 | - struct device dev; | |
124 | - struct list_head node; | |
125 | - struct list_head devs; | |
126 | -}; | |
127 | - | |
128 | -struct ucb1x00_driver; | |
129 | - | |
130 | -struct ucb1x00_dev { | |
131 | - struct list_head dev_node; | |
132 | - struct list_head drv_node; | |
133 | - struct ucb1x00 *ucb; | |
134 | - struct ucb1x00_driver *drv; | |
135 | - void *priv; | |
136 | -}; | |
137 | - | |
138 | -struct ucb1x00_driver { | |
139 | - struct list_head node; | |
140 | - struct list_head devs; | |
141 | - int (*add)(struct ucb1x00_dev *dev); | |
142 | - void (*remove)(struct ucb1x00_dev *dev); | |
143 | - int (*suspend)(struct ucb1x00_dev *dev, pm_message_t state); | |
144 | - int (*resume)(struct ucb1x00_dev *dev); | |
145 | -}; | |
146 | - | |
147 | -#define classdev_to_ucb1x00(cd) container_of(cd, struct ucb1x00, dev) | |
148 | - | |
149 | -int ucb1x00_register_driver(struct ucb1x00_driver *); | |
150 | -void ucb1x00_unregister_driver(struct ucb1x00_driver *); | |
151 | - | |
152 | -/** | |
153 | - * ucb1x00_clkrate - return the UCB1x00 SIB clock rate | |
154 | - * @ucb: UCB1x00 structure describing chip | |
155 | - * | |
156 | - * Return the SIB clock rate in Hz. | |
157 | - */ | |
158 | -static inline unsigned int ucb1x00_clkrate(struct ucb1x00 *ucb) | |
159 | -{ | |
160 | - return mcp_get_sclk_rate(ucb->mcp); | |
161 | -} | |
162 | - | |
163 | -/** | |
164 | - * ucb1x00_enable - enable the UCB1x00 SIB clock | |
165 | - * @ucb: UCB1x00 structure describing chip | |
166 | - * | |
167 | - * Enable the SIB clock. This can be called multiple times. | |
168 | - */ | |
169 | -static inline void ucb1x00_enable(struct ucb1x00 *ucb) | |
170 | -{ | |
171 | - mcp_enable(ucb->mcp); | |
172 | -} | |
173 | - | |
174 | -/** | |
175 | - * ucb1x00_disable - disable the UCB1x00 SIB clock | |
176 | - * @ucb: UCB1x00 structure describing chip | |
177 | - * | |
178 | - * Disable the SIB clock. The SIB clock will only be disabled | |
179 | - * when the number of ucb1x00_enable calls match the number of | |
180 | - * ucb1x00_disable calls. | |
181 | - */ | |
182 | -static inline void ucb1x00_disable(struct ucb1x00 *ucb) | |
183 | -{ | |
184 | - mcp_disable(ucb->mcp); | |
185 | -} | |
186 | - | |
187 | -/** | |
188 | - * ucb1x00_reg_write - write a UCB1x00 register | |
189 | - * @ucb: UCB1x00 structure describing chip | |
190 | - * @reg: UCB1x00 4-bit register index to write | |
191 | - * @val: UCB1x00 16-bit value to write | |
192 | - * | |
193 | - * Write the UCB1x00 register @reg with value @val. The SIB | |
194 | - * clock must be running for this function to return. | |
195 | - */ | |
196 | -static inline void ucb1x00_reg_write(struct ucb1x00 *ucb, unsigned int reg, unsigned int val) | |
197 | -{ | |
198 | - mcp_reg_write(ucb->mcp, reg, val); | |
199 | -} | |
200 | - | |
201 | -/** | |
202 | - * ucb1x00_reg_read - read a UCB1x00 register | |
203 | - * @ucb: UCB1x00 structure describing chip | |
204 | - * @reg: UCB1x00 4-bit register index to write | |
205 | - * | |
206 | - * Read the UCB1x00 register @reg and return its value. The SIB | |
207 | - * clock must be running for this function to return. | |
208 | - */ | |
209 | -static inline unsigned int ucb1x00_reg_read(struct ucb1x00 *ucb, unsigned int reg) | |
210 | -{ | |
211 | - return mcp_reg_read(ucb->mcp, reg); | |
212 | -} | |
213 | -/** | |
214 | - * ucb1x00_set_audio_divisor - | |
215 | - * @ucb: UCB1x00 structure describing chip | |
216 | - * @div: SIB clock divisor | |
217 | - */ | |
218 | -static inline void ucb1x00_set_audio_divisor(struct ucb1x00 *ucb, unsigned int div) | |
219 | -{ | |
220 | - mcp_set_audio_divisor(ucb->mcp, div); | |
221 | -} | |
222 | - | |
223 | -/** | |
224 | - * ucb1x00_set_telecom_divisor - | |
225 | - * @ucb: UCB1x00 structure describing chip | |
226 | - * @div: SIB clock divisor | |
227 | - */ | |
228 | -static inline void ucb1x00_set_telecom_divisor(struct ucb1x00 *ucb, unsigned int div) | |
229 | -{ | |
230 | - mcp_set_telecom_divisor(ucb->mcp, div); | |
231 | -} | |
232 | - | |
233 | -void ucb1x00_io_set_dir(struct ucb1x00 *ucb, unsigned int, unsigned int); | |
234 | -void ucb1x00_io_write(struct ucb1x00 *ucb, unsigned int, unsigned int); | |
235 | -unsigned int ucb1x00_io_read(struct ucb1x00 *ucb); | |
236 | - | |
237 | -#define UCB_NOSYNC (0) | |
238 | -#define UCB_SYNC (1) | |
239 | - | |
240 | -unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync); | |
241 | -void ucb1x00_adc_enable(struct ucb1x00 *ucb); | |
242 | -void ucb1x00_adc_disable(struct ucb1x00 *ucb); | |
243 | - | |
244 | -/* | |
245 | - * Which edges of the IRQ do you want to control today? | |
246 | - */ | |
247 | -#define UCB_RISING (1 << 0) | |
248 | -#define UCB_FALLING (1 << 1) | |
249 | - | |
250 | -int ucb1x00_hook_irq(struct ucb1x00 *ucb, unsigned int idx, void (*fn)(int, void *), void *devid); | |
251 | -void ucb1x00_enable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges); | |
252 | -void ucb1x00_disable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges); | |
253 | -int ucb1x00_free_irq(struct ucb1x00 *ucb, unsigned int idx, void *devid); | |
254 | - | |
255 | -#endif |
include/linux/mfd/mcp.h
1 | +/* | |
2 | + * linux/drivers/mfd/mcp.h | |
3 | + * | |
4 | + * Copyright (C) 2001 Russell King, All Rights Reserved. | |
5 | + * | |
6 | + * This program is free software; you can redistribute it and/or modify | |
7 | + * it under the terms of the GNU General Public License as published by | |
8 | + * the Free Software Foundation; either version 2 of the License. | |
9 | + */ | |
10 | +#ifndef MCP_H | |
11 | +#define MCP_H | |
12 | + | |
13 | +#include <mach/dma.h> | |
14 | + | |
15 | +struct mcp_ops; | |
16 | + | |
17 | +struct mcp { | |
18 | + struct module *owner; | |
19 | + struct mcp_ops *ops; | |
20 | + spinlock_t lock; | |
21 | + int use_count; | |
22 | + unsigned int sclk_rate; | |
23 | + unsigned int rw_timeout; | |
24 | + dma_device_t dma_audio_rd; | |
25 | + dma_device_t dma_audio_wr; | |
26 | + dma_device_t dma_telco_rd; | |
27 | + dma_device_t dma_telco_wr; | |
28 | + struct device attached_device; | |
29 | +}; | |
30 | + | |
31 | +struct mcp_ops { | |
32 | + void (*set_telecom_divisor)(struct mcp *, unsigned int); | |
33 | + void (*set_audio_divisor)(struct mcp *, unsigned int); | |
34 | + void (*reg_write)(struct mcp *, unsigned int, unsigned int); | |
35 | + unsigned int (*reg_read)(struct mcp *, unsigned int); | |
36 | + void (*enable)(struct mcp *); | |
37 | + void (*disable)(struct mcp *); | |
38 | +}; | |
39 | + | |
40 | +void mcp_set_telecom_divisor(struct mcp *, unsigned int); | |
41 | +void mcp_set_audio_divisor(struct mcp *, unsigned int); | |
42 | +void mcp_reg_write(struct mcp *, unsigned int, unsigned int); | |
43 | +unsigned int mcp_reg_read(struct mcp *, unsigned int); | |
44 | +void mcp_enable(struct mcp *); | |
45 | +void mcp_disable(struct mcp *); | |
46 | +#define mcp_get_sclk_rate(mcp) ((mcp)->sclk_rate) | |
47 | + | |
48 | +struct mcp *mcp_host_alloc(struct device *, size_t); | |
49 | +int mcp_host_register(struct mcp *); | |
50 | +void mcp_host_unregister(struct mcp *); | |
51 | + | |
52 | +struct mcp_driver { | |
53 | + struct device_driver drv; | |
54 | + int (*probe)(struct mcp *); | |
55 | + void (*remove)(struct mcp *); | |
56 | + int (*suspend)(struct mcp *, pm_message_t); | |
57 | + int (*resume)(struct mcp *); | |
58 | +}; | |
59 | + | |
60 | +int mcp_driver_register(struct mcp_driver *); | |
61 | +void mcp_driver_unregister(struct mcp_driver *); | |
62 | + | |
63 | +#define mcp_get_drvdata(mcp) dev_get_drvdata(&(mcp)->attached_device) | |
64 | +#define mcp_set_drvdata(mcp,d) dev_set_drvdata(&(mcp)->attached_device, d) | |
65 | + | |
66 | +#define mcp_priv(mcp) ((void *)((mcp)+1)) | |
67 | + | |
68 | +#endif |
include/linux/mfd/ucb1x00.h
1 | +/* | |
2 | + * linux/include/mfd/ucb1x00.h | |
3 | + * | |
4 | + * Copyright (C) 2001 Russell King, All Rights Reserved. | |
5 | + * | |
6 | + * This program is free software; you can redistribute it and/or modify | |
7 | + * it under the terms of the GNU General Public License as published by | |
8 | + * the Free Software Foundation; either version 2 of the License. | |
9 | + */ | |
10 | +#ifndef UCB1200_H | |
11 | +#define UCB1200_H | |
12 | + | |
13 | +#include <linux/mfd/mcp.h> | |
14 | +#define UCB_IO_DATA 0x00 | |
15 | +#define UCB_IO_DIR 0x01 | |
16 | + | |
17 | +#define UCB_IO_0 (1 << 0) | |
18 | +#define UCB_IO_1 (1 << 1) | |
19 | +#define UCB_IO_2 (1 << 2) | |
20 | +#define UCB_IO_3 (1 << 3) | |
21 | +#define UCB_IO_4 (1 << 4) | |
22 | +#define UCB_IO_5 (1 << 5) | |
23 | +#define UCB_IO_6 (1 << 6) | |
24 | +#define UCB_IO_7 (1 << 7) | |
25 | +#define UCB_IO_8 (1 << 8) | |
26 | +#define UCB_IO_9 (1 << 9) | |
27 | + | |
28 | +#define UCB_IE_RIS 0x02 | |
29 | +#define UCB_IE_FAL 0x03 | |
30 | +#define UCB_IE_STATUS 0x04 | |
31 | +#define UCB_IE_CLEAR 0x04 | |
32 | +#define UCB_IE_ADC (1 << 11) | |
33 | +#define UCB_IE_TSPX (1 << 12) | |
34 | +#define UCB_IE_TSMX (1 << 13) | |
35 | +#define UCB_IE_TCLIP (1 << 14) | |
36 | +#define UCB_IE_ACLIP (1 << 15) | |
37 | + | |
38 | +#define UCB_IRQ_TSPX 12 | |
39 | + | |
40 | +#define UCB_TC_A 0x05 | |
41 | +#define UCB_TC_A_LOOP (1 << 7) /* UCB1200 */ | |
42 | +#define UCB_TC_A_AMPL (1 << 7) /* UCB1300 */ | |
43 | + | |
44 | +#define UCB_TC_B 0x06 | |
45 | +#define UCB_TC_B_VOICE_ENA (1 << 3) | |
46 | +#define UCB_TC_B_CLIP (1 << 4) | |
47 | +#define UCB_TC_B_ATT (1 << 6) | |
48 | +#define UCB_TC_B_SIDE_ENA (1 << 11) | |
49 | +#define UCB_TC_B_MUTE (1 << 13) | |
50 | +#define UCB_TC_B_IN_ENA (1 << 14) | |
51 | +#define UCB_TC_B_OUT_ENA (1 << 15) | |
52 | + | |
53 | +#define UCB_AC_A 0x07 | |
54 | +#define UCB_AC_B 0x08 | |
55 | +#define UCB_AC_B_LOOP (1 << 8) | |
56 | +#define UCB_AC_B_MUTE (1 << 13) | |
57 | +#define UCB_AC_B_IN_ENA (1 << 14) | |
58 | +#define UCB_AC_B_OUT_ENA (1 << 15) | |
59 | + | |
60 | +#define UCB_TS_CR 0x09 | |
61 | +#define UCB_TS_CR_TSMX_POW (1 << 0) | |
62 | +#define UCB_TS_CR_TSPX_POW (1 << 1) | |
63 | +#define UCB_TS_CR_TSMY_POW (1 << 2) | |
64 | +#define UCB_TS_CR_TSPY_POW (1 << 3) | |
65 | +#define UCB_TS_CR_TSMX_GND (1 << 4) | |
66 | +#define UCB_TS_CR_TSPX_GND (1 << 5) | |
67 | +#define UCB_TS_CR_TSMY_GND (1 << 6) | |
68 | +#define UCB_TS_CR_TSPY_GND (1 << 7) | |
69 | +#define UCB_TS_CR_MODE_INT (0 << 8) | |
70 | +#define UCB_TS_CR_MODE_PRES (1 << 8) | |
71 | +#define UCB_TS_CR_MODE_POS (2 << 8) | |
72 | +#define UCB_TS_CR_BIAS_ENA (1 << 11) | |
73 | +#define UCB_TS_CR_TSPX_LOW (1 << 12) | |
74 | +#define UCB_TS_CR_TSMX_LOW (1 << 13) | |
75 | + | |
76 | +#define UCB_ADC_CR 0x0a | |
77 | +#define UCB_ADC_SYNC_ENA (1 << 0) | |
78 | +#define UCB_ADC_VREFBYP_CON (1 << 1) | |
79 | +#define UCB_ADC_INP_TSPX (0 << 2) | |
80 | +#define UCB_ADC_INP_TSMX (1 << 2) | |
81 | +#define UCB_ADC_INP_TSPY (2 << 2) | |
82 | +#define UCB_ADC_INP_TSMY (3 << 2) | |
83 | +#define UCB_ADC_INP_AD0 (4 << 2) | |
84 | +#define UCB_ADC_INP_AD1 (5 << 2) | |
85 | +#define UCB_ADC_INP_AD2 (6 << 2) | |
86 | +#define UCB_ADC_INP_AD3 (7 << 2) | |
87 | +#define UCB_ADC_EXT_REF (1 << 5) | |
88 | +#define UCB_ADC_START (1 << 7) | |
89 | +#define UCB_ADC_ENA (1 << 15) | |
90 | + | |
91 | +#define UCB_ADC_DATA 0x0b | |
92 | +#define UCB_ADC_DAT_VAL (1 << 15) | |
93 | +#define UCB_ADC_DAT(x) (((x) & 0x7fe0) >> 5) | |
94 | + | |
95 | +#define UCB_ID 0x0c | |
96 | +#define UCB_ID_1200 0x1004 | |
97 | +#define UCB_ID_1300 0x1005 | |
98 | +#define UCB_ID_TC35143 0x9712 | |
99 | + | |
100 | +#define UCB_MODE 0x0d | |
101 | +#define UCB_MODE_DYN_VFLAG_ENA (1 << 12) | |
102 | +#define UCB_MODE_AUD_OFF_CAN (1 << 13) | |
103 | + | |
104 | + | |
105 | +struct ucb1x00_irq { | |
106 | + void *devid; | |
107 | + void (*fn)(int, void *); | |
108 | +}; | |
109 | + | |
110 | +struct ucb1x00 { | |
111 | + spinlock_t lock; | |
112 | + struct mcp *mcp; | |
113 | + unsigned int irq; | |
114 | + struct semaphore adc_sem; | |
115 | + spinlock_t io_lock; | |
116 | + u16 id; | |
117 | + u16 io_dir; | |
118 | + u16 io_out; | |
119 | + u16 adc_cr; | |
120 | + u16 irq_fal_enbl; | |
121 | + u16 irq_ris_enbl; | |
122 | + struct ucb1x00_irq irq_handler[16]; | |
123 | + struct device dev; | |
124 | + struct list_head node; | |
125 | + struct list_head devs; | |
126 | +}; | |
127 | + | |
128 | +struct ucb1x00_driver; | |
129 | + | |
130 | +struct ucb1x00_dev { | |
131 | + struct list_head dev_node; | |
132 | + struct list_head drv_node; | |
133 | + struct ucb1x00 *ucb; | |
134 | + struct ucb1x00_driver *drv; | |
135 | + void *priv; | |
136 | +}; | |
137 | + | |
138 | +struct ucb1x00_driver { | |
139 | + struct list_head node; | |
140 | + struct list_head devs; | |
141 | + int (*add)(struct ucb1x00_dev *dev); | |
142 | + void (*remove)(struct ucb1x00_dev *dev); | |
143 | + int (*suspend)(struct ucb1x00_dev *dev, pm_message_t state); | |
144 | + int (*resume)(struct ucb1x00_dev *dev); | |
145 | +}; | |
146 | + | |
147 | +#define classdev_to_ucb1x00(cd) container_of(cd, struct ucb1x00, dev) | |
148 | + | |
149 | +int ucb1x00_register_driver(struct ucb1x00_driver *); | |
150 | +void ucb1x00_unregister_driver(struct ucb1x00_driver *); | |
151 | + | |
152 | +/** | |
153 | + * ucb1x00_clkrate - return the UCB1x00 SIB clock rate | |
154 | + * @ucb: UCB1x00 structure describing chip | |
155 | + * | |
156 | + * Return the SIB clock rate in Hz. | |
157 | + */ | |
158 | +static inline unsigned int ucb1x00_clkrate(struct ucb1x00 *ucb) | |
159 | +{ | |
160 | + return mcp_get_sclk_rate(ucb->mcp); | |
161 | +} | |
162 | + | |
163 | +/** | |
164 | + * ucb1x00_enable - enable the UCB1x00 SIB clock | |
165 | + * @ucb: UCB1x00 structure describing chip | |
166 | + * | |
167 | + * Enable the SIB clock. This can be called multiple times. | |
168 | + */ | |
169 | +static inline void ucb1x00_enable(struct ucb1x00 *ucb) | |
170 | +{ | |
171 | + mcp_enable(ucb->mcp); | |
172 | +} | |
173 | + | |
174 | +/** | |
175 | + * ucb1x00_disable - disable the UCB1x00 SIB clock | |
176 | + * @ucb: UCB1x00 structure describing chip | |
177 | + * | |
178 | + * Disable the SIB clock. The SIB clock will only be disabled | |
179 | + * when the number of ucb1x00_enable calls match the number of | |
180 | + * ucb1x00_disable calls. | |
181 | + */ | |
182 | +static inline void ucb1x00_disable(struct ucb1x00 *ucb) | |
183 | +{ | |
184 | + mcp_disable(ucb->mcp); | |
185 | +} | |
186 | + | |
187 | +/** | |
188 | + * ucb1x00_reg_write - write a UCB1x00 register | |
189 | + * @ucb: UCB1x00 structure describing chip | |
190 | + * @reg: UCB1x00 4-bit register index to write | |
191 | + * @val: UCB1x00 16-bit value to write | |
192 | + * | |
193 | + * Write the UCB1x00 register @reg with value @val. The SIB | |
194 | + * clock must be running for this function to return. | |
195 | + */ | |
196 | +static inline void ucb1x00_reg_write(struct ucb1x00 *ucb, unsigned int reg, unsigned int val) | |
197 | +{ | |
198 | + mcp_reg_write(ucb->mcp, reg, val); | |
199 | +} | |
200 | + | |
201 | +/** | |
202 | + * ucb1x00_reg_read - read a UCB1x00 register | |
203 | + * @ucb: UCB1x00 structure describing chip | |
204 | + * @reg: UCB1x00 4-bit register index to write | |
205 | + * | |
206 | + * Read the UCB1x00 register @reg and return its value. The SIB | |
207 | + * clock must be running for this function to return. | |
208 | + */ | |
209 | +static inline unsigned int ucb1x00_reg_read(struct ucb1x00 *ucb, unsigned int reg) | |
210 | +{ | |
211 | + return mcp_reg_read(ucb->mcp, reg); | |
212 | +} | |
213 | +/** | |
214 | + * ucb1x00_set_audio_divisor - | |
215 | + * @ucb: UCB1x00 structure describing chip | |
216 | + * @div: SIB clock divisor | |
217 | + */ | |
218 | +static inline void ucb1x00_set_audio_divisor(struct ucb1x00 *ucb, unsigned int div) | |
219 | +{ | |
220 | + mcp_set_audio_divisor(ucb->mcp, div); | |
221 | +} | |
222 | + | |
223 | +/** | |
224 | + * ucb1x00_set_telecom_divisor - | |
225 | + * @ucb: UCB1x00 structure describing chip | |
226 | + * @div: SIB clock divisor | |
227 | + */ | |
228 | +static inline void ucb1x00_set_telecom_divisor(struct ucb1x00 *ucb, unsigned int div) | |
229 | +{ | |
230 | + mcp_set_telecom_divisor(ucb->mcp, div); | |
231 | +} | |
232 | + | |
233 | +void ucb1x00_io_set_dir(struct ucb1x00 *ucb, unsigned int, unsigned int); | |
234 | +void ucb1x00_io_write(struct ucb1x00 *ucb, unsigned int, unsigned int); | |
235 | +unsigned int ucb1x00_io_read(struct ucb1x00 *ucb); | |
236 | + | |
237 | +#define UCB_NOSYNC (0) | |
238 | +#define UCB_SYNC (1) | |
239 | + | |
240 | +unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync); | |
241 | +void ucb1x00_adc_enable(struct ucb1x00 *ucb); | |
242 | +void ucb1x00_adc_disable(struct ucb1x00 *ucb); | |
243 | + | |
244 | +/* | |
245 | + * Which edges of the IRQ do you want to control today? | |
246 | + */ | |
247 | +#define UCB_RISING (1 << 0) | |
248 | +#define UCB_FALLING (1 << 1) | |
249 | + | |
250 | +int ucb1x00_hook_irq(struct ucb1x00 *ucb, unsigned int idx, void (*fn)(int, void *), void *devid); | |
251 | +void ucb1x00_enable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges); | |
252 | +void ucb1x00_disable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges); | |
253 | +int ucb1x00_free_irq(struct ucb1x00 *ucb, unsigned int idx, void *devid); | |
254 | + | |
255 | +#endif |