@@ -45,8 +45,6 @@ static struct pin_config {
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 );
@@ -389,8 +387,7 @@ static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
389
387
func = & drvdata -> pmx_functions [selector ];
390
388
grp = & drvdata -> pin_groups [group ];
391
389
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 );
394
391
type = bank -> type ;
395
392
mask = (1 << type -> fld_width [PINCFG_TYPE_FUNC ]) - 1 ;
396
393
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,
441
438
unsigned long flags ;
442
439
443
440
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 );
446
442
type = bank -> type ;
447
443
448
444
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)
665
661
return (virq ) ? : - ENXIO ;
666
662
}
667
663
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
+
668
679
static struct samsung_pin_group * samsung_pinctrl_create_groups (
669
680
struct device * dev ,
670
681
struct samsung_pinctrl_drv_data * drvdata ,
@@ -876,7 +887,7 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
876
887
877
888
/* dynamically populate the pin number and pin name for pindesc */
878
889
for (pin = 0 , pdesc = pindesc ; pin < ctrldesc -> npins ; pin ++ , pdesc ++ )
879
- pdesc -> number = pin + drvdata -> pin_base ;
890
+ pdesc -> number = pin ;
880
891
881
892
/*
882
893
* allocate space for storing the dynamically generated names for all
@@ -892,6 +903,7 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
892
903
/* for each pin, the name of the pin is pin-bank name + pin number */
893
904
for (bank = 0 ; bank < drvdata -> nr_banks ; bank ++ ) {
894
905
pin_bank = & drvdata -> pin_banks [bank ];
906
+ pin_bank -> id = bank ;
895
907
for (pin = 0 ; pin < pin_bank -> nr_pins ; pin ++ ) {
896
908
sprintf (pin_names , "%s-%d" , pin_bank -> name , pin );
897
909
pdesc = pindesc + pin_bank -> pin_base + pin ;
@@ -904,23 +916,11 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
904
916
if (ret )
905
917
return ret ;
906
918
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 ) {
910
922
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 ;
924
924
}
925
925
926
926
return 0 ;
@@ -947,6 +947,7 @@ static const struct gpio_chip samsung_gpiolib_chip = {
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
@@ -963,7 +964,7 @@ static int samsung_gpiolib_register(struct platform_device *pdev,
963
964
bank -> gpio_chip = samsung_gpiolib_chip ;
964
965
965
966
gc = & bank -> gpio_chip ;
966
- gc -> base = bank -> grange . base ;
967
+ gc -> base = -1 ; /* Dynamic allocation */
967
968
gc -> ngpio = bank -> nr_pins ;
968
969
gc -> parent = & pdev -> dev ;
969
970
gc -> fwnode = bank -> fwnode ;
@@ -1124,9 +1125,6 @@ samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d,
1124
1125
1125
1126
samsung_banks_node_get (& pdev -> dev , d );
1126
1127
1127
- d -> pin_base = pin_base ;
1128
- pin_base += d -> nr_pins ;
1129
-
1130
1128
return ctrl ;
1131
1129
}
1132
1130
@@ -1176,6 +1174,10 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
1176
1174
if (ret )
1177
1175
goto err_unregister ;
1178
1176
1177
+ ret = pinctrl_enable (drvdata -> pctl_dev );
1178
+ if (ret )
1179
+ goto err_unregister ;
1180
+
1179
1181
platform_set_drvdata (pdev , drvdata );
1180
1182
1181
1183
return 0 ;
0 commit comments