| @@ -1187,24 +1187,45 @@ EXPORT_SYMBOL_GPL(gpiochip_find); · 1186 unmodified lines |
| 1187 | 1187 | |
| 1188 | 1188 | #ifdef CONFIG_PINCTRL |
| 1189 | 1189 | |
| 1190 | +/** |
| 1191 | + * gpiochip_add_pin_range() - add a range for GPIO <-> pin mapping |
| 1192 | + * @chip: the gpiochip to add the range for |
| 1193 | + * @pinctrl_name: the dev_name() of the pin controller to map to |
| 1194 | + * @offset: the start offset in the current gpio_chip number space |
| 1195 | + * @pin_base: the start offset in the pin controller number space |
| 1196 | + * @npins: the number of pins from the offset of each pin space (GPIO and |
| 1197 | + * pin controller) to accumulate in this range |
| 1198 | + */ |
| 1190 | 1199 | int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, |
| 1191 | | − unsigned int pin_base, unsigned int npins) |
| 1200 | + unsigned int offset, unsigned int pin_base, |
| 1201 | + unsigned int npins) |
| 1192 | 1202 | { |
| 1193 | 1203 | struct gpio_pin_range *pin_range; |
| 1194 | 1204 | |
| 1195 | | − pin_range = devm_kzalloc(chip->dev, sizeof(*pin_range), GFP_KERNEL); |
| 1205 | + pin_range = kzalloc(sizeof(*pin_range), GFP_KERNEL); |
| 1196 | 1206 | if (!pin_range) { |
| 1197 | 1207 | pr_err("%s: GPIO chip: failed to allocate pin ranges\n", |
| 1198 | 1208 | chip->label); |
| 1199 | 1209 | return -ENOMEM; |
| 1200 | 1210 | } |
| 1201 | 1211 | |
| 1212 | + /* Use local offset as range ID */ |
| 1213 | + pin_range->range.id = offset; |
| 1214 | + pin_range->range.gc = chip; |
| 1202 | 1215 | pin_range->range.name = chip->label; |
| 1203 | | − pin_range->range.base = chip->base; |
| 1216 | + pin_range->range.base = chip->base + offset; |
| 1204 | 1217 | pin_range->range.pin_base = pin_base; |
| 1205 | 1218 | pin_range->range.npins = npins; |
| 1206 | 1219 | pin_range->pctldev = find_pinctrl_and_add_gpio_range(pinctl_name, |
| 1207 | 1220 | &pin_range->range); |
| 1221 | + if (!pin_range->pctldev) { |
| 1222 | + pr_err("%s: GPIO chip: could not create pin range\n", |
| 1223 | + chip->label); |
| 1224 | + kfree(pin_range); |
| 1225 | + } |
| 1226 | + pr_debug("%s: GPIO chip: created GPIO range %d->%d ==> PIN %d->%d\n", |
| 1227 | + chip->label, offset, offset + npins - 1, |
| 1228 | + pin_base, pin_base + npins - 1); |
| 1208 | 1229 | |
| 1209 | 1230 | list_add_tail(&pin_range->node, &chip->pin_ranges); |
| 1210 | 1231 | |
| @@ -1212,6 +1233,10 @@ int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, · 1 unmodified line |
| 1212 | 1233 | } |
| 1213 | 1234 | EXPORT_SYMBOL_GPL(gpiochip_add_pin_range); |
| 1214 | 1235 | |
| 1236 | +/** |
| 1237 | + * gpiochip_remove_pin_ranges() - remove all the GPIO <-> pin mappings |
| 1238 | + * @chip: the chip to remove all the mappings for |
| 1239 | + */ |
| 1215 | 1240 | void gpiochip_remove_pin_ranges(struct gpio_chip *chip) |
| 1216 | 1241 | { |
| 1217 | 1242 | struct gpio_pin_range *pin_range, *tmp; |
| @@ -1220,6 +1245,7 @@ void gpiochip_remove_pin_ranges(struct gpio_chip *chip) · 2 unmodified lines |
| 1220 | 1245 | list_del(&pin_range->node); |
| 1221 | 1246 | pinctrl_remove_gpio_range(pin_range->pctldev, |
| 1222 | 1247 | &pin_range->range); |
| 1248 | + kfree(pin_range); |
| 1223 | 1249 | } |
| 1224 | 1250 | } |
| 1225 | 1251 | EXPORT_SYMBOL_GPL(gpiochip_remove_pin_ranges); |