diff options
-rw-r--r-- | drivers/gpio/Kconfig | 2 | ||||
-rw-r--r-- | drivers/gpio/gpio-sch.c | 21 | ||||
-rw-r--r-- | drivers/gpio/gpiolib-legacy.c | 8 | ||||
-rw-r--r-- | drivers/gpio/gpiolib.c | 52 |
4 files changed, 31 insertions, 52 deletions
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index cebcb405812e..536112fd2466 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
@@ -49,7 +49,7 @@ config GPIO_DEVRES | |||
49 | 49 | ||
50 | config OF_GPIO | 50 | config OF_GPIO |
51 | def_bool y | 51 | def_bool y |
52 | depends on OF || COMPILE_TEST | 52 | depends on OF |
53 | 53 | ||
54 | config GPIO_ACPI | 54 | config GPIO_ACPI |
55 | def_bool y | 55 | def_bool y |
diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c index e85e7539cf5d..eb43ae4835c1 100644 --- a/drivers/gpio/gpio-sch.c +++ b/drivers/gpio/gpio-sch.c | |||
@@ -61,9 +61,8 @@ static unsigned sch_gpio_bit(struct sch_gpio *sch, unsigned gpio) | |||
61 | return gpio % 8; | 61 | return gpio % 8; |
62 | } | 62 | } |
63 | 63 | ||
64 | static int sch_gpio_reg_get(struct gpio_chip *gc, unsigned gpio, unsigned reg) | 64 | static int sch_gpio_reg_get(struct sch_gpio *sch, unsigned gpio, unsigned reg) |
65 | { | 65 | { |
66 | struct sch_gpio *sch = gpiochip_get_data(gc); | ||
67 | unsigned short offset, bit; | 66 | unsigned short offset, bit; |
68 | u8 reg_val; | 67 | u8 reg_val; |
69 | 68 | ||
@@ -75,10 +74,9 @@ static int sch_gpio_reg_get(struct gpio_chip *gc, unsigned gpio, unsigned reg) | |||
75 | return reg_val; | 74 | return reg_val; |
76 | } | 75 | } |
77 | 76 | ||
78 | static void sch_gpio_reg_set(struct gpio_chip *gc, unsigned gpio, unsigned reg, | 77 | static void sch_gpio_reg_set(struct sch_gpio *sch, unsigned gpio, unsigned reg, |
79 | int val) | 78 | int val) |
80 | { | 79 | { |
81 | struct sch_gpio *sch = gpiochip_get_data(gc); | ||
82 | unsigned short offset, bit; | 80 | unsigned short offset, bit; |
83 | u8 reg_val; | 81 | u8 reg_val; |
84 | 82 | ||
@@ -98,14 +96,15 @@ static int sch_gpio_direction_in(struct gpio_chip *gc, unsigned gpio_num) | |||
98 | struct sch_gpio *sch = gpiochip_get_data(gc); | 96 | struct sch_gpio *sch = gpiochip_get_data(gc); |
99 | 97 | ||
100 | spin_lock(&sch->lock); | 98 | spin_lock(&sch->lock); |
101 | sch_gpio_reg_set(gc, gpio_num, GIO, 1); | 99 | sch_gpio_reg_set(sch, gpio_num, GIO, 1); |
102 | spin_unlock(&sch->lock); | 100 | spin_unlock(&sch->lock); |
103 | return 0; | 101 | return 0; |
104 | } | 102 | } |
105 | 103 | ||
106 | static int sch_gpio_get(struct gpio_chip *gc, unsigned gpio_num) | 104 | static int sch_gpio_get(struct gpio_chip *gc, unsigned gpio_num) |
107 | { | 105 | { |
108 | return sch_gpio_reg_get(gc, gpio_num, GLV); | 106 | struct sch_gpio *sch = gpiochip_get_data(gc); |
107 | return sch_gpio_reg_get(sch, gpio_num, GLV); | ||
109 | } | 108 | } |
110 | 109 | ||
111 | static void sch_gpio_set(struct gpio_chip *gc, unsigned gpio_num, int val) | 110 | static void sch_gpio_set(struct gpio_chip *gc, unsigned gpio_num, int val) |
@@ -113,7 +112,7 @@ static void sch_gpio_set(struct gpio_chip *gc, unsigned gpio_num, int val) | |||
113 | struct sch_gpio *sch = gpiochip_get_data(gc); | 112 | struct sch_gpio *sch = gpiochip_get_data(gc); |
114 | 113 | ||
115 | spin_lock(&sch->lock); | 114 | spin_lock(&sch->lock); |
116 | sch_gpio_reg_set(gc, gpio_num, GLV, val); | 115 | sch_gpio_reg_set(sch, gpio_num, GLV, val); |
117 | spin_unlock(&sch->lock); | 116 | spin_unlock(&sch->lock); |
118 | } | 117 | } |
119 | 118 | ||
@@ -123,7 +122,7 @@ static int sch_gpio_direction_out(struct gpio_chip *gc, unsigned gpio_num, | |||
123 | struct sch_gpio *sch = gpiochip_get_data(gc); | 122 | struct sch_gpio *sch = gpiochip_get_data(gc); |
124 | 123 | ||
125 | spin_lock(&sch->lock); | 124 | spin_lock(&sch->lock); |
126 | sch_gpio_reg_set(gc, gpio_num, GIO, 0); | 125 | sch_gpio_reg_set(sch, gpio_num, GIO, 0); |
127 | spin_unlock(&sch->lock); | 126 | spin_unlock(&sch->lock); |
128 | 127 | ||
129 | /* | 128 | /* |
@@ -182,13 +181,13 @@ static int sch_gpio_probe(struct platform_device *pdev) | |||
182 | * GPIO7 is configured by the CMC as SLPIOVR | 181 | * GPIO7 is configured by the CMC as SLPIOVR |
183 | * Enable GPIO[9:8] core powered gpios explicitly | 182 | * Enable GPIO[9:8] core powered gpios explicitly |
184 | */ | 183 | */ |
185 | sch_gpio_reg_set(&sch->chip, 8, GEN, 1); | 184 | sch_gpio_reg_set(sch, 8, GEN, 1); |
186 | sch_gpio_reg_set(&sch->chip, 9, GEN, 1); | 185 | sch_gpio_reg_set(sch, 9, GEN, 1); |
187 | /* | 186 | /* |
188 | * SUS_GPIO[2:0] enabled by default | 187 | * SUS_GPIO[2:0] enabled by default |
189 | * Enable SUS_GPIO3 resume powered gpio explicitly | 188 | * Enable SUS_GPIO3 resume powered gpio explicitly |
190 | */ | 189 | */ |
191 | sch_gpio_reg_set(&sch->chip, 13, GEN, 1); | 190 | sch_gpio_reg_set(sch, 13, GEN, 1); |
192 | break; | 191 | break; |
193 | 192 | ||
194 | case PCI_DEVICE_ID_INTEL_ITC_LPC: | 193 | case PCI_DEVICE_ID_INTEL_ITC_LPC: |
diff --git a/drivers/gpio/gpiolib-legacy.c b/drivers/gpio/gpiolib-legacy.c index 3a5c7011ad3b..8b830996fe02 100644 --- a/drivers/gpio/gpiolib-legacy.c +++ b/drivers/gpio/gpiolib-legacy.c | |||
@@ -28,6 +28,10 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) | |||
28 | if (!desc && gpio_is_valid(gpio)) | 28 | if (!desc && gpio_is_valid(gpio)) |
29 | return -EPROBE_DEFER; | 29 | return -EPROBE_DEFER; |
30 | 30 | ||
31 | err = gpiod_request(desc, label); | ||
32 | if (err) | ||
33 | return err; | ||
34 | |||
31 | if (flags & GPIOF_OPEN_DRAIN) | 35 | if (flags & GPIOF_OPEN_DRAIN) |
32 | set_bit(FLAG_OPEN_DRAIN, &desc->flags); | 36 | set_bit(FLAG_OPEN_DRAIN, &desc->flags); |
33 | 37 | ||
@@ -37,10 +41,6 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) | |||
37 | if (flags & GPIOF_ACTIVE_LOW) | 41 | if (flags & GPIOF_ACTIVE_LOW) |
38 | set_bit(FLAG_ACTIVE_LOW, &desc->flags); | 42 | set_bit(FLAG_ACTIVE_LOW, &desc->flags); |
39 | 43 | ||
40 | err = gpiod_request(desc, label); | ||
41 | if (err) | ||
42 | return err; | ||
43 | |||
44 | if (flags & GPIOF_DIR_IN) | 44 | if (flags & GPIOF_DIR_IN) |
45 | err = gpiod_direction_input(desc); | 45 | err = gpiod_direction_input(desc); |
46 | else | 46 | else |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 570771ed19e6..be74bd370f1f 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -1352,14 +1352,6 @@ static int __gpiod_request(struct gpio_desc *desc, const char *label) | |||
1352 | spin_lock_irqsave(&gpio_lock, flags); | 1352 | spin_lock_irqsave(&gpio_lock, flags); |
1353 | } | 1353 | } |
1354 | done: | 1354 | done: |
1355 | if (status < 0) { | ||
1356 | /* Clear flags that might have been set by the caller before | ||
1357 | * requesting the GPIO. | ||
1358 | */ | ||
1359 | clear_bit(FLAG_ACTIVE_LOW, &desc->flags); | ||
1360 | clear_bit(FLAG_OPEN_DRAIN, &desc->flags); | ||
1361 | clear_bit(FLAG_OPEN_SOURCE, &desc->flags); | ||
1362 | } | ||
1363 | spin_unlock_irqrestore(&gpio_lock, flags); | 1355 | spin_unlock_irqrestore(&gpio_lock, flags); |
1364 | return status; | 1356 | return status; |
1365 | } | 1357 | } |
@@ -2587,28 +2579,13 @@ struct gpio_desc *__must_check gpiod_get_optional(struct device *dev, | |||
2587 | } | 2579 | } |
2588 | EXPORT_SYMBOL_GPL(gpiod_get_optional); | 2580 | EXPORT_SYMBOL_GPL(gpiod_get_optional); |
2589 | 2581 | ||
2590 | /** | ||
2591 | * gpiod_parse_flags - helper function to parse GPIO lookup flags | ||
2592 | * @desc: gpio to be setup | ||
2593 | * @lflags: gpio_lookup_flags - returned from of_find_gpio() or | ||
2594 | * of_get_gpio_hog() | ||
2595 | * | ||
2596 | * Set the GPIO descriptor flags based on the given GPIO lookup flags. | ||
2597 | */ | ||
2598 | static void gpiod_parse_flags(struct gpio_desc *desc, unsigned long lflags) | ||
2599 | { | ||
2600 | if (lflags & GPIO_ACTIVE_LOW) | ||
2601 | set_bit(FLAG_ACTIVE_LOW, &desc->flags); | ||
2602 | if (lflags & GPIO_OPEN_DRAIN) | ||
2603 | set_bit(FLAG_OPEN_DRAIN, &desc->flags); | ||
2604 | if (lflags & GPIO_OPEN_SOURCE) | ||
2605 | set_bit(FLAG_OPEN_SOURCE, &desc->flags); | ||
2606 | } | ||
2607 | 2582 | ||
2608 | /** | 2583 | /** |
2609 | * gpiod_configure_flags - helper function to configure a given GPIO | 2584 | * gpiod_configure_flags - helper function to configure a given GPIO |
2610 | * @desc: gpio whose value will be assigned | 2585 | * @desc: gpio whose value will be assigned |
2611 | * @con_id: function within the GPIO consumer | 2586 | * @con_id: function within the GPIO consumer |
2587 | * @lflags: gpio_lookup_flags - returned from of_find_gpio() or | ||
2588 | * of_get_gpio_hog() | ||
2612 | * @dflags: gpiod_flags - optional GPIO initialization flags | 2589 | * @dflags: gpiod_flags - optional GPIO initialization flags |
2613 | * | 2590 | * |
2614 | * Return 0 on success, -ENOENT if no GPIO has been assigned to the | 2591 | * Return 0 on success, -ENOENT if no GPIO has been assigned to the |
@@ -2616,10 +2593,17 @@ static void gpiod_parse_flags(struct gpio_desc *desc, unsigned long lflags) | |||
2616 | * occurred while trying to acquire the GPIO. | 2593 | * occurred while trying to acquire the GPIO. |
2617 | */ | 2594 | */ |
2618 | static int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id, | 2595 | static int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id, |
2619 | enum gpiod_flags dflags) | 2596 | unsigned long lflags, enum gpiod_flags dflags) |
2620 | { | 2597 | { |
2621 | int status; | 2598 | int status; |
2622 | 2599 | ||
2600 | if (lflags & GPIO_ACTIVE_LOW) | ||
2601 | set_bit(FLAG_ACTIVE_LOW, &desc->flags); | ||
2602 | if (lflags & GPIO_OPEN_DRAIN) | ||
2603 | set_bit(FLAG_OPEN_DRAIN, &desc->flags); | ||
2604 | if (lflags & GPIO_OPEN_SOURCE) | ||
2605 | set_bit(FLAG_OPEN_SOURCE, &desc->flags); | ||
2606 | |||
2623 | /* No particular flag request, return here... */ | 2607 | /* No particular flag request, return here... */ |
2624 | if (!(dflags & GPIOD_FLAGS_BIT_DIR_SET)) { | 2608 | if (!(dflags & GPIOD_FLAGS_BIT_DIR_SET)) { |
2625 | pr_debug("no flags found for %s\n", con_id); | 2609 | pr_debug("no flags found for %s\n", con_id); |
@@ -2686,13 +2670,11 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev, | |||
2686 | return desc; | 2670 | return desc; |
2687 | } | 2671 | } |
2688 | 2672 | ||
2689 | gpiod_parse_flags(desc, lookupflags); | ||
2690 | |||
2691 | status = gpiod_request(desc, con_id); | 2673 | status = gpiod_request(desc, con_id); |
2692 | if (status < 0) | 2674 | if (status < 0) |
2693 | return ERR_PTR(status); | 2675 | return ERR_PTR(status); |
2694 | 2676 | ||
2695 | status = gpiod_configure_flags(desc, con_id, flags); | 2677 | status = gpiod_configure_flags(desc, con_id, lookupflags, flags); |
2696 | if (status < 0) { | 2678 | if (status < 0) { |
2697 | dev_dbg(dev, "setup of GPIO %s failed\n", con_id); | 2679 | dev_dbg(dev, "setup of GPIO %s failed\n", con_id); |
2698 | gpiod_put(desc); | 2680 | gpiod_put(desc); |
@@ -2748,6 +2730,10 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, | |||
2748 | if (IS_ERR(desc)) | 2730 | if (IS_ERR(desc)) |
2749 | return desc; | 2731 | return desc; |
2750 | 2732 | ||
2733 | ret = gpiod_request(desc, NULL); | ||
2734 | if (ret) | ||
2735 | return ERR_PTR(ret); | ||
2736 | |||
2751 | if (active_low) | 2737 | if (active_low) |
2752 | set_bit(FLAG_ACTIVE_LOW, &desc->flags); | 2738 | set_bit(FLAG_ACTIVE_LOW, &desc->flags); |
2753 | 2739 | ||
@@ -2758,10 +2744,6 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, | |||
2758 | set_bit(FLAG_OPEN_SOURCE, &desc->flags); | 2744 | set_bit(FLAG_OPEN_SOURCE, &desc->flags); |
2759 | } | 2745 | } |
2760 | 2746 | ||
2761 | ret = gpiod_request(desc, NULL); | ||
2762 | if (ret) | ||
2763 | return ERR_PTR(ret); | ||
2764 | |||
2765 | return desc; | 2747 | return desc; |
2766 | } | 2748 | } |
2767 | EXPORT_SYMBOL_GPL(fwnode_get_named_gpiod); | 2749 | EXPORT_SYMBOL_GPL(fwnode_get_named_gpiod); |
@@ -2814,8 +2796,6 @@ int gpiod_hog(struct gpio_desc *desc, const char *name, | |||
2814 | chip = gpiod_to_chip(desc); | 2796 | chip = gpiod_to_chip(desc); |
2815 | hwnum = gpio_chip_hwgpio(desc); | 2797 | hwnum = gpio_chip_hwgpio(desc); |
2816 | 2798 | ||
2817 | gpiod_parse_flags(desc, lflags); | ||
2818 | |||
2819 | local_desc = gpiochip_request_own_desc(chip, hwnum, name); | 2799 | local_desc = gpiochip_request_own_desc(chip, hwnum, name); |
2820 | if (IS_ERR(local_desc)) { | 2800 | if (IS_ERR(local_desc)) { |
2821 | status = PTR_ERR(local_desc); | 2801 | status = PTR_ERR(local_desc); |
@@ -2824,7 +2804,7 @@ int gpiod_hog(struct gpio_desc *desc, const char *name, | |||
2824 | return status; | 2804 | return status; |
2825 | } | 2805 | } |
2826 | 2806 | ||
2827 | status = gpiod_configure_flags(desc, name, dflags); | 2807 | status = gpiod_configure_flags(desc, name, lflags, dflags); |
2828 | if (status < 0) { | 2808 | if (status < 0) { |
2829 | pr_err("setup of hog GPIO %s (chip %s, offset %d) failed, %d\n", | 2809 | pr_err("setup of hog GPIO %s (chip %s, offset %d) failed, %d\n", |
2830 | name, chip->label, hwnum, status); | 2810 | name, chip->label, hwnum, status); |