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>
23 #include <linux/export.h>
25 #include <linux/slab.h>
26 #include <linux/spinlock.h>
27 #include <linux/platform_device.h>
29 #include <linux/mfd/asic3.h>
30 #include <linux/mfd/core.h>
31 #include <linux/mfd/ds1wm.h>
32 #include <linux/mfd/tmio.h>
55 #define INIT_CDEX(_name, _rate) \
56 [ASIC3_CLOCK_##_name] = { \
57 .cdex = CLOCK_CDEX_##_name, \
61 static struct asic3_clk asic3_clk_init
[] __initdata
= {
63 INIT_CDEX(OWM
, 5000000),
69 INIT_CDEX(SD_HOST
, 24576000),
70 INIT_CDEX(SD_BUS
, 12288000),
72 INIT_CDEX(EX0
, 32768),
73 INIT_CDEX(EX1
, 24576000),
77 void __iomem
*mapping
;
78 unsigned int bus_shift
;
80 unsigned int irq_base
;
83 struct gpio_chip gpio
;
85 void __iomem
*tmio_cnf
;
87 struct asic3_clk clocks
[ARRAY_SIZE(asic3_clk_init
)];
90 static int asic3_gpio_get(struct gpio_chip
*chip
, unsigned offset
);
92 void asic3_write_register(struct asic3
*asic
, unsigned int reg
, u32 value
)
94 iowrite16(value
, asic
->mapping
+
95 (reg
>> asic
->bus_shift
));
97 EXPORT_SYMBOL_GPL(asic3_write_register
);
99 u32
asic3_read_register(struct asic3
*asic
, unsigned int reg
)
101 return ioread16(asic
->mapping
+
102 (reg
>> asic
->bus_shift
));
104 EXPORT_SYMBOL_GPL(asic3_read_register
);
106 static void asic3_set_register(struct asic3
*asic
, u32 reg
, u32 bits
, bool set
)
111 spin_lock_irqsave(&asic
->lock
, flags
);
112 val
= asic3_read_register(asic
, reg
);
117 asic3_write_register(asic
, reg
, val
);
118 spin_unlock_irqrestore(&asic
->lock
, flags
);
122 #define MAX_ASIC_ISR_LOOPS 20
123 #define ASIC3_GPIO_BASE_INCR \
124 (ASIC3_GPIO_B_BASE - ASIC3_GPIO_A_BASE)
126 static void asic3_irq_flip_edge(struct asic3
*asic
,
132 spin_lock_irqsave(&asic
->lock
, flags
);
133 edge
= asic3_read_register(asic
,
134 base
+ ASIC3_GPIO_EDGE_TRIGGER
);
136 asic3_write_register(asic
,
137 base
+ ASIC3_GPIO_EDGE_TRIGGER
, edge
);
138 spin_unlock_irqrestore(&asic
->lock
, flags
);
141 static void asic3_irq_demux(unsigned int irq
, struct irq_desc
*desc
)
143 struct asic3
*asic
= irq_desc_get_handler_data(desc
);
144 struct irq_data
*data
= irq_desc_get_irq_data(desc
);
148 data
->chip
->irq_ack(data
);
150 for (iter
= 0 ; iter
< MAX_ASIC_ISR_LOOPS
; iter
++) {
154 spin_lock_irqsave(&asic
->lock
, flags
);
155 status
= asic3_read_register(asic
,
156 ASIC3_OFFSET(INTR
, P_INT_STAT
));
157 spin_unlock_irqrestore(&asic
->lock
, flags
);
159 /* Check all ten register bits */
160 if ((status
& 0x3ff) == 0)
163 /* Handle GPIO IRQs */
164 for (bank
= 0; bank
< ASIC3_NUM_GPIO_BANKS
; bank
++) {
165 if (status
& (1 << bank
)) {
166 unsigned long base
, istat
;
168 base
= ASIC3_GPIO_A_BASE
169 + bank
* ASIC3_GPIO_BASE_INCR
;
171 spin_lock_irqsave(&asic
->lock
, flags
);
172 istat
= asic3_read_register(asic
,
174 ASIC3_GPIO_INT_STATUS
);
175 /* Clearing IntStatus */
176 asic3_write_register(asic
,
178 ASIC3_GPIO_INT_STATUS
, 0);
179 spin_unlock_irqrestore(&asic
->lock
, flags
);
181 for (i
= 0; i
< ASIC3_GPIOS_PER_BANK
; i
++) {
188 irqnr
= asic
->irq_base
+
189 (ASIC3_GPIOS_PER_BANK
* bank
)
191 generic_handle_irq(irqnr
);
192 if (asic
->irq_bothedge
[bank
] & bit
)
193 asic3_irq_flip_edge(asic
, base
,
199 /* Handle remaining IRQs in the status register */
200 for (i
= ASIC3_NUM_GPIOS
; i
< ASIC3_NR_IRQS
; i
++) {
201 /* They start at bit 4 and go up */
202 if (status
& (1 << (i
- ASIC3_NUM_GPIOS
+ 4)))
203 generic_handle_irq(asic
->irq_base
+ i
);
207 if (iter
>= MAX_ASIC_ISR_LOOPS
)
208 dev_err(asic
->dev
, "interrupt processing overrun\n");
211 static inline int asic3_irq_to_bank(struct asic3
*asic
, int irq
)
215 n
= (irq
- asic
->irq_base
) >> 4;
217 return (n
* (ASIC3_GPIO_B_BASE
- ASIC3_GPIO_A_BASE
));
220 static inline int asic3_irq_to_index(struct asic3
*asic
, int irq
)
222 return (irq
- asic
->irq_base
) & 0xf;
225 static void asic3_mask_gpio_irq(struct irq_data
*data
)
227 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
228 u32 val
, bank
, index
;
231 bank
= asic3_irq_to_bank(asic
, data
->irq
);
232 index
= asic3_irq_to_index(asic
, data
->irq
);
234 spin_lock_irqsave(&asic
->lock
, flags
);
235 val
= asic3_read_register(asic
, bank
+ ASIC3_GPIO_MASK
);
237 asic3_write_register(asic
, bank
+ ASIC3_GPIO_MASK
, val
);
238 spin_unlock_irqrestore(&asic
->lock
, flags
);
241 static void asic3_mask_irq(struct irq_data
*data
)
243 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
247 spin_lock_irqsave(&asic
->lock
, flags
);
248 regval
= asic3_read_register(asic
,
250 ASIC3_INTR_INT_MASK
);
252 regval
&= ~(ASIC3_INTMASK_MASK0
<<
253 (data
->irq
- (asic
->irq_base
+ ASIC3_NUM_GPIOS
)));
255 asic3_write_register(asic
,
259 spin_unlock_irqrestore(&asic
->lock
, flags
);
262 static void asic3_unmask_gpio_irq(struct irq_data
*data
)
264 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
265 u32 val
, bank
, index
;
268 bank
= asic3_irq_to_bank(asic
, data
->irq
);
269 index
= asic3_irq_to_index(asic
, data
->irq
);
271 spin_lock_irqsave(&asic
->lock
, flags
);
272 val
= asic3_read_register(asic
, bank
+ ASIC3_GPIO_MASK
);
273 val
&= ~(1 << index
);
274 asic3_write_register(asic
, bank
+ ASIC3_GPIO_MASK
, val
);
275 spin_unlock_irqrestore(&asic
->lock
, flags
);
278 static void asic3_unmask_irq(struct irq_data
*data
)
280 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
284 spin_lock_irqsave(&asic
->lock
, flags
);
285 regval
= asic3_read_register(asic
,
287 ASIC3_INTR_INT_MASK
);
289 regval
|= (ASIC3_INTMASK_MASK0
<<
290 (data
->irq
- (asic
->irq_base
+ ASIC3_NUM_GPIOS
)));
292 asic3_write_register(asic
,
296 spin_unlock_irqrestore(&asic
->lock
, flags
);
299 static int asic3_gpio_irq_type(struct irq_data
*data
, unsigned int type
)
301 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
303 u16 trigger
, level
, edge
, bit
;
306 bank
= asic3_irq_to_bank(asic
, data
->irq
);
307 index
= asic3_irq_to_index(asic
, data
->irq
);
310 spin_lock_irqsave(&asic
->lock
, flags
);
311 level
= asic3_read_register(asic
,
312 bank
+ ASIC3_GPIO_LEVEL_TRIGGER
);
313 edge
= asic3_read_register(asic
,
314 bank
+ ASIC3_GPIO_EDGE_TRIGGER
);
315 trigger
= asic3_read_register(asic
,
316 bank
+ ASIC3_GPIO_TRIGGER_TYPE
);
317 asic
->irq_bothedge
[(data
->irq
- asic
->irq_base
) >> 4] &= ~bit
;
319 if (type
== IRQ_TYPE_EDGE_RISING
) {
322 } else if (type
== IRQ_TYPE_EDGE_FALLING
) {
325 } else if (type
== IRQ_TYPE_EDGE_BOTH
) {
327 if (asic3_gpio_get(&asic
->gpio
, data
->irq
- asic
->irq_base
))
331 asic
->irq_bothedge
[(data
->irq
- asic
->irq_base
) >> 4] |= bit
;
332 } else if (type
== IRQ_TYPE_LEVEL_LOW
) {
335 } else if (type
== IRQ_TYPE_LEVEL_HIGH
) {
340 * if type == IRQ_TYPE_NONE, we should mask interrupts, but
341 * be careful to not unmask them if mask was also called.
342 * Probably need internal state for mask.
344 dev_notice(asic
->dev
, "irq type not changed\n");
346 asic3_write_register(asic
, bank
+ ASIC3_GPIO_LEVEL_TRIGGER
,
348 asic3_write_register(asic
, bank
+ ASIC3_GPIO_EDGE_TRIGGER
,
350 asic3_write_register(asic
, bank
+ ASIC3_GPIO_TRIGGER_TYPE
,
352 spin_unlock_irqrestore(&asic
->lock
, flags
);
356 static int asic3_gpio_irq_set_wake(struct irq_data
*data
, unsigned int on
)
358 struct asic3
*asic
= irq_data_get_irq_chip_data(data
);
362 bank
= asic3_irq_to_bank(asic
, data
->irq
);
363 index
= asic3_irq_to_index(asic
, data
->irq
);
366 asic3_set_register(asic
, bank
+ ASIC3_GPIO_SLEEP_MASK
, bit
, !on
);
371 static struct irq_chip asic3_gpio_irq_chip
= {
372 .name
= "ASIC3-GPIO",
373 .irq_ack
= asic3_mask_gpio_irq
,
374 .irq_mask
= asic3_mask_gpio_irq
,
375 .irq_unmask
= asic3_unmask_gpio_irq
,
376 .irq_set_type
= asic3_gpio_irq_type
,
377 .irq_set_wake
= asic3_gpio_irq_set_wake
,
380 static struct irq_chip asic3_irq_chip
= {
382 .irq_ack
= asic3_mask_irq
,
383 .irq_mask
= asic3_mask_irq
,
384 .irq_unmask
= asic3_unmask_irq
,
387 static int __init
asic3_irq_probe(struct platform_device
*pdev
)
389 struct asic3
*asic
= platform_get_drvdata(pdev
);
390 unsigned long clksel
= 0;
391 unsigned int irq
, irq_base
;
394 ret
= platform_get_irq(pdev
, 0);
399 /* turn on clock to IRQ controller */
400 clksel
|= CLOCK_SEL_CX
;
401 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, SEL
),
404 irq_base
= asic
->irq_base
;
406 for (irq
= irq_base
; irq
< irq_base
+ ASIC3_NR_IRQS
; irq
++) {
407 if (irq
< asic
->irq_base
+ ASIC3_NUM_GPIOS
)
408 irq_set_chip(irq
, &asic3_gpio_irq_chip
);
410 irq_set_chip(irq
, &asic3_irq_chip
);
412 irq_set_chip_data(irq
, asic
);
413 irq_set_handler(irq
, handle_level_irq
);
414 set_irq_flags(irq
, IRQF_VALID
| IRQF_PROBE
);
417 asic3_write_register(asic
, ASIC3_OFFSET(INTR
, INT_MASK
),
418 ASIC3_INTMASK_GINTMASK
);
420 irq_set_chained_handler(asic
->irq_nr
, asic3_irq_demux
);
421 irq_set_irq_type(asic
->irq_nr
, IRQ_TYPE_EDGE_RISING
);
422 irq_set_handler_data(asic
->irq_nr
, asic
);
427 static void asic3_irq_remove(struct platform_device
*pdev
)
429 struct asic3
*asic
= platform_get_drvdata(pdev
);
430 unsigned int irq
, irq_base
;
432 irq_base
= asic
->irq_base
;
434 for (irq
= irq_base
; irq
< irq_base
+ ASIC3_NR_IRQS
; irq
++) {
435 set_irq_flags(irq
, 0);
436 irq_set_chip_and_handler(irq
, NULL
, NULL
);
437 irq_set_chip_data(irq
, NULL
);
439 irq_set_chained_handler(asic
->irq_nr
, NULL
);
443 static int asic3_gpio_direction(struct gpio_chip
*chip
,
444 unsigned offset
, int out
)
446 u32 mask
= ASIC3_GPIO_TO_MASK(offset
), out_reg
;
447 unsigned int gpio_base
;
451 asic
= container_of(chip
, struct asic3
, gpio
);
452 gpio_base
= ASIC3_GPIO_TO_BASE(offset
);
454 if (gpio_base
> ASIC3_GPIO_D_BASE
) {
455 dev_err(asic
->dev
, "Invalid base (0x%x) for gpio %d\n",
460 spin_lock_irqsave(&asic
->lock
, flags
);
462 out_reg
= asic3_read_register(asic
, gpio_base
+ ASIC3_GPIO_DIRECTION
);
464 /* Input is 0, Output is 1 */
470 asic3_write_register(asic
, gpio_base
+ ASIC3_GPIO_DIRECTION
, out_reg
);
472 spin_unlock_irqrestore(&asic
->lock
, flags
);
478 static int asic3_gpio_direction_input(struct gpio_chip
*chip
,
481 return asic3_gpio_direction(chip
, offset
, 0);
484 static int asic3_gpio_direction_output(struct gpio_chip
*chip
,
485 unsigned offset
, int value
)
487 return asic3_gpio_direction(chip
, offset
, 1);
490 static int asic3_gpio_get(struct gpio_chip
*chip
,
493 unsigned int gpio_base
;
494 u32 mask
= ASIC3_GPIO_TO_MASK(offset
);
497 asic
= container_of(chip
, struct asic3
, gpio
);
498 gpio_base
= ASIC3_GPIO_TO_BASE(offset
);
500 if (gpio_base
> ASIC3_GPIO_D_BASE
) {
501 dev_err(asic
->dev
, "Invalid base (0x%x) for gpio %d\n",
506 return asic3_read_register(asic
, gpio_base
+ ASIC3_GPIO_STATUS
) & mask
;
509 static void asic3_gpio_set(struct gpio_chip
*chip
,
510 unsigned offset
, int value
)
513 unsigned int gpio_base
;
517 asic
= container_of(chip
, struct asic3
, gpio
);
518 gpio_base
= ASIC3_GPIO_TO_BASE(offset
);
520 if (gpio_base
> ASIC3_GPIO_D_BASE
) {
521 dev_err(asic
->dev
, "Invalid base (0x%x) for gpio %d\n",
526 mask
= ASIC3_GPIO_TO_MASK(offset
);
528 spin_lock_irqsave(&asic
->lock
, flags
);
530 out_reg
= asic3_read_register(asic
, gpio_base
+ ASIC3_GPIO_OUT
);
537 asic3_write_register(asic
, gpio_base
+ ASIC3_GPIO_OUT
, out_reg
);
539 spin_unlock_irqrestore(&asic
->lock
, flags
);
544 static int asic3_gpio_to_irq(struct gpio_chip
*chip
, unsigned offset
)
546 struct asic3
*asic
= container_of(chip
, struct asic3
, gpio
);
548 return asic
->irq_base
+ offset
;
551 static __init
int asic3_gpio_probe(struct platform_device
*pdev
,
552 u16
*gpio_config
, int num
)
554 struct asic3
*asic
= platform_get_drvdata(pdev
);
555 u16 alt_reg
[ASIC3_NUM_GPIO_BANKS
];
556 u16 out_reg
[ASIC3_NUM_GPIO_BANKS
];
557 u16 dir_reg
[ASIC3_NUM_GPIO_BANKS
];
560 memset(alt_reg
, 0, ASIC3_NUM_GPIO_BANKS
* sizeof(u16
));
561 memset(out_reg
, 0, ASIC3_NUM_GPIO_BANKS
* sizeof(u16
));
562 memset(dir_reg
, 0, ASIC3_NUM_GPIO_BANKS
* sizeof(u16
));
564 /* Enable all GPIOs */
565 asic3_write_register(asic
, ASIC3_GPIO_OFFSET(A
, MASK
), 0xffff);
566 asic3_write_register(asic
, ASIC3_GPIO_OFFSET(B
, MASK
), 0xffff);
567 asic3_write_register(asic
, ASIC3_GPIO_OFFSET(C
, MASK
), 0xffff);
568 asic3_write_register(asic
, ASIC3_GPIO_OFFSET(D
, MASK
), 0xffff);
570 for (i
= 0; i
< num
; i
++) {
571 u8 alt
, pin
, dir
, init
, bank_num
, bit_num
;
572 u16 config
= gpio_config
[i
];
574 pin
= ASIC3_CONFIG_GPIO_PIN(config
);
575 alt
= ASIC3_CONFIG_GPIO_ALT(config
);
576 dir
= ASIC3_CONFIG_GPIO_DIR(config
);
577 init
= ASIC3_CONFIG_GPIO_INIT(config
);
579 bank_num
= ASIC3_GPIO_TO_BANK(pin
);
580 bit_num
= ASIC3_GPIO_TO_BIT(pin
);
582 alt_reg
[bank_num
] |= (alt
<< bit_num
);
583 out_reg
[bank_num
] |= (init
<< bit_num
);
584 dir_reg
[bank_num
] |= (dir
<< bit_num
);
587 for (i
= 0; i
< ASIC3_NUM_GPIO_BANKS
; i
++) {
588 asic3_write_register(asic
,
589 ASIC3_BANK_TO_BASE(i
) +
590 ASIC3_GPIO_DIRECTION
,
592 asic3_write_register(asic
,
593 ASIC3_BANK_TO_BASE(i
) + ASIC3_GPIO_OUT
,
595 asic3_write_register(asic
,
596 ASIC3_BANK_TO_BASE(i
) +
597 ASIC3_GPIO_ALT_FUNCTION
,
601 return gpiochip_add(&asic
->gpio
);
604 static int asic3_gpio_remove(struct platform_device
*pdev
)
606 struct asic3
*asic
= platform_get_drvdata(pdev
);
608 gpiochip_remove(&asic
->gpio
);
612 static void asic3_clk_enable(struct asic3
*asic
, struct asic3_clk
*clk
)
617 spin_lock_irqsave(&asic
->lock
, flags
);
618 if (clk
->enabled
++ == 0) {
619 cdex
= asic3_read_register(asic
, ASIC3_OFFSET(CLOCK
, CDEX
));
621 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, CDEX
), cdex
);
623 spin_unlock_irqrestore(&asic
->lock
, flags
);
626 static void asic3_clk_disable(struct asic3
*asic
, struct asic3_clk
*clk
)
631 WARN_ON(clk
->enabled
== 0);
633 spin_lock_irqsave(&asic
->lock
, flags
);
634 if (--clk
->enabled
== 0) {
635 cdex
= asic3_read_register(asic
, ASIC3_OFFSET(CLOCK
, CDEX
));
637 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, CDEX
), cdex
);
639 spin_unlock_irqrestore(&asic
->lock
, flags
);
642 /* MFD cells (SPI, PWM, LED, DS1WM, MMC) */
643 static struct ds1wm_driver_data ds1wm_pdata
= {
645 .reset_recover_delay
= 1,
648 static struct resource ds1wm_resources
[] = {
650 .start
= ASIC3_OWM_BASE
,
651 .end
= ASIC3_OWM_BASE
+ 0x13,
652 .flags
= IORESOURCE_MEM
,
655 .start
= ASIC3_IRQ_OWM
,
656 .end
= ASIC3_IRQ_OWM
,
657 .flags
= IORESOURCE_IRQ
| IORESOURCE_IRQ_HIGHEDGE
,
661 static int ds1wm_enable(struct platform_device
*pdev
)
663 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
665 /* Turn on external clocks and the OWM clock */
666 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX0
]);
667 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX1
]);
668 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_OWM
]);
671 /* Reset and enable DS1WM */
672 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, RESET
),
673 ASIC3_EXTCF_OWM_RESET
, 1);
675 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, RESET
),
676 ASIC3_EXTCF_OWM_RESET
, 0);
678 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, SELECT
),
679 ASIC3_EXTCF_OWM_EN
, 1);
685 static int ds1wm_disable(struct platform_device
*pdev
)
687 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
689 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, SELECT
),
690 ASIC3_EXTCF_OWM_EN
, 0);
692 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_OWM
]);
693 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX0
]);
694 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX1
]);
699 static const struct mfd_cell asic3_cell_ds1wm
= {
701 .enable
= ds1wm_enable
,
702 .disable
= ds1wm_disable
,
703 .platform_data
= &ds1wm_pdata
,
704 .pdata_size
= sizeof(ds1wm_pdata
),
705 .num_resources
= ARRAY_SIZE(ds1wm_resources
),
706 .resources
= ds1wm_resources
,
709 static void asic3_mmc_pwr(struct platform_device
*pdev
, int state
)
711 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
713 tmio_core_mmc_pwr(asic
->tmio_cnf
, 1 - asic
->bus_shift
, state
);
716 static void asic3_mmc_clk_div(struct platform_device
*pdev
, int state
)
718 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
720 tmio_core_mmc_clk_div(asic
->tmio_cnf
, 1 - asic
->bus_shift
, state
);
723 static struct tmio_mmc_data asic3_mmc_data
= {
725 .set_pwr
= asic3_mmc_pwr
,
726 .set_clk_div
= asic3_mmc_clk_div
,
729 static struct resource asic3_mmc_resources
[] = {
731 .start
= ASIC3_SD_CTRL_BASE
,
732 .end
= ASIC3_SD_CTRL_BASE
+ 0x3ff,
733 .flags
= IORESOURCE_MEM
,
738 .flags
= IORESOURCE_IRQ
,
742 static int asic3_mmc_enable(struct platform_device
*pdev
)
744 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
746 /* Not sure if it must be done bit by bit, but leaving as-is */
747 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
748 ASIC3_SDHWCTRL_LEVCD
, 1);
749 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
750 ASIC3_SDHWCTRL_LEVWP
, 1);
751 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
752 ASIC3_SDHWCTRL_SUSPEND
, 0);
753 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
754 ASIC3_SDHWCTRL_PCLR
, 0);
756 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX0
]);
757 /* CLK32 used for card detection and for interruption detection
758 * when HCLK is stopped.
760 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX1
]);
763 /* HCLK 24.576 MHz, BCLK 12.288 MHz: */
764 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, SEL
),
765 CLOCK_SEL_CX
| CLOCK_SEL_SD_HCLK_SEL
);
767 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_SD_HOST
]);
768 asic3_clk_enable(asic
, &asic
->clocks
[ASIC3_CLOCK_SD_BUS
]);
771 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, SELECT
),
772 ASIC3_EXTCF_SD_MEM_ENABLE
, 1);
774 /* Enable SD card slot 3.3V power supply */
775 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
776 ASIC3_SDHWCTRL_SDPWR
, 1);
778 /* ASIC3_SD_CTRL_BASE assumes 32-bit addressing, TMIO is 16-bit */
779 tmio_core_mmc_enable(asic
->tmio_cnf
, 1 - asic
->bus_shift
,
780 ASIC3_SD_CTRL_BASE
>> 1);
785 static int asic3_mmc_disable(struct platform_device
*pdev
)
787 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
789 /* Put in suspend mode */
790 asic3_set_register(asic
, ASIC3_OFFSET(SDHWCTRL
, SDCONF
),
791 ASIC3_SDHWCTRL_SUSPEND
, 1);
794 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_SD_HOST
]);
795 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_SD_BUS
]);
796 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX0
]);
797 asic3_clk_disable(asic
, &asic
->clocks
[ASIC3_CLOCK_EX1
]);
801 static const struct mfd_cell asic3_cell_mmc
= {
803 .enable
= asic3_mmc_enable
,
804 .disable
= asic3_mmc_disable
,
805 .suspend
= asic3_mmc_disable
,
806 .resume
= asic3_mmc_enable
,
807 .platform_data
= &asic3_mmc_data
,
808 .pdata_size
= sizeof(asic3_mmc_data
),
809 .num_resources
= ARRAY_SIZE(asic3_mmc_resources
),
810 .resources
= asic3_mmc_resources
,
813 static const int clock_ledn
[ASIC3_NUM_LEDS
] = {
814 [0] = ASIC3_CLOCK_LED0
,
815 [1] = ASIC3_CLOCK_LED1
,
816 [2] = ASIC3_CLOCK_LED2
,
819 static int asic3_leds_enable(struct platform_device
*pdev
)
821 const struct mfd_cell
*cell
= mfd_get_cell(pdev
);
822 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
824 asic3_clk_enable(asic
, &asic
->clocks
[clock_ledn
[cell
->id
]]);
829 static int asic3_leds_disable(struct platform_device
*pdev
)
831 const struct mfd_cell
*cell
= mfd_get_cell(pdev
);
832 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
834 asic3_clk_disable(asic
, &asic
->clocks
[clock_ledn
[cell
->id
]]);
839 static int asic3_leds_suspend(struct platform_device
*pdev
)
841 const struct mfd_cell
*cell
= mfd_get_cell(pdev
);
842 struct asic3
*asic
= dev_get_drvdata(pdev
->dev
.parent
);
844 while (asic3_gpio_get(&asic
->gpio
, ASIC3_GPIO(C
, cell
->id
)) != 0)
847 asic3_clk_disable(asic
, &asic
->clocks
[clock_ledn
[cell
->id
]]);
852 static struct mfd_cell asic3_cell_leds
[ASIC3_NUM_LEDS
] = {
854 .name
= "leds-asic3",
856 .enable
= asic3_leds_enable
,
857 .disable
= asic3_leds_disable
,
858 .suspend
= asic3_leds_suspend
,
859 .resume
= asic3_leds_enable
,
862 .name
= "leds-asic3",
864 .enable
= asic3_leds_enable
,
865 .disable
= asic3_leds_disable
,
866 .suspend
= asic3_leds_suspend
,
867 .resume
= asic3_leds_enable
,
870 .name
= "leds-asic3",
872 .enable
= asic3_leds_enable
,
873 .disable
= asic3_leds_disable
,
874 .suspend
= asic3_leds_suspend
,
875 .resume
= asic3_leds_enable
,
879 static int __init
asic3_mfd_probe(struct platform_device
*pdev
,
880 struct asic3_platform_data
*pdata
,
881 struct resource
*mem
)
883 struct asic3
*asic
= platform_get_drvdata(pdev
);
884 struct resource
*mem_sdio
;
887 mem_sdio
= platform_get_resource(pdev
, IORESOURCE_MEM
, 1);
889 dev_dbg(asic
->dev
, "no SDIO MEM resource\n");
891 irq
= platform_get_irq(pdev
, 1);
893 dev_dbg(asic
->dev
, "no SDIO IRQ resource\n");
896 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, SELECT
),
897 ASIC3_EXTCF_OWM_SMB
, 0);
899 ds1wm_resources
[0].start
>>= asic
->bus_shift
;
900 ds1wm_resources
[0].end
>>= asic
->bus_shift
;
904 asic
->tmio_cnf
= ioremap((ASIC3_SD_CONFIG_BASE
>> asic
->bus_shift
) +
906 ASIC3_SD_CONFIG_SIZE
>> asic
->bus_shift
);
907 if (!asic
->tmio_cnf
) {
909 dev_dbg(asic
->dev
, "Couldn't ioremap SD_CONFIG\n");
913 asic3_mmc_resources
[0].start
>>= asic
->bus_shift
;
914 asic3_mmc_resources
[0].end
>>= asic
->bus_shift
;
916 if (pdata
->clock_rate
) {
917 ds1wm_pdata
.clock_rate
= pdata
->clock_rate
;
918 ret
= mfd_add_devices(&pdev
->dev
, pdev
->id
,
919 &asic3_cell_ds1wm
, 1, mem
, asic
->irq_base
, NULL
);
924 if (mem_sdio
&& (irq
>= 0)) {
925 ret
= mfd_add_devices(&pdev
->dev
, pdev
->id
,
926 &asic3_cell_mmc
, 1, mem_sdio
, irq
, NULL
);
935 for (i
= 0; i
< ASIC3_NUM_LEDS
; ++i
) {
936 asic3_cell_leds
[i
].platform_data
= &pdata
->leds
[i
];
937 asic3_cell_leds
[i
].pdata_size
= sizeof(pdata
->leds
[i
]);
939 ret
= mfd_add_devices(&pdev
->dev
, 0,
940 asic3_cell_leds
, ASIC3_NUM_LEDS
, NULL
, 0, NULL
);
947 static void asic3_mfd_remove(struct platform_device
*pdev
)
949 struct asic3
*asic
= platform_get_drvdata(pdev
);
951 mfd_remove_devices(&pdev
->dev
);
952 iounmap(asic
->tmio_cnf
);
956 static int __init
asic3_probe(struct platform_device
*pdev
)
958 struct asic3_platform_data
*pdata
= dev_get_platdata(&pdev
->dev
);
960 struct resource
*mem
;
961 unsigned long clksel
;
964 asic
= devm_kzalloc(&pdev
->dev
,
965 sizeof(struct asic3
), GFP_KERNEL
);
967 printk(KERN_ERR
"kzalloc failed\n");
971 spin_lock_init(&asic
->lock
);
972 platform_set_drvdata(pdev
, asic
);
973 asic
->dev
= &pdev
->dev
;
975 mem
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
977 dev_err(asic
->dev
, "no MEM resource\n");
981 asic
->mapping
= ioremap(mem
->start
, resource_size(mem
));
982 if (!asic
->mapping
) {
983 dev_err(asic
->dev
, "Couldn't ioremap\n");
987 asic
->irq_base
= pdata
->irq_base
;
989 /* calculate bus shift from mem resource */
990 asic
->bus_shift
= 2 - (resource_size(mem
) >> 12);
993 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, SEL
), clksel
);
995 ret
= asic3_irq_probe(pdev
);
997 dev_err(asic
->dev
, "Couldn't probe IRQs\n");
1001 asic
->gpio
.label
= "asic3";
1002 asic
->gpio
.base
= pdata
->gpio_base
;
1003 asic
->gpio
.ngpio
= ASIC3_NUM_GPIOS
;
1004 asic
->gpio
.get
= asic3_gpio_get
;
1005 asic
->gpio
.set
= asic3_gpio_set
;
1006 asic
->gpio
.direction_input
= asic3_gpio_direction_input
;
1007 asic
->gpio
.direction_output
= asic3_gpio_direction_output
;
1008 asic
->gpio
.to_irq
= asic3_gpio_to_irq
;
1010 ret
= asic3_gpio_probe(pdev
,
1012 pdata
->gpio_config_num
);
1014 dev_err(asic
->dev
, "GPIO probe failed\n");
1018 /* Making a per-device copy is only needed for the
1019 * theoretical case of multiple ASIC3s on one board:
1021 memcpy(asic
->clocks
, asic3_clk_init
, sizeof(asic3_clk_init
));
1023 asic3_mfd_probe(pdev
, pdata
, mem
);
1025 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, SELECT
),
1026 (ASIC3_EXTCF_CF0_BUF_EN
|ASIC3_EXTCF_CF0_PWAIT_EN
), 1);
1028 dev_info(asic
->dev
, "ASIC3 Core driver\n");
1033 asic3_irq_remove(pdev
);
1036 iounmap(asic
->mapping
);
1041 static int asic3_remove(struct platform_device
*pdev
)
1044 struct asic3
*asic
= platform_get_drvdata(pdev
);
1046 asic3_set_register(asic
, ASIC3_OFFSET(EXTCF
, SELECT
),
1047 (ASIC3_EXTCF_CF0_BUF_EN
|ASIC3_EXTCF_CF0_PWAIT_EN
), 0);
1049 asic3_mfd_remove(pdev
);
1051 ret
= asic3_gpio_remove(pdev
);
1054 asic3_irq_remove(pdev
);
1056 asic3_write_register(asic
, ASIC3_OFFSET(CLOCK
, SEL
), 0);
1058 iounmap(asic
->mapping
);
1063 static void asic3_shutdown(struct platform_device
*pdev
)
1067 static struct platform_driver asic3_device_driver
= {
1071 .remove
= asic3_remove
,
1072 .shutdown
= asic3_shutdown
,
1075 static int __init
asic3_init(void)
1078 retval
= platform_driver_probe(&asic3_device_driver
, asic3_probe
);
1082 subsys_initcall(asic3_init
);