Commit 170c6152 authored by Tony Prisk's avatar Tony Prisk

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: default avatarTony Prisk <linux@prisktech.co.nz>
Reviewed-by: default avatarStephen Warren <swarren@nvidia.com>
Acked-by: Linus Walleij's avatarLinus Walleij <linus.walleij@linaro.org>
parent 01bb914c
VIA VT8500 and Wondermedia WM8xxx-series pinmux/gpio controller
These SoCs contain a combined Pinmux/GPIO module. Each pin may operate as
either a GPIO in, GPIO out or as an alternate function (I2C, SPI etc).
Required properties:
- compatible: "via,vt8500-pinctrl", "wm,wm8505-pinctrl", "wm,wm8650-pinctrl",
"wm8750-pinctrl" or "wm,wm8850-pinctrl"
- reg: Should contain the physical address of the module's registers.
- interrupt-controller: Marks the device node as an interrupt controller.
- #interrupt-cells: Should be two.
- gpio-controller: Marks the device node as a GPIO controller.
- #gpio-cells : Should be two. The first cell is the pin number and the
second cell is used to specify optional parameters.
bit 0 - active low
Please refer to ../gpio/gpio.txt for a general description of GPIO bindings.
Please refer to pinctrl-bindings.txt in this directory for details of the
common pinctrl bindings used by client devices, including the meaning of the
phrase "pin configuration node".
Each pin configuration node lists the pin(s) to which it applies, and one or
more of the mux functions to select on those pin(s), and pull-up/down
configuration. Each subnode only affects those parameters that are explicitly
listed. In other words, a subnode that lists only a mux function implies no
information about any pull configuration. Similarly, a subnode that lists only
a pull parameter implies no information about the mux function.
Required subnode-properties:
- wm,pins: An array of cells. Each cell contains the ID of a pin.
Optional subnode-properties:
- wm,function: Integer, containing the function to mux to the pin(s):
0: GPIO in
1: GPIO out
2: alternate
- wm,pull: Integer, representing the pull-down/up to apply to the pin(s):
0: none
1: down
2: up
Each of wm,function and wm,pull may contain either a single value which
will be applied to all pins in wm,pins, or one value for each entry in
wm,pins.
Example:
pinctrl: pinctrl {
compatible = "wm,wm8505-pinctrl";
reg = <0xD8110000 0x10000>;
interrupt-controller;
#interrupt-cells = <2>;
gpio-controller;
#gpio-cells = <2>;
};
......@@ -7,6 +7,7 @@ config ARCH_VT8500
select GENERIC_CLOCKEVENTS
select HAVE_CLK
select VT8500_TIMER
select PINCTRL
help
Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip.
......
......@@ -229,6 +229,7 @@ config PINCTRL_EXYNOS5440
source "drivers/pinctrl/mvebu/Kconfig"
source "drivers/pinctrl/sh-pfc/Kconfig"
source "drivers/pinctrl/spear/Kconfig"
source "drivers/pinctrl/vt8500/Kconfig"
config PINCTRL_XWAY
bool
......
......@@ -52,3 +52,4 @@ obj-$(CONFIG_PLAT_ORION) += mvebu/
obj-$(CONFIG_ARCH_SHMOBILE) += sh-pfc/
obj-$(CONFIG_SUPERH) += sh-pfc/
obj-$(CONFIG_PLAT_SPEAR) += spear/
obj-$(CONFIG_ARCH_VT8500) += vt8500/
#
# VIA/Wondermedia PINCTRL drivers
#
if ARCH_VT8500
config PINCTRL_WMT
bool
select PINMUX
select GENERIC_PINCONF
config PINCTRL_VT8500
bool "VIA VT8500 pin controller driver"
depends on ARCH_WM8505
select PINCTRL_WMT
help
Say yes here to support the gpio/pin control module on
VIA VT8500 SoCs.
config PINCTRL_WM8505
bool "Wondermedia WM8505 pin controller driver"
depends on ARCH_WM8505
select PINCTRL_WMT
help
Say yes here to support the gpio/pin control module on
Wondermedia WM8505 SoCs.
config PINCTRL_WM8650
bool "Wondermedia WM8650 pin controller driver"
depends on ARCH_WM8505
select PINCTRL_WMT
help
Say yes here to support the gpio/pin control module on
Wondermedia WM8650 SoCs.
config PINCTRL_WM8750
bool "Wondermedia WM8750 pin controller driver"
depends on ARCH_WM8750
select PINCTRL_WMT
help
Say yes here to support the gpio/pin control module on
Wondermedia WM8750 SoCs.
config PINCTRL_WM8850
bool "Wondermedia WM8850 pin controller driver"
depends on ARCH_WM8850
select PINCTRL_WMT
help
Say yes here to support the gpio/pin control module on
Wondermedia WM8850 SoCs.
endif
# VIA/Wondermedia pinctrl support
obj-$(CONFIG_PINCTRL_WMT) += pinctrl-wmt.o
obj-$(CONFIG_PINCTRL_VT8500) += pinctrl-vt8500.o
obj-$(CONFIG_PINCTRL_WM8505) += pinctrl-wm8505.o
obj-$(CONFIG_PINCTRL_WM8650) += pinctrl-wm8650.o
obj-$(CONFIG_PINCTRL_WM8750) += pinctrl-wm8750.o
obj-$(CONFIG_PINCTRL_WM8850) += pinctrl-wm8850.o
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*
* 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);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment