Merge branches 'features/assorted', 'features/imx-pata' and 'features/imx-multi-irq-v2' into imx-features
Conflicts: arch/arm/plat-mxc/avic.c arch/arm/plat-mxc/include/mach/common.h Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
commit
ca4e419c20
|
@ -397,6 +397,7 @@ config ARCH_MXC
|
|||
select CLKSRC_MMIO
|
||||
select GENERIC_IRQ_CHIP
|
||||
select HAVE_SCHED_CLOCK
|
||||
select MULTI_IRQ_HANDLER
|
||||
help
|
||||
Support for Freescale MXC/iMX-based family of processors
|
||||
|
||||
|
|
|
@ -470,6 +470,7 @@ config MACH_QONG
|
|||
bool "Support Dave/DENX QongEVB-LITE platform"
|
||||
select SOC_IMX31
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_IMX2_WDT
|
||||
help
|
||||
Include support for Dave/DENX QongEVB-LITE platform. This includes
|
||||
specific configurations for the board and its peripherals.
|
||||
|
|
|
@ -136,6 +136,7 @@ MACHINE_START(APF9328, "Armadeus APF9328")
|
|||
.map_io = mx1_map_io,
|
||||
.init_early = imx1_init_early,
|
||||
.init_irq = mx1_init_irq,
|
||||
.handle_irq = imx1_handle_irq,
|
||||
.timer = &apf9328_timer,
|
||||
.init_machine = apf9328_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -562,6 +562,7 @@ MACHINE_START(ARMADILLO5X0, "Armadillo-500")
|
|||
.map_io = mx31_map_io,
|
||||
.init_early = imx31_init_early,
|
||||
.init_irq = mx31_init_irq,
|
||||
.handle_irq = imx31_handle_irq,
|
||||
.timer = &armadillo5x0_timer,
|
||||
.init_machine = armadillo5x0_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -62,6 +62,7 @@ MACHINE_START(BUG, "BugLabs BUGBase")
|
|||
.map_io = mx31_map_io,
|
||||
.init_early = imx31_init_early,
|
||||
.init_irq = mx31_init_irq,
|
||||
.handle_irq = imx31_handle_irq,
|
||||
.timer = &bug_timer,
|
||||
.init_machine = bug_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -315,6 +315,7 @@ MACHINE_START(CPUIMX27, "EUKREA CPUIMX27")
|
|||
.map_io = mx27_map_io,
|
||||
.init_early = imx27_init_early,
|
||||
.init_irq = mx27_init_irq,
|
||||
.handle_irq = imx27_handle_irq,
|
||||
.timer = &eukrea_cpuimx27_timer,
|
||||
.init_machine = eukrea_cpuimx27_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -198,6 +198,7 @@ MACHINE_START(EUKREA_CPUIMX35, "Eukrea CPUIMX35")
|
|||
.map_io = mx35_map_io,
|
||||
.init_early = imx35_init_early,
|
||||
.init_irq = mx35_init_irq,
|
||||
.handle_irq = imx35_handle_irq,
|
||||
.timer = &eukrea_cpuimx35_timer,
|
||||
.init_machine = eukrea_cpuimx35_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -167,6 +167,7 @@ MACHINE_START(EUKREA_CPUIMX25, "Eukrea CPUIMX25")
|
|||
.map_io = mx25_map_io,
|
||||
.init_early = imx25_init_early,
|
||||
.init_irq = mx25_init_irq,
|
||||
.handle_irq = imx25_handle_irq,
|
||||
.timer = &eukrea_cpuimx25_timer,
|
||||
.init_machine = eukrea_cpuimx25_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -279,6 +279,7 @@ MACHINE_START(IMX27_VISSTRIM_M10, "Vista Silicon Visstrim_M10")
|
|||
.map_io = mx27_map_io,
|
||||
.init_early = imx27_init_early,
|
||||
.init_irq = mx27_init_irq,
|
||||
.handle_irq = imx27_handle_irq,
|
||||
.timer = &visstrim_m10_timer,
|
||||
.init_machine = visstrim_m10_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -75,6 +75,7 @@ MACHINE_START(IMX27IPCAM, "Freescale IMX27IPCAM")
|
|||
.map_io = mx27_map_io,
|
||||
.init_early = imx27_init_early,
|
||||
.init_irq = mx27_init_irq,
|
||||
.handle_irq = imx27_handle_irq,
|
||||
.timer = &mx27ipcam_timer,
|
||||
.init_machine = mx27ipcam_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -81,6 +81,7 @@ MACHINE_START(IMX27LITE, "LogicPD i.MX27LITE")
|
|||
.map_io = mx27_map_io,
|
||||
.init_early = imx27_init_early,
|
||||
.init_irq = mx27_init_irq,
|
||||
.handle_irq = imx27_handle_irq,
|
||||
.timer = &mx27lite_timer,
|
||||
.init_machine = mx27lite_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -275,6 +275,7 @@ MACHINE_START(KZM_ARM11_01, "Kyoto Microcomputer Co., Ltd. KZM-ARM11-01")
|
|||
.map_io = kzm_map_io,
|
||||
.init_early = imx31_init_early,
|
||||
.init_irq = mx31_init_irq,
|
||||
.handle_irq = imx31_handle_irq,
|
||||
.timer = &kzm_timer,
|
||||
.init_machine = kzm_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -149,6 +149,7 @@ MACHINE_START(MX1ADS, "Freescale MX1ADS")
|
|||
.map_io = mx1_map_io,
|
||||
.init_early = imx1_init_early,
|
||||
.init_irq = mx1_init_irq,
|
||||
.handle_irq = imx1_handle_irq,
|
||||
.timer = &mx1ads_timer,
|
||||
.init_machine = mx1ads_init,
|
||||
MACHINE_END
|
||||
|
@ -158,6 +159,7 @@ MACHINE_START(MXLADS, "Freescale MXLADS")
|
|||
.map_io = mx1_map_io,
|
||||
.init_early = imx1_init_early,
|
||||
.init_irq = mx1_init_irq,
|
||||
.handle_irq = imx1_handle_irq,
|
||||
.timer = &mx1ads_timer,
|
||||
.init_machine = mx1ads_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -309,6 +309,7 @@ MACHINE_START(MX21ADS, "Freescale i.MX21ADS")
|
|||
.map_io = mx21ads_map_io,
|
||||
.init_early = imx21_init_early,
|
||||
.init_irq = mx21_init_irq,
|
||||
.handle_irq = imx21_handle_irq,
|
||||
.timer = &mx21ads_timer,
|
||||
.init_machine = mx21ads_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -267,6 +267,7 @@ MACHINE_START(MX25_3DS, "Freescale MX25PDK (3DS)")
|
|||
.map_io = mx25_map_io,
|
||||
.init_early = imx25_init_early,
|
||||
.init_irq = mx25_init_irq,
|
||||
.handle_irq = imx25_handle_irq,
|
||||
.timer = &mx25pdk_timer,
|
||||
.init_machine = mx25pdk_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -425,6 +425,7 @@ MACHINE_START(MX27_3DS, "Freescale MX27PDK")
|
|||
.map_io = mx27_map_io,
|
||||
.init_early = imx27_init_early,
|
||||
.init_irq = mx27_init_irq,
|
||||
.handle_irq = imx27_handle_irq,
|
||||
.timer = &mx27pdk_timer,
|
||||
.init_machine = mx27pdk_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -349,6 +349,7 @@ MACHINE_START(MX27ADS, "Freescale i.MX27ADS")
|
|||
.map_io = mx27ads_map_io,
|
||||
.init_early = imx27_init_early,
|
||||
.init_irq = mx27_init_irq,
|
||||
.handle_irq = imx27_handle_irq,
|
||||
.timer = &mx27ads_timer,
|
||||
.init_machine = mx27ads_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -768,6 +768,7 @@ MACHINE_START(MX31_3DS, "Freescale MX31PDK (3DS)")
|
|||
.map_io = mx31_map_io,
|
||||
.init_early = imx31_init_early,
|
||||
.init_irq = mx31_init_irq,
|
||||
.handle_irq = imx31_handle_irq,
|
||||
.timer = &mx31_3ds_timer,
|
||||
.init_machine = mx31_3ds_init,
|
||||
.reserve = mx31_3ds_reserve,
|
||||
|
|
|
@ -539,6 +539,7 @@ MACHINE_START(MX31ADS, "Freescale MX31ADS")
|
|||
.map_io = mx31ads_map_io,
|
||||
.init_early = imx31_init_early,
|
||||
.init_irq = mx31ads_init_irq,
|
||||
.handle_irq = imx31_handle_irq,
|
||||
.timer = &mx31ads_timer,
|
||||
.init_machine = mx31ads_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -299,6 +299,7 @@ MACHINE_START(LILLY1131, "INCO startec LILLY-1131")
|
|||
.map_io = mx31_map_io,
|
||||
.init_early = imx31_init_early,
|
||||
.init_irq = mx31_init_irq,
|
||||
.handle_irq = imx31_handle_irq,
|
||||
.timer = &mx31lilly_timer,
|
||||
.init_machine = mx31lilly_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -284,6 +284,7 @@ MACHINE_START(MX31LITE, "LogicPD i.MX31 SOM")
|
|||
.map_io = mx31lite_map_io,
|
||||
.init_early = imx31_init_early,
|
||||
.init_irq = mx31_init_irq,
|
||||
.handle_irq = imx31_handle_irq,
|
||||
.timer = &mx31lite_timer,
|
||||
.init_machine = mx31lite_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -28,6 +28,9 @@
|
|||
#include <linux/spi/spi.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <linux/usb/otg.h>
|
||||
#include <linux/usb/ulpi.h>
|
||||
|
@ -490,6 +493,18 @@ err:
|
|||
|
||||
}
|
||||
|
||||
static void mx31moboard_poweroff(void)
|
||||
{
|
||||
struct clk *clk = clk_get_sys("imx2-wdt.0", NULL);
|
||||
|
||||
if (!IS_ERR(clk))
|
||||
clk_enable(clk);
|
||||
|
||||
mxc_iomux_mode(MX31_PIN_WATCHDOG_RST__WATCHDOG_RST);
|
||||
|
||||
__raw_writew(1 << 6 | 1 << 2, MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR));
|
||||
}
|
||||
|
||||
static int mx31moboard_baseboard;
|
||||
core_param(mx31moboard_baseboard, mx31moboard_baseboard, int, 0444);
|
||||
|
||||
|
@ -528,6 +543,8 @@ static void __init mx31moboard_init(void)
|
|||
|
||||
moboard_usbh2_init();
|
||||
|
||||
pm_power_off = mx31moboard_poweroff;
|
||||
|
||||
switch (mx31moboard_baseboard) {
|
||||
case MX31NOBOARD:
|
||||
break;
|
||||
|
@ -572,6 +589,7 @@ MACHINE_START(MX31MOBOARD, "EPFL Mobots mx31moboard")
|
|||
.map_io = mx31_map_io,
|
||||
.init_early = imx31_init_early,
|
||||
.init_irq = mx31_init_irq,
|
||||
.handle_irq = imx31_handle_irq,
|
||||
.timer = &mx31moboard_timer,
|
||||
.init_machine = mx31moboard_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -221,6 +221,7 @@ MACHINE_START(MX35_3DS, "Freescale MX35PDK")
|
|||
.map_io = mx35_map_io,
|
||||
.init_early = imx35_init_early,
|
||||
.init_irq = mx35_init_irq,
|
||||
.handle_irq = imx35_handle_irq,
|
||||
.timer = &mx35pdk_timer,
|
||||
.init_machine = mx35_3ds_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -271,6 +271,7 @@ MACHINE_START(MXT_TD60, "Maxtrack i-MXT TD60")
|
|||
.map_io = mx27_map_io,
|
||||
.init_early = imx27_init_early,
|
||||
.init_irq = mx27_init_irq,
|
||||
.handle_irq = imx27_handle_irq,
|
||||
.timer = &mxt_td60_timer,
|
||||
.init_machine = mxt_td60_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -439,6 +439,7 @@ MACHINE_START(PCA100, "phyCARD-i.MX27")
|
|||
.map_io = mx27_map_io,
|
||||
.init_early = imx27_init_early,
|
||||
.init_irq = mx27_init_irq,
|
||||
.handle_irq = imx27_handle_irq,
|
||||
.init_machine = pca100_init,
|
||||
.timer = &pca100_timer,
|
||||
MACHINE_END
|
||||
|
|
|
@ -693,6 +693,7 @@ MACHINE_START(PCM037, "Phytec Phycore pcm037")
|
|||
.map_io = mx31_map_io,
|
||||
.init_early = imx31_init_early,
|
||||
.init_irq = mx31_init_irq,
|
||||
.handle_irq = imx31_handle_irq,
|
||||
.timer = &pcm037_timer,
|
||||
.init_machine = pcm037_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -353,6 +353,7 @@ MACHINE_START(PCM038, "phyCORE-i.MX27")
|
|||
.map_io = mx27_map_io,
|
||||
.init_early = imx27_init_early,
|
||||
.init_irq = mx27_init_irq,
|
||||
.handle_irq = imx27_handle_irq,
|
||||
.timer = &pcm038_timer,
|
||||
.init_machine = pcm038_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -422,6 +422,7 @@ MACHINE_START(PCM043, "Phytec Phycore pcm043")
|
|||
.map_io = mx35_map_io,
|
||||
.init_early = imx35_init_early,
|
||||
.init_irq = mx35_init_irq,
|
||||
.handle_irq = imx35_handle_irq,
|
||||
.timer = &pcm043_timer,
|
||||
.init_machine = pcm043_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -249,6 +249,7 @@ static void __init qong_init(void)
|
|||
mxc_init_imx_uart();
|
||||
qong_init_nor_mtd();
|
||||
qong_init_fpga();
|
||||
imx31_add_imx2_wdt(NULL);
|
||||
}
|
||||
|
||||
static void __init qong_timer_init(void)
|
||||
|
@ -266,6 +267,7 @@ MACHINE_START(QONG, "Dave/DENX QongEVB-LITE")
|
|||
.map_io = mx31_map_io,
|
||||
.init_early = imx31_init_early,
|
||||
.init_irq = mx31_init_irq,
|
||||
.handle_irq = imx31_handle_irq,
|
||||
.timer = &qong_timer,
|
||||
.init_machine = qong_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -141,6 +141,7 @@ MACHINE_START(SCB9328, "Synertronixx scb9328")
|
|||
.map_io = mx1_map_io,
|
||||
.init_early = imx1_init_early,
|
||||
.init_irq = mx1_init_irq,
|
||||
.handle_irq = imx1_handle_irq,
|
||||
.timer = &scb9328_timer,
|
||||
.init_machine = scb9328_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -319,6 +319,7 @@ MACHINE_START(VPR200, "VPR200")
|
|||
.map_io = mx35_map_io,
|
||||
.init_early = imx35_init_early,
|
||||
.init_irq = mx35_init_irq,
|
||||
.handle_irq = imx35_handle_irq,
|
||||
.timer = &vpr200_timer,
|
||||
.init_machine = vpr200_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -297,6 +297,7 @@ MACHINE_START(EUKREA_CPUIMX51, "Eukrea CPUIMX51 Module")
|
|||
.map_io = mx51_map_io,
|
||||
.init_early = imx51_init_early,
|
||||
.init_irq = mx51_init_irq,
|
||||
.handle_irq = imx51_handle_irq,
|
||||
.timer = &mxc_timer,
|
||||
.init_machine = eukrea_cpuimx51_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -335,6 +335,7 @@ MACHINE_START(EUKREA_CPUIMX51SD, "Eukrea CPUIMX51SD")
|
|||
.map_io = mx51_map_io,
|
||||
.init_early = imx51_init_early,
|
||||
.init_irq = mx51_init_irq,
|
||||
.handle_irq = imx51_handle_irq,
|
||||
.timer = &mxc_timer,
|
||||
.init_machine = eukrea_cpuimx51sd_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -219,6 +219,7 @@ MACHINE_START(MX50_RDP, "Freescale MX50 Reference Design Platform")
|
|||
.map_io = mx50_map_io,
|
||||
.init_early = imx50_init_early,
|
||||
.init_irq = mx50_init_irq,
|
||||
.handle_irq = imx50_handle_irq,
|
||||
.timer = &mx50_rdp_timer,
|
||||
.init_machine = mx50_rdp_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -173,6 +173,7 @@ MACHINE_START(MX51_3DS, "Freescale MX51 3-Stack Board")
|
|||
.map_io = mx51_map_io,
|
||||
.init_early = imx51_init_early,
|
||||
.init_irq = mx51_init_irq,
|
||||
.handle_irq = imx51_handle_irq,
|
||||
.timer = &mx51_3ds_timer,
|
||||
.init_machine = mx51_3ds_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -420,6 +420,7 @@ MACHINE_START(MX51_BABBAGE, "Freescale MX51 Babbage Board")
|
|||
.map_io = mx51_map_io,
|
||||
.init_early = imx51_init_early,
|
||||
.init_irq = mx51_init_irq,
|
||||
.handle_irq = imx51_handle_irq,
|
||||
.timer = &mx51_babbage_timer,
|
||||
.init_machine = mx51_babbage_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -163,6 +163,11 @@ static const struct gpio_led_platform_data
|
|||
.num_leds = ARRAY_SIZE(mx51_efikamx_leds),
|
||||
};
|
||||
|
||||
static struct esdhc_platform_data sd_pdata = {
|
||||
.cd_type = ESDHC_CD_CONTROLLER,
|
||||
.wp_type = ESDHC_WP_CONTROLLER,
|
||||
};
|
||||
|
||||
static struct gpio_keys_button mx51_efikamx_powerkey[] = {
|
||||
{
|
||||
.code = KEY_POWER,
|
||||
|
@ -239,9 +244,11 @@ static void __init mx51_efikamx_init(void)
|
|||
|
||||
/* on < 1.2 boards both SD controllers are used */
|
||||
if (system_rev < 0x12) {
|
||||
imx51_add_sdhci_esdhc_imx(1, NULL);
|
||||
imx51_add_sdhci_esdhc_imx(0, NULL);
|
||||
imx51_add_sdhci_esdhc_imx(1, &sd_pdata);
|
||||
mx51_efikamx_leds[2].default_trigger = "mmc1";
|
||||
}
|
||||
} else
|
||||
imx51_add_sdhci_esdhc_imx(0, &sd_pdata);
|
||||
|
||||
gpio_led_register_device(-1, &mx51_efikamx_leds_data);
|
||||
imx_add_gpio_keys(&mx51_efikamx_powerkey_data);
|
||||
|
@ -284,6 +291,7 @@ MACHINE_START(MX51_EFIKAMX, "Genesi EfikaMX nettop")
|
|||
.map_io = mx51_map_io,
|
||||
.init_early = imx51_init_early,
|
||||
.init_irq = mx51_init_irq,
|
||||
.handle_irq = imx51_handle_irq,
|
||||
.timer = &mx51_efikamx_timer,
|
||||
.init_machine = mx51_efikamx_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
#define EFIKASB_RFKILL IMX_GPIO_NR(3, 1)
|
||||
|
||||
#define MX51_PAD_PWRKEY IOMUX_PAD(0x48c, 0x0f8, 1, 0x0, 0, PAD_CTL_PUS_100K_UP | PAD_CTL_PKE)
|
||||
#define MX51_PAD_SD1_CD IOMUX_PAD(0x47c, 0x0e8, 1, __NA_, 0, MX51_ESDHC_PAD_CTRL)
|
||||
|
||||
static iomux_v3_cfg_t mx51efikasb_pads[] = {
|
||||
/* USB HOST2 */
|
||||
|
@ -97,6 +98,8 @@ static iomux_v3_cfg_t mx51efikasb_pads[] = {
|
|||
|
||||
/* BT */
|
||||
MX51_PAD_EIM_A17__GPIO2_11,
|
||||
|
||||
MX51_PAD_SD1_CD,
|
||||
};
|
||||
|
||||
static int initialize_usbh2_port(struct platform_device *pdev)
|
||||
|
@ -182,6 +185,18 @@ static const struct gpio_keys_platform_data mx51_efikasb_keys_data __initconst =
|
|||
.nbuttons = ARRAY_SIZE(mx51_efikasb_keys),
|
||||
};
|
||||
|
||||
static struct esdhc_platform_data sd0_pdata = {
|
||||
#define EFIKASB_SD1_CD IMX_GPIO_NR(2, 27)
|
||||
.cd_gpio = EFIKASB_SD1_CD,
|
||||
.cd_type = ESDHC_CD_GPIO,
|
||||
.wp_type = ESDHC_WP_CONTROLLER,
|
||||
};
|
||||
|
||||
static struct esdhc_platform_data sd1_pdata = {
|
||||
.cd_type = ESDHC_CD_CONTROLLER,
|
||||
.wp_type = ESDHC_WP_CONTROLLER,
|
||||
};
|
||||
|
||||
static struct regulator *pwgt1, *pwgt2;
|
||||
|
||||
static void mx51_efikasb_power_off(void)
|
||||
|
@ -250,7 +265,8 @@ static void __init efikasb_board_init(void)
|
|||
|
||||
mx51_efikasb_board_id();
|
||||
mx51_efikasb_usb();
|
||||
imx51_add_sdhci_esdhc_imx(1, NULL);
|
||||
imx51_add_sdhci_esdhc_imx(0, &sd0_pdata);
|
||||
imx51_add_sdhci_esdhc_imx(1, &sd1_pdata);
|
||||
|
||||
gpio_led_register_device(-1, &mx51_efikasb_leds_data);
|
||||
imx_add_gpio_keys(&mx51_efikasb_keys_data);
|
||||
|
@ -270,6 +286,7 @@ MACHINE_START(MX51_EFIKASB, "Genesi Efika Smartbook")
|
|||
.map_io = mx51_map_io,
|
||||
.init_early = imx51_init_early,
|
||||
.init_irq = mx51_init_irq,
|
||||
.handle_irq = imx51_handle_irq,
|
||||
.init_machine = efikasb_board_init,
|
||||
.timer = &mx51_efikasb_timer,
|
||||
MACHINE_END
|
||||
|
|
|
@ -249,6 +249,7 @@ MACHINE_START(MX53_ARD, "Freescale MX53 ARD Board")
|
|||
.map_io = mx53_map_io,
|
||||
.init_early = imx53_init_early,
|
||||
.init_irq = mx53_init_irq,
|
||||
.handle_irq = imx53_handle_irq,
|
||||
.timer = &mx53_ard_timer,
|
||||
.init_machine = mx53_ard_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -167,6 +167,7 @@ MACHINE_START(MX53_EVK, "Freescale MX53 EVK Board")
|
|||
.map_io = mx53_map_io,
|
||||
.init_early = imx53_init_early,
|
||||
.init_irq = mx53_init_irq,
|
||||
.handle_irq = imx53_handle_irq,
|
||||
.timer = &mx53_evk_timer,
|
||||
.init_machine = mx53_evk_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -308,6 +308,7 @@ MACHINE_START(MX53_LOCO, "Freescale MX53 LOCO Board")
|
|||
.map_io = mx53_map_io,
|
||||
.init_early = imx53_init_early,
|
||||
.init_irq = mx53_init_irq,
|
||||
.handle_irq = imx53_handle_irq,
|
||||
.timer = &mx53_loco_timer,
|
||||
.init_machine = mx53_loco_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -140,6 +140,7 @@ MACHINE_START(MX53_SMD, "Freescale MX53 SMD Board")
|
|||
.map_io = mx53_map_io,
|
||||
.init_early = imx53_init_early,
|
||||
.init_irq = mx53_init_irq,
|
||||
.handle_irq = imx53_handle_irq,
|
||||
.timer = &mx53_smd_timer,
|
||||
.init_machine = mx53_smd_board_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -609,7 +609,6 @@ void __init efika_board_common_init(void)
|
|||
ARRAY_SIZE(mx51efika_pads));
|
||||
imx51_add_imx_uart(0, &uart_pdata);
|
||||
mx51_efika_usb();
|
||||
imx51_add_sdhci_esdhc_imx(0, NULL);
|
||||
|
||||
/* FIXME: comes from original code. check this. */
|
||||
if (mx51_revision() < IMX_CHIP_REVISION_2_0)
|
||||
|
|
|
@ -50,6 +50,8 @@
|
|||
|
||||
void __iomem *avic_base;
|
||||
|
||||
static u32 avic_saved_mask_reg[2];
|
||||
|
||||
#ifdef CONFIG_MXC_IRQ_PRIOR
|
||||
static int avic_irq_set_priority(unsigned char irq, unsigned char prio)
|
||||
{
|
||||
|
@ -90,24 +92,8 @@ static int avic_set_irq_fiq(unsigned int irq, unsigned int type)
|
|||
}
|
||||
#endif /* CONFIG_FIQ */
|
||||
|
||||
/* Disable interrupt number "irq" in the AVIC */
|
||||
static void mxc_mask_irq(struct irq_data *d)
|
||||
{
|
||||
__raw_writel(d->irq, avic_base + AVIC_INTDISNUM);
|
||||
}
|
||||
|
||||
/* Enable interrupt number "irq" in the AVIC */
|
||||
static void mxc_unmask_irq(struct irq_data *d)
|
||||
{
|
||||
__raw_writel(d->irq, avic_base + AVIC_INTENNUM);
|
||||
}
|
||||
|
||||
static struct mxc_irq_chip mxc_avic_chip = {
|
||||
.base = {
|
||||
.irq_ack = mxc_mask_irq,
|
||||
.irq_mask = mxc_mask_irq,
|
||||
.irq_unmask = mxc_unmask_irq,
|
||||
},
|
||||
static struct mxc_extra_irq avic_extra_irq = {
|
||||
#ifdef CONFIG_MXC_IRQ_PRIOR
|
||||
.set_priority = avic_irq_set_priority,
|
||||
#endif
|
||||
|
@ -116,6 +102,68 @@ static struct mxc_irq_chip mxc_avic_chip = {
|
|||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static void avic_irq_suspend(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
struct irq_chip_type *ct = gc->chip_types;
|
||||
int idx = gc->irq_base >> 5;
|
||||
|
||||
avic_saved_mask_reg[idx] = __raw_readl(avic_base + ct->regs.mask);
|
||||
__raw_writel(gc->wake_active, avic_base + ct->regs.mask);
|
||||
}
|
||||
|
||||
static void avic_irq_resume(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
struct irq_chip_type *ct = gc->chip_types;
|
||||
int idx = gc->irq_base >> 5;
|
||||
|
||||
__raw_writel(avic_saved_mask_reg[idx], avic_base + ct->regs.mask);
|
||||
}
|
||||
|
||||
#else
|
||||
#define avic_irq_suspend NULL
|
||||
#define avic_irq_resume NULL
|
||||
#endif
|
||||
|
||||
static __init void avic_init_gc(unsigned int irq_start)
|
||||
{
|
||||
struct irq_chip_generic *gc;
|
||||
struct irq_chip_type *ct;
|
||||
int idx = irq_start >> 5;
|
||||
|
||||
gc = irq_alloc_generic_chip("mxc-avic", 1, irq_start, avic_base,
|
||||
handle_level_irq);
|
||||
gc->private = &avic_extra_irq;
|
||||
gc->wake_enabled = IRQ_MSK(32);
|
||||
|
||||
ct = gc->chip_types;
|
||||
ct->chip.irq_mask = irq_gc_mask_clr_bit;
|
||||
ct->chip.irq_unmask = irq_gc_mask_set_bit;
|
||||
ct->chip.irq_ack = irq_gc_mask_clr_bit;
|
||||
ct->chip.irq_set_wake = irq_gc_set_wake;
|
||||
ct->chip.irq_suspend = avic_irq_suspend;
|
||||
ct->chip.irq_resume = avic_irq_resume;
|
||||
ct->regs.mask = !idx ? AVIC_INTENABLEL : AVIC_INTENABLEH;
|
||||
ct->regs.ack = ct->regs.mask;
|
||||
|
||||
irq_setup_generic_chip(gc, IRQ_MSK(32), 0, IRQ_NOREQUEST, 0);
|
||||
}
|
||||
|
||||
asmlinkage void __exception_irq_entry avic_handle_irq(struct pt_regs *regs)
|
||||
{
|
||||
u32 nivector;
|
||||
|
||||
do {
|
||||
nivector = __raw_readl(avic_base + AVIC_NIVECSR) >> 16;
|
||||
if (nivector == 0xffff)
|
||||
break;
|
||||
|
||||
handle_IRQ(nivector, regs);
|
||||
} while (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function initializes the AVIC hardware and disables all the
|
||||
* interrupts. It registers the interrupt enable and disable functions
|
||||
|
@ -140,11 +188,9 @@ void __init mxc_init_irq(void __iomem *irqbase)
|
|||
/* all IRQ no FIQ */
|
||||
__raw_writel(0, avic_base + AVIC_INTTYPEH);
|
||||
__raw_writel(0, avic_base + AVIC_INTTYPEL);
|
||||
for (i = 0; i < AVIC_NUM_IRQS; i++) {
|
||||
irq_set_chip_and_handler(i, &mxc_avic_chip.base,
|
||||
handle_level_irq);
|
||||
set_irq_flags(i, IRQF_VALID);
|
||||
}
|
||||
|
||||
for (i = 0; i < AVIC_NUM_IRQS; i += 32)
|
||||
avic_init_gc(i);
|
||||
|
||||
/* Set default priority value (0) for all IRQ's */
|
||||
for (i = 0; i < 8; i++)
|
||||
|
@ -157,4 +203,3 @@ void __init mxc_init_irq(void __iomem *irqbase)
|
|||
|
||||
printk(KERN_INFO "MXC IRQ initialized\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ struct platform_device *__init imx_add_pata_imx(
|
|||
struct resource res[] = {
|
||||
{
|
||||
.start = data->iobase,
|
||||
.end = data->iobase + data->iobase - 1,
|
||||
.end = data->iobase + data->iosize - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
|
|
|
@ -73,4 +73,18 @@ extern void mx51_efikamx_reset(void);
|
|||
extern int mx53_revision(void);
|
||||
extern int mx53_display_revision(void);
|
||||
extern void imx_print_silicon_rev(const char *cpu, int srev);
|
||||
|
||||
void avic_handle_irq(struct pt_regs *);
|
||||
void tzic_handle_irq(struct pt_regs *);
|
||||
|
||||
#define imx1_handle_irq avic_handle_irq
|
||||
#define imx21_handle_irq avic_handle_irq
|
||||
#define imx25_handle_irq avic_handle_irq
|
||||
#define imx27_handle_irq avic_handle_irq
|
||||
#define imx31_handle_irq avic_handle_irq
|
||||
#define imx35_handle_irq avic_handle_irq
|
||||
#define imx50_handle_irq tzic_handle_irq
|
||||
#define imx51_handle_irq tzic_handle_irq
|
||||
#define imx53_handle_irq tzic_handle_irq
|
||||
|
||||
#endif
|
||||
|
|
|
@ -9,72 +9,16 @@
|
|||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <mach/hardware.h>
|
||||
/* Unused, we use CONFIG_MULTI_IRQ_HANDLER */
|
||||
|
||||
#define AVIC_NIMASK 0x04
|
||||
|
||||
@ this macro disables fast irq (not implemented)
|
||||
.macro disable_fiq
|
||||
.endm
|
||||
|
||||
.macro get_irqnr_preamble, base, tmp
|
||||
#ifndef CONFIG_MXC_TZIC
|
||||
ldr \base, =avic_base
|
||||
ldr \base, [\base]
|
||||
#ifdef CONFIG_MXC_IRQ_PRIOR
|
||||
ldr r4, [\base, #AVIC_NIMASK]
|
||||
#endif
|
||||
#elif defined CONFIG_MXC_TZIC
|
||||
ldr \base, =tzic_base
|
||||
ldr \base, [\base]
|
||||
#endif /* CONFIG_MXC_TZIC */
|
||||
.endm
|
||||
|
||||
.macro arch_ret_to_user, tmp1, tmp2
|
||||
.endm
|
||||
|
||||
@ this macro checks which interrupt occurred
|
||||
@ and returns its number in irqnr
|
||||
@ and returns if an interrupt occurred in irqstat
|
||||
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
|
||||
#ifndef CONFIG_MXC_TZIC
|
||||
@ Load offset & priority of the highest priority
|
||||
@ interrupt pending from AVIC_NIVECSR
|
||||
ldr \irqstat, [\base, #0x40]
|
||||
@ Shift to get the decoded IRQ number, using ASR so
|
||||
@ 'no interrupt pending' becomes 0xffffffff
|
||||
mov \irqnr, \irqstat, asr #16
|
||||
@ set zero flag if IRQ + 1 == 0
|
||||
adds \tmp, \irqnr, #1
|
||||
#ifdef CONFIG_MXC_IRQ_PRIOR
|
||||
bicne \tmp, \irqstat, #0xFFFFFFE0
|
||||
strne \tmp, [\base, #AVIC_NIMASK]
|
||||
streq r4, [\base, #AVIC_NIMASK]
|
||||
#endif
|
||||
#elif defined CONFIG_MXC_TZIC
|
||||
@ Load offset & priority of the highest priority
|
||||
@ interrupt pending.
|
||||
@ 0x080 is INTSEC0 register
|
||||
@ 0xD80 is HIPND0 register
|
||||
mov \irqnr, #0
|
||||
1000: add \irqstat, \base, \irqnr, lsr #3
|
||||
ldr \tmp, [\irqstat, #0xd80]
|
||||
ldr \irqstat, [\irqstat, #0x080]
|
||||
ands \tmp, \tmp, \irqstat
|
||||
bne 1001f
|
||||
add \irqnr, \irqnr, #32
|
||||
cmp \irqnr, #128
|
||||
blo 1000b
|
||||
b 2001f
|
||||
1001: mov \irqstat, #1
|
||||
1002: tst \tmp, \irqstat
|
||||
bne 2002f
|
||||
movs \tmp, \tmp, lsr #1
|
||||
addne \irqnr, \irqnr, #1
|
||||
bne 1002b
|
||||
2001:
|
||||
mov \irqnr, #0
|
||||
2002:
|
||||
movs \irqnr, \irqnr
|
||||
#endif
|
||||
.endm
|
||||
|
|
|
@ -735,6 +735,7 @@ enum iomux_pins {
|
|||
#define MX31_PIN_KEY_COL5_KEY_COL5 IOMUX_MODE(MX31_PIN_KEY_COL5, IOMUX_CONFIG_FUNC)
|
||||
#define MX31_PIN_KEY_COL6_KEY_COL6 IOMUX_MODE(MX31_PIN_KEY_COL6, IOMUX_CONFIG_FUNC)
|
||||
#define MX31_PIN_KEY_COL7_KEY_COL7 IOMUX_MODE(MX31_PIN_KEY_COL7, IOMUX_CONFIG_FUNC)
|
||||
#define MX31_PIN_WATCHDOG_RST__WATCHDOG_RST IOMUX_MODE(MX31_PIN_WATCHDOG_RST, IOMUX_CONFIG_FUNC)
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
#define MX25_SSI2_BASE_ADDR 0x50014000
|
||||
#define MX25_SSI1_BASE_ADDR 0x50034000
|
||||
#define MX25_NFC_BASE_ADDR 0xbb000000
|
||||
#define MX25_IIM_BASE_ADDR 0x53ff0000
|
||||
#define MX25_DRYICE_BASE_ADDR 0x53ffc000
|
||||
#define MX25_ESDHC1_BASE_ADDR 0x53fb4000
|
||||
#define MX25_ESDHC2_BASE_ADDR 0x53fb8000
|
||||
|
|
|
@ -23,17 +23,17 @@
|
|||
|
||||
int imx_irq_set_priority(unsigned char irq, unsigned char prio)
|
||||
{
|
||||
struct mxc_irq_chip *chip;
|
||||
struct irq_chip *base;
|
||||
struct irq_chip_generic *gc;
|
||||
struct mxc_extra_irq *exirq;
|
||||
int ret;
|
||||
|
||||
ret = -ENOSYS;
|
||||
|
||||
base = irq_get_chip(irq);
|
||||
if (base) {
|
||||
chip = container_of(base, struct mxc_irq_chip, base);
|
||||
if (chip->set_priority)
|
||||
ret = chip->set_priority(irq, prio);
|
||||
gc = irq_get_chip_data(irq);
|
||||
if (gc && gc->private) {
|
||||
exirq = gc->private;
|
||||
if (exirq->set_priority)
|
||||
ret = exirq->set_priority(irq, prio);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -43,15 +43,16 @@ EXPORT_SYMBOL(imx_irq_set_priority);
|
|||
int mxc_set_irq_fiq(unsigned int irq, unsigned int type)
|
||||
{
|
||||
struct irq_chip_generic *gc;
|
||||
int (*set_irq_fiq)(unsigned int, unsigned int);
|
||||
struct mxc_extra_irq *exirq;
|
||||
int ret;
|
||||
|
||||
ret = -ENOSYS;
|
||||
|
||||
gc = irq_get_chip_data(irq);
|
||||
if (gc && gc->private) {
|
||||
set_irq_fiq = gc->private;
|
||||
ret = set_irq_fiq(irq, type);
|
||||
exirq = gc->private;
|
||||
if (exirq->set_irq_fiq)
|
||||
ret = exirq->set_irq_fiq(irq, type);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -19,9 +19,8 @@
|
|||
#ifndef __PLAT_MXC_IRQ_COMMON_H__
|
||||
#define __PLAT_MXC_IRQ_COMMON_H__
|
||||
|
||||
struct mxc_irq_chip
|
||||
struct mxc_extra_irq
|
||||
{
|
||||
struct irq_chip base;
|
||||
int (*set_priority)(unsigned char irq, unsigned char prio);
|
||||
int (*set_irq_fiq)(unsigned int irq, unsigned int type);
|
||||
};
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
#define TZIC_SRCCLAR0 0x0280 /* Source Clear Register 0 */
|
||||
#define TZIC_PRIORITY0 0x0400 /* Priority Register 0 */
|
||||
#define TZIC_PND0 0x0D00 /* Pending Register 0 */
|
||||
#define TZIC_HIPND0 0x0D80 /* High Priority Pending Register */
|
||||
#define TZIC_HIPND(i) (0x0D80+ ((i) << 2)) /* High Priority Pending Register */
|
||||
#define TZIC_WAKEUP0(i) (0x0E00 + ((i) << 2)) /* Wakeup Config Register */
|
||||
#define TZIC_SWINT 0x0F00 /* Software Interrupt Rigger Register */
|
||||
#define TZIC_ID0 0x0FD0 /* Indentification Register 0 */
|
||||
|
@ -74,6 +74,12 @@ static int tzic_set_irq_fiq(unsigned int irq, unsigned int type)
|
|||
|
||||
static unsigned int *wakeup_intr[4];
|
||||
|
||||
static struct mxc_extra_irq tzic_extra_irq = {
|
||||
#ifdef CONFIG_FIQ
|
||||
.set_irq_fiq = tzic_set_irq_fiq,
|
||||
#endif
|
||||
};
|
||||
|
||||
static __init void tzic_init_gc(unsigned int irq_start)
|
||||
{
|
||||
struct irq_chip_generic *gc;
|
||||
|
@ -82,7 +88,7 @@ static __init void tzic_init_gc(unsigned int irq_start)
|
|||
|
||||
gc = irq_alloc_generic_chip("tzic", 1, irq_start, tzic_base,
|
||||
handle_level_irq);
|
||||
gc->private = tzic_set_irq_fiq;
|
||||
gc->private = &tzic_extra_irq;
|
||||
gc->wake_enabled = IRQ_MSK(32);
|
||||
wakeup_intr[idx] = &gc->wake_active;
|
||||
|
||||
|
@ -96,6 +102,28 @@ static __init void tzic_init_gc(unsigned int irq_start)
|
|||
irq_setup_generic_chip(gc, IRQ_MSK(32), 0, IRQ_NOREQUEST, 0);
|
||||
}
|
||||
|
||||
asmlinkage void __exception_irq_entry tzic_handle_irq(struct pt_regs *regs)
|
||||
{
|
||||
u32 stat;
|
||||
int i, irqofs, handled;
|
||||
|
||||
do {
|
||||
handled = 0;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
stat = __raw_readl(tzic_base + TZIC_HIPND(i)) &
|
||||
__raw_readl(tzic_base + TZIC_INTSEC0(i));
|
||||
|
||||
while (stat) {
|
||||
handled = 1;
|
||||
irqofs = fls(stat) - 1;
|
||||
handle_IRQ(irqofs + i * 32, regs);
|
||||
stat &= ~(1 << irqofs);
|
||||
}
|
||||
}
|
||||
} while (handled);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function initializes the TZIC hardware and disables all the
|
||||
* interrupts. It registers the interrupt enable and disable functions
|
||||
|
|
Loading…
Reference in New Issue