@@ -45,8 +45,6 @@ static struct pin_config {
4545 { "samsung,pin-val" , PINCFG_TYPE_DAT },
4646};
4747
48- static unsigned int pin_base ;
49-
5048static 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+
668679static 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 ;
0 commit comments