18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Pinctrl driver for the Wondermedia SoC's 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2013 Tony Prisk <linux@prisktech.co.nz> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/gpio/driver.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* VT8500 has no enable register in the extgpio bank. */ 118c2ecf20Sopenharmony_ci#define NO_REG 0xFFFF 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#define WMT_PINCTRL_BANK(__en, __dir, __dout, __din, __pen, __pcfg) \ 148c2ecf20Sopenharmony_ci{ \ 158c2ecf20Sopenharmony_ci .reg_en = __en, \ 168c2ecf20Sopenharmony_ci .reg_dir = __dir, \ 178c2ecf20Sopenharmony_ci .reg_data_out = __dout, \ 188c2ecf20Sopenharmony_ci .reg_data_in = __din, \ 198c2ecf20Sopenharmony_ci .reg_pull_en = __pen, \ 208c2ecf20Sopenharmony_ci .reg_pull_cfg = __pcfg, \ 218c2ecf20Sopenharmony_ci} 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci/* Encode/decode the bank/bit pairs into a pin value */ 248c2ecf20Sopenharmony_ci#define WMT_PIN(__bank, __offset) ((__bank << 5) | __offset) 258c2ecf20Sopenharmony_ci#define WMT_BANK_FROM_PIN(__pin) (__pin >> 5) 268c2ecf20Sopenharmony_ci#define WMT_BIT_FROM_PIN(__pin) (__pin & 0x1f) 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define WMT_GROUP(__name, __data) \ 298c2ecf20Sopenharmony_ci{ \ 308c2ecf20Sopenharmony_ci .name = __name, \ 318c2ecf20Sopenharmony_ci .pins = __data, \ 328c2ecf20Sopenharmony_ci .npins = ARRAY_SIZE(__data), \ 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistruct wmt_pinctrl_bank_registers { 368c2ecf20Sopenharmony_ci u32 reg_en; 378c2ecf20Sopenharmony_ci u32 reg_dir; 388c2ecf20Sopenharmony_ci u32 reg_data_out; 398c2ecf20Sopenharmony_ci u32 reg_data_in; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci u32 reg_pull_en; 428c2ecf20Sopenharmony_ci u32 reg_pull_cfg; 438c2ecf20Sopenharmony_ci}; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistruct wmt_pinctrl_group { 468c2ecf20Sopenharmony_ci const char *name; 478c2ecf20Sopenharmony_ci const unsigned int *pins; 488c2ecf20Sopenharmony_ci const unsigned npins; 498c2ecf20Sopenharmony_ci}; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistruct wmt_pinctrl_data { 528c2ecf20Sopenharmony_ci struct device *dev; 538c2ecf20Sopenharmony_ci struct pinctrl_dev *pctl_dev; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci /* must be initialized before calling wmt_pinctrl_probe */ 568c2ecf20Sopenharmony_ci void __iomem *base; 578c2ecf20Sopenharmony_ci const struct wmt_pinctrl_bank_registers *banks; 588c2ecf20Sopenharmony_ci const struct pinctrl_pin_desc *pins; 598c2ecf20Sopenharmony_ci const char * const *groups; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci u32 nbanks; 628c2ecf20Sopenharmony_ci u32 npins; 638c2ecf20Sopenharmony_ci u32 ngroups; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci struct gpio_chip gpio_chip; 668c2ecf20Sopenharmony_ci struct pinctrl_gpio_range gpio_range; 678c2ecf20Sopenharmony_ci}; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ciint wmt_pinctrl_probe(struct platform_device *pdev, 708c2ecf20Sopenharmony_ci struct wmt_pinctrl_data *data); 71