aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2013-12-04 08:48:17 -0500
committerLinus Walleij <linus.walleij@linaro.org>2013-12-04 08:48:17 -0500
commit33e0aae11e4854c792e9871f94da6d28bf2e2bb8 (patch)
treed75422fcd621bb1a4ec019f7ab625e3bc99ffaff
parent9fb1f39eb2d6707d265087ee186376e24995f55a (diff)
parenteb7cce1ea96b6399672abce787598f6e7a4352c3 (diff)
Merge branch 'mark-irqs' into devel
Conflicts: drivers/gpio/gpio-em.c
-rw-r--r--drivers/gpio/gpio-adnp.c23
-rw-r--r--drivers/gpio/gpio-bcm-kona.c22
-rw-r--r--drivers/gpio/gpio-em.c23
-rw-r--r--drivers/gpio/gpio-intel-mid.c23
-rw-r--r--drivers/gpio/gpio-lynxpoint.c22
5 files changed, 113 insertions, 0 deletions
diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c
index 030a3897d9f7..6fc6206b38bd 100644
--- a/drivers/gpio/gpio-adnp.c
+++ b/drivers/gpio/gpio-adnp.c
@@ -408,6 +408,27 @@ static void adnp_irq_bus_unlock(struct irq_data *data)
408 mutex_unlock(&adnp->irq_lock); 408 mutex_unlock(&adnp->irq_lock);
409} 409}
410 410
411static unsigned int adnp_irq_startup(struct irq_data *data)
412{
413 struct adnp *adnp = irq_data_get_irq_chip_data(data);
414
415 if (gpio_lock_as_irq(&adnp->gpio, data->hwirq))
416 dev_err(adnp->gpio.dev,
417 "unable to lock HW IRQ %lu for IRQ\n",
418 data->hwirq);
419 /* Satisfy the .enable semantics by unmasking the line */
420 adnp_irq_unmask(data);
421 return 0;
422}
423
424static void adnp_irq_shutdown(struct irq_data *data)
425{
426 struct adnp *adnp = irq_data_get_irq_chip_data(data);
427
428 adnp_irq_mask(data);
429 gpio_unlock_as_irq(&adnp->gpio, data->hwirq);
430}
431
411static struct irq_chip adnp_irq_chip = { 432static struct irq_chip adnp_irq_chip = {
412 .name = "gpio-adnp", 433 .name = "gpio-adnp",
413 .irq_mask = adnp_irq_mask, 434 .irq_mask = adnp_irq_mask,
@@ -415,6 +436,8 @@ static struct irq_chip adnp_irq_chip = {
415 .irq_set_type = adnp_irq_set_type, 436 .irq_set_type = adnp_irq_set_type,
416 .irq_bus_lock = adnp_irq_bus_lock, 437 .irq_bus_lock = adnp_irq_bus_lock,
417 .irq_bus_sync_unlock = adnp_irq_bus_unlock, 438 .irq_bus_sync_unlock = adnp_irq_bus_unlock,
439 .irq_startup = adnp_irq_startup,
440 .irq_shutdown = adnp_irq_shutdown,
418}; 441};
419 442
420static int adnp_irq_map(struct irq_domain *domain, unsigned int irq, 443static int adnp_irq_map(struct irq_domain *domain, unsigned int irq,
diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c
index 72c927dc3be1..3437414eaef2 100644
--- a/drivers/gpio/gpio-bcm-kona.c
+++ b/drivers/gpio/gpio-bcm-kona.c
@@ -449,12 +449,34 @@ static void bcm_kona_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
449 chained_irq_exit(chip, desc); 449 chained_irq_exit(chip, desc);
450} 450}
451 451
452static unsigned int bcm_kona_gpio_irq_startup(struct irq_data *d)
453{
454 struct bcm_kona_gpio *kona_gpio = irq_data_get_irq_chip_data(d);
455
456 if (gpio_lock_as_irq(&kona_gpio->gpio_chip, d->hwirq))
457 dev_err(kona_gpio->gpio_chip.dev,
458 "unable to lock HW IRQ %lu for IRQ\n",
459 d->hwirq);
460 bcm_kona_gpio_irq_unmask(d);
461 return 0;
462}
463
464static void bcm_kona_gpio_irq_shutdown(struct irq_data *d)
465{
466 struct bcm_kona_gpio *kona_gpio = irq_data_get_irq_chip_data(d);
467
468 bcm_kona_gpio_irq_mask(d);
469 gpio_unlock_as_irq(&kona_gpio->gpio_chip, d->hwirq);
470}
471
452static struct irq_chip bcm_gpio_irq_chip = { 472static struct irq_chip bcm_gpio_irq_chip = {
453 .name = "bcm-kona-gpio", 473 .name = "bcm-kona-gpio",
454 .irq_ack = bcm_kona_gpio_irq_ack, 474 .irq_ack = bcm_kona_gpio_irq_ack,
455 .irq_mask = bcm_kona_gpio_irq_mask, 475 .irq_mask = bcm_kona_gpio_irq_mask,
456 .irq_unmask = bcm_kona_gpio_irq_unmask, 476 .irq_unmask = bcm_kona_gpio_irq_unmask,
457 .irq_set_type = bcm_kona_gpio_irq_set_type, 477 .irq_set_type = bcm_kona_gpio_irq_set_type,
478 .irq_startup = bcm_kona_gpio_irq_startup,
479 .irq_shutdown = bcm_kona_gpio_irq_shutdown,
458}; 480};
459 481
460static struct __initconst of_device_id bcm_kona_gpio_of_match[] = { 482static struct __initconst of_device_id bcm_kona_gpio_of_match[] = {
diff --git a/drivers/gpio/gpio-em.c b/drivers/gpio/gpio-em.c
index be7e3b92f986..1e98a9873967 100644
--- a/drivers/gpio/gpio-em.c
+++ b/drivers/gpio/gpio-em.c
@@ -99,6 +99,27 @@ static void em_gio_irq_enable(struct irq_data *d)
99 em_gio_write(p, GIO_IEN, BIT(irqd_to_hwirq(d))); 99 em_gio_write(p, GIO_IEN, BIT(irqd_to_hwirq(d)));
100} 100}
101 101
102static unsigned int em_gio_irq_startup(struct irq_data *d)
103{
104 struct em_gio_priv *p = irq_data_get_irq_chip_data(d);
105
106 if (gpio_lock_as_irq(&p->gpio_chip, irqd_to_hwirq(d)))
107 dev_err(p->gpio_chip.dev,
108 "unable to lock HW IRQ %lu for IRQ\n",
109 irqd_to_hwirq(d));
110 em_gio_irq_enable(d);
111 return 0;
112}
113
114static void em_gio_irq_shutdown(struct irq_data *d)
115{
116 struct em_gio_priv *p = irq_data_get_irq_chip_data(d);
117
118 em_gio_irq_disable(d);
119 gpio_unlock_as_irq(&p->gpio_chip, irqd_to_hwirq(d));
120}
121
122
102#define GIO_ASYNC(x) (x + 8) 123#define GIO_ASYNC(x) (x + 8)
103 124
104static unsigned char em_gio_sense_table[IRQ_TYPE_SENSE_MASK + 1] = { 125static unsigned char em_gio_sense_table[IRQ_TYPE_SENSE_MASK + 1] = {
@@ -338,6 +359,8 @@ static int em_gio_probe(struct platform_device *pdev)
338 irq_chip->irq_mask = em_gio_irq_disable; 359 irq_chip->irq_mask = em_gio_irq_disable;
339 irq_chip->irq_unmask = em_gio_irq_enable; 360 irq_chip->irq_unmask = em_gio_irq_enable;
340 irq_chip->irq_set_type = em_gio_irq_set_type; 361 irq_chip->irq_set_type = em_gio_irq_set_type;
362 irq_chip->irq_startup = em_gio_irq_startup;
363 irq_chip->irq_shutdown = em_gio_irq_shutdown;
341 irq_chip->flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND; 364 irq_chip->flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND;
342 365
343 p->irq_domain = irq_domain_add_simple(pdev->dev.of_node, 366 p->irq_domain = irq_domain_add_simple(pdev->dev.of_node,
diff --git a/drivers/gpio/gpio-intel-mid.c b/drivers/gpio/gpio-intel-mid.c
index 1535ebae8fc8..d1b50ef5fab8 100644
--- a/drivers/gpio/gpio-intel-mid.c
+++ b/drivers/gpio/gpio-intel-mid.c
@@ -235,11 +235,33 @@ static void intel_mid_irq_mask(struct irq_data *d)
235{ 235{
236} 236}
237 237
238static unsigned int intel_mid_irq_startup(struct irq_data *d)
239{
240 struct intel_mid_gpio *priv = irq_data_get_irq_chip_data(d);
241
242 if (gpio_lock_as_irq(&priv->chip, irqd_to_hwirq(d)))
243 dev_err(priv->chip.dev,
244 "unable to lock HW IRQ %lu for IRQ\n",
245 irqd_to_hwirq(d));
246 intel_mid_irq_unmask(d);
247 return 0;
248}
249
250static void intel_mid_irq_shutdown(struct irq_data *d)
251{
252 struct intel_mid_gpio *priv = irq_data_get_irq_chip_data(d);
253
254 intel_mid_irq_mask(d);
255 gpio_unlock_as_irq(&priv->chip, irqd_to_hwirq(d));
256}
257
238static struct irq_chip intel_mid_irqchip = { 258static struct irq_chip intel_mid_irqchip = {
239 .name = "INTEL_MID-GPIO", 259 .name = "INTEL_MID-GPIO",
240 .irq_mask = intel_mid_irq_mask, 260 .irq_mask = intel_mid_irq_mask,
241 .irq_unmask = intel_mid_irq_unmask, 261 .irq_unmask = intel_mid_irq_unmask,
242 .irq_set_type = intel_mid_irq_type, 262 .irq_set_type = intel_mid_irq_type,
263 .irq_startup = intel_mid_irq_startup,
264 .irq_shutdown = intel_mid_irq_shutdown,
243}; 265};
244 266
245static const struct intel_mid_gpio_ddata gpio_lincroft = { 267static const struct intel_mid_gpio_ddata gpio_lincroft = {
@@ -417,6 +439,7 @@ static int intel_gpio_probe(struct pci_dev *pdev,
417 439
418 priv->reg_base = pcim_iomap_table(pdev)[0]; 440 priv->reg_base = pcim_iomap_table(pdev)[0];
419 priv->chip.label = dev_name(&pdev->dev); 441 priv->chip.label = dev_name(&pdev->dev);
442 priv->chip.dev = &pdev->dev;
420 priv->chip.request = intel_gpio_request; 443 priv->chip.request = intel_gpio_request;
421 priv->chip.direction_input = intel_gpio_direction_input; 444 priv->chip.direction_input = intel_gpio_direction_input;
422 priv->chip.direction_output = intel_gpio_direction_output; 445 priv->chip.direction_output = intel_gpio_direction_output;
diff --git a/drivers/gpio/gpio-lynxpoint.c b/drivers/gpio/gpio-lynxpoint.c
index c283cd3b247a..66b18535b5ae 100644
--- a/drivers/gpio/gpio-lynxpoint.c
+++ b/drivers/gpio/gpio-lynxpoint.c
@@ -301,6 +301,26 @@ static void lp_irq_disable(struct irq_data *d)
301 spin_unlock_irqrestore(&lg->lock, flags); 301 spin_unlock_irqrestore(&lg->lock, flags);
302} 302}
303 303
304static unsigned int lp_irq_startup(struct irq_data *d)
305{
306 struct lp_gpio *lg = irq_data_get_irq_chip_data(d);
307
308 if (gpio_lock_as_irq(&lg->chip, irqd_to_hwirq(d)))
309 dev_err(lg->chip.dev,
310 "unable to lock HW IRQ %lu for IRQ\n",
311 irqd_to_hwirq(d));
312 lp_irq_enable(d);
313 return 0;
314}
315
316static void lp_irq_shutdown(struct irq_data *d)
317{
318 struct lp_gpio *lg = irq_data_get_irq_chip_data(d);
319
320 lp_irq_disable(d);
321 gpio_unlock_as_irq(&lg->chip, irqd_to_hwirq(d));
322}
323
304static struct irq_chip lp_irqchip = { 324static struct irq_chip lp_irqchip = {
305 .name = "LP-GPIO", 325 .name = "LP-GPIO",
306 .irq_mask = lp_irq_mask, 326 .irq_mask = lp_irq_mask,
@@ -308,6 +328,8 @@ static struct irq_chip lp_irqchip = {
308 .irq_enable = lp_irq_enable, 328 .irq_enable = lp_irq_enable,
309 .irq_disable = lp_irq_disable, 329 .irq_disable = lp_irq_disable,
310 .irq_set_type = lp_irq_type, 330 .irq_set_type = lp_irq_type,
331 .irq_startup = lp_irq_startup,
332 .irq_shutdown = lp_irq_shutdown,
311 .flags = IRQCHIP_SKIP_SET_WAKE, 333 .flags = IRQCHIP_SKIP_SET_WAKE,
312}; 334};
313 335