Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 914311c9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull pin control changes from Linus Walleij:
 "These are the accumulated pin control patches for v3.6:
   - Various cleanups to the U300 driver
   - Refactor the pin control core to automatically remove any GPIO
     ranges when the drivers are removed, instead of having the drivers
     do this explicitly.
   - Add a function for registering a batch of GPIO ranges.
   - Fix a number of incorrect but non-regressive error checks.
   - Incremental improvements to the COH901, i.MX and Nomadik drivers
   - Add a one-register-per-pin entirely Device Tree-based pin control
     driver from Tony Lindgren."

* tag 'pinctrl-for-v3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl:
  pinctrl: Add one-register-per-pin type device tree based pinctrl driver
  pinctrl/nomadik: add spi2_oc1_2 pin group
  pinctrl/nomadik: kerneldoc fix
  pinctrl/nomadik: use devm_* allocators for gpio probe
  pinctrl/nomadik: add pin group to mco function
  pinctrl/nomadik: add hsit_a_2 pin group
  pinctrl/nomadik: add pin group smcs1 and smps0
  pinctrl/nomadik: fix hsir_a_1_pins pin list
  pinctrl: pinctrl-imx: fix map setting problem if NO_PAD_CTL is set
  pinctrl/coh901: use clk_prepare_[en|dis]able()
  pinctrl/pinctrl-tegra: remove IS_ERR checking of pmx->pctl
  pinctrl/pinctrl-spear: remove IS_ERR checking of pmx->pctl
  pinctrl/u300: drop unused variable
  pinctrl: select the proper symbol
  pinctrl: add pinctrl_add_gpio_ranges function
  pinctrl: remove pinctrl_remove_gpio_range
  pinctrl/pinctrl-core: cleanup pinctrl_register
  pinctrl/u300: delete pointless debug print
  pinctrl/pinctrl-u300: remove devm_kfree at driver unload
parents 5dedb9f3 8b8b091b
Loading
Loading
Loading
Loading
+93 −0
Original line number Diff line number Diff line
One-register-per-pin type device tree based pinctrl driver

Required properties:
- compatible : "pinctrl-single"

- reg : offset and length of the register set for the mux registers

- pinctrl-single,register-width : pinmux register access width in bits

- pinctrl-single,function-mask : mask of allowed pinmux function bits
  in the pinmux register

Optional properties:
- pinctrl-single,function-off : function off mode for disabled state if
  available and same for all registers; if not specified, disabling of
  pin functions is ignored

This driver assumes that there is only one register for each pin,
and uses the common pinctrl bindings as specified in the pinctrl-bindings.txt
document in this directory.

The pin configuration nodes for pinctrl-single are specified as pinctrl
register offset and value pairs using pinctrl-single,pins. Only the bits
specified in pinctrl-single,function-mask are updated. For example, setting
a pin for a device could be done with:

	pinctrl-single,pins = <0xdc 0x118>;

Where 0xdc is the offset from the pinctrl register base address for the
device pinctrl register, and 0x118 contains the desired value of the
pinctrl register. See the device example and static board pins example
below for more information.

Example:

/* SoC common file */

/* first controller instance for pins in core domain */
pmx_core: pinmux@4a100040 {
	compatible = "pinctrl-single";
	reg = <0x4a100040 0x0196>;
	#address-cells = <1>;
	#size-cells = <0>;
	pinctrl-single,register-width = <16>;
	pinctrl-single,function-mask = <0xffff>;
};

/* second controller instance for pins in wkup domain */
pmx_wkup: pinmux@4a31e040 {
	compatible = "pinctrl-single;
	reg = <0x4a31e040 0x0038>;
	#address-cells = <1>;
	#size-cells = <0>;
	pinctrl-single,register-width = <16>;
	pinctrl-single,function-mask = <0xffff>;
};


/* board specific .dts file */

&pmx_core {

	/*
	 * map all board specific static pins enabled by the pinctrl driver
	 * itself during the boot (or just set them up in the bootloader)
	 */
	pinctrl-names = "default";
	pinctrl-0 = <&board_pins>;

	board_pins: pinmux_board_pins {
		pinctrl-single,pins = <
			0x6c 0xf
			0x6e 0xf
			0x70 0xf
			0x72 0xf
		>;
	};

	/* map uart2 pins */
	uart2_pins: pinmux_uart2_pins {
		pinctrl-single,pins = <
			0xd8 0x118
			0xda 0
			0xdc 0x118
			0xde 0
		>;
	};
};

&uart2 {
       pinctrl-names = "default";
       pinctrl-0 = <&uart2_pins>;
};
+9 −1
Original line number Diff line number Diff line
@@ -102,6 +102,14 @@ config PINCTRL_PXA910
	select PINCTRL_PXA3xx
	select PINCONF

config PINCTRL_SINGLE
	tristate "One-register-per-pin type device tree based pinctrl driver"
	depends on OF
	select PINMUX
	select PINCONF
	help
	  This selects the device tree based generic pinctrl driver.

config PINCTRL_SIRF
	bool "CSR SiRFprimaII pin controller driver"
	depends on ARCH_PRIMA2
@@ -130,7 +138,7 @@ config PINCTRL_U300

