1155cca1bSÁlvaro Fernández Rojas // SPDX-License-Identifier: GPL-2.0+ 2155cca1bSÁlvaro Fernández Rojas /* 3155cca1bSÁlvaro Fernández Rojas * Driver for BCM63268 GPIO unit (pinctrl + GPIO) 4155cca1bSÁlvaro Fernández Rojas * 5155cca1bSÁlvaro Fernández Rojas * Copyright (C) 2021 Álvaro Fernández Rojas <noltari@gmail.com> 6155cca1bSÁlvaro Fernández Rojas * Copyright (C) 2016 Jonas Gorski <jonas.gorski@gmail.com> 7155cca1bSÁlvaro Fernández Rojas */ 8155cca1bSÁlvaro Fernández Rojas 9155cca1bSÁlvaro Fernández Rojas #include <linux/bits.h> 10155cca1bSÁlvaro Fernández Rojas #include <linux/gpio/driver.h> 11155cca1bSÁlvaro Fernández Rojas #include <linux/kernel.h> 12155cca1bSÁlvaro Fernández Rojas #include <linux/of.h> 13155cca1bSÁlvaro Fernández Rojas #include <linux/pinctrl/pinmux.h> 14155cca1bSÁlvaro Fernández Rojas #include <linux/platform_device.h> 15155cca1bSÁlvaro Fernández Rojas #include <linux/regmap.h> 16155cca1bSÁlvaro Fernández Rojas 17155cca1bSÁlvaro Fernández Rojas #include "../pinctrl-utils.h" 18155cca1bSÁlvaro Fernández Rojas 19155cca1bSÁlvaro Fernández Rojas #include "pinctrl-bcm63xx.h" 20155cca1bSÁlvaro Fernández Rojas 21155cca1bSÁlvaro Fernández Rojas #define BCM63268_NUM_GPIOS 52 22155cca1bSÁlvaro Fernández Rojas #define BCM63268_NUM_LEDS 24 23155cca1bSÁlvaro Fernández Rojas 24155cca1bSÁlvaro Fernández Rojas #define BCM63268_LED_REG 0x10 25155cca1bSÁlvaro Fernández Rojas #define BCM63268_MODE_REG 0x18 26155cca1bSÁlvaro Fernández Rojas #define BCM63268_CTRL_REG 0x1c 27155cca1bSÁlvaro Fernández Rojas #define BCM63268_BASEMODE_REG 0x38 28155cca1bSÁlvaro Fernández Rojas #define BCM63268_BASEMODE_NAND BIT(2) /* GPIOs 2-7, 24-31 */ 29155cca1bSÁlvaro Fernández Rojas #define BCM63268_BASEMODE_GPIO35 BIT(4) /* GPIO 35 */ 30155cca1bSÁlvaro Fernández Rojas #define BCM63268_BASEMODE_DECTPD BIT(5) /* GPIOs 8/9 */ 31155cca1bSÁlvaro Fernández Rojas #define BCM63268_BASEMODE_VDSL_PHY_0 BIT(6) /* GPIOs 10/11 */ 32155cca1bSÁlvaro Fernández Rojas #define BCM63268_BASEMODE_VDSL_PHY_1 BIT(7) /* GPIOs 12/13 */ 33155cca1bSÁlvaro Fernández Rojas #define BCM63268_BASEMODE_VDSL_PHY_2 BIT(8) /* GPIOs 24/25 */ 34155cca1bSÁlvaro Fernández Rojas #define BCM63268_BASEMODE_VDSL_PHY_3 BIT(9) /* GPIOs 26/27 */ 35155cca1bSÁlvaro Fernández Rojas 36155cca1bSÁlvaro Fernández Rojas enum bcm63268_pinctrl_reg { 37155cca1bSÁlvaro Fernández Rojas BCM63268_LEDCTRL, 38155cca1bSÁlvaro Fernández Rojas BCM63268_MODE, 39155cca1bSÁlvaro Fernández Rojas BCM63268_CTRL, 40155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE, 41155cca1bSÁlvaro Fernández Rojas }; 42155cca1bSÁlvaro Fernández Rojas 43155cca1bSÁlvaro Fernández Rojas struct bcm63268_function { 44155cca1bSÁlvaro Fernández Rojas const char *name; 45155cca1bSÁlvaro Fernández Rojas const char * const *groups; 46155cca1bSÁlvaro Fernández Rojas const unsigned num_groups; 47155cca1bSÁlvaro Fernández Rojas 48155cca1bSÁlvaro Fernández Rojas enum bcm63268_pinctrl_reg reg; 49155cca1bSÁlvaro Fernández Rojas uint32_t mask; 50155cca1bSÁlvaro Fernández Rojas }; 51155cca1bSÁlvaro Fernández Rojas 52155cca1bSÁlvaro Fernández Rojas #define BCM63268_PIN(a, b, basemode) \ 53155cca1bSÁlvaro Fernández Rojas { \ 54155cca1bSÁlvaro Fernández Rojas .number = a, \ 55155cca1bSÁlvaro Fernández Rojas .name = b, \ 56155cca1bSÁlvaro Fernández Rojas .drv_data = (void *)(basemode) \ 57155cca1bSÁlvaro Fernández Rojas } 58155cca1bSÁlvaro Fernández Rojas 59155cca1bSÁlvaro Fernández Rojas static const struct pinctrl_pin_desc bcm63268_pins[] = { 60155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(0, "gpio0"), 61155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(1, "gpio1"), 62155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(2, "gpio2", BCM63268_BASEMODE_NAND), 63155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(3, "gpio3", BCM63268_BASEMODE_NAND), 64155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(4, "gpio4", BCM63268_BASEMODE_NAND), 65155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(5, "gpio5", BCM63268_BASEMODE_NAND), 66155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(6, "gpio6", BCM63268_BASEMODE_NAND), 67155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(7, "gpio7", BCM63268_BASEMODE_NAND), 68155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(8, "gpio8", BCM63268_BASEMODE_DECTPD), 69155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(9, "gpio9", BCM63268_BASEMODE_DECTPD), 70155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(10, "gpio10", BCM63268_BASEMODE_VDSL_PHY_0), 71155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(11, "gpio11", BCM63268_BASEMODE_VDSL_PHY_0), 72155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(12, "gpio12", BCM63268_BASEMODE_VDSL_PHY_1), 73155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(13, "gpio13", BCM63268_BASEMODE_VDSL_PHY_1), 74155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(14, "gpio14"), 75155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(15, "gpio15"), 76155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(16, "gpio16"), 77155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(17, "gpio17"), 78155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(18, "gpio18"), 79155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(19, "gpio19"), 80155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(20, "gpio20"), 81155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(21, "gpio21"), 82155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(22, "gpio22"), 83155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(23, "gpio23"), 84155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(24, "gpio24", 85155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_NAND | BCM63268_BASEMODE_VDSL_PHY_2), 86155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(25, "gpio25", 87155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_NAND | BCM63268_BASEMODE_VDSL_PHY_2), 88155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(26, "gpio26", 89155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_NAND | BCM63268_BASEMODE_VDSL_PHY_3), 90155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(27, "gpio27", 91155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_NAND | BCM63268_BASEMODE_VDSL_PHY_3), 92155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(28, "gpio28", BCM63268_BASEMODE_NAND), 93155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(29, "gpio29", BCM63268_BASEMODE_NAND), 94155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(30, "gpio30", BCM63268_BASEMODE_NAND), 95155cca1bSÁlvaro Fernández Rojas BCM63268_PIN(31, "gpio31", BCM63268_BASEMODE_NAND), 96155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(32, "gpio32"), 97155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(33, "gpio33"), 98155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(34, "gpio34"), 99155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(35, "gpio35"), 100155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(36, "gpio36"), 101155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(37, "gpio37"), 102155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(38, "gpio38"), 103155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(39, "gpio39"), 104155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(40, "gpio40"), 105155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(41, "gpio41"), 106155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(42, "gpio42"), 107155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(43, "gpio43"), 108155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(44, "gpio44"), 109155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(45, "gpio45"), 110155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(46, "gpio46"), 111155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(47, "gpio47"), 112155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(48, "gpio48"), 113155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(49, "gpio49"), 114155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(50, "gpio50"), 115155cca1bSÁlvaro Fernández Rojas PINCTRL_PIN(51, "gpio51"), 116155cca1bSÁlvaro Fernández Rojas }; 117155cca1bSÁlvaro Fernández Rojas 118155cca1bSÁlvaro Fernández Rojas static unsigned gpio0_pins[] = { 0 }; 119155cca1bSÁlvaro Fernández Rojas static unsigned gpio1_pins[] = { 1 }; 120155cca1bSÁlvaro Fernández Rojas static unsigned gpio2_pins[] = { 2 }; 121155cca1bSÁlvaro Fernández Rojas static unsigned gpio3_pins[] = { 3 }; 122155cca1bSÁlvaro Fernández Rojas static unsigned gpio4_pins[] = { 4 }; 123155cca1bSÁlvaro Fernández Rojas static unsigned gpio5_pins[] = { 5 }; 124155cca1bSÁlvaro Fernández Rojas static unsigned gpio6_pins[] = { 6 }; 125155cca1bSÁlvaro Fernández Rojas static unsigned gpio7_pins[] = { 7 }; 126155cca1bSÁlvaro Fernández Rojas static unsigned gpio8_pins[] = { 8 }; 127155cca1bSÁlvaro Fernández Rojas static unsigned gpio9_pins[] = { 9 }; 128155cca1bSÁlvaro Fernández Rojas static unsigned gpio10_pins[] = { 10 }; 129155cca1bSÁlvaro Fernández Rojas static unsigned gpio11_pins[] = { 11 }; 130155cca1bSÁlvaro Fernández Rojas static unsigned gpio12_pins[] = { 12 }; 131155cca1bSÁlvaro Fernández Rojas static unsigned gpio13_pins[] = { 13 }; 132155cca1bSÁlvaro Fernández Rojas static unsigned gpio14_pins[] = { 14 }; 133155cca1bSÁlvaro Fernández Rojas static unsigned gpio15_pins[] = { 15 }; 134155cca1bSÁlvaro Fernández Rojas static unsigned gpio16_pins[] = { 16 }; 135155cca1bSÁlvaro Fernández Rojas static unsigned gpio17_pins[] = { 17 }; 136155cca1bSÁlvaro Fernández Rojas static unsigned gpio18_pins[] = { 18 }; 137155cca1bSÁlvaro Fernández Rojas static unsigned gpio19_pins[] = { 19 }; 138155cca1bSÁlvaro Fernández Rojas static unsigned gpio20_pins[] = { 20 }; 139155cca1bSÁlvaro Fernández Rojas static unsigned gpio21_pins[] = { 21 }; 140155cca1bSÁlvaro Fernández Rojas static unsigned gpio22_pins[] = { 22 }; 141155cca1bSÁlvaro Fernández Rojas static unsigned gpio23_pins[] = { 23 }; 142155cca1bSÁlvaro Fernández Rojas static unsigned gpio24_pins[] = { 24 }; 143155cca1bSÁlvaro Fernández Rojas static unsigned gpio25_pins[] = { 25 }; 144155cca1bSÁlvaro Fernández Rojas static unsigned gpio26_pins[] = { 26 }; 145155cca1bSÁlvaro Fernández Rojas static unsigned gpio27_pins[] = { 27 }; 146155cca1bSÁlvaro Fernández Rojas static unsigned gpio28_pins[] = { 28 }; 147155cca1bSÁlvaro Fernández Rojas static unsigned gpio29_pins[] = { 29 }; 148155cca1bSÁlvaro Fernández Rojas static unsigned gpio30_pins[] = { 30 }; 149155cca1bSÁlvaro Fernández Rojas static unsigned gpio31_pins[] = { 31 }; 150155cca1bSÁlvaro Fernández Rojas static unsigned gpio32_pins[] = { 32 }; 151155cca1bSÁlvaro Fernández Rojas static unsigned gpio33_pins[] = { 33 }; 152155cca1bSÁlvaro Fernández Rojas static unsigned gpio34_pins[] = { 34 }; 153155cca1bSÁlvaro Fernández Rojas static unsigned gpio35_pins[] = { 35 }; 154155cca1bSÁlvaro Fernández Rojas static unsigned gpio36_pins[] = { 36 }; 155155cca1bSÁlvaro Fernández Rojas static unsigned gpio37_pins[] = { 37 }; 156155cca1bSÁlvaro Fernández Rojas static unsigned gpio38_pins[] = { 38 }; 157155cca1bSÁlvaro Fernández Rojas static unsigned gpio39_pins[] = { 39 }; 158155cca1bSÁlvaro Fernández Rojas static unsigned gpio40_pins[] = { 40 }; 159155cca1bSÁlvaro Fernández Rojas static unsigned gpio41_pins[] = { 41 }; 160155cca1bSÁlvaro Fernández Rojas static unsigned gpio42_pins[] = { 42 }; 161155cca1bSÁlvaro Fernández Rojas static unsigned gpio43_pins[] = { 43 }; 162155cca1bSÁlvaro Fernández Rojas static unsigned gpio44_pins[] = { 44 }; 163155cca1bSÁlvaro Fernández Rojas static unsigned gpio45_pins[] = { 45 }; 164155cca1bSÁlvaro Fernández Rojas static unsigned gpio46_pins[] = { 46 }; 165155cca1bSÁlvaro Fernández Rojas static unsigned gpio47_pins[] = { 47 }; 166155cca1bSÁlvaro Fernández Rojas static unsigned gpio48_pins[] = { 48 }; 167155cca1bSÁlvaro Fernández Rojas static unsigned gpio49_pins[] = { 49 }; 168155cca1bSÁlvaro Fernández Rojas static unsigned gpio50_pins[] = { 50 }; 169155cca1bSÁlvaro Fernández Rojas static unsigned gpio51_pins[] = { 51 }; 170155cca1bSÁlvaro Fernández Rojas 171155cca1bSÁlvaro Fernández Rojas static unsigned nand_grp_pins[] = { 172155cca1bSÁlvaro Fernández Rojas 2, 3, 4, 5, 6, 7, 24, 173155cca1bSÁlvaro Fernández Rojas 25, 26, 27, 28, 29, 30, 31, 174155cca1bSÁlvaro Fernández Rojas }; 175155cca1bSÁlvaro Fernández Rojas 176155cca1bSÁlvaro Fernández Rojas static unsigned dectpd_grp_pins[] = { 8, 9 }; 177155cca1bSÁlvaro Fernández Rojas static unsigned vdsl_phy0_grp_pins[] = { 10, 11 }; 178155cca1bSÁlvaro Fernández Rojas static unsigned vdsl_phy1_grp_pins[] = { 12, 13 }; 179155cca1bSÁlvaro Fernández Rojas static unsigned vdsl_phy2_grp_pins[] = { 24, 25 }; 180155cca1bSÁlvaro Fernández Rojas static unsigned vdsl_phy3_grp_pins[] = { 26, 27 }; 181155cca1bSÁlvaro Fernández Rojas 182*0e3db163SAndy Shevchenko static struct pingroup bcm63268_groups[] = { 183*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio0), 184*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio1), 185*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio2), 186*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio3), 187*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio4), 188*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio5), 189*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio6), 190*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio7), 191*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio8), 192*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio9), 193*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio10), 194*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio11), 195*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio12), 196*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio13), 197*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio14), 198*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio15), 199*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio16), 200*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio17), 201*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio18), 202*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio19), 203*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio20), 204*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio21), 205*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio22), 206*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio23), 207*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio24), 208*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio25), 209*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio26), 210*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio27), 211*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio28), 212*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio29), 213*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio30), 214*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio31), 215*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio32), 216*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio33), 217*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio34), 218*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio35), 219*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio36), 220*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio37), 221*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio38), 222*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio39), 223*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio40), 224*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio41), 225*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio42), 226*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio43), 227*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio44), 228*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio45), 229*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio46), 230*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio47), 231*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio48), 232*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio49), 233*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio50), 234*0e3db163SAndy Shevchenko BCM_PIN_GROUP(gpio51), 235155cca1bSÁlvaro Fernández Rojas 236155cca1bSÁlvaro Fernández Rojas /* multi pin groups */ 237*0e3db163SAndy Shevchenko BCM_PIN_GROUP(nand_grp), 238*0e3db163SAndy Shevchenko BCM_PIN_GROUP(dectpd_grp), 239*0e3db163SAndy Shevchenko BCM_PIN_GROUP(vdsl_phy0_grp), 240*0e3db163SAndy Shevchenko BCM_PIN_GROUP(vdsl_phy1_grp), 241*0e3db163SAndy Shevchenko BCM_PIN_GROUP(vdsl_phy2_grp), 242*0e3db163SAndy Shevchenko BCM_PIN_GROUP(vdsl_phy3_grp), 243155cca1bSÁlvaro Fernández Rojas }; 244155cca1bSÁlvaro Fernández Rojas 245155cca1bSÁlvaro Fernández Rojas static const char * const led_groups[] = { 246155cca1bSÁlvaro Fernández Rojas "gpio0", 247155cca1bSÁlvaro Fernández Rojas "gpio1", 248155cca1bSÁlvaro Fernández Rojas "gpio2", 249155cca1bSÁlvaro Fernández Rojas "gpio3", 250155cca1bSÁlvaro Fernández Rojas "gpio4", 251155cca1bSÁlvaro Fernández Rojas "gpio5", 252155cca1bSÁlvaro Fernández Rojas "gpio6", 253155cca1bSÁlvaro Fernández Rojas "gpio7", 254155cca1bSÁlvaro Fernández Rojas "gpio8", 255155cca1bSÁlvaro Fernández Rojas "gpio9", 256155cca1bSÁlvaro Fernández Rojas "gpio10", 257155cca1bSÁlvaro Fernández Rojas "gpio11", 258155cca1bSÁlvaro Fernández Rojas "gpio12", 259155cca1bSÁlvaro Fernández Rojas "gpio13", 260155cca1bSÁlvaro Fernández Rojas "gpio14", 261155cca1bSÁlvaro Fernández Rojas "gpio15", 262155cca1bSÁlvaro Fernández Rojas "gpio16", 263155cca1bSÁlvaro Fernández Rojas "gpio17", 264155cca1bSÁlvaro Fernández Rojas "gpio18", 265155cca1bSÁlvaro Fernández Rojas "gpio19", 266155cca1bSÁlvaro Fernández Rojas "gpio20", 267155cca1bSÁlvaro Fernández Rojas "gpio21", 268155cca1bSÁlvaro Fernández Rojas "gpio22", 269155cca1bSÁlvaro Fernández Rojas "gpio23", 270155cca1bSÁlvaro Fernández Rojas }; 271155cca1bSÁlvaro Fernández Rojas 272155cca1bSÁlvaro Fernández Rojas static const char * const serial_led_clk_groups[] = { 273155cca1bSÁlvaro Fernández Rojas "gpio0", 274155cca1bSÁlvaro Fernández Rojas }; 275155cca1bSÁlvaro Fernández Rojas 276155cca1bSÁlvaro Fernández Rojas static const char * const serial_led_data_groups[] = { 277155cca1bSÁlvaro Fernández Rojas "gpio1", 278155cca1bSÁlvaro Fernández Rojas }; 279155cca1bSÁlvaro Fernández Rojas 280155cca1bSÁlvaro Fernández Rojas static const char * const hsspi_cs4_groups[] = { 281155cca1bSÁlvaro Fernández Rojas "gpio16", 282155cca1bSÁlvaro Fernández Rojas }; 283155cca1bSÁlvaro Fernández Rojas 284155cca1bSÁlvaro Fernández Rojas static const char * const hsspi_cs5_groups[] = { 285155cca1bSÁlvaro Fernández Rojas "gpio17", 286155cca1bSÁlvaro Fernández Rojas }; 287155cca1bSÁlvaro Fernández Rojas 288155cca1bSÁlvaro Fernández Rojas static const char * const hsspi_cs6_groups[] = { 289155cca1bSÁlvaro Fernández Rojas "gpio8", 290155cca1bSÁlvaro Fernández Rojas }; 291155cca1bSÁlvaro Fernández Rojas 292155cca1bSÁlvaro Fernández Rojas static const char * const hsspi_cs7_groups[] = { 293155cca1bSÁlvaro Fernández Rojas "gpio9", 294155cca1bSÁlvaro Fernández Rojas }; 295155cca1bSÁlvaro Fernández Rojas 296155cca1bSÁlvaro Fernández Rojas static const char * const uart1_scts_groups[] = { 297155cca1bSÁlvaro Fernández Rojas "gpio10", 298155cca1bSÁlvaro Fernández Rojas "gpio24", 299155cca1bSÁlvaro Fernández Rojas }; 300155cca1bSÁlvaro Fernández Rojas 301155cca1bSÁlvaro Fernández Rojas static const char * const uart1_srts_groups[] = { 302155cca1bSÁlvaro Fernández Rojas "gpio11", 303155cca1bSÁlvaro Fernández Rojas "gpio25", 304155cca1bSÁlvaro Fernández Rojas }; 305155cca1bSÁlvaro Fernández Rojas 306155cca1bSÁlvaro Fernández Rojas static const char * const uart1_sdin_groups[] = { 307155cca1bSÁlvaro Fernández Rojas "gpio12", 308155cca1bSÁlvaro Fernández Rojas "gpio26", 309155cca1bSÁlvaro Fernández Rojas }; 310155cca1bSÁlvaro Fernández Rojas 311155cca1bSÁlvaro Fernández Rojas static const char * const uart1_sdout_groups[] = { 312155cca1bSÁlvaro Fernández Rojas "gpio13", 313155cca1bSÁlvaro Fernández Rojas "gpio27", 314155cca1bSÁlvaro Fernández Rojas }; 315155cca1bSÁlvaro Fernández Rojas 316155cca1bSÁlvaro Fernández Rojas static const char * const ntr_pulse_in_groups[] = { 317155cca1bSÁlvaro Fernández Rojas "gpio14", 318155cca1bSÁlvaro Fernández Rojas "gpio28", 319155cca1bSÁlvaro Fernández Rojas }; 320155cca1bSÁlvaro Fernández Rojas 321155cca1bSÁlvaro Fernández Rojas static const char * const dsl_ntr_pulse_out_groups[] = { 322155cca1bSÁlvaro Fernández Rojas "gpio15", 323155cca1bSÁlvaro Fernández Rojas "gpio29", 324155cca1bSÁlvaro Fernández Rojas }; 325155cca1bSÁlvaro Fernández Rojas 326155cca1bSÁlvaro Fernández Rojas static const char * const adsl_spi_miso_groups[] = { 327155cca1bSÁlvaro Fernández Rojas "gpio18", 328155cca1bSÁlvaro Fernández Rojas }; 329155cca1bSÁlvaro Fernández Rojas 330155cca1bSÁlvaro Fernández Rojas static const char * const adsl_spi_mosi_groups[] = { 331155cca1bSÁlvaro Fernández Rojas "gpio19", 332155cca1bSÁlvaro Fernández Rojas }; 333155cca1bSÁlvaro Fernández Rojas 334155cca1bSÁlvaro Fernández Rojas static const char * const vreg_clk_groups[] = { 335155cca1bSÁlvaro Fernández Rojas "gpio22", 336155cca1bSÁlvaro Fernández Rojas }; 337155cca1bSÁlvaro Fernández Rojas 338155cca1bSÁlvaro Fernández Rojas static const char * const pcie_clkreq_b_groups[] = { 339155cca1bSÁlvaro Fernández Rojas "gpio23", 340155cca1bSÁlvaro Fernández Rojas }; 341155cca1bSÁlvaro Fernández Rojas 342155cca1bSÁlvaro Fernández Rojas static const char * const switch_led_clk_groups[] = { 343155cca1bSÁlvaro Fernández Rojas "gpio30", 344155cca1bSÁlvaro Fernández Rojas }; 345155cca1bSÁlvaro Fernández Rojas 346155cca1bSÁlvaro Fernández Rojas static const char * const switch_led_data_groups[] = { 347155cca1bSÁlvaro Fernández Rojas "gpio31", 348155cca1bSÁlvaro Fernández Rojas }; 349155cca1bSÁlvaro Fernández Rojas 350155cca1bSÁlvaro Fernández Rojas static const char * const wifi_groups[] = { 351155cca1bSÁlvaro Fernández Rojas "gpio32", 352155cca1bSÁlvaro Fernández Rojas "gpio33", 353155cca1bSÁlvaro Fernández Rojas "gpio34", 354155cca1bSÁlvaro Fernández Rojas "gpio35", 355155cca1bSÁlvaro Fernández Rojas "gpio36", 356155cca1bSÁlvaro Fernández Rojas "gpio37", 357155cca1bSÁlvaro Fernández Rojas "gpio38", 358155cca1bSÁlvaro Fernández Rojas "gpio39", 359155cca1bSÁlvaro Fernández Rojas "gpio40", 360155cca1bSÁlvaro Fernández Rojas "gpio41", 361155cca1bSÁlvaro Fernández Rojas "gpio42", 362155cca1bSÁlvaro Fernández Rojas "gpio43", 363155cca1bSÁlvaro Fernández Rojas "gpio44", 364155cca1bSÁlvaro Fernández Rojas "gpio45", 365155cca1bSÁlvaro Fernández Rojas "gpio46", 366155cca1bSÁlvaro Fernández Rojas "gpio47", 367155cca1bSÁlvaro Fernández Rojas "gpio48", 368155cca1bSÁlvaro Fernández Rojas "gpio49", 369155cca1bSÁlvaro Fernández Rojas "gpio50", 370155cca1bSÁlvaro Fernández Rojas "gpio51", 371155cca1bSÁlvaro Fernández Rojas }; 372155cca1bSÁlvaro Fernández Rojas 373155cca1bSÁlvaro Fernández Rojas static const char * const nand_groups[] = { 374155cca1bSÁlvaro Fernández Rojas "nand_grp", 375155cca1bSÁlvaro Fernández Rojas }; 376155cca1bSÁlvaro Fernández Rojas 377155cca1bSÁlvaro Fernández Rojas static const char * const dectpd_groups[] = { 378155cca1bSÁlvaro Fernández Rojas "dectpd_grp", 379155cca1bSÁlvaro Fernández Rojas }; 380155cca1bSÁlvaro Fernández Rojas 381155cca1bSÁlvaro Fernández Rojas static const char * const vdsl_phy_override_0_groups[] = { 382155cca1bSÁlvaro Fernández Rojas "vdsl_phy_override_0_grp", 383155cca1bSÁlvaro Fernández Rojas }; 384155cca1bSÁlvaro Fernández Rojas 385155cca1bSÁlvaro Fernández Rojas static const char * const vdsl_phy_override_1_groups[] = { 386155cca1bSÁlvaro Fernández Rojas "vdsl_phy_override_1_grp", 387155cca1bSÁlvaro Fernández Rojas }; 388155cca1bSÁlvaro Fernández Rojas 389155cca1bSÁlvaro Fernández Rojas static const char * const vdsl_phy_override_2_groups[] = { 390155cca1bSÁlvaro Fernández Rojas "vdsl_phy_override_2_grp", 391155cca1bSÁlvaro Fernández Rojas }; 392155cca1bSÁlvaro Fernández Rojas 393155cca1bSÁlvaro Fernández Rojas static const char * const vdsl_phy_override_3_groups[] = { 394155cca1bSÁlvaro Fernández Rojas "vdsl_phy_override_3_grp", 395155cca1bSÁlvaro Fernández Rojas }; 396155cca1bSÁlvaro Fernández Rojas 397155cca1bSÁlvaro Fernández Rojas #define BCM63268_LED_FUN(n) \ 398155cca1bSÁlvaro Fernández Rojas { \ 399155cca1bSÁlvaro Fernández Rojas .name = #n, \ 400155cca1bSÁlvaro Fernández Rojas .groups = n##_groups, \ 401155cca1bSÁlvaro Fernández Rojas .num_groups = ARRAY_SIZE(n##_groups), \ 402155cca1bSÁlvaro Fernández Rojas .reg = BCM63268_LEDCTRL, \ 403155cca1bSÁlvaro Fernández Rojas } 404155cca1bSÁlvaro Fernández Rojas 405155cca1bSÁlvaro Fernández Rojas #define BCM63268_MODE_FUN(n) \ 406155cca1bSÁlvaro Fernández Rojas { \ 407155cca1bSÁlvaro Fernández Rojas .name = #n, \ 408155cca1bSÁlvaro Fernández Rojas .groups = n##_groups, \ 409155cca1bSÁlvaro Fernández Rojas .num_groups = ARRAY_SIZE(n##_groups), \ 410155cca1bSÁlvaro Fernández Rojas .reg = BCM63268_MODE, \ 411155cca1bSÁlvaro Fernández Rojas } 412155cca1bSÁlvaro Fernández Rojas 413155cca1bSÁlvaro Fernández Rojas #define BCM63268_CTRL_FUN(n) \ 414155cca1bSÁlvaro Fernández Rojas { \ 415155cca1bSÁlvaro Fernández Rojas .name = #n, \ 416155cca1bSÁlvaro Fernández Rojas .groups = n##_groups, \ 417155cca1bSÁlvaro Fernández Rojas .num_groups = ARRAY_SIZE(n##_groups), \ 418155cca1bSÁlvaro Fernández Rojas .reg = BCM63268_CTRL, \ 419155cca1bSÁlvaro Fernández Rojas } 420155cca1bSÁlvaro Fernández Rojas 421155cca1bSÁlvaro Fernández Rojas #define BCM63268_BASEMODE_FUN(n, val) \ 422155cca1bSÁlvaro Fernández Rojas { \ 423155cca1bSÁlvaro Fernández Rojas .name = #n, \ 424155cca1bSÁlvaro Fernández Rojas .groups = n##_groups, \ 425155cca1bSÁlvaro Fernández Rojas .num_groups = ARRAY_SIZE(n##_groups), \ 426155cca1bSÁlvaro Fernández Rojas .reg = BCM63268_BASEMODE, \ 427155cca1bSÁlvaro Fernández Rojas .mask = val, \ 428155cca1bSÁlvaro Fernández Rojas } 429155cca1bSÁlvaro Fernández Rojas 430155cca1bSÁlvaro Fernández Rojas static const struct bcm63268_function bcm63268_funcs[] = { 431155cca1bSÁlvaro Fernández Rojas BCM63268_LED_FUN(led), 432155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(serial_led_clk), 433155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(serial_led_data), 434155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(hsspi_cs6), 435155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(hsspi_cs7), 436155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(uart1_scts), 437155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(uart1_srts), 438155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(uart1_sdin), 439155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(uart1_sdout), 440155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(ntr_pulse_in), 441155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(dsl_ntr_pulse_out), 442155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(hsspi_cs4), 443155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(hsspi_cs5), 444155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(adsl_spi_miso), 445155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(adsl_spi_mosi), 446155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(vreg_clk), 447155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(pcie_clkreq_b), 448155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(switch_led_clk), 449155cca1bSÁlvaro Fernández Rojas BCM63268_MODE_FUN(switch_led_data), 450155cca1bSÁlvaro Fernández Rojas BCM63268_CTRL_FUN(wifi), 451155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_FUN(nand, BCM63268_BASEMODE_NAND), 452155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_FUN(dectpd, BCM63268_BASEMODE_DECTPD), 453155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_FUN(vdsl_phy_override_0, 454155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_VDSL_PHY_0), 455155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_FUN(vdsl_phy_override_1, 456155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_VDSL_PHY_1), 457155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_FUN(vdsl_phy_override_2, 458155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_VDSL_PHY_2), 459155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_FUN(vdsl_phy_override_3, 460155cca1bSÁlvaro Fernández Rojas BCM63268_BASEMODE_VDSL_PHY_3), 461155cca1bSÁlvaro Fernández Rojas }; 462155cca1bSÁlvaro Fernández Rojas 463155cca1bSÁlvaro Fernández Rojas static int bcm63268_pinctrl_get_group_count(struct pinctrl_dev *pctldev) 464155cca1bSÁlvaro Fernández Rojas { 465155cca1bSÁlvaro Fernández Rojas return ARRAY_SIZE(bcm63268_groups); 466155cca1bSÁlvaro Fernández Rojas } 467155cca1bSÁlvaro Fernández Rojas 468155cca1bSÁlvaro Fernández Rojas static const char *bcm63268_pinctrl_get_group_name(struct pinctrl_dev *pctldev, 469155cca1bSÁlvaro Fernández Rojas unsigned group) 470155cca1bSÁlvaro Fernández Rojas { 471155cca1bSÁlvaro Fernández Rojas return bcm63268_groups[group].name; 472155cca1bSÁlvaro Fernández Rojas } 473155cca1bSÁlvaro Fernández Rojas 474155cca1bSÁlvaro Fernández Rojas static int bcm63268_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, 475155cca1bSÁlvaro Fernández Rojas unsigned group, 476155cca1bSÁlvaro Fernández Rojas const unsigned **pins, 477*0e3db163SAndy Shevchenko unsigned *npins) 478155cca1bSÁlvaro Fernández Rojas { 479155cca1bSÁlvaro Fernández Rojas *pins = bcm63268_groups[group].pins; 480*0e3db163SAndy Shevchenko *npins = bcm63268_groups[group].npins; 481155cca1bSÁlvaro Fernández Rojas 482155cca1bSÁlvaro Fernández Rojas return 0; 483155cca1bSÁlvaro Fernández Rojas } 484155cca1bSÁlvaro Fernández Rojas 485155cca1bSÁlvaro Fernández Rojas static int bcm63268_pinctrl_get_func_count(struct pinctrl_dev *pctldev) 486155cca1bSÁlvaro Fernández Rojas { 487155cca1bSÁlvaro Fernández Rojas return ARRAY_SIZE(bcm63268_funcs); 488155cca1bSÁlvaro Fernández Rojas } 489155cca1bSÁlvaro Fernández Rojas 490155cca1bSÁlvaro Fernández Rojas static const char *bcm63268_pinctrl_get_func_name(struct pinctrl_dev *pctldev, 491155cca1bSÁlvaro Fernández Rojas unsigned selector) 492155cca1bSÁlvaro Fernández Rojas { 493155cca1bSÁlvaro Fernández Rojas return bcm63268_funcs[selector].name; 494155cca1bSÁlvaro Fernández Rojas } 495155cca1bSÁlvaro Fernández Rojas 496155cca1bSÁlvaro Fernández Rojas static int bcm63268_pinctrl_get_groups(struct pinctrl_dev *pctldev, 497155cca1bSÁlvaro Fernández Rojas unsigned selector, 498155cca1bSÁlvaro Fernández Rojas const char * const **groups, 499155cca1bSÁlvaro Fernández Rojas unsigned * const num_groups) 500155cca1bSÁlvaro Fernández Rojas { 501155cca1bSÁlvaro Fernández Rojas *groups = bcm63268_funcs[selector].groups; 502155cca1bSÁlvaro Fernández Rojas *num_groups = bcm63268_funcs[selector].num_groups; 503155cca1bSÁlvaro Fernández Rojas 504155cca1bSÁlvaro Fernández Rojas return 0; 505155cca1bSÁlvaro Fernández Rojas } 506155cca1bSÁlvaro Fernández Rojas 507155cca1bSÁlvaro Fernández Rojas static void bcm63268_set_gpio(struct bcm63xx_pinctrl *pc, unsigned pin) 508155cca1bSÁlvaro Fernández Rojas { 509155cca1bSÁlvaro Fernández Rojas const struct pinctrl_pin_desc *desc = &bcm63268_pins[pin]; 510155cca1bSÁlvaro Fernández Rojas unsigned int basemode = (unsigned long) desc->drv_data; 511155cca1bSÁlvaro Fernández Rojas unsigned int mask = BIT(bcm63xx_bank_pin(pin)); 512155cca1bSÁlvaro Fernández Rojas 513155cca1bSÁlvaro Fernández Rojas if (basemode) 514155cca1bSÁlvaro Fernández Rojas regmap_update_bits(pc->regs, BCM63268_BASEMODE_REG, basemode, 515155cca1bSÁlvaro Fernández Rojas 0); 516155cca1bSÁlvaro Fernández Rojas 517155cca1bSÁlvaro Fernández Rojas if (pin < BCM63XX_BANK_GPIOS) { 518155cca1bSÁlvaro Fernández Rojas /* base mode: 0 => gpio, 1 => mux function */ 519155cca1bSÁlvaro Fernández Rojas regmap_update_bits(pc->regs, BCM63268_MODE_REG, mask, 0); 520155cca1bSÁlvaro Fernández Rojas 521155cca1bSÁlvaro Fernández Rojas /* pins 0-23 might be muxed to led */ 522155cca1bSÁlvaro Fernández Rojas if (pin < BCM63268_NUM_LEDS) 523155cca1bSÁlvaro Fernández Rojas regmap_update_bits(pc->regs, BCM63268_LED_REG, mask, 524155cca1bSÁlvaro Fernández Rojas 0); 525155cca1bSÁlvaro Fernández Rojas } else if (pin < BCM63268_NUM_GPIOS) { 526155cca1bSÁlvaro Fernández Rojas /* ctrl reg: 0 => wifi function, 1 => gpio */ 527155cca1bSÁlvaro Fernández Rojas regmap_update_bits(pc->regs, BCM63268_CTRL_REG, mask, mask); 528155cca1bSÁlvaro Fernández Rojas } 529155cca1bSÁlvaro Fernández Rojas } 530155cca1bSÁlvaro Fernández Rojas 531155cca1bSÁlvaro Fernández Rojas static int bcm63268_pinctrl_set_mux(struct pinctrl_dev *pctldev, 532155cca1bSÁlvaro Fernández Rojas unsigned selector, unsigned group) 533155cca1bSÁlvaro Fernández Rojas { 534155cca1bSÁlvaro Fernández Rojas struct bcm63xx_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); 535*0e3db163SAndy Shevchenko const struct pingroup *pg = &bcm63268_groups[group]; 536155cca1bSÁlvaro Fernández Rojas const struct bcm63268_function *f = &bcm63268_funcs[selector]; 537155cca1bSÁlvaro Fernández Rojas unsigned i; 538155cca1bSÁlvaro Fernández Rojas unsigned int reg; 539155cca1bSÁlvaro Fernández Rojas unsigned int val, mask; 540155cca1bSÁlvaro Fernández Rojas 541*0e3db163SAndy Shevchenko for (i = 0; i < pg->npins; i++) 542155cca1bSÁlvaro Fernández Rojas bcm63268_set_gpio(pc, pg->pins[i]); 543155cca1bSÁlvaro Fernández Rojas 544155cca1bSÁlvaro Fernández Rojas switch (f->reg) { 545155cca1bSÁlvaro Fernández Rojas case BCM63268_LEDCTRL: 546155cca1bSÁlvaro Fernández Rojas reg = BCM63268_LED_REG; 547155cca1bSÁlvaro Fernández Rojas mask = BIT(pg->pins[0]); 548155cca1bSÁlvaro Fernández Rojas val = BIT(pg->pins[0]); 549155cca1bSÁlvaro Fernández Rojas break; 550155cca1bSÁlvaro Fernández Rojas case BCM63268_MODE: 551155cca1bSÁlvaro Fernández Rojas reg = BCM63268_MODE_REG; 552155cca1bSÁlvaro Fernández Rojas mask = BIT(pg->pins[0]); 553155cca1bSÁlvaro Fernández Rojas val = BIT(pg->pins[0]); 554155cca1bSÁlvaro Fernández Rojas break; 555155cca1bSÁlvaro Fernández Rojas case BCM63268_CTRL: 556155cca1bSÁlvaro Fernández Rojas reg = BCM63268_CTRL_REG; 557155cca1bSÁlvaro Fernández Rojas mask = BIT(pg->pins[0]); 558155cca1bSÁlvaro Fernández Rojas val = 0; 559155cca1bSÁlvaro Fernández Rojas break; 560155cca1bSÁlvaro Fernández Rojas case BCM63268_BASEMODE: 561155cca1bSÁlvaro Fernández Rojas reg = BCM63268_BASEMODE_REG; 562155cca1bSÁlvaro Fernández Rojas mask = f->mask; 563155cca1bSÁlvaro Fernández Rojas val = f->mask; 564155cca1bSÁlvaro Fernández Rojas break; 565155cca1bSÁlvaro Fernández Rojas default: 566155cca1bSÁlvaro Fernández Rojas WARN_ON(1); 567155cca1bSÁlvaro Fernández Rojas return -EINVAL; 568155cca1bSÁlvaro Fernández Rojas } 569155cca1bSÁlvaro Fernández Rojas 570155cca1bSÁlvaro Fernández Rojas regmap_update_bits(pc->regs, reg, mask, val); 571155cca1bSÁlvaro Fernández Rojas 572155cca1bSÁlvaro Fernández Rojas return 0; 573155cca1bSÁlvaro Fernández Rojas } 574155cca1bSÁlvaro Fernández Rojas 575155cca1bSÁlvaro Fernández Rojas static int bcm63268_gpio_request_enable(struct pinctrl_dev *pctldev, 576155cca1bSÁlvaro Fernández Rojas struct pinctrl_gpio_range *range, 577155cca1bSÁlvaro Fernández Rojas unsigned offset) 578155cca1bSÁlvaro Fernández Rojas { 579155cca1bSÁlvaro Fernández Rojas struct bcm63xx_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); 580155cca1bSÁlvaro Fernández Rojas 581155cca1bSÁlvaro Fernández Rojas /* disable all functions using this pin */ 582155cca1bSÁlvaro Fernández Rojas bcm63268_set_gpio(pc, offset); 583155cca1bSÁlvaro Fernández Rojas 584155cca1bSÁlvaro Fernández Rojas return 0; 585155cca1bSÁlvaro Fernández Rojas } 586155cca1bSÁlvaro Fernández Rojas 587d9779093SRikard Falkeborn static const struct pinctrl_ops bcm63268_pctl_ops = { 588155cca1bSÁlvaro Fernández Rojas .dt_free_map = pinctrl_utils_free_map, 589155cca1bSÁlvaro Fernández Rojas .dt_node_to_map = pinconf_generic_dt_node_to_map_pin, 590155cca1bSÁlvaro Fernández Rojas .get_group_name = bcm63268_pinctrl_get_group_name, 591155cca1bSÁlvaro Fernández Rojas .get_group_pins = bcm63268_pinctrl_get_group_pins, 592155cca1bSÁlvaro Fernández Rojas .get_groups_count = bcm63268_pinctrl_get_group_count, 593155cca1bSÁlvaro Fernández Rojas }; 594155cca1bSÁlvaro Fernández Rojas 5950c683876SRikard Falkeborn static const struct pinmux_ops bcm63268_pmx_ops = { 596155cca1bSÁlvaro Fernández Rojas .get_function_groups = bcm63268_pinctrl_get_groups, 597155cca1bSÁlvaro Fernández Rojas .get_function_name = bcm63268_pinctrl_get_func_name, 598155cca1bSÁlvaro Fernández Rojas .get_functions_count = bcm63268_pinctrl_get_func_count, 599155cca1bSÁlvaro Fernández Rojas .gpio_request_enable = bcm63268_gpio_request_enable, 600155cca1bSÁlvaro Fernández Rojas .set_mux = bcm63268_pinctrl_set_mux, 601155cca1bSÁlvaro Fernández Rojas .strict = true, 602155cca1bSÁlvaro Fernández Rojas }; 603155cca1bSÁlvaro Fernández Rojas 604155cca1bSÁlvaro Fernández Rojas static const struct bcm63xx_pinctrl_soc bcm63268_soc = { 605155cca1bSÁlvaro Fernández Rojas .ngpios = BCM63268_NUM_GPIOS, 606155cca1bSÁlvaro Fernández Rojas .npins = ARRAY_SIZE(bcm63268_pins), 607155cca1bSÁlvaro Fernández Rojas .pctl_ops = &bcm63268_pctl_ops, 608155cca1bSÁlvaro Fernández Rojas .pins = bcm63268_pins, 609155cca1bSÁlvaro Fernández Rojas .pmx_ops = &bcm63268_pmx_ops, 610155cca1bSÁlvaro Fernández Rojas }; 611155cca1bSÁlvaro Fernández Rojas 612155cca1bSÁlvaro Fernández Rojas static int bcm63268_pinctrl_probe(struct platform_device *pdev) 613155cca1bSÁlvaro Fernández Rojas { 614155cca1bSÁlvaro Fernández Rojas return bcm63xx_pinctrl_probe(pdev, &bcm63268_soc, NULL); 615155cca1bSÁlvaro Fernández Rojas } 616155cca1bSÁlvaro Fernández Rojas 617155cca1bSÁlvaro Fernández Rojas static const struct of_device_id bcm63268_pinctrl_match[] = { 618155cca1bSÁlvaro Fernández Rojas { .compatible = "brcm,bcm63268-pinctrl", }, 619155cca1bSÁlvaro Fernández Rojas { /* sentinel */ } 620155cca1bSÁlvaro Fernández Rojas }; 621155cca1bSÁlvaro Fernández Rojas 622155cca1bSÁlvaro Fernández Rojas static struct platform_driver bcm63268_pinctrl_driver = { 623155cca1bSÁlvaro Fernández Rojas .probe = bcm63268_pinctrl_probe, 624155cca1bSÁlvaro Fernández Rojas .driver = { 625155cca1bSÁlvaro Fernández Rojas .name = "bcm63268-pinctrl", 626155cca1bSÁlvaro Fernández Rojas .of_match_table = bcm63268_pinctrl_match, 627155cca1bSÁlvaro Fernández Rojas }, 628155cca1bSÁlvaro Fernández Rojas }; 629155cca1bSÁlvaro Fernández Rojas 630155cca1bSÁlvaro Fernández Rojas builtin_platform_driver(bcm63268_pinctrl_driver); 631