1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * linux/drivers/pinctrl/pinctrl-lantiq.h 4*4882a593Smuzhiyun * based on linux/drivers/pinctrl/pinctrl-pxa3xx.h 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2012 John Crispin <john@phrozen.org> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __PINCTRL_LANTIQ_H 10*4882a593Smuzhiyun #define __PINCTRL_LANTIQ_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/clkdev.h> 13*4882a593Smuzhiyun #include <linux/pinctrl/pinctrl.h> 14*4882a593Smuzhiyun #include <linux/pinctrl/pinconf.h> 15*4882a593Smuzhiyun #include <linux/pinctrl/pinmux.h> 16*4882a593Smuzhiyun #include <linux/pinctrl/consumer.h> 17*4882a593Smuzhiyun #include <linux/pinctrl/machine.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #include "core.h" 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define LTQ_MAX_MUX 4 24*4882a593Smuzhiyun #define MFPR_FUNC_MASK 0x3 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define LTQ_PINCONF_PACK(param, arg) ((param) << 16 | (arg)) 27*4882a593Smuzhiyun #define LTQ_PINCONF_UNPACK_PARAM(conf) ((conf) >> 16) 28*4882a593Smuzhiyun #define LTQ_PINCONF_UNPACK_ARG(conf) ((conf) & 0xffff) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun enum ltq_pinconf_param { 31*4882a593Smuzhiyun LTQ_PINCONF_PARAM_PULL, 32*4882a593Smuzhiyun LTQ_PINCONF_PARAM_OPEN_DRAIN, 33*4882a593Smuzhiyun LTQ_PINCONF_PARAM_DRIVE_CURRENT, 34*4882a593Smuzhiyun LTQ_PINCONF_PARAM_SLEW_RATE, 35*4882a593Smuzhiyun LTQ_PINCONF_PARAM_OUTPUT, 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct ltq_cfg_param { 39*4882a593Smuzhiyun const char *property; 40*4882a593Smuzhiyun enum ltq_pinconf_param param; 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun struct ltq_mfp_pin { 44*4882a593Smuzhiyun const char *name; 45*4882a593Smuzhiyun const unsigned int pin; 46*4882a593Smuzhiyun const unsigned short func[LTQ_MAX_MUX]; 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct ltq_pin_group { 50*4882a593Smuzhiyun const char *name; 51*4882a593Smuzhiyun const unsigned mux; 52*4882a593Smuzhiyun const unsigned *pins; 53*4882a593Smuzhiyun const unsigned npins; 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun struct ltq_pmx_func { 57*4882a593Smuzhiyun const char *name; 58*4882a593Smuzhiyun const char * const *groups; 59*4882a593Smuzhiyun const unsigned num_groups; 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun struct ltq_pinmux_info { 63*4882a593Smuzhiyun struct device *dev; 64*4882a593Smuzhiyun struct pinctrl_dev *pctrl; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* we need to manage up to 5 pad controllers */ 67*4882a593Smuzhiyun void __iomem *membase[5]; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* the descriptor for the subsystem */ 70*4882a593Smuzhiyun struct pinctrl_desc *desc; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* we expose our pads to the subsystem */ 73*4882a593Smuzhiyun struct pinctrl_pin_desc *pads; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* the number of pads. this varies between socs */ 76*4882a593Smuzhiyun unsigned int num_pads; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /* these are our multifunction pins */ 79*4882a593Smuzhiyun const struct ltq_mfp_pin *mfp; 80*4882a593Smuzhiyun unsigned int num_mfp; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* a number of multifunction pins can be grouped together */ 83*4882a593Smuzhiyun const struct ltq_pin_group *grps; 84*4882a593Smuzhiyun unsigned int num_grps; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* a mapping between function string and id */ 87*4882a593Smuzhiyun const struct ltq_pmx_func *funcs; 88*4882a593Smuzhiyun unsigned int num_funcs; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* the pinconf options that we are able to read from the DT */ 91*4882a593Smuzhiyun const struct ltq_cfg_param *params; 92*4882a593Smuzhiyun unsigned int num_params; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* the pad controller can have a irq mapping */ 95*4882a593Smuzhiyun const unsigned *exin; 96*4882a593Smuzhiyun unsigned int num_exin; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /* we need 5 clocks max */ 99*4882a593Smuzhiyun struct clk *clk[5]; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* soc specific callback used to apply muxing */ 102*4882a593Smuzhiyun int (*apply_mux)(struct pinctrl_dev *pctrldev, int pin, int mux); 103*4882a593Smuzhiyun }; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun enum ltq_pin { 106*4882a593Smuzhiyun GPIO0 = 0, 107*4882a593Smuzhiyun GPIO1, 108*4882a593Smuzhiyun GPIO2, 109*4882a593Smuzhiyun GPIO3, 110*4882a593Smuzhiyun GPIO4, 111*4882a593Smuzhiyun GPIO5, 112*4882a593Smuzhiyun GPIO6, 113*4882a593Smuzhiyun GPIO7, 114*4882a593Smuzhiyun GPIO8, 115*4882a593Smuzhiyun GPIO9, 116*4882a593Smuzhiyun GPIO10, /* 10 */ 117*4882a593Smuzhiyun GPIO11, 118*4882a593Smuzhiyun GPIO12, 119*4882a593Smuzhiyun GPIO13, 120*4882a593Smuzhiyun GPIO14, 121*4882a593Smuzhiyun GPIO15, 122*4882a593Smuzhiyun GPIO16, 123*4882a593Smuzhiyun GPIO17, 124*4882a593Smuzhiyun GPIO18, 125*4882a593Smuzhiyun GPIO19, 126*4882a593Smuzhiyun GPIO20, /* 20 */ 127*4882a593Smuzhiyun GPIO21, 128*4882a593Smuzhiyun GPIO22, 129*4882a593Smuzhiyun GPIO23, 130*4882a593Smuzhiyun GPIO24, 131*4882a593Smuzhiyun GPIO25, 132*4882a593Smuzhiyun GPIO26, 133*4882a593Smuzhiyun GPIO27, 134*4882a593Smuzhiyun GPIO28, 135*4882a593Smuzhiyun GPIO29, 136*4882a593Smuzhiyun GPIO30, /* 30 */ 137*4882a593Smuzhiyun GPIO31, 138*4882a593Smuzhiyun GPIO32, 139*4882a593Smuzhiyun GPIO33, 140*4882a593Smuzhiyun GPIO34, 141*4882a593Smuzhiyun GPIO35, 142*4882a593Smuzhiyun GPIO36, 143*4882a593Smuzhiyun GPIO37, 144*4882a593Smuzhiyun GPIO38, 145*4882a593Smuzhiyun GPIO39, 146*4882a593Smuzhiyun GPIO40, /* 40 */ 147*4882a593Smuzhiyun GPIO41, 148*4882a593Smuzhiyun GPIO42, 149*4882a593Smuzhiyun GPIO43, 150*4882a593Smuzhiyun GPIO44, 151*4882a593Smuzhiyun GPIO45, 152*4882a593Smuzhiyun GPIO46, 153*4882a593Smuzhiyun GPIO47, 154*4882a593Smuzhiyun GPIO48, 155*4882a593Smuzhiyun GPIO49, 156*4882a593Smuzhiyun GPIO50, /* 50 */ 157*4882a593Smuzhiyun GPIO51, 158*4882a593Smuzhiyun GPIO52, 159*4882a593Smuzhiyun GPIO53, 160*4882a593Smuzhiyun GPIO54, 161*4882a593Smuzhiyun GPIO55, 162*4882a593Smuzhiyun GPIO56, 163*4882a593Smuzhiyun GPIO57, 164*4882a593Smuzhiyun GPIO58, 165*4882a593Smuzhiyun GPIO59, 166*4882a593Smuzhiyun GPIO60, /* 60 */ 167*4882a593Smuzhiyun GPIO61, 168*4882a593Smuzhiyun GPIO62, 169*4882a593Smuzhiyun GPIO63, 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun GPIO64, 172*4882a593Smuzhiyun GPIO65, 173*4882a593Smuzhiyun GPIO66, 174*4882a593Smuzhiyun GPIO67, 175*4882a593Smuzhiyun GPIO68, 176*4882a593Smuzhiyun GPIO69, 177*4882a593Smuzhiyun GPIO70, 178*4882a593Smuzhiyun GPIO71, 179*4882a593Smuzhiyun GPIO72, 180*4882a593Smuzhiyun GPIO73, 181*4882a593Smuzhiyun GPIO74, 182*4882a593Smuzhiyun GPIO75, 183*4882a593Smuzhiyun GPIO76, 184*4882a593Smuzhiyun GPIO77, 185*4882a593Smuzhiyun GPIO78, 186*4882a593Smuzhiyun GPIO79, 187*4882a593Smuzhiyun GPIO80, 188*4882a593Smuzhiyun GPIO81, 189*4882a593Smuzhiyun GPIO82, 190*4882a593Smuzhiyun GPIO83, 191*4882a593Smuzhiyun GPIO84, 192*4882a593Smuzhiyun GPIO85, 193*4882a593Smuzhiyun GPIO86, 194*4882a593Smuzhiyun GPIO87, 195*4882a593Smuzhiyun GPIO88, 196*4882a593Smuzhiyun }; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun extern int ltq_pinctrl_register(struct platform_device *pdev, 199*4882a593Smuzhiyun struct ltq_pinmux_info *info); 200*4882a593Smuzhiyun extern int ltq_pinctrl_unregister(struct platform_device *pdev); 201*4882a593Smuzhiyun #endif /* __PINCTRL_LANTIQ_H */ 202