forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c
....@@ -1,14 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) 2014-2017 Broadcom
3
- *
4
- * This program is free software; you can redistribute it and/or
5
- * modify it under the terms of the GNU General Public License as
6
- * published by the Free Software Foundation version 2.
7
- *
8
- * This program is distributed "as is" WITHOUT ANY WARRANTY of any
9
- * kind, whether express or implied; without even the implied warranty
10
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- * GNU General Public License for more details.
124 */
135
146 /*
....@@ -114,6 +106,7 @@
114106
115107 raw_spinlock_t lock;
116108
109
+ struct irq_chip irqchip;
117110 struct gpio_chip gc;
118111 unsigned num_banks;
119112
....@@ -138,7 +131,7 @@
138131 * iproc_set_bit - set or clear one bit (corresponding to the GPIO pin) in a
139132 * Iproc GPIO register
140133 *
141
- * @iproc_gpio: Iproc GPIO device
134
+ * @chip: Iproc GPIO device
142135 * @reg: register offset
143136 * @gpio: GPIO pin
144137 * @set: set or clear
....@@ -293,6 +286,12 @@
293286 iproc_set_bit(chip, IPROC_GPIO_INT_DE_OFFSET, gpio, dual_edge);
294287 iproc_set_bit(chip, IPROC_GPIO_INT_EDGE_OFFSET, gpio,
295288 rising_or_high);
289
+
290
+ if (type & IRQ_TYPE_EDGE_BOTH)
291
+ irq_set_handler_locked(d, handle_edge_irq);
292
+ else
293
+ irq_set_handler_locked(d, handle_level_irq);
294
+
296295 raw_spin_unlock_irqrestore(&chip->lock, flags);
297296
298297 dev_dbg(chip->dev,
....@@ -301,14 +300,6 @@
301300
302301 return 0;
303302 }
304
-
305
-static struct irq_chip iproc_gpio_irq_chip = {
306
- .name = "bcm-iproc-gpio",
307
- .irq_ack = iproc_gpio_irq_ack,
308
- .irq_mask = iproc_gpio_irq_mask,
309
- .irq_unmask = iproc_gpio_irq_unmask,
310
- .irq_set_type = iproc_gpio_irq_set_type,
311
-};
312303
313304 /*
314305 * Request the Iproc IOMUX pinmux controller to mux individual pins to GPIO
....@@ -364,6 +355,18 @@
364355 dev_dbg(chip->dev, "gpio:%u set output, value:%d\n", gpio, val);
365356
366357 return 0;
358
+}
359
+
360
+static int iproc_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio)
361
+{
362
+ struct iproc_gpio *chip = gpiochip_get_data(gc);
363
+ unsigned int offset = IPROC_GPIO_REG(gpio, IPROC_GPIO_OUT_EN_OFFSET);
364
+ unsigned int shift = IPROC_GPIO_SHIFT(gpio);
365
+
366
+ if (readl(chip->base + offset) & BIT(shift))
367
+ return GPIO_LINE_DIRECTION_OUT;
368
+
369
+ return GPIO_LINE_DIRECTION_IN;
367370 }
368371
369372 static void iproc_gpio_set(struct gpio_chip *gc, unsigned gpio, int val)
....@@ -801,8 +804,7 @@
801804 chip->dev = dev;
802805 platform_set_drvdata(pdev, chip);
803806
804
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
805
- chip->base = devm_ioremap_resource(dev, res);
807
+ chip->base = devm_platform_ioremap_resource(pdev, 0);
806808 if (IS_ERR(chip->base)) {
807809 dev_err(dev, "unable to map I/O memory\n");
808810 return PTR_ERR(chip->base);
....@@ -842,11 +844,41 @@
842844 gc->free = iproc_gpio_free;
843845 gc->direction_input = iproc_gpio_direction_input;
844846 gc->direction_output = iproc_gpio_direction_output;
847
+ gc->get_direction = iproc_gpio_get_direction;
845848 gc->set = iproc_gpio_set;
846849 gc->get = iproc_gpio_get;
847850
848851 chip->pinmux_is_supported = of_property_read_bool(dev->of_node,
849852 "gpio-ranges");
853
+
854
+ /* optional GPIO interrupt support */
855
+ irq = platform_get_irq_optional(pdev, 0);
856
+ if (irq > 0) {
857
+ struct irq_chip *irqc;
858
+ struct gpio_irq_chip *girq;
859
+
860
+ irqc = &chip->irqchip;
861
+ irqc->name = dev_name(dev);
862
+ irqc->irq_ack = iproc_gpio_irq_ack;
863
+ irqc->irq_mask = iproc_gpio_irq_mask;
864
+ irqc->irq_unmask = iproc_gpio_irq_unmask;
865
+ irqc->irq_set_type = iproc_gpio_irq_set_type;
866
+ irqc->irq_enable = iproc_gpio_irq_unmask;
867
+ irqc->irq_disable = iproc_gpio_irq_mask;
868
+
869
+ girq = &gc->irq;
870
+ girq->chip = irqc;
871
+ girq->parent_handler = iproc_gpio_irq_handler;
872
+ girq->num_parents = 1;
873
+ girq->parents = devm_kcalloc(dev, 1,
874
+ sizeof(*girq->parents),
875
+ GFP_KERNEL);
876
+ if (!girq->parents)
877
+ return -ENOMEM;
878
+ girq->parents[0] = irq;
879
+ girq->default_type = IRQ_TYPE_NONE;
880
+ girq->handler = handle_bad_irq;
881
+ }
850882
851883 ret = gpiochip_add_data(gc, chip);
852884 if (ret < 0) {
....@@ -870,20 +902,6 @@
870902 goto err_rm_gpiochip;
871903 }
872904 }
873
- }
874
-
875
- /* optional GPIO interrupt support */
876
- irq = platform_get_irq(pdev, 0);
877
- if (irq) {
878
- ret = gpiochip_irqchip_add(gc, &iproc_gpio_irq_chip, 0,
879
- handle_simple_irq, IRQ_TYPE_NONE);
880
- if (ret) {
881
- dev_err(dev, "no GPIO irqchip\n");
882
- goto err_rm_gpiochip;
883
- }
884
-
885
- gpiochip_set_chained_irqchip(gc, &iproc_gpio_irq_chip, irq,
886
- iproc_gpio_irq_handler);
887905 }
888906
889907 return 0;