2 * linux/arch/arm/mach-sprd/gpio.c
4 * Generic SPRD GPIO handling
6 * Author: Yingchun Li(yingchun.li@spreadtrum.com)
7 * Created: March 10, 2010
8 * Copyright: Spreadtrum Inc.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
15 #include <asm/arch/gpio.h>
16 #include <asm/arch/gpio_phy.h>
17 #include <asm/arch/sprd_reg.h>
18 #include <asm/arch/gpio_reg_v0.h>
19 #include <asm/arch/asm_generic_gpio.h>
20 #include <asm/arch/chip_drv_common_io.h>
23 #define GPO_TRI 0xFFFF
27 #define GPO_DATA 0xFFFF
32 enum gpio_section_type gpio_type;
43 #define INVALID_REG (~(u32)0)
45 //static struct gpio_irq_map gpio_irq_table[NR_GPIO_IRQS];
48 static void __get_gpio_base_info (u32 gpio_id, struct gpio_info *info)
52 struct gpio_section *section_table;
54 section_table = gpio_get_section_table (&table_size);
55 BUG_ON((gpio_id >= GPIO_MAX_PIN_NUM) || (table_size <= 0));
58 info->base_addr = __get_base_addr (gpio_id);
59 info->bit_num = __get_bit_num (gpio_id);
60 info->die = __get_gpio_die(gpio_id);
62 for (i = 0; i < table_size; i++) {
63 if (section_table[i].page_base == info->base_addr) {
64 if (section_table[i].page_size > info->bit_num) {
65 info->gpio_type = section_table[i].section_type;
72 info->gpio_type = GPIO_SECTION_INVALID;
79 static void __gpio_set_dir (struct gpio_info * info, int dir)
85 reg_addr = info->base_addr;
87 switch (info->gpio_type) {
88 case GPIO_SECTION_GPI:
90 WARN(1, "cannot set dir output with GPI");
94 case GPIO_SECTION_GPO:
96 WARN(1, "cannot set dir input with GPO");
100 case GPIO_SECTION_GPIO:
101 reg_addr += GPIO_DIR;
103 case GPIO_SECTION_INVALID:
105 WARN(1, " the GPIO_ID is Invalid in this chip");
109 //local_irq_save(flags);
110 value = gpio_reg_get(reg_addr, info->die);
113 value |= 1 << info->bit_num;
115 value &= ~(1 << info->bit_num);
116 gpio_reg_set(reg_addr, info->die, value);
118 //local_irq_restore(flags);
122 get data register's offset
124 static u32 __gpio_get_data_reg_offs (struct gpio_info *info)
128 switch (info->gpio_type) {
129 case GPIO_SECTION_GPI:
130 offset_addr = GPI_DATA;
132 case GPIO_SECTION_GPO:
133 offset_addr = GPO_DATA;
135 case GPIO_SECTION_GPIO:
136 offset_addr = GPIO_DATA;
138 case GPIO_SECTION_INVALID:
140 pr_err("the GPIO_ID is Invalid in this chip");
148 static int __gpio_get_pin_data (struct gpio_info *info)
153 reg_addr = info->base_addr;
155 offset_addr = __gpio_get_data_reg_offs (info);
157 if (offset_addr != INVALID_REG) {
158 reg_addr += offset_addr;
159 return ((gpio_reg_get(reg_addr, info->die) & (1<<info->bit_num))>>info->bit_num);
164 static u32 __gpio_get_data_mask_reg_offs (struct gpio_info *info)
168 switch (info->gpio_type) {
169 case GPIO_SECTION_GPI:
170 offset_addr = GPI_DMSK;
172 case GPIO_SECTION_GPO:
173 offset_addr = GPO_TRI;
175 case GPIO_SECTION_GPIO:
176 offset_addr = GPIO_DMSK;
178 case GPIO_SECTION_INVALID:
180 pr_err ("the GPIO_ID is Invalid in this chip");
189 if the data register can be access, return ture, else return false;
191 static int __gpio_get_data_mask (struct gpio_info *info)
197 reg_addr = info->base_addr;
199 offset_addr = __gpio_get_data_mask_reg_offs(info);
200 if (offset_addr != INVALID_REG) {
201 reg_addr += offset_addr;
203 GPIO_DBG("gpio_addr %x data mask :%x\r\n", info->base_addr,
204 gpio_reg_get(reg_addr, info->die));
206 value = gpio_reg_get(reg_addr, info->die);
207 return ( value & (1<< info->bit_num)) ? true : false;
213 static int __gpio_get_dir (struct gpio_info *info)
218 reg_addr = info->base_addr;
220 switch (info->gpio_type) {
221 case GPIO_SECTION_GPI:
224 case GPIO_SECTION_GPO:
227 case GPIO_SECTION_GPIO:
228 reg_addr += GPIO_DIR;
231 case GPIO_SECTION_INVALID:
233 pr_warning("[GPIO_DRV]the GPIO_ID is Invalid in this chip");
238 value = gpio_reg_get(reg_addr, info->die) & (1<< info->bit_num);
239 return value ? true: false;
242 static void __gpio_set_pin_data (struct gpio_info *info ,int b_on)
249 reg_addr = info->base_addr;
251 offset_addr = __gpio_get_data_reg_offs (info);
252 if (offset_addr == INVALID_REG)
255 reg_addr += offset_addr;
257 //local_irq_save(flags);
259 value = gpio_reg_get(reg_addr, info->die);
261 value |= 1 << info->bit_num;
263 value &= ~(1 << info->bit_num);
264 gpio_reg_set(reg_addr, info->die, value);
265 //local_irq_restore(flags);
269 set data mask, the gpio data register can be access
271 static void __gpio_set_data_mask (struct gpio_info *info, int b_on)
278 reg_addr = info->base_addr;
279 offset_addr = __gpio_get_data_mask_reg_offs(info);
280 if (offset_addr != INVALID_REG) {
281 reg_addr += offset_addr;
283 //local_irq_save(flags);
284 value = gpio_reg_get(reg_addr, info->die);
286 value |= 1 << info->bit_num;
288 value &= ~(1 << info->bit_num);
289 gpio_reg_set(reg_addr, info->die, value);
290 //local_irq_restore(flags);
292 GPIO_DBG("After setting gpio_addr %x data mask :%x\r\n", reg_addr,
293 gpio_reg_get(reg_addr, info->die));
299 int sprd_gpio_direction_output(struct gpio_chip *chip,
300 unsigned offset, int value)
302 unsigned gpio_id = offset;
303 struct gpio_info gpio_info;
305 __get_gpio_base_info (gpio_id, &gpio_info);
306 __gpio_set_dir(&gpio_info, 1);
307 __gpio_set_pin_data(&gpio_info, value);
311 int sprd_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
313 unsigned gpio_id = offset;
314 struct gpio_info gpio_info;
316 __get_gpio_base_info (gpio_id, &gpio_info);
317 __gpio_set_dir(&gpio_info, 0);
324 int sprd_gpio_get(struct gpio_chip *chip, unsigned offset)
326 unsigned gpio_id = offset;
327 struct gpio_info gpio_info;
329 __get_gpio_base_info (gpio_id, &gpio_info);
331 if (!__gpio_get_data_mask (&gpio_info)) {
332 WARN(1, "GPIO_%d data mask hasn't been opened!\n", gpio_id);
335 if (__gpio_get_dir (&gpio_info))
337 WARN(1, "[GPIO_DRV]GPIO_GetValue: GPIO_%d should be input port!\n", gpio_id);
340 return __gpio_get_pin_data (&gpio_info);
346 * Set output GPIO level
348 void sprd_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
350 struct gpio_info gpio_info;
351 u32 gpio_id = offset;
353 BUG_ON (gpio_id >= GPIO_MAX_PIN_NUM);
355 __get_gpio_base_info (gpio_id, &gpio_info);
358 if (!__gpio_get_data_mask (&gpio_info))
360 WARN(1, "GPIO_%d data mask no opened!", gpio_id);
364 if (!__gpio_get_dir (&gpio_info)) {
365 WARN(1, "GPIO_%d dir wrong!can't set input value", gpio_id);
369 __gpio_set_pin_data (&gpio_info, value);
371 GPIO_DBG("gpio_%d setting :%x \n", gpio_id, value);
374 int sprd_gpio_request(struct gpio_chip *chip, unsigned offset)
376 unsigned gpio_id = offset;
377 struct gpio_info gpio_info;
379 GPIO_DBG("request gpio_%d\r\n", gpio_id);
380 __get_gpio_base_info (gpio_id, &gpio_info);
382 GPIO_DBG("gpio info, pin is :%d, base addr :%x, bit num :%d, type :%d\r\n", gpio_id,
383 gpio_info.base_addr, gpio_info.bit_num, gpio_info.gpio_type);
384 GPIO_DBG("ture is %d, false is %d\n", true, false);
385 __gpio_set_data_mask (&gpio_info, true);
390 void sprd_gpio_free(struct gpio_chip *chip, unsigned offset)
392 unsigned gpio_id = offset;
393 struct gpio_info gpio_info;
395 if (gpio_id > GPIO_MAX_PIN_NUM) {
396 WARN(1, KERN_WARNING"gpio number is too larger:%d\r\n", gpio_id);
400 __get_gpio_base_info (gpio_id, &gpio_info);
401 __gpio_set_data_mask (&gpio_info, false);
407 static int sprd_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
411 for (i = 0; i < NR_GPIO_IRQS; i++) {
412 if (gpio_irq_table[i].gpio_id == offset)
416 if (i >= NR_GPIO_IRQS)
418 return gpio_irq_table[i].irq_num;
421 int irq_to_gpio(unsigned long irq)
425 for (i = 0; i < NR_GPIO_IRQS; i++) {
426 if (gpio_irq_table[i].irq_num == irq)
430 if (i >= NR_GPIO_IRQS)
432 return gpio_irq_table[i].gpio_id;
434 EXPORT_SYMBOL(irq_to_gpio);
436 static struct gpio_chip sprd_gpio_chip = {
437 .label = "sc8800s-gpio",
438 .direction_input = sprd_gpio_direction_input,
439 .direction_output = sprd_gpio_direction_output,
440 .get = sprd_gpio_get,
441 .set = sprd_gpio_set,
442 .request = sprd_gpio_request,
443 .free = sprd_gpio_free,
444 .to_irq = sprd_gpio_to_irq,
446 .ngpio = GPIO_MAX_PIN_NUM,
449 static u32 __gpio_get_int_mask_addr (struct gpio_info *info)
453 switch (info->gpio_type) {
454 case GPIO_SECTION_GPI:
455 offset_addr = GPI_IE;
457 case GPIO_SECTION_GPO:
458 WARN(1, "this opretion can not belong to GPO");
461 case GPIO_SECTION_GPIO:
462 offset_addr = GPIO_IE;
465 case GPIO_SECTION_INVALID:
467 WARN (1, "the GPIO_ID is Invalid in this chip");
476 static void __gpio_enable_irq (struct gpio_info *info)
483 reg_addr = info->base_addr;
484 offset_addr = __gpio_get_int_mask_addr (info);
485 if (offset_addr != INVALID_REG) {
486 reg_addr += offset_addr;
487 local_irq_save(flags);
488 value = gpio_reg_get(reg_addr, info->die);
489 value |= 1 << info->bit_num;
490 gpio_reg_set(reg_addr, info->die, value);
491 local_irq_restore(flags);
497 static void __gpio_disable_irq (struct gpio_info *info)
504 reg_addr = info->base_addr;
505 offset_addr = __gpio_get_int_mask_addr (info);
507 if (offset_addr != INVALID_REG) {
508 reg_addr += offset_addr;
509 local_irq_save(flags);
510 value = gpio_reg_get(reg_addr, info->die);
511 value &= ~ (1 << info->bit_num);
512 gpio_reg_set(reg_addr, info->die, value);
513 local_irq_restore(flags);
520 static void __gpio_clear_irq_status (struct gpio_info *info)
526 reg_addr = info->base_addr;
528 switch (info->gpio_type) {
529 case GPIO_SECTION_GPI:
532 case GPIO_SECTION_GPO:
533 GPIO_DBG("this opretion can not belong to GPO");
535 case GPIO_SECTION_GPIO:
538 case GPIO_SECTION_INVALID:
540 GPIO_DBG("the GPIO_ID is Invalid in this chip");
545 local_irq_save(flags);
546 value = gpio_reg_get(reg_addr, info->die);
547 value &= ~ (1 << info->bit_num);
548 value |= 1 << info->bit_num;
549 gpio_reg_set(reg_addr, info->die, value);
552 static int __gpio_get_int_status (struct gpio_info *info)
557 reg_addr = info->base_addr;
559 switch (info->gpio_type) {
560 case GPIO_SECTION_GPI:
563 case GPIO_SECTION_GPO:
564 WARN(1, "The corresponding reg of this GPIO_ID is a GPO! No Intr!");
567 case GPIO_SECTION_GPIO:
568 reg_addr += GPIO_MIS;
570 case GPIO_SECTION_INVALID:
572 WARN(1, "the GPIO_ID is Invalid in this chip");
576 value = gpio_reg_get(reg_addr, info->die);
578 return ( value & (1 << info->bit_num)) ? true : false;
581 static void __gpio_set_int_type (struct gpio_info *info, int type)
583 if (info->gpio_type == GPIO_SECTION_GPI) {
585 case IRQ_TYPE_LEVEL_HIGH: // detect high level.
586 gpio_reg_or( (info->base_addr + GPI_IEV), info->die,
587 (0x1 << info->bit_num));
590 case IRQ_TYPE_LEVEL_LOW: // detect low level.
591 gpio_reg_and( (info->base_addr + GPI_IEV), info->die,
592 ~ (0x1 << info->bit_num));
595 case IRQ_TYPE_EDGE_BOTH: // detect the rising edges and falling edges.
596 case IRQ_TYPE_EDGE_RISING: // detect the rising edges.
597 case IRQ_TYPE_EDGE_FALLING:
599 WARN(1, "The Irq type is invalid for GPI. \n");
602 } else if (info->gpio_type == GPIO_SECTION_GPIO) {
604 case IRQ_TYPE_LEVEL_HIGH: // detect high level.
605 gpio_reg_or( (info->base_addr + GPIO_IS), info->die, (0x1 << info->bit_num));
606 gpio_reg_and(info->base_addr + GPIO_IBE, info->die, ~ (0x1 << info->bit_num));
607 gpio_reg_or( (info->base_addr + GPIO_IEV), info->die, (0x1 << info->bit_num));
610 case IRQ_TYPE_LEVEL_LOW: // detect low level.
611 gpio_reg_or( (info->base_addr + GPIO_IS), info->die, (0x1 << info->bit_num));
612 gpio_reg_and(info->base_addr + GPIO_IBE, info->die, ~ (0x1 << info->bit_num));
613 gpio_reg_and( (info->base_addr + GPIO_IEV), info->die, ~(0x1 << info->bit_num));
616 case IRQ_TYPE_EDGE_BOTH: // detect the rising edges and falling edges.
617 gpio_reg_and( (info->base_addr + GPIO_IS), info->die, ~(0x1 << info->bit_num));
618 gpio_reg_or(info->base_addr + GPIO_IBE, info->die, (0x1 << info->bit_num));
619 gpio_reg_and( (info->base_addr + GPIO_IEV), info->die, ~(0x1 << info->bit_num));
622 case IRQ_TYPE_EDGE_RISING: // detect the rising edges.
623 gpio_reg_and( (info->base_addr + GPIO_IS), info->die, ~(0x1 << info->bit_num));
624 gpio_reg_and(info->base_addr + GPIO_IBE, info->die, ~ (0x1 << info->bit_num));
625 gpio_reg_or( (info->base_addr + GPIO_IEV), info->die, (0x1 << info->bit_num));
628 case IRQ_TYPE_EDGE_FALLING:
629 gpio_reg_and( (info->base_addr + GPIO_IS), info->die, ~(0x1 << info->bit_num));
630 gpio_reg_and(info->base_addr + GPIO_IBE, info->die, ~ (0x1 << info->bit_num));
631 gpio_reg_and( (info->base_addr + GPIO_IEV), info->die, ~(0x1 << info->bit_num));
634 WARN(1, "fault irq type \r\n");
638 WARN(1, "the gpio type is Invalid for irq\r\n");
644 The GPI module can do handware debouce, the max period is 255ms,
646 if your application need debounce time larger than that, please use software
649 void gpio_set_hw_debounce (unsigned int gpio, u8 period)
653 struct gpio_info gpio_info;
656 __get_gpio_base_info (gpio, &gpio_info);
657 if (gpio_info.gpio_type != GPIO_SECTION_GPI) {
658 WARN(1, "GPIO_%d is not in GPI\r\n", gpio);
662 reg_addr = gpio_info.base_addr;
663 reg_addr += (GPI_0CTRL+ (gpio_info.bit_num << 2));
665 local_irq_save(flags);
668 GPIO_REG_OR (reg_addr, GPI_DEBOUNCE_BIT);
669 GPIO_REG_SET (reg_addr, (GPIO_REG32 (reg_addr) & 0xFF00) +debounce_period);
671 gpio_reg_or(reg_addr, gpio_info.die, GPI_DEBOUNCE_BIT);
672 value = (gpio_reg_get(reg_addr, gpio_info.die) & 0xFF00) + period;
673 gpio_reg_set(reg_addr, gpio_info.die, value);
674 } else {// not recommend
675 //GPIO_REG_AND (reg_addr, ~GPI_DEBOUNCE_BIT); //bypass mode
676 gpio_reg_and(reg_addr, gpio_info.die, ~GPI_DEBOUNCE_BIT);
678 local_irq_restore(flags);
681 EXPORT_SYMBOL(gpio_set_hw_debounce);
684 generate the trig_start pulse for GPI interrupt;
686 static void __gpio_trig_detect (struct gpio_info *info)
692 reg_addr = info->base_addr;
694 switch (info->gpio_type) {
695 case GPIO_SECTION_GPI:
696 reg_addr += GPI_TRIG;
699 case GPIO_SECTION_GPO:
700 case GPIO_SECTION_GPIO:
701 GPIO_DBG("[GPIO_DRV]this opretion can not belong to GPO/GPIO");
705 case GPIO_SECTION_INVALID:
707 GPIO_DBG ("[GPIO_DRV]the GPIO_ID is Invalid in this chip");
712 local_irq_save(flags);
714 value = gpio_reg_get(reg_addr, info->die) & ~(1 << info->bit_num);
715 value |= 1 << info->bit_num;
716 gpio_reg_set(reg_addr, info->die, value);
718 local_irq_restore(flags);
719 //GPIO_REG_SET (reg_addr, ( (GPIO_REG32 (reg_addr) & ~ (1<<pGpio_info->bit_num)) | (value<<pGpio_info->bit_num)));
724 void gpio_enable_gpi_interupt (struct gpio_info *info)
727 switch (info->gpio_type) {
728 case GPIO_SECTION_GPI:
729 __gpio_enable_irq (info);
730 __gpio_trig_detect (info);
732 case GPIO_SECTION_GPO:
733 case GPIO_SECTION_GPIO:
742 //EXPORT_SYMBOL(gpio_enable_gpi_interupt);
744 static void sprd_ack_gpio_irq(unsigned int irq)
747 struct gpio_irq_map *map= get_irq_chip_data(irq);
748 struct gpio_info gpio_info;
751 if (gpio >= GPIO_MAX_PIN_NUM ) {
752 pr_warning(" [%s] error gpio %d\n", __FUNCTION__, gpio);
755 GPIO_DBG("ack irq gpio %d irq %d", gpio, irq);
757 __get_gpio_base_info (gpio, &gpio_info);
758 __gpio_clear_irq_status(&gpio_info);
761 static void sprd_mask_gpio_irq(unsigned int irq)
764 struct gpio_irq_map *map= get_irq_chip_data(irq);
765 struct gpio_info gpio_info;
768 if (gpio >= GPIO_MAX_PIN_NUM ) {
769 pr_warning(" [%s] error gpio %d\n", __func__, gpio);
773 GPIO_DBG("mask gpio %d irq %d", gpio, irq);
774 __get_gpio_base_info (gpio, &gpio_info);
775 __gpio_disable_irq (&gpio_info);
779 static void sprd_unmask_gpio_irq(unsigned int irq)
782 struct gpio_info gpio_info;
783 struct gpio_irq_map *map= get_irq_chip_data(irq);
786 if (gpio >= GPIO_MAX_PIN_NUM ) {
787 pr_warning(" [%s] error gpio %d\n", __FUNCTION__, gpio);
791 GPIO_DBG("unmask gpio %d irq %d", gpio, irq);
792 __get_gpio_base_info (gpio, &gpio_info);
793 __gpio_enable_irq (&gpio_info);
795 if(gpio_info.gpio_type == GPIO_SECTION_GPI)
796 __gpio_trig_detect (&gpio_info);
800 static int sprd_gpio_irq_type(unsigned int irq, unsigned int type)
803 struct gpio_irq_map *map= get_irq_chip_data(irq);
804 struct gpio_info gpio_info;
807 if (gpio >= GPIO_MAX_PIN_NUM ) {
808 pr_warning(" [%s] error gpio %d\n", __FUNCTION__, gpio);
812 __get_gpio_base_info (gpio, &gpio_info);
814 __gpio_set_int_type(&gpio_info, type);
816 if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
817 __set_irq_handler_unlocked(irq, handle_level_irq);
818 else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
819 __set_irq_handler_unlocked(irq, handle_edge_irq);
823 static void sprd_disable_gpio_irq(unsigned int irq)
825 sprd_mask_gpio_irq(irq);
827 static struct irq_chip sprd_muxed_gpio_chip = {
829 .ack = sprd_ack_gpio_irq,
830 .mask = sprd_mask_gpio_irq,
831 .unmask = sprd_unmask_gpio_irq,
832 .set_type = sprd_gpio_irq_type,
833 .disable = sprd_disable_gpio_irq,
836 static int gpio_get_int_status(unsigned int gpio)
838 struct gpio_info gpio_info;
840 __get_gpio_base_info (gpio, &gpio_info);
841 return __gpio_get_int_status (&gpio_info);
846 static void sprd_gpio_demux_handler(unsigned int irq, struct irq_desc *desc)
850 for (i = 0; i < NR_GPIO_IRQS; i++) {
851 if (gpio_irq_table[i].gpio_id == GPIO_INVALID_ID) {
854 if (gpio_get_int_status(gpio_irq_table[i].gpio_id)) {
855 generic_handle_irq(gpio_irq_table[i].irq_num);
859 static void sprd_gpio_irq_init(void)
864 for(i = 0; i < NR_GPIO_IRQS; i++) {
865 gpio_irq_table[i].gpio_id= GPIO_INVALID_ID;
867 for (irq = GPIO_IRQ_START; irq < (GPIO_IRQ_START + NR_GPIO_IRQS); irq++) {
868 set_irq_chip(irq, &sprd_muxed_gpio_chip);
869 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
872 set_irq_chained_handler(IRQ_GPIO_INT, sprd_gpio_demux_handler);
873 set_irq_chained_handler(IRQ_ANA_GPIO_INT, sprd_gpio_demux_handler);
877 allocate an irq for gpio
879 __must_check int sprd_alloc_gpio_irq(unsigned gpio)
883 struct gpio_info gpio_info;
886 __get_gpio_base_info (gpio, &gpio_info);
888 // find a free record
889 for (i = 0; i< NR_GPIO_IRQS; i++) {
890 if (gpio_irq_table[i].gpio_id == gpio) {
891 pr_warning("irq for GPIO_%d has been alloc !\n", gpio);
896 for(i = 0; i < NR_GPIO_IRQS; i++) {
897 if (gpio_irq_table[i].gpio_id == GPIO_INVALID_ID)
901 if (i >= NR_GPIO_IRQS) {
902 // No free item in the table.
905 local_irq_save(flags);
906 irq = GPIO_IRQ_START + i;
907 gpio_irq_table[i].gpio_id = gpio;
908 gpio_irq_table[i].irq_num = irq;
910 set_irq_chip_data(irq, &gpio_irq_table[i]);
911 local_irq_restore(flags);
912 __gpio_clear_irq_status(&gpio_info);
913 if (gpio_info.gpio_type == GPIO_SECTION_GPI)
914 __gpio_trig_detect (&gpio_info);
919 EXPORT_SYMBOL(sprd_alloc_gpio_irq);
921 void sprd_free_gpio_irq(int irq)
926 local_irq_save(flags);
927 for (i = 0; i < NR_GPIO_IRQS; i++) {
928 if (gpio_irq_table[i].irq_num == irq) {
929 set_irq_chip_data(irq, NULL);
930 gpio_irq_table[i].gpio_id = GPIO_INVALID_ID;
934 local_irq_restore(flags);
936 EXPORT_SYMBOL(sprd_free_gpio_irq);
938 __init void sprd_gpio_init(void)
940 //enable gpio bank 0~10, that is, all 176 gpio
941 //__raw_writel(0x7fff, GR_GEN2);
942 //CHIP_REG_OR ( (GR_GEN0), (GEN0_GPIO_EN | GEN0_GPIO_RTC_EN));
943 __raw_bits_or (GEN0_GPIO_EN | GEN0_GPIO_RTC_EN, GR_GEN0);
944 ANA_REG_OR (ANA_AGEN,AGEN_RTC_GPIO_EN);
946 ANA_REG_OR (ANA_AGEN,AGEN_GPIO_EN);
948 gpiochip_add(&sprd_gpio_chip);
950 sprd_gpio_irq_init();
953 void sprd_gpio_init(void)
955 #if defined(CONFIG_SPX15)
956 REG32(REG_AON_APB_APB_EB0) |= BIT_AON_GPIO_EB;
958 REG32(REG_AON_APB_APB_EB0) |= BIT_GPIO_EB;
959 #if !(defined(CONFIG_ADIE_SC2723S)||defined(CONFIG_ADIE_SC2723))
960 ANA_REG_OR(ANA_REG_GLB_ARM_MODULE_EN, BIT_ANA_GPIO_EN);