You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'pinctrl-v4.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
Pull pin control updates from Linus Walleij:
"This is the big bulk of pin control changes for the v4.4 kernel
development cycle. Development pace is high in pin control again this
merge window. 28 contributors, 83 patches.
It hits a few sites outside the pin control subsystem:
- Device tree bindings in Documentation (as usual)
- MAINTAINERS
- drivers/base/* for the "init" state handling by Doug Anderson.
This has been ACKed by Greg.
- drivers/usb/renesas_usbhs/rcar2.c, for a dependent Renesas change
in the USB subsystem. This has been ACKed by both Greg and Felipe.
- arch/arm/boot/dts/sama5d2.dtsi - this should ideally have gone
through the ARM SoC tree but ended up here.
This time I am using Geert Uytterhoeven as submaintainer for SH PFC
since the are three-four people working in parallel with new Renesas
ASICs.
Summary of changes:
Infrastructure:
- Doug Anderson wrote a patch adding an "init" state different from
the "default" state for pin control state handling in the core
framework. This is applied before the driver's probe() call if
defined and takes precedence over "default". If both are defined,
"init" will be applied *before* probe() and "default" will be
applied *after* probe().
Significant subdriver improvements:
- SH PFC is switched to getting GPIO ranges from the device tree
ranges property on DT platforms.
- Got rid of CONFIG_ARCH_SHMOBILE_LEGACY, we are all modernized.
- Got rid of SH PFC hardcoded IRQ numbers.
- Allwinner sunxi external interrupt through the "r" controller.
- Moved the Cygnus driver to use DT-provided GPIO ranges.
New drivers:
- Atmel PIO4 pin controller for the SAMA4D2 family
New subdrivers:
- Rockchip RK3036 subdriver
- Renesas SH PFC R8A7795 subdriver
- Allwinner sunxi A83T PIO subdriver
- Freescale i.MX7d iomux lpsr subdriver
- Marvell Berlin BG4CT subdriver
- SiRF Atlas 7 step B SoC subdriver
- Intel Broxton SoC subdriver
Apart from this, the usual slew if syntactic and semantic fixes"
* tag 'pinctrl-v4.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (81 commits)
pinctrl: pinconf: remove needless loop
pinctrl: uniphier: guard uniphier directory with CONFIG_PINCTRL_UNIPHIER
pinctrl: zynq: fix UTF-8 errors
pinctrl: zynq: Initialize early
pinctrl: at91: add missing of_node_put
pinctrl: tegra-xusb: Correct lane mux options
pinctrl: intel: Add Intel Broxton pin controller support
pinctrl: intel: Allow requesting pins which are in ACPI mode as GPIOs
pinctrl: intel: Add support for multiple GPIO chips sharing the interrupt
drivers/pinctrl: Add the concept of an "init" state
pinctrl: uniphier: set input-enable before pin-muxing
pinctrl: cygnus: Add new compatible string for gpio controller driver
pinctrl: cygnus: Remove GPIO to Pinctrl pin mapping from driver
pinctrl: cygnus: Optional DT property to support pin mappings
pinctrl: sunxi: Add irq pinmuxing to sun6i "r" pincontroller
pinctrl: sunxi: Fix irq_of_xlate for the r_pio pinctrl block
pinctrl: sh-pfc: Remove obsolete r8a7778 platform_device_id entry
pinctrl: sh-pfc: Remove obsolete r8a7779 platform_device_id entry
pinctrl: sh-pfc: Stop including <linux/platform_data/gpio-rcar.h>
usb: renesas_usbhs: Remove unneeded #include <linux/platform_data/gpio-rcar.h>
...
This commit is contained in:
@@ -17,6 +17,7 @@ Required properties:
|
||||
"allwinner,sun8i-a23-pinctrl"
|
||||
"allwinner,sun8i-a23-r-pinctrl"
|
||||
"allwinner,sun8i-a33-pinctrl"
|
||||
"allwinner,sun8i-a83t-pinctrl"
|
||||
|
||||
- reg: Should contain the register physical address and length for the
|
||||
pin controller.
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
* Atmel PIO4 Controller
|
||||
|
||||
The Atmel PIO4 controller is used to select the function of a pin and to
|
||||
configure it.
|
||||
|
||||
Required properties:
|
||||
- compatible: "atmel,sama5d2-pinctrl".
|
||||
- reg: base address and length of the PIO controller.
|
||||
- interrupts: interrupt outputs from the controller, one for each bank.
|
||||
- interrupt-controller: mark the device node as an interrupt controller.
|
||||
- #interrupt-cells: should be two.
|
||||
- gpio-controller: mark the device node as a gpio controller.
|
||||
- #gpio-cells: should be two.
|
||||
|
||||
Please refer to ../gpio/gpio.txt and ../interrupt-controller/interrupts.txt for
|
||||
a general description of GPIO and interrupt bindings.
|
||||
|
||||
Please refer to pinctrl-bindings.txt in this directory for details of the
|
||||
common pinctrl bindings used by client devices.
|
||||
|
||||
Subnode format
|
||||
Each node (or subnode) will list the pins it needs and how to configured these
|
||||
pins.
|
||||
|
||||
node {
|
||||
pinmux = <PIN_NUMBER_PINMUX>;
|
||||
GENERIC_PINCONFIG;
|
||||
};
|
||||
|
||||
Required properties:
|
||||
- pinmux: integer array. Each integer represents a pin number plus mux and
|
||||
ioset settings. Use the macros from boot/dts/<soc>-pinfunc.h file to get the
|
||||
right representation of the pin.
|
||||
|
||||
Optional properties:
|
||||
- GENERIC_PINCONFIG: generic pinconfig options to use, bias-disable,
|
||||
bias-pull-down, bias-pull-up, drive-open-drain, input-schmitt-enable,
|
||||
input-debounce, output-low, output-high.
|
||||
|
||||
Example:
|
||||
|
||||
#include <sama5d2-pinfunc.h>
|
||||
|
||||
...
|
||||
{
|
||||
pioA: pinctrl@fc038000 {
|
||||
compatible = "atmel,sama5d2-pinctrl";
|
||||
reg = <0xfc038000 0x600>;
|
||||
interrupts = <18 IRQ_TYPE_LEVEL_HIGH 7>,
|
||||
<68 IRQ_TYPE_LEVEL_HIGH 7>,
|
||||
<69 IRQ_TYPE_LEVEL_HIGH 7>,
|
||||
<70 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
clocks = <&pioA_clk>;
|
||||
|
||||
pinctrl_i2c0_default: i2c0_default {
|
||||
pinmux = <PIN_PD21__TWD0>,
|
||||
<PIN_PD22__TWCK0>;
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
pinctrl_led_gpio_default: led_gpio_default {
|
||||
pinmux = <PIN_PB0>,
|
||||
<PIN_PB5>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
pinctrl_sdmmc1_default: sdmmc1_default {
|
||||
cmd_data {
|
||||
pinmux = <PIN_PA28__SDMMC1_CMD>,
|
||||
<PIN_PA18__SDMMC1_DAT0>,
|
||||
<PIN_PA19__SDMMC1_DAT1>,
|
||||
<PIN_PA20__SDMMC1_DAT2>,
|
||||
<PIN_PA21__SDMMC1_DAT3>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
ck_cd {
|
||||
pinmux = <PIN_PA22__SDMMC1_CK>,
|
||||
<PIN_PA30__SDMMC1_CD>;
|
||||
bias-disable;
|
||||
};
|
||||
};
|
||||
...
|
||||
};
|
||||
};
|
||||
...
|
||||
@@ -20,7 +20,10 @@ Required properties:
|
||||
"marvell,berlin2cd-soc-pinctrl",
|
||||
"marvell,berlin2cd-system-pinctrl",
|
||||
"marvell,berlin2q-soc-pinctrl",
|
||||
"marvell,berlin2q-system-pinctrl"
|
||||
"marvell,berlin2q-system-pinctrl",
|
||||
"marvell,berlin4ct-avio-pinctrl",
|
||||
"marvell,berlin4ct-soc-pinctrl",
|
||||
"marvell,berlin4ct-system-pinctrl"
|
||||
|
||||
Required subnode-properties:
|
||||
- groups: a list of strings describing the group names.
|
||||
|
||||
@@ -3,8 +3,8 @@ Broadcom Cygnus GPIO/PINCONF Controller
|
||||
Required properties:
|
||||
|
||||
- compatible:
|
||||
Must be "brcm,cygnus-ccm-gpio", "brcm,cygnus-asiu-gpio", or
|
||||
"brcm,cygnus-crmu-gpio"
|
||||
Must be "brcm,cygnus-ccm-gpio", "brcm,cygnus-asiu-gpio",
|
||||
"brcm,cygnus-crmu-gpio" or "brcm,iproc-gpio"
|
||||
|
||||
- reg:
|
||||
Define the base and range of the I/O address space that contains the Cygnus
|
||||
@@ -26,9 +26,13 @@ Optional properties:
|
||||
- interrupt-controller:
|
||||
Specifies that the node is an interrupt controller
|
||||
|
||||
- pinmux:
|
||||
Specifies the phandle to the IOMUX device, where pins can be individually
|
||||
muxed to GPIO
|
||||
- gpio-ranges:
|
||||
Specifies the mapping between gpio controller and pin-controllers pins.
|
||||
This requires 4 fields in cells defined as -
|
||||
1. Phandle of pin-controller.
|
||||
2. GPIO base pin offset.
|
||||
3 Pin-control base pin offset.
|
||||
4. number of gpio pins which are linearly mapped from pin base.
|
||||
|
||||
Supported generic PINCONF properties in child nodes:
|
||||
|
||||
@@ -78,6 +82,8 @@ Example:
|
||||
gpio-controller;
|
||||
interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-controller;
|
||||
gpio-ranges = <&pinctrl 0 42 1>,
|
||||
<&pinctrl 1 44 3>;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,16 +1,42 @@
|
||||
* Freescale i.MX7 Dual IOMUX Controller
|
||||
|
||||
iMX7D supports two iomuxc controllers, fsl,imx7d-iomuxc controller is similar
|
||||
as previous iMX SoC generation and fsl,imx7d-iomuxc-lpsr which provides low
|
||||
power state retention capabilities on gpios that are part of iomuxc-lpsr
|
||||
(GPIO1_IO7..GPIO1_IO0). While iomuxc-lpsr provides its own set of registers for
|
||||
mux and pad control settings, it shares the input select register from main
|
||||
iomuxc controller for daisy chain settings, the fsl,input-sel property extends
|
||||
fsl,imx-pinctrl driver to support iomuxc-lpsr controller.
|
||||
|
||||
iomuxc_lpsr: iomuxc-lpsr@302c0000 {
|
||||
compatible = "fsl,imx7d-iomuxc-lpsr";
|
||||
reg = <0x302c0000 0x10000>;
|
||||
fsl,input-sel = <&iomuxc>;
|
||||
};
|
||||
|
||||
iomuxc: iomuxc@30330000 {
|
||||
compatible = "fsl,imx7d-iomuxc";
|
||||
reg = <0x30330000 0x10000>;
|
||||
};
|
||||
|
||||
Pheriparials using pads from iomuxc-lpsr support low state retention power
|
||||
state, under LPSR mode GPIO's state of pads are retain.
|
||||
|
||||
Please refer to fsl,imx-pinctrl.txt in this directory for common binding part
|
||||
and usage.
|
||||
|
||||
Required properties:
|
||||
- compatible: "fsl,imx7d-iomuxc"
|
||||
- compatible: "fsl,imx7d-iomuxc" for main IOMUXC controller, or
|
||||
"fsl,imx7d-iomuxc-lpsr" for Low Power State Retention IOMUXC controller.
|
||||
- fsl,pins: each entry consists of 6 integers and represents the mux and config
|
||||
setting for one pin. The first 5 integers <mux_reg conf_reg input_reg mux_val
|
||||
input_val> are specified using a PIN_FUNC_ID macro, which can be found in
|
||||
imx7d-pinfunc.h under device tree source folder. The last integer CONFIG is
|
||||
the pad setting value like pull-up on this pin. Please refer to i.MX7 Dual
|
||||
Reference Manual for detailed CONFIG settings.
|
||||
- fsl,input-sel: required property for iomuxc-lpsr controller, this property is
|
||||
a phandle for main iomuxc controller which shares the input select register for
|
||||
daisy chain settings.
|
||||
|
||||
CONFIG bits definition:
|
||||
PAD_CTL_PUS_100K_DOWN (0 << 5)
|
||||
@@ -25,3 +51,38 @@ PAD_CTL_DSE_X1 (0 << 0)
|
||||
PAD_CTL_DSE_X2 (1 << 0)
|
||||
PAD_CTL_DSE_X3 (2 << 0)
|
||||
PAD_CTL_DSE_X4 (3 << 0)
|
||||
|
||||
Examples:
|
||||
While iomuxc-lpsr is intended to be used by dedicated peripherals to take
|
||||
advantages of LPSR power mode, is also possible that an IP to use pads from
|
||||
any of the iomux controllers. For example the I2C1 IP can use SCL pad from
|
||||
iomuxc-lpsr controller and SDA pad from iomuxc controller as:
|
||||
|
||||
i2c1: i2c@30a20000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1_1 &pinctrl_i2c1_2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
iomuxc-lpsr@302c0000 {
|
||||
compatible = "fsl,imx7d-iomuxc-lpsr";
|
||||
reg = <0x302c0000 0x10000>;
|
||||
fsl,input-sel = <&iomuxc>;
|
||||
|
||||
pinctrl_i2c1_1: i2c1grp-1 {
|
||||
fsl,pins = <
|
||||
MX7D_PAD_GPIO1_IO04__I2C1_SCL 0x4000007f
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
iomuxc@30330000 {
|
||||
compatible = "fsl,imx7d-iomuxc";
|
||||
reg = <0x30330000 0x10000>;
|
||||
|
||||
pinctrl_i2c1_2: i2c1grp-2 {
|
||||
fsl,pins = <
|
||||
MX7D_PAD_I2C1_SDA__I2C1_SDA 0x4000007f
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -19,6 +19,7 @@ Required Properties:
|
||||
- "renesas,pfc-r8a7791": for R8A7791 (R-Car M2-W) compatible pin-controller.
|
||||
- "renesas,pfc-r8a7793": for R8A7793 (R-Car M2-N) compatible pin-controller.
|
||||
- "renesas,pfc-r8a7794": for R8A7794 (R-Car E2) compatible pin-controller.
|
||||
- "renesas,pfc-r8a7795": for R8A7795 (R-Car H3) compatible pin-controller.
|
||||
- "renesas,pfc-sh73a0": for SH73A0 (SH-Mobile AG5) compatible pin-controller.
|
||||
|
||||
- reg: Base address and length of each memory resource used by the pin
|
||||
|
||||
@@ -8181,6 +8181,13 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: drivers/pinctrl/pinctrl-at91.*
|
||||
|
||||
PIN CONTROLLER - ATMEL AT91 PIO4
|
||||
M: Ludovic Desroches <ludovic.desroches@atmel.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: linux-gpio@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/pinctrl/pinctrl-at91-pio4.*
|
||||
|
||||
PIN CONTROLLER - INTEL
|
||||
M: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||||
M: Heikki Krogerus <heikki.krogerus@linux.intel.com>
|
||||
|
||||
@@ -921,6 +921,20 @@
|
||||
clocks = <&twi1_clk>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
pioA: pinctrl@fc038000 {
|
||||
compatible = "atmel,sama5d2-pinctrl";
|
||||
reg = <0xfc038000 0x600>;
|
||||
interrupts = <18 IRQ_TYPE_LEVEL_HIGH 7>,
|
||||
<68 IRQ_TYPE_LEVEL_HIGH 7>,
|
||||
<69 IRQ_TYPE_LEVEL_HIGH 7>,
|
||||
<70 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
clocks = <&pioA_clk>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -322,6 +322,8 @@ static int really_probe(struct device *dev, struct device_driver *drv)
|
||||
goto probe_failed;
|
||||
}
|
||||
|
||||
pinctrl_init_done(dev);
|
||||
|
||||
if (dev->pm_domain && dev->pm_domain->sync)
|
||||
dev->pm_domain->sync(dev);
|
||||
|
||||
|
||||
+13
-2
@@ -42,9 +42,20 @@ int pinctrl_bind_pins(struct device *dev)
|
||||
goto cleanup_get;
|
||||
}
|
||||
|
||||
ret = pinctrl_select_state(dev->pins->p, dev->pins->default_state);
|
||||
dev->pins->init_state = pinctrl_lookup_state(dev->pins->p,
|
||||
PINCTRL_STATE_INIT);
|
||||
if (IS_ERR(dev->pins->init_state)) {
|
||||
/* Not supplying this state is perfectly legal */
|
||||
dev_dbg(dev, "no init pinctrl state\n");
|
||||
|
||||
ret = pinctrl_select_state(dev->pins->p,
|
||||
dev->pins->default_state);
|
||||
} else {
|
||||
ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
dev_dbg(dev, "failed to activate default pinctrl state\n");
|
||||
dev_dbg(dev, "failed to activate initial pinctrl state\n");
|
||||
goto cleanup_get;
|
||||
}
|
||||
|
||||
|
||||
@@ -67,6 +67,19 @@ config PINCTRL_AT91
|
||||
help
|
||||
Say Y here to enable the at91 pinctrl driver
|
||||
|
||||
config PINCTRL_AT91PIO4
|
||||
bool "AT91 PIO4 pinctrl driver"
|
||||
depends on OF
|
||||
depends on ARCH_AT91
|
||||
select PINMUX
|
||||
select GENERIC_PINCONF
|
||||
select GPIOLIB
|
||||
select GPIOLIB_IRQCHIP
|
||||
select OF_GPIO
|
||||
help
|
||||
Say Y here to enable the at91 pinctrl/gpio driver for Atmel PIO4
|
||||
controller available on sama5d2 SoC.
|
||||
|
||||
config PINCTRL_AMD
|
||||
bool "AMD GPIO pin control"
|
||||
depends on GPIOLIB
|
||||
|
||||
@@ -12,6 +12,7 @@ obj-$(CONFIG_PINCTRL_AS3722) += pinctrl-as3722.o
|
||||
obj-$(CONFIG_PINCTRL_BF54x) += pinctrl-adi2-bf54x.o
|
||||
obj-$(CONFIG_PINCTRL_BF60x) += pinctrl-adi2-bf60x.o
|
||||
obj-$(CONFIG_PINCTRL_AT91) += pinctrl-at91.o
|
||||
obj-$(CONFIG_PINCTRL_AT91PIO4) += pinctrl-at91-pio4.o
|
||||
obj-$(CONFIG_PINCTRL_AMD) += pinctrl-amd.o
|
||||
obj-$(CONFIG_PINCTRL_DIGICOLOR) += pinctrl-digicolor.o
|
||||
obj-$(CONFIG_PINCTRL_FALCON) += pinctrl-falcon.o
|
||||
@@ -50,6 +51,6 @@ obj-$(CONFIG_PINCTRL_SAMSUNG) += samsung/
|
||||
obj-$(CONFIG_PINCTRL_SH_PFC) += sh-pfc/
|
||||
obj-$(CONFIG_PLAT_SPEAR) += spear/
|
||||
obj-$(CONFIG_ARCH_SUNXI) += sunxi/
|
||||
obj-$(CONFIG_ARCH_UNIPHIER) += uniphier/
|
||||
obj-$(CONFIG_PINCTRL_UNIPHIER) += uniphier/
|
||||
obj-$(CONFIG_ARCH_VT8500) += vt8500/
|
||||
obj-$(CONFIG_ARCH_MEDIATEK) += mediatek/
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/pinctrl/pinmux.h>
|
||||
#include <linux/pinctrl/pinconf.h>
|
||||
#include <linux/pinctrl/pinconf-generic.h>
|
||||
|
||||
@@ -596,127 +595,6 @@ static const struct pinconf_ops cygnus_pconf_ops = {
|
||||
.pin_config_set = cygnus_pin_config_set,
|
||||
};
|
||||
|
||||
/*
|
||||
* Map a GPIO in the local gpio_chip pin space to a pin in the Cygnus IOMUX
|
||||
* pinctrl pin space
|
||||
*/
|
||||
struct cygnus_gpio_pin_range {
|
||||
unsigned offset;
|
||||
unsigned pin_base;
|
||||
unsigned num_pins;
|
||||
};
|
||||
|
||||
#define CYGNUS_PINRANGE(o, p, n) { .offset = o, .pin_base = p, .num_pins = n }
|
||||
|
||||
/*
|
||||
* Pin mapping table for mapping local GPIO pins to Cygnus IOMUX pinctrl pins
|
||||
*/
|
||||
static const struct cygnus_gpio_pin_range cygnus_gpio_pintable[] = {
|
||||
CYGNUS_PINRANGE(0, 42, 1),
|
||||
CYGNUS_PINRANGE(1, 44, 3),
|
||||
CYGNUS_PINRANGE(4, 48, 1),
|
||||
CYGNUS_PINRANGE(5, 50, 3),
|
||||
CYGNUS_PINRANGE(8, 126, 1),
|
||||
CYGNUS_PINRANGE(9, 155, 1),
|
||||
CYGNUS_PINRANGE(10, 152, 1),
|
||||
CYGNUS_PINRANGE(11, 154, 1),
|
||||
CYGNUS_PINRANGE(12, 153, 1),
|
||||
CYGNUS_PINRANGE(13, 127, 3),
|
||||
CYGNUS_PINRANGE(16, 140, 1),
|
||||
CYGNUS_PINRANGE(17, 145, 7),
|
||||
CYGNUS_PINRANGE(24, 130, 10),
|
||||
CYGNUS_PINRANGE(34, 141, 4),
|
||||
CYGNUS_PINRANGE(38, 54, 1),
|
||||
CYGNUS_PINRANGE(39, 56, 3),
|
||||
CYGNUS_PINRANGE(42, 60, 3),
|
||||
CYGNUS_PINRANGE(45, 64, 3),
|
||||
CYGNUS_PINRANGE(48, 68, 2),
|
||||
CYGNUS_PINRANGE(50, 84, 6),
|
||||
CYGNUS_PINRANGE(56, 94, 6),
|
||||
CYGNUS_PINRANGE(62, 72, 1),
|
||||
CYGNUS_PINRANGE(63, 70, 1),
|
||||
CYGNUS_PINRANGE(64, 80, 1),
|
||||
CYGNUS_PINRANGE(65, 74, 3),
|
||||
CYGNUS_PINRANGE(68, 78, 1),
|
||||
CYGNUS_PINRANGE(69, 82, 1),
|
||||
CYGNUS_PINRANGE(70, 156, 17),
|
||||
CYGNUS_PINRANGE(87, 104, 12),
|
||||
CYGNUS_PINRANGE(99, 102, 2),
|
||||
CYGNUS_PINRANGE(101, 90, 4),
|
||||
CYGNUS_PINRANGE(105, 116, 6),
|
||||
CYGNUS_PINRANGE(111, 100, 2),
|
||||
CYGNUS_PINRANGE(113, 122, 4),
|
||||
CYGNUS_PINRANGE(123, 11, 1),
|
||||
CYGNUS_PINRANGE(124, 38, 4),
|
||||
CYGNUS_PINRANGE(128, 43, 1),
|
||||
CYGNUS_PINRANGE(129, 47, 1),
|
||||
CYGNUS_PINRANGE(130, 49, 1),
|
||||
CYGNUS_PINRANGE(131, 53, 1),
|
||||
CYGNUS_PINRANGE(132, 55, 1),
|
||||
CYGNUS_PINRANGE(133, 59, 1),
|
||||
CYGNUS_PINRANGE(134, 63, 1),
|
||||
CYGNUS_PINRANGE(135, 67, 1),
|
||||
CYGNUS_PINRANGE(136, 71, 1),
|
||||
CYGNUS_PINRANGE(137, 73, 1),
|
||||
CYGNUS_PINRANGE(138, 77, 1),
|
||||
CYGNUS_PINRANGE(139, 79, 1),
|
||||
CYGNUS_PINRANGE(140, 81, 1),
|
||||
CYGNUS_PINRANGE(141, 83, 1),
|
||||
CYGNUS_PINRANGE(142, 10, 1)
|
||||
};
|
||||
|
||||
/*
|
||||
* The Cygnus IOMUX controller mainly supports group based mux configuration,
|
||||
* but certain pins can be muxed to GPIO individually. Only the ASIU GPIO
|
||||
* controller can support this, so it's an optional configuration
|
||||
*
|
||||
* Return -ENODEV means no support and that's fine
|
||||
*/
|
||||
static int cygnus_gpio_pinmux_add_range(struct cygnus_gpio *chip)
|
||||
{
|
||||
struct device_node *node = chip->dev->of_node;
|
||||
struct device_node *pinmux_node;
|
||||
struct platform_device *pinmux_pdev;
|
||||
struct gpio_chip *gc = &chip->gc;
|
||||
int i, ret = 0;
|
||||
|
||||
/* parse DT to find the phandle to the pinmux controller */
|
||||
pinmux_node = of_parse_phandle(node, "pinmux", 0);
|
||||
if (!pinmux_node)
|
||||
return -ENODEV;
|
||||
|
||||
pinmux_pdev = of_find_device_by_node(pinmux_node);
|
||||
/* no longer need the pinmux node */
|
||||
of_node_put(pinmux_node);
|
||||
if (!pinmux_pdev) {
|
||||
dev_err(chip->dev, "failed to get pinmux device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* now need to create the mapping between local GPIO and PINMUX pins */
|
||||
for (i = 0; i < ARRAY_SIZE(cygnus_gpio_pintable); i++) {
|
||||
ret = gpiochip_add_pin_range(gc, dev_name(&pinmux_pdev->dev),
|
||||
cygnus_gpio_pintable[i].offset,
|
||||
cygnus_gpio_pintable[i].pin_base,
|
||||
cygnus_gpio_pintable[i].num_pins);
|
||||
if (ret) {
|
||||
dev_err(chip->dev, "unable to add GPIO pin range\n");
|
||||
goto err_put_device;
|
||||
}
|
||||
}
|
||||
|
||||
chip->pinmux_is_supported = true;
|
||||
|
||||
/* no need for pinmux_pdev device reference anymore */
|
||||
put_device(&pinmux_pdev->dev);
|
||||
return 0;
|
||||
|
||||
err_put_device:
|
||||
put_device(&pinmux_pdev->dev);
|
||||
gpiochip_remove_pin_ranges(gc);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Cygnus GPIO controller supports some PINCONF related configurations such as
|
||||
* pull up, pull down, and drive strength, when the pin is configured to GPIO
|
||||
@@ -851,18 +729,15 @@ static int cygnus_gpio_probe(struct platform_device *pdev)
|
||||
gc->set = cygnus_gpio_set;
|
||||
gc->get = cygnus_gpio_get;
|
||||
|
||||
chip->pinmux_is_supported = of_property_read_bool(dev->of_node,
|
||||
"gpio-ranges");
|
||||
|
||||
ret = gpiochip_add(gc);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "unable to add GPIO chip\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = cygnus_gpio_pinmux_add_range(chip);
|
||||
if (ret && ret != -ENODEV) {
|
||||
dev_err(dev, "unable to add GPIO pin range\n");
|
||||
goto err_rm_gpiochip;
|
||||
}
|
||||
|
||||
ret = cygnus_gpio_register_pinconf(chip);
|
||||
if (ret) {
|
||||
dev_err(dev, "unable to register pinconf\n");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
if ARCH_BERLIN
|
||||
if (ARCH_BERLIN || COMPILE_TEST)
|
||||
|
||||
config PINCTRL_BERLIN
|
||||
bool
|
||||
@@ -6,15 +6,23 @@ config PINCTRL_BERLIN
|
||||
select REGMAP_MMIO
|
||||
|
||||
config PINCTRL_BERLIN_BG2
|
||||
bool
|
||||
def_bool MACH_BERLIN_BG2
|
||||
depends on OF
|
||||
select PINCTRL_BERLIN
|
||||
|
||||
config PINCTRL_BERLIN_BG2CD
|
||||
bool
|
||||
def_bool MACH_BERLIN_BG2CD
|
||||
depends on OF
|
||||
select PINCTRL_BERLIN
|
||||
|
||||
config PINCTRL_BERLIN_BG2Q
|
||||
bool
|
||||
def_bool MACH_BERLIN_BG2Q
|
||||
depends on OF
|
||||
select PINCTRL_BERLIN
|
||||
|
||||
config PINCTRL_BERLIN_BG4CT
|
||||
bool "Marvell berlin4ct pin controller driver"
|
||||
depends on OF
|
||||
select PINCTRL_BERLIN
|
||||
|
||||
endif
|
||||
|
||||
@@ -2,3 +2,4 @@ obj-$(CONFIG_PINCTRL_BERLIN) += berlin.o
|
||||
obj-$(CONFIG_PINCTRL_BERLIN_BG2) += berlin-bg2.o
|
||||
obj-$(CONFIG_PINCTRL_BERLIN_BG2CD) += berlin-bg2cd.o
|
||||
obj-$(CONFIG_PINCTRL_BERLIN_BG2Q) += berlin-bg2q.o
|
||||
obj-$(CONFIG_PINCTRL_BERLIN_BG4CT) += berlin-bg4ct.o
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 2014 Marvell Technology Group Ltd.
|
||||
*
|
||||
* Antoine Ténart <antoine.tenart@free-electrons.com>
|
||||
* Antoine Ténart <antoine.tenart@free-electrons.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
@@ -246,6 +246,6 @@ static struct platform_driver berlin2_pinctrl_driver = {
|
||||
};
|
||||
module_platform_driver(berlin2_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Antoine Ténart <antoine.tenart@free-electrons.com>");
|
||||
MODULE_AUTHOR("Antoine Ténart <antoine.tenart@free-electrons.com>");
|
||||
MODULE_DESCRIPTION("Marvell Berlin BG2 pinctrl driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 2014 Marvell Technology Group Ltd.
|
||||
*
|
||||
* Antoine Ténart <antoine.tenart@free-electrons.com>
|
||||
* Antoine Ténart <antoine.tenart@free-electrons.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
@@ -19,24 +19,24 @@
|
||||
|
||||
static const struct berlin_desc_group berlin2cd_soc_pinctrl_groups[] = {
|
||||
/* G */
|
||||
BERLIN_PINCTRL_GROUP("G0", 0x00, 0x1, 0x00,
|
||||
BERLIN_PINCTRL_GROUP("G0", 0x00, 0x3, 0x00,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x2, "led"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x3, "pwm")),
|
||||
BERLIN_PINCTRL_GROUP("G1", 0x00, 0x2, 0x01,
|
||||
BERLIN_PINCTRL_GROUP("G1", 0x00, 0x3, 0x03,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
|
||||
BERLIN_PINCTRL_GROUP("G2", 0x00, 0x2, 0x02,
|
||||
BERLIN_PINCTRL_GROUP("G2", 0x00, 0x3, 0x06,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x2, "fe"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x3, "pll"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
|
||||
BERLIN_PINCTRL_GROUP("G3", 0x00, 0x2, 0x04,
|
||||
BERLIN_PINCTRL_GROUP("G3", 0x00, 0x3, 0x09,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x2, "twsi2"),
|
||||
@@ -44,7 +44,7 @@ static const struct berlin_desc_group berlin2cd_soc_pinctrl_groups[] = {
|
||||
BERLIN_PINCTRL_FUNCTION(0x4, "fe"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
|
||||
BERLIN_PINCTRL_GROUP("G4", 0x00, 0x2, 0x06,
|
||||
BERLIN_PINCTRL_GROUP("G4", 0x00, 0x3, 0x0c,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x2, "twsi3"),
|
||||
@@ -52,7 +52,7 @@ static const struct berlin_desc_group berlin2cd_soc_pinctrl_groups[] = {
|
||||
BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
|
||||
BERLIN_PINCTRL_GROUP("G5", 0x00, 0x3, 0x08,
|
||||
BERLIN_PINCTRL_GROUP("G5", 0x00, 0x3, 0x0f,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x2, "twsi3"),
|
||||
@@ -60,64 +60,66 @@ static const struct berlin_desc_group berlin2cd_soc_pinctrl_groups[] = {
|
||||
BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
|
||||
BERLIN_PINCTRL_GROUP("G6", 0x00, 0x2, 0x0b,
|
||||
BERLIN_PINCTRL_GROUP("G6", 0x00, 0x3, 0x12,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* RX/TX */
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
|
||||
BERLIN_PINCTRL_GROUP("G7", 0x00, 0x3, 0x0d,
|
||||
BERLIN_PINCTRL_GROUP("G7", 0x00, 0x3, 0x15,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "eddc"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "twsi1"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
|
||||
BERLIN_PINCTRL_GROUP("G8", 0x00, 0x3, 0x10,
|
||||
BERLIN_PINCTRL_GROUP("G8", 0x00, 0x3, 0x18,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n */
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
|
||||
BERLIN_PINCTRL_GROUP("G9", 0x00, 0x3, 0x13,
|
||||
BERLIN_PINCTRL_GROUP("G9", 0x00, 0x3, 0x1b,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS1n/SS2n */
|
||||
BERLIN_PINCTRL_FUNCTION(0x2, "twsi0")),
|
||||
BERLIN_PINCTRL_GROUP("G10", 0x00, 0x2, 0x16,
|
||||
BERLIN_PINCTRL_FUNCTION(0x3, "twsi0")),
|
||||
BERLIN_PINCTRL_GROUP("G10", 0x00, 0x2, 0x1e,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* CLK */
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
|
||||
BERLIN_PINCTRL_GROUP("G11", 0x00, 0x2, 0x18,
|
||||
BERLIN_PINCTRL_GROUP("G11", 0x04, 0x2, 0x00,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SDI/SDO */
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
|
||||
BERLIN_PINCTRL_GROUP("G12", 0x00, 0x3, 0x1a,
|
||||
BERLIN_PINCTRL_GROUP("G12", 0x04, 0x3, 0x02,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "usb1"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
|
||||
BERLIN_PINCTRL_GROUP("G13", 0x04, 0x3, 0x00,
|
||||
BERLIN_PINCTRL_GROUP("G13", 0x04, 0x3, 0x05,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "usb0_dbg"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x2, "usb1_dbg")),
|
||||
BERLIN_PINCTRL_GROUP("G14", 0x04, 0x1, 0x03,
|
||||
BERLIN_PINCTRL_GROUP("G14", 0x04, 0x1, 0x08,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
|
||||
BERLIN_PINCTRL_GROUP("G15", 0x04, 0x2, 0x04,
|
||||
BERLIN_PINCTRL_GROUP("G15", 0x04, 0x3, 0x09,
|
||||
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
|
||||
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
|
||||
BERLIN_PINCTRL_GROUP("G16", 0x04, 0x3, 0x06,
|
||||
BERLIN_PINCTRL_GROUP("G16", 0x04, 0x3, 0x0c,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G17", 0x04, 0x3, 0x09,
|
||||
BERLIN_PINCTRL_GROUP("G17", 0x04, 0x3, 0x0f,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G18", 0x04, 0x1, 0x0c,
|
||||
BERLIN_PINCTRL_GROUP("G18", 0x04, 0x2, 0x12,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G19", 0x04, 0x1, 0x0d,
|
||||
BERLIN_PINCTRL_GROUP("G19", 0x04, 0x2, 0x14,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G20", 0x04, 0x1, 0x0e,
|
||||
BERLIN_PINCTRL_GROUP("G20", 0x04, 0x2, 0x16,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G21", 0x04, 0x3, 0x0f,
|
||||
BERLIN_PINCTRL_GROUP("G21", 0x04, 0x3, 0x18,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G22", 0x04, 0x3, 0x12,
|
||||
BERLIN_PINCTRL_GROUP("G22", 0x04, 0x3, 0x1b,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G23", 0x04, 0x3, 0x15,
|
||||
BERLIN_PINCTRL_GROUP("G23", 0x08, 0x3, 0x00,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G24", 0x04, 0x2, 0x18,
|
||||
BERLIN_PINCTRL_GROUP("G24", 0x08, 0x2, 0x03,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G25", 0x04, 0x2, 0x1a,
|
||||
BERLIN_PINCTRL_GROUP("G25", 0x08, 0x2, 0x05,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G26", 0x04, 0x1, 0x1c,
|
||||
BERLIN_PINCTRL_GROUP("G26", 0x08, 0x1, 0x07,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G27", 0x04, 0x1, 0x1d,
|
||||
BERLIN_PINCTRL_GROUP("G27", 0x08, 0x2, 0x08,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G28", 0x04, 0x2, 0x1e,
|
||||
BERLIN_PINCTRL_GROUP("G28", 0x08, 0x3, 0x0a,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
BERLIN_PINCTRL_GROUP("G29", 0x08, 0x3, 0x0d,
|
||||
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
|
||||
};
|
||||
|
||||
@@ -189,6 +191,6 @@ static struct platform_driver berlin2cd_pinctrl_driver = {
|
||||
};
|
||||
module_platform_driver(berlin2cd_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Antoine Ténart <antoine.tenart@free-electrons.com>");
|
||||
MODULE_AUTHOR("Antoine Ténart <antoine.tenart@free-electrons.com>");
|
||||
MODULE_DESCRIPTION("Marvell Berlin BG2CD pinctrl driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 2014 Marvell Technology Group Ltd.
|
||||
*
|
||||
* Antoine Ténart <antoine.tenart@free-electrons.com>
|
||||
* Antoine Ténart <antoine.tenart@free-electrons.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
@@ -408,6 +408,6 @@ static struct platform_driver berlin2q_pinctrl_driver = {
|
||||
};
|
||||
module_platform_driver(berlin2q_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Antoine Ténart <antoine.tenart@free-electrons.com>");
|
||||
MODULE_AUTHOR("Antoine Ténart <antoine.tenart@free-electrons.com>");
|
||||
MODULE_DESCRIPTION("Marvell Berlin BG2Q pinctrl driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 2014 Marvell Technology Group Ltd.
|
||||
*
|
||||
* Antoine Ténart <antoine.tenart@free-electrons.com>
|
||||
* Antoine Ténart <antoine.tenart@free-electrons.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
@@ -292,20 +292,14 @@ static struct pinctrl_desc berlin_pctrl_desc = {
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
int berlin_pinctrl_probe(struct platform_device *pdev,
|
||||
const struct berlin_pinctrl_desc *desc)
|
||||
int berlin_pinctrl_probe_regmap(struct platform_device *pdev,
|
||||
const struct berlin_pinctrl_desc *desc,
|
||||
struct regmap *regmap)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *parent_np = of_get_parent(dev->of_node);
|
||||
struct berlin_pinctrl *pctrl;
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
regmap = syscon_node_to_regmap(parent_np);
|
||||
of_node_put(parent_np);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL);
|
||||
if (!pctrl)
|
||||
return -ENOMEM;
|
||||
@@ -330,3 +324,17 @@ int berlin_pinctrl_probe(struct platform_device *pdev,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int berlin_pinctrl_probe(struct platform_device *pdev,
|
||||
const struct berlin_pinctrl_desc *desc)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *parent_np = of_get_parent(dev->of_node);
|
||||
struct regmap *regmap = syscon_node_to_regmap(parent_np);
|
||||
|
||||
of_node_put(parent_np);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
return berlin_pinctrl_probe_regmap(pdev, desc, regmap);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user