linux/drivers/pinctrl/vt8500/pinctrl-wmt.h
Tony Prisk 170c6152ae pinctrl: gpio: vt8500: Add pincontrol driver for arch-vt8500
This patch adds support for the GPIO/pinmux controller found on the VIA
VT8500 and Wondermedia WM8xxx-series SoCs.

Each pin within the controller is capable of operating as a GPIO or as
an alternate function. The pins are numbered according to their control
bank/bit so that if new pins are added, the existing numbering is maintained.

All currently supported SoCs are included: VT8500, WM8505, WM8650, WM8750 and
WM8850.

Signed-off-by: Tony Prisk <linux@prisktech.co.nz>
Reviewed-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
2013-04-04 18:00:02 +13:00

80 lines
2.0 KiB
C

/*
* 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);