4 * Compaq ASIC3 support.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 * Copyright 2001 Compaq Computer Corporation.
11 * Copyright 2004-2005 Phil Blundell
12 * Copyright 2007-2008 OpenedHand Ltd.
14 * Authors: Phil Blundell <pb@handhelds.org>,
15 * Samuel Ortiz <sameo@openedhand.com>
19 #include <linux/kernel.h>
20 #include <linux/delay.h>
21 #include <linux/irq.h>
22 #include <linux/gpio.h>
24 #include <linux/slab.h>
25 #include <linux/spinlock.h>
26 #include <linux/platform_device.h>
28 #include <linux/mfd/asic3.h>
29 #include <linux/mfd/core.h>
30 #include <linux/mfd/ds1wm.h>
31 #include <linux/mfd/tmio.h>
54 #define INIT_CDEX(_name, _rate) \
55 [ASIC3_CLOCK_##_name] = { \
56 .cdex = CLOCK_CDEX_##_name, \
60 static struct asic3_clk asic3_clk_init
[] __initdata
= {
62 INIT_CDEX(OWM
, 5000000),
68 INIT_CDEX(SD_HOST
, 24576000),
69 INIT_CDEX(SD_BUS
, 12288000),
71 INIT_CDEX(EX0
, 32768),
72 INIT_CDEX(EX1
, 24576000),
76 void __iomem
*mapping
;
77 unsigned int bus_shift
;
79 unsigned int irq_base
;
82 struct gpio_chip gpio
;
84 void __iomem
*tmio_cnf
;
86 struct asic3_clk clocks
[ARRAY_SIZE(asic3_clk_init
)];
89 static int asic3_gpio_get(struct gpio_chip
*chip
, unsigned offset
);
91 void asic3_write_register(struct asic3
*asic
, unsigned int reg
, u32 value
)
93 iowrite16(value
, asic
->mapping
+
94 (reg
>> asic
->bus_shift
));
96 EXPORT_SYMBOL_GPL(asic3_write_register
);
98 u32
asic3_read_register(struct asic3
*asic
, unsigned int reg
)
100 return ioread16(asic
->mapping
+
101 (reg
>> asic
->bus_shift
));
103 EXPORT_SYMBOL_GPL(asic3_read_register
);
105 static void asic3_set_register(struct asic3
*asic
, u32 reg
, u32 bits
, bool set
)
110 spin_lock_irqsave(&asic
->lock
, flags
);
111 val
= asic3_read_register(asic
, reg
);
116 asic3_write_register(asic
, reg
, val
);
117 spin_unlock_irqrestore(&asic
->lock
, flags
);
121 #define MAX_ASIC_ISR_LOOPS 20
122 #define ASIC3_GPIO_BASE_INCR \
123 (ASIC3_GPIO_B_BASE - ASIC3_GPIO_A_BASE)
125 static void asic3_irq_flip_edge(struct asic3
*asic
,
131 spin_lock_irqsave(&asic
->lock
, flags
);
132 edge
= asic3_read_register(asic
,
133 base
+ ASIC3_GPIO_EDGE_TRIGGER
);
135 asic3_write_register(asic
,
136 base
+ ASIC3_GPIO_EDGE_TRIGGER
, edge
);
137 spin_unlock_irqrestore(&asic
->lock
, flags
);
140 static void asic3_irq_demux(unsigned int irq
, struct irq_desc
*desc
)
142 struct asic3
*asic
= irq_desc_get_handler_data(desc
);
143 struct irq_data
*data
= irq_desc_get_irq_data(desc
);
147 data
->chip
->irq_ack(data
);
149 for (iter
= 0 ; iter
< MAX_ASIC_ISR_LOOPS
; iter
++) {
153 spin_lock_irqsave(&asic
->lock
, flags
);
154 status
= asic3_read_register(asic
,
155 ASIC3_OFFSET(INTR
, P_INT_STAT
));
156 spin_unlock_irqrestore(&asic
->lock
, flags
);
158 /* Check all ten register bits */
159 if ((status
& 0x3ff) == 0)
162 /* Handle GPIO IRQs */
163 for (bank
= 0; bank
< ASIC3_NUM_GPIO_BANKS
; bank
++) {
164 if (status
& (1 << bank
)) {
165 unsigned long base
, istat
;
167 base
= ASIC3_GPIO_A_BASE
168 + bank
* ASIC3_GPIO_BASE_INCR
;
170 spin_lock_irqsave(&asic
->lock
, flags
);
171 istat
= asic3_read_register(asic
,
173 ASIC3_GPIO_INT_STATUS
);
174 /* Clearing IntStatus */
175 asic3_write_register(asic
,
177 ASIC3_GPIO_INT_STATUS
, 0);
178 spin_unlock_irqrestore(&asic
->lock
, flags
);
180 for (i
= 0; i
< ASIC3_GPIOS_PER_BANK
; i
++) {
187 irqnr
= asic
->irq_base
+
188 (ASIC3_GPIOS_PER_BANK
* bank
)
190 generic_handle_irq(irqnr
);
191 if (asic
->irq_bothedge
[bank
] & bit
)
192 asic3_irq_flip_edge(asic
, base
,
198 /* Handle remaining IRQs in the status register */
199 for (i
= ASIC3_NUM_GPIOS
; i
< ASIC3_NR_IRQS
; i
++) {
200 /* They start at bit 4 and go up */
201 if (status
& (1 << (i
- ASIC3_NUM_GPIOS
+ 4)))
202 generic_handle_irq(asic
->irq_base
+ i
);
206 if (iter
>= MAX_ASIC_ISR_LOOPS
)
207 dev_err(asic
->dev
, "interrupt processing overrun\n");
210 static inline int asic3_irq_to_bank(struct asic3
*asic
, int irq
)
214 n
= (irq
- asic
->irq_base
) >> 4;
216 return (n
* (ASIC3_GPIO_B_BASE
- ASIC3_GPIO_A_BASE
));
219 static inline int asic3_irq_to_index(struct asic3
*asic
, int irq
)
221 return (irq
- asic
->irq_base
) & 0xf;
224 static void asic3_mask_gpio_irq(struct irq_data
*data
)
226 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
227 u32 val
, bank
, index
;
230 bank
= asic3_irq_to_bank(asic
, data
->irq
);
231 index
= asic3_irq_to_index(asic
, data
->irq
);
233 spin_lock_irqsave(&asic
->lock
, flags
);
234 val
= asic3_read_register(asic
, bank
+ ASIC3_GPIO_MASK
);
236 asic3_write_register(asic
, bank
+ ASIC3_GPIO_MASK
, val
);
237 spin_unlock_irqrestore(&asic
->lock
, flags
);
240 static void asic3_mask_irq(struct irq_data
*data
)
242 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
246 spin_lock_irqsave(&asic
->lock
, flags
);
247 regval
= asic3_read_register(asic
,
249 ASIC3_INTR_INT_MASK
);
251 regval
&= ~(ASIC3_INTMASK_MASK0
<<
252 (data
->irq
- (asic
->irq_base
+ ASIC3_NUM_GPIOS
)));
254 asic3_write_register(asic
,
258 spin_unlock_irqrestore(&asic
->lock
, flags
);
261 static void asic3_unmask_gpio_irq(struct irq_data
*data
)
263 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
264 u32 val
, bank
, index
;
267 bank
= asic3_irq_to_bank(asic
, data
->irq
);
268 index
= asic3_irq_to_index(asic
, data
->irq
);
270 spin_lock_irqsave(&asic
->lock
, flags
);
271 val
= asic3_read_register(asic
, bank
+ ASIC3_GPIO_MASK
);
272 val
&= ~(1 << index
);
273 asic3_write_register(asic
, bank
+ ASIC3_GPIO_MASK
, val
);
274 spin_unlock_irqrestore(&asic
->lock
, flags
);
277 static void asic3_unmask_irq(struct irq_data
*data
)
279 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
283 spin_lock_irqsave(&asic
->lock
, flags
);
284 regval
= asic3_read_register(asic
,
286 ASIC3_INTR_INT_MASK
);
288 regval
|= (ASIC3_INTMASK_MASK0
<<
289 (data
->irq
- (asic
->irq_base
+ ASIC3_NUM_GPIOS
)));
291 asic3_write_register(asic
,
295 spin_unlock_irqrestore(&asic
->lock
, flags
);
298 static int asic3_gpio_irq_type(struct irq_data
*data
, unsigned int type
)
300 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
302 u16 trigger
, level
, edge
, bit
;
305 bank
= asic3_irq_to_bank(asic
, data
->irq
);
306 index
= asic3_irq_to_index(asic
, data
->irq
);
309 spin_lock_irqsave(&asic
->lock
, flags
);
310 level
= asic3_read_register(asic
,
311 bank
+ ASIC3_GPIO_LEVEL_TRIGGER
);
312 edge
= asic3_read_register(asic
,
313 bank
+ ASIC3_GPIO_EDGE_TRIGGER
);
314 trigger
= asic3_read_register(asic
,
315 bank
+ ASIC3_GPIO_TRIGGER_TYPE
);
316 asic
->irq_bothedge
[(data
->irq
- asic
->irq_base
) >> 4] &= ~bit
;
318 if (type
== IRQ_TYPE_EDGE_RISING
) {
321 } else if (type
== IRQ_TYPE_EDGE_FALLING
) {
324 } else if (type
== IRQ_TYPE_EDGE_BOTH
) {
326 if (asic3_gpio_get(&asic
->gpio
, data
->irq
- asic
->irq_base
))
330 asic
->irq_bothedge
[(data
->irq
- asic
->irq_base
) >> 4] |= bit
;
331 } else if (type
== IRQ_TYPE_LEVEL_LOW
) {
334 } else if (type
== IRQ_TYPE_LEVEL_HIGH
) {
339 * if type == IRQ_TYPE_NONE, we should mask interrupts, but
340 * be careful to not unmask them if mask was also called.
341 * Probably need internal state for mask.
343 dev_notice(asic
->dev
, "irq type not changed\n");
345 asic3_write_register(asic
, bank
+ ASIC3_GPIO_LEVEL_TRIGGER
,
347 asic3_write_register(asic
, bank
+ ASIC3_GPIO_EDGE_TRIGGER
,
349 asic3_write_register(asic
, bank
+ ASIC3_GPIO_TRIGGER_TYPE
,
351 spin_unlock_irqrestore(&asic
->lock
, flags
);
355 static struct irq_chip asic3_gpio_irq_chip
= {
356 .name
= "ASIC3-GPIO",
357 .irq_ack
= asic3_mask_gpio_irq
,
358 .irq_mask
= asic3_mask_gpio_irq
,
359 .irq_unmask
= asic3_unmask_gpio_irq
,
360 .irq_set_type
= asic3_gpio_irq_type
,
363 static struct irq_chip asic3_irq_chip
= {
365 .irq_ack
= asic3_mask_irq
,
366 .irq_mask
= asic3_mask_irq
,
367 .irq_unmask
= asic3_unmask_irq
,
370 static int __init
asic3_irq_probe(struct platform_device
*pdev
)
372 struct asic3
*asic
= platform_get_drvdata(pdev
);
373 unsigned long clksel
= 0;
374 unsigned int irq
, irq_base
;
377 ret
= platform_get_irq(pdev
, 0);
382 /* turn on clock to IRQ controller */
383 clksel
|= CLOCK_SEL_CX
;
384 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, SEL
),
387 irq_base
= asic
->irq_base
;
389 for (irq
= irq_base
; irq
< irq_base
+ ASIC3_NR_IRQS
; irq
++) {
390 if (irq
< asic
->irq_base
+ ASIC3_NUM_GPIOS
)
391 irq_set_chip(irq
, &asic3_gpio_irq_chip
);
393 irq_set_chip(irq
, &asic3_irq_chip
);
395 irq_set_chip_data(irq
, asic
);
396 irq_set_handler(irq
, handle_level_irq
);
397 set_irq_flags(irq
, IRQF_VALID
| IRQF_PROBE
);
400 asic3_write_register(asic
, ASIC3_OFFSET(INTR
, INT_MASK
),
401 ASIC3_INTMASK_GINTMASK
);
403 irq_set_chained_handler(asic
->irq_nr
, asic3_irq_demux
);
404 irq_set_irq_type(asic
->irq_nr
, IRQ_TYPE_EDGE_RISING
);
405 irq_set_handler_data(asic
->irq_nr
, asic
);
410 static void asic3_irq_remove(struct platform_device
*pdev
)
412 struct asic3
*asic
= platform_get_drvdata(pdev
);
413 unsigned int irq
, irq_base
;
415 irq_base
= asic
->irq_base
;
417 for (irq
= irq_base
; irq
< irq_base
+ ASIC3_NR_IRQS
; irq
++) {
418 set_irq_flags(irq
, 0);
419 irq_set_chip_and_handler(irq
, NULL
, NULL
);
420 irq_set_chip_data(irq
, NULL
);
422 irq_set_chained_handler(asic
->irq_nr
, NULL
);
426 static int asic3_gpio_direction(struct gpio_chip
*chip
,
427 unsigned offset
, int out
)
429 u32 mask
= ASIC3_GPIO_TO_MASK(offset
), out_reg
;
430 unsigned int gpio_base
;
434 asic
= container_of(chip
, struct asic3
, gpio
);
435 gpio_base
= ASIC3_GPIO_TO_BASE(offset
);
437 if (gpio_base
> ASIC3_GPIO_D_BASE
) {
438 dev_err(asic
->dev
, "Invalid base (0x%x) for gpio %d\n",
443 spin_lock_irqsave(&asic
->lock
, flags
);
445 out_reg
= asic3_read_register(asic
, gpio_base
+ ASIC3_GPIO_DIRECTION
);
447 /* Input is 0, Output is 1 */
453 asic3_write_register(asic
, gpio_base
+ ASIC3_GPIO_DIRECTION
, out_reg
);
455 spin_unlock_irqrestore(&asic
->lock
, flags
);
461 static int asic3_gpio_direction_input(struct gpio_chip
*chip
,
464 return asic3_gpio_direction(chip
, offset
, 0);
467 static int asic3_gpio_direction_output(struct gpio_chip
*chip
,
468 unsigned offset
, int value
)
470 return asic3_gpio_direction(chip
, offset
, 1);
473 static int asic3_gpio_get(struct gpio_chip
*chip
,
476 unsigned int gpio_base
;
477 u32 mask
= ASIC3_GPIO_TO_MASK(offset
);
480 asic
= container_of(chip
, struct asic3
, gpio
);
481 gpio_base
= ASIC3_GPIO_TO_BASE(offset
);
483 if (gpio_base
> ASIC3_GPIO_D_BASE
) {
484 dev_err(asic
->dev
, "Invalid base (0x%x) for gpio %d\n",
489 return asic3_read_register(asic
, gpio_base
+ ASIC3_GPIO_STATUS
) & mask
;
492 static void asic3_gpio_set(struct gpio_chip
*chip
,
493 unsigned offset
, int value
)
496 unsigned int gpio_base
;
500 asic
= container_of(chip
, struct asic3
, gpio
);
501 gpio_base
= ASIC3_GPIO_TO_BASE(offset
);
503 if (gpio_base
> ASIC3_GPIO_D_BASE
) {
504 dev_err(asic
->dev
, "Invalid base (0x%x) for gpio %d\n",
509 mask
= ASIC3_GPIO_TO_MASK(offset
);
511 spin_lock_irqsave(&asic
->lock
, flags
);
513 out_reg
= asic3_read_register(asic
, gpio_base
+ ASIC3_GPIO_OUT
);
520 asic3_write_register(asic
, gpio_base
+ ASIC3_GPIO_OUT
, out_reg
);
522 spin_unlock_irqrestore(&asic
->lock
, flags
);
527 static __init
int asic3_gpio_probe(struct platform_device
*pdev
,
528 u16
*gpio_config
, int num
)
530 struct asic3
*asic
= platform_get_drvdata(pdev
);
531 u16 alt_reg
[ASIC3_NUM_GPIO_BANKS
];
532 u16 out_reg
[ASIC3_NUM_GPIO_BANKS
];
533 u16 dir_reg
[ASIC3_NUM_GPIO_BANKS
];
536 memset(alt_reg
, 0, ASIC3_NUM_GPIO_BANKS
* sizeof(u16
));
537 memset(out_reg
, 0, ASIC3_NUM_GPIO_BANKS
* sizeof(u16
));
538 memset(dir_reg
, 0, ASIC3_NUM_GPIO_BANKS
* sizeof(u16
));
540 /* Enable all GPIOs */
541 asic3_write_register(asic
, ASIC3_GPIO_OFFSET(A
, MASK
), 0xffff);
542 asic3_write_register(asic
, ASIC3_GPIO_OFFSET(B
, MASK
), 0xffff);
543 asic3_write_register(asic
, ASIC3_GPIO_OFFSET(C
, MASK
), 0xffff);
544 asic3_write_register(asic
, ASIC3_GPIO_OFFSET(D
, MASK
), 0xffff);
546 for (i
= 0; i
< num
; i
++) {
547 u8 alt
, pin
, dir
, init
, bank_num
, bit_num
;
548 u16 config
= gpio_config
[i
];
550 pin
= ASIC3_CONFIG_GPIO_PIN(config
);
551 alt
= ASIC3_CONFIG_GPIO_ALT(config
);
552 dir
= ASIC3_CONFIG_GPIO_DIR(config
);
553 init
= ASIC3_CONFIG_GPIO_INIT(config
);
555 bank_num
= ASIC3_GPIO_TO_BANK(pin
);
556 bit_num
= ASIC3_GPIO_TO_BIT(pin
);
558 alt_reg
[bank_num
] |= (alt
<< bit_num
);
559 out_reg
[bank_num
] |= (init
<< bit_num
);
560 dir_reg
[bank_num
] |= (dir
<< bit_num
);
563 for (i
= 0; i
< ASIC3_NUM_GPIO_BANKS
; i
++) {
564 asic3_write_register(asic
,
565 ASIC3_BANK_TO_BASE(i
) +
566 ASIC3_GPIO_DIRECTION
,
568 asic3_write_register(asic
,
569 ASIC3_BANK_TO_BASE(i
) + ASIC3_GPIO_OUT
,
571 asic3_write_register(asic
,
572 ASIC3_BANK_TO_BASE(i
) +
573 ASIC3_GPIO_ALT_FUNCTION
,
577 return gpiochip_add(&asic
->gpio
);
580 static int asic3_gpio_remove(struct platform_device
*pdev
)
582 struct asic3
*asic
= platform_get_drvdata(pdev
);
584 return gpiochip_remove(&asic
->gpio
);
587 static void asic3_clk_enable(struct asic3
*asic
, struct asic3_clk
*clk
)
592 spin_lock_irqsave(&asic
->lock
, flags
);
593 if (clk
->enabled
++ == 0) {
594 cdex
= asic3_read_register(asic
, ASIC3_OFFSET(CLOCK
, CDEX
));
596 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, CDEX
), cdex
);
598 spin_unlock_irqrestore(&asic
->lock
, flags
);
601 static void asic3_clk_disable(struct asic3
*asic
, struct asic3_clk
*clk
)
606 WARN_ON(clk
->enabled
== 0);
608 spin_lock_irqsave(&asic
->lock
, flags
);
609 if (--clk
->enabled
== 0) {
610 cdex
= asic3_read_register(asic
, ASIC3_OFFSET(CLOCK
, CDEX
));
612 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, CDEX
), cdex
);
614 spin_unlock_irqrestore(&asic
->lock
, flags
);
617 /* MFD cells (SPI, PWM, LED, DS1WM, MMC) */
618 static struct ds1wm_driver_data ds1wm_pdata
= {
620 .reset_recover_delay
= 1,
623 static struct resource ds1wm_resources
[] = {
625 .start
= ASIC3_OWM_BASE
,
626 .end
= ASIC3_OWM_BASE
+ 0x13,
627 .flags
= IORESOURCE_MEM
,
630 .start
= ASIC3_IRQ_OWM
,
631 .end
= ASIC3_IRQ_OWM
,
632 .flags
= IORESOURCE_IRQ
| IORESOURCE_IRQ_HIGHEDGE
,
636 static int ds1wm_enable(struct platform_device
*pdev
)
638 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
640 /* Turn on external clocks and the OWM clock */
641 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX0
]);
642 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX1
]);
643 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_OWM
]);
646 /* Reset and enable DS1WM */
647 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, RESET
),
648 ASIC3_EXTCF_OWM_RESET
, 1);
650 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, RESET
),
651 ASIC3_EXTCF_OWM_RESET
, 0);
653 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, SELECT
),
654 ASIC3_EXTCF_OWM_EN
, 1);
660 static int ds1wm_disable(struct platform_device
*pdev
)
662 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
664 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, SELECT
),
665 ASIC3_EXTCF_OWM_EN
, 0);
667 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_OWM
]);
668 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX0
]);
669 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX1
]);
674 static struct mfd_cell asic3_cell_ds1wm
= {
676 .enable
= ds1wm_enable
,
677 .disable
= ds1wm_disable
,
678 .platform_data
= &ds1wm_pdata
,
679 .pdata_size
= sizeof(ds1wm_pdata
),
680 .num_resources
= ARRAY_SIZE(ds1wm_resources
),
681 .resources
= ds1wm_resources
,
684 static void asic3_mmc_pwr(struct platform_device
*pdev
, int state
)
686 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
688 tmio_core_mmc_pwr(asic
->tmio_cnf
, 1 - asic
->bus_shift
, state
);
691 static void asic3_mmc_clk_div(struct platform_device
*pdev
, int state
)
693 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
695 tmio_core_mmc_clk_div(asic
->tmio_cnf
, 1 - asic
->bus_shift
, state
);
698 static struct tmio_mmc_data asic3_mmc_data
= {
700 .set_pwr
= asic3_mmc_pwr
,
701 .set_clk_div
= asic3_mmc_clk_div
,
704 static struct resource asic3_mmc_resources
[] = {
706 .start
= ASIC3_SD_CTRL_BASE
,
707 .end
= ASIC3_SD_CTRL_BASE
+ 0x3ff,
708 .flags
= IORESOURCE_MEM
,
713 .flags
= IORESOURCE_IRQ
,
717 static int asic3_mmc_enable(struct platform_device
*pdev
)
719 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
721 /* Not sure if it must be done bit by bit, but leaving as-is */
722 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
723 ASIC3_SDHWCTRL_LEVCD
, 1);
724 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
725 ASIC3_SDHWCTRL_LEVWP
, 1);
726 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
727 ASIC3_SDHWCTRL_SUSPEND
, 0);
728 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
729 ASIC3_SDHWCTRL_PCLR
, 0);
731 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX0
]);
732 /* CLK32 used for card detection and for interruption detection
733 * when HCLK is stopped.
735 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX1
]);
738 /* HCLK 24.576 MHz, BCLK 12.288 MHz: */
739 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, SEL
),
740 CLOCK_SEL_CX
| CLOCK_SEL_SD_HCLK_SEL
);
742 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_SD_HOST
]);
743 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_SD_BUS
]);
746 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, SELECT
),
747 ASIC3_EXTCF_SD_MEM_ENABLE
, 1);
749 /* Enable SD card slot 3.3V power supply */
750 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
751 ASIC3_SDHWCTRL_SDPWR
, 1);
753 /* ASIC3_SD_CTRL_BASE assumes 32-bit addressing, TMIO is 16-bit */
754 tmio_core_mmc_enable(asic
->tmio_cnf
, 1 - asic
->bus_shift
,
755 ASIC3_SD_CTRL_BASE
>> 1);
760 static int asic3_mmc_disable(struct platform_device
*pdev
)
762 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
764 /* Put in suspend mode */
765 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
766 ASIC3_SDHWCTRL_SUSPEND
, 1);
769 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_SD_HOST
]);
770 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_SD_BUS
]);
771 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX0
]);
772 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX1
]);
776 static struct mfd_cell asic3_cell_mmc
= {
778 .enable
= asic3_mmc_enable
,
779 .disable
= asic3_mmc_disable
,
780 .suspend
= asic3_mmc_disable
,
781 .resume
= asic3_mmc_enable
,
782 .platform_data
= &asic3_mmc_data
,
783 .pdata_size
= sizeof(asic3_mmc_data
),
784 .num_resources
= ARRAY_SIZE(asic3_mmc_resources
),
785 .resources
= asic3_mmc_resources
,
788 static const int clock_ledn
[ASIC3_NUM_LEDS
] = {
789 [0] = ASIC3_CLOCK_LED0
,
790 [1] = ASIC3_CLOCK_LED1
,
791 [2] = ASIC3_CLOCK_LED2
,
794 static int asic3_leds_enable(struct platform_device
*pdev
)
796 const struct mfd_cell
*cell
= mfd_get_cell(pdev
);
797 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
799 asic3_clk_enable(asic
, &asic
->clocks
[clock_ledn
[cell
->id
]]);
804 static int asic3_leds_disable(struct platform_device
*pdev
)
806 const struct mfd_cell
*cell
= mfd_get_cell(pdev
);
807 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
809 asic3_clk_disable(asic
, &asic
->clocks
[clock_ledn
[cell
->id
]]);
814 static int asic3_leds_suspend(struct platform_device
*pdev
)
816 const struct mfd_cell
*cell
= mfd_get_cell(pdev
);
817 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
819 while (asic3_gpio_get(&asic
->gpio
, ASIC3_GPIO(C
, cell
->id
)) != 0)
822 asic3_clk_disable(asic
, &asic
->clocks
[clock_ledn
[cell
->id
]]);
827 static struct mfd_cell asic3_cell_leds
[ASIC3_NUM_LEDS
] = {
829 .name
= "leds-asic3",
831 .enable
= asic3_leds_enable
,
832 .disable
= asic3_leds_disable
,
833 .suspend
= asic3_leds_suspend
,
834 .resume
= asic3_leds_enable
,
837 .name
= "leds-asic3",
839 .enable
= asic3_leds_enable
,
840 .disable
= asic3_leds_disable
,
841 .suspend
= asic3_leds_suspend
,
842 .resume
= asic3_leds_enable
,
845 .name
= "leds-asic3",
847 .enable
= asic3_leds_enable
,
848 .disable
= asic3_leds_disable
,
849 .suspend
= asic3_leds_suspend
,
850 .resume
= asic3_leds_enable
,
854 static int __init
asic3_mfd_probe(struct platform_device
*pdev
,
855 struct asic3_platform_data
*pdata
,
856 struct resource
*mem
)
858 struct asic3
*asic
= platform_get_drvdata(pdev
);
859 struct resource
*mem_sdio
;
862 mem_sdio
= platform_get_resource(pdev
, IORESOURCE_MEM
, 1);
864 dev_dbg(asic
->dev
, "no SDIO MEM resource\n");
866 irq
= platform_get_irq(pdev
, 1);
868 dev_dbg(asic
->dev
, "no SDIO IRQ resource\n");
871 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, SELECT
),
872 ASIC3_EXTCF_OWM_SMB
, 0);
874 ds1wm_resources
[0].start
>>= asic
->bus_shift
;
875 ds1wm_resources
[0].end
>>= asic
->bus_shift
;
878 asic
->tmio_cnf
= ioremap((ASIC3_SD_CONFIG_BASE
>> asic
->bus_shift
) +
880 ASIC3_SD_CONFIG_SIZE
>> asic
->bus_shift
);
881 if (!asic
->tmio_cnf
) {
883 dev_dbg(asic
->dev
, "Couldn't ioremap SD_CONFIG\n");
886 asic3_mmc_resources
[0].start
>>= asic
->bus_shift
;
887 asic3_mmc_resources
[0].end
>>= asic
->bus_shift
;
889 ret
= mfd_add_devices(&pdev
->dev
, pdev
->id
,
890 &asic3_cell_ds1wm
, 1, mem
, asic
->irq_base
);
894 if (mem_sdio
&& (irq
>= 0)) {
895 ret
= mfd_add_devices(&pdev
->dev
, pdev
->id
,
896 &asic3_cell_mmc
, 1, mem_sdio
, irq
);
904 for (i
= 0; i
< ASIC3_NUM_LEDS
; ++i
) {
905 asic3_cell_leds
[i
].platform_data
= &pdata
->leds
[i
];
906 asic3_cell_leds
[i
].pdata_size
= sizeof(pdata
->leds
[i
]);
908 ret
= mfd_add_devices(&pdev
->dev
, 0,
909 asic3_cell_leds
, ASIC3_NUM_LEDS
, NULL
, 0);
916 static void asic3_mfd_remove(struct platform_device
*pdev
)
918 struct asic3
*asic
= platform_get_drvdata(pdev
);
920 mfd_remove_devices(&pdev
->dev
);
921 iounmap(asic
->tmio_cnf
);
925 static int __init
asic3_probe(struct platform_device
*pdev
)
927 struct asic3_platform_data
*pdata
= pdev
->dev
.platform_data
;
929 struct resource
*mem
;
930 unsigned long clksel
;
933 asic
= kzalloc(sizeof(struct asic3
), GFP_KERNEL
);
935 printk(KERN_ERR
"kzalloc failed\n");
939 spin_lock_init(&asic
->lock
);
940 platform_set_drvdata(pdev
, asic
);
941 asic
->dev
= &pdev
->dev
;
943 mem
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
946 dev_err(asic
->dev
, "no MEM resource\n");
950 asic
->mapping
= ioremap(mem
->start
, resource_size(mem
));
951 if (!asic
->mapping
) {
953 dev_err(asic
->dev
, "Couldn't ioremap\n");
957 asic
->irq_base
= pdata
->irq_base
;
959 /* calculate bus shift from mem resource */
960 asic
->bus_shift
= 2 - (resource_size(mem
) >> 12);
963 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, SEL
), clksel
);
965 ret
= asic3_irq_probe(pdev
);
967 dev_err(asic
->dev
, "Couldn't probe IRQs\n");
971 asic
->gpio
.label
= "asic3";
972 asic
->gpio
.base
= pdata
->gpio_base
;
973 asic
->gpio
.ngpio
= ASIC3_NUM_GPIOS
;
974 asic
->gpio
.get
= asic3_gpio_get
;
975 asic
->gpio
.set
= asic3_gpio_set
;
976 asic
->gpio
.direction_input
= asic3_gpio_direction_input
;
977 asic
->gpio
.direction_output
= asic3_gpio_direction_output
;
979 ret
= asic3_gpio_probe(pdev
,
981 pdata
->gpio_config_num
);
983 dev_err(asic
->dev
, "GPIO probe failed\n");
987 /* Making a per-device copy is only needed for the
988 * theoretical case of multiple ASIC3s on one board:
990 memcpy(asic
->clocks
, asic3_clk_init
, sizeof(asic3_clk_init
));
992 asic3_mfd_probe(pdev
, pdata
, mem
);
994 dev_info(asic
->dev
, "ASIC3 Core driver\n");
999 asic3_irq_remove(pdev
);
1002 iounmap(asic
->mapping
);
1010 static int __devexit
asic3_remove(struct platform_device
*pdev
)
1013 struct asic3
*asic
= platform_get_drvdata(pdev
);
1015 asic3_mfd_remove(pdev
);
1017 ret
= asic3_gpio_remove(pdev
);
1020 asic3_irq_remove(pdev
);
1022 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, SEL
), 0);
1024 iounmap(asic
->mapping
);
1031 static void asic3_shutdown(struct platform_device
*pdev
)
1035 static struct platform_driver asic3_device_driver
= {
1039 .remove
= __devexit_p(asic3_remove
),
1040 .shutdown
= asic3_shutdown
,
1043 static int __init
asic3_init(void)
1046 retval
= platform_driver_probe(&asic3_device_driver
, asic3_probe
);
1050 subsys_initcall(asic3_init
);