Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+33 -31
+1 -1
drivers/pinctrl/samsung/pinctrl-exynos.c
··· 616 616 + muxed_banks*sizeof(struct samsung_pin_bank *), GFP_KERNEL); 617 617 if (!muxed_data) 618 618 return -ENOMEM; 619 + muxed_data->nr_banks = muxed_banks; 619 620 620 621 irq_set_chained_handler_and_data(irq, exynos_irq_demux_eint16_31, 621 622 muxed_data); ··· 629 628 630 629 muxed_data->banks[idx++] = bank; 631 630 } 632 - muxed_data->nr_banks = muxed_banks; 633 631 634 632 return 0; 635 633 }
+1 -1
drivers/pinctrl/samsung/pinctrl-exynos.h
··· 159 159 */ 160 160 struct exynos_muxed_weint_data { 161 161 unsigned int nr_banks; 162 - struct samsung_pin_bank *banks[]; 162 + struct samsung_pin_bank *banks[] __counted_by(nr_banks); 163 163 }; 164 164 165 165 int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d);
+29 -27
drivers/pinctrl/samsung/pinctrl-samsung.c
··· 45 45 { "samsung,pin-val", PINCFG_TYPE_DAT }, 46 46 }; 47 47 48 - static unsigned int pin_base; 49 - 50 48 static int samsung_get_group_count(struct pinctrl_dev *pctldev) 51 49 { 52 50 struct samsung_pinctrl_drv_data *pmx = pinctrl_dev_get_drvdata(pctldev); ··· 387 389 func = &drvdata->pmx_functions[selector]; 388 390 grp = &drvdata->pin_groups[group]; 389 391 390 - pin_to_reg_bank(drvdata, grp->pins[0] - drvdata->pin_base, 391 - &reg, &pin_offset, &bank); 392 + pin_to_reg_bank(drvdata, grp->pins[0], &reg, &pin_offset, &bank); 392 393 type = bank->type; 393 394 mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1; 394 395 shift = pin_offset * type->fld_width[PINCFG_TYPE_FUNC]; ··· 438 441 unsigned long flags; 439 442 440 443 drvdata = pinctrl_dev_get_drvdata(pctldev); 441 - pin_to_reg_bank(drvdata, pin - drvdata->pin_base, &reg_base, 442 - &pin_offset, &bank); 444 + pin_to_reg_bank(drvdata, pin, &reg_base, &pin_offset, &bank); 443 445 type = bank->type; 444 446 445 447 if (cfg_type >= PINCFG_TYPE_NUM || !type->fld_width[cfg_type]) ··· 661 665 return (virq) ? : -ENXIO; 662 666 } 663 667 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->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 + 664 683 static struct samsung_pin_group *samsung_pinctrl_create_groups( 665 684 struct device *dev, 666 685 struct samsung_pinctrl_drv_data *drvdata, ··· 887 876 888 877 /* dynamically populate the pin number and pin name for pindesc */ 889 878 for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++) 890 - pdesc->number = pin + drvdata->pin_base; 879 + pdesc->number = pin; 891 880 892 881 /* 893 882 * allocate space for storing the dynamically generated names for all ··· 903 892 /* for each pin, the name of the pin is pin-bank name + pin number */ 904 893 for (bank = 0; bank < drvdata->nr_banks; bank++) { 905 894 pin_bank = &drvdata->pin_banks[bank]; 895 + pin_bank->id = bank; 906 896 for (pin = 0; pin < pin_bank->nr_pins; pin++) { 907 897 sprintf(pin_names, "%s-%d", pin_bank->name, pin); 908 898 pdesc = pindesc + pin_bank->pin_base + pin; ··· 916 904 if (ret) 917 905 return ret; 918 906 919 - drvdata->pctl_dev = devm_pinctrl_register(&pdev->dev, ctrldesc, 920 - drvdata); 921 - if (IS_ERR(drvdata->pctl_dev)) { 907 + ret = devm_pinctrl_register_and_init(&pdev->dev, ctrldesc, drvdata, 908 + &drvdata->pctl_dev); 909 + if (ret) { 922 910 dev_err(&pdev->dev, "could not register pinctrl driver\n"); 923 - return PTR_ERR(drvdata->pctl_dev); 924 - } 925 - 926 - for (bank = 0; bank < drvdata->nr_banks; ++bank) { 927 - pin_bank = &drvdata->pin_banks[bank]; 928 - pin_bank->grange.name = pin_bank->name; 929 - pin_bank->grange.id = bank; 930 - pin_bank->grange.pin_base = drvdata->pin_base 931 - + pin_bank->pin_base; 932 - pin_bank->grange.base = pin_bank->grange.pin_base; 933 - pin_bank->grange.npins = pin_bank->nr_pins; 934 - pin_bank->grange.gc = &pin_bank->gpio_chip; 935 - pinctrl_add_gpio_range(drvdata->pctl_dev, &pin_bank->grange); 911 + return ret; 936 912 } 937 913 938 914 return 0; ··· 947 947 .direction_input = samsung_gpio_direction_input, 948 948 .direction_output = samsung_gpio_direction_output, 949 949 .to_irq = samsung_gpio_to_irq, 950 + .add_pin_ranges = samsung_add_pin_ranges, 950 951 .owner = THIS_MODULE, 951 952 }; 952 953 ··· 964 963 bank->gpio_chip = samsung_gpiolib_chip; 965 964 966 965 gc = &bank->gpio_chip; 967 - gc->base = bank->grange.base; 966 + gc->base = -1; /* Dynamic allocation */ 968 967 gc->ngpio = bank->nr_pins; 969 968 gc->parent = &pdev->dev; 970 969 gc->fwnode = bank->fwnode; ··· 1125 1124 1126 1125 samsung_banks_node_get(&pdev->dev, d); 1127 1126 1128 - d->pin_base = pin_base; 1129 - pin_base += d->nr_pins; 1130 - 1131 1127 return ctrl; 1132 1128 } 1133 1129 ··· 1171 1173 ctrl->eint_wkup_init(drvdata); 1172 1174 1173 1175 ret = samsung_gpiolib_register(pdev, drvdata); 1176 + if (ret) 1177 + goto err_unregister; 1178 + 1179 + ret = pinctrl_enable(drvdata->pctl_dev); 1174 1180 if (ret) 1175 1181 goto err_unregister; 1176 1182
+2 -2
drivers/pinctrl/samsung/pinctrl-samsung.h
··· 148 148 * @eint_mask: bit mask of pins which support EINT function. 149 149 * @eint_offset: SoC-specific EINT register or interrupt offset of bank. 150 150 * @name: name to be prefixed for each pin in this pin bank. 151 + * @id: id of the bank, propagated to the pin range. 151 152 * @pin_base: starting pin number of the bank. 152 153 * @soc_priv: per-bank private data for SoC-specific code. 153 154 * @of_node: OF node of the bank. ··· 171 170 u32 eint_mask; 172 171 u32 eint_offset; 173 172 const char *name; 173 + u32 id; 174 174 175 175 u32 pin_base; 176 176 void *soc_priv; ··· 269 267 * @nr_groups: number of such pin groups. 270 268 * @pmx_functions: list of pin functions available to the driver. 271 269 * @nr_function: number of such pin functions. 272 - * @pin_base: starting system wide pin number. 273 270 * @nr_pins: number of pins supported by the controller. 274 271 * @retention_ctrl: retention control runtime data. 275 272 * @suspend: platform specific suspend callback, executed during pin controller ··· 292 291 293 292 struct samsung_pin_bank *pin_banks; 294 293 unsigned int nr_banks; 295 - unsigned int pin_base; 296 294 unsigned int nr_pins; 297 295 298 296 struct samsung_retention_ctrl *retention_ctrl;