config PINCTRL_COH901
	bool "ST-Ericsson U300 COH 901 335/571 GPIO"
	depends on GPIOLIB && ARCH_U300 && PINMUX_U300
	depends on GPIOLIB && ARCH_U300 && PINCTRL_U300
	help
	  Say yes here to support GPIO interface on ST-Ericsson U300.
	  The names of the two IP block variants supported are
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ obj-$(CONFIG_PINCTRL_NOMADIK) += pinctrl-nomadik.o
obj-$(CONFIG_PINCTRL_DB8500)	+= pinctrl-nomadik-db8500.o
obj-$(CONFIG_PINCTRL_PXA168)	+= pinctrl-pxa168.o
obj-$(CONFIG_PINCTRL_PXA910)	+= pinctrl-pxa910.o
obj-$(CONFIG_PINCTRL_SINGLE)	+= pinctrl-single.o
obj-$(CONFIG_PINCTRL_SIRF)	+= pinctrl-sirf.o
obj-$(CONFIG_PINCTRL_TEGRA)	+= pinctrl-tegra.o
obj-$(CONFIG_PINCTRL_TEGRA20)	+= pinctrl-tegra20.o
+19 −22
Original line number Diff line number Diff line
@@ -332,19 +332,16 @@ void pinctrl_add_gpio_range(struct pinctrl_dev *pctldev,
}
EXPORT_SYMBOL_GPL(pinctrl_add_gpio_range);

/**
 * pinctrl_remove_gpio_range() - remove a range of GPIOs fro a pin controller
 * @pctldev: pin controller device to remove the range from
 * @range: the GPIO range to remove
 */
void pinctrl_remove_gpio_range(struct pinctrl_dev *pctldev,
			       struct pinctrl_gpio_range *range)
void pinctrl_add_gpio_ranges(struct pinctrl_dev *pctldev,
			     struct pinctrl_gpio_range *ranges,
			     unsigned nranges)
{
	mutex_lock(&pinctrl_mutex);
	list_del(&range->node);
	mutex_unlock(&pinctrl_mutex);
	int i;

	for (i = 0; i < nranges; i++)
		pinctrl_add_gpio_range(pctldev, &ranges[i]);
}
EXPORT_SYMBOL_GPL(pinctrl_remove_gpio_range);
EXPORT_SYMBOL_GPL(pinctrl_add_gpio_ranges);

/**
 * pinctrl_get_group_selector() - returns the group selector for a group
@@ -1395,9 +1392,9 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
	struct pinctrl_dev *pctldev;
	int ret;

	if (pctldesc == NULL)
	if (!pctldesc)
		return NULL;
	if (pctldesc->name == NULL)
	if (!pctldesc->name)
		return NULL;

	pctldev = kzalloc(sizeof(*pctldev), GFP_KERNEL);
@@ -1415,23 +1412,20 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
	pctldev->dev = dev;

	/* check core ops for sanity */
	ret = pinctrl_check_ops(pctldev);
	if (ret) {
	if (pinctrl_check_ops(pctldev)) {
		dev_err(dev, "pinctrl ops lacks necessary functions\n");
		goto out_err;
	}

	/* If we're implementing pinmuxing, check the ops for sanity */
	if (pctldesc->pmxops) {
		ret = pinmux_check_ops(pctldev);
		if (ret)
		if (pinmux_check_ops(pctldev))
			goto out_err;
	}

	/* If we're implementing pinconfig, check the ops for sanity */
	if (pctldesc->confops) {
		ret = pinconf_check_ops(pctldev);
		if (ret)
		if (pinconf_check_ops(pctldev))
			goto out_err;
	}

@@ -1457,13 +1451,11 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
		if (IS_ERR(s)) {
			dev_dbg(dev, "failed to lookup the default state\n");
		} else {
			ret = pinctrl_select_state_locked(pctldev->p, s);
			if (ret) {
			if (pinctrl_select_state_locked(pctldev->p, s))
				dev_err(dev,
					"failed to select default state\n");
		}
	}
	}

	mutex_unlock(&pinctrl_mutex);

@@ -1485,6 +1477,7 @@ EXPORT_SYMBOL_GPL(pinctrl_register);
 */
void pinctrl_unregister(struct pinctrl_dev *pctldev)
{
	struct pinctrl_gpio_range *range, *n;
	if (pctldev == NULL)
		return;

@@ -1500,6 +1493,10 @@ void pinctrl_unregister(struct pinctrl_dev *pctldev)
	/* Destroy descriptor tree */
	pinctrl_free_pindescs(pctldev, pctldev->desc->pins,
			      pctldev->desc->npins);
	/* remove gpio ranges map */
	list_for_each_entry_safe(range, n, &pctldev->gpio_ranges, node)
		list_del(&range->node);

	kfree(pctldev);

	mutex_unlock(&pinctrl_mutex);
+3 −3
Original line number Diff line number Diff line
@@ -770,7 +770,7 @@ static int __init u300_gpio_probe(struct platform_device *pdev)
		dev_err(gpio->dev, "could not get GPIO clock\n");
		goto err_no_clk;
	}
	err = clk_enable(gpio->clk);
	err = clk_prepare_enable(gpio->clk);
	if (err) {
		dev_err(gpio->dev, "could not enable GPIO clock\n");
		goto err_no_clk_enable;
@@ -912,7 +912,7 @@ static int __init u300_gpio_probe(struct platform_device *pdev)
	release_mem_region(gpio->memres->start, resource_size(gpio->memres));
err_no_ioregion:
err_no_resource:
	clk_disable(gpio->clk);
	clk_disable_unprepare(gpio->clk);
err_no_clk_enable:
	clk_put(gpio->clk);
err_no_clk:
@@ -943,7 +943,7 @@ static int __exit u300_gpio_remove(struct platform_device *pdev)
	iounmap(gpio->base);
	release_mem_region(gpio->memres->start,
			   resource_size(gpio->memres));
	clk_disable(gpio->clk);
	clk_disable_unprepare(gpio->clk);
	clk_put(gpio->clk);
	platform_set_drvdata(pdev, NULL);
	kfree(gpio);
Loading