Skip to content

Commit bf128c1

Browse files
metiulekmkrzk
authored andcommitted
pinctrl: samsung: use add_pin_ranges method to add pinctrl ranges
This is preferable since we can read the base in the global GPIO numberspace from the chip instead of needing to select it ourselves. Past versions could not do this, since they needed to add all the ranges before enabling the pinctrl subsystem, which was done before registering the GPIO chip. However, right now we enable the pinctrl subsystem after registering the chip and so this became possible. Signed-off-by: Mateusz Majewski <m.majewski2@samsung.com> Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org> Tested-by: Sam Protsenko <semen.protsenko@linaro.org> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> Link: https://lore.kernel.org/r/20231006125557.212681-3-m.majewski2@samsung.com Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
1 parent 2aca5c5 commit bf128c1

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

drivers/pinctrl/samsung/pinctrl-samsung.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,21 @@ static int samsung_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
665665
return (virq) ? : -ENXIO;
666666
}
667667

668+
static int samsung_add_pin_ranges(struct gpio_chip *gc)
669+
{
670+
struct samsung_pin_bank *bank = gpiochip_get_data(gc);
671+
672+
bank->grange.name = bank->name;
673+
bank->grange.id = bank->id;
674+
bank->grange.pin_base = bank->drvdata->pin_base + bank->pin_base;
675+
bank->grange.base = gc->base;
676+
bank->grange.npins = bank->nr_pins;
677+
bank->grange.gc = &bank->gpio_chip;
678+
pinctrl_add_gpio_range(bank->drvdata->pctl_dev, &bank->grange);
679+
680+
return 0;
681+
}
682+
668683
static struct samsung_pin_group *samsung_pinctrl_create_groups(
669684
struct device *dev,
670685
struct samsung_pinctrl_drv_data *drvdata,
@@ -892,6 +907,7 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
892907
/* for each pin, the name of the pin is pin-bank name + pin number */
893908
for (bank = 0; bank < drvdata->nr_banks; bank++) {
894909
pin_bank = &drvdata->pin_banks[bank];
910+
pin_bank->id = bank;
895911
for (pin = 0; pin < pin_bank->nr_pins; pin++) {
896912
sprintf(pin_names, "%s-%d", pin_bank->name, pin);
897913
pdesc = pindesc + pin_bank->pin_base + pin;
@@ -911,18 +927,6 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
911927
return ret;
912928
}
913929

914-
for (bank = 0; bank < drvdata->nr_banks; ++bank) {
915-
pin_bank = &drvdata->pin_banks[bank];
916-
pin_bank->grange.name = pin_bank->name;
917-
pin_bank->grange.id = bank;
918-
pin_bank->grange.pin_base = drvdata->pin_base
919-
+ pin_bank->pin_base;
920-
pin_bank->grange.base = pin_bank->grange.pin_base;
921-
pin_bank->grange.npins = pin_bank->nr_pins;
922-
pin_bank->grange.gc = &pin_bank->gpio_chip;
923-
pinctrl_add_gpio_range(drvdata->pctl_dev, &pin_bank->grange);
924-
}
925-
926930
return 0;
927931
}
928932

@@ -947,6 +951,7 @@ static const struct gpio_chip samsung_gpiolib_chip = {
947951
.direction_input = samsung_gpio_direction_input,
948952
.direction_output = samsung_gpio_direction_output,
949953
.to_irq = samsung_gpio_to_irq,
954+
.add_pin_ranges = samsung_add_pin_ranges,
950955
.owner = THIS_MODULE,
951956
};
952957

@@ -963,7 +968,7 @@ static int samsung_gpiolib_register(struct platform_device *pdev,
963968
bank->gpio_chip = samsung_gpiolib_chip;
964969

965970
gc = &bank->gpio_chip;
966-
gc->base = bank->grange.base;
971+
gc->base = drvdata->pin_base + bank->pin_base;
967972
gc->ngpio = bank->nr_pins;
968973
gc->parent = &pdev->dev;
969974
gc->fwnode = bank->fwnode;

drivers/pinctrl/samsung/pinctrl-samsung.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ struct samsung_pin_bank_data {
148148
* @eint_mask: bit mask of pins which support EINT function.
149149
* @eint_offset: SoC-specific EINT register or interrupt offset of bank.
150150
* @name: name to be prefixed for each pin in this pin bank.
151+
* @id: id of the bank, propagated to the pin range.
151152
* @pin_base: starting pin number of the bank.
152153
* @soc_priv: per-bank private data for SoC-specific code.
153154
* @of_node: OF node of the bank.
@@ -170,6 +171,7 @@ struct samsung_pin_bank {
170171
u32 eint_mask;
171172
u32 eint_offset;
172173
const char *name;
174+
u32 id;
173175

174176
u32 pin_base;
175177
void *soc_priv;

0 commit comments

Comments
 (0)