2 * Generic GPIO driver for logic cells found in the Nomadik SoC
4 * Copyright (C) 2008,2009 STMicroelectronics
5 * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it>
6 * Rewritten based on work by Prafulla WADASKAR <prafulla.wadaskar@st.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/device.h>
16 #include <linux/platform_device.h>
18 #include <linux/clk.h>
19 #include <linux/err.h>
20 #include <linux/gpio.h>
21 #include <linux/spinlock.h>
22 #include <linux/interrupt.h>
23 #include <linux/irq.h>
24 #include <linux/slab.h>
26 #include <plat/pincfg.h>
27 #include <mach/hardware.h>
28 #include <mach/gpio.h>
31 * The GPIO module in the Nomadik family of Systems-on-Chip is an
32 * AMBA device, managing 32 pins and alternate functions. The logic block
33 * is currently used in the Nomadik and ux500.
35 * Symbols in this file are called "nmk_gpio" for "nomadik gpio"
38 static const u32 backup_regs[] = {
50 struct nmk_gpio_chip {
51 struct gpio_chip chip;
55 unsigned int parent_irq;
56 int secondary_parent_irq;
57 u32 (*get_secondary_status)(unsigned int bank);
59 /* Keep track of configured edges */
62 u32 backup[ARRAY_SIZE(backup_regs)];
63 /* Bitmap, 1 = pull up, 0 = pull down */
67 static void __nmk_gpio_set_mode(struct nmk_gpio_chip *nmk_chip,
68 unsigned offset, int gpio_mode)
70 u32 bit = 1 << offset;
73 afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & ~bit;
74 bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & ~bit;
75 if (gpio_mode & NMK_GPIO_ALT_A)
77 if (gpio_mode & NMK_GPIO_ALT_B)
79 writel(afunc, nmk_chip->addr + NMK_GPIO_AFSLA);
80 writel(bfunc, nmk_chip->addr + NMK_GPIO_AFSLB);
83 static void __nmk_gpio_set_slpm(struct nmk_gpio_chip *nmk_chip,
84 unsigned offset, enum nmk_gpio_slpm mode)
86 u32 bit = 1 << offset;
89 slpm = readl(nmk_chip->addr + NMK_GPIO_SLPC);
90 if (mode == NMK_GPIO_SLPM_NOCHANGE)
94 writel(slpm, nmk_chip->addr + NMK_GPIO_SLPC);
97 static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip,
98 unsigned offset, enum nmk_gpio_pull pull)
100 u32 bit = 1 << offset;
103 pdis = readl(nmk_chip->addr + NMK_GPIO_PDIS);
104 if (pull == NMK_GPIO_PULL_NONE)
108 writel(pdis, nmk_chip->addr + NMK_GPIO_PDIS);
110 if (pull == NMK_GPIO_PULL_UP) {
111 nmk_chip->pull |= bit;
112 writel(bit, nmk_chip->addr + NMK_GPIO_DATS);
113 } else if (pull == NMK_GPIO_PULL_DOWN) {
114 nmk_chip->pull &= ~bit;
115 writel(bit, nmk_chip->addr + NMK_GPIO_DATC);
119 static void __nmk_gpio_make_input(struct nmk_gpio_chip *nmk_chip,
122 writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC);
125 static void __nmk_gpio_set_output(struct nmk_gpio_chip *nmk_chip,
126 unsigned offset, int val)
129 writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATS);
131 writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATC);
134 static void __nmk_gpio_make_output(struct nmk_gpio_chip *nmk_chip,
135 unsigned offset, int val)
137 writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRS);
138 __nmk_gpio_set_output(nmk_chip, offset, val);
141 static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset,
142 pin_cfg_t cfg, bool sleep)
144 static const char *afnames[] = {
145 [NMK_GPIO_ALT_GPIO] = "GPIO",
146 [NMK_GPIO_ALT_A] = "A",
147 [NMK_GPIO_ALT_B] = "B",
148 [NMK_GPIO_ALT_C] = "C"
150 static const char *pullnames[] = {
151 [NMK_GPIO_PULL_NONE] = "none",
152 [NMK_GPIO_PULL_UP] = "up",
153 [NMK_GPIO_PULL_DOWN] = "down",
154 [3] /* illegal */ = "??"
156 static const char *slpmnames[] = {
157 [NMK_GPIO_SLPM_INPUT] = "input/wakeup",
158 [NMK_GPIO_SLPM_NOCHANGE] = "no-change/no-wakeup",
161 int pin = PIN_NUM(cfg);
162 int pull = PIN_PULL(cfg);
163 int af = PIN_ALT(cfg);
164 int slpm = PIN_SLPM(cfg);
165 int output = PIN_DIR(cfg);
166 int val = PIN_VAL(cfg);
168 dev_dbg(nmk_chip->chip.dev, "pin %d [%#lx]: af %s, pull %s, slpm %s (%s%s)\n",
169 pin, cfg, afnames[af], pullnames[pull], slpmnames[slpm],
170 output ? "output " : "input",
171 output ? (val ? "high" : "low") : "");
174 int slpm_pull = PIN_SLPM_PULL(cfg);
175 int slpm_output = PIN_SLPM_DIR(cfg);
176 int slpm_val = PIN_SLPM_VAL(cfg);
179 * The SLPM_* values are normal values + 1 to allow zero to
180 * mean "same as normal".
183 pull = slpm_pull - 1;
185 output = slpm_output - 1;
189 dev_dbg(nmk_chip->chip.dev, "pin %d: sleep pull %s, dir %s, val %s\n",
191 slpm_pull ? pullnames[pull] : "same",
192 slpm_output ? (output ? "output" : "input") : "same",
193 slpm_val ? (val ? "high" : "low") : "same");
197 __nmk_gpio_make_output(nmk_chip, offset, val);
199 __nmk_gpio_make_input(nmk_chip, offset);
200 __nmk_gpio_set_pull(nmk_chip, offset, pull);
203 __nmk_gpio_set_slpm(nmk_chip, offset, slpm);
204 __nmk_gpio_set_mode(nmk_chip, offset, af);
208 * nmk_config_pin - configure a pin's mux attributes
209 * @cfg: pin confguration
211 * Configures a pin's mode (alternate function or GPIO), its pull up status,
212 * and its sleep mode based on the specified configuration. The @cfg is
213 * usually one of the SoC specific macros defined in mach/<soc>-pins.h. These
214 * are constructed using, and can be further enhanced with, the macros in
217 * If a pin's mode is set to GPIO, it is configured as an input to avoid
218 * side-effects. The gpio can be manipulated later using standard GPIO API
221 int nmk_config_pin(pin_cfg_t cfg, bool sleep)
223 struct nmk_gpio_chip *nmk_chip;
224 int gpio = PIN_NUM(cfg);
227 nmk_chip = get_irq_chip_data(NOMADIK_GPIO_TO_IRQ(gpio));
231 spin_lock_irqsave(&nmk_chip->lock, flags);
232 __nmk_config_pin(nmk_chip, gpio - nmk_chip->chip.base, cfg, sleep);
233 spin_unlock_irqrestore(&nmk_chip->lock, flags);
237 EXPORT_SYMBOL(nmk_config_pin);
240 * nmk_config_pins - configure several pins at once
241 * @cfgs: array of pin configurations
242 * @num: number of elments in the array
244 * Configures several pins using nmk_config_pin(). Refer to that function for
245 * further information.
247 int nmk_config_pins(pin_cfg_t *cfgs, int num)
252 for (i = 0; i < num; i++) {
253 ret = nmk_config_pin(cfgs[i], false);
260 EXPORT_SYMBOL(nmk_config_pins);
262 int nmk_config_pins_sleep(pin_cfg_t *cfgs, int num)
267 for (i = 0; i < num; i++) {
268 ret = nmk_config_pin(cfgs[i], true);
275 EXPORT_SYMBOL(nmk_config_pins_sleep);
278 * nmk_gpio_set_slpm() - configure the sleep mode of a pin
280 * @mode: NMK_GPIO_SLPM_INPUT or NMK_GPIO_SLPM_NOCHANGE,
282 * Sets the sleep mode of a pin. If @mode is NMK_GPIO_SLPM_INPUT, the pin is
283 * changed to an input (with pullup/down enabled) in sleep and deep sleep. If
284 * @mode is NMK_GPIO_SLPM_NOCHANGE, the pin remains in the state it was
285 * configured even when in sleep and deep sleep.
287 * On DB8500v2 onwards, this setting loses the previous meaning and instead
288 * indicates if wakeup detection is enabled on the pin. Note that
289 * enable_irq_wake() will automatically enable wakeup detection.
291 int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode)
293 struct nmk_gpio_chip *nmk_chip;
296 nmk_chip = get_irq_chip_data(NOMADIK_GPIO_TO_IRQ(gpio));
300 spin_lock_irqsave(&nmk_chip->lock, flags);
301 __nmk_gpio_set_slpm(nmk_chip, gpio - nmk_chip->chip.base, mode);
302 spin_unlock_irqrestore(&nmk_chip->lock, flags);
308 * nmk_gpio_set_pull() - enable/disable pull up/down on a gpio
310 * @pull: one of NMK_GPIO_PULL_DOWN, NMK_GPIO_PULL_UP, and NMK_GPIO_PULL_NONE
312 * Enables/disables pull up/down on a specified pin. This only takes effect if
313 * the pin is configured as an input (either explicitly or by the alternate
316 * NOTE: If enabling the pull up/down, the caller must ensure that the GPIO is
317 * configured as an input. Otherwise, due to the way the controller registers
318 * work, this function will change the value output on the pin.
320 int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull)
322 struct nmk_gpio_chip *nmk_chip;
325 nmk_chip = get_irq_chip_data(NOMADIK_GPIO_TO_IRQ(gpio));
329 spin_lock_irqsave(&nmk_chip->lock, flags);
330 __nmk_gpio_set_pull(nmk_chip, gpio - nmk_chip->chip.base, pull);
331 spin_unlock_irqrestore(&nmk_chip->lock, flags);
338 * nmk_gpio_set_mode() - set the mux mode of a gpio pin
340 * @gpio_mode: one of NMK_GPIO_ALT_GPIO, NMK_GPIO_ALT_A,
341 * NMK_GPIO_ALT_B, and NMK_GPIO_ALT_C
343 * Sets the mode of the specified pin to one of the alternate functions or
346 int nmk_gpio_set_mode(int gpio, int gpio_mode)
348 struct nmk_gpio_chip *nmk_chip;
351 nmk_chip = get_irq_chip_data(NOMADIK_GPIO_TO_IRQ(gpio));
355 spin_lock_irqsave(&nmk_chip->lock, flags);
356 __nmk_gpio_set_mode(nmk_chip, gpio - nmk_chip->chip.base, gpio_mode);
357 spin_unlock_irqrestore(&nmk_chip->lock, flags);
361 EXPORT_SYMBOL(nmk_gpio_set_mode);
363 int nmk_gpio_get_mode(int gpio)
365 struct nmk_gpio_chip *nmk_chip;
366 u32 afunc, bfunc, bit;
368 nmk_chip = get_irq_chip_data(NOMADIK_GPIO_TO_IRQ(gpio));
372 bit = 1 << (gpio - nmk_chip->chip.base);
374 afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & bit;
375 bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & bit;
377 return (afunc ? NMK_GPIO_ALT_A : 0) | (bfunc ? NMK_GPIO_ALT_B : 0);
379 EXPORT_SYMBOL(nmk_gpio_get_mode);
383 static inline int nmk_gpio_get_bitmask(int gpio)
385 return 1 << (gpio % 32);
388 static void nmk_gpio_irq_ack(struct irq_data *d)
391 struct nmk_gpio_chip *nmk_chip;
393 gpio = NOMADIK_IRQ_TO_GPIO(d->irq);
394 nmk_chip = irq_data_get_irq_chip_data(d);
397 writel(nmk_gpio_get_bitmask(gpio), nmk_chip->addr + NMK_GPIO_IC);
400 enum nmk_gpio_irq_type {
405 static void __nmk_gpio_irq_modify(struct nmk_gpio_chip *nmk_chip,
406 int gpio, enum nmk_gpio_irq_type which,
409 u32 rimsc = which == WAKE ? NMK_GPIO_RWIMSC : NMK_GPIO_RIMSC;
410 u32 fimsc = which == WAKE ? NMK_GPIO_FWIMSC : NMK_GPIO_FIMSC;
411 u32 bitmask = nmk_gpio_get_bitmask(gpio);
414 /* we must individually set/clear the two edges */
415 if (nmk_chip->edge_rising & bitmask) {
416 reg = readl(nmk_chip->addr + rimsc);
421 writel(reg, nmk_chip->addr + rimsc);
423 if (nmk_chip->edge_falling & bitmask) {
424 reg = readl(nmk_chip->addr + fimsc);
429 writel(reg, nmk_chip->addr + fimsc);
433 static int nmk_gpio_irq_modify(struct irq_data *d, enum nmk_gpio_irq_type which,
437 struct nmk_gpio_chip *nmk_chip;
441 gpio = NOMADIK_IRQ_TO_GPIO(d->irq);
442 nmk_chip = irq_data_get_irq_chip_data(d);
443 bitmask = nmk_gpio_get_bitmask(gpio);
447 spin_lock_irqsave(&nmk_chip->lock, flags);
448 __nmk_gpio_irq_modify(nmk_chip, gpio, which, enable);
449 spin_unlock_irqrestore(&nmk_chip->lock, flags);
454 static void nmk_gpio_irq_mask(struct irq_data *d)
456 nmk_gpio_irq_modify(d, NORMAL, false);
459 static void nmk_gpio_irq_unmask(struct irq_data *d)
461 nmk_gpio_irq_modify(d, NORMAL, true);
464 static int nmk_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
466 struct nmk_gpio_chip *nmk_chip;
470 gpio = NOMADIK_IRQ_TO_GPIO(d->irq);
471 nmk_chip = irq_data_get_irq_chip_data(d);
475 spin_lock_irqsave(&nmk_chip->lock, flags);
476 #ifdef CONFIG_ARCH_U8500
477 if (cpu_is_u8500v2()) {
478 __nmk_gpio_set_slpm(nmk_chip, gpio,
479 on ? NMK_GPIO_SLPM_WAKEUP_ENABLE
480 : NMK_GPIO_SLPM_WAKEUP_DISABLE);
483 __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, on);
484 spin_unlock_irqrestore(&nmk_chip->lock, flags);
489 static int nmk_gpio_irq_set_type(struct irq_data *d, unsigned int type)
491 struct irq_desc *desc = irq_to_desc(d->irq);
492 bool enabled = !(desc->status & IRQ_DISABLED);
493 bool wake = desc->wake_depth;
495 struct nmk_gpio_chip *nmk_chip;
499 gpio = NOMADIK_IRQ_TO_GPIO(d->irq);
500 nmk_chip = irq_data_get_irq_chip_data(d);
501 bitmask = nmk_gpio_get_bitmask(gpio);
505 if (type & IRQ_TYPE_LEVEL_HIGH)
507 if (type & IRQ_TYPE_LEVEL_LOW)
510 spin_lock_irqsave(&nmk_chip->lock, flags);
513 __nmk_gpio_irq_modify(nmk_chip, gpio, NORMAL, false);
516 __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, false);
518 nmk_chip->edge_rising &= ~bitmask;
519 if (type & IRQ_TYPE_EDGE_RISING)
520 nmk_chip->edge_rising |= bitmask;
522 nmk_chip->edge_falling &= ~bitmask;
523 if (type & IRQ_TYPE_EDGE_FALLING)
524 nmk_chip->edge_falling |= bitmask;
527 __nmk_gpio_irq_modify(nmk_chip, gpio, NORMAL, true);
530 __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, true);
532 spin_unlock_irqrestore(&nmk_chip->lock, flags);
537 static struct irq_chip nmk_gpio_irq_chip = {
538 .name = "Nomadik-GPIO",
539 .irq_ack = nmk_gpio_irq_ack,
540 .irq_mask = nmk_gpio_irq_mask,
541 .irq_unmask = nmk_gpio_irq_unmask,
542 .irq_set_type = nmk_gpio_irq_set_type,
543 .irq_set_wake = nmk_gpio_irq_set_wake,
546 static void __nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc,
549 struct nmk_gpio_chip *nmk_chip;
550 struct irq_chip *host_chip = get_irq_chip(irq);
551 unsigned int first_irq;
553 if (host_chip->irq_mask_ack)
554 host_chip->irq_mask_ack(&desc->irq_data);
556 host_chip->irq_mask(&desc->irq_data);
557 if (host_chip->irq_ack)
558 host_chip->irq_ack(&desc->irq_data);
561 nmk_chip = get_irq_data(irq);
562 first_irq = NOMADIK_GPIO_TO_IRQ(nmk_chip->chip.base);
564 int bit = __ffs(status);
566 generic_handle_irq(first_irq + bit);
570 host_chip->irq_unmask(&desc->irq_data);
573 static void nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
575 struct nmk_gpio_chip *nmk_chip = get_irq_data(irq);
576 u32 status = readl(nmk_chip->addr + NMK_GPIO_IS);
578 __nmk_gpio_irq_handler(irq, desc, status);
581 static void nmk_gpio_secondary_irq_handler(unsigned int irq,
582 struct irq_desc *desc)
584 struct nmk_gpio_chip *nmk_chip = get_irq_data(irq);
585 u32 status = nmk_chip->get_secondary_status(nmk_chip->bank);
587 __nmk_gpio_irq_handler(irq, desc, status);
590 static int nmk_gpio_init_irq(struct nmk_gpio_chip *nmk_chip)
592 unsigned int first_irq;
595 first_irq = NOMADIK_GPIO_TO_IRQ(nmk_chip->chip.base);
596 for (i = first_irq; i < first_irq + nmk_chip->chip.ngpio; i++) {
597 set_irq_chip(i, &nmk_gpio_irq_chip);
598 set_irq_handler(i, handle_edge_irq);
599 set_irq_flags(i, IRQF_VALID);
600 set_irq_chip_data(i, nmk_chip);
601 set_irq_type(i, IRQ_TYPE_EDGE_FALLING);
604 set_irq_chained_handler(nmk_chip->parent_irq, nmk_gpio_irq_handler);
605 set_irq_data(nmk_chip->parent_irq, nmk_chip);
607 if (nmk_chip->secondary_parent_irq >= 0) {
608 set_irq_chained_handler(nmk_chip->secondary_parent_irq,
609 nmk_gpio_secondary_irq_handler);
610 set_irq_data(nmk_chip->secondary_parent_irq, nmk_chip);
617 static int nmk_gpio_make_input(struct gpio_chip *chip, unsigned offset)
619 struct nmk_gpio_chip *nmk_chip =
620 container_of(chip, struct nmk_gpio_chip, chip);
622 writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC);
626 static int nmk_gpio_get_input(struct gpio_chip *chip, unsigned offset)
628 struct nmk_gpio_chip *nmk_chip =
629 container_of(chip, struct nmk_gpio_chip, chip);
630 u32 bit = 1 << offset;
632 return (readl(nmk_chip->addr + NMK_GPIO_DAT) & bit) != 0;
635 static void nmk_gpio_set_output(struct gpio_chip *chip, unsigned offset,
638 struct nmk_gpio_chip *nmk_chip =
639 container_of(chip, struct nmk_gpio_chip, chip);
641 __nmk_gpio_set_output(nmk_chip, offset, val);
644 static int nmk_gpio_make_output(struct gpio_chip *chip, unsigned offset,
647 struct nmk_gpio_chip *nmk_chip =
648 container_of(chip, struct nmk_gpio_chip, chip);
650 __nmk_gpio_make_output(nmk_chip, offset, val);
655 static int nmk_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
657 struct nmk_gpio_chip *nmk_chip =
658 container_of(chip, struct nmk_gpio_chip, chip);
660 return NOMADIK_GPIO_TO_IRQ(nmk_chip->chip.base) + offset;
663 #ifdef CONFIG_DEBUG_FS
665 #include <linux/seq_file.h>
667 static void nmk_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
671 unsigned gpio = chip->base;
673 struct nmk_gpio_chip *nmk_chip =
674 container_of(chip, struct nmk_gpio_chip, chip);
675 const char *modes[] = {
676 [NMK_GPIO_ALT_GPIO] = "gpio",
677 [NMK_GPIO_ALT_A] = "altA",
678 [NMK_GPIO_ALT_B] = "altB",
679 [NMK_GPIO_ALT_C] = "altC",
682 for (i = 0; i < chip->ngpio; i++, gpio++) {
683 const char *label = gpiochip_is_requested(chip, i);
690 is_out = readl(nmk_chip->addr + NMK_GPIO_DIR) & bit;
691 pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit);
692 mode = nmk_gpio_get_mode(gpio);
693 seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s %s",
695 is_out ? "out" : "in ",
697 ? (chip->get(chip, i) ? "hi" : "lo")
699 (mode < 0) ? "unknown" : modes[mode],
700 pull ? "pull" : "none");
703 int irq = gpio_to_irq(gpio);
704 struct irq_desc *desc = irq_to_desc(irq);
706 /* This races with request_irq(), set_irq_type(),
707 * and set_irq_wake() ... but those are "rare".
709 * More significantly, trigger type flags aren't
710 * currently maintained by genirq.
712 if (irq >= 0 && desc->action) {
715 switch (desc->status & IRQ_TYPE_SENSE_MASK) {
717 trigger = "(default)";
719 case IRQ_TYPE_EDGE_FALLING:
720 trigger = "edge-falling";
722 case IRQ_TYPE_EDGE_RISING:
723 trigger = "edge-rising";
725 case IRQ_TYPE_EDGE_BOTH:
726 trigger = "edge-both";
728 case IRQ_TYPE_LEVEL_HIGH:
729 trigger = "level-high";
731 case IRQ_TYPE_LEVEL_LOW:
732 trigger = "level-low";
735 trigger = "?trigger?";
739 seq_printf(s, " irq-%d %s%s",
741 (desc->status & IRQ_WAKEUP)
751 #define nmk_gpio_dbg_show NULL
754 /* This structure is replicated for each GPIO block allocated at probe time */
755 static struct gpio_chip nmk_gpio_template = {
756 .direction_input = nmk_gpio_make_input,
757 .get = nmk_gpio_get_input,
758 .direction_output = nmk_gpio_make_output,
759 .set = nmk_gpio_set_output,
760 .to_irq = nmk_gpio_to_irq,
761 .dbg_show = nmk_gpio_dbg_show,
765 static int __devinit nmk_gpio_probe(struct platform_device *dev)
767 struct nmk_gpio_platform_data *pdata = dev->dev.platform_data;
768 struct nmk_gpio_chip *nmk_chip;
769 struct gpio_chip *chip;
770 struct resource *res;
779 res = platform_get_resource(dev, IORESOURCE_MEM, 0);
785 irq = platform_get_irq(dev, 0);
791 secondary_irq = platform_get_irq(dev, 1);
792 if (secondary_irq >= 0 && !pdata->get_secondary_status) {
797 if (request_mem_region(res->start, resource_size(res),
798 dev_name(&dev->dev)) == NULL) {
803 clk = clk_get(&dev->dev, NULL);
811 nmk_chip = kzalloc(sizeof(*nmk_chip), GFP_KERNEL);
817 * The virt address in nmk_chip->addr is in the nomadik register space,
818 * so we can simply convert the resource address, without remapping
820 nmk_chip->bank = dev->id;
822 nmk_chip->addr = io_p2v(res->start);
823 nmk_chip->chip = nmk_gpio_template;
824 nmk_chip->parent_irq = irq;
825 nmk_chip->secondary_parent_irq = secondary_irq;
826 nmk_chip->get_secondary_status = pdata->get_secondary_status;
827 spin_lock_init(&nmk_chip->lock);
829 chip = &nmk_chip->chip;
830 chip->base = pdata->first_gpio;
831 chip->ngpio = pdata->num_gpio;
832 chip->label = pdata->name ?: dev_name(&dev->dev);
833 chip->dev = &dev->dev;
834 chip->owner = THIS_MODULE;
836 ret = gpiochip_add(&nmk_chip->chip);
840 platform_set_drvdata(dev, nmk_chip);
842 nmk_gpio_init_irq(nmk_chip);
844 dev_info(&dev->dev, "Bits %i-%i at address %p\n",
845 nmk_chip->chip.base, nmk_chip->chip.base+31, nmk_chip->addr);
854 release_mem_region(res->start, resource_size(res));
856 dev_err(&dev->dev, "Failure %i for GPIO %i-%i\n", ret,
857 pdata->first_gpio, pdata->first_gpio+31);
861 #ifdef CONFIG_NOMADIK_GPIO_PM
862 static int nmk_gpio_pm(struct platform_device *dev, bool suspend)
864 struct nmk_gpio_chip *nmk_chip = platform_get_drvdata(dev);
869 for (i = 0; i < ARRAY_SIZE(backup_regs); i++) {
871 nmk_chip->backup[i] = readl(nmk_chip->addr +
874 writel(nmk_chip->backup[i],
875 nmk_chip->addr + backup_regs[i]);
880 * Restore pull-up and pull-down on inputs and
883 dir = readl(nmk_chip->addr + NMK_GPIO_DIR);
884 dat = readl(nmk_chip->addr + NMK_GPIO_DAT);
886 writel((nmk_chip->pull & ~dir) |
888 nmk_chip->addr + NMK_GPIO_DATS);
890 writel((~nmk_chip->pull & ~dir) |
892 nmk_chip->addr + NMK_GPIO_DATC);
897 static int nmk_gpio_suspend(struct platform_device *dev, pm_message_t state)
899 return nmk_gpio_pm(dev, true);
902 static int nmk_gpio_resume(struct platform_device *dev)
904 return nmk_gpio_pm(dev, false);
907 #define nmk_gpio_suspend NULL
908 #define nmk_gpio_resume NULL
911 static struct platform_driver nmk_gpio_driver = {
913 .owner = THIS_MODULE,
916 .probe = nmk_gpio_probe,
917 .suspend = nmk_gpio_suspend,
918 .resume = nmk_gpio_resume,
921 static int __init nmk_gpio_init(void)
923 return platform_driver_register(&nmk_gpio_driver);
926 core_initcall(nmk_gpio_init);
928 MODULE_AUTHOR("Prafulla WADASKAR and Alessandro Rubini");
929 MODULE_DESCRIPTION("Nomadik GPIO Driver");
930 MODULE_LICENSE("GPL");