diff options
| -rw-r--r-- | arch/arm/mach-mxs/clock-mx23.c | 15 | ||||
| -rw-r--r-- | arch/arm/mach-mxs/clock-mx28.c | 18 | ||||
| -rw-r--r-- | arch/arm/mach-mxs/devices-mx23.h | 4 | ||||
| -rw-r--r-- | arch/arm/mach-mxs/devices-mx28.h | 4 | ||||
| -rw-r--r-- | arch/arm/mach-mxs/devices/Kconfig | 3 | ||||
| -rw-r--r-- | arch/arm/mach-mxs/devices/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/mach-mxs/devices/platform-mxs-mmc.c | 73 | ||||
| -rw-r--r-- | arch/arm/mach-mxs/include/mach/devices-common.h | 13 |
8 files changed, 131 insertions, 0 deletions
diff --git a/arch/arm/mach-mxs/clock-mx23.c b/arch/arm/mach-mxs/clock-mx23.c index d133c7f30940..c3577ea789ac 100644 --- a/arch/arm/mach-mxs/clock-mx23.c +++ b/arch/arm/mach-mxs/clock-mx23.c | |||
| @@ -521,6 +521,15 @@ static int clk_misc_init(void) | |||
| 521 | __raw_writel(BM_CLKCTRL_CPU_INTERRUPT_WAIT, | 521 | __raw_writel(BM_CLKCTRL_CPU_INTERRUPT_WAIT, |
| 522 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU_SET); | 522 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU_SET); |
| 523 | 523 | ||
| 524 | /* | ||
| 525 | * 480 MHz seems too high to be ssp clock source directly, | ||
| 526 | * so set frac to get a 288 MHz ref_io. | ||
| 527 | */ | ||
| 528 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC); | ||
| 529 | reg &= ~BM_CLKCTRL_FRAC_IOFRAC; | ||
| 530 | reg |= 30 << BP_CLKCTRL_FRAC_IOFRAC; | ||
| 531 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC); | ||
| 532 | |||
| 524 | return 0; | 533 | return 0; |
| 525 | } | 534 | } |
| 526 | 535 | ||
| @@ -528,6 +537,12 @@ int __init mx23_clocks_init(void) | |||
| 528 | { | 537 | { |
| 529 | clk_misc_init(); | 538 | clk_misc_init(); |
| 530 | 539 | ||
| 540 | /* | ||
| 541 | * source ssp clock from ref_io than ref_xtal, | ||
| 542 | * as ref_xtal only provides 24 MHz as maximum. | ||
| 543 | */ | ||
| 544 | clk_set_parent(&ssp_clk, &ref_io_clk); | ||
| 545 | |||
| 531 | clk_enable(&cpu_clk); | 546 | clk_enable(&cpu_clk); |
| 532 | clk_enable(&hbus_clk); | 547 | clk_enable(&hbus_clk); |
| 533 | clk_enable(&xbus_clk); | 548 | clk_enable(&xbus_clk); |
diff --git a/arch/arm/mach-mxs/clock-mx28.c b/arch/arm/mach-mxs/clock-mx28.c index 5e489a2b2023..1ad97fed1e94 100644 --- a/arch/arm/mach-mxs/clock-mx28.c +++ b/arch/arm/mach-mxs/clock-mx28.c | |||
| @@ -618,6 +618,8 @@ static struct clk_lookup lookups[] = { | |||
| 618 | _REGISTER_CLOCK("pll2", NULL, pll2_clk) | 618 | _REGISTER_CLOCK("pll2", NULL, pll2_clk) |
| 619 | _REGISTER_CLOCK("mxs-dma-apbh", NULL, hbus_clk) | 619 | _REGISTER_CLOCK("mxs-dma-apbh", NULL, hbus_clk) |
| 620 | _REGISTER_CLOCK("mxs-dma-apbx", NULL, xbus_clk) | 620 | _REGISTER_CLOCK("mxs-dma-apbx", NULL, xbus_clk) |
| 621 | _REGISTER_CLOCK("mxs-mmc.0", NULL, ssp0_clk) | ||
| 622 | _REGISTER_CLOCK("mxs-mmc.1", NULL, ssp1_clk) | ||
| 621 | _REGISTER_CLOCK("flexcan.0", NULL, can0_clk) | 623 | _REGISTER_CLOCK("flexcan.0", NULL, can0_clk) |
| 622 | _REGISTER_CLOCK("flexcan.1", NULL, can1_clk) | 624 | _REGISTER_CLOCK("flexcan.1", NULL, can1_clk) |
| 623 | _REGISTER_CLOCK(NULL, "usb0", usb0_clk) | 625 | _REGISTER_CLOCK(NULL, "usb0", usb0_clk) |
| @@ -737,6 +739,15 @@ static int clk_misc_init(void) | |||
| 737 | reg |= BM_CLKCTRL_ENET_CLK_OUT_EN; | 739 | reg |= BM_CLKCTRL_ENET_CLK_OUT_EN; |
| 738 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_ENET); | 740 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_ENET); |
| 739 | 741 | ||
| 742 | /* | ||
| 743 | * 480 MHz seems too high to be ssp clock source directly, | ||
| 744 | * so set frac0 to get a 288 MHz ref_io0. | ||
| 745 | */ | ||
| 746 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC0); | ||
| 747 | reg &= ~BM_CLKCTRL_FRAC0_IO0FRAC; | ||
| 748 | reg |= 30 << BP_CLKCTRL_FRAC0_IO0FRAC; | ||
| 749 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC0); | ||
| 750 | |||
| 740 | return 0; | 751 | return 0; |
| 741 | } | 752 | } |
| 742 | 753 | ||
| @@ -744,6 +755,13 @@ int __init mx28_clocks_init(void) | |||
| 744 | { | 755 | { |
| 745 | clk_misc_init(); | 756 | clk_misc_init(); |
| 746 | 757 | ||
| 758 | /* | ||
| 759 | * source ssp clock from ref_io0 than ref_xtal, | ||
| 760 | * as ref_xtal only provides 24 MHz as maximum. | ||
| 761 | */ | ||
| 762 | clk_set_parent(&ssp0_clk, &ref_io0_clk); | ||
| 763 | clk_set_parent(&ssp1_clk, &ref_io0_clk); | ||
| 764 | |||
| 747 | clk_enable(&cpu_clk); | 765 | clk_enable(&cpu_clk); |
| 748 | clk_enable(&hbus_clk); | 766 | clk_enable(&hbus_clk); |
| 749 | clk_enable(&xbus_clk); | 767 | clk_enable(&xbus_clk); |
diff --git a/arch/arm/mach-mxs/devices-mx23.h b/arch/arm/mach-mxs/devices-mx23.h index c7e14f4e3669..c6f345febd39 100644 --- a/arch/arm/mach-mxs/devices-mx23.h +++ b/arch/arm/mach-mxs/devices-mx23.h | |||
| @@ -21,6 +21,10 @@ extern const struct mxs_auart_data mx23_auart_data[] __initconst; | |||
| 21 | #define mx23_add_auart0() mx23_add_auart(0) | 21 | #define mx23_add_auart0() mx23_add_auart(0) |
| 22 | #define mx23_add_auart1() mx23_add_auart(1) | 22 | #define mx23_add_auart1() mx23_add_auart(1) |
| 23 | 23 | ||
| 24 | extern const struct mxs_mxs_mmc_data mx23_mxs_mmc_data[] __initconst; | ||
| 25 | #define mx23_add_mxs_mmc(id, pdata) \ | ||
| 26 | mxs_add_mxs_mmc(&mx23_mxs_mmc_data[id], pdata) | ||
| 27 | |||
| 24 | #define mx23_add_mxs_pwm(id) mxs_add_mxs_pwm(MX23_PWM_BASE_ADDR, id) | 28 | #define mx23_add_mxs_pwm(id) mxs_add_mxs_pwm(MX23_PWM_BASE_ADDR, id) |
| 25 | 29 | ||
| 26 | struct platform_device *__init mx23_add_mxsfb( | 30 | struct platform_device *__init mx23_add_mxsfb( |
diff --git a/arch/arm/mach-mxs/devices-mx28.h b/arch/arm/mach-mxs/devices-mx28.h index 9d08555c4cf0..c473eddce8cf 100644 --- a/arch/arm/mach-mxs/devices-mx28.h +++ b/arch/arm/mach-mxs/devices-mx28.h | |||
| @@ -37,6 +37,10 @@ extern const struct mxs_flexcan_data mx28_flexcan_data[] __initconst; | |||
| 37 | extern const struct mxs_i2c_data mx28_mxs_i2c_data[] __initconst; | 37 | extern const struct mxs_i2c_data mx28_mxs_i2c_data[] __initconst; |
| 38 | #define mx28_add_mxs_i2c(id) mxs_add_mxs_i2c(&mx28_mxs_i2c_data[id]) | 38 | #define mx28_add_mxs_i2c(id) mxs_add_mxs_i2c(&mx28_mxs_i2c_data[id]) |
| 39 | 39 | ||
| 40 | extern const struct mxs_mxs_mmc_data mx28_mxs_mmc_data[] __initconst; | ||
| 41 | #define mx28_add_mxs_mmc(id, pdata) \ | ||
| 42 | mxs_add_mxs_mmc(&mx28_mxs_mmc_data[id], pdata) | ||
| 43 | |||
| 40 | #define mx28_add_mxs_pwm(id) mxs_add_mxs_pwm(MX28_PWM_BASE_ADDR, id) | 44 | #define mx28_add_mxs_pwm(id) mxs_add_mxs_pwm(MX28_PWM_BASE_ADDR, id) |
| 41 | 45 | ||
| 42 | struct platform_device *__init mx28_add_mxsfb( | 46 | struct platform_device *__init mx28_add_mxsfb( |
diff --git a/arch/arm/mach-mxs/devices/Kconfig b/arch/arm/mach-mxs/devices/Kconfig index 1451ad060d82..acf9eea124c0 100644 --- a/arch/arm/mach-mxs/devices/Kconfig +++ b/arch/arm/mach-mxs/devices/Kconfig | |||
| @@ -15,6 +15,9 @@ config MXS_HAVE_PLATFORM_FLEXCAN | |||
| 15 | config MXS_HAVE_PLATFORM_MXS_I2C | 15 | config MXS_HAVE_PLATFORM_MXS_I2C |
| 16 | bool | 16 | bool |
| 17 | 17 | ||
| 18 | config MXS_HAVE_PLATFORM_MXS_MMC | ||
| 19 | bool | ||
| 20 | |||
| 18 | config MXS_HAVE_PLATFORM_MXS_PWM | 21 | config MXS_HAVE_PLATFORM_MXS_PWM |
| 19 | bool | 22 | bool |
| 20 | 23 | ||
diff --git a/arch/arm/mach-mxs/devices/Makefile b/arch/arm/mach-mxs/devices/Makefile index 0d9bea30b0a2..324f2824d38d 100644 --- a/arch/arm/mach-mxs/devices/Makefile +++ b/arch/arm/mach-mxs/devices/Makefile | |||
| @@ -4,5 +4,6 @@ obj-y += platform-dma.o | |||
| 4 | obj-$(CONFIG_MXS_HAVE_PLATFORM_FEC) += platform-fec.o | 4 | obj-$(CONFIG_MXS_HAVE_PLATFORM_FEC) += platform-fec.o |
| 5 | obj-$(CONFIG_MXS_HAVE_PLATFORM_FLEXCAN) += platform-flexcan.o | 5 | obj-$(CONFIG_MXS_HAVE_PLATFORM_FLEXCAN) += platform-flexcan.o |
| 6 | obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_I2C) += platform-mxs-i2c.o | 6 | obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_I2C) += platform-mxs-i2c.o |
| 7 | obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_MMC) += platform-mxs-mmc.o | ||
| 7 | obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_PWM) += platform-mxs-pwm.o | 8 | obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_PWM) += platform-mxs-pwm.o |
| 8 | obj-$(CONFIG_MXS_HAVE_PLATFORM_MXSFB) += platform-mxsfb.o | 9 | obj-$(CONFIG_MXS_HAVE_PLATFORM_MXSFB) += platform-mxsfb.o |
diff --git a/arch/arm/mach-mxs/devices/platform-mxs-mmc.c b/arch/arm/mach-mxs/devices/platform-mxs-mmc.c new file mode 100644 index 000000000000..382dacbeca21 --- /dev/null +++ b/arch/arm/mach-mxs/devices/platform-mxs-mmc.c | |||
| @@ -0,0 +1,73 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2010 Pengutronix | ||
| 3 | * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> | ||
| 4 | * | ||
| 5 | * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved. | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify it under | ||
| 8 | * the terms of the GNU General Public License version 2 as published by the | ||
| 9 | * Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/compiler.h> | ||
| 13 | #include <linux/err.h> | ||
| 14 | #include <linux/init.h> | ||
| 15 | |||
| 16 | #include <mach/mx23.h> | ||
| 17 | #include <mach/mx28.h> | ||
| 18 | #include <mach/devices-common.h> | ||
| 19 | |||
| 20 | #define mxs_mxs_mmc_data_entry_single(soc, _id, hwid) \ | ||
| 21 | { \ | ||
| 22 | .id = _id, \ | ||
| 23 | .iobase = soc ## _SSP ## hwid ## _BASE_ADDR, \ | ||
| 24 | .dma = soc ## _DMA_SSP ## hwid, \ | ||
| 25 | .irq_err = soc ## _INT_SSP ## hwid ## _ERROR, \ | ||
| 26 | .irq_dma = soc ## _INT_SSP ## hwid ## _DMA, \ | ||
| 27 | } | ||
| 28 | |||
| 29 | #define mxs_mxs_mmc_data_entry(soc, _id, hwid) \ | ||
| 30 | [_id] = mxs_mxs_mmc_data_entry_single(soc, _id, hwid) | ||
| 31 | |||
| 32 | |||
| 33 | #ifdef CONFIG_SOC_IMX23 | ||
| 34 | const struct mxs_mxs_mmc_data mx23_mxs_mmc_data[] __initconst = { | ||
| 35 | mxs_mxs_mmc_data_entry(MX23, 0, 1), | ||
| 36 | mxs_mxs_mmc_data_entry(MX23, 1, 2), | ||
| 37 | }; | ||
| 38 | #endif | ||
| 39 | |||
