aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2014-04-25 11:10:06 -0400
committerLinus Walleij <linus.walleij@linaro.org>2014-05-09 07:48:30 -0400
commit29a1f2333e07bbbecb920cc78fd035fe8f53207a (patch)
treeb2cb50d4c41ff4d1337cca888da3840f6f0d4d84 /drivers/gpio
parent91329132c909bbeb27699556b98b7f745ddb2ed9 (diff)
gpio: Add helpers for optional GPIOs
Introduce gpiod_get_optional() and gpiod_get_index_optional() helpers that make it easier for drivers to handle optional GPIOs. Currently in order to handle optional GPIOs, a driver needs to special case error handling for -ENOENT, such as this: gpio = gpiod_get(dev, "foo"); if (IS_ERR(gpio)) { if (PTR_ERR(gpio) != -ENOENT) return PTR_ERR(gpio); gpio = NULL; } if (gpio) { /* set up GPIO */ } With these new helpers the above is reduced to: gpio = gpiod_get_optional(dev, "foo"); if (IS_ERR(gpio)) return PTR_ERR(gpio); if (gpio) { /* set up GPIO */ } While at it, device-managed variants of these functions are also provided. Signed-off-by: Thierry Reding <treding@nvidia.com> Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio')
-rw-r--r--drivers/gpio/devres.c43
-rw-r--r--drivers/gpio/gpiolib.c43
2 files changed, 86 insertions, 0 deletions
diff --git a/drivers/gpio/devres.c b/drivers/gpio/devres.c
index 307464fd015f..65978cf85f79 100644
--- a/drivers/gpio/devres.c
+++ b/drivers/gpio/devres.c
@@ -52,6 +52,22 @@ struct gpio_desc *__must_check devm_gpiod_get(struct device *dev,
52EXPORT_SYMBOL(devm_gpiod_get); 52EXPORT_SYMBOL(devm_gpiod_get);
53 53
54/** 54/**
55 * devm_gpiod_get_optional - Resource-managed gpiod_get_optional()
56 * @dev: GPIO consumer
57 * @con_id: function within the GPIO consumer
58 *
59 * Managed gpiod_get_optional(). GPIO descriptors returned from this function
60 * are automatically disposed on driver detach. See gpiod_get_optional() for
61 * detailed information about behavior and return values.
62 */
63struct gpio_desc *__must_check devm_gpiod_get_optional(struct device *dev,
64 const char *con_id)
65{
66 return devm_gpiod_get_index_optional(dev, con_id, 0);
67}
68EXPORT_SYMBOL(devm_gpiod_get_optional);
69
70/**
55 * devm_gpiod_get_index - Resource-managed gpiod_get_index() 71 * devm_gpiod_get_index - Resource-managed gpiod_get_index()
56 * @dev: GPIO consumer 72 * @dev: GPIO consumer
57 * @con_id: function within the GPIO consumer 73 * @con_id: function within the GPIO consumer
@@ -87,6 +103,33 @@ struct gpio_desc *__must_check devm_gpiod_get_index(struct device *dev,
87EXPORT_SYMBOL(devm_gpiod_get_index); 103EXPORT_SYMBOL(devm_gpiod_get_index);
88 104
89/** 105/**
106 * devm_gpiod_get_index_optional - Resource-managed gpiod_get_index_optional()
107 * @dev: GPIO consumer
108 * @con_id: function within the GPIO consumer
109 * @index: index of the GPIO to obtain in the consumer
110 *
111 * Managed gpiod_get_index_optional(). GPIO descriptors returned from this
112 * function are automatically disposed on driver detach. See
113 * gpiod_get_index_optional() for detailed information about behavior and
114 * return values.
115 */
116struct gpio_desc *__must_check devm_gpiod_get_index_optional(struct device *dev,
117 const char *con_id,
118 unsigned int index)
119{
120 struct gpio_desc *desc;
121
122 desc = devm_gpiod_get_index(dev, con_id, index);
123 if (IS_ERR(desc)) {
124 if (PTR_ERR(desc) == -ENOENT)
125 return NULL;
126 }
127
128 return desc;
129}
130EXPORT_SYMBOL(devm_gpiod_get_index_optional);
131
132/**
90 * devm_gpiod_put - Resource-managed gpiod_put() 133 * devm_gpiod_put - Resource-managed gpiod_put()
91 * @desc: GPIO descriptor to dispose of 134 * @desc: GPIO descriptor to dispose of
92 * 135 *
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 4ad110e793c5..d9c9cb4665db 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -2738,6 +2738,22 @@ struct gpio_desc *__must_check gpiod_get(struct device *dev, const char *con_id)
2738EXPORT_SYMBOL_GPL(gpiod_get); 2738EXPORT_SYMBOL_GPL(gpiod_get);
2739 2739
2740/** 2740/**
2741 * gpiod_get_optional - obtain an optional GPIO for a given GPIO function
2742 * @dev: GPIO consumer, can be NULL for system-global GPIOs
2743 * @con_id: function within the GPIO consumer
2744 *
2745 * This is equivalent to gpiod_get(), except that when no GPIO was assigned to
2746 * the requested function it will return NULL. This is convenient for drivers
2747 * that need to handle optional GPIOs.
2748 */
2749struct gpio_desc *__must_check gpiod_get_optional(struct device *dev,
2750 const char *con_id)
2751{
2752 return gpiod_get_index_optional(dev, con_id, 0);
2753}
2754EXPORT_SYMBOL_GPL(gpiod_get_optional);
2755
2756/**
2741 * gpiod_get_index - obtain a GPIO from a multi-index GPIO function 2757 * gpiod_get_index - obtain a GPIO from a multi-index GPIO function
2742 * @dev: GPIO consumer, can be NULL for system-global GPIOs 2758 * @dev: GPIO consumer, can be NULL for system-global GPIOs
2743 * @con_id: function within the GPIO consumer 2759 * @con_id: function within the GPIO consumer
@@ -2800,6 +2816,33 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
2800EXPORT_SYMBOL_GPL(gpiod_get_index); 2816EXPORT_SYMBOL_GPL(gpiod_get_index);
2801 2817
2802/** 2818/**
2819 * gpiod_get_index_optional - obtain an optional GPIO from a multi-index GPIO
2820 * function
2821 * @dev: GPIO consumer, can be NULL for system-global GPIOs
2822 * @con_id: function within the GPIO consumer
2823 * @index: index of the GPIO to obtain in the consumer
2824 *
2825 * This is equivalent to gpiod_get_index(), except that when no GPIO with the
2826 * specified index was assigned to the requested function it will return NULL.
2827 * This is convenient for drivers that need to handle optional GPIOs.
2828 */
2829struct gpio_desc *__must_check gpiod_get_index_optional(struct device *dev,
2830 const char *con_id,
2831 unsigned int index)
2832{
2833 struct gpio_desc *desc;
2834
2835 desc = gpiod_get_index(dev, con_id, index);
2836 if (IS_ERR(desc)) {
2837 if (PTR_ERR(desc) == -ENOENT)
2838 return NULL;
2839 }
2840
2841 return desc;
2842}
2843EXPORT_SYMBOL_GPL(gpiod_get_index_optional);
2844
2845/**
2803 * gpiod_put - dispose of a GPIO descriptor 2846 * gpiod_put - dispose of a GPIO descriptor
2804 * @desc: GPIO descriptor to dispose of 2847 * @desc: GPIO descriptor to dispose of
2805 * 2848 *