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