Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Pinctrl driver for the Wondermedia SoC's
0004  *
0005  * Copyright (c) 2013 Tony Prisk <linux@prisktech.co.nz>
0006  */
0007 
0008 #include <linux/gpio/driver.h>
0009 
0010 /* VT8500 has no enable register in the extgpio bank. */
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 /* Encode/decode the bank/bit pairs into a pin value */
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     /* must be initialized before calling wmt_pinctrl_probe */
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);