0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/gpio/driver.h>
0009
0010
0011 #define NO_REG 0xFFFF
0012
0013 #define WMT_PINCTRL_BANK(__en, __dir, __dout, __din, __pen, __pcfg) \
0014 { \
0015 .reg_en = __en, \
0016 .reg_dir = __dir, \
0017 .reg_data_out = __dout, \
0018 .reg_data_in = __din, \
0019 .reg_pull_en = __pen, \
0020 .reg_pull_cfg = __pcfg, \
0021 }
0022
0023
0024 #define WMT_PIN(__bank, __offset) ((__bank << 5) | __offset)
0025 #define WMT_BANK_FROM_PIN(__pin) (__pin >> 5)
0026 #define WMT_BIT_FROM_PIN(__pin) (__pin & 0x1f)
0027
0028 #define WMT_GROUP(__name, __data) \
0029 { \
0030 .name = __name, \
0031 .pins = __data, \
0032 .npins = ARRAY_SIZE(__data), \
0033 }
0034
0035 struct wmt_pinctrl_bank_registers {
0036 u32 reg_en;
0037 u32 reg_dir;
0038 u32 reg_data_out;
0039 u32 reg_data_in;
0040
0041 u32 reg_pull_en;
0042 u32 reg_pull_cfg;
0043 };
0044
0045 struct wmt_pinctrl_group {
0046 const char *name;
0047 const unsigned int *pins;
0048 const unsigned npins;
0049 };
0050
0051 struct wmt_pinctrl_data {
0052 struct device *dev;
0053 struct pinctrl_dev *pctl_dev;
0054
0055
0056 void __iomem *base;
0057 const struct wmt_pinctrl_bank_registers *banks;
0058 const struct pinctrl_pin_desc *pins;
0059 const char * const *groups;
0060
0061 u32 nbanks;
0062 u32 npins;
0063 u32 ngroups;
0064
0065 struct gpio_chip gpio_chip;
0066 struct pinctrl_gpio_range gpio_range;
0067 };
0068
0069 int wmt_pinctrl_probe(struct platform_device *pdev,
0070 struct wmt_pinctrl_data *data);