1 From c18b8e34c39ec0d395988318e6651076a748d6bd Mon Sep 17 00:00:00 2001
2 From: Dmitry Baryshkov <dbaryshkov@gmail.com>
3 Date: Tue, 12 Feb 2008 04:40:54 +0300
4 Subject: [PATCH 47/64] tc6393xb: use bitmasks instead of bit-field structs
6 Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
8 drivers/mfd/tc6393xb.c | 162 ++++++++++++++++++++++++-----------------
9 include/linux/mfd/tc6393xb.h | 63 +++-------------
10 2 files changed, 107 insertions(+), 118 deletions(-)
12 diff --git a/drivers/mfd/tc6393xb.c b/drivers/mfd/tc6393xb.c
13 index dfae61d..1a394e4 100644
14 --- a/drivers/mfd/tc6393xb.c
15 +++ b/drivers/mfd/tc6393xb.c
17 #include <linux/mfd/tmio.h>
18 #include <linux/mfd/tc6393xb.h>
20 +#define TC6393XB_FER_USBEN BIT(0) /* USB host enable */
21 +#define TC6393XB_FER_LCDCVEN BIT(1) /* polysilicon TFT enable */
22 +#define TC6393XB_FER_SLCDEN BIT(2) /* SLCD enable */
31 +#define TC6393XB_MCR_RDY_MASK (3 << 0)
32 +#define TC6393XB_MCR_RDY_OPENDRAIN (0 << 0)
33 +#define TC6393XB_MCR_RDY_TRISTATE (1 << 0)
34 +#define TC6393XB_MCR_RDY_PUSHPULL (2 << 0)
35 +#define TC6393XB_MCR_RDY_UNK BIT(2)
36 +#define TC6393XB_MCR_RDY_EN BIT(3)
37 +#define TC6393XB_MCR_INT_MASK (3 << 4)
38 +#define TC6393XB_MCR_INT_OPENDRAIN (0 << 4)
39 +#define TC6393XB_MCR_INT_TRISTATE (1 << 4)
40 +#define TC6393XB_MCR_INT_PUSHPULL (2 << 4)
41 +#define TC6393XB_MCR_INT_UNK BIT(6)
42 +#define TC6393XB_MCR_INT_EN BIT(7)
43 +/* bits 8 - 16 are unknown */
47 u8 revid; /* 0x08 Revision ID */
48 @@ -74,8 +99,8 @@ struct tc6393xb {
49 spinlock_t lock; /* protects RMW cycles */
52 - union tc6393xb_scr_fer fer;
53 - union tc6393xb_scr_ccr ccr;
59 @@ -90,13 +115,13 @@ static int tc6393xb_mmc_enable(struct platform_device *mmc) {
60 struct platform_device *dev = to_platform_device(mmc->dev.parent);
61 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
62 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
63 - union tc6393xb_scr_ccr ccr;
67 spin_lock_irqsave(&tc6393xb->lock, flags);
68 - ccr.raw = ioread16(&scr->ccr);
69 - ccr.bits.ck32ken = 1;
70 - iowrite16(ccr.raw, &scr->ccr);
71 + ccr = ioread16(&scr->ccr);
72 + ccr |= TC6393XB_CCR_CK32K;
73 + iowrite16(ccr, &scr->ccr);
74 spin_unlock_irqrestore(&tc6393xb->lock, flags);
77 @@ -106,13 +131,13 @@ static int tc6393xb_mmc_disable(struct platform_device *mmc) {
78 struct platform_device *dev = to_platform_device(mmc->dev.parent);
79 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
80 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
81 - union tc6393xb_scr_ccr ccr;
85 spin_lock_irqsave(&tc6393xb->lock, flags);
86 - ccr.raw = ioread16(&scr->ccr);
87 - ccr.bits.ck32ken = 0;
88 - iowrite16(ccr.raw, &scr->ccr);
89 + ccr = ioread16(&scr->ccr);
90 + ccr &= ~TC6393XB_CCR_CK32K;
91 + iowrite16(ccr, &scr->ccr);
92 spin_unlock_irqrestore(&tc6393xb->lock, flags);
95 @@ -148,14 +173,17 @@ int tc6393xb_lcd_set_power(struct platform_device *fb, bool on)
96 struct platform_device *dev = to_platform_device(fb->dev.parent);
97 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
98 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
99 - union tc6393xb_scr_fer fer;
103 spin_lock_irqsave(&tc6393xb->lock, flags);
105 - fer.raw = ioread8(&scr->fer);
106 - fer.bits.slcden = on ? 1 : 0;
107 - iowrite8(fer.raw, &scr->fer);
108 + fer = ioread8(&scr->fer);
110 + fer |= TC6393XB_FER_SLCDEN;
112 + fer &= ~TC6393XB_FER_SLCDEN;
113 + iowrite8(fer, &scr->fer);
115 spin_unlock_irqrestore(&tc6393xb->lock, flags);
117 @@ -181,19 +209,19 @@ static int tc6393xb_ohci_disable(struct platform_device *ohci)
118 struct platform_device *dev = to_platform_device(ohci->dev.parent);
119 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
120 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
121 - union tc6393xb_scr_ccr ccr;
122 - union tc6393xb_scr_fer fer;
127 spin_lock_irqsave(&tc6393xb->lock, flags);
129 - fer.raw = ioread8(&scr->fer);
130 - fer.bits.usben = 0;
131 - iowrite8(fer.raw, &scr->fer);
132 + fer = ioread8(&scr->fer);
133 + fer &= ~TC6393XB_FER_USBEN;
134 + iowrite8(fer, &scr->fer);
136 - ccr.raw = ioread16(&scr->ccr);
137 - ccr.bits.usbcken = 0;
138 - iowrite16(ccr.raw, &scr->ccr);
139 + ccr = ioread16(&scr->ccr);
140 + ccr &= ~TC6393XB_CCR_USBCK;
141 + iowrite16(ccr, &scr->ccr);
143 spin_unlock_irqrestore(&tc6393xb->lock, flags);
145 @@ -205,19 +233,19 @@ static int tc6393xb_ohci_enable(struct platform_device *ohci)
146 struct platform_device *dev = to_platform_device(ohci->dev.parent);
147 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
148 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
149 - union tc6393xb_scr_ccr ccr;
150 - union tc6393xb_scr_fer fer;
155 spin_lock_irqsave(&tc6393xb->lock, flags);
157 - ccr.raw = ioread16(&scr->ccr);
158 - ccr.bits.usbcken = 1;
159 - iowrite16(ccr.raw, &scr->ccr);
160 + ccr = ioread16(&scr->ccr);
161 + ccr |= TC6393XB_CCR_USBCK;
162 + iowrite16(ccr, &scr->ccr);
164 - fer.raw = ioread8(&scr->fer);
165 - fer.bits.usben = 1;
166 - iowrite8(fer.raw, &scr->fer);
167 + fer = ioread8(&scr->fer);
168 + fer |= TC6393XB_FER_USBEN;
169 + iowrite8(fer, &scr->fer);
171 spin_unlock_irqrestore(&tc6393xb->lock, flags);
173 @@ -229,14 +257,14 @@ static int tc6393xb_ohci_suspend(struct platform_device *ohci)
174 struct platform_device *dev = to_platform_device(ohci->dev.parent);
175 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
176 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
177 - union tc6393xb_scr_ccr ccr;
181 spin_lock_irqsave(&tc6393xb->lock, flags);
183 - ccr.raw = ioread16(&scr->ccr);
184 - ccr.bits.usbcken = 0;
185 - iowrite16(ccr.raw, &scr->ccr);
186 + ccr = ioread16(&scr->ccr);
187 + ccr &= ~TC6393XB_CCR_USBCK;
188 + iowrite16(ccr, &scr->ccr);
190 spin_unlock_irqrestore(&tc6393xb->lock, flags);
192 @@ -248,14 +276,14 @@ static int tc6393xb_ohci_resume(struct platform_device *ohci)
193 struct platform_device *dev = to_platform_device(ohci->dev.parent);
194 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
195 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
196 - union tc6393xb_scr_ccr ccr;
200 spin_lock_irqsave(&tc6393xb->lock, flags);
202 - ccr.raw = ioread16(&scr->ccr);
203 - ccr.bits.usbcken = 1;
204 - iowrite16(ccr.raw, &scr->ccr);
205 + ccr = ioread16(&scr->ccr);
206 + ccr |= TC6393XB_CCR_USBCK;
207 + iowrite16(ccr, &scr->ccr);
209 spin_unlock_irqrestore(&tc6393xb->lock, flags);
211 @@ -267,8 +295,8 @@ static int tc6393xb_fb_disable(struct platform_device *fb)
212 struct platform_device *dev = to_platform_device(fb->dev.parent);
213 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
214 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
215 - union tc6393xb_scr_ccr ccr;
216 - union tc6393xb_scr_fer fer;
221 spin_lock_irqsave(&tc6393xb->lock, flags);
222 @@ -276,14 +304,13 @@ static int tc6393xb_fb_disable(struct platform_device *fb)
224 * FIXME: is this correct or it should be moved to other _disable?
226 - fer.raw = ioread8(&scr->fer);
227 - fer.bits.slcden = 0;
228 -/* fer.bits.lcdcven = 0; */
229 - iowrite8(fer.raw, &scr->fer);
230 + fer = ioread8(&scr->fer);
231 + fer &= ~TC6393XB_FER_SLCDEN;
232 + iowrite8(fer, &scr->fer);
234 - ccr.raw = ioread16(&scr->ccr);
235 - ccr.bits.mclksel = disable;
236 - iowrite16(ccr.raw, &scr->ccr);
237 + ccr = ioread16(&scr->ccr);
238 + ccr = (ccr & ~TC6393XB_CCR_MCLK_MASK) | TC6393XB_CCR_MCLK_OFF;
239 + iowrite16(ccr, &scr->ccr);
241 spin_unlock_irqrestore(&tc6393xb->lock, flags);
243 @@ -295,14 +322,14 @@ static int tc6393xb_fb_enable(struct platform_device *fb)
244 struct platform_device *dev = to_platform_device(fb->dev.parent);
245 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
246 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
247 - union tc6393xb_scr_ccr ccr;
251 spin_lock_irqsave(&tc6393xb->lock, flags);
253 - ccr.raw = ioread16(&scr->ccr);
254 - ccr.bits.mclksel = m48MHz;
255 - iowrite16(ccr.raw, &scr->ccr);
256 + ccr = ioread16(&scr->ccr);
257 + ccr = (ccr & ~TC6393XB_CCR_MCLK_MASK) | TC6393XB_CCR_MCLK_48;
258 + iowrite16(ccr, &scr->ccr);
260 spin_unlock_irqrestore(&tc6393xb->lock, flags);
262 @@ -314,14 +341,14 @@ static int tc6393xb_fb_suspend(struct platform_device *fb)
263 struct platform_device *dev = to_platform_device(fb->dev.parent);
264 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
265 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
266 - union tc6393xb_scr_ccr ccr;
270 spin_lock_irqsave(&tc6393xb->lock, flags);
272 - ccr.raw = ioread16(&scr->ccr);
273 - ccr.bits.mclksel = disable;
274 - iowrite16(ccr.raw, &scr->ccr);
275 + ccr = ioread16(&scr->ccr);
276 + ccr = (ccr & ~TC6393XB_CCR_MCLK_MASK) | TC6393XB_CCR_MCLK_OFF;
277 + iowrite16(ccr, &scr->ccr);
279 spin_unlock_irqrestore(&tc6393xb->lock, flags);
281 @@ -333,14 +360,14 @@ static int tc6393xb_fb_resume(struct platform_device *fb)
282 struct platform_device *dev = to_platform_device(fb->dev.parent);
283 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
284 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
285 - union tc6393xb_scr_ccr ccr;
289 spin_lock_irqsave(&tc6393xb->lock, flags);
291 - ccr.raw = ioread16(&scr->ccr);
292 - ccr.bits.mclksel = m48MHz;
293 - iowrite16(ccr.raw, &scr->ccr);
294 + ccr = ioread16(&scr->ccr);
295 + ccr = (ccr & ~TC6393XB_CCR_MCLK_MASK) | TC6393XB_CCR_MCLK_48;
296 + iowrite16(ccr, &scr->ccr);
298 spin_unlock_irqrestore(&tc6393xb->lock, flags);
300 @@ -592,14 +619,15 @@ static int tc6393xb_hw_init(struct platform_device *dev, int resume)
301 struct tc6393xb_scr __iomem *scr = tc6393xb->scr;
305 - tc6393xb->suspend_state.fer.raw :
307 + iowrite8(resume ? tc6393xb->suspend_state.fer : 0,
309 iowrite16(tcpd->scr_pll2cr, &scr->pll2cr);
311 - tc6393xb->suspend_state.ccr.raw :
312 - tcpd->scr_ccr.raw, &scr->ccr);
313 - iowrite16(tcpd->scr_mcr.raw, &scr->mcr);
314 + tc6393xb->suspend_state.ccr :
315 + tcpd->scr_ccr, &scr->ccr);
316 + iowrite16(TC6393XB_MCR_RDY_OPENDRAIN | TC6393XB_MCR_RDY_UNK | TC6393XB_MCR_RDY_EN |
317 + TC6393XB_MCR_INT_OPENDRAIN | TC6393XB_MCR_INT_UNK | TC6393XB_MCR_INT_EN |
318 + BIT(15), &scr->mcr);
319 iowrite16(tcpd->scr_gper, &scr->gper);
320 iowrite8(0, &scr->irr);
321 iowrite8(0xbf, &scr->imr);
322 @@ -730,8 +758,8 @@ static int tc6393xb_suspend(struct platform_device *dev, pm_message_t state)
326 - tc6393xb->suspend_state.ccr.raw = ioread16(&scr->ccr);
327 - tc6393xb->suspend_state.fer.raw = ioread8(&scr->fer);
328 + tc6393xb->suspend_state.ccr = ioread16(&scr->ccr);
329 + tc6393xb->suspend_state.fer = ioread8(&scr->fer);
330 for (i = 0; i < 4; i++)
331 tc6393xb->suspend_state.gpi_bcr[i] =
332 ioread8(scr->gpi_bcr + i);
333 diff --git a/include/linux/mfd/tc6393xb.h b/include/linux/mfd/tc6393xb.h
334 index e699294..2c69f63 100644
335 --- a/include/linux/mfd/tc6393xb.h
336 +++ b/include/linux/mfd/tc6393xb.h
338 #include <linux/mfd-core.h>
339 #include <linux/mfd/tmio.h>
341 -union tc6393xb_scr_fer {
344 - unsigned usben:1; /* D0 USB enable */
345 - unsigned lcdcven:1; /* D1 polysylicon TFT enable */
346 - unsigned slcden:1; /* D2 SLCD enable */
347 -} __attribute__ ((packed)) bits;
348 -} __attribute__ ((packed));
350 -union tc6393xb_scr_ccr {
353 - unsigned ck32ken:1; /* D0 SD host clock enable */
354 - unsigned usbcken:1; /* D1 USB host clock enable */
356 - unsigned sharp:1; /* D4 ??? set in Sharp's code */
358 - enum { disable = 0,
362 - } mclksel:3; /* D10-D8 LCD controller clock */
366 - } hclksel:2; /* D13-D12 host bus clock */
368 -} __attribute__ ((packed)) bits;
369 -} __attribute__ ((packed));
375 - /* reserved = 3, */
378 -union tc6393xb_scr_mcr {
381 - enum pincontrol rdyst:2; /* D1-D0 HRDY control */
383 - unsigned aren:1; /* D3 HRDY pull up resistance cut off */
384 - enum pincontrol intst:2; /* D5-D4 #HINT control */
386 - unsigned aien:1; /* D7 #HINT pull up resitance cut off */
388 -} __attribute__ ((packed)) bits;
389 -} __attribute__ ((packed));
390 +#define TC6393XB_CCR_CK32K BIT(0)
391 +#define TC6393XB_CCR_USBCK BIT(1)
392 +#define TC6393XB_CCR_UNK1 BIT(4)
393 +#define TC6393XB_CCR_MCLK_MASK (7 << 8)
394 +#define TC6393XB_CCR_MCLK_OFF (0 << 8)
395 +#define TC6393XB_CCR_MCLK_12 (1 << 8)
396 +#define TC6393XB_CCR_MCLK_24 (2 << 8)
397 +#define TC6393XB_CCR_MCLK_48 (3 << 8)
398 +#define TC6393XB_CCR_HCLK_MASK (3 << 12)
399 +#define TC6393XB_CCR_HCLK_24 (0 << 12)
400 +#define TC6393XB_CCR_HCLK_48 (1 << 12)
402 struct tc6393xb_platform_data {
403 u16 scr_pll2cr; /* PLL2 Control */
404 - union tc6393xb_scr_ccr scr_ccr; /* Clock Control */
405 - union tc6393xb_scr_mcr scr_mcr; /* Mode Control */
406 + u16 scr_ccr; /* Clock Control */
407 u16 scr_gper; /* GP Enable */
408 u32 scr_gpo_doecr; /* GPO Data OE Control */
409 u32 scr_gpo_dsr; /* GPO Data Set */