29
29
#define ocelot_clrsetbits (addr , clear , set ) \
30
30
writel((readl(addr) & ~(clear)) | (set), (addr))
31
31
32
- /* PINCONFIG bits (sparx5 only) */
33
32
enum {
34
33
PINCONF_BIAS ,
35
34
PINCONF_SCHMITT ,
36
35
PINCONF_DRIVE_STRENGTH ,
37
36
};
38
37
39
- #define BIAS_PD_BIT BIT(4)
40
- #define BIAS_PU_BIT BIT(3)
41
- #define BIAS_BITS (BIAS_PD_BIT|BIAS_PU_BIT)
42
- #define SCHMITT_BIT BIT(2)
43
- #define DRIVE_BITS GENMASK(1, 0)
44
-
45
38
/* GPIO standard registers */
46
39
#define OCELOT_GPIO_OUT_SET 0x0
47
40
#define OCELOT_GPIO_OUT_CLR 0x4
@@ -321,17 +314,30 @@ struct ocelot_pin_caps {
321
314
unsigned char a_functions [OCELOT_FUNC_PER_PIN ]; /* Additional functions */
322
315
};
323
316
317
+ struct ocelot_pincfg_data {
318
+ u8 pd_bit ;
319
+ u8 pu_bit ;
320
+ u8 drive_bits ;
321
+ u8 schmitt_bit ;
322
+ };
323
+
324
324
struct ocelot_pinctrl {
325
325
struct device * dev ;
326
326
struct pinctrl_dev * pctl ;
327
327
struct gpio_chip gpio_chip ;
328
328
struct regmap * map ;
329
329
struct regmap * pincfg ;
330
330
struct pinctrl_desc * desc ;
331
+ const struct ocelot_pincfg_data * pincfg_data ;
331
332
struct ocelot_pmx_func func [FUNC_MAX ];
332
333
u8 stride ;
333
334
};
334
335
336
+ struct ocelot_match_data {
337
+ struct pinctrl_desc desc ;
338
+ struct ocelot_pincfg_data pincfg_data ;
339
+ };
340
+
335
341
#define LUTON_P (p , f0 , f1 ) \
336
342
static struct ocelot_pin_caps luton_pin_##p = { \
337
343
.pin = p, \
@@ -1325,6 +1331,7 @@ static int ocelot_hw_get_value(struct ocelot_pinctrl *info,
1325
1331
int ret = - EOPNOTSUPP ;
1326
1332
1327
1333
if (info -> pincfg ) {
1334
+ const struct ocelot_pincfg_data * opd = info -> pincfg_data ;
1328
1335
u32 regcfg ;
1329
1336
1330
1337
ret = regmap_read (info -> pincfg , pin , & regcfg );
@@ -1334,15 +1341,15 @@ static int ocelot_hw_get_value(struct ocelot_pinctrl *info,
1334
1341
ret = 0 ;
1335
1342
switch (reg ) {
1336
1343
case PINCONF_BIAS :
1337
- * val = regcfg & BIAS_BITS ;
1344
+ * val = regcfg & ( opd -> pd_bit | opd -> pu_bit ) ;
1338
1345
break ;
1339
1346
1340
1347
case PINCONF_SCHMITT :
1341
- * val = regcfg & SCHMITT_BIT ;
1348
+ * val = regcfg & opd -> schmitt_bit ;
1342
1349
break ;
1343
1350
1344
1351
case PINCONF_DRIVE_STRENGTH :
1345
- * val = regcfg & DRIVE_BITS ;
1352
+ * val = regcfg & opd -> drive_bits ;
1346
1353
break ;
1347
1354
1348
1355
default :
@@ -1379,23 +1386,27 @@ static int ocelot_hw_set_value(struct ocelot_pinctrl *info,
1379
1386
int ret = - EOPNOTSUPP ;
1380
1387
1381
1388
if (info -> pincfg ) {
1389
+ const struct ocelot_pincfg_data * opd = info -> pincfg_data ;
1382
1390
1383
1391
ret = 0 ;
1384
1392
switch (reg ) {
1385
1393
case PINCONF_BIAS :
1386
- ret = ocelot_pincfg_clrsetbits (info , pin , BIAS_BITS ,
1394
+ ret = ocelot_pincfg_clrsetbits (info , pin ,
1395
+ opd -> pd_bit | opd -> pu_bit ,
1387
1396
val );
1388
1397
break ;
1389
1398
1390
1399
case PINCONF_SCHMITT :
1391
- ret = ocelot_pincfg_clrsetbits (info , pin , SCHMITT_BIT ,
1400
+ ret = ocelot_pincfg_clrsetbits (info , pin ,
1401
+ opd -> schmitt_bit ,
1392
1402
val );
1393
1403
break ;
1394
1404
1395
1405
case PINCONF_DRIVE_STRENGTH :
1396
1406
if (val <= 3 )
1397
1407
ret = ocelot_pincfg_clrsetbits (info , pin ,
1398
- DRIVE_BITS , val );
1408
+ opd -> drive_bits ,
1409
+ val );
1399
1410
else
1400
1411
ret = - EINVAL ;
1401
1412
break ;
@@ -1425,17 +1436,20 @@ static int ocelot_pinconf_get(struct pinctrl_dev *pctldev,
1425
1436
if (param == PIN_CONFIG_BIAS_DISABLE )
1426
1437
val = (val == 0 );
1427
1438
else if (param == PIN_CONFIG_BIAS_PULL_DOWN )
1428
- val = (val & BIAS_PD_BIT ? true : false );
1439
+ val = !! (val & info -> pincfg_data -> pd_bit );
1429
1440
else /* PIN_CONFIG_BIAS_PULL_UP */
1430
- val = (val & BIAS_PU_BIT ? true : false );
1441
+ val = !! (val & info -> pincfg_data -> pu_bit );
1431
1442
break ;
1432
1443
1433
1444
case PIN_CONFIG_INPUT_SCHMITT_ENABLE :
1445
+ if (!info -> pincfg_data -> schmitt_bit )
1446
+ return - EOPNOTSUPP ;
1447
+
1434
1448
err = ocelot_hw_get_value (info , pin , PINCONF_SCHMITT , & val );
1435
1449
if (err )
1436
1450
return err ;
1437
1451
1438
- val = (val & SCHMITT_BIT ? true : false );
1452
+ val = !! (val & info -> pincfg_data -> schmitt_bit );
1439
1453
break ;
1440
1454
1441
1455
case PIN_CONFIG_DRIVE_STRENGTH :
@@ -1479,6 +1493,7 @@ static int ocelot_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
1479
1493
unsigned long * configs , unsigned int num_configs )
1480
1494
{
1481
1495
struct ocelot_pinctrl * info = pinctrl_dev_get_drvdata (pctldev );
1496
+ const struct ocelot_pincfg_data * opd = info -> pincfg_data ;
1482
1497
u32 param , arg , p ;
1483
1498
int cfg , err = 0 ;
1484
1499
@@ -1491,8 +1506,8 @@ static int ocelot_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
1491
1506
case PIN_CONFIG_BIAS_PULL_UP :
1492
1507
case PIN_CONFIG_BIAS_PULL_DOWN :
1493
1508
arg = (param == PIN_CONFIG_BIAS_DISABLE ) ? 0 :
1494
- (param == PIN_CONFIG_BIAS_PULL_UP ) ? BIAS_PU_BIT :
1495
- BIAS_PD_BIT ;
1509
+ (param == PIN_CONFIG_BIAS_PULL_UP ) ?
1510
+ opd -> pu_bit : opd -> pd_bit ;
1496
1511
1497
1512
err = ocelot_hw_set_value (info , pin , PINCONF_BIAS , arg );
1498
1513
if (err )
@@ -1501,7 +1516,10 @@ static int ocelot_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
1501
1516
break ;
1502
1517
1503
1518
case PIN_CONFIG_INPUT_SCHMITT_ENABLE :
1504
- arg = arg ? SCHMITT_BIT : 0 ;
1519
+ if (!opd -> schmitt_bit )
1520
+ return - EOPNOTSUPP ;
1521
+
1522
+ arg = arg ? opd -> schmitt_bit : 0 ;
1505
1523
err = ocelot_hw_set_value (info , pin , PINCONF_SCHMITT ,
1506
1524
arg );
1507
1525
if (err )
@@ -1562,69 +1580,94 @@ static const struct pinctrl_ops ocelot_pctl_ops = {
1562
1580
.dt_free_map = pinconf_generic_dt_free_map ,
1563
1581
};
1564
1582
1565
- static struct pinctrl_desc luton_desc = {
1566
- .name = "luton-pinctrl" ,
1567
- .pins = luton_pins ,
1568
- .npins = ARRAY_SIZE (luton_pins ),
1569
- .pctlops = & ocelot_pctl_ops ,
1570
- .pmxops = & ocelot_pmx_ops ,
1571
- .owner = THIS_MODULE ,
1583
+ static struct ocelot_match_data luton_desc = {
1584
+ .desc = {
1585
+ .name = "luton-pinctrl" ,
1586
+ .pins = luton_pins ,
1587
+ .npins = ARRAY_SIZE (luton_pins ),
1588
+ .pctlops = & ocelot_pctl_ops ,
1589
+ .pmxops = & ocelot_pmx_ops ,
1590
+ .owner = THIS_MODULE ,
1591
+ },
1572
1592
};
1573
1593
1574
- static struct pinctrl_desc serval_desc = {
1575
- .name = "serval-pinctrl" ,
1576
- .pins = serval_pins ,
1577
- .npins = ARRAY_SIZE (serval_pins ),
1578
- .pctlops = & ocelot_pctl_ops ,
1579
- .pmxops = & ocelot_pmx_ops ,
1580
- .owner = THIS_MODULE ,
1594
+ static struct ocelot_match_data serval_desc = {
1595
+ .desc = {
1596
+ .name = "serval-pinctrl" ,
1597
+ .pins = serval_pins ,
1598
+ .npins = ARRAY_SIZE (serval_pins ),
1599
+ .pctlops = & ocelot_pctl_ops ,
1600
+ .pmxops = & ocelot_pmx_ops ,
1601
+ .owner = THIS_MODULE ,
1602
+ },
1581
1603
};
1582
1604
1583
- static struct pinctrl_desc ocelot_desc = {
1584
- .name = "ocelot-pinctrl" ,
1585
- .pins = ocelot_pins ,
1586
- .npins = ARRAY_SIZE (ocelot_pins ),
1587
- .pctlops = & ocelot_pctl_ops ,
1588
- .pmxops = & ocelot_pmx_ops ,
1589
- .owner = THIS_MODULE ,
1605
+ static struct ocelot_match_data ocelot_desc = {
1606
+ .desc = {
1607
+ .name = "ocelot-pinctrl" ,
1608
+ .pins = ocelot_pins ,
1609
+ .npins = ARRAY_SIZE (ocelot_pins ),
1610
+ .pctlops = & ocelot_pctl_ops ,
1611
+ .pmxops = & ocelot_pmx_ops ,
1612
+ .owner = THIS_MODULE ,
1613
+ },
1590
1614
};
1591
1615
1592
- static struct pinctrl_desc jaguar2_desc = {
1593
- .name = "jaguar2-pinctrl" ,
1594
- .pins = jaguar2_pins ,
1595
- .npins = ARRAY_SIZE (jaguar2_pins ),
1596
- .pctlops = & ocelot_pctl_ops ,
1597
- .pmxops = & ocelot_pmx_ops ,
1598
- .owner = THIS_MODULE ,
1616
+ static struct ocelot_match_data jaguar2_desc = {
1617
+ .desc = {
1618
+ .name = "jaguar2-pinctrl" ,
1619
+ .pins = jaguar2_pins ,
1620
+ .npins = ARRAY_SIZE (jaguar2_pins ),
1621
+ .pctlops = & ocelot_pctl_ops ,
1622
+ .pmxops = & ocelot_pmx_ops ,
1623
+ .owner = THIS_MODULE ,
1624
+ },
1599
1625
};
1600
1626
1601
- static struct pinctrl_desc servalt_desc = {
1602
- .name = "servalt-pinctrl" ,
1603
- .pins = servalt_pins ,
1604
- .npins = ARRAY_SIZE (servalt_pins ),
1605
- .pctlops = & ocelot_pctl_ops ,
1606
- .pmxops = & ocelot_pmx_ops ,
1607
- .owner = THIS_MODULE ,
1627
+ static struct ocelot_match_data servalt_desc = {
1628
+ .desc = {
1629
+ .name = "servalt-pinctrl" ,
1630
+ .pins = servalt_pins ,
1631
+ .npins = ARRAY_SIZE (servalt_pins ),
1632
+ .pctlops = & ocelot_pctl_ops ,
1633
+ .pmxops = & ocelot_pmx_ops ,
1634
+ .owner = THIS_MODULE ,
1635
+ },
1608
1636
};
1609
1637
1610
- static struct pinctrl_desc sparx5_desc = {
1611
- .name = "sparx5-pinctrl" ,
1612
- .pins = sparx5_pins ,
1613
- .npins = ARRAY_SIZE (sparx5_pins ),
1614
- .pctlops = & ocelot_pctl_ops ,
1615
- .pmxops = & ocelot_pmx_ops ,
1616
- .confops = & ocelot_confops ,
1617
- .owner = THIS_MODULE ,
1638
+ static struct ocelot_match_data sparx5_desc = {
1639
+ .desc = {
1640
+ .name = "sparx5-pinctrl" ,
1641
+ .pins = sparx5_pins ,
1642
+ .npins = ARRAY_SIZE (sparx5_pins ),
1643
+ .pctlops = & ocelot_pctl_ops ,
1644
+ .pmxops = & ocelot_pmx_ops ,
1645
+ .confops = & ocelot_confops ,
1646
+ .owner = THIS_MODULE ,
1647
+ },
1648
+ .pincfg_data = {
1649
+ .pd_bit = BIT (4 ),
1650
+ .pu_bit = BIT (3 ),
1651
+ .drive_bits = GENMASK (1 , 0 ),
1652
+ .schmitt_bit = BIT (2 ),
1653
+ },
1618
1654
};
1619
1655
1620
- static struct pinctrl_desc lan966x_desc = {
1621
- .name = "lan966x-pinctrl" ,
1622
- .pins = lan966x_pins ,
1623
- .npins = ARRAY_SIZE (lan966x_pins ),
1624
- .pctlops = & ocelot_pctl_ops ,
1625
- .pmxops = & lan966x_pmx_ops ,
1626
- .confops = & ocelot_confops ,
1627
- .owner = THIS_MODULE ,
1656
+ static struct ocelot_match_data lan966x_desc = {
1657
+ .desc = {
1658
+ .name = "lan966x-pinctrl" ,
1659
+ .pins = lan966x_pins ,
1660
+ .npins = ARRAY_SIZE (lan966x_pins ),
1661
+ .pctlops = & ocelot_pctl_ops ,
1662
+ .pmxops = & lan966x_pmx_ops ,
1663
+ .confops = & ocelot_confops ,
1664
+ .owner = THIS_MODULE ,
1665
+ },
1666
+ .pincfg_data = {
1667
+ .pd_bit = BIT (3 ),
1668
+ .pu_bit = BIT (2 ),
1669
+ .drive_bits = GENMASK (1 , 0 ),
1670
+ },
1628
1671
};
1629
1672
1630
1673
static int ocelot_create_group_func_map (struct device * dev ,
@@ -1913,6 +1956,7 @@ static struct regmap *ocelot_pinctrl_create_pincfg(struct platform_device *pdev)
1913
1956
1914
1957
static int ocelot_pinctrl_probe (struct platform_device * pdev )
1915
1958
{
1959
+ const struct ocelot_match_data * data ;
1916
1960
struct device * dev = & pdev -> dev ;
1917
1961
struct ocelot_pinctrl * info ;
1918
1962
struct reset_control * reset ;
@@ -1929,7 +1973,16 @@ static int ocelot_pinctrl_probe(struct platform_device *pdev)
1929
1973
if (!info )
1930
1974
return - ENOMEM ;
1931
1975
1932
- info -> desc = (struct pinctrl_desc * )device_get_match_data (dev );
1976
+ data = device_get_match_data (dev );
1977
+ if (!data )
1978
+ return - EINVAL ;
1979
+
1980
+ info -> desc = devm_kmemdup (dev , & data -> desc , sizeof (* info -> desc ),
1981
+ GFP_KERNEL );
1982
+ if (!info -> desc )
1983
+ return - ENOMEM ;
1984
+
1985
+ info -> pincfg_data = & data -> pincfg_data ;
1933
1986
1934
1987
reset = devm_reset_control_get_optional_shared (dev , "switch" );
1935
1988
if (IS_ERR (reset ))
0 commit comments