* [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup
@ 2016-02-25 21:44 Joachim Eastwood
2016-02-25 21:44 ` [PATCH v2 1/3] pinctrl: core: create nolock version of pinctrl_find_gpio_range_from_pin Joachim Eastwood
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Joachim Eastwood @ 2016-02-25 21:44 UTC (permalink / raw)
To: linus.walleij; +Cc: Joachim Eastwood, linux-gpio
Some background here:
The LPC1850 has no less than 3 GPIO interrupt blocks. One of these
blocks is called 'gpio pin interrupt' or just PINT. LPC1850 PINT can
handle up to 8 interrupts and these have a one-to-one relationship with
the main interrupt controller (NVIC).
Selecting which GPIOs that are associated with PINT irq lines is done in
pinctrl hw block (SCU). The pinctrl device usually deals with the pin
namespace but PINT selecction is done in the GPIO namespace. Fortunatly
there is a function that can translate from the pin namespace to the
GPIO namespace.
Selection is done in DT with the "nxp,gpio-pin-interrupt" property.
Example usage;
&pinctrl {
gpio_joystick_1_cfg {
pins = "p9_0";
function = "gpio";
nxp,gpio-pin-interrupt = <0>;
input-enable;
bias-disable;
};
};
The reason for not doing this irq line selection on the fly in the
irqchip driver is that the registers lie in the SCU hw block not in the
PINT block and DT gives you more control since you can select a specific
irq lines easily.
The irq chip driver is ready but will posted separately.
Joachim Eastwood (3):
pinctrl: core: create nolock version of pinctrl_find_gpio_range_from_pin
pinctrl: lpc18xx: add nxp,gpio-pin-interrupt property
pinctrl: lpc1850-scu: document nxp,gpio-pin-interrupt
.../bindings/pinctrl/nxp,lpc1850-scu.txt | 14 ++
drivers/pinctrl/core.c | 35 +++--
drivers/pinctrl/core.h | 4 +
drivers/pinctrl/pinctrl-lpc18xx.c | 143 ++++++++++++++++++++-
4 files changed, 178 insertions(+), 18 deletions(-)
--
1.8.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/3] pinctrl: core: create nolock version of pinctrl_find_gpio_range_from_pin
2016-02-25 21:44 [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup Joachim Eastwood
@ 2016-02-25 21:44 ` Joachim Eastwood
2016-03-07 3:41 ` Linus Walleij
2016-02-25 21:44 ` [PATCH v2 2/3] pinctrl: lpc18xx: add nxp,gpio-pin-interrupt property Joachim Eastwood
` (3 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Joachim Eastwood @ 2016-02-25 21:44 UTC (permalink / raw)
To: linus.walleij; +Cc: Joachim Eastwood, linux-gpio
pinctrl_find_gpio_range_from_pin takes the pctldev->mutex but so
does pinconf_pins_show and this will cause a deadlock if
pinctrl_find_gpio_range_from_pin is used in .pin_config_get
callback.
Create a nolock version of pinctrl_find_gpio_range_from_pin to
allow pin to gpio lookup to be used from pinconf_pins_show.
Signed-off-by: Joachim Eastwood <manabian@gmail.com>
---
drivers/pinctrl/core.c | 35 +++++++++++++++++++++++------------
drivers/pinctrl/core.h | 4 ++++
2 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index 2686a4450dfc..f67a8b7a4e18 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -481,18 +481,12 @@ int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, const char *pin_group,
}
EXPORT_SYMBOL_GPL(pinctrl_get_group_pins);
-/**
- * pinctrl_find_gpio_range_from_pin() - locate the GPIO range for a pin
- * @pctldev: the pin controller device to look in
- * @pin: a controller-local number to find the range for
- */
struct pinctrl_gpio_range *
-pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev,
- unsigned int pin)
+pinctrl_find_gpio_range_from_pin_nolock(struct pinctrl_dev *pctldev,
+ unsigned int pin)
{
struct pinctrl_gpio_range *range;
- mutex_lock(&pctldev->mutex);
/* Loop over the ranges */
list_for_each_entry(range, &pctldev->gpio_ranges, node) {
/* Check if we're in the valid range */
@@ -500,15 +494,32 @@ pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev,
int a;
for (a = 0; a < range->npins; a++) {
if (range->pins[a] == pin)
- goto out;
+ return range;
}
} else if (pin >= range->pin_base &&
pin < range->pin_base + range->npins)
- goto out;
+ return range;
}
- range = NULL;
-out:
+
+ return NULL;
+}
+EXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin_nolock);
+
+/**
+ * pinctrl_find_gpio_range_from_pin() - locate the GPIO range for a pin
+ * @pctldev: the pin controller device to look in
+ * @pin: a controller-local number to find the range for
+ */
+struct pinctrl_gpio_range *
+pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev,
+ unsigned int pin)
+{
+ struct pinctrl_gpio_range *range;
+
+ mutex_lock(&pctldev->mutex);
+ range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, pin);
mutex_unlock(&pctldev->mutex);
+
return range;
}
EXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin);
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h
index b24ea846c867..ca08723b9ee1 100644
--- a/drivers/pinctrl/core.h
+++ b/drivers/pinctrl/core.h
@@ -182,6 +182,10 @@ static inline struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev,
return radix_tree_lookup(&pctldev->pin_desc_tree, pin);
}
+extern struct pinctrl_gpio_range *
+pinctrl_find_gpio_range_from_pin_nolock(struct pinctrl_dev *pctldev,
+ unsigned int pin);
+
int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
bool dup);
void pinctrl_unregister_map(struct pinctrl_map const *map);
--
1.8.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/3] pinctrl: lpc18xx: add nxp,gpio-pin-interrupt property
2016-02-25 21:44 [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup Joachim Eastwood
2016-02-25 21:44 ` [PATCH v2 1/3] pinctrl: core: create nolock version of pinctrl_find_gpio_range_from_pin Joachim Eastwood
@ 2016-02-25 21:44 ` Joachim Eastwood
2016-03-07 3:46 ` Linus Walleij
2016-02-25 21:44 ` [PATCH v2 3/3] pinctrl: lpc1850-scu: document nxp,gpio-pin-interrupt Joachim Eastwood
` (2 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Joachim Eastwood @ 2016-02-25 21:44 UTC (permalink / raw)
To: linus.walleij; +Cc: Joachim Eastwood, linux-gpio
Add support for setting up GPIO pin interrupts in the lpc18xx pinctrl
driver. The LPC18xx SCU contain two registers that sets up the signal
routing to the GPIO pin interrupt (PINT) block. The routing uses the
GPIO namespace and not the pin namespace so a lookup is preformed on
the pin.
Routing configuration is done in the device tree by using the new
nxp,gpio-pin-interrupt property. This property takes single parameter
which sets the PINT hwirq for the GPIO.
Signed-off-by: Joachim Eastwood <manabian@gmail.com>
---
drivers/pinctrl/pinctrl-lpc18xx.c | 143 ++++++++++++++++++++++++++++++++++++--
1 file changed, 137 insertions(+), 6 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-lpc18xx.c b/drivers/pinctrl/pinctrl-lpc18xx.c
index f0bebbe0682b..cfd3984bc10c 100644
--- a/drivers/pinctrl/pinctrl-lpc18xx.c
+++ b/drivers/pinctrl/pinctrl-lpc18xx.c
@@ -49,6 +49,18 @@
#define LPC18XX_SCU_FUNC_PER_PIN 8
+/* LPC18XX SCU pin interrupt select registers */
+#define LPC18XX_SCU_PINTSEL0 0xe00
+#define LPC18XX_SCU_PINTSEL1 0xe04
+#define LPC18XX_SCU_PINTSEL_VAL_MASK 0xff
+#define LPC18XX_SCU_PINTSEL_PORT_SHIFT 5
+#define LPC18XX_SCU_IRQ_PER_PINTSEL 4
+#define LPC18XX_GPIO_PINS_PER_PORT 32
+#define LPC18XX_GPIO_PIN_INT_MAX 8
+
+#define LPC18XX_SCU_PINTSEL_VAL(val, n) \
+ ((val) << (((n) % LPC18XX_SCU_IRQ_PER_PINTSEL) * 8))
+
/* LPC18xx pin types */
enum {
TYPE_ND, /* Normal-drive */
@@ -618,6 +630,25 @@ static const struct pinctrl_pin_desc lpc18xx_pins[] = {
LPC18XX_PIN(i2c0_sda, PIN_I2C0_SDA),
};
+/**
+ * enum lpc18xx_pin_config_param - possible pin configuration parameters
+ * @PIN_CONFIG_GPIO_PIN_INT: route gpio to the gpio pin interrupt
+ * controller.
+ */
+enum lpc18xx_pin_config_param {
+ PIN_CONFIG_GPIO_PIN_INT = PIN_CONFIG_END + 1,
+};
+
+static const struct pinconf_generic_params lpc18xx_params[] = {
+ {"nxp,gpio-pin-interrupt", PIN_CONFIG_GPIO_PIN_INT, 0},
+};
+
+#ifdef CONFIG_DEBUG_FS
+static const struct pin_config_item lpc18xx_conf_items[ARRAY_SIZE(lpc18xx_params)] = {
+ PCONFDUMP(PIN_CONFIG_GPIO_PIN_INT, "gpio pin int", NULL, true),
+};
+#endif
+
static int lpc18xx_pconf_get_usb1(enum pin_config_param param, int *arg, u32 reg)
{
switch (param) {
@@ -693,7 +724,71 @@ static int lpc18xx_pconf_get_i2c0(enum pin_config_param param, int *arg, u32 reg
return 0;
}
-static int lpc18xx_pconf_get_pin(enum pin_config_param param, int *arg, u32 reg,
+static int lpc18xx_pin_to_gpio(struct pinctrl_dev *pctldev, unsigned pin)
+{
+ struct pinctrl_gpio_range *range;
+
+ range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, pin);
+ if (!range)
+ return -EINVAL;
+
+ return pin - range->pin_base + range->base;
+}
+
+static int lpc18xx_get_pintsel(void __iomem *addr, u32 val, int *arg)
+{
+ u32 reg_val;
+ int i;
+
+ reg_val = readl(addr);
+ for (i = 0; i < LPC18XX_SCU_IRQ_PER_PINTSEL; i++) {
+ if ((reg_val & LPC18XX_SCU_PINTSEL_VAL_MASK) == val)
+ return 0;
+
+ reg_val >>= BITS_PER_BYTE;
+ *arg += 1;
+ }
+
+ return -EINVAL;
+}
+
+static u32 lpc18xx_gpio_to_pintsel_val(int gpio)
+{
+ unsigned int gpio_port, gpio_pin;
+
+ gpio_port = gpio / LPC18XX_GPIO_PINS_PER_PORT;
+ gpio_pin = gpio % LPC18XX_GPIO_PINS_PER_PORT;
+
+ return gpio_pin | (gpio_port << LPC18XX_SCU_PINTSEL_PORT_SHIFT);
+}
+
+static int lpc18xx_pconf_get_gpio_pin_int(struct pinctrl_dev *pctldev,
+ int *arg, unsigned pin)
+{
+ struct lpc18xx_scu_data *scu = pinctrl_dev_get_drvdata(pctldev);
+ int gpio, ret;
+ u32 val;
+
+ gpio = lpc18xx_pin_to_gpio(pctldev, pin);
+ if (gpio < 0)
+ return -ENOTSUPP;
+
+ val = lpc18xx_gpio_to_pintsel_val(gpio);
+
+ /*
+ * Check if this pin has been enabled as a interrupt in any of the two
+ * PINTSEL registers. *arg indicates which interrupt number (0-7).
+ */
+ *arg = 0;
+ ret = lpc18xx_get_pintsel(scu->base + LPC18XX_SCU_PINTSEL0, val, arg);
+ if (ret == 0)
+ return ret;
+
+ return lpc18xx_get_pintsel(scu->base + LPC18XX_SCU_PINTSEL1, val, arg);
+}
+
+static int lpc18xx_pconf_get_pin(struct pinctrl_dev *pctldev, unsigned param,
+ int *arg, u32 reg, unsigned pin,
struct lpc18xx_pin_caps *pin_cap)
{
switch (param) {
@@ -755,6 +850,9 @@ static int lpc18xx_pconf_get_pin(enum pin_config_param param, int *arg, u32 reg,
}
break;
+ case PIN_CONFIG_GPIO_PIN_INT:
+ return lpc18xx_pconf_get_gpio_pin_int(pctldev, arg, pin);
+
default:
return -ENOTSUPP;
}
@@ -794,7 +892,7 @@ static int lpc18xx_pconf_get(struct pinctrl_dev *pctldev, unsigned pin,
else if (pin_cap->type == TYPE_USB1)
ret = lpc18xx_pconf_get_usb1(param, &arg, reg);
else
- ret = lpc18xx_pconf_get_pin(param, &arg, reg, pin_cap);
+ ret = lpc18xx_pconf_get_pin(pctldev, param, &arg, reg, pin, pin_cap);
if (ret < 0)
return ret;
@@ -883,9 +981,34 @@ static int lpc18xx_pconf_set_i2c0(struct pinctrl_dev *pctldev,
return 0;
}
-static int lpc18xx_pconf_set_pin(struct pinctrl_dev *pctldev,
- enum pin_config_param param,
- u16 param_val, u32 *reg,
+static int lpc18xx_pconf_set_gpio_pin_int(struct pinctrl_dev *pctldev,
+ u16 param_val, unsigned pin)
+{
+ struct lpc18xx_scu_data *scu = pinctrl_dev_get_drvdata(pctldev);
+ u32 val, reg_val, reg_offset = LPC18XX_SCU_PINTSEL0;
+ int gpio;
+
+ if (param_val >= LPC18XX_GPIO_PIN_INT_MAX)
+ return -EINVAL;
+
+ gpio = lpc18xx_pin_to_gpio(pctldev, pin);
+ if (gpio < 0)
+ return -ENOTSUPP;
+
+ val = lpc18xx_gpio_to_pintsel_val(gpio);
+
+ reg_offset += (param_val / LPC18XX_SCU_IRQ_PER_PINTSEL) * sizeof(u32);
+
+ reg_val = readl(scu->base + reg_offset);
+ reg_val &= ~LPC18XX_SCU_PINTSEL_VAL(LPC18XX_SCU_PINTSEL_VAL_MASK, param_val);
+ reg_val |= LPC18XX_SCU_PINTSEL_VAL(val, param_val);
+ writel(reg_val, scu->base + reg_offset);
+
+ return 0;
+}
+
+static int lpc18xx_pconf_set_pin(struct pinctrl_dev *pctldev, unsigned param,
+ u16 param_val, u32 *reg, unsigned pin,
struct lpc18xx_pin_caps *pin_cap)
{
switch (param) {
@@ -948,6 +1071,9 @@ static int lpc18xx_pconf_set_pin(struct pinctrl_dev *pctldev,
*reg |= param_val << LPC18XX_SCU_PIN_EHD_POS;
break;
+ case PIN_CONFIG_GPIO_PIN_INT:
+ return lpc18xx_pconf_set_gpio_pin_int(pctldev, param_val, pin);
+
default:
dev_err(pctldev->dev, "Property not supported\n");
return -ENOTSUPP;
@@ -982,7 +1108,7 @@ static int lpc18xx_pconf_set(struct pinctrl_dev *pctldev, unsigned pin,
else if (pin_cap->type == TYPE_USB1)
ret = lpc18xx_pconf_set_usb1(pctldev, param, param_val, ®);
else
- ret = lpc18xx_pconf_set_pin(pctldev, param, param_val, ®, pin_cap);
+ ret = lpc18xx_pconf_set_pin(pctldev, param, param_val, ®, pin, pin_cap);
if (ret)
return ret;
@@ -1136,6 +1262,11 @@ static struct pinctrl_desc lpc18xx_scu_desc = {
.pctlops = &lpc18xx_pctl_ops,
.pmxops = &lpc18xx_pmx_ops,
.confops = &lpc18xx_pconf_ops,
+ .num_custom_params = ARRAY_SIZE(lpc18xx_params),
+ .custom_params = lpc18xx_params,
+#ifdef CONFIG_DEBUG_FS
+ .custom_conf_items = lpc18xx_conf_items,
+#endif
.owner = THIS_MODULE,
};
--
1.8.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/3] pinctrl: lpc1850-scu: document nxp,gpio-pin-interrupt
2016-02-25 21:44 [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup Joachim Eastwood
2016-02-25 21:44 ` [PATCH v2 1/3] pinctrl: core: create nolock version of pinctrl_find_gpio_range_from_pin Joachim Eastwood
2016-02-25 21:44 ` [PATCH v2 2/3] pinctrl: lpc18xx: add nxp,gpio-pin-interrupt property Joachim Eastwood
@ 2016-02-25 21:44 ` Joachim Eastwood
2016-03-07 3:48 ` Linus Walleij
2016-02-25 21:47 ` [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup Joachim Eastwood
2016-03-07 3:52 ` Linus Walleij
4 siblings, 1 reply; 9+ messages in thread
From: Joachim Eastwood @ 2016-02-25 21:44 UTC (permalink / raw)
To: linus.walleij; +Cc: Joachim Eastwood, linux-gpio
Update devicetree documention for lpc1850-scu with the new
nxp,gpio-pin-interrupt property.
Signed-off-by: Joachim Eastwood <manabian@gmail.com>
Acked-by: Rob Herring <robh@kernel.org>
---
.../devicetree/bindings/pinctrl/nxp,lpc1850-scu.txt | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/Documentation/devicetree/bindings/pinctrl/nxp,lpc1850-scu.txt b/Documentation/devicetree/bindings/pinctrl/nxp,lpc1850-scu.txt
index df0309c57505..bd8b0c69fa44 100644
--- a/Documentation/devicetree/bindings/pinctrl/nxp,lpc1850-scu.txt
+++ b/Documentation/devicetree/bindings/pinctrl/nxp,lpc1850-scu.txt
@@ -22,6 +22,10 @@ The following generic nodes are supported:
- input-schmitt-disable
- slew-rate
+NXP specific properties:
+ - nxp,gpio-pin-interrupt : Assign pin to gpio pin interrupt controller
+ irq number 0 to 7. See example below.
+
Not all pins support all properties so either refer to the NXP 1850/4350
user manual or the pin table in the pinctrl-lpc18xx driver for supported
pin properties.
@@ -54,4 +58,14 @@ pinctrl: pinctrl@40086000 {
bias-disable;
};
};
+
+ gpio_joystick_pins: gpio-joystick-pins {
+ gpio_joystick_1_cfg {
+ pins = "p9_0";
+ function = "gpio";
+ nxp,gpio-pin-interrupt = <0>;
+ input-enable;
+ bias-disable;
+ };
+ };
};
--
1.8.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup
2016-02-25 21:44 [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup Joachim Eastwood
` (2 preceding siblings ...)
2016-02-25 21:44 ` [PATCH v2 3/3] pinctrl: lpc1850-scu: document nxp,gpio-pin-interrupt Joachim Eastwood
@ 2016-02-25 21:47 ` Joachim Eastwood
2016-03-07 3:52 ` Linus Walleij
4 siblings, 0 replies; 9+ messages in thread
From: Joachim Eastwood @ 2016-02-25 21:47 UTC (permalink / raw)
To: Linus Walleij; +Cc: Joachim Eastwood, linux-gpio
On 25 February 2016 at 22:44, Joachim Eastwood <manabian@gmail.com> wrote:
> Some background here:
> The LPC1850 has no less than 3 GPIO interrupt blocks. One of these
> blocks is called 'gpio pin interrupt' or just PINT. LPC1850 PINT can
> handle up to 8 interrupts and these have a one-to-one relationship with
> the main interrupt controller (NVIC).
>
> Selecting which GPIOs that are associated with PINT irq lines is done in
> pinctrl hw block (SCU). The pinctrl device usually deals with the pin
> namespace but PINT selecction is done in the GPIO namespace. Fortunatly
> there is a function that can translate from the pin namespace to the
> GPIO namespace.
>
> Selection is done in DT with the "nxp,gpio-pin-interrupt" property.
> Example usage;
> &pinctrl {
> gpio_joystick_1_cfg {
> pins = "p9_0";
> function = "gpio";
> nxp,gpio-pin-interrupt = <0>;
> input-enable;
> bias-disable;
> };
> };
>
> The reason for not doing this irq line selection on the fly in the
> irqchip driver is that the registers lie in the SCU hw block not in the
> PINT block and DT gives you more control since you can select a specific
> irq lines easily.
>
> The irq chip driver is ready but will posted separately.
oh, I forgot to add the change log. Here it is:
Changes since v1:
- Add ack from Rob on DT doc
- rename __pinctrl_find_gpio_range_from_pin to
pinctrl_find_gpio_range_from_pin_nolock
regards,
Joachim Eastwood
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/3] pinctrl: core: create nolock version of pinctrl_find_gpio_range_from_pin
2016-02-25 21:44 ` [PATCH v2 1/3] pinctrl: core: create nolock version of pinctrl_find_gpio_range_from_pin Joachim Eastwood
@ 2016-03-07 3:41 ` Linus Walleij
0 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2016-03-07 3:41 UTC (permalink / raw)
To: Joachim Eastwood; +Cc: linux-gpio@vger.kernel.org
On Fri, Feb 26, 2016 at 4:44 AM, Joachim Eastwood <manabian@gmail.com> wrote:
> pinctrl_find_gpio_range_from_pin takes the pctldev->mutex but so
> does pinconf_pins_show and this will cause a deadlock if
> pinctrl_find_gpio_range_from_pin is used in .pin_config_get
> callback.
>
> Create a nolock version of pinctrl_find_gpio_range_from_pin to
> allow pin to gpio lookup to be used from pinconf_pins_show.
>
> Signed-off-by: Joachim Eastwood <manabian@gmail.com>
Excellent, patch applied.
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/3] pinctrl: lpc18xx: add nxp,gpio-pin-interrupt property
2016-02-25 21:44 ` [PATCH v2 2/3] pinctrl: lpc18xx: add nxp,gpio-pin-interrupt property Joachim Eastwood
@ 2016-03-07 3:46 ` Linus Walleij
0 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2016-03-07 3:46 UTC (permalink / raw)
To: Joachim Eastwood; +Cc: linux-gpio@vger.kernel.org
On Fri, Feb 26, 2016 at 4:44 AM, Joachim Eastwood <manabian@gmail.com> wrote:
> Add support for setting up GPIO pin interrupts in the lpc18xx pinctrl
> driver. The LPC18xx SCU contain two registers that sets up the signal
> routing to the GPIO pin interrupt (PINT) block. The routing uses the
> GPIO namespace and not the pin namespace so a lookup is preformed on
> the pin.
>
> Routing configuration is done in the device tree by using the new
> nxp,gpio-pin-interrupt property. This property takes single parameter
> which sets the PINT hwirq for the GPIO.
>
> Signed-off-by: Joachim Eastwood <manabian@gmail.com>
Patch applied. Best way to solve this as of now.
> +static int lpc18xx_pin_to_gpio(struct pinctrl_dev *pctldev, unsigned pin)
> +{
> + struct pinctrl_gpio_range *range;
> +
> + range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, pin);
> + if (!range)
> + return -EINVAL;
> +
> + return pin - range->pin_base + range->base;
> +}
It seems this pattern is appearing in a few drivers now, what do you
think about factoring this into the core or as a static inline in
core.h (so we can avoid EXPORTing)?
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 3/3] pinctrl: lpc1850-scu: document nxp,gpio-pin-interrupt
2016-02-25 21:44 ` [PATCH v2 3/3] pinctrl: lpc1850-scu: document nxp,gpio-pin-interrupt Joachim Eastwood
@ 2016-03-07 3:48 ` Linus Walleij
0 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2016-03-07 3:48 UTC (permalink / raw)
To: Joachim Eastwood; +Cc: linux-gpio@vger.kernel.org
On Fri, Feb 26, 2016 at 4:44 AM, Joachim Eastwood <manabian@gmail.com> wrote:
> Update devicetree documention for lpc1850-scu with the new
> nxp,gpio-pin-interrupt property.
>
> Signed-off-by: Joachim Eastwood <manabian@gmail.com>
> Acked-by: Rob Herring <robh@kernel.org>
Patch applied.
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup
2016-02-25 21:44 [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup Joachim Eastwood
` (3 preceding siblings ...)
2016-02-25 21:47 ` [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup Joachim Eastwood
@ 2016-03-07 3:52 ` Linus Walleij
4 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2016-03-07 3:52 UTC (permalink / raw)
To: Joachim Eastwood; +Cc: linux-gpio@vger.kernel.org
On Fri, Feb 26, 2016 at 4:44 AM, Joachim Eastwood <manabian@gmail.com> wrote:
> Selecting which GPIOs that are associated with PINT irq lines is done in
> pinctrl hw block (SCU). The pinctrl device usually deals with the pin
> namespace but PINT selecction is done in the GPIO namespace. Fortunatly
> there is a function that can translate from the pin namespace to the
> GPIO namespace.
>
> Selection is done in DT with the "nxp,gpio-pin-interrupt" property.
> Example usage;
> &pinctrl {
> gpio_joystick_1_cfg {
> pins = "p9_0";
> function = "gpio";
> nxp,gpio-pin-interrupt = <0>;
> input-enable;
> bias-disable;
> };
> };
>
> The reason for not doing this irq line selection on the fly in the
> irqchip driver is that the registers lie in the SCU hw block not in the
> PINT block and DT gives you more control since you can select a specific
> irq lines easily.
I am a bit split but I assume that you as maintainer of this hardware
is in a better position to assign the routing of the IRQs in a convenient
way for this platform.
So, patches applied as you can see.
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2016-03-07 3:52 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-25 21:44 [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup Joachim Eastwood
2016-02-25 21:44 ` [PATCH v2 1/3] pinctrl: core: create nolock version of pinctrl_find_gpio_range_from_pin Joachim Eastwood
2016-03-07 3:41 ` Linus Walleij
2016-02-25 21:44 ` [PATCH v2 2/3] pinctrl: lpc18xx: add nxp,gpio-pin-interrupt property Joachim Eastwood
2016-03-07 3:46 ` Linus Walleij
2016-02-25 21:44 ` [PATCH v2 3/3] pinctrl: lpc1850-scu: document nxp,gpio-pin-interrupt Joachim Eastwood
2016-03-07 3:48 ` Linus Walleij
2016-02-25 21:47 ` [PATCH v2 0/3] pinctrl: lpc18xx: support pint setup Joachim Eastwood
2016-03-07 3:52 ` Linus Walleij
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).