diff options
Diffstat (limited to 'drivers/gpio/devres.c')
-rw-r--r-- | drivers/gpio/devres.c | 18 |
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 | */ |
119 | struct gpio_desc *devm_get_gpiod_from_child(struct device *dev, | 120 | struct 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; |