Merge tag 'pinctrl-for-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
Pull pinctrl updates for v3.4 from Linus Walleij (*): - Switches the PXA 168, 910 and MMP over to use pinctrl - Locking revamped - Massive refactorings... - Reform the driver API to use multiple states - Support pin config in the mapping tables - Pinctrl drivers for the nVidia Tegra series - Generic pin config support lib for simple pin controllers - Implement pin config for the U300 * tag 'pinctrl-for-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (48 commits) ARM: u300: configure some pins as an example pinctrl: support pinconfig on the U300 pinctrl/coh901: use generic pinconf enums and parameters pinctrl: introduce generic pin config pinctrl: fix error path in pinconf_map_to_setting() pinctrl: allow concurrent gpio and mux function ownership of pins pinctrl: forward-declare struct device pinctrl: split pincontrol states into its own header pinctrl: include machine header to core.h ARM: tegra: Select PINCTRL Kconfig variables pinctrl: add a driver for NVIDIA Tegra pinctrl: Show selected function and group in pinmux-pins debugfs pinctrl: enhance mapping table to support pin config operations pinctrl: API changes to support multiple states per device pinctrl: add usecount to pins for muxing pinctrl: refactor struct pinctrl handling in core.c vs pinmux.c pinctrl: fix and simplify locking pinctrl: fix the pin descriptor kerneldoc pinctrl: assume map table entries can't have a NULL name field pinctrl: introduce PINCTRL_STATE_DEFAULT, define hogs as that state ... (*) What is it with all these Linuses these days? There's a Linus at google too. Some day I will get myself my own broadsword, and run around screaming "There can be only one". I used to be _special_ dammit. Snif.
This commit is contained in:
@@ -7,6 +7,8 @@ config ARCH_TEGRA_2x_SOC
|
||||
select CPU_V7
|
||||
select ARM_GIC
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select PINCTRL
|
||||
select PINCTRL_TEGRA20
|
||||
select USB_ARCH_HAS_EHCI if USB_SUPPORT
|
||||
select USB_ULPI if USB_SUPPORT
|
||||
select USB_ULPI_VIEWPORT if USB_SUPPORT
|
||||
@@ -19,6 +21,8 @@ config ARCH_TEGRA_3x_SOC
|
||||
select CPU_V7
|
||||
select ARM_GIC
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select PINCTRL
|
||||
select PINCTRL_TEGRA30
|
||||
select USB_ARCH_HAS_EHCI if USB_SUPPORT
|
||||
select USB_ULPI if USB_SUPPORT
|
||||
select USB_ULPI_VIEWPORT if USB_SUPPORT
|
||||
|
63
arch/arm/mach-tegra/include/mach/pinconf-tegra.h
Normal file
63
arch/arm/mach-tegra/include/mach/pinconf-tegra.h
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* pinctrl configuration definitions for the NVIDIA Tegra pinmux
|
||||
*
|
||||
* Copyright (c) 2011, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __PINCONF_TEGRA_H__
|
||||
#define __PINCONF_TEGRA_H__
|
||||
|
||||
enum tegra_pinconf_param {
|
||||
/* argument: tegra_pinconf_pull */
|
||||
TEGRA_PINCONF_PARAM_PULL,
|
||||
/* argument: tegra_pinconf_tristate */
|
||||
TEGRA_PINCONF_PARAM_TRISTATE,
|
||||
/* argument: Boolean */
|
||||
TEGRA_PINCONF_PARAM_ENABLE_INPUT,
|
||||
/* argument: Boolean */
|
||||
TEGRA_PINCONF_PARAM_OPEN_DRAIN,
|
||||
/* argument: Boolean */
|
||||
TEGRA_PINCONF_PARAM_LOCK,
|
||||
/* argument: Boolean */
|
||||
TEGRA_PINCONF_PARAM_IORESET,
|
||||
/* argument: Boolean */
|
||||
TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE,
|
||||
/* argument: Boolean */
|
||||
TEGRA_PINCONF_PARAM_SCHMITT,
|
||||
/* argument: Boolean */
|
||||
TEGRA_PINCONF_PARAM_LOW_POWER_MODE,
|
||||
/* argument: Integer, range is HW-dependant */
|
||||
TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH,
|
||||
/* argument: Integer, range is HW-dependant */
|
||||
TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH,
|
||||
/* argument: Integer, range is HW-dependant */
|
||||
TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING,
|
||||
/* argument: Integer, range is HW-dependant */
|
||||
TEGRA_PINCONF_PARAM_SLEW_RATE_RISING,
|
||||
};
|
||||
|
||||
enum tegra_pinconf_pull {
|
||||
TEGRA_PINCONFIG_PULL_NONE,
|
||||
TEGRA_PINCONFIG_PULL_DOWN,
|
||||
TEGRA_PINCONFIG_PULL_UP,
|
||||
};
|
||||
|
||||
enum tegra_pinconf_tristate {
|
||||
TEGRA_PINCONFIG_DRIVEN,
|
||||
TEGRA_PINCONFIG_TRISTATE,
|
||||
};
|
||||
|
||||
#define TEGRA_PINCONF_PACK(_param_, _arg_) ((_param_) << 16 | (_arg_))
|
||||
#define TEGRA_PINCONF_UNPACK_PARAM(_conf_) ((_conf_) >> 16)
|
||||
#define TEGRA_PINCONF_UNPACK_ARG(_conf_) ((_conf_) & 0xffff)
|
||||
|
||||
#endif
|
@@ -26,7 +26,8 @@
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/fsmc.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/pinctrl/pinmux.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
#include <linux/pinctrl/pinconf-generic.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/types.h>
|
||||
@@ -1477,7 +1478,7 @@ static struct coh901318_platform coh901318_platform = {
|
||||
.max_channels = U300_DMA_CHANNELS,
|
||||
};
|
||||
|
||||
static struct resource pinmux_resources[] = {
|
||||
static struct resource pinctrl_resources[] = {
|
||||
{
|
||||
.start = U300_SYSCON_BASE,
|
||||
.end = U300_SYSCON_BASE + SZ_4K - 1,
|
||||
@@ -1506,6 +1507,13 @@ static struct platform_device i2c1_device = {
|
||||
.resource = i2c1_resources,
|
||||
};
|
||||
|
||||
static struct platform_device pinctrl_device = {
|
||||
.name = "pinctrl-u300",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(pinctrl_resources),
|
||||
.resource = pinctrl_resources,
|
||||
};
|
||||
|
||||
/*
|
||||
* The different variants have a few different versions of the
|
||||
* GPIO block, with different number of ports.
|
||||
@@ -1525,6 +1533,7 @@ static struct u300_gpio_platform u300_gpio_plat = {
|
||||
#endif
|
||||
.gpio_base = 0,
|
||||
.gpio_irq_base = IRQ_U300_GPIO_BASE,
|
||||
.pinctrl_device = &pinctrl_device,
|
||||
};
|
||||
|
||||
static struct platform_device gpio_device = {
|
||||
@@ -1597,71 +1606,67 @@ static struct platform_device dma_device = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device pinmux_device = {
|
||||
.name = "pinmux-u300",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(pinmux_resources),
|
||||
.resource = pinmux_resources,
|
||||
static unsigned long pin_pullup_conf[] = {
|
||||
PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 1),
|
||||
};
|
||||
|
||||
/* Pinmux settings */
|
||||
static struct pinmux_map __initdata u300_pinmux_map[] = {
|
||||
static unsigned long pin_highz_conf[] = {
|
||||
PIN_CONF_PACKED(PIN_CONFIG_BIAS_HIGH_IMPEDANCE, 0),
|
||||
};
|
||||
|
||||
/* Pin control settings */
|
||||
static struct pinctrl_map __initdata u300_pinmux_map[] = {
|
||||
/* anonymous maps for chip power and EMIFs */
|
||||
PINMUX_MAP_SYS_HOG("POWER", "pinmux-u300", "power"),
|
||||
PINMUX_MAP_SYS_HOG("EMIF0", "pinmux-u300", "emif0"),
|
||||
PINMUX_MAP_SYS_HOG("EMIF1", "pinmux-u300", "emif1"),
|
||||
PIN_MAP_MUX_GROUP_HOG_DEFAULT("pinctrl-u300", NULL, "power"),
|
||||
PIN_MAP_MUX_GROUP_HOG_DEFAULT("pinctrl-u300", NULL, "emif0"),
|
||||
PIN_MAP_MUX_GROUP_HOG_DEFAULT("pinctrl-u300", NULL, "emif1"),
|
||||
/* per-device maps for MMC/SD, SPI and UART */
|
||||
PINMUX_MAP("MMCSD", "pinmux-u300", "mmc0", "mmci"),
|
||||
PINMUX_MAP("SPI", "pinmux-u300", "spi0", "pl022"),
|
||||
PINMUX_MAP("UART0", "pinmux-u300", "uart0", "uart0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("mmci", "pinctrl-u300", NULL, "mmc0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("pl022", "pinctrl-u300", NULL, "spi0"),
|
||||
PIN_MAP_MUX_GROUP_DEFAULT("uart0", "pinctrl-u300", NULL, "uart0"),
|
||||
/* This pin is used for clock return rather than GPIO */
|
||||
PIN_MAP_CONFIGS_PIN_DEFAULT("mmci", "pinctrl-u300", "PIO APP GPIO 11",
|
||||
pin_pullup_conf),
|
||||
/* This pin is used for card detect */
|
||||
PIN_MAP_CONFIGS_PIN_DEFAULT("mmci", "pinctrl-u300", "PIO MS INS",
|
||||
pin_highz_conf),
|
||||
};
|
||||
|
||||
struct u300_mux_hog {
|
||||
const char *name;
|
||||
struct device *dev;
|
||||
struct pinmux *pmx;
|
||||
struct pinctrl *p;
|
||||
};
|
||||
|
||||
static struct u300_mux_hog u300_mux_hogs[] = {
|
||||
{
|
||||
.name = "uart0",
|
||||
.dev = &uart0_device.dev,
|
||||
},
|
||||
{
|
||||
.name = "spi0",
|
||||
.dev = &pl022_device.dev,
|
||||
},
|
||||
{
|
||||
.name = "mmc0",
|
||||
.dev = &mmcsd_device.dev,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init u300_pinmux_fetch(void)
|
||||
static int __init u300_pinctrl_fetch(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(u300_mux_hogs); i++) {
|
||||
struct pinmux *pmx;
|
||||
int ret;
|
||||
struct pinctrl *p;
|
||||
|
||||
pmx = pinmux_get(u300_mux_hogs[i].dev, NULL);
|
||||
if (IS_ERR(pmx)) {
|
||||
pr_err("u300: could not get pinmux hog %s\n",
|
||||
u300_mux_hogs[i].name);
|
||||
p = pinctrl_get_select_default(u300_mux_hogs[i].dev);
|
||||
if (IS_ERR(p)) {
|
||||
pr_err("u300: could not get pinmux hog for dev %s\n",
|
||||
dev_name(u300_mux_hogs[i].dev));
|
||||
continue;
|
||||
}
|
||||
ret = pinmux_enable(pmx);
|
||||
if (ret) {
|
||||
pr_err("u300: could enable pinmux hog %s\n",
|
||||
u300_mux_hogs[i].name);
|
||||
continue;
|
||||
}
|
||||
u300_mux_hogs[i].pmx = pmx;
|
||||
u300_mux_hogs[i].p = p;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(u300_pinmux_fetch);
|
||||
subsys_initcall(u300_pinctrl_fetch);
|
||||
|
||||
/*
|
||||
* Notice that AMBA devices are initialized before platform devices.
|
||||
@@ -1676,7 +1681,6 @@ static struct platform_device *platform_devs[] __initdata = {
|
||||
&gpio_device,
|
||||
&nand_device,
|
||||
&wdog_device,
|
||||
&pinmux_device,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -1861,8 +1865,8 @@ void __init u300_init_devices(void)
|
||||
u300_assign_physmem();
|
||||
|
||||
/* Initialize pinmuxing */
|
||||
pinmux_register_mappings(u300_pinmux_map,
|
||||
ARRAY_SIZE(u300_pinmux_map));
|
||||
pinctrl_register_mappings(u300_pinmux_map,
|
||||
ARRAY_SIZE(u300_pinmux_map));
|
||||
|
||||
/* Register subdevices on the I2C buses */
|
||||
u300_i2c_register_board_devices();
|
||||
|
@@ -24,12 +24,14 @@ enum u300_gpio_variant {
|
||||
* @ports: number of GPIO block ports
|
||||
* @gpio_base: first GPIO number for this block (use a free range)
|
||||
* @gpio_irq_base: first GPIO IRQ number for this block (use a free range)
|
||||
* @pinctrl_device: pin control device to spawn as child
|
||||
*/
|
||||
struct u300_gpio_platform {
|
||||
enum u300_gpio_variant variant;
|
||||
u8 ports;
|
||||
int gpio_base;
|
||||
int gpio_irq_base;
|
||||
struct platform_device *pinctrl_device;
|
||||
};
|
||||
|
||||
#endif /* __MACH_U300_GPIO_U300_H */
|
||||
|
Reference in New Issue
Block a user