Skip to content

Commit 30d75d3

Browse files
committed
Merge tag 'samsung-pinctrl-6.7' of https://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/samsung into devel
Samsung pinctrl drivers changes for v6.7 Few cleanups, improvements (use __counted_by annotation) and finally switch to dynamic allocation of GPIO numberspace. Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
2 parents b4e10c3 + 8aec97d commit 30d75d3

File tree

4 files changed

+33
-31
lines changed

4 files changed

+33
-31
lines changed

drivers/pinctrl/samsung/pinctrl-exynos.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,7 @@ __init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
616616
+ muxed_banks*sizeof(struct samsung_pin_bank *), GFP_KERNEL);
617617
if (!muxed_data)
618618
return -ENOMEM;
619+
muxed_data->nr_banks = muxed_banks;
619620

620621
irq_set_chained_handler_and_data(irq, exynos_irq_demux_eint16_31,
621622
muxed_data);
@@ -628,7 +629,6 @@ __init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
628629

629630
muxed_data->banks[idx++] = bank;
630631
}
631-
muxed_data->nr_banks = muxed_banks;
632632

633633
return 0;
634634
}

drivers/pinctrl/samsung/pinctrl-exynos.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ struct exynos_weint_data {
159159
*/
160160
struct exynos_muxed_weint_data {
161161
unsigned int nr_banks;
162-
struct samsung_pin_bank *banks[];
162+
struct samsung_pin_bank *banks[] __counted_by(nr_banks);
163163
};
164164

165165
int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d);

drivers/pinctrl/samsung/pinctrl-samsung.c

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ static struct pin_config {
4545
{ "samsung,pin-val", PINCFG_TYPE_DAT },
4646
};
4747

48-
static unsigned int pin_base;
49-
5048
static int samsung_get_group_count(struct pinctrl_dev *pctldev)
5149
{
5250
struct samsung_pinctrl_drv_data *pmx = pinctrl_dev_get_drvdata(pctldev);
@@ -389,8 +387,7 @@ static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
389387
func = &drvdata->pmx_functions[selector];
390388
grp = &drvdata->pin_groups[group];
391389

392-
pin_to_reg_bank(drvdata, grp->pins[0] - drvdata->pin_base,
393-
&reg, &pin_offset, &bank);
390+
pin_to_reg_bank(drvdata, grp->pins[0], &reg, &pin_offset, &bank);
394391
type = bank->type;
395392
mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;
396393
shift = pin_offset * type->fld_width[PINCFG_TYPE_FUNC];
@@ -441,8 +438,7 @@ static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin,
441438
unsigned long flags;
442439

443440
drvdata = pinctrl_dev_get_drvdata(pctldev);
444-
pin_to_reg_bank(drvdata, pin - drvdata->pin_base, &reg_base,
445-
&pin_offset, &bank);
441+
pin_to_reg_bank(drvdata, pin, &reg_base, &pin_offset, &bank);
446442
type = bank->type;
447443

448444
if (cfg_type >= PINCFG_TYPE_NUM || !type->fld_width[cfg_type])
@@ -665,6 +661,21 @@ static int samsung_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
665661
return (virq) ? : -ENXIO;
666662
}
667663

664+
static int samsung_add_pin_ranges(struct gpio_chip *gc)
665+
{
666+
struct samsung_pin_bank *bank = gpiochip_get_data(gc);
667+
668+
bank->grange.name = bank->name;
669+
bank->grange.id = bank->id;
670+
bank->grange.pin_base = bank->pin_base;
671+
bank->grange.base = gc->base;
672+
bank->grange.npins = bank->nr_pins;
673+
bank->grange.gc = &bank->gpio_chip;
674+
pinctrl_add_gpio_range(bank->drvdata->pctl_dev, &bank->grange);
675+
676+
return 0;
677+
}
678+
668679
static struct samsung_pin_group *samsung_pinctrl_create_groups(
669680
struct device *dev,
670681
struct samsung_pinctrl_drv_data *drvdata,
@@ -876,7 +887,7 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
876887

877888
/* dynamically populate the pin number and pin name for pindesc */
878889
for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++)
879-
pdesc->number = pin + drvdata->pin_base;
890+
pdesc->number = pin;
880891

