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 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 | /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2014 MediaTek Inc. * Author: Hongzhou.Yang <hongzhou.yang@mediatek.com> */ #ifndef __PINCTRL_MTK_COMMON_H #define __PINCTRL_MTK_COMMON_H #include <linux/pinctrl/pinctrl.h> #include <linux/regmap.h> #include <linux/pinctrl/pinconf-generic.h> #include "mtk-eint.h" #define NO_EINT_SUPPORT 255 #define MT_EDGE_SENSITIVE 0 #define MT_LEVEL_SENSITIVE 1 #define EINT_DBNC_SET_DBNC_BITS 4 #define EINT_DBNC_RST_BIT (0x1 << 1) #define EINT_DBNC_SET_EN (0x1 << 0) #define MTK_PINCTRL_NOT_SUPPORT (0xffff) struct mtk_desc_function { const char *name; unsigned char muxval; }; struct mtk_desc_eint { unsigned char eintmux; unsigned char eintnum; }; struct mtk_desc_pin { struct pinctrl_pin_desc pin; const struct mtk_desc_eint eint; const struct mtk_desc_function *functions; }; #define MTK_PIN(_pin, _pad, _chip, _eint, ...) \ { \ .pin = _pin, \ .eint = _eint, \ .functions = (struct mtk_desc_function[]){ \ __VA_ARGS__, { } }, \ } #define MTK_EINT_FUNCTION(_eintmux, _eintnum) \ { \ .eintmux = _eintmux, \ .eintnum = _eintnum, \ } #define MTK_FUNCTION(_val, _name) \ { \ .muxval = _val, \ .name = _name, \ } #define SET_ADDR(x, y) (x + (y->devdata->port_align)) #define CLR_ADDR(x, y) (x + (y->devdata->port_align << 1)) struct mtk_pinctrl_group { const char *name; unsigned long config; unsigned pin; }; /** * struct mtk_drv_group_desc - Provide driving group data. * @max_drv: The maximum current of this group. * @min_drv: The minimum current of this group. * @low_bit: The lowest bit of this group. * @high_bit: The highest bit of this group. * @step: The step current of this group. */ struct mtk_drv_group_desc { unsigned char min_drv; unsigned char max_drv; unsigned char low_bit; unsigned char high_bit; unsigned char step; }; #define MTK_DRV_GRP(_min, _max, _low, _high, _step) \ { \ .min_drv = _min, \ .max_drv = _max, \ .low_bit = _low, \ .high_bit = _high, \ .step = _step, \ } /** * struct mtk_pin_drv_grp - Provide each pin driving info. * @pin: The pin number. * @offset: The offset of driving register for this pin. * @bit: The bit of driving register for this pin. * @grp: The group for this pin belongs to. */ struct mtk_pin_drv_grp { unsigned short pin; unsigned short offset; unsigned char bit; unsigned char grp; }; #define MTK_PIN_DRV_GRP(_pin, _offset, _bit, _grp) \ { \ .pin = _pin, \ .offset = _offset, \ .bit = _bit, \ .grp = _grp, \ } /** * struct mtk_pin_spec_pupd_set_samereg * - For special pins' pull up/down setting which resides in same register * @pin: The pin number. * @offset: The offset of special pull up/down setting register. * @pupd_bit: The pull up/down bit in this register. * @r0_bit: The r0 bit of pull resistor. * @r1_bit: The r1 bit of pull resistor. */ struct mtk_pin_spec_pupd_set_samereg { unsigned short pin; unsigned short offset; unsigned char pupd_bit; unsigned char r1_bit; unsigned char r0_bit; }; #define MTK_PIN_PUPD_SPEC_SR(_pin, _offset, _pupd, _r1, _r0) \ { \ .pin = _pin, \ .offset = _offset, \ .pupd_bit = _pupd, \ .r1_bit = _r1, \ .r0_bit = _r0, \ } /** * struct mtk_pin_ies_set - For special pins' ies and smt setting. * @start: The start pin number of those special pins. * @end: The end pin number of those special pins. * @offset: The offset of special setting register. * @bit: The bit of special setting register. */ struct mtk_pin_ies_smt_set { unsigned short start; unsigned short end; unsigned short offset; unsigned char bit; }; #define MTK_PIN_IES_SMT_SPEC(_start, _end, _offset, _bit) \ { \ .start = _start, \ .end = _end, \ .bit = _bit, \ .offset = _offset, \ } struct mtk_eint_offsets { const char *name; unsigned int stat; unsigned int ack; unsigned int mask; unsigned int mask_set; unsigned int mask_clr; unsigned int sens; unsigned int sens_set; unsigned int sens_clr; unsigned int soft; unsigned int soft_set; unsigned int soft_clr; unsigned int pol; unsigned int pol_set; unsigned int pol_clr; unsigned int dom_en; unsigned int dbnc_ctrl; unsigned int dbnc_set; unsigned int dbnc_clr; u8 port_mask; u8 ports; }; /** * struct mtk_pinctrl_devdata - Provide HW GPIO related data. * @pins: An array describing all pins the pin controller affects. * @npins: The number of entries in @pins. * * @grp_desc: The driving group info. * @pin_drv_grp: The driving group for all pins. * @spec_ies: Special pin setting for input enable * @n_spec_ies: Number of entries in spec_ies * @spec_pupd: Special pull up/down setting * @n_spec_pupd: Number of entries in spec_pupd * @spec_smt: Special pin setting for schmitt * @n_spec_smt: Number of entries in spec_smt * @spec_pull_set: Each SoC may have special pins for pull up/down setting, * these pins' pull setting are very different, they have separate pull * up/down bit, R0 and R1 resistor bit, so they need special pull setting. * If special setting is success, this should return 0, otherwise it should * return non-zero value. * @spec_ies_smt_set: Some pins are irregular, their input enable and smt * control register are discontinuous, but they are mapping together. That * means when user set smt, input enable is set at the same time. So they * also need special control. If special control is success, this should * return 0, otherwise return non-zero value. * @spec_pinmux_set: In some cases, there are two pinmux functions share * the same value in the same segment of pinmux control register. If user * want to use one of the two functions, they need an extra bit setting to * select the right one. * @spec_dir_set: In very few SoCs, direction control registers are not * arranged continuously, they may be cut to parts. So they need special * dir setting. * @mt8365_set_clr_mode: In mt8365, some pins won't set correcty because they * need to use the main R/W register to read/update/write the modes instead of * the SET/CLR register. * * @dir_offset: The direction register offset. * @pullen_offset: The pull-up/pull-down enable register offset. * @pinmux_offset: The pinmux register offset. * * @type1_start: Some chips have two base addresses for pull select register, * that means some pins use the first address and others use the second. This * member record the start of pin number to use the second address. * @type1_end: The end of pin number to use the second address. * * @port_shf: The shift between two registers. * @port_mask: The mask of register. * @port_align: Provide clear register and set register step. */ struct mtk_pinctrl_devdata { const struct mtk_desc_pin *pins; unsigned int npins; const struct mtk_drv_group_desc *grp_desc; unsigned int n_grp_cls; const struct mtk_pin_drv_grp *pin_drv_grp; unsigned int n_pin_drv_grps; const struct mtk_pin_ies_smt_set *spec_ies; unsigned int n_spec_ies; const struct mtk_pin_spec_pupd_set_samereg *spec_pupd; unsigned int n_spec_pupd; const struct mtk_pin_ies_smt_set *spec_smt; unsigned int n_spec_smt; int (*spec_pull_set)(struct regmap *regmap, const struct mtk_pinctrl_devdata *devdata, unsigned int pin, bool isup, unsigned int r1r0); int (*spec_ies_smt_set)(struct regmap *reg, const struct mtk_pinctrl_devdata *devdata, unsigned int pin, int value, enum pin_config_param arg); void (*spec_pinmux_set)(struct regmap *reg, unsigned int pin, unsigned int mode); void (*spec_dir_set)(unsigned int *reg_addr, unsigned int pin); int (*mt8365_set_clr_mode)(struct regmap *regmap, unsigned int bit, unsigned int reg_pullen, unsigned int reg_pullsel, bool enable, bool isup); unsigned int dir_offset; unsigned int ies_offset; unsigned int smt_offset; unsigned int pullen_offset; unsigned int pullsel_offset; unsigned int drv_offset; unsigned int dout_offset; unsigned int din_offset; unsigned int pinmux_offset; unsigned short type1_start; unsigned short type1_end; unsigned char port_shf; unsigned char port_mask; unsigned char port_align; struct mtk_eint_hw eint_hw; struct mtk_eint_regs *eint_regs; unsigned int mode_mask; unsigned int mode_per_reg; unsigned int mode_shf; }; struct mtk_pinctrl { struct regmap *regmap1; struct regmap *regmap2; struct pinctrl_desc pctl_desc; struct device *dev; struct gpio_chip *chip; struct mtk_pinctrl_group *groups; unsigned ngroups; const char **grp_names; struct pinctrl_dev *pctl_dev; const struct mtk_pinctrl_devdata *devdata; struct mtk_eint *eint; }; int mtk_pctrl_init(struct platform_device *pdev, const struct mtk_pinctrl_devdata *data, struct regmap *regmap); int mtk_pctrl_common_probe(struct platform_device *pdev); int mtk_pctrl_spec_pull_set_samereg(struct regmap *regmap, const struct mtk_pinctrl_devdata *devdata, unsigned int pin, bool isup, unsigned int r1r0); int mtk_pconf_spec_set_ies_smt_range(struct regmap *regmap, const struct mtk_pinctrl_devdata *devdata, unsigned int pin, int value, enum pin_config_param arg); extern const struct dev_pm_ops mtk_eint_pm_ops; #endif /* __PINCTRL_MTK_COMMON_H */ |