aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-05-21 14:45:26 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-05-21 14:45:26 -0400
commite7a3d62749183576854cdc961b8b1cddf1aed71e (patch)
tree3f4933ce4735ba563eea155317138e45a217563d
parent56f410cf45a1c1f68f77741990e0435b06a07676 (diff)
parent2c4569ca26986d18243f282dd727da27e9adae4c (diff)
Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq fixes from Thomas Gleixner: "A set of small fixes for the irq subsystem: - Cure a data ordering problem with chained interrupts - Three small fixlets for the mbigen irq chip" * 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: genirq: Fix chained interrupt data ordering irqchip/mbigen: Fix the clear register offset calculation irqchip/mbigen: Fix potential NULL dereferencing irqchip/mbigen: Fix memory mapping code
-rw-r--r--drivers/irqchip/irq-mbigen.c17
-rw-r--r--kernel/irq/chip.c2
2 files changed, 11 insertions, 8 deletions
diff --git a/drivers/irqchip/irq-mbigen.c b/drivers/irqchip/irq-mbigen.c
index d2306c821ebb..31d6b5a582d2 100644
--- a/drivers/irqchip/irq-mbigen.c
+++ b/drivers/irqchip/irq-mbigen.c
@@ -106,10 +106,7 @@ static inline void get_mbigen_type_reg(irq_hw_number_t hwirq,
106static inline void get_mbigen_clear_reg(irq_hw_number_t hwirq, 106static inline void get_mbigen_clear_reg(irq_hw_number_t hwirq,
107 u32 *mask, u32 *addr) 107 u32 *mask, u32 *addr)
108{ 108{
109 unsigned int ofst; 109 unsigned int ofst = (hwirq / 32) * 4;
110
111 hwirq -= RESERVED_IRQ_PER_MBIGEN_CHIP;
112 ofst = hwirq / 32 * 4;
113 110
114 *mask = 1 << (hwirq % 32); 111 *mask = 1 << (hwirq % 32);
115 *addr = ofst + REG_MBIGEN_CLEAR_OFFSET; 112 *addr = ofst + REG_MBIGEN_CLEAR_OFFSET;
@@ -337,9 +334,15 @@ static int mbigen_device_probe(struct platform_device *pdev)
337 mgn_chip->pdev = pdev; 334 mgn_chip->pdev = pdev;
338 335
339 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 336 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
340 mgn_chip->base = devm_ioremap_resource(&pdev->dev, res); 337 if (!res)
341 if (IS_ERR(mgn_chip->base)) 338 return -EINVAL;
342 return PTR_ERR(mgn_chip->base); 339
340 mgn_chip->base = devm_ioremap(&pdev->dev, res->start,
341 resource_size(res));
342 if (!mgn_chip->base) {
343 dev_err(&pdev->dev, "failed to ioremap %pR\n", res);
344 return -ENOMEM;
345 }
343 346
344 if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) 347 if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node)
345 err = mbigen_of_create_domain(pdev, mgn_chip); 348 err = mbigen_of_create_domain(pdev, mgn_chip);
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 686be4b73018..c94da688ee9b 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -880,8 +880,8 @@ irq_set_chained_handler_and_data(unsigned int irq, irq_flow_handler_t handle,
880 if (!desc) 880 if (!desc)
881 return; 881 return;
882 882
883 __irq_do_set_handler(desc, handle, 1, NULL);
884 desc->irq_common_data.handler_data = data; 883 desc->irq_common_data.handler_data = data;
884 __irq_do_set_handler(desc, handle, 1, NULL);
885 885
886 irq_put_desc_busunlock(desc, flags); 886 irq_put_desc_busunlock(desc, flags);
887} 887}