1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * OWL SoC's Pinctrl definitions 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2014 Actions Semi Inc. 6*4882a593Smuzhiyun * Author: David Liu <liuwei@actions-semi.com> 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Copyright (c) 2018 Linaro Ltd. 9*4882a593Smuzhiyun * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef __PINCTRL_OWL_H__ 13*4882a593Smuzhiyun #define __PINCTRL_OWL_H__ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define OWL_PINCONF_SLEW_SLOW 0 16*4882a593Smuzhiyun #define OWL_PINCONF_SLEW_FAST 1 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define MUX_PG(group_name, reg, shift, width) \ 19*4882a593Smuzhiyun { \ 20*4882a593Smuzhiyun .name = #group_name, \ 21*4882a593Smuzhiyun .pads = group_name##_pads, \ 22*4882a593Smuzhiyun .npads = ARRAY_SIZE(group_name##_pads), \ 23*4882a593Smuzhiyun .funcs = group_name##_funcs, \ 24*4882a593Smuzhiyun .nfuncs = ARRAY_SIZE(group_name##_funcs), \ 25*4882a593Smuzhiyun .mfpctl_reg = MFCTL##reg, \ 26*4882a593Smuzhiyun .mfpctl_shift = shift, \ 27*4882a593Smuzhiyun .mfpctl_width = width, \ 28*4882a593Smuzhiyun .drv_reg = -1, \ 29*4882a593Smuzhiyun .drv_shift = -1, \ 30*4882a593Smuzhiyun .drv_width = -1, \ 31*4882a593Smuzhiyun .sr_reg = -1, \ 32*4882a593Smuzhiyun .sr_shift = -1, \ 33*4882a593Smuzhiyun .sr_width = -1, \ 34*4882a593Smuzhiyun } 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define DRV_PG(group_name, reg, shift, width) \ 37*4882a593Smuzhiyun { \ 38*4882a593Smuzhiyun .name = #group_name, \ 39*4882a593Smuzhiyun .pads = group_name##_pads, \ 40*4882a593Smuzhiyun .npads = ARRAY_SIZE(group_name##_pads), \ 41*4882a593Smuzhiyun .mfpctl_reg = -1, \ 42*4882a593Smuzhiyun .mfpctl_shift = -1, \ 43*4882a593Smuzhiyun .mfpctl_width = -1, \ 44*4882a593Smuzhiyun .drv_reg = PAD_DRV##reg, \ 45*4882a593Smuzhiyun .drv_shift = shift, \ 46*4882a593Smuzhiyun .drv_width = width, \ 47*4882a593Smuzhiyun .sr_reg = -1, \ 48*4882a593Smuzhiyun .sr_shift = -1, \ 49*4882a593Smuzhiyun .sr_width = -1, \ 50*4882a593Smuzhiyun } 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #define SR_PG(group_name, reg, shift, width) \ 53*4882a593Smuzhiyun { \ 54*4882a593Smuzhiyun .name = #group_name, \ 55*4882a593Smuzhiyun .pads = group_name##_pads, \ 56*4882a593Smuzhiyun .npads = ARRAY_SIZE(group_name##_pads), \ 57*4882a593Smuzhiyun .mfpctl_reg = -1, \ 58*4882a593Smuzhiyun .mfpctl_shift = -1, \ 59*4882a593Smuzhiyun .mfpctl_width = -1, \ 60*4882a593Smuzhiyun .drv_reg = -1, \ 61*4882a593Smuzhiyun .drv_shift = -1, \ 62*4882a593Smuzhiyun .drv_width = -1, \ 63*4882a593Smuzhiyun .sr_reg = PAD_SR##reg, \ 64*4882a593Smuzhiyun .sr_shift = shift, \ 65*4882a593Smuzhiyun .sr_width = width, \ 66*4882a593Smuzhiyun } 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define FUNCTION(fname) \ 69*4882a593Smuzhiyun { \ 70*4882a593Smuzhiyun .name = #fname, \ 71*4882a593Smuzhiyun .groups = fname##_groups, \ 72*4882a593Smuzhiyun .ngroups = ARRAY_SIZE(fname##_groups), \ 73*4882a593Smuzhiyun } 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* PAD PULL UP/DOWN CONFIGURES */ 76*4882a593Smuzhiyun #define PULLCTL_CONF(pull_reg, pull_sft, pull_wdt) \ 77*4882a593Smuzhiyun { \ 78*4882a593Smuzhiyun .reg = PAD_PULLCTL##pull_reg, \ 79*4882a593Smuzhiyun .shift = pull_sft, \ 80*4882a593Smuzhiyun .width = pull_wdt, \ 81*4882a593Smuzhiyun } 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #define PAD_PULLCTL_CONF(pad_name, pull_reg, pull_sft, pull_wdt) \ 84*4882a593Smuzhiyun struct owl_pullctl pad_name##_pullctl_conf \ 85*4882a593Smuzhiyun = PULLCTL_CONF(pull_reg, pull_sft, pull_wdt) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define ST_CONF(st_reg, st_sft, st_wdt) \ 88*4882a593Smuzhiyun { \ 89*4882a593Smuzhiyun .reg = PAD_ST##st_reg, \ 90*4882a593Smuzhiyun .shift = st_sft, \ 91*4882a593Smuzhiyun .width = st_wdt, \ 92*4882a593Smuzhiyun } 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define PAD_ST_CONF(pad_name, st_reg, st_sft, st_wdt) \ 95*4882a593Smuzhiyun struct owl_st pad_name##_st_conf \ 96*4882a593Smuzhiyun = ST_CONF(st_reg, st_sft, st_wdt) 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #define PAD_INFO(name) \ 99*4882a593Smuzhiyun { \ 100*4882a593Smuzhiyun .pad = name, \ 101*4882a593Smuzhiyun .pullctl = NULL, \ 102*4882a593Smuzhiyun .st = NULL, \ 103*4882a593Smuzhiyun } 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define PAD_INFO_ST(name) \ 106*4882a593Smuzhiyun { \ 107*4882a593Smuzhiyun .pad = name, \ 108*4882a593Smuzhiyun .pullctl = NULL, \ 109*4882a593Smuzhiyun .st = &name##_st_conf, \ 110*4882a593Smuzhiyun } 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #define PAD_INFO_PULLCTL(name) \ 113*4882a593Smuzhiyun { \ 114*4882a593Smuzhiyun .pad = name, \ 115*4882a593Smuzhiyun .pullctl = &name##_pullctl_conf, \ 116*4882a593Smuzhiyun .st = NULL, \ 117*4882a593Smuzhiyun } 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #define PAD_INFO_PULLCTL_ST(name) \ 120*4882a593Smuzhiyun { \ 121*4882a593Smuzhiyun .pad = name, \ 122*4882a593Smuzhiyun .pullctl = &name##_pullctl_conf, \ 123*4882a593Smuzhiyun .st = &name##_st_conf, \ 124*4882a593Smuzhiyun } 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #define OWL_GPIO_PORT_A 0 127*4882a593Smuzhiyun #define OWL_GPIO_PORT_B 1 128*4882a593Smuzhiyun #define OWL_GPIO_PORT_C 2 129*4882a593Smuzhiyun #define OWL_GPIO_PORT_D 3 130*4882a593Smuzhiyun #define OWL_GPIO_PORT_E 4 131*4882a593Smuzhiyun #define OWL_GPIO_PORT_F 5 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define OWL_GPIO_PORT(port, base, count, _outen, _inen, _dat, _intc_ctl,\ 134*4882a593Smuzhiyun _intc_pd, _intc_msk, _intc_type, _share) \ 135*4882a593Smuzhiyun [OWL_GPIO_PORT_##port] = { \ 136*4882a593Smuzhiyun .offset = base, \ 137*4882a593Smuzhiyun .pins = count, \ 138*4882a593Smuzhiyun .outen = _outen, \ 139*4882a593Smuzhiyun .inen = _inen, \ 140*4882a593Smuzhiyun .dat = _dat, \ 141*4882a593Smuzhiyun .intc_ctl = _intc_ctl, \ 142*4882a593Smuzhiyun .intc_pd = _intc_pd, \ 143*4882a593Smuzhiyun .intc_msk = _intc_msk, \ 144*4882a593Smuzhiyun .intc_type = _intc_type, \ 145*4882a593Smuzhiyun .shared_ctl_offset = _share, \ 146*4882a593Smuzhiyun } 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun enum owl_pinconf_drv { 149*4882a593Smuzhiyun OWL_PINCONF_DRV_2MA, 150*4882a593Smuzhiyun OWL_PINCONF_DRV_4MA, 151*4882a593Smuzhiyun OWL_PINCONF_DRV_8MA, 152*4882a593Smuzhiyun OWL_PINCONF_DRV_12MA, 153*4882a593Smuzhiyun }; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /* GPIO CTRL Bit Definition */ 156*4882a593Smuzhiyun #define OWL_GPIO_CTLR_PENDING 0 157*4882a593Smuzhiyun #define OWL_GPIO_CTLR_ENABLE 1 158*4882a593Smuzhiyun #define OWL_GPIO_CTLR_SAMPLE_CLK_24M 2 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* GPIO TYPE Bit Definition */ 161*4882a593Smuzhiyun #define OWL_GPIO_INT_LEVEL_HIGH 0 162*4882a593Smuzhiyun #define OWL_GPIO_INT_LEVEL_LOW 1 163*4882a593Smuzhiyun #define OWL_GPIO_INT_EDGE_RISING 2 164*4882a593Smuzhiyun #define OWL_GPIO_INT_EDGE_FALLING 3 165*4882a593Smuzhiyun #define OWL_GPIO_INT_MASK 3 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /** 168*4882a593Smuzhiyun * struct owl_pullctl - Actions pad pull control register 169*4882a593Smuzhiyun * @reg: offset to the pull control register 170*4882a593Smuzhiyun * @shift: shift value of the register 171*4882a593Smuzhiyun * @width: width of the register 172*4882a593Smuzhiyun */ 173*4882a593Smuzhiyun struct owl_pullctl { 174*4882a593Smuzhiyun int reg; 175*4882a593Smuzhiyun unsigned int shift; 176*4882a593Smuzhiyun unsigned int width; 177*4882a593Smuzhiyun }; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /** 180*4882a593Smuzhiyun * struct owl_st - Actions pad schmitt trigger enable register 181*4882a593Smuzhiyun * @reg: offset to the schmitt trigger enable register 182*4882a593Smuzhiyun * @shift: shift value of the register 183*4882a593Smuzhiyun * @width: width of the register 184*4882a593Smuzhiyun */ 185*4882a593Smuzhiyun struct owl_st { 186*4882a593Smuzhiyun int reg; 187*4882a593Smuzhiyun unsigned int shift; 188*4882a593Smuzhiyun unsigned int width; 189*4882a593Smuzhiyun }; 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /** 192*4882a593Smuzhiyun * struct owl_pingroup - Actions pingroup definition 193*4882a593Smuzhiyun * @name: name of the pin group 194*4882a593Smuzhiyun * @pads: list of pins assigned to this pingroup 195*4882a593Smuzhiyun * @npads: size of @pads array 196*4882a593Smuzhiyun * @funcs: list of pinmux functions for this pingroup 197*4882a593Smuzhiyun * @nfuncs: size of @funcs array 198*4882a593Smuzhiyun * @mfpctl_reg: multiplexing control register offset 199*4882a593Smuzhiyun * @mfpctl_shift: multiplexing control register bit mask 200*4882a593Smuzhiyun * @mfpctl_width: multiplexing control register width 201*4882a593Smuzhiyun * @drv_reg: drive control register offset 202*4882a593Smuzhiyun * @drv_shift: drive control register bit mask 203*4882a593Smuzhiyun * @drv_width: driver control register width 204*4882a593Smuzhiyun * @sr_reg: slew rate control register offset 205*4882a593Smuzhiyun * @sr_shift: slew rate control register bit mask 206*4882a593Smuzhiyun * @sr_width: slew rate control register width 207*4882a593Smuzhiyun */ 208*4882a593Smuzhiyun struct owl_pingroup { 209*4882a593Smuzhiyun const char *name; 210*4882a593Smuzhiyun unsigned int *pads; 211*4882a593Smuzhiyun unsigned int npads; 212*4882a593Smuzhiyun unsigned int *funcs; 213*4882a593Smuzhiyun unsigned int nfuncs; 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun int mfpctl_reg; 216*4882a593Smuzhiyun unsigned int mfpctl_shift; 217*4882a593Smuzhiyun unsigned int mfpctl_width; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun int drv_reg; 220*4882a593Smuzhiyun unsigned int drv_shift; 221*4882a593Smuzhiyun unsigned int drv_width; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun int sr_reg; 224*4882a593Smuzhiyun unsigned int sr_shift; 225*4882a593Smuzhiyun unsigned int sr_width; 226*4882a593Smuzhiyun }; 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun /** 229*4882a593Smuzhiyun * struct owl_padinfo - Actions pinctrl pad info 230*4882a593Smuzhiyun * @pad: pad name of the SoC 231*4882a593Smuzhiyun * @pullctl: pull control register info 232*4882a593Smuzhiyun * @st: schmitt trigger register info 233*4882a593Smuzhiyun */ 234*4882a593Smuzhiyun struct owl_padinfo { 235*4882a593Smuzhiyun int pad; 236*4882a593Smuzhiyun struct owl_pullctl *pullctl; 237*4882a593Smuzhiyun struct owl_st *st; 238*4882a593Smuzhiyun }; 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun /** 241*4882a593Smuzhiyun * struct owl_pinmux_func - Actions pinctrl mux functions 242*4882a593Smuzhiyun * @name: name of the pinmux function. 243*4882a593Smuzhiyun * @groups: array of pin groups that may select this function. 244*4882a593Smuzhiyun * @ngroups: number of entries in @groups. 245*4882a593Smuzhiyun */ 246*4882a593Smuzhiyun struct owl_pinmux_func { 247*4882a593Smuzhiyun const char *name; 248*4882a593Smuzhiyun const char * const *groups; 249*4882a593Smuzhiyun unsigned int ngroups; 250*4882a593Smuzhiyun }; 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun /** 253*4882a593Smuzhiyun * struct owl_gpio_port - Actions GPIO port info 254*4882a593Smuzhiyun * @offset: offset of the GPIO port. 255*4882a593Smuzhiyun * @pins: number of pins belongs to the GPIO port. 256*4882a593Smuzhiyun * @outen: offset of the output enable register. 257*4882a593Smuzhiyun * @inen: offset of the input enable register. 258*4882a593Smuzhiyun * @dat: offset of the data register. 259*4882a593Smuzhiyun * @intc_ctl: offset of the interrupt control register. 260*4882a593Smuzhiyun * @intc_pd: offset of the interrupt pending register. 261*4882a593Smuzhiyun * @intc_msk: offset of the interrupt mask register. 262*4882a593Smuzhiyun * @intc_type: offset of the interrupt type register. 263*4882a593Smuzhiyun */ 264*4882a593Smuzhiyun struct owl_gpio_port { 265*4882a593Smuzhiyun unsigned int offset; 266*4882a593Smuzhiyun unsigned int pins; 267*4882a593Smuzhiyun unsigned int outen; 268*4882a593Smuzhiyun unsigned int inen; 269*4882a593Smuzhiyun unsigned int dat; 270*4882a593Smuzhiyun unsigned int intc_ctl; 271*4882a593Smuzhiyun unsigned int intc_pd; 272*4882a593Smuzhiyun unsigned int intc_msk; 273*4882a593Smuzhiyun unsigned int intc_type; 274*4882a593Smuzhiyun u8 shared_ctl_offset; 275*4882a593Smuzhiyun }; 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun /** 278*4882a593Smuzhiyun * struct owl_pinctrl_soc_data - Actions pin controller driver configuration 279*4882a593Smuzhiyun * @pins: array describing all pins of the pin controller. 280*4882a593Smuzhiyun * @npins: number of entries in @pins. 281*4882a593Smuzhiyun * @functions: array describing all mux functions of this SoC. 282*4882a593Smuzhiyun * @nfunction: number of entries in @functions. 283*4882a593Smuzhiyun * @groups: array describing all pin groups of this SoC. 284*4882a593Smuzhiyun * @ngroups: number of entries in @groups. 285*4882a593Smuzhiyun * @padinfo: array describing the pad info of this SoC. 286*4882a593Smuzhiyun * @ngpios: number of pingroups the driver should expose as GPIOs. 287*4882a593Smuzhiyun * @ports: array describing all GPIO ports of this SoC. 288*4882a593Smuzhiyun * @nports: number of GPIO ports in this SoC. 289*4882a593Smuzhiyun */ 290*4882a593Smuzhiyun struct owl_pinctrl_soc_data { 291*4882a593Smuzhiyun const struct pinctrl_pin_desc *pins; 292*4882a593Smuzhiyun unsigned int npins; 293*4882a593Smuzhiyun const struct owl_pinmux_func *functions; 294*4882a593Smuzhiyun unsigned int nfunctions; 295*4882a593Smuzhiyun const struct owl_pingroup *groups; 296*4882a593Smuzhiyun unsigned int ngroups; 297*4882a593Smuzhiyun const struct owl_padinfo *padinfo; 298*4882a593Smuzhiyun unsigned int ngpios; 299*4882a593Smuzhiyun const struct owl_gpio_port *ports; 300*4882a593Smuzhiyun unsigned int nports; 301*4882a593Smuzhiyun int (*padctl_val2arg)(const struct owl_padinfo *padinfo, 302*4882a593Smuzhiyun unsigned int param, 303*4882a593Smuzhiyun u32 *arg); 304*4882a593Smuzhiyun int (*padctl_arg2val)(const struct owl_padinfo *info, 305*4882a593Smuzhiyun unsigned int param, 306*4882a593Smuzhiyun u32 *arg); 307*4882a593Smuzhiyun }; 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun int owl_pinctrl_probe(struct platform_device *pdev, 310*4882a593Smuzhiyun struct owl_pinctrl_soc_data *soc_data); 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun #endif /* __PINCTRL_OWL_H__ */ 313