From cfad3d1bba09d0555daf7433db342f0e2ff05bdb Mon Sep 17 00:00:00 2001 From: Magnus Damm Date: Wed, 28 Sep 2011 16:50:58 +0900 Subject: [PATCH] --- yaml --- r: 273359 b: refs/heads/master c: ad2a8e7ea4128af984a98537b1b9484722b6b4bb h: refs/heads/master i: 273357: 9cf98bb36399f90134adcb1f07f321804c6a24ff 273355: 1e673fbed3e596fdb6dcc12127f1a6efdd6f9399 273351: 694a807ac124a0bffe38921739774976a43bba84 273343: 8d6e397ce2079d21cd9694f70405940f1586d87b v: v3 --- [refs] | 2 +- trunk/drivers/sh/pfc.c | 27 +++++++++++++++++++++++++++ trunk/include/linux/sh_pfc.h | 11 +++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 340ee8d9ce48..6478386f33ec 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: cf8e56bf5b60dba5ba11db83ca7f1df884e568e5 +refs/heads/master: ad2a8e7ea4128af984a98537b1b9484722b6b4bb diff --git a/trunk/drivers/sh/pfc.c b/trunk/drivers/sh/pfc.c index de5e3d65a6fa..e67fe170d8d5 100644 --- a/trunk/drivers/sh/pfc.c +++ b/trunk/drivers/sh/pfc.c @@ -577,6 +577,32 @@ static void sh_gpio_set(struct gpio_chip *chip, unsigned offset, int value) sh_gpio_set_value(chip_to_pinmux(chip), offset, value); } +static int sh_gpio_to_irq(struct gpio_chip *chip, unsigned offset) +{ + struct pinmux_info *gpioc = chip_to_pinmux(chip); + pinmux_enum_t enum_id; + pinmux_enum_t *enum_ids; + int i, k, pos; + + pos = 0; + enum_id = 0; + while (1) { + pos = get_gpio_enum_id(gpioc, offset, pos, &enum_id); + if (pos <= 0 || !enum_id) + break; + + for (i = 0; i < gpioc->gpio_irq_size; i++) { + enum_ids = gpioc->gpio_irq[i].enum_ids; + for (k = 0; enum_ids[k]; k++) { + if (enum_ids[k] == enum_id) + return gpioc->gpio_irq[i].irq; + } + } + } + + return -ENOSYS; +} + int register_pinmux(struct pinmux_info *pip) { struct gpio_chip *chip = &pip->chip; @@ -592,6 +618,7 @@ int register_pinmux(struct pinmux_info *pip) chip->get = sh_gpio_get; chip->direction_output = sh_gpio_direction_output; chip->set = sh_gpio_set; + chip->to_irq = sh_gpio_to_irq; WARN_ON(pip->first_gpio != 0); /* needs testing */ diff --git a/trunk/include/linux/sh_pfc.h b/trunk/include/linux/sh_pfc.h index 12f351991701..bc8c9208f7e2 100644 --- a/trunk/include/linux/sh_pfc.h +++ b/trunk/include/linux/sh_pfc.h @@ -61,6 +61,14 @@ struct pinmux_data_reg { .reg = r, .reg_width = r_width, \ .enum_ids = (pinmux_enum_t [r_width]) \ +struct pinmux_irq { + int irq; + pinmux_enum_t *enum_ids; +}; + +#define PINMUX_IRQ(irq_nr, ids...) \ + { .irq = irq_nr, .enum_ids = (pinmux_enum_t []) { ids, 0 } } \ + struct pinmux_range { pinmux_enum_t begin; pinmux_enum_t end; @@ -87,6 +95,9 @@ struct pinmux_info { pinmux_enum_t *gpio_data; unsigned int gpio_data_size; + struct pinmux_irq *gpio_irq; + unsigned int gpio_irq_size; + struct gpio_chip chip; };