diff options
| author | Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com> | 2015-06-04 08:10:32 -0400 |
|---|---|---|
| committer | Linus Walleij <linus.walleij@linaro.org> | 2015-06-10 03:44:17 -0400 |
| commit | bdf7a4ae371894b4dc10b5820006b0a82d484929 (patch) | |
| tree | 610845284a8bf240a7a8b008cdc875d25abe7a43 | |
| parent | d342571efea8135dcf0a96dcb9e54759adefdb27 (diff) | |
gpio: Added support to Zynq Ultrascale+ MPSoC
Added support to Zynq Ultrascale+ MPSoC on the existing zynq
gpio driver.
Signed-off-by: Anurag Kumar Vulisha <anuragku@xilinx.com>
Acked-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
| -rw-r--r-- | Documentation/devicetree/bindings/gpio/gpio-zynq.txt | 2 | ||||
| -rw-r--r-- | drivers/gpio/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/gpio/gpio-zynq.c | 191 |
3 files changed, 127 insertions, 68 deletions
diff --git a/Documentation/devicetree/bindings/gpio/gpio-zynq.txt b/Documentation/devicetree/bindings/gpio/gpio-zynq.txt index 986371a4be2c..db4c6a663c03 100644 --- a/Documentation/devicetree/bindings/gpio/gpio-zynq.txt +++ b/Documentation/devicetree/bindings/gpio/gpio-zynq.txt | |||
| @@ -6,7 +6,7 @@ Required properties: | |||
| 6 | - First cell is the GPIO line number | 6 | - First cell is the GPIO line number |
| 7 | - Second cell is used to specify optional | 7 | - Second cell is used to specify optional |
| 8 | parameters (unused) | 8 | parameters (unused) |
| 9 | - compatible : Should be "xlnx,zynq-gpio-1.0" | 9 | - compatible : Should be "xlnx,zynq-gpio-1.0" or "xlnx,zynqmp-gpio-1.0" |
| 10 | - clocks : Clock specifier (see clock bindings for details) | 10 | - clocks : Clock specifier (see clock bindings for details) |
| 11 | - gpio-controller : Marks the device node as a GPIO controller. | 11 | - gpio-controller : Marks the device node as a GPIO controller. |
| 12 | - interrupts : Interrupt specifier (see interrupt bindings for | 12 | - interrupts : Interrupt specifier (see interrupt bindings for |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index ab9084648509..8f1fe739c985 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
| @@ -540,7 +540,7 @@ config GPIO_ZEVIO | |||
| 540 | 540 | ||
| 541 | config GPIO_ZYNQ | 541 | config GPIO_ZYNQ |
| 542 | tristate "Xilinx Zynq GPIO support" | 542 | tristate "Xilinx Zynq GPIO support" |
| 543 | depends on ARCH_ZYNQ | 543 | depends on ARCH_ZYNQ || ARCH_ZYNQMP |
| 544 | select GPIOLIB_IRQCHIP | 544 | select GPIOLIB_IRQCHIP |
| 545 | help | 545 | help |
| 546 | Say yes here to support Xilinx Zynq GPIO controller. | 546 | Say yes here to support Xilinx Zynq GPIO controller. |
diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c index 0d9663f53834..2e87c4b8da26 100644 --- a/drivers/gpio/gpio-zynq.c +++ b/drivers/gpio/gpio-zynq.c | |||
| @@ -18,34 +18,47 @@ | |||
| 18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
| 19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
| 20 | #include <linux/pm_runtime.h> | 20 | #include <linux/pm_runtime.h> |
| 21 | #include <linux/of.h> | ||
| 21 | 22 | ||
| 22 | #define DRIVER_NAME "zynq-gpio" | 23 | #define DRIVER_NAME "zynq-gpio" |
| 23 | 24 | ||
| 24 | /* Maximum banks */ | 25 | /* Maximum banks */ |
| 25 | #define ZYNQ_GPIO_MAX_BANK 4 | 26 | #define ZYNQ_GPIO_MAX_BANK 4 |
| 27 | #define ZYNQMP_GPIO_MAX_BANK 6 | ||
| 26 | 28 | ||
| 27 | #define ZYNQ_GPIO_BANK0_NGPIO 32 | 29 | #define ZYNQ_GPIO_BANK0_NGPIO 32 |
| 28 | #define ZYNQ_GPIO_BANK1_NGPIO 22 | 30 | #define ZYNQ_GPIO_BANK1_NGPIO 22 |
| 29 | #define ZYNQ_GPIO_BANK2_NGPIO 32 | 31 | #define ZYNQ_GPIO_BANK2_NGPIO 32 |
| 30 | #define ZYNQ_GPIO_BANK3_NGPIO 32 | 32 | #define ZYNQ_GPIO_BANK3_NGPIO 32 |
| 31 | 33 | ||
| 32 | #define ZYNQ_GPIO_NR_GPIOS (ZYNQ_GPIO_BANK0_NGPIO + \ | 34 | #define ZYNQMP_GPIO_BANK0_NGPIO 26 |
| 33 | ZYNQ_GPIO_BANK1_NGPIO + \ | 35 | #define ZYNQMP_GPIO_BANK1_NGPIO 26 |
| 34 | ZYNQ_GPIO_BANK2_NGPIO + \ | 36 | #define ZYNQMP_GPIO_BANK2_NGPIO 26 |
| 35 | ZYNQ_GPIO_BANK3_NGPIO) | 37 | #define ZYNQMP_GPIO_BANK3_NGPIO 32 |
| 36 | 38 | #define ZYNQMP_GPIO_BANK4_NGPIO 32 | |
| 37 | #define ZYNQ_GPIO_BANK0_PIN_MIN 0 | 39 | #define ZYNQMP_GPIO_BANK5_NGPIO 32 |
| 38 | #define ZYNQ_GPIO_BANK0_PIN_MAX (ZYNQ_GPIO_BANK0_PIN_MIN + \ | 40 | |
| 39 | ZYNQ_GPIO_BANK0_NGPIO - 1) | 41 | #define ZYNQ_GPIO_NR_GPIOS 118 |
| 40 | #define ZYNQ_GPIO_BANK1_PIN_MIN (ZYNQ_GPIO_BANK0_PIN_MAX + 1) | 42 | #define ZYNQMP_GPIO_NR_GPIOS 174 |
| 41 | #define ZYNQ_GPIO_BANK1_PIN_MAX (ZYNQ_GPIO_BANK1_PIN_MIN + \ | 43 | |
| 42 | ZYNQ_GPIO_BANK1_NGPIO - 1) | 44 | #define ZYNQ_GPIO_BANK0_PIN_MIN(str) 0 |
| 43 | #define ZYNQ_GPIO_BANK2_PIN_MIN (ZYNQ_GPIO_BANK1_PIN_MAX + 1) | 45 | #define ZYNQ_GPIO_BANK0_PIN_MAX(str) (ZYNQ_GPIO_BANK0_PIN_MIN(str) + \ |
| 44 | #define ZYNQ_GPIO_BANK2_PIN_MAX (ZYNQ_GPIO_BANK2_PIN_MIN + \ | 46 | ZYNQ##str##_GPIO_BANK0_NGPIO - 1) |
| 45 | ZYNQ_GPIO_BANK2_NGPIO - 1) | 47 | #define ZYNQ_GPIO_BANK1_PIN_MIN(str) (ZYNQ_GPIO_BANK0_PIN_MAX(str) + 1) |
| 46 | #define ZYNQ_GPIO_BANK3_PIN_MIN (ZYNQ_GPIO_BANK2_PIN_MAX + 1) | 48 | #define ZYNQ_GPIO_BANK1_PIN_MAX(str) (ZYNQ_GPIO_BANK1_PIN_MIN(str) + \ |
| 47 | #define ZYNQ_GPIO_BANK3_PIN_MAX (ZYNQ_GPIO_BANK3_PIN_MIN + \ | 49 | ZYNQ##str##_GPIO_BANK1_NGPIO - 1) |
| 48 | ZYNQ_GPIO_BANK3_NGPIO - 1) | 50 | #define ZYNQ_GPIO_BANK2_PIN_MIN(str) (ZYNQ_GPIO_BANK1_PIN_MAX(str) + 1) |
| 51 | #define ZYNQ_GPIO_BANK2_PIN_MAX(str) (ZYNQ_GPIO_BANK2_PIN_MIN(str) + \ | ||
| 52 | ZYNQ##str##_GPIO_BANK2_NGPIO - 1) | ||
| 53 | #define ZYNQ_GPIO_BANK3_PIN_MIN(str) (ZYNQ_GPIO_BANK2_PIN_MAX(str) + 1) | ||
| 54 | #define ZYNQ_GPIO_BANK3_PIN_MAX(str) (ZYNQ_GPIO_BANK3_PIN_MIN(str) + \ | ||
| 55 | ZYNQ##str##_GPIO_BANK3_NGPIO - 1) | ||
| 56 | #define ZYNQ_GPIO_BANK4_PIN_MIN(str) (ZYNQ_GPIO_BANK3_PIN_MAX(str) + 1) | ||
| 57 | #define ZYNQ_GPIO_BANK4_PIN_MAX(str) (ZYNQ_GPIO_BANK4_PIN_MIN(str) + \ | ||
| 58 | ZYNQ##str##_GPIO_BANK4_NGPIO - 1) | ||
| 59 | #define ZYNQ_GPIO_BANK5_PIN_MIN(str) (ZYNQ_GPIO_BANK4_PIN_MAX(str) + 1) | ||
| 60 | #define ZYNQ_GPIO_BANK5_PIN_MAX(str) (ZYNQ_GPIO_BANK5_PIN_MIN(str) + \ | ||
| 61 | ZYNQ##str##_GPIO_BANK5_NGPIO - 1) | ||
| 49 | 62 | ||
| 50 | 63 | ||
| 51 | /* Register offsets for the GPIO device */ | 64 | /* Register offsets for the GPIO device */ |
| @@ -89,12 +102,30 @@ | |||
| 89 | * @base_addr: base address of the GPIO device | 102 | * @base_addr: base address of the GPIO device |
| 90 | * @clk: clock resource for this controller | 103 | * @clk: clock resource for this controller |
| 91 | * @irq: interrupt for the GPIO device | 104 | * @irq: interrupt for the GPIO device |
| 105 | * @p_data: pointer to platform data | ||
| 92 | */ | 106 | */ |
| 93 | struct zynq_gpio { | 107 | struct zynq_gpio { |
| 94 | struct gpio_chip chip; | 108 | struct gpio_chip chip; |
| 95 | void __iomem *base_addr; | 109 | void __iomem *base_addr; |
| 96 | struct clk *clk; | 110 | struct clk *clk; |
| 97 | int irq; | 111 | int irq; |
| 112 | const struct zynq_platform_data *p_data; | ||
| 113 | }; | ||
| 114 | |||
| 115 | /** | ||
| 116 | * struct zynq_platform_data - zynq gpio platform data structure | ||
| 117 | * @label: string to store in gpio->label | ||
| 118 | * @ngpio: max number of gpio pins | ||
| 119 | * @max_bank: maximum number of gpio banks | ||
| 120 | * @bank_min: this array represents bank's min pin | ||
| 121 | * @bank_max: this array represents bank's max pin | ||
| 122 | */ | ||
| 123 | struct zynq_platform_data { | ||
| 124 | const char *label; | ||
| 125 | u16 ngpio; | ||
| 126 | int max_bank; | ||
| 127 | int bank_min[ZYNQMP_GPIO_MAX_BANK]; | ||
| 128 | int bank_max[ZYNQMP_GPIO_MAX_BANK]; | ||
| 98 | }; | 129 | }; |
| 99 | 130 | ||
| 100 | static struct irq_chip zynq_gpio_level_irqchip; | 131 | static struct irq_chip zynq_gpio_level_irqchip; |
| @@ -112,39 +143,26 @@ static struct irq_chip zynq_gpio_edge_irqchip; | |||
| 112 | */ | 143 | */ |
| 113 | static inline void zynq_gpio_get_bank_pin(unsigned int pin_num, | 144 | static inline void zynq_gpio_get_bank_pin(unsigned int pin_num, |
| 114 | unsigned int *bank_num, | 145 | unsigned int *bank_num, |
| 115 | unsigned int *bank_pin_num) | 146 | unsigned int *bank_pin_num, |
| 147 | struct zynq_gpio *gpio) | ||
| 116 | { | 148 | { |
| 117 | switch (pin_num) { | 149 | int bank; |
| 118 | case ZYNQ_GPIO_BANK0_PIN_MIN ... ZYNQ_GPIO_BANK0_PIN_MAX: | 150 | |
| 119 | *bank_num = 0; | 151 | for (bank = 0; bank < gpio->p_data->max_bank; bank++) { |
| 120 | *bank_pin_num = pin_num; | 152 | if ((pin_num >= gpio->p_data->bank_min[bank]) && |
| 121 | break; | 153 | (pin_num <= gpio->p_data->bank_max[bank])) { |
| 122 | case ZYNQ_GPIO_BANK1_PIN_MIN ... ZYNQ_GPIO_BANK1_PIN_MAX: | 154 | *bank_num = bank; |
| 123 | *bank_num = 1; | 155 | *bank_pin_num = pin_num - |
| 124 | *bank_pin_num = pin_num - ZYNQ_GPIO_BANK1_PIN_MIN; | 156 | gpio->p_data->bank_min[bank]; |
| 125 | break; | 157 | return; |
| 126 | case ZYNQ_GPIO_BANK2_PIN_MIN ... ZYNQ_GPIO_BANK2_PIN_MAX: | 158 | } |
| 127 | *bank_num = 2; | ||
| 128 | *bank_pin_num = pin_num - ZYNQ_GPIO_BANK2_PIN_MIN; | ||
| 129 | break; | ||
| 130 | case ZYNQ_GPIO_BANK3_PIN_MIN ... ZYNQ_GPIO_BANK3_PIN_MAX: | ||
| 131 | *bank_num = 3; | ||
| 132 | *bank_pin_num = pin_num - ZYNQ_GPIO_BANK3_PIN_MIN; | ||
| 133 | break; | ||
| 134 | default: | ||
| 135 | WARN(true, "invalid GPIO pin number: %u", pin_num); | ||
| 136 | *bank_num = 0; | ||
| 137 | *bank_pin_num = 0; | ||
| 138 | break; | ||
| 139 | } | 159 | } |
| 140 | } | ||
| 141 | 160 | ||
| 142 | static const unsigned int zynq_gpio_bank_offset[] = { | 161 | /* default */ |
| 143 | ZYNQ_GPIO_BANK0_PIN_MIN, | 162 | WARN(true, "invalid GPIO pin number: %u", pin_num); |
| 144 | ZYNQ_GPIO_BANK1_PIN_MIN, | 163 | *bank_num = 0; |
| 145 | ZYNQ_GPIO_BANK2_PIN_MIN, | 164 | *bank_pin_num = 0; |
| 146 | ZYNQ_GPIO_BANK3_PIN_MIN, | 165 | } |
| 147 | }; | ||
| 148 | 166 | ||
| 149 | /** | 167 | /** |
| 150 | * zynq_gpio_get_value - Get the state of the specified pin of GPIO device | 168 | * zynq_gpio_get_value - Get the state of the specified pin of GPIO device |
| @@ -161,7 +179,7 @@ static int zynq_gpio_get_value(struct gpio_chip *chip, unsigned int pin) | |||
| 161 | unsigned int bank_num, bank_pin_num; | 179 | unsigned int bank_num, bank_pin_num; |
| 162 | struct zynq_gpio *gpio = container_of(chip, struct zynq_gpio, chip); | 180 | struct zynq_gpio *gpio = container_of(chip, struct zynq_gpio, chip); |
| 163 | 181 | ||
| 164 | zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num); | 182 | zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num, gpio); |
| 165 | 183 | ||
| 166 | data = readl_relaxed(gpio->base_addr + | 184 | data = readl_relaxed(gpio->base_addr + |
| 167 | ZYNQ_GPIO_DATA_RO_OFFSET(bank_num)); | 185 | ZYNQ_GPIO_DATA_RO_OFFSET(bank_num)); |
| @@ -185,7 +203,7 @@ static void zynq_gpio_set_value(struct gpio_chip *chip, unsigned int pin, | |||
| 185 | unsigned int reg_offset, bank_num, bank_pin_num; | 203 | unsigned int reg_offset, bank_num, bank_pin_num; |
| 186 | struct zynq_gpio *gpio = container_of(chip, struct zynq_gpio, chip); | 204 | struct zynq_gpio *gpio = container_of(chip, struct zynq_gpio, chip); |
| 187 | 205 | ||
| 188 | zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num); | 206 | zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num, gpio); |
| 189 | 207 | ||
| 190 | if (bank_pin_num >= ZYNQ_GPIO_MID_PIN_NUM) { | 208 | if (bank_pin_num >= ZYNQ_GPIO_MID_PIN_NUM) { |
| 191 | /* only 16 data bits in bit maskable reg */ | 209 | /* only 16 data bits in bit maskable reg */ |
| @@ -222,7 +240,7 @@ static int zynq_gpio_dir_in(struct gpio_chip *chip, unsigned int pin) | |||
| 222 | unsigned int bank_num, bank_pin_num; | 240 | unsigned int bank_num, bank_pin_num; |
| 223 | struct zynq_gpio *gpio = container_of(chip, struct zynq_gpio, chip); | 241 | struct zynq_gpio *gpio = container_of(chip, struct zynq_gpio, chip); |
| 224 | 242 | ||
| 225 | zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num); | 243 | zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num, gpio); |
| 226 | 244 | ||
| 227 | /* bank 0 pins 7 and 8 are special and cannot be used as inputs */ | 245 | /* bank 0 pins 7 and 8 are special and cannot be used as inputs */ |
| 228 | if (bank_num == 0 && (bank_pin_num == 7 || bank_pin_num == 8)) | 246 | if (bank_num == 0 && (bank_pin_num == 7 || bank_pin_num == 8)) |
| @@ -255,7 +273,7 @@ static int zynq_gpio_dir_out(struct gpio_chip *chip, unsigned int pin, | |||
| 255 | unsigned int bank_num, bank_pin_num; | 273 | unsigned int bank_num, bank_pin_num; |
| 256 | struct zynq_gpio *gpio = container_of(chip, struct zynq_gpio, chip); | 274 | struct zynq_gpio *gpio = container_of(chip, struct zynq_gpio, chip); |
| 257 | 275 | ||
| 258 | zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num); | 276 | zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num, gpio); |
| 259 | 277 | ||
| 260 | /* set the GPIO pin as output */ | 278 | /* set the GPIO pin as output */ |
| 261 | reg = readl_relaxed(gpio->base_addr + ZYNQ_GPIO_DIRM_OFFSET(bank_num)); | 279 | reg = readl_relaxed(gpio->base_addr + ZYNQ_GPIO_DIRM_OFFSET(bank_num)); |
| @@ -286,7 +304,7 @@ static void zynq_gpio_irq_mask(struct irq_data *irq_data) | |||
| 286 | struct zynq_gpio *gpio = irq_data_get_irq_chip_data(irq_data); | 304 | struct zynq_gpio *gpio = irq_data_get_irq_chip_data(irq_data); |
| 287 | 305 | ||
| 288 | device_pin_num = irq_data->hwirq; | 306 | device_pin_num = irq_data->hwirq; |
| 289 | zynq_gpio_get_bank_pin(device_pin_num, &bank_num, &bank_pin_num); | 307 | zynq_gpio_get_bank_pin(device_pin_num, &bank_num, &bank_pin_num, gpio); |
| 290 | writel_relaxed(BIT(bank_pin_num), | 308 | writel_relaxed(BIT(bank_pin_num), |
| 291 | gpio->base_addr + ZYNQ_GPIO_INTDIS_OFFSET(bank_num)); | 309 | gpio->base_addr + ZYNQ_GPIO_INTDIS_OFFSET(bank_num)); |
| 292 | } | 310 | } |
| @@ -306,7 +324,7 @@ static void zynq_gpio_irq_unmask(struct irq_data *irq_data) | |||
| 306 | struct zynq_gpio *gpio = irq_data_get_irq_chip_data(irq_data); | 324 | struct zynq_gpio *gpio = irq_data_get_irq_chip_data(irq_data); |
| 307 | 325 | ||
| 308 | device_pin_num = irq_data->hwirq; | 326 | device_pin_num = irq_data->hwirq; |
| 309 | zynq_gpio_get_bank_pin(device_pin_num, &bank_num, &bank_pin_num); | 327 | zynq_gpio_get_bank_pin(device_pin_num, &bank_num, &bank_pin_num, gpio); |
| 310 | writel_relaxed(BIT(bank_pin_num), | 328 | writel_relaxed(BIT(bank_pin_num), |
| 311 | gpio->base_addr + ZYNQ_GPIO_INTEN_OFFSET(bank_num)); | 329 | gpio->base_addr + ZYNQ_GPIO_INTEN_OFFSET(bank_num)); |
| 312 | } | 330 | } |
| @@ -325,7 +343,7 @@ static void zynq_gpio_irq_ack(struct irq_data *irq_data) | |||
| 325 | struct zynq_gpio *gpio = irq_data_get_irq_chip_data(irq_data); | 343 | struct zynq_gpio *gpio = irq_data_get_irq_chip_data(irq_data); |
| 326 | 344 | ||
| 327 | device_pin_num = irq_data->hwirq; | 345 | device_pin_num = irq_data->hwirq; |
| 328 | zynq_gpio_get_bank_pin(device_pin_num, &bank_num, &bank_pin_num); | 346 | zynq_gpio_get_bank_pin(device_pin_num, &bank_num, &bank_pin_num, gpio); |
| 329 | writel_relaxed(BIT(bank_pin_num), | 347 | writel_relaxed(BIT(bank_pin_num), |
| 330 | gpio->base_addr + ZYNQ_GPIO_INTSTS_OFFSET(bank_num)); | 348 | gpio->base_addr + ZYNQ_GPIO_INTSTS_OFFSET(bank_num)); |
| 331 | } | 349 | } |
| @@ -375,7 +393,7 @@ static int zynq_gpio_set_irq_type(struct irq_data *irq_data, unsigned int type) | |||
| 375 | struct zynq_gpio *gpio = irq_data_get_irq_chip_data(irq_data); | 393 | struct zynq_gpio *gpio = irq_data_get_irq_chip_data(irq_data); |
| 376 | 394 | ||
| 377 | device_pin_num = irq_data->hwirq; | 395 | device_pin_num = irq_data->hwirq; |
| 378 | zynq_gpio_get_bank_pin(device_pin_num, &bank_num, &bank_pin_num); | 396 | zynq_gpio_get_bank_pin(device_pin_num, &bank_num, &bank_pin_num, gpio); |
| 379 | 397 | ||
| 380 | int_type = readl_relaxed(gpio->base_addr + | 398 | int_type = readl_relaxed(gpio->base_addr + |
| 381 | ZYNQ_GPIO_INTTYPE_OFFSET(bank_num)); | 399 | ZYNQ_GPIO_INTTYPE_OFFSET(bank_num)); |
| @@ -470,7 +488,7 @@ static void zynq_gpio_handle_bank_irq(struct zynq_gpio *gpio, | |||
| 470 | unsigned int bank_num, | 488 | unsigned int bank_num, |
| 471 | unsigned long pending) | 489 | unsigned long pending) |
| 472 | { | 490 | { |
| 473 | unsigned int bank_offset = zynq_gpio_bank_offset[bank_num]; | 491 | unsigned int bank_offset = gpio->p_data->bank_min[bank_num]; |
| 474 | struct irq_domain *irqdomain = gpio->chip.irqdomain; | 492 | struct irq_domain *irqdomain = gpio->chip.irqdomain; |
| 475 | int offset; | 493 | int offset; |
| 476 | 494 | ||
| @@ -505,7 +523,7 @@ static void zynq_gpio_irqhandler(unsigned int irq, struct irq_desc *desc) | |||
| 505 | 523 | ||
| 506 | chained_irq_enter(irqchip, desc); | 524 | chained_irq_enter(irqchip, desc); |
| 507 | 525 | ||
| 508 | for (bank_num = 0; bank_num < ZYNQ_GPIO_MAX_BANK; bank_num++) { | 526 | for (bank_num = 0; bank_num < gpio->p_data->max_bank; bank_num++) { |
| 509 | int_sts = readl_relaxed(gpio->base_addr + | 527 | int_sts = readl_relaxed(gpio->base_addr + |
| 510 | ZYNQ_GPIO_INTSTS_OFFSET(bank_num)); | 528 | ZYNQ_GPIO_INTSTS_OFFSET(bank_num)); |
| 511 | int_enb = readl_relaxed(gpio->base_addr + | 529 | int_enb = readl_relaxed(gpio->base_addr + |
| @@ -582,6 +600,46 @@ static const struct dev_pm_ops zynq_gpio_dev_pm_ops = { | |||
| 582 | zynq_gpio_runtime_resume, NULL) | 600 | zynq_gpio_runtime_resume, NULL) |
| 583 | }; | 601 | }; |
| 584 | 602 | ||
| 603 | static const struct zynq_platform_data zynqmp_gpio_def = { | ||
| 604 | .label = "zynqmp_gpio", | ||
| 605 | .ngpio = ZYNQMP_GPIO_NR_GPIOS, | ||
| 606 | .max_bank = ZYNQMP_GPIO_MAX_BANK, | ||
| 607 | .bank_min[0] = ZYNQ_GPIO_BANK0_PIN_MIN(MP), | ||
| 608 | .bank_max[0] = ZYNQ_GPIO_BANK0_PIN_MAX(MP), | ||
| 609 | .bank_min[1] = ZYNQ_GPIO_BANK1_PIN_MIN(MP), | ||
| 610 | .bank_max[1] = ZYNQ_GPIO_BANK1_PIN_MAX(MP), | ||
| 611 | .bank_min[2] = ZYNQ_GPIO_BANK2_PIN_MIN(MP), | ||
| 612 | .bank_max[2] = ZYNQ_GPIO_BANK2_PIN_MAX(MP), | ||
| 613 | .bank_min[3] = ZYNQ_GPIO_BANK3_PIN_MIN(MP), | ||
| 614 | .bank_max[3] = ZYNQ_GPIO_BANK3_PIN_MAX(MP), | ||
| 615 | .bank_min[4] = ZYNQ_GPIO_BANK4_PIN_MIN(MP), | ||
| 616 | .bank_max[4] = ZYNQ_GPIO_BANK4_PIN_MAX(MP), | ||
| 617 | .bank_min[5] = ZYNQ_GPIO_BANK5_PIN_MIN(MP), | ||
| 618 | .bank_max[5] = ZYNQ_GPIO_BANK5_PIN_MAX(MP), | ||
| 619 | }; | ||
| 620 | |||
| 621 | static const struct zynq_platform_data zynq_gpio_def = { | ||
| 622 | .label = "zynq_gpio", | ||
| 623 | .ngpio = ZYNQ_GPIO_NR_GPIOS, | ||
| 624 | .max_bank = ZYNQ_GPIO_MAX_BANK, | ||
| 625 | .bank_min[0] = ZYNQ_GPIO_BANK0_PIN_MIN(), | ||
| 626 | .bank_max[0] = ZYNQ_GPIO_BANK0_PIN_MAX(), | ||
| 627 | .bank_min[1] = ZYNQ_GPIO_BANK1_PIN_MIN(), | ||
| 628 | .bank_max[1] = ZYNQ_GPIO_BANK1_PIN_MAX(), | ||
| 629 | .bank_min[2] = ZYNQ_GPIO_BANK2_PIN_MIN(), | ||
| 630 | .bank_max[2] = ZYNQ_GPIO_BANK2_PIN_MAX(), | ||
| 631 | .bank_min[3] = ZYNQ_GPIO_BANK3_PIN_MIN(), | ||
| 632 | .bank_max[3] = ZYNQ_GPIO_BANK3_PIN_MAX(), | ||
| 633 | }; | ||
| 634 | |||
| 635 | static const struct of_device_id zynq_gpio_of_match[] = { | ||
| 636 | { .compatible = "xlnx,zynq-gpio-1.0", .data = (void *)&zynq_gpio_def }, | ||
| 637 | { .compatible = "xlnx,zynqmp-gpio-1.0", | ||
| 638 | .data = (void *)&zynqmp_gpio_def }, | ||
| 639 | { /* end of table */ } | ||
| 640 | }; | ||
| 641 | MODULE_DEVICE_TABLE(of, zynq_gpio_of_match); | ||
| 642 | |||
| 585 | /** | 643 | /** |
| 586 | * zynq_gpio_probe - Initialization method for a zynq_gpio device | 644 | * zynq_gpio_probe - Initialization method for a zynq_gpio device |
| 587 | * @pdev: platform device instance | 645 | * @pdev: platform device instance |
| @@ -599,11 +657,18 @@ static int zynq_gpio_probe(struct platform_device *pdev) | |||
| 599 | struct zynq_gpio *gpio; | 657 | struct zynq_gpio *gpio; |
| 600 | struct gpio_chip *chip; | 658 | struct gpio_chip *chip; |
| 601 | struct resource *res; | 659 | struct resource *res; |
| 660 | const struct of_device_id *match; | ||
| 602 | 661 | ||
| 603 | gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL); | 662 | gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL); |
| 604 | if (!gpio) | 663 | if (!gpio) |
| 605 | return -ENOMEM; | 664 | return -ENOMEM; |
| 606 | 665 | ||
| 666 | match = of_match_node(zynq_gpio_of_match, pdev->dev.of_node); | ||
| 667 | if (!match) { | ||
| 668 | dev_err(&pdev->dev, "of_match_node() failed\n"); | ||
| 669 | return -EINVAL; | ||
| 670 | } | ||
| 671 | gpio->p_data = match->data; | ||
| 607 | platform_set_drvdata(pdev, gpio); | 672 | platform_set_drvdata(pdev, gpio); |
| 608 | 673 | ||
| 609 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 674 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| @@ -619,7 +684,7 @@ static int zynq_gpio_probe(struct platform_device *pdev) | |||
| 619 | 684 | ||
| 620 | /* configure the gpio chip */ | 685 | /* configure the gpio chip */ |
| 621 | chip = &gpio->chip; | 686 | chip = &gpio->chip; |
| 622 | chip->label = "zynq_gpio"; | 687 | chip->label = gpio->p_data->label; |
| 623 | chip->owner = THIS_MODULE; | 688 | chip->owner = THIS_MODULE; |
| 624 | chip->dev = &pdev->dev; | 689 | chip->dev = &pdev->dev; |
| 625 | chip->get = zynq_gpio_get_value; | 690 | chip->get = zynq_gpio_get_value; |
| @@ -629,7 +694,7 @@ static int zynq_gpio_probe(struct platform_device *pdev) | |||
| 629 | chip->direction_input = zynq_gpio_dir_in; | 694 | chip->direction_input = zynq_gpio_dir_in; |
| 630 | chip->direction_output = zynq_gpio_dir_out; | 695 | chip->direction_output = zynq_gpio_dir_out; |
| 631 | chip->base = -1; | 696 | chip->base = -1; |
| 632 | chip->ngpio = ZYNQ_GPIO_NR_GPIOS; | 697 | chip->ngpio = gpio->p_data->ngpio; |
| 633 | 698 | ||
| 634 | /* Enable GPIO clock */ | 699 | /* Enable GPIO clock */ |
| 635 | gpio->clk = devm_clk_get(&pdev->dev, NULL); | 700 | gpio->clk = devm_clk_get(&pdev->dev, NULL); |
| @@ -651,7 +716,7 @@ static int zynq_gpio_probe(struct platform_device *pdev) | |||
| 651 | } | 716 | } |
| 652 | 717 | ||
| 653 | /* disable interrupts for all banks */ | 718 | /* disable interrupts for all banks */ |
| 654 | for (bank_num = 0; bank_num < ZYNQ_GPIO_MAX_BANK; bank_num++) | 719 | for (bank_num = 0; bank_num < gpio->p_data->max_bank; bank_num++) |
| 655 | writel_relaxed(ZYNQ_GPIO_IXR_DISABLE_ALL, gpio->base_addr + | 720 | writel_relaxed(ZYNQ_GPIO_IXR_DISABLE_ALL, gpio->base_addr + |
| 656 | ZYNQ_GPIO_INTDIS_OFFSET(bank_num)); | 721 | ZYNQ_GPIO_INTDIS_OFFSET(bank_num)); |
| 657 | 722 | ||
| @@ -695,12 +760,6 @@ static int zynq_gpio_remove(struct platform_device *pdev) | |||
| 695 | return 0; | 760 | return 0; |
| 696 | } | 761 | } |
| 697 | 762 | ||
| 698 | static struct of_device_id zynq_gpio_of_match[] = { | ||
| 699 | { .compatible = "xlnx,zynq-gpio-1.0", }, | ||
| 700 | { /* end of table */ } | ||
| 701 | }; | ||
| 702 | MODULE_DEVICE_TABLE(of, zynq_gpio_of_match); | ||
| 703 | |||
| 704 | static struct platform_driver zynq_gpio_driver = { | 763 | static struct platform_driver zynq_gpio_driver = { |
| 705 | .driver = { | 764 | .driver = { |
| 706 | .name = DRIVER_NAME, | 765 | .name = DRIVER_NAME, |