881892
/*
882893
* allocate space for storing the dynamically generated names for all
@@ -892,6 +903,7 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
892903
/* for each pin, the name of the pin is pin-bank name + pin number */
893904
for (bank = 0; bank < drvdata->nr_banks; bank++) {
894905
pin_bank = &drvdata->pin_banks[bank];
906+
pin_bank->id = bank;
895907
for (pin = 0; pin < pin_bank->nr_pins; pin++) {
896908
sprintf(pin_names, "%s-%d", pin_bank->name, pin);
897909
pdesc = pindesc + pin_bank->pin_base + pin;
@@ -904,23 +916,11 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
904916
if (ret)
905917
return ret;
906918

907-
drvdata->pctl_dev = devm_pinctrl_register(&pdev->dev, ctrldesc,
908-
drvdata);
909-
if (IS_ERR(drvdata->pctl_dev)) {
919+
ret = devm_pinctrl_register_and_init(&pdev->dev, ctrldesc, drvdata,
920+
&drvdata->pctl_dev);
921+
if (ret) {
910922
dev_err(&pdev->dev, "could not register pinctrl driver\n");
911-
return PTR_ERR(drvdata->pctl_dev);
912-
}
913-
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);
923+
return ret;
924924
}
925925

926926
return 0;
@@ -947,6 +947,7 @@ static const struct gpio_chip samsung_gpiolib_chip = {
947947
.direction_input = samsung_gpio_direction_input,
948948
.direction_output = samsung_gpio_direction_output,
949949
.to_irq = samsung_gpio_to_irq,
950+
.add_pin_ranges = samsung_add_pin_ranges,
950951
.owner = THIS_MODULE,
951952
};
952953

@@ -963,7 +964,7 @@ static int samsung_gpiolib_register(struct platform_device *pdev,
963964
bank->gpio_chip = samsung_gpiolib_chip;
964965

965966
gc = &bank->gpio_chip;
966-
gc->base = bank->grange.base;
967+
gc->base = -1; /* Dynamic allocation */
967968
gc->ngpio = bank->nr_pins;
968969
gc->parent = &pdev->dev;
969970
gc->fwnode = bank->fwnode;
@@ -1124,9 +1125,6 @@ samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d,
11241125

11251126
samsung_banks_node_get(&pdev->dev, d);
11261127

1127-
d->pin_base = pin_base;
1128-
pin_base += d->nr_pins;
1129-
11301128
return ctrl;
11311129
}
11321130

@@ -1176,6 +1174,10 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
11761174
if (ret)
11771175
goto err_unregister;
11781176

1177+
ret = pinctrl_enable(drvdata->pctl_dev);
1178+
if (ret)
1179+
goto err_unregister;
1180+
11791181
platform_set_drvdata(pdev, drvdata);
11801182

11811183
return 0;

drivers/pinctrl/samsung/pinctrl-samsung.h

Lines changed: 2 additions & 2 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;
@@ -267,7 +269,6 @@ struct samsung_pin_ctrl {
267269
* @nr_groups: number of such pin groups.
268270
* @pmx_functions: list of pin functions available to the driver.
269271
* @nr_function: number of such pin functions.
270-
* @pin_base: starting system wide pin number.
271272
* @nr_pins: number of pins supported by the controller.
272273
* @retention_ctrl: retention control runtime data.
273274
* @suspend: platform specific suspend callback, executed during pin controller
@@ -291,7 +292,6 @@ struct samsung_pinctrl_drv_data {
291292

292293
struct samsung_pin_bank *pin_banks;
293294
unsigned int nr_banks;
294-
unsigned int pin_base;
295295
unsigned int nr_pins;
296296

297297
struct samsung_retention_ctrl *retention_ctrl;

0 commit comments

Comments
 (0)