cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pinctrl-bcm63268.c (16512B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Driver for BCM63268 GPIO unit (pinctrl + GPIO)
      4 *
      5 * Copyright (C) 2021 Álvaro Fernández Rojas <noltari@gmail.com>
      6 * Copyright (C) 2016 Jonas Gorski <jonas.gorski@gmail.com>
      7 */
      8
      9#include <linux/bits.h>
     10#include <linux/gpio/driver.h>
     11#include <linux/kernel.h>
     12#include <linux/of.h>
     13#include <linux/pinctrl/pinmux.h>
     14#include <linux/platform_device.h>
     15#include <linux/regmap.h>
     16
     17#include "../pinctrl-utils.h"
     18
     19#include "pinctrl-bcm63xx.h"
     20
     21#define BCM63268_NUM_GPIOS		52
     22#define BCM63268_NUM_LEDS		24
     23
     24#define BCM63268_LED_REG		0x10
     25#define BCM63268_MODE_REG		0x18
     26#define BCM63268_CTRL_REG		0x1c
     27#define BCM63268_BASEMODE_REG		0x38
     28#define  BCM63268_BASEMODE_NAND		BIT(2) /* GPIOs 2-7, 24-31 */
     29#define  BCM63268_BASEMODE_GPIO35	BIT(4) /* GPIO 35 */
     30#define  BCM63268_BASEMODE_DECTPD	BIT(5) /* GPIOs 8/9 */
     31#define  BCM63268_BASEMODE_VDSL_PHY_0	BIT(6) /* GPIOs 10/11 */
     32#define  BCM63268_BASEMODE_VDSL_PHY_1	BIT(7) /* GPIOs 12/13 */
     33#define  BCM63268_BASEMODE_VDSL_PHY_2	BIT(8) /* GPIOs 24/25 */
     34#define  BCM63268_BASEMODE_VDSL_PHY_3	BIT(9) /* GPIOs 26/27 */
     35
     36enum bcm63268_pinctrl_reg {
     37	BCM63268_LEDCTRL,
     38	BCM63268_MODE,
     39	BCM63268_CTRL,
     40	BCM63268_BASEMODE,
     41};
     42
     43struct bcm63268_pingroup {
     44	const char *name;
     45	const unsigned * const pins;
     46	const unsigned num_pins;
     47};
     48
     49struct bcm63268_function {
     50	const char *name;
     51	const char * const *groups;
     52	const unsigned num_groups;
     53
     54	enum bcm63268_pinctrl_reg reg;
     55	uint32_t mask;
     56};
     57
     58#define BCM63268_PIN(a, b, basemode)			\
     59	{						\
     60		.number = a,				\
     61		.name = b,				\
     62		.drv_data = (void *)(basemode)		\
     63	}
     64
     65static const struct pinctrl_pin_desc bcm63268_pins[] = {
     66	PINCTRL_PIN(0, "gpio0"),
     67	PINCTRL_PIN(1, "gpio1"),
     68	BCM63268_PIN(2, "gpio2", BCM63268_BASEMODE_NAND),
     69	BCM63268_PIN(3, "gpio3", BCM63268_BASEMODE_NAND),
     70	BCM63268_PIN(4, "gpio4", BCM63268_BASEMODE_NAND),
     71	BCM63268_PIN(5, "gpio5", BCM63268_BASEMODE_NAND),
     72	BCM63268_PIN(6, "gpio6", BCM63268_BASEMODE_NAND),
     73	BCM63268_PIN(7, "gpio7", BCM63268_BASEMODE_NAND),
     74	BCM63268_PIN(8, "gpio8", BCM63268_BASEMODE_DECTPD),
     75	BCM63268_PIN(9, "gpio9", BCM63268_BASEMODE_DECTPD),
     76	BCM63268_PIN(10, "gpio10", BCM63268_BASEMODE_VDSL_PHY_0),
     77	BCM63268_PIN(11, "gpio11", BCM63268_BASEMODE_VDSL_PHY_0),
     78	BCM63268_PIN(12, "gpio12", BCM63268_BASEMODE_VDSL_PHY_1),
     79	BCM63268_PIN(13, "gpio13", BCM63268_BASEMODE_VDSL_PHY_1),
     80	PINCTRL_PIN(14, "gpio14"),
     81	PINCTRL_PIN(15, "gpio15"),
     82	PINCTRL_PIN(16, "gpio16"),
     83	PINCTRL_PIN(17, "gpio17"),
     84	PINCTRL_PIN(18, "gpio18"),
     85	PINCTRL_PIN(19, "gpio19"),
     86	PINCTRL_PIN(20, "gpio20"),
     87	PINCTRL_PIN(21, "gpio21"),
     88	PINCTRL_PIN(22, "gpio22"),
     89	PINCTRL_PIN(23, "gpio23"),
     90	BCM63268_PIN(24, "gpio24",
     91		     BCM63268_BASEMODE_NAND | BCM63268_BASEMODE_VDSL_PHY_2),
     92	BCM63268_PIN(25, "gpio25",
     93		     BCM63268_BASEMODE_NAND | BCM63268_BASEMODE_VDSL_PHY_2),
     94	BCM63268_PIN(26, "gpio26",
     95		     BCM63268_BASEMODE_NAND | BCM63268_BASEMODE_VDSL_PHY_3),
     96	BCM63268_PIN(27, "gpio27",
     97		     BCM63268_BASEMODE_NAND | BCM63268_BASEMODE_VDSL_PHY_3),
     98	BCM63268_PIN(28, "gpio28", BCM63268_BASEMODE_NAND),
     99	BCM63268_PIN(29, "gpio29", BCM63268_BASEMODE_NAND),
    100	BCM63268_PIN(30, "gpio30", BCM63268_BASEMODE_NAND),
    101	BCM63268_PIN(31, "gpio31", BCM63268_BASEMODE_NAND),
    102	PINCTRL_PIN(32, "gpio32"),
    103	PINCTRL_PIN(33, "gpio33"),
    104	PINCTRL_PIN(34, "gpio34"),
    105	PINCTRL_PIN(35, "gpio35"),
    106	PINCTRL_PIN(36, "gpio36"),
    107	PINCTRL_PIN(37, "gpio37"),
    108	PINCTRL_PIN(38, "gpio38"),
    109	PINCTRL_PIN(39, "gpio39"),
    110	PINCTRL_PIN(40, "gpio40"),
    111	PINCTRL_PIN(41, "gpio41"),
    112	PINCTRL_PIN(42, "gpio42"),
    113	PINCTRL_PIN(43, "gpio43"),
    114	PINCTRL_PIN(44, "gpio44"),
    115	PINCTRL_PIN(45, "gpio45"),
    116	PINCTRL_PIN(46, "gpio46"),
    117	PINCTRL_PIN(47, "gpio47"),
    118	PINCTRL_PIN(48, "gpio48"),
    119	PINCTRL_PIN(49, "gpio49"),
    120	PINCTRL_PIN(50, "gpio50"),
    121	PINCTRL_PIN(51, "gpio51"),
    122};
    123
    124static unsigned gpio0_pins[] = { 0 };
    125static unsigned gpio1_pins[] = { 1 };
    126static unsigned gpio2_pins[] = { 2 };
    127static unsigned gpio3_pins[] = { 3 };
    128static unsigned gpio4_pins[] = { 4 };
    129static unsigned gpio5_pins[] = { 5 };
    130static unsigned gpio6_pins[] = { 6 };
    131static unsigned gpio7_pins[] = { 7 };
    132static unsigned gpio8_pins[] = { 8 };
    133static unsigned gpio9_pins[] = { 9 };
    134static unsigned gpio10_pins[] = { 10 };
    135static unsigned gpio11_pins[] = { 11 };
    136static unsigned gpio12_pins[] = { 12 };
    137static unsigned gpio13_pins[] = { 13 };
    138static unsigned gpio14_pins[] = { 14 };
    139static unsigned gpio15_pins[] = { 15 };
    140static unsigned gpio16_pins[] = { 16 };
    141static unsigned gpio17_pins[] = { 17 };
    142static unsigned gpio18_pins[] = { 18 };
    143static unsigned gpio19_pins[] = { 19 };
    144static unsigned gpio20_pins[] = { 20 };
    145static unsigned gpio21_pins[] = { 21 };
    146static unsigned gpio22_pins[] = { 22 };
    147static unsigned gpio23_pins[] = { 23 };
    148static unsigned gpio24_pins[] = { 24 };
    149static unsigned gpio25_pins[] = { 25 };
    150static unsigned gpio26_pins[] = { 26 };
    151static unsigned gpio27_pins[] = { 27 };
    152static unsigned gpio28_pins[] = { 28 };
    153static unsigned gpio29_pins[] = { 29 };
    154static unsigned gpio30_pins[] = { 30 };
    155static unsigned gpio31_pins[] = { 31 };
    156static unsigned gpio32_pins[] = { 32 };
    157static unsigned gpio33_pins[] = { 33 };
    158static unsigned gpio34_pins[] = { 34 };
    159static unsigned gpio35_pins[] = { 35 };
    160static unsigned gpio36_pins[] = { 36 };
    161static unsigned gpio37_pins[] = { 37 };
    162static unsigned gpio38_pins[] = { 38 };
    163static unsigned gpio39_pins[] = { 39 };
    164static unsigned gpio40_pins[] = { 40 };
    165static unsigned gpio41_pins[] = { 41 };
    166static unsigned gpio42_pins[] = { 42 };
    167static unsigned gpio43_pins[] = { 43 };
    168static unsigned gpio44_pins[] = { 44 };
    169static unsigned gpio45_pins[] = { 45 };
    170static unsigned gpio46_pins[] = { 46 };
    171static unsigned gpio47_pins[] = { 47 };
    172static unsigned gpio48_pins[] = { 48 };
    173static unsigned gpio49_pins[] = { 49 };
    174static unsigned gpio50_pins[] = { 50 };
    175static unsigned gpio51_pins[] = { 51 };
    176
    177static unsigned nand_grp_pins[] = {
    178	2, 3, 4, 5, 6, 7, 24,
    179	25, 26, 27, 28, 29, 30, 31,
    180};
    181
    182static unsigned dectpd_grp_pins[] = { 8, 9 };
    183static unsigned vdsl_phy0_grp_pins[] = { 10, 11 };
    184static unsigned vdsl_phy1_grp_pins[] = { 12, 13 };
    185static unsigned vdsl_phy2_grp_pins[] = { 24, 25 };
    186static unsigned vdsl_phy3_grp_pins[] = { 26, 27 };
    187
    188#define BCM63268_GROUP(n)					\
    189	{							\
    190		.name = #n,					\
    191		.pins = n##_pins,				\
    192		.num_pins = ARRAY_SIZE(n##_pins),		\
    193	}
    194
    195static struct bcm63268_pingroup bcm63268_groups[] = {
    196	BCM63268_GROUP(gpio0),
    197	BCM63268_GROUP(gpio1),
    198	BCM63268_GROUP(gpio2),
    199	BCM63268_GROUP(gpio3),
    200	BCM63268_GROUP(gpio4),
    201	BCM63268_GROUP(gpio5),
    202	BCM63268_GROUP(gpio6),
    203	BCM63268_GROUP(gpio7),
    204	BCM63268_GROUP(gpio8),
    205	BCM63268_GROUP(gpio9),
    206	BCM63268_GROUP(gpio10),
    207	BCM63268_GROUP(gpio11),
    208	BCM63268_GROUP(gpio12),
    209	BCM63268_GROUP(gpio13),
    210	BCM63268_GROUP(gpio14),
    211	BCM63268_GROUP(gpio15),
    212	BCM63268_GROUP(gpio16),
    213	BCM63268_GROUP(gpio17),
    214	BCM63268_GROUP(gpio18),
    215	BCM63268_GROUP(gpio19),
    216	BCM63268_GROUP(gpio20),
    217	BCM63268_GROUP(gpio21),
    218	BCM63268_GROUP(gpio22),
    219	BCM63268_GROUP(gpio23),
    220	BCM63268_GROUP(gpio24),
    221	BCM63268_GROUP(gpio25),
    222	BCM63268_GROUP(gpio26),
    223	BCM63268_GROUP(gpio27),
    224	BCM63268_GROUP(gpio28),
    225	BCM63268_GROUP(gpio29),
    226	BCM63268_GROUP(gpio30),
    227	BCM63268_GROUP(gpio31),
    228	BCM63268_GROUP(gpio32),
    229	BCM63268_GROUP(gpio33),
    230	BCM63268_GROUP(gpio34),
    231	BCM63268_GROUP(gpio35),
    232	BCM63268_GROUP(gpio36),
    233	BCM63268_GROUP(gpio37),
    234	BCM63268_GROUP(gpio38),
    235	BCM63268_GROUP(gpio39),
    236	BCM63268_GROUP(gpio40),
    237	BCM63268_GROUP(gpio41),
    238	BCM63268_GROUP(gpio42),
    239	BCM63268_GROUP(gpio43),
    240	BCM63268_GROUP(gpio44),
    241	BCM63268_GROUP(gpio45),
    242	BCM63268_GROUP(gpio46),
    243	BCM63268_GROUP(gpio47),
    244	BCM63268_GROUP(gpio48),
    245	BCM63268_GROUP(gpio49),
    246	BCM63268_GROUP(gpio50),
    247	BCM63268_GROUP(gpio51),
    248
    249	/* multi pin groups */
    250	BCM63268_GROUP(nand_grp),
    251	BCM63268_GROUP(dectpd_grp),
    252	BCM63268_GROUP(vdsl_phy0_grp),
    253	BCM63268_GROUP(vdsl_phy1_grp),
    254	BCM63268_GROUP(vdsl_phy2_grp),
    255	BCM63268_GROUP(vdsl_phy3_grp),
    256};
    257
    258static const char * const led_groups[] = {
    259	"gpio0",
    260	"gpio1",
    261	"gpio2",
    262	"gpio3",
    263	"gpio4",
    264	"gpio5",
    265	"gpio6",
    266	"gpio7",
    267	"gpio8",
    268	"gpio9",
    269	"gpio10",
    270	"gpio11",
    271	"gpio12",
    272	"gpio13",
    273	"gpio14",
    274	"gpio15",
    275	"gpio16",
    276	"gpio17",
    277	"gpio18",
    278	"gpio19",
    279	"gpio20",
    280	"gpio21",
    281	"gpio22",
    282	"gpio23",
    283};
    284
    285static const char * const serial_led_clk_groups[] = {
    286	"gpio0",
    287};
    288
    289static const char * const serial_led_data_groups[] = {
    290	"gpio1",
    291};
    292
    293static const char * const hsspi_cs4_groups[] = {
    294	"gpio16",
    295};
    296
    297static const char * const hsspi_cs5_groups[] = {
    298	"gpio17",
    299};
    300
    301static const char * const hsspi_cs6_groups[] = {
    302	"gpio8",
    303};
    304
    305static const char * const hsspi_cs7_groups[] = {
    306	"gpio9",
    307};
    308
    309static const char * const uart1_scts_groups[] = {
    310	"gpio10",
    311	"gpio24",
    312};
    313
    314static const char * const uart1_srts_groups[] = {
    315	"gpio11",
    316	"gpio25",
    317};
    318
    319static const char * const uart1_sdin_groups[] = {
    320	"gpio12",
    321	"gpio26",
    322};
    323
    324static const char * const uart1_sdout_groups[] = {
    325	"gpio13",
    326	"gpio27",
    327};
    328
    329static const char * const ntr_pulse_in_groups[] = {
    330	"gpio14",
    331	"gpio28",
    332};
    333
    334static const char * const dsl_ntr_pulse_out_groups[] = {
    335	"gpio15",
    336	"gpio29",
    337};
    338
    339static const char * const adsl_spi_miso_groups[] = {
    340	"gpio18",
    341};
    342
    343static const char * const adsl_spi_mosi_groups[] = {
    344	"gpio19",
    345};
    346
    347static const char * const vreg_clk_groups[] = {
    348	"gpio22",
    349};
    350
    351static const char * const pcie_clkreq_b_groups[] = {
    352	"gpio23",
    353};
    354
    355static const char * const switch_led_clk_groups[] = {
    356	"gpio30",
    357};
    358
    359static const char * const switch_led_data_groups[] = {
    360	"gpio31",
    361};
    362
    363static const char * const wifi_groups[] = {
    364	"gpio32",
    365	"gpio33",
    366	"gpio34",
    367	"gpio35",
    368	"gpio36",
    369	"gpio37",
    370	"gpio38",
    371	"gpio39",
    372	"gpio40",
    373	"gpio41",
    374	"gpio42",
    375	"gpio43",
    376	"gpio44",
    377	"gpio45",
    378	"gpio46",
    379	"gpio47",
    380	"gpio48",
    381	"gpio49",
    382	"gpio50",
    383	"gpio51",
    384};
    385
    386static const char * const nand_groups[] = {
    387	"nand_grp",
    388};
    389
    390static const char * const dectpd_groups[] = {
    391	"dectpd_grp",
    392};
    393
    394static const char * const vdsl_phy_override_0_groups[] = {
    395	"vdsl_phy_override_0_grp",
    396};
    397
    398static const char * const vdsl_phy_override_1_groups[] = {
    399	"vdsl_phy_override_1_grp",
    400};
    401
    402static const char * const vdsl_phy_override_2_groups[] = {
    403	"vdsl_phy_override_2_grp",
    404};
    405
    406static const char * const vdsl_phy_override_3_groups[] = {
    407	"vdsl_phy_override_3_grp",
    408};
    409
    410#define BCM63268_LED_FUN(n)				\
    411	{						\
    412		.name = #n,				\
    413		.groups = n##_groups,			\
    414		.num_groups = ARRAY_SIZE(n##_groups),	\
    415		.reg = BCM63268_LEDCTRL,		\
    416	}
    417
    418#define BCM63268_MODE_FUN(n)				\
    419	{						\
    420		.name = #n,				\
    421		.groups = n##_groups,			\
    422		.num_groups = ARRAY_SIZE(n##_groups),	\
    423		.reg = BCM63268_MODE,			\
    424	}
    425
    426#define BCM63268_CTRL_FUN(n)				\
    427	{						\
    428		.name = #n,				\
    429		.groups = n##_groups,			\
    430		.num_groups = ARRAY_SIZE(n##_groups),	\
    431		.reg = BCM63268_CTRL,			\
    432	}
    433
    434#define BCM63268_BASEMODE_FUN(n, val)			\
    435	{						\
    436		.name = #n,				\
    437		.groups = n##_groups,			\
    438		.num_groups = ARRAY_SIZE(n##_groups),	\
    439		.reg = BCM63268_BASEMODE,		\
    440		.mask = val,				\
    441	}
    442
    443static const struct bcm63268_function bcm63268_funcs[] = {
    444	BCM63268_LED_FUN(led),
    445	BCM63268_MODE_FUN(serial_led_clk),
    446	BCM63268_MODE_FUN(serial_led_data),
    447	BCM63268_MODE_FUN(hsspi_cs6),
    448	BCM63268_MODE_FUN(hsspi_cs7),
    449	BCM63268_MODE_FUN(uart1_scts),
    450	BCM63268_MODE_FUN(uart1_srts),
    451	BCM63268_MODE_FUN(uart1_sdin),
    452	BCM63268_MODE_FUN(uart1_sdout),
    453	BCM63268_MODE_FUN(ntr_pulse_in),
    454	BCM63268_MODE_FUN(dsl_ntr_pulse_out),
    455	BCM63268_MODE_FUN(hsspi_cs4),
    456	BCM63268_MODE_FUN(hsspi_cs5),
    457	BCM63268_MODE_FUN(adsl_spi_miso),
    458	BCM63268_MODE_FUN(adsl_spi_mosi),
    459	BCM63268_MODE_FUN(vreg_clk),
    460	BCM63268_MODE_FUN(pcie_clkreq_b),
    461	BCM63268_MODE_FUN(switch_led_clk),
    462	BCM63268_MODE_FUN(switch_led_data),
    463	BCM63268_CTRL_FUN(wifi),
    464	BCM63268_BASEMODE_FUN(nand, BCM63268_BASEMODE_NAND),
    465	BCM63268_BASEMODE_FUN(dectpd, BCM63268_BASEMODE_DECTPD),
    466	BCM63268_BASEMODE_FUN(vdsl_phy_override_0,
    467			      BCM63268_BASEMODE_VDSL_PHY_0),
    468	BCM63268_BASEMODE_FUN(vdsl_phy_override_1,
    469			      BCM63268_BASEMODE_VDSL_PHY_1),
    470	BCM63268_BASEMODE_FUN(vdsl_phy_override_2,
    471			      BCM63268_BASEMODE_VDSL_PHY_2),
    472	BCM63268_BASEMODE_FUN(vdsl_phy_override_3,
    473			      BCM63268_BASEMODE_VDSL_PHY_3),
    474};
    475
    476static int bcm63268_pinctrl_get_group_count(struct pinctrl_dev *pctldev)
    477{
    478	return ARRAY_SIZE(bcm63268_groups);
    479}
    480
    481static const char *bcm63268_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
    482						   unsigned group)
    483{
    484	return bcm63268_groups[group].name;
    485}
    486
    487static int bcm63268_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
    488					   unsigned group,
    489					   const unsigned **pins,
    490					   unsigned *num_pins)
    491{
    492	*pins = bcm63268_groups[group].pins;
    493	*num_pins = bcm63268_groups[group].num_pins;
    494
    495	return 0;
    496}
    497
    498static int bcm63268_pinctrl_get_func_count(struct pinctrl_dev *pctldev)
    499{
    500	return ARRAY_SIZE(bcm63268_funcs);
    501}
    502
    503static const char *bcm63268_pinctrl_get_func_name(struct pinctrl_dev *pctldev,
    504						  unsigned selector)
    505{
    506	return bcm63268_funcs[selector].name;
    507}
    508
    509static int bcm63268_pinctrl_get_groups(struct pinctrl_dev *pctldev,
    510				       unsigned selector,
    511				       const char * const **groups,
    512				       unsigned * const num_groups)
    513{
    514	*groups = bcm63268_funcs[selector].groups;
    515	*num_groups = bcm63268_funcs[selector].num_groups;
    516
    517	return 0;
    518}
    519
    520static void bcm63268_set_gpio(struct bcm63xx_pinctrl *pc, unsigned pin)
    521{
    522	const struct pinctrl_pin_desc *desc = &bcm63268_pins[pin];
    523	unsigned int basemode = (unsigned long) desc->drv_data;
    524	unsigned int mask = BIT(bcm63xx_bank_pin(pin));
    525
    526	if (basemode)
    527		regmap_update_bits(pc->regs, BCM63268_BASEMODE_REG, basemode,
    528				   0);
    529
    530	if (pin < BCM63XX_BANK_GPIOS) {
    531		/* base mode: 0 => gpio, 1 => mux function */
    532		regmap_update_bits(pc->regs, BCM63268_MODE_REG, mask, 0);
    533
    534		/* pins 0-23 might be muxed to led */
    535		if (pin < BCM63268_NUM_LEDS)
    536			regmap_update_bits(pc->regs, BCM63268_LED_REG, mask,
    537					   0);
    538	} else if (pin < BCM63268_NUM_GPIOS) {
    539		/* ctrl reg: 0 => wifi function, 1 => gpio */
    540		regmap_update_bits(pc->regs, BCM63268_CTRL_REG, mask, mask);
    541	}
    542}
    543
    544static int bcm63268_pinctrl_set_mux(struct pinctrl_dev *pctldev,
    545				    unsigned selector, unsigned group)
    546{
    547	struct bcm63xx_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
    548	const struct bcm63268_pingroup *pg = &bcm63268_groups[group];
    549	const struct bcm63268_function *f = &bcm63268_funcs[selector];
    550	unsigned i;
    551	unsigned int reg;
    552	unsigned int val, mask;
    553
    554	for (i = 0; i < pg->num_pins; i++)
    555		bcm63268_set_gpio(pc, pg->pins[i]);
    556
    557	switch (f->reg) {
    558	case BCM63268_LEDCTRL:
    559		reg = BCM63268_LED_REG;
    560		mask = BIT(pg->pins[0]);
    561		val = BIT(pg->pins[0]);
    562		break;
    563	case BCM63268_MODE:
    564		reg = BCM63268_MODE_REG;
    565		mask = BIT(pg->pins[0]);
    566		val = BIT(pg->pins[0]);
    567		break;
    568	case BCM63268_CTRL:
    569		reg = BCM63268_CTRL_REG;
    570		mask = BIT(pg->pins[0]);
    571		val = 0;
    572		break;
    573	case BCM63268_BASEMODE:
    574		reg = BCM63268_BASEMODE_REG;
    575		mask = f->mask;
    576		val = f->mask;
    577		break;
    578	default:
    579		WARN_ON(1);
    580		return -EINVAL;
    581	}
    582
    583	regmap_update_bits(pc->regs, reg, mask, val);
    584
    585	return 0;
    586}
    587
    588static int bcm63268_gpio_request_enable(struct pinctrl_dev *pctldev,
    589					struct pinctrl_gpio_range *range,
    590					unsigned offset)
    591{
    592	struct bcm63xx_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
    593
    594	/* disable all functions using this pin */
    595	bcm63268_set_gpio(pc, offset);
    596
    597	return 0;
    598}
    599
    600static const struct pinctrl_ops bcm63268_pctl_ops = {
    601	.dt_free_map = pinctrl_utils_free_map,
    602	.dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
    603	.get_group_name = bcm63268_pinctrl_get_group_name,
    604	.get_group_pins = bcm63268_pinctrl_get_group_pins,
    605	.get_groups_count = bcm63268_pinctrl_get_group_count,
    606};
    607
    608static const struct pinmux_ops bcm63268_pmx_ops = {
    609	.get_function_groups = bcm63268_pinctrl_get_groups,
    610	.get_function_name = bcm63268_pinctrl_get_func_name,
    611	.get_functions_count = bcm63268_pinctrl_get_func_count,
    612	.gpio_request_enable = bcm63268_gpio_request_enable,
    613	.set_mux = bcm63268_pinctrl_set_mux,
    614	.strict = true,
    615};
    616
    617static const struct bcm63xx_pinctrl_soc bcm63268_soc = {
    618	.ngpios = BCM63268_NUM_GPIOS,
    619	.npins = ARRAY_SIZE(bcm63268_pins),
    620	.pctl_ops = &bcm63268_pctl_ops,
    621	.pins = bcm63268_pins,
    622	.pmx_ops = &bcm63268_pmx_ops,
    623};
    624
    625static int bcm63268_pinctrl_probe(struct platform_device *pdev)
    626{
    627	return bcm63xx_pinctrl_probe(pdev, &bcm63268_soc, NULL);
    628}
    629
    630static const struct of_device_id bcm63268_pinctrl_match[] = {
    631	{ .compatible = "brcm,bcm63268-pinctrl", },
    632	{ /* sentinel */ }
    633};
    634
    635static struct platform_driver bcm63268_pinctrl_driver = {
    636	.probe = bcm63268_pinctrl_probe,
    637	.driver = {
    638		.name = "bcm63268-pinctrl",
    639		.of_match_table = bcm63268_pinctrl_match,
    640	},
    641};
    642
    643builtin_platform_driver(bcm63268_pinctrl_driver);