diff options
author | Linus Walleij <linus.walleij@linaro.org> | 2016-12-07 09:24:12 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2016-12-07 09:24:12 -0500 |
commit | acf1fcf77247efa01d7213f53082451f6c9c8f3b (patch) | |
tree | 7f4acc733d5384e0f342240a82c6156f5619e80c /drivers/gpio | |
parent | eb485c7d9e6d71e4f621edb83573cb85c1d22975 (diff) | |
parent | 35ca3f61617db77364e40c1977952c5ee0a776cb (diff) |
Merge branch 'thread-irq-simpler' into devel
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/gpio-adnp.c | 12 | ||||
-rw-r--r-- | drivers/gpio/gpio-crystalcove.c | 6 | ||||
-rw-r--r-- | drivers/gpio/gpio-dln2.c | 1 | ||||
-rw-r--r-- | drivers/gpio/gpio-max732x.c | 17 | ||||
-rw-r--r-- | drivers/gpio/gpio-mcp23s08.c | 17 | ||||
-rw-r--r-- | drivers/gpio/gpio-pca953x.c | 16 | ||||
-rw-r--r-- | drivers/gpio/gpio-pcf857x.c | 11 | ||||
-rw-r--r-- | drivers/gpio/gpio-stmpe.c | 17 | ||||
-rw-r--r-- | drivers/gpio/gpio-tc3589x.c | 17 | ||||
-rw-r--r-- | drivers/gpio/gpio-wcove.c | 6 | ||||
-rw-r--r-- | drivers/gpio/gpiolib.c | 69 |
11 files changed, 117 insertions, 72 deletions
diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c index 8ff7b0d3eac6..89863ea25de1 100644 --- a/drivers/gpio/gpio-adnp.c +++ b/drivers/gpio/gpio-adnp.c | |||
@@ -468,17 +468,19 @@ static int adnp_irq_setup(struct adnp *adnp) | |||
468 | return err; | 468 | return err; |
469 | } | 469 | } |
470 | 470 | ||
471 | err = gpiochip_irqchip_add(chip, | 471 | err = gpiochip_irqchip_add_nested(chip, |
472 | &adnp_irq_chip, | 472 | &adnp_irq_chip, |
473 | 0, | 473 | 0, |
474 | handle_simple_irq, | 474 | handle_simple_irq, |
475 | IRQ_TYPE_NONE); | 475 | IRQ_TYPE_NONE); |
476 | if (err) { | 476 | if (err) { |
477 | dev_err(chip->parent, | 477 | dev_err(chip->parent, |
478 | "could not connect irqchip to gpiochip\n"); | 478 | "could not connect irqchip to gpiochip\n"); |
479 | return err; | 479 | return err; |
480 | } | 480 | } |
481 | 481 | ||
482 | gpiochip_set_nested_irqchip(chip, &adnp_irq_chip, adnp->client->irq); | ||
483 | |||
482 | return 0; | 484 | return 0; |
483 | } | 485 | } |
484 | 486 | ||
diff --git a/drivers/gpio/gpio-crystalcove.c b/drivers/gpio/gpio-crystalcove.c index 7c446d118cd6..2197368cc899 100644 --- a/drivers/gpio/gpio-crystalcove.c +++ b/drivers/gpio/gpio-crystalcove.c | |||
@@ -351,8 +351,8 @@ static int crystalcove_gpio_probe(struct platform_device *pdev) | |||
351 | return retval; | 351 | return retval; |
352 | } | 352 | } |
353 | 353 | ||
354 | gpiochip_irqchip_add(&cg->chip, &crystalcove_irqchip, 0, | 354 | gpiochip_irqchip_add_nested(&cg->chip, &crystalcove_irqchip, 0, |
355 | handle_simple_irq, IRQ_TYPE_NONE); | 355 | handle_simple_irq, IRQ_TYPE_NONE); |
356 | 356 | ||
357 | retval = request_threaded_irq(irq, NULL, crystalcove_gpio_irq_handler, | 357 | retval = request_threaded_irq(irq, NULL, crystalcove_gpio_irq_handler, |
358 | IRQF_ONESHOT, KBUILD_MODNAME, cg); | 358 | IRQF_ONESHOT, KBUILD_MODNAME, cg); |
@@ -362,6 +362,8 @@ static int crystalcove_gpio_probe(struct platform_device *pdev) | |||
362 | return retval; | 362 | return retval; |
363 | } | 363 | } |
364 | 364 | ||
365 | gpiochip_set_nested_irqchip(&cg->chip, &crystalcove_irqchip, irq); | ||
366 | |||
365 | return 0; | 367 | return 0; |
366 | } | 368 | } |
367 | 369 | ||
diff --git a/drivers/gpio/gpio-dln2.c b/drivers/gpio/gpio-dln2.c index f7a60a441e95..5d38b08d1ee2 100644 --- a/drivers/gpio/gpio-dln2.c +++ b/drivers/gpio/gpio-dln2.c | |||
@@ -467,7 +467,6 @@ static int dln2_gpio_probe(struct platform_device *pdev) | |||
467 | dln2->gpio.base = -1; | 467 | dln2->gpio.base = -1; |
468 | dln2->gpio.ngpio = pins; | 468 | dln2->gpio.ngpio = pins; |
469 | dln2->gpio.can_sleep = true; | 469 | dln2->gpio.can_sleep = true; |
470 | dln2->gpio.irq_not_threaded = true; | ||
471 | dln2->gpio.set = dln2_gpio_set; | 470 | dln2->gpio.set = dln2_gpio_set; |
472 | dln2->gpio.get = dln2_gpio_get; | 471 | dln2->gpio.get = dln2_gpio_get; |
473 | dln2->gpio.request = dln2_gpio_request; | 472 | dln2->gpio.request = dln2_gpio_request; |
diff --git a/drivers/gpio/gpio-max732x.c b/drivers/gpio/gpio-max732x.c index a9aaf9d822b4..4ea4c6a1313b 100644 --- a/drivers/gpio/gpio-max732x.c +++ b/drivers/gpio/gpio-max732x.c | |||
@@ -520,20 +520,19 @@ static int max732x_irq_setup(struct max732x_chip *chip, | |||
520 | client->irq); | 520 | client->irq); |
521 | return ret; | 521 | return ret; |
522 | } | 522 | } |
523 | ret = gpiochip_irqchip_add(&chip->gpio_chip, | 523 | ret = gpiochip_irqchip_add_nested(&chip->gpio_chip, |
524 | &max732x_irq_chip, | 524 | &max732x_irq_chip, |
525 | irq_base, | 525 | irq_base, |
526 | handle_simple_irq, | 526 | handle_simple_irq, |
527 | IRQ_TYPE_NONE); | 527 | IRQ_TYPE_NONE); |
528 | if (ret) { | 528 | if (ret) { |
529 | dev_err(&client->dev, | 529 | dev_err(&client->dev, |
530 | "could not connect irqchip to gpiochip\n"); | 530 | "could not connect irqchip to gpiochip\n"); |
531 | return ret; | 531 | return ret; |
532 | } | 532 | } |
533 | gpiochip_set_chained_irqchip(&chip->gpio_chip, | 533 | gpiochip_set_nested_irqchip(&chip->gpio_chip, |
534 | &max732x_irq_chip, | 534 | &max732x_irq_chip, |
535 | client->irq, | 535 | client->irq); |
536 | NULL); | ||
537 | } | 536 | } |
538 | 537 | ||
539 | return 0; | 538 | return 0; |
diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c index 99d37b56c258..504550665091 100644 --- a/drivers/gpio/gpio-mcp23s08.c +++ b/drivers/gpio/gpio-mcp23s08.c | |||
@@ -473,21 +473,20 @@ static int mcp23s08_irq_setup(struct mcp23s08 *mcp) | |||
473 | return err; | 473 | return err; |
474 | } | 474 | } |
475 | 475 | ||
476 | err = gpiochip_irqchip_add(chip, | 476 | err = gpiochip_irqchip_add_nested(chip, |
477 | &mcp23s08_irq_chip, | 477 | &mcp23s08_irq_chip, |
478 | 0, | 478 | 0, |
479 | handle_simple_irq, | 479 | handle_simple_irq, |
480 | IRQ_TYPE_NONE); | 480 | IRQ_TYPE_NONE); |
481 | if (err) { | 481 | if (err) { |
482 | dev_err(chip->parent, | 482 | dev_err(chip->parent, |
483 | "could not connect irqchip to gpiochip: %d\n", err); | 483 | "could not connect irqchip to gpiochip: %d\n", err); |
484 | return err; | 484 | return err; |
485 | } | 485 | } |
486 | 486 | ||
487 | gpiochip_set_chained_irqchip(chip, | 487 | gpiochip_set_nested_irqchip(chip, |
488 | &mcp23s08_irq_chip, | 488 | &mcp23s08_irq_chip, |
489 | mcp->irq, | 489 | mcp->irq); |
490 | NULL); | ||
491 | 490 | ||
492 | return 0; | 491 | return 0; |
493 | } | 492 | } |
diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c index 601c4550ee27..9733678f0219 100644 --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c | |||
@@ -636,20 +636,20 @@ static int pca953x_irq_setup(struct pca953x_chip *chip, | |||
636 | return ret; | 636 | return ret; |
637 | } | 637 | } |
638 | 638 | ||
639 | ret = gpiochip_irqchip_add(&chip->gpio_chip, | 639 | ret = gpiochip_irqchip_add_nested(&chip->gpio_chip, |
640 | &pca953x_irq_chip, | 640 | &pca953x_irq_chip, |
641 | irq_base, | 641 | irq_base, |
642 | handle_simple_irq, | 642 | handle_simple_irq, |
643 | IRQ_TYPE_NONE); | 643 | IRQ_TYPE_NONE); |
644 | if (ret) { | 644 | if (ret) { |
645 | dev_err(&client->dev, | 645 | dev_err(&client->dev, |
646 | "could not connect irqchip to gpiochip\n"); | 646 | "could not connect irqchip to gpiochip\n"); |
647 | return ret; | 647 | return ret; |
648 | } | 648 | } |
649 | 649 | ||
650 | gpiochip_set_chained_irqchip(&chip->gpio_chip, | 650 | gpiochip_set_nested_irqchip(&chip->gpio_chip, |
651 | &pca953x_irq_chip, | 651 | &pca953x_irq_chip, |
652 | client->irq, NULL); | 652 | client->irq); |
653 | } | 653 | } |
654 | 654 | ||
655 | return 0; | 655 | return 0; |
diff --git a/drivers/gpio/gpio-pcf857x.c b/drivers/gpio/gpio-pcf857x.c index d168410e2338..895af42a4513 100644 --- a/drivers/gpio/gpio-pcf857x.c +++ b/drivers/gpio/gpio-pcf857x.c | |||
@@ -378,9 +378,10 @@ static int pcf857x_probe(struct i2c_client *client, | |||
378 | 378 | ||
379 | /* Enable irqchip if we have an interrupt */ | 379 | /* Enable irqchip if we have an interrupt */ |
380 | if (client->irq) { | 380 | if (client->irq) { |
381 | status = gpiochip_irqchip_add(&gpio->chip, &pcf857x_irq_chip, | 381 | status = gpiochip_irqchip_add_nested(&gpio->chip, |
382 | 0, handle_level_irq, | 382 | &pcf857x_irq_chip, |
383 | IRQ_TYPE_NONE); | 383 | 0, handle_level_irq, |
384 | IRQ_TYPE_NONE); | ||
384 | if (status) { | 385 | if (status) { |
385 | dev_err(&client->dev, "cannot add irqchip\n"); | 386 | dev_err(&client->dev, "cannot add irqchip\n"); |
386 | goto fail; | 387 | goto fail; |
@@ -393,8 +394,8 @@ static int pcf857x_probe(struct i2c_client *client, | |||
393 | if (status) | 394 | if (status) |
394 | goto fail; | 395 | goto fail; |
395 | 396 | ||
396 | gpiochip_set_chained_irqchip(&gpio->chip, &pcf857x_irq_chip, | 397 | gpiochip_set_nested_irqchip(&gpio->chip, &pcf857x_irq_chip, |
397 | client->irq, NULL); | 398 | client->irq); |
398 | gpio->irq_parent = client->irq; | 399 | gpio->irq_parent = client->irq; |
399 | } | 400 | } |
400 | 401 | ||
diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c index e2e1b16a42db..21364e95065d 100644 --- a/drivers/gpio/gpio-stmpe.c +++ b/drivers/gpio/gpio-stmpe.c | |||
@@ -484,21 +484,20 @@ static int stmpe_gpio_probe(struct platform_device *pdev) | |||
484 | if (stmpe_gpio->norequest_mask & BIT(i)) | 484 | if (stmpe_gpio->norequest_mask & BIT(i)) |
485 | clear_bit(i, stmpe_gpio->chip.irq_valid_mask); | 485 | clear_bit(i, stmpe_gpio->chip.irq_valid_mask); |
486 | } | 486 | } |
487 | ret = gpiochip_irqchip_add(&stmpe_gpio->chip, | 487 | ret = gpiochip_irqchip_add_nested(&stmpe_gpio->chip, |
488 | &stmpe_gpio_irq_chip, | 488 | &stmpe_gpio_irq_chip, |
489 | 0, | 489 | 0, |
490 | handle_simple_irq, | 490 | handle_simple_irq, |
491 | IRQ_TYPE_NONE); | 491 | IRQ_TYPE_NONE); |
492 | if (ret) { | 492 | if (ret) { |
493 | dev_err(&pdev->dev, | 493 | dev_err(&pdev->dev, |
494 | "could not connect irqchip to gpiochip\n"); | 494 | "could not connect irqchip to gpiochip\n"); |
495 | goto out_disable; | 495 | goto out_disable; |
496 | } | 496 | } |
497 | 497 | ||
498 | gpiochip_set_chained_irqchip(&stmpe_gpio->chip, | 498 | gpiochip_set_nested_irqchip(&stmpe_gpio->chip, |
499 | &stmpe_gpio_irq_chip, | 499 | &stmpe_gpio_irq_chip, |
500 | irq, | 500 | irq); |
501 | NULL); | ||
502 | } | 501 | } |
503 | 502 | ||
504 | platform_set_drvdata(pdev, stmpe_gpio); | 503 | platform_set_drvdata(pdev, stmpe_gpio); |
diff --git a/drivers/gpio/gpio-tc3589x.c b/drivers/gpio/gpio-tc3589x.c index 5a5a6cb00eea..f041965f1b03 100644 --- a/drivers/gpio/gpio-tc3589x.c +++ b/drivers/gpio/gpio-tc3589x.c | |||
@@ -337,21 +337,20 @@ static int tc3589x_gpio_probe(struct platform_device *pdev) | |||
337 | return ret; | 337 | return ret; |
338 | } | 338 | } |
339 | 339 | ||
340 | ret = gpiochip_irqchip_add(&tc3589x_gpio->chip, | 340 | ret = gpiochip_irqchip_add_nested(&tc3589x_gpio->chip, |
341 | &tc3589x_gpio_irq_chip, | 341 | &tc3589x_gpio_irq_chip, |
342 | 0, | 342 | 0, |
343 | handle_simple_irq, | 343 | handle_simple_irq, |
344 | IRQ_TYPE_NONE); | 344 | IRQ_TYPE_NONE); |
345 | if (ret) { | 345 | if (ret) { |
346 | dev_err(&pdev->dev, | 346 | dev_err(&pdev->dev, |
347 | "could not connect irqchip to gpiochip\n"); | 347 | "could not connect irqchip to gpiochip\n"); |
348 | return ret; | 348 | return ret; |
349 | } | 349 | } |
350 | 350 | ||
351 | gpiochip_set_chained_irqchip(&tc3589x_gpio->chip, | 351 | gpiochip_set_nested_irqchip(&tc3589x_gpio->chip, |
352 | &tc3589x_gpio_irq_chip, | 352 | &tc3589x_gpio_irq_chip, |
353 | irq, | 353 | irq); |
354 | NULL); | ||
355 | 354 | ||
356 | platform_set_drvdata(pdev, tc3589x_gpio); | 355 | platform_set_drvdata(pdev, tc3589x_gpio); |
357 | 356 | ||
diff --git a/drivers/gpio/gpio-wcove.c b/drivers/gpio/gpio-wcove.c index d0ddba7a9d08..34baee5b1dd6 100644 --- a/drivers/gpio/gpio-wcove.c +++ b/drivers/gpio/gpio-wcove.c | |||
@@ -426,8 +426,8 @@ static int wcove_gpio_probe(struct platform_device *pdev) | |||
426 | return ret; | 426 | return ret; |
427 | } | 427 | } |
428 | 428 | ||
429 | ret = gpiochip_irqchip_add(&wg->chip, &wcove_irqchip, 0, | 429 | ret = gpiochip_irqchip_add_nested(&wg->chip, &wcove_irqchip, 0, |
430 | handle_simple_irq, IRQ_TYPE_NONE); | 430 | handle_simple_irq, IRQ_TYPE_NONE); |
431 | if (ret) { | 431 | if (ret) { |
432 | dev_err(dev, "Failed to add irqchip: %d\n", ret); | 432 | dev_err(dev, "Failed to add irqchip: %d\n", ret); |
433 | return ret; | 433 | return ret; |
@@ -446,6 +446,8 @@ static int wcove_gpio_probe(struct platform_device *pdev) | |||
446 | return ret; | 446 | return ret; |
447 | } | 447 | } |
448 | 448 | ||
449 | gpiochip_set_nested_irqchip(&wg->chip, &wcove_irqchip, virq); | ||
450 | |||
449 | return 0; | 451 | return 0; |
450 | } | 452 | } |
451 | 453 | ||
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 0e29cb745648..acdff62f2ee2 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -1440,7 +1440,7 @@ static bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip, | |||
1440 | } | 1440 | } |
1441 | 1441 | ||
1442 | /** | 1442 | /** |
1443 | * gpiochip_set_chained_irqchip() - sets a chained irqchip to a gpiochip | 1443 | * gpiochip_set_cascaded_irqchip() - connects a cascaded irqchip to a gpiochip |
1444 | * @gpiochip: the gpiochip to set the irqchip chain to | 1444 | * @gpiochip: the gpiochip to set the irqchip chain to |
1445 | * @irqchip: the irqchip to chain to the gpiochip | 1445 | * @irqchip: the irqchip to chain to the gpiochip |
1446 | * @parent_irq: the irq number corresponding to the parent IRQ for this | 1446 | * @parent_irq: the irq number corresponding to the parent IRQ for this |
@@ -1449,10 +1449,10 @@ static bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip, | |||
1449 | * coming out of the gpiochip. If the interrupt is nested rather than | 1449 | * coming out of the gpiochip. If the interrupt is nested rather than |
1450 | * cascaded, pass NULL in this handler argument | 1450 | * cascaded, pass NULL in this handler argument |
1451 | */ | 1451 | */ |
1452 | void gpiochip_set_chained_irqchip(struct gpio_chip *gpiochip, | 1452 | static void gpiochip_set_cascaded_irqchip(struct gpio_chip *gpiochip, |
1453 | struct irq_chip *irqchip, | 1453 | struct irq_chip *irqchip, |
1454 | int parent_irq, | 1454 | int parent_irq, |
1455 | irq_flow_handler_t parent_handler) | 1455 | irq_flow_handler_t parent_handler) |
1456 | { | 1456 | { |
1457 | unsigned int offset; | 1457 | unsigned int offset; |
1458 | 1458 | ||
@@ -1476,7 +1476,7 @@ void gpiochip_set_chained_irqchip(struct gpio_chip *gpiochip, | |||
1476 | irq_set_chained_handler_and_data(parent_irq, parent_handler, | 1476 | irq_set_chained_handler_and_data(parent_irq, parent_handler, |
1477 | gpiochip); | 1477 | gpiochip); |
1478 | 1478 | ||
1479 | gpiochip->irq_parent = parent_irq; | 1479 | gpiochip->irq_chained_parent = parent_irq; |
1480 | } | 1480 | } |
1481 | 1481 | ||
1482 | /* Set the parent IRQ for all affected IRQs */ | 1482 | /* Set the parent IRQ for all affected IRQs */ |
@@ -1487,9 +1487,48 @@ void gpiochip_set_chained_irqchip(struct gpio_chip *gpiochip, | |||
1487 | parent_irq); | 1487 | parent_irq); |
1488 | } | 1488 | } |
1489 | } | 1489 | } |
1490 | |||
1491 | /** | ||
1492 | * gpiochip_set_chained_irqchip() - connects a chained irqchip to a gpiochip | ||
1493 | * @gpiochip: the gpiochip to set the irqchip chain to | ||
1494 | * @irqchip: the irqchip to chain to the gpiochip | ||
1495 | * @parent_irq: the irq number corresponding to the parent IRQ for this | ||
1496 | * chained irqchip | ||
1497 | * @parent_handler: the parent interrupt handler for the accumulated IRQ | ||
1498 | * coming out of the gpiochip. If the interrupt is nested rather than | ||
1499 | * cascaded, pass NULL in this handler argument | ||
1500 | */ | ||
1501 | void gpiochip_set_chained_irqchip(struct gpio_chip *gpiochip, | ||
1502 | struct irq_chip *irqchip, | ||
1503 | int parent_irq, | ||
1504 | irq_flow_handler_t parent_handler) | ||
1505 | { | ||
1506 | gpiochip_set_cascaded_irqchip(gpiochip, irqchip, parent_irq, | ||
1507 | parent_handler); | ||
1508 | } | ||
1490 | EXPORT_SYMBOL_GPL(gpiochip_set_chained_irqchip); | 1509 | EXPORT_SYMBOL_GPL(gpiochip_set_chained_irqchip); |
1491 | 1510 | ||
1492 | /** | 1511 | /** |
1512 | * gpiochip_set_nested_irqchip() - connects a nested irqchip to a gpiochip | ||
1513 | * @gpiochip: the gpiochip to set the irqchip nested handler to | ||
1514 | * @irqchip: the irqchip to nest to the gpiochip | ||
1515 | * @parent_irq: the irq number corresponding to the parent IRQ for this | ||
1516 | * nested irqchip | ||
1517 | */ | ||
1518 | void gpiochip_set_nested_irqchip(struct gpio_chip *gpiochip, | ||
1519 | struct irq_chip *irqchip, | ||
1520 | int parent_irq) | ||
1521 | { | ||
1522 | if (!gpiochip->irq_nested) { | ||
1523 | chip_err(gpiochip, "tried to nest a chained gpiochip\n"); | ||
1524 | return; | ||
1525 | } | ||
1526 | gpiochip_set_cascaded_irqchip(gpiochip, irqchip, parent_irq, | ||
1527 | NULL); | ||
1528 | } | ||
1529 | EXPORT_SYMBOL_GPL(gpiochip_set_nested_irqchip); | ||
1530 | |||
1531 | /** | ||
1493 | * gpiochip_irq_map() - maps an IRQ into a GPIO irqchip | 1532 | * gpiochip_irq_map() - maps an IRQ into a GPIO irqchip |
1494 | * @d: the irqdomain used by this irqchip | 1533 | * @d: the irqdomain used by this irqchip |
1495 | * @irq: the global irq number used by this GPIO irqchip irq | 1534 | * @irq: the global irq number used by this GPIO irqchip irq |
@@ -1511,8 +1550,8 @@ static int gpiochip_irq_map(struct irq_domain *d, unsigned int irq, | |||
1511 | */ | 1550 | */ |
1512 | irq_set_lockdep_class(irq, chip->lock_key); | 1551 | irq_set_lockdep_class(irq, chip->lock_key); |
1513 | irq_set_chip_and_handler(irq, chip->irqchip, chip->irq_handler); | 1552 | irq_set_chip_and_handler(irq, chip->irqchip, chip->irq_handler); |
1514 | /* Chips that can sleep need nested thread handlers */ | 1553 | /* Chips that use nested thread handlers have them marked */ |
1515 | if (chip->can_sleep && !chip->irq_not_threaded) | 1554 | if (chip->irq_nested) |
1516 | irq_set_nested_thread(irq, 1); | 1555 | irq_set_nested_thread(irq, 1); |
1517 | irq_set_noprobe(irq); | 1556 | irq_set_noprobe(irq); |
1518 | 1557 | ||
@@ -1530,7 +1569,7 @@ static void gpiochip_irq_unmap(struct irq_domain *d, unsigned int irq) | |||
1530 | { | 1569 | { |
1531 | struct gpio_chip *chip = d->host_data; | 1570 | struct gpio_chip *chip = d->host_data; |
1532 | 1571 | ||
1533 | if (chip->can_sleep) | 1572 | if (chip->irq_nested) |
1534 | irq_set_nested_thread(irq, 0); | 1573 | irq_set_nested_thread(irq, 0); |
1535 | irq_set_chip_and_handler(irq, NULL, NULL); | 1574 | irq_set_chip_and_handler(irq, NULL, NULL); |
1536 | irq_set_chip_data(irq, NULL); | 1575 | irq_set_chip_data(irq, NULL); |
@@ -1585,9 +1624,9 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) | |||
1585 | 1624 | ||
1586 | acpi_gpiochip_free_interrupts(gpiochip); | 1625 | acpi_gpiochip_free_interrupts(gpiochip); |
1587 | 1626 | ||
1588 | if (gpiochip->irq_parent) { | 1627 | if (gpiochip->irq_chained_parent) { |
1589 | irq_set_chained_handler(gpiochip->irq_parent, NULL); | 1628 | irq_set_chained_handler(gpiochip->irq_chained_parent, NULL); |
1590 | irq_set_handler_data(gpiochip->irq_parent, NULL); | 1629 | irq_set_handler_data(gpiochip->irq_chained_parent, NULL); |
1591 | } | 1630 | } |
1592 | 1631 | ||
1593 | /* Remove all IRQ mappings and delete the domain */ | 1632 | /* Remove all IRQ mappings and delete the domain */ |
@@ -1611,7 +1650,7 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) | |||
1611 | } | 1650 | } |
1612 | 1651 | ||
1613 | /** | 1652 | /** |
1614 | * gpiochip_irqchip_add() - adds an irqchip to a gpiochip | 1653 | * _gpiochip_irqchip_add() - adds an irqchip to a gpiochip |
1615 | * @gpiochip: the gpiochip to add the irqchip to | 1654 | * @gpiochip: the gpiochip to add the irqchip to |
1616 | * @irqchip: the irqchip to add to the gpiochip | 1655 | * @irqchip: the irqchip to add to the gpiochip |
1617 | * @first_irq: if not dynamically assigned, the base (first) IRQ to | 1656 | * @first_irq: if not dynamically assigned, the base (first) IRQ to |
@@ -1619,6 +1658,8 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) | |||
1619 | * @handler: the irq handler to use (often a predefined irq core function) | 1658 | * @handler: the irq handler to use (often a predefined irq core function) |
1620 | * @type: the default type for IRQs on this irqchip, pass IRQ_TYPE_NONE | 1659 | * @type: the default type for IRQs on this irqchip, pass IRQ_TYPE_NONE |
1621 | * to have the core avoid setting up any default type in the hardware. | 1660 | * to have the core avoid setting up any default type in the hardware. |
1661 | * @nested: whether this is a nested irqchip calling handle_nested_irq() | ||
1662 | * in its IRQ handler | ||
1622 | * @lock_key: lockdep class | 1663 | * @lock_key: lockdep class |
1623 | * | 1664 | * |
1624 | * This function closely associates a certain irqchip with a certain | 1665 | * This function closely associates a certain irqchip with a certain |
@@ -1640,6 +1681,7 @@ int _gpiochip_irqchip_add(struct gpio_chip *gpiochip, | |||
1640 | unsigned int first_irq, | 1681 | unsigned int first_irq, |
1641 | irq_flow_handler_t handler, | 1682 | irq_flow_handler_t handler, |
1642 | unsigned int type, | 1683 | unsigned int type, |
1684 | bool nested, | ||
1643 | struct lock_class_key *lock_key) | 1685 | struct lock_class_key *lock_key) |
1644 | { | 1686 | { |
1645 | struct device_node *of_node; | 1687 | struct device_node *of_node; |
@@ -1654,6 +1696,7 @@ int _gpiochip_irqchip_add(struct gpio_chip *gpiochip, | |||
1654 | pr_err("missing gpiochip .dev parent pointer\n"); | 1696 | pr_err("missing gpiochip .dev parent pointer\n"); |
1655 | return -EINVAL; | 1697 | return -EINVAL; |
1656 | } | 1698 | } |
1699 | gpiochip->irq_nested = nested; | ||
1657 | of_node = gpiochip->parent->of_node; | 1700 | of_node = gpiochip->parent->of_node; |
1658 | #ifdef CONFIG_OF_GPIO | 1701 | #ifdef CONFIG_OF_GPIO |
1659 | /* | 1702 | /* |