diff options
Diffstat (limited to 'drivers/gpio/devres.c')
-rw-r--r-- | drivers/gpio/devres.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/gpio/devres.c b/drivers/gpio/devres.c index 954b9f6b0ef8..13dbd3dfc33a 100644 --- a/drivers/gpio/devres.c +++ b/drivers/gpio/devres.c | |||
@@ -109,6 +109,38 @@ struct gpio_desc *__must_check __devm_gpiod_get_index(struct device *dev, | |||
109 | EXPORT_SYMBOL(__devm_gpiod_get_index); | 109 | EXPORT_SYMBOL(__devm_gpiod_get_index); |
110 | 110 | ||
111 | /** | 111 | /** |
112 | * devm_get_gpiod_from_child - get a GPIO descriptor from a device's child node | ||
113 | * @dev: GPIO consumer | ||
114 | * @child: firmware node (child of @dev) | ||
115 | * | ||
116 | * GPIO descriptors returned from this function are automatically disposed on | ||
117 | * driver detach. | ||
118 | */ | ||
119 | struct gpio_desc *devm_get_gpiod_from_child(struct device *dev, | ||
120 | struct fwnode_handle *child) | ||
121 | { | ||
122 | struct gpio_desc **dr; | ||
123 | struct gpio_desc *desc; | ||
124 | |||
125 | dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *), | ||
126 | GFP_KERNEL); | ||
127 | if (!dr) | ||
128 | return ERR_PTR(-ENOMEM); | ||
129 | |||
130 | desc = fwnode_get_named_gpiod(child, "gpios"); | ||
131 | if (IS_ERR(desc)) { | ||
132 | devres_free(dr); | ||
133 | return desc; | ||
134 | } | ||
135 | |||
136 | *dr = desc; | ||
137 | devres_add(dev, dr); | ||
138 | |||
139 | return desc; | ||
140 | } | ||
141 | EXPORT_SYMBOL(devm_get_gpiod_from_child); | ||
142 | |||
143 | /** | ||
112 | * devm_gpiod_get_index_optional - Resource-managed gpiod_get_index_optional() | 144 | * devm_gpiod_get_index_optional - Resource-managed gpiod_get_index_optional() |
113 | * @dev: GPIO consumer | 145 | * @dev: GPIO consumer |
114 | * @con_id: function within the GPIO consumer | 146 | * @con_id: function within the GPIO consumer |