|  | /* | 
|  | * Pinctrl driver for the Wondermedia SoC's | 
|  | * | 
|  | * Copyright (c) 2013 Tony Prisk <linux@prisktech.co.nz> | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify it | 
|  | * under the terms and conditions of the GNU General Public License, | 
|  | * version 2, as published by the Free Software Foundation. | 
|  | * | 
|  | * This program is distributed in the hope it will be useful, but WITHOUT | 
|  | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|  | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | 
|  | * more details. | 
|  | */ | 
|  |  | 
|  | #include <linux/gpio.h> | 
|  |  | 
|  | /* VT8500 has no enable register in the extgpio bank. */ | 
|  | #define NO_REG	0xFFFF | 
|  |  | 
|  | #define WMT_PINCTRL_BANK(__en, __dir, __dout, __din, __pen, __pcfg)	\ | 
|  | {									\ | 
|  | .reg_en		= __en,						\ | 
|  | .reg_dir	= __dir,					\ | 
|  | .reg_data_out	= __dout,					\ | 
|  | .reg_data_in	= __din,					\ | 
|  | .reg_pull_en	= __pen,					\ | 
|  | .reg_pull_cfg	= __pcfg,					\ | 
|  | } | 
|  |  | 
|  | /* Encode/decode the bank/bit pairs into a pin value */ | 
|  | #define WMT_PIN(__bank, __offset)	((__bank << 5) | __offset) | 
|  | #define WMT_BANK_FROM_PIN(__pin)	(__pin >> 5) | 
|  | #define WMT_BIT_FROM_PIN(__pin)		(__pin & 0x1f) | 
|  |  | 
|  | #define WMT_GROUP(__name, __data)		\ | 
|  | {						\ | 
|  | .name = __name,				\ | 
|  | .pins = __data,				\ | 
|  | .npins = ARRAY_SIZE(__data),		\ | 
|  | } | 
|  |  | 
|  | struct wmt_pinctrl_bank_registers { | 
|  | u32	reg_en; | 
|  | u32	reg_dir; | 
|  | u32	reg_data_out; | 
|  | u32	reg_data_in; | 
|  |  | 
|  | u32	reg_pull_en; | 
|  | u32	reg_pull_cfg; | 
|  | }; | 
|  |  | 
|  | struct wmt_pinctrl_group { | 
|  | const char *name; | 
|  | const unsigned int *pins; | 
|  | const unsigned npins; | 
|  | }; | 
|  |  | 
|  | struct wmt_pinctrl_data { | 
|  | struct device *dev; | 
|  | struct pinctrl_dev *pctl_dev; | 
|  |  | 
|  | /* must be initialized before calling wmt_pinctrl_probe */ | 
|  | void __iomem *base; | 
|  | const struct wmt_pinctrl_bank_registers *banks; | 
|  | const struct pinctrl_pin_desc *pins; | 
|  | const char * const *groups; | 
|  |  | 
|  | u32 nbanks; | 
|  | u32 npins; | 
|  | u32 ngroups; | 
|  |  | 
|  | struct gpio_chip gpio_chip; | 
|  | struct pinctrl_gpio_range gpio_range; | 
|  | }; | 
|  |  | 
|  | int wmt_pinctrl_probe(struct platform_device *pdev, | 
|  | struct wmt_pinctrl_data *data); | 
|  | int wmt_pinctrl_remove(struct platform_device *pdev); |