162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Pinctrl driver for the Wondermedia SoC's 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2013 Tony Prisk <linux@prisktech.co.nz> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/gpio/driver.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* VT8500 has no enable register in the extgpio bank. */ 1162306a36Sopenharmony_ci#define NO_REG 0xFFFF 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define WMT_PINCTRL_BANK(__en, __dir, __dout, __din, __pen, __pcfg) \ 1462306a36Sopenharmony_ci{ \ 1562306a36Sopenharmony_ci .reg_en = __en, \ 1662306a36Sopenharmony_ci .reg_dir = __dir, \ 1762306a36Sopenharmony_ci .reg_data_out = __dout, \ 1862306a36Sopenharmony_ci .reg_data_in = __din, \ 1962306a36Sopenharmony_ci .reg_pull_en = __pen, \ 2062306a36Sopenharmony_ci .reg_pull_cfg = __pcfg, \ 2162306a36Sopenharmony_ci} 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* Encode/decode the bank/bit pairs into a pin value */ 2462306a36Sopenharmony_ci#define WMT_PIN(__bank, __offset) ((__bank << 5) | __offset) 2562306a36Sopenharmony_ci#define WMT_BANK_FROM_PIN(__pin) (__pin >> 5) 2662306a36Sopenharmony_ci#define WMT_BIT_FROM_PIN(__pin) (__pin & 0x1f) 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define WMT_GROUP(__name, __data) \ 2962306a36Sopenharmony_ci{ \ 3062306a36Sopenharmony_ci .name = __name, \ 3162306a36Sopenharmony_ci .pins = __data, \ 3262306a36Sopenharmony_ci .npins = ARRAY_SIZE(__data), \ 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistruct wmt_pinctrl_bank_registers { 3662306a36Sopenharmony_ci u32 reg_en; 3762306a36Sopenharmony_ci u32 reg_dir; 3862306a36Sopenharmony_ci u32 reg_data_out; 3962306a36Sopenharmony_ci u32 reg_data_in; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci u32 reg_pull_en; 4262306a36Sopenharmony_ci u32 reg_pull_cfg; 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct wmt_pinctrl_group { 4662306a36Sopenharmony_ci const char *name; 4762306a36Sopenharmony_ci const unsigned int *pins; 4862306a36Sopenharmony_ci const unsigned npins; 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistruct wmt_pinctrl_data { 5262306a36Sopenharmony_ci struct device *dev; 5362306a36Sopenharmony_ci struct pinctrl_dev *pctl_dev; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci /* must be initialized before calling wmt_pinctrl_probe */ 5662306a36Sopenharmony_ci void __iomem *base; 5762306a36Sopenharmony_ci const struct wmt_pinctrl_bank_registers *banks; 5862306a36Sopenharmony_ci const struct pinctrl_pin_desc *pins; 5962306a36Sopenharmony_ci const char * const *groups; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci u32 nbanks; 6262306a36Sopenharmony_ci u32 npins; 6362306a36Sopenharmony_ci u32 ngroups; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci struct gpio_chip gpio_chip; 6662306a36Sopenharmony_ci struct pinctrl_gpio_range gpio_range; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ciint wmt_pinctrl_probe(struct platform_device *pdev, 7062306a36Sopenharmony_ci struct wmt_pinctrl_data *data); 71