aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/devres.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpio/devres.c')
-rw-r--r--drivers/gpio/devres.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/gpio/devres.c b/drivers/gpio/devres.c
index 13dbd3dfc33a..12c2082f968e 100644
--- a/drivers/gpio/devres.c
+++ b/drivers/gpio/devres.c
@@ -111,23 +111,39 @@ EXPORT_SYMBOL(__devm_gpiod_get_index);
111/** 111/**
112 * devm_get_gpiod_from_child - get a GPIO descriptor from a device's child node 112 * devm_get_gpiod_from_child - get a GPIO descriptor from a device's child node
113 * @dev: GPIO consumer 113 * @dev: GPIO consumer
114 * @con_id: function within the GPIO consumer
114 * @child: firmware node (child of @dev) 115 * @child: firmware node (child of @dev)
115 * 116 *
116 * GPIO descriptors returned from this function are automatically disposed on 117 * GPIO descriptors returned from this function are automatically disposed on
117 * driver detach. 118 * driver detach.
118 */ 119 */
119struct gpio_desc *devm_get_gpiod_from_child(struct device *dev, 120struct gpio_desc *devm_get_gpiod_from_child(struct device *dev,
121 const char *con_id,
120 struct fwnode_handle *child) 122 struct fwnode_handle *child)
121{ 123{
124 static const char const *suffixes[] = { "gpios", "gpio" };
125 char prop_name[32]; /* 32 is max size of property name */
122 struct gpio_desc **dr; 126 struct gpio_desc **dr;
123 struct gpio_desc *desc; 127 struct gpio_desc *desc;
128 unsigned int i;
124 129
125 dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *), 130 dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *),
126 GFP_KERNEL); 131 GFP_KERNEL);
127 if (!dr) 132 if (!dr)
128 return ERR_PTR(-ENOMEM); 133 return ERR_PTR(-ENOMEM);
129 134
130 desc = fwnode_get_named_gpiod(child, "gpios"); 135 for (i = 0; i < ARRAY_SIZE(suffixes); i++) {
136 if (con_id)
137 snprintf(prop_name, sizeof(prop_name), "%s-%s",
138 con_id, suffixes[i]);
139 else
140 snprintf(prop_name, sizeof(prop_name), "%s",
141 suffixes[i]);
142
143 desc = fwnode_get_named_gpiod(child, prop_name);
144 if (!IS_ERR(desc) || (PTR_ERR(desc) == -EPROBE_DEFER))
145 break;
146 }
131 if (IS_ERR(desc)) { 147 if (IS_ERR(desc)) {
132 devres_free(dr); 148 devres_free(dr);
133 return desc; 149 return desc;