From aa25729cfd9709156661bea0f9293deb7729f57a Mon Sep 17 00:00:00 2001 From: Tony Lindgren Date: Wed, 5 Nov 2014 09:21:23 -0800 Subject: ARM: OMAP3: Fix errors for omap_l3_smx when booted with device tree When booting omap3 in device tree mode, we're currently getting the following errors: omap_l3_smx omap_l3_smx.0: couldn't request debug irq omap_l3_smx: probe of omap_l3_smx.0 failed with error -22 This is because we don't have handling in the driver for the compatible property and instead assume platform data being passed. Note that this binding is already documented, and implemented for the related omap_l3_noc driver for omap4 and later. Looks like the binding somehow never got never implemented for this omap_l3_smx driver though. Let's also remove __exit_p to allow binding and unbinding of the driver while at it. Reported-by: Pavel Machek Reported-by: Russell King Acked-by: Santosh Shilimkar Signed-off-by: Tony Lindgren --- arch/arm/boot/dts/omap3.dtsi | 2 +- arch/arm/mach-omap2/devices.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index d0e884d3a737..e602e75ce5b7 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi @@ -79,7 +79,7 @@ * hierarchy. */ ocp { - compatible = "simple-bus"; + compatible = "ti,omap3-l3-smx", "simple-bus"; reg = <0x68000000 0x10000>; interrupts = <9 10>; #address-cells = <1>; diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 324f02bf8a51..55447972eeed 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -49,7 +49,7 @@ static int __init omap3_l3_init(void) * To avoid code running on other OMAPs in * multi-omap builds */ - if (!(cpu_is_omap34xx())) + if (!(cpu_is_omap34xx()) || of_have_populated_dt()) return -ENODEV; snprintf(oh_name, L3_MODULES_MAX_LEN, "l3_main"); -- cgit v1.2.3 From 9dec11f5d813fd3755c1dce45add3afb73ee6318 Mon Sep 17 00:00:00 2001 From: Tony Lindgren Date: Wed, 5 Nov 2014 09:21:23 -0800 Subject: ARM: dts: Fix NAND last partition size on LDP Fix the following warning during the boot: mtd: partition "Filesystem" extends beyond the end of device "omap2-nand.0" -- size truncated to 0x6000000 Looks like I got the last partition size wrong while setting up the .dts file. Note that this does not affect the partition as the size has been getting truncated to the right size. Signed-off-by: Tony Lindgren --- arch/arm/boot/dts/omap3-ldp.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'arch/arm') diff --git a/arch/arm/boot/dts/omap3-ldp.dts b/arch/arm/boot/dts/omap3-ldp.dts index 72dca0b7904d..f7a45deaaa32 100644 --- a/arch/arm/boot/dts/omap3-ldp.dts +++ b/arch/arm/boot/dts/omap3-ldp.dts @@ -141,7 +141,7 @@ }; partition@2000000 { label = "Filesystem"; - reg = <0x2000000 0xe000000>; + reg = <0x2000000 0x6000000>; }; }; -- cgit v1.2.3 From edafb204d484835d918e74eab54e73214eedfeea Mon Sep 17 00:00:00 2001 From: Tony Lindgren Date: Wed, 5 Nov 2014 09:21:23 -0800 Subject: ARM: dts: Add twl keypad map for LDP Looks like we're still missing the keypad map for LDP. Let's add it since we have the binding now available for the twl4030_keypad as otherwise we get the following errors during the boot: twl4030_keypad keypad.31: OF: linux,keymap property not defined in /ocp/i2c@48070000/twl@48/keypad twl4030_keypad keypad.31: Failed to build keymap twl4030_keypad: probe of keypad.31 failed with error -2 Reported-by: Russell King Signed-off-by: Tony Lindgren --- arch/arm/boot/dts/omap3-ldp.dts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'arch/arm') diff --git a/arch/arm/boot/dts/omap3-ldp.dts b/arch/arm/boot/dts/omap3-ldp.dts index f7a45deaaa32..77fee3fb7515 100644 --- a/arch/arm/boot/dts/omap3-ldp.dts +++ b/arch/arm/boot/dts/omap3-ldp.dts @@ -7,6 +7,7 @@ */ /dts-v1/; +#include #include "omap34xx.dtsi" #include "omap-gpmc-smsc911x.dtsi" @@ -263,6 +264,26 @@ }; }; +&twl_keypad { + linux,keymap = ; +}; + &uart3 { interrupts-extended = <&intc 74 &omap3_pmx_core OMAP3_UART3_RX>; }; -- cgit v1.2.3 From 8cf747f1e1001673a34292bd3dddbe6bb2817e0b Mon Sep 17 00:00:00 2001 From: Tony Lindgren Date: Wed, 5 Nov 2014 09:21:23 -0800 Subject: ARM: dts: Add twl keypad map for omap3 EVM Looks like we're still missing the keypad map for EVM. Let's add it since we have the binding now available for the twl4030_keypad as otherwise we get the following errors during the boot: twl4030_keypad keypad.31: OF: linux,keymap property not defined in /ocp/i2c@48070000/twl@48/keypad twl4030_keypad keypad.31: Failed to build keymap twl4030_keypad: probe of keypad.31 failed with error -2 Signed-off-by: Tony Lindgren --- arch/arm/boot/dts/omap3-evm-common.dtsi | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'arch/arm') diff --git a/arch/arm/boot/dts/omap3-evm-common.dtsi b/arch/arm/boot/dts/omap3-evm-common.dtsi index c8747c7f1cc8..127f3e7c10c4 100644 --- a/arch/arm/boot/dts/omap3-evm-common.dtsi +++ b/arch/arm/boot/dts/omap3-evm-common.dtsi @@ -2,6 +2,7 @@ * Common support for omap3 EVM boards */ +#include #include "omap-gpmc-smsc911x.dtsi" / { @@ -111,6 +112,26 @@ ti,use-leds; }; +&twl_keypad { + linux,keymap = < + MATRIX_KEY(2, 2, KEY_1) + MATRIX_KEY(1, 1, KEY_2) + MATRIX_KEY(0, 0, KEY_3) + MATRIX_KEY(3, 2, KEY_4) + MATRIX_KEY(2, 1, KEY_5) + MATRIX_KEY(1, 0, KEY_6) + MATRIX_KEY(1, 3, KEY_7) + MATRIX_KEY(3, 1, KEY_8) + MATRIX_KEY(2, 0, KEY_9) + MATRIX_KEY(2, 3, KEY_KPASTERISK) + MATRIX_KEY(0, 2, KEY_0) + MATRIX_KEY(3, 0, KEY_KPDOT) + /* s4 not wired */ + MATRIX_KEY(1, 2, KEY_BACKSPACE) + MATRIX_KEY(0, 1, KEY_ENTER) + >; +}; + &usb_otg_hs { interface-type = <0>; usb-phy = <&usb2_phy>; -- cgit v1.2.3 From e7e42b9d2a7f4235cd0565ddc787c1f3548ac9fa Mon Sep 17 00:00:00 2001 From: Tony Lindgren Date: Wed, 5 Nov 2014 09:21:23 -0800 Subject: ARM: OMAP4+: Remove unused omap_l3_noc platform init Omap4 and later have been booting in device tree only mode for quite some time now. This initcall is no longer needed. Note that omap3 uses a different driver omap_l3_smx, and the initcall for that one is still needed until omap3 boots in device tree only mode. Signed-off-by: Tony Lindgren --- arch/arm/mach-omap2/devices.c | 34 ---------------------------------- 1 file changed, 34 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 55447972eeed..492ef1607115 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -67,40 +67,6 @@ static int __init omap3_l3_init(void) } omap_postcore_initcall(omap3_l3_init); -static int __init omap4_l3_init(void) -{ - int i; - struct omap_hwmod *oh[3]; - struct platform_device *pdev; - char oh_name[L3_MODULES_MAX_LEN]; - - /* If dtb is there, the devices will be created dynamically */ - if (of_have_populated_dt()) - return -ENODEV; - - /* - * To avoid code running on other OMAPs in - * multi-omap builds - */ - if (!cpu_is_omap44xx() && !soc_is_omap54xx()) - return -ENODEV; - - for (i = 0; i < L3_MODULES; i++) { - snprintf(oh_name, L3_MODULES_MAX_LEN, "l3_main_%d", i+1); - - oh[i] = omap_hwmod_lookup(oh_name); - if (!(oh[i])) - pr_err("could not look up %s\n", oh_name); - } - - pdev = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL, 0); - - WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); - - return PTR_RET(pdev); -} -omap_postcore_initcall(omap4_l3_init); - #if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE) static struct resource omap2cam_resources[] = { -- cgit v1.2.3 From d008d8e053e702ec2acc9175d45ed233160e2831 Mon Sep 17 00:00:00 2001 From: Masanari Iida Date: Tue, 7 Oct 2014 23:16:16 +0900 Subject: ARM: OMAP2: Remove unnecessary KERN_* in omap_phy_internal.c This patch remove unnecessary KERN_INFO and KERN_ERR from omap_phy_internal.c. Add pr_fmt. Signed-off-by: Masanari Iida Signed-off-by: Tony Lindgren --- arch/arm/mach-omap2/omap_phy_internal.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c index 50640b38f0bf..1a19fa096bab 100644 --- a/arch/arm/mach-omap2/omap_phy_internal.c +++ b/arch/arm/mach-omap2/omap_phy_internal.c @@ -21,6 +21,8 @@ * */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + #include #include #include @@ -97,13 +99,13 @@ void am35x_musb_phy_power(u8 on) omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2); - pr_info(KERN_INFO "Waiting for PHY clock good...\n"); + pr_info("Waiting for PHY clock good...\n"); while (!(omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2) & CONF2_PHYCLKGD)) { cpu_relax(); if (time_after(jiffies, timeout)) { - pr_err(KERN_ERR "musb PHY clock good timed out\n"); + pr_err("musb PHY clock good timed out\n"); break; } } @@ -145,7 +147,7 @@ void am35x_set_mode(u8 musb_mode) devconf2 |= CONF2_NO_OVERRIDE; break; default: - pr_info(KERN_INFO "Unsupported mode %u\n", musb_mode); + pr_info("Unsupported mode %u\n", musb_mode); } omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2); -- cgit v1.2.3 From d4c6c6cf8b42d3e516703c8dc48714fed31859b8 Mon Sep 17 00:00:00 2001 From: Pankaj Dubey Date: Fri, 7 Nov 2014 08:30:33 +0900 Subject: ARM: EXYNOS: fix typo in static struct name "exynos5_list_diable_wfi_wfe" This patch fixes a typo in struct named as "exynos5_list_diable_wfi_wfe" by making it "exynos5_list_disable_wfi_wfe" which is more meaningful. Signed-off-by: Pankaj Dubey Signed-off-by: Kukjin Kim --- arch/arm/mach-exynos/pmu.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-exynos/pmu.c b/arch/arm/mach-exynos/pmu.c index ff9d23f0a7d9..d8fa0337db73 100644 --- a/arch/arm/mach-exynos/pmu.c +++ b/arch/arm/mach-exynos/pmu.c @@ -329,7 +329,7 @@ static unsigned int const exynos5_list_both_cnt_feed[] = { EXYNOS5_TOP_PWR_SYSMEM_OPTION, }; -static unsigned int const exynos5_list_diable_wfi_wfe[] = { +static unsigned int const exynos5_list_disable_wfi_wfe[] = { EXYNOS5_ARM_CORE1_OPTION, EXYNOS5_FSYS_ARM_OPTION, EXYNOS5_ISP_ARM_OPTION, @@ -360,11 +360,11 @@ static void exynos5_init_pmu(void) /* * Disable WFI/WFE on XXX_OPTION */ - for (i = 0 ; i < ARRAY_SIZE(exynos5_list_diable_wfi_wfe) ; i++) { - tmp = pmu_raw_readl(exynos5_list_diable_wfi_wfe[i]); + for (i = 0 ; i < ARRAY_SIZE(exynos5_list_disable_wfi_wfe) ; i++) { + tmp = pmu_raw_readl(exynos5_list_disable_wfi_wfe[i]); tmp &= ~(EXYNOS5_OPTION_USE_STANDBYWFE | EXYNOS5_OPTION_USE_STANDBYWFI); - pmu_raw_writel(tmp, exynos5_list_diable_wfi_wfe[i]); + pmu_raw_writel(tmp, exynos5_list_disable_wfi_wfe[i]); } } -- cgit v1.2.3 From b771ca920c06a429da4effb046234fd4a0bb3917 Mon Sep 17 00:00:00 2001 From: Roger Quadros Date: Fri, 7 Nov 2014 14:26:59 +0200 Subject: ARM: OMAP2+: gpmc: Get rid of "ti,elm-id not found" warning OMAP3 and lower SoCs don't have the ELM module so this warning is annoying. Get rid of it. Reported-by: Tony Lindgren Signed-off-by: Roger Quadros Signed-off-by: Tony Lindgren --- arch/arm/mach-omap2/gpmc.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 5fa3755261ce..8fb5bbce102f 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c @@ -1394,8 +1394,6 @@ static int gpmc_probe_nand_child(struct platform_device *pdev, if (gpmc_nand_data->elm_of_node == NULL) gpmc_nand_data->elm_of_node = of_parse_phandle(child, "elm_id", 0); - if (gpmc_nand_data->elm_of_node == NULL) - pr_warn("%s: ti,elm-id property not found\n", __func__); /* select ecc-scheme for NAND */ if (of_property_read_string(child, "ti,nand-ecc-opt", &s)) { -- cgit v1.2.3 From 7aff221c5dbe4f88930a64531df2236f303e1851 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sat, 8 Nov 2014 10:42:46 +1100 Subject: ARM: OMAP: serial: remove last vestige of DTR_gpio support. These fields were added by: commit 9574f36fb801035f6ab0fbb1b53ce2c12c17d100 OMAP/serial: Add support for driving a GPIO as DTR. but not removed by commit 985bfd54c826c0ba873ca0adfd5589263e0c6ee2 tty: serial: omap: remove some dead code which reverted most of that commit. Time to revert the rest. Signed-off-by: NeilBrown Signed-off-by: Tony Lindgren --- arch/arm/mach-omap2/serial.c | 3 --- include/linux/platform_data/serial-omap.h | 3 --- 2 files changed, 6 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index a388f8c1bcb3..57dee0c7cd2b 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -263,9 +263,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata, omap_up.dma_rx_timeout = info->dma_rx_timeout; omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate; omap_up.autosuspend_timeout = info->autosuspend_timeout; - omap_up.DTR_gpio = info->DTR_gpio; - omap_up.DTR_inverted = info->DTR_inverted; - omap_up.DTR_present = info->DTR_present; pdata = &omap_up; pdata_size = sizeof(struct omap_uart_port_info); diff --git a/include/linux/platform_data/serial-omap.h b/include/linux/platform_data/serial-omap.h index c860c1b314c0..d09275f3cde3 100644 --- a/include/linux/platform_data/serial-omap.h +++ b/include/linux/platform_data/serial-omap.h @@ -38,9 +38,6 @@ struct omap_uart_port_info { unsigned int dma_rx_timeout; unsigned int autosuspend_timeout; unsigned int dma_rx_poll_rate; - int DTR_gpio; - int DTR_inverted; - int DTR_present; int (*get_context_loss_count)(struct device *); void (*enable_wakeup)(struct device *, bool); -- cgit v1.2.3 From e4a680099a6e97ecdbb81081cff9e4a489a4dc44 Mon Sep 17 00:00:00 2001 From: Dmitry Osipenko Date: Fri, 10 Oct 2014 17:24:47 +0400 Subject: ARM: tegra: Re-add removed SoC id macro to tegra_resume() Commit d127e9c ("ARM: tegra: make tegra_resume can work with current and later chips") removed tegra_get_soc_id macro leaving used cpu register corrupted after branching to v7_invalidate_l1() and as result causing execution of unintended code on tegra20. Possibly it was expected that r6 would be SoC id func argument since common cpu reset handler is setting r6 before branching to tegra_resume(), but neither tegra20_lp1_reset() nor tegra30_lp1_reset() aren't setting r6 register before jumping to resume function. Fix it by re-adding macro. Fixes: d127e9c (ARM: tegra: make tegra_resume can work with current and later chips) Cc: # v3.13+ Reviewed-by: Felipe Balbi Signed-off-by: Dmitry Osipenko Signed-off-by: Thierry Reding --- arch/arm/mach-tegra/reset-handler.S | 1 + 1 file changed, 1 insertion(+) (limited to 'arch/arm') diff --git a/arch/arm/mach-tegra/reset-handler.S b/arch/arm/mach-tegra/reset-handler.S index 7b2baab0f0bd..71be4af5e975 100644 --- a/arch/arm/mach-tegra/reset-handler.S +++ b/arch/arm/mach-tegra/reset-handler.S @@ -51,6 +51,7 @@ ENTRY(tegra_resume) THUMB( it ne ) bne cpu_resume @ no + tegra_get_soc_id TEGRA_APB_MISC_BASE, r6 /* Are we on Tegra20? */ cmp r6, #TEGRA20 beq 1f @ Yes -- cgit v1.2.3 From b2b54c9f76d2f5c2c14759b709b2af1ee397fbb2 Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Fri, 21 Nov 2014 10:23:42 -0700 Subject: arm: ep93xx: add dma_masks for the M2P and M2M DMA controllers The dma_mask and coherent_dma_mask need to be set or DMA memory allocations will fail with error messages like this: ep93xx-dma ep93xx-dma-m2p: coherent DMA mask is unset ep93xx-dma ep93xx-dma-m2m: coherent DMA mask is unset Add the missing information to the ep93xx-dma-m2p and ep93xx-dma-m2m devices. Signed-off-by: H Hartley Sweeten Reported-by: Jeremy Moles Tested-by: Alexander Sverdlin Cc: Ryan Mallon Signed-off-by: Arnd Bergmann --- arch/arm/mach-ep93xx/dma.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-ep93xx/dma.c b/arch/arm/mach-ep93xx/dma.c index d8bfd02f5047..88a4c9b089a5 100644 --- a/arch/arm/mach-ep93xx/dma.c +++ b/arch/arm/mach-ep93xx/dma.c @@ -66,11 +66,15 @@ static struct ep93xx_dma_platform_data ep93xx_dma_m2p_data = { .num_channels = ARRAY_SIZE(ep93xx_dma_m2p_channels), }; +static u64 ep93xx_dma_m2p_mask = DMA_BIT_MASK(32); + static struct platform_device ep93xx_dma_m2p_device = { .name = "ep93xx-dma-m2p", .id = -1, .dev = { - .platform_data = &ep93xx_dma_m2p_data, + .platform_data = &ep93xx_dma_m2p_data, + .dma_mask = &ep93xx_dma_m2p_mask, + .coherent_dma_mask = DMA_BIT_MASK(32), }, }; @@ -93,11 +97,15 @@ static struct ep93xx_dma_platform_data ep93xx_dma_m2m_data = { .num_channels = ARRAY_SIZE(ep93xx_dma_m2m_channels), }; +static u64 ep93xx_dma_m2m_mask = DMA_BIT_MASK(32); + static struct platform_device ep93xx_dma_m2m_device = { .name = "ep93xx-dma-m2m", .id = -1, .dev = { - .platform_data = &ep93xx_dma_m2m_data, + .platform_data = &ep93xx_dma_m2m_data, + .dma_mask = &ep93xx_dma_m2m_mask, + .coherent_dma_mask = DMA_BIT_MASK(32), }, }; -- cgit v1.2.3 From e2fd06f6be690a1a9697c0c6338843a35cbd70a3 Mon Sep 17 00:00:00 2001 From: Marc Zyngier Date: Tue, 2 Dec 2014 16:05:25 +0000 Subject: ARM: imx: irq: fix buggy usage of irq_data irq field mach-imx directly references to the irq field in struct irq_data, and uses this to directly poke hardware register. But irq is the *virtual* irq number, something that has nothing to do with the actual HW irq (stored in the hwirq field). And once we put the stacked domain code in action, the whole thing explodes, as these two values are *very* different. Just replacing all instances of irq with hwirq fixes the issue. Tested-by: Fabio Estevam Acked-by: Shawn Guo Signed-off-by: Marc Zyngier Signed-off-by: Olof Johansson --- arch/arm/mach-imx/gpc.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-imx/gpc.c b/arch/arm/mach-imx/gpc.c index 82ea74e68482..1455829c735e 100644 --- a/arch/arm/mach-imx/gpc.c +++ b/arch/arm/mach-imx/gpc.c @@ -56,14 +56,14 @@ void imx_gpc_post_resume(void) static int imx_gpc_irq_set_wake(struct irq_data *d, unsigned int on) { - unsigned int idx = d->irq / 32 - 1; + unsigned int idx = d->hwirq / 32 - 1; u32 mask; /* Sanity check for SPI irq */ - if (d->irq < 32) + if (d->hwirq < 32) return -EINVAL; - mask = 1 << d->irq % 32; + mask = 1 << d->hwirq % 32; gpc_wake_irqs[idx] = on ? gpc_wake_irqs[idx] | mask : gpc_wake_irqs[idx] & ~mask; @@ -97,12 +97,12 @@ void imx_gpc_irq_unmask(struct irq_data *d) u32 val; /* Sanity check for SPI irq */ - if (d->irq < 32) + if (d->hwirq < 32) return; - reg = gpc_base + GPC_IMR1 + (d->irq / 32 - 1) * 4; + reg = gpc_base + GPC_IMR1 + (d->hwirq / 32 - 1) * 4; val = readl_relaxed(reg); - val &= ~(1 << d->irq % 32); + val &= ~(1 << d->hwirq % 32); writel_relaxed(val, reg); } @@ -112,12 +112,12 @@ void imx_gpc_irq_mask(struct irq_data *d) u32 val; /* Sanity check for SPI irq */ - if (d->irq < 32) + if (d->hwirq < 32) return; - reg = gpc_base + GPC_IMR1 + (d->irq / 32 - 1) * 4; + reg = gpc_base + GPC_IMR1 + (d->hwirq / 32 - 1) * 4; val = readl_relaxed(reg); - val |= 1 << (d->irq % 32); + val |= 1 << (d->hwirq % 32); writel_relaxed(val, reg); } -- cgit v1.2.3 From 65bb688aab9424849e94f74d555542fa76cd3d5a Mon Sep 17 00:00:00 2001 From: Marc Zyngier Date: Tue, 2 Dec 2014 16:05:26 +0000 Subject: ARM: imx6: fix bogus use of irq_get_irq_data The imx6 PM code seems to be quite creative in its use of irq_data, using something that is very much a hardware interrupt number where we expect a virtual one. Yes, it worked so far, but that's only luck, and it will definitely explode in 3.19. Fix it by using a pair of helper functions that deal with the actual hardware. Tested-by: Fabio Estevam Acked-by: Philipp Zabel Acked-by: Shawn Guo Signed-off-by: Marc Zyngier Signed-off-by: Olof Johansson --- arch/arm/mach-imx/common.h | 4 ++-- arch/arm/mach-imx/gpc.c | 34 ++++++++++++++++++++++------------ arch/arm/mach-imx/pm-imx6.c | 5 ++--- 3 files changed, 26 insertions(+), 17 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index 1dabf435c592..66662a1e36de 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -108,8 +108,8 @@ void imx_gpc_pre_suspend(bool arm_power_off); void imx_gpc_post_resume(void); void imx_gpc_mask_all(void); void imx_gpc_restore_all(void); -void imx_gpc_irq_mask(struct irq_data *d); -void imx_gpc_irq_unmask(struct irq_data *d); +void imx_gpc_hwirq_mask(unsigned int hwirq); +void imx_gpc_hwirq_unmask(unsigned int hwirq); void imx_anatop_init(void); void imx_anatop_pre_suspend(void); void imx_anatop_post_resume(void); diff --git a/arch/arm/mach-imx/gpc.c b/arch/arm/mach-imx/gpc.c index 1455829c735e..5f3602ec74fa 100644 --- a/arch/arm/mach-imx/gpc.c +++ b/arch/arm/mach-imx/gpc.c @@ -91,34 +91,44 @@ void imx_gpc_restore_all(void) writel_relaxed(gpc_saved_imrs[i], reg_imr1 + i * 4); } -void imx_gpc_irq_unmask(struct irq_data *d) +void imx_gpc_hwirq_unmask(unsigned int hwirq) { void __iomem *reg; u32 val; - /* Sanity check for SPI irq */ - if (d->hwirq < 32) - return; - - reg = gpc_base + GPC_IMR1 + (d->hwirq / 32 - 1) * 4; + reg = gpc_base + GPC_IMR1 + (hwirq / 32 - 1) * 4; val = readl_relaxed(reg); - val &= ~(1 << d->hwirq % 32); + val &= ~(1 << hwirq % 32); writel_relaxed(val, reg); } -void imx_gpc_irq_mask(struct irq_data *d) +void imx_gpc_hwirq_mask(unsigned int hwirq) { void __iomem *reg; u32 val; + reg = gpc_base + GPC_IMR1 + (hwirq / 32 - 1) * 4; + val = readl_relaxed(reg); + val |= 1 << (hwirq % 32); + writel_relaxed(val, reg); +} + +static void imx_gpc_irq_unmask(struct irq_data *d) +{ + /* Sanity check for SPI irq */ + if (d->hwirq < 32) + return; + + imx_gpc_hwirq_unmask(d->hwirq); +} + +static void imx_gpc_irq_mask(struct irq_data *d) +{ /* Sanity check for SPI irq */ if (d->hwirq < 32) return; - reg = gpc_base + GPC_IMR1 + (d->hwirq / 32 - 1) * 4; - val = readl_relaxed(reg); - val |= 1 << (d->hwirq % 32); - writel_relaxed(val, reg); + imx_gpc_hwirq_mask(d->hwirq); } void __init imx_gpc_init(void) diff --git a/arch/arm/mach-imx/pm-imx6.c b/arch/arm/mach-imx/pm-imx6.c index 5c3af8f993d0..d815d1ba27a5 100644 --- a/arch/arm/mach-imx/pm-imx6.c +++ b/arch/arm/mach-imx/pm-imx6.c @@ -261,7 +261,6 @@ static void imx6q_enable_wb(bool enable) int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode) { - struct irq_data *iomuxc_irq_data = irq_get_irq_data(32); u32 val = readl_relaxed(ccm_base + CLPCR); val &= ~BM_CLPCR_LPM; @@ -316,9 +315,9 @@ int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode) * 3) Software should mask IRQ #32 right after CCM Low-Power mode * is set (set bits 0-1 of CCM_CLPCR). */ - imx_gpc_irq_unmask(iomuxc_irq_data); + imx_gpc_hwirq_unmask(32); writel_relaxed(val, ccm_base + CLPCR); - imx_gpc_irq_mask(iomuxc_irq_data); + imx_gpc_hwirq_mask(32); return 0; } -- cgit v1.2.3