aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-realview/include/mach/irqs-eb.h23
-rw-r--r--arch/arm/mach-u300/Makefile1
-rw-r--r--arch/arm/mach-u300/core.c38
-rw-r--r--arch/arm/mach-u300/mmc.c52
-rw-r--r--arch/arm/mach-u300/mmc.h18
-rw-r--r--arch/arm/mach-ux500/board-mop500-sdi.c21
-rw-r--r--drivers/char/hw_random/nomadik-rng.c13
-rw-r--r--drivers/dma/pl330.c13
-rw-r--r--drivers/input/serio/ambakmi.c13
-rw-r--r--drivers/mmc/host/mmci.c178
-rw-r--r--drivers/mmc/host/mmci.h15
-rw-r--r--drivers/rtc/rtc-pl030.c13
-rw-r--r--drivers/rtc/rtc-pl031.c13
-rw-r--r--drivers/watchdog/sp805_wdt.c12
-rw-r--r--include/linux/amba/bus.h9
-rw-r--r--include/linux/amba/mmci.h22
-rw-r--r--sound/arm/aaci.c13
17 files changed, 202 insertions, 265 deletions
diff --git a/arch/arm/mach-realview/include/mach/irqs-eb.h b/arch/arm/mach-realview/include/mach/irqs-eb.h
index 204d5378f309..d6b5073692d2 100644
--- a/arch/arm/mach-realview/include/mach/irqs-eb.h
+++ b/arch/arm/mach-realview/include/mach/irqs-eb.h
@@ -96,16 +96,19 @@
96#define IRQ_EB11MP_L220_SLAVE (IRQ_EB_GIC_START + 30) 96#define IRQ_EB11MP_L220_SLAVE (IRQ_EB_GIC_START + 30)
97#define IRQ_EB11MP_L220_DECODE (IRQ_EB_GIC_START + 31) 97#define IRQ_EB11MP_L220_DECODE (IRQ_EB_GIC_START + 31)
98 98
99#define IRQ_EB11MP_UART2 -1 99/*
100#define IRQ_EB11MP_UART3 -1 100 * The 11MPcore tile leaves the following unconnected.
101#define IRQ_EB11MP_CLCD -1 101 */
102#define IRQ_EB11MP_DMA -1 102#define IRQ_EB11MP_UART2 0
103#define IRQ_EB11MP_WDOG -1 103#define IRQ_EB11MP_UART3 0
104#define IRQ_EB11MP_GPIO0 -1 104#define IRQ_EB11MP_CLCD 0
105#define IRQ_EB11MP_GPIO1 -1 105#define IRQ_EB11MP_DMA 0
106#define IRQ_EB11MP_GPIO2 -1 106#define IRQ_EB11MP_WDOG 0
107#define IRQ_EB11MP_SCI -1 107#define IRQ_EB11MP_GPIO0 0
108#define IRQ_EB11MP_SSP -1 108#define IRQ_EB11MP_GPIO1 0
109#define IRQ_EB11MP_GPIO2 0
110#define IRQ_EB11MP_SCI 0
111#define IRQ_EB11MP_SSP 0
109 112
110#define NR_GIC_EB11MP 2 113#define NR_GIC_EB11MP 2
111 114
diff --git a/arch/arm/mach-u300/Makefile b/arch/arm/mach-u300/Makefile
index 285538124e5e..fd3a5c382f47 100644
--- a/arch/arm/mach-u300/Makefile
+++ b/arch/arm/mach-u300/Makefile
@@ -8,7 +8,6 @@ obj-n :=
8obj- := 8obj- :=
9 9
10obj-$(CONFIG_ARCH_U300) += u300.o 10obj-$(CONFIG_ARCH_U300) += u300.o
11obj-$(CONFIG_MMC) += mmc.o
12obj-$(CONFIG_SPI_PL022) += spi.o 11obj-$(CONFIG_SPI_PL022) += spi.o
13obj-$(CONFIG_MACH_U300_SPIDUMMY) += dummyspichip.o 12obj-$(CONFIG_MACH_U300_SPIDUMMY) += dummyspichip.o
14obj-$(CONFIG_I2C_STU300) += i2c.o 13obj-$(CONFIG_I2C_STU300) += i2c.o
diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c
index b911590c8ae7..8b90c44d237f 100644
--- a/arch/arm/mach-u300/core.c
+++ b/arch/arm/mach-u300/core.c
@@ -18,6 +18,7 @@
18#include <linux/termios.h> 18#include <linux/termios.h>
19#include <linux/dmaengine.h> 19#include <linux/dmaengine.h>
20#include <linux/amba/bus.h> 20#include <linux/amba/bus.h>
21#include <linux/amba/mmci.h>
21#include <linux/amba/serial.h> 22#include <linux/amba/serial.h>
22#include <linux/platform_device.h> 23#include <linux/platform_device.h>
23#include <linux/gpio.h> 24#include <linux/gpio.h>
@@ -44,9 +45,9 @@
44#include <mach/gpio-u300.h> 45#include <mach/gpio-u300.h>
45 46
46#include "clock.h" 47#include "clock.h"
47#include "mmc.h"
48#include "spi.h" 48#include "spi.h"
49#include "i2c.h" 49#include "i2c.h"
50#include "u300-gpio.h"
50 51
51/* 52/*
52 * Static I/O mappings that are needed for booting the U300 platforms. The 53 * Static I/O mappings that are needed for booting the U300 platforms. The
@@ -117,11 +118,6 @@ static AMBA_APB_DEVICE(uart1, "uart1", 0, U300_UART1_BASE,
117/* AHB device at 0x4000 offset */ 118/* AHB device at 0x4000 offset */
118static AMBA_APB_DEVICE(pl172, "pl172", 0, U300_EMIF_CFG_BASE, { }, NULL); 119static AMBA_APB_DEVICE(pl172, "pl172", 0, U300_EMIF_CFG_BASE, { }, NULL);
119 120
120
121/*
122 * Everything within this next ifdef deals with external devices connected to
123 * the APP SPI bus.
124 */
125/* Fast device at 0x6000 offset */ 121/* Fast device at 0x6000 offset */
126static AMBA_APB_DEVICE(pl022, "pl022", 0, U300_SPI_BASE, 122static AMBA_APB_DEVICE(pl022, "pl022", 0, U300_SPI_BASE,
127 { IRQ_U300_SPI }, NULL); 123 { IRQ_U300_SPI }, NULL);
@@ -129,8 +125,26 @@ static AMBA_APB_DEVICE(pl022, "pl022", 0, U300_SPI_BASE,
129/* Fast device at 0x1000 offset */ 125/* Fast device at 0x1000 offset */
130#define U300_MMCSD_IRQS { IRQ_U300_MMCSD_MCIINTR0, IRQ_U300_MMCSD_MCIINTR1 } 126#define U300_MMCSD_IRQS { IRQ_U300_MMCSD_MCIINTR0, IRQ_U300_MMCSD_MCIINTR1 }
131 127
128static struct mmci_platform_data mmcsd_platform_data = {
129 /*
130 * Do not set ocr_mask or voltage translation function,
131 * we have a regulator we can control instead.
132 */
133 .f_max = 24000000,
134 .gpio_wp = -1,
135 .gpio_cd = U300_GPIO_PIN_MMC_CD,
136 .cd_invert = true,
137 .capabilities = MMC_CAP_MMC_HIGHSPEED |
138 MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
139#ifdef CONFIG_COH901318
140 .dma_filter = coh901318_filter_id,
141 .dma_rx_param = (void *) U300_DMA_MMCSD_RX_TX,
142 /* Don't specify a TX channel, this RX channel is bidirectional */
143#endif
144};
145
132static AMBA_APB_DEVICE(mmcsd, "mmci", 0, U300_MMCSD_BASE, 146static AMBA_APB_DEVICE(mmcsd, "mmci", 0, U300_MMCSD_BASE,
133 U300_MMCSD_IRQS, NULL); 147 U300_MMCSD_IRQS, &mmcsd_platform_data);
134 148
135/* 149/*
136 * The order of device declaration may be important, since some devices 150 * The order of device declaration may be important, since some devices
@@ -1830,16 +1844,6 @@ void __init u300_init_devices(void)
1830 writew(val, U300_SYSCON_VBASE + U300_SYSCON_SMCR); 1844 writew(val, U300_SYSCON_VBASE + U300_SYSCON_SMCR);
1831} 1845}
1832 1846
1833static int core_module_init(void)
1834{
1835 /*
1836 * This needs to be initialized later: it needs the input framework
1837 * to be initialized first.
1838 */
1839 return mmc_init(&mmcsd_device);
1840}
1841module_init(core_module_init);
1842
1843/* Forward declare this function from the watchdog */ 1847/* Forward declare this function from the watchdog */
1844void coh901327_watchdog_reset(void); 1848void coh901327_watchdog_reset(void);
1845 1849
diff --git a/arch/arm/mach-u300/mmc.c b/arch/arm/mach-u300/mmc.c
deleted file mode 100644
index 05abd6ad9fab..000000000000
--- a/arch/arm/mach-u300/mmc.c
+++ /dev/null
@@ -1,52 +0,0 @@
1/*
2 *
3 * arch/arm/mach-u300/mmc.c
4 *
5 *
6 * Copyright (C) 2009 ST-Ericsson SA
7 * License terms: GNU General Public License (GPL) version 2
8 *
9 * Author: Linus Walleij <linus.walleij@stericsson.com>
10 * Author: Johan Lundin
11 * Author: Jonas Aaberg <jonas.aberg@stericsson.com>
12 */
13#include <linux/device.h>
14#include <linux/amba/bus.h>
15#include <linux/mmc/host.h>
16#include <linux/dmaengine.h>
17#include <linux/amba/mmci.h>
18#include <linux/slab.h>
19#include <mach/coh901318.h>
20#include <mach/dma_channels.h>
21
22#include "u300-gpio.h"
23#include "mmc.h"
24
25static struct mmci_platform_data mmc0_plat_data = {
26 /*
27 * Do not set ocr_mask or voltage translation function,
28 * we have a regulator we can control instead.
29 */
30 /* Nominally 2.85V on our platform */
31 .f_max = 24000000,
32 .gpio_wp = -1,
33 .gpio_cd = U300_GPIO_PIN_MMC_CD,
34 .cd_invert = true,
35 .capabilities = MMC_CAP_MMC_HIGHSPEED |
36 MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
37#ifdef CONFIG_COH901318
38 .dma_filter = coh901318_filter_id,
39 .dma_rx_param = (void *) U300_DMA_MMCSD_RX_TX,
40 /* Don't specify a TX channel, this RX channel is bidirectional */
41#endif
42};
43
44int __devinit mmc_init(struct amba_device *adev)
45{
46 struct device *mmcsd_device = &adev->dev;
47 int ret = 0;
48
49 mmcsd_device->platform_data = &mmc0_plat_data;
50
51 return ret;
52}
diff --git a/arch/arm/mach-u300/mmc.h b/arch/arm/mach-u300/mmc.h
deleted file mode 100644
index 92b85125abb3..000000000000
--- a/arch/arm/mach-u300/mmc.h
+++ /dev/null
@@ -1,18 +0,0 @@
1/*
2 *
3 * arch/arm/mach-u300/mmc.h
4 *
5 *
6 * Copyright (C) 2009 ST-Ericsson AB
7 * License terms: GNU General Public License (GPL) version 2
8 *
9 * Author: Jonas Aaberg <jonas.aberg@stericsson.com>
10 */
11#ifndef MMC_H
12#define MMC_H
13
14#include <linux/amba/bus.h>
15
16int __devinit mmc_init(struct amba_device *adev);
17
18#endif
diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c
index 5dde4d4ebe88..1daead3e583e 100644
--- a/arch/arm/mach-ux500/board-mop500-sdi.c
+++ b/arch/arm/mach-ux500/board-mop500-sdi.c
@@ -31,21 +31,13 @@
31 * SDI 0 (MicroSD slot) 31 * SDI 0 (MicroSD slot)
32 */ 32 */
33 33
34/* MMCIPOWER bits */
35#define MCI_DATA2DIREN (1 << 2)
36#define MCI_CMDDIREN (1 << 3)
37#define MCI_DATA0DIREN (1 << 4)
38#define MCI_DATA31DIREN (1 << 5)
39#define MCI_FBCLKEN (1 << 7)
40
41/* GPIO pins used by the sdi0 level shifter */ 34/* GPIO pins used by the sdi0 level shifter */
42static int sdi0_en = -1; 35static int sdi0_en = -1;
43static int sdi0_vsel = -1; 36static int sdi0_vsel = -1;
44 37
45static u32 mop500_sdi0_vdd_handler(struct device *dev, unsigned int vdd, 38static int mop500_sdi0_ios_handler(struct device *dev, struct mmc_ios *ios)
46 unsigned char power_mode)
47{ 39{
48 switch (power_mode) { 40 switch (ios->power_mode) {
49 case MMC_POWER_UP: 41 case MMC_POWER_UP:
50 case MMC_POWER_ON: 42 case MMC_POWER_ON:
51 /* 43 /*
@@ -65,8 +57,7 @@ static u32 mop500_sdi0_vdd_handler(struct device *dev, unsigned int vdd,
65 break; 57 break;
66 } 58 }
67 59
68 return MCI_FBCLKEN | MCI_CMDDIREN | MCI_DATA0DIREN | 60 return 0;
69 MCI_DATA2DIREN | MCI_DATA31DIREN;
70} 61}
71 62
72#ifdef CONFIG_STE_DMA40 63#ifdef CONFIG_STE_DMA40
@@ -90,13 +81,17 @@ static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = {
90#endif 81#endif
91 82
92static struct mmci_platform_data mop500_sdi0_data = { 83static struct mmci_platform_data mop500_sdi0_data = {
93 .vdd_handler = mop500_sdi0_vdd_handler, 84 .ios_handler = mop500_sdi0_ios_handler,
94 .ocr_mask = MMC_VDD_29_30, 85 .ocr_mask = MMC_VDD_29_30,
95 .f_max = 50000000, 86 .f_max = 50000000,
96 .capabilities = MMC_CAP_4_BIT_DATA | 87 .capabilities = MMC_CAP_4_BIT_DATA |
97 MMC_CAP_SD_HIGHSPEED | 88 MMC_CAP_SD_HIGHSPEED |
98 MMC_CAP_MMC_HIGHSPEED, 89 MMC_CAP_MMC_HIGHSPEED,
99 .gpio_wp = -1, 90 .gpio_wp = -1,
91 .sigdir = MCI_ST_FBCLKEN |
92 MCI_ST_CMDDIREN |
93 MCI_ST_DATA0DIREN |
94 MCI_ST_DATA2DIREN,
100#ifdef CONFIG_STE_DMA40 95#ifdef CONFIG_STE_DMA40
101 .dma_filter = stedma40_filter, 96 .dma_filter = stedma40_filter,
102 .dma_rx_param = &mop500_sdi0_dma_cfg_rx, 97 .dma_rx_param = &mop500_sdi0_dma_cfg_rx,
diff --git a/drivers/char/hw_random/nomadik-rng.c b/drivers/char/hw_random/nomadik-rng.c
index 3d3c1e6703b4..96de0249e595 100644
--- a/drivers/char/hw_random/nomadik-rng.c
+++ b/drivers/char/hw_random/nomadik-rng.c
@@ -107,17 +107,6 @@ static struct amba_driver nmk_rng_driver = {
107 .id_table = nmk_rng_ids, 107 .id_table = nmk_rng_ids,
108}; 108};
109 109
110static int __init nmk_rng_init(void) 110module_amba_driver(nmk_rng_driver);
111{
112 return amba_driver_register(&nmk_rng_driver);
113}
114
115static void __devexit nmk_rng_exit(void)
116{
117 amba_driver_unregister(&nmk_rng_driver);
118}
119
120module_init(nmk_rng_init);
121module_exit(nmk_rng_exit);
122 111
123MODULE_LICENSE("GPL"); 112MODULE_LICENSE("GPL");
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
index b8ec03ee8e22..16b66c827f19 100644
--- a/drivers/dma/pl330.c
+++ b/drivers/dma/pl330.c
@@ -1035,18 +1035,7 @@ static struct amba_driver pl330_driver = {
1035 .remove = pl330_remove, 1035 .remove = pl330_remove,
1036}; 1036};
1037 1037
1038static int __init pl330_init(void) 1038module_amba_driver(pl330_driver);
1039{
1040 return amba_driver_register(&pl330_driver);
1041}
1042module_init(pl330_init);
1043
1044static void __exit pl330_exit(void)
1045{
1046 amba_driver_unregister(&pl330_driver);
1047 return;
1048}
1049module_exit(pl330_exit);
1050 1039
1051MODULE_AUTHOR("Jaswinder Singh <jassi.brar@samsung.com>"); 1040MODULE_AUTHOR("Jaswinder Singh <jassi.brar@samsung.com>");
1052MODULE_DESCRIPTION("API Driver for PL330 DMAC"); 1041MODULE_DESCRIPTION("API Driver for PL330 DMAC");
diff --git a/drivers/input/serio/ambakmi.c b/drivers/input/serio/ambakmi.c
index 8407d5b0ced8..2ffd110bd5bc 100644
--- a/drivers/input/serio/ambakmi.c
+++ b/drivers/input/serio/ambakmi.c
@@ -208,18 +208,7 @@ static struct amba_driver ambakmi_driver = {
208 .resume = amba_kmi_resume, 208 .resume = amba_kmi_resume,
209}; 209};
210 210
211static int __init amba_kmi_init(void) 211module_amba_driver(ambakmi_driver);
212{
213 return amba_driver_register(&ambakmi_driver);
214}
215
216static void __exit amba_kmi_exit(void)
217{
218 amba_driver_unregister(&ambakmi_driver);
219}
220
221module_init(amba_kmi_init);
222module_exit(amba_kmi_exit);
223 212
224MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); 213MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
225MODULE_DESCRIPTION("AMBA KMI controller driver"); 214MODULE_DESCRIPTION("AMBA KMI controller driver");
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index bdfd05517dd5..983e244eca76 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -53,6 +53,8 @@ static unsigned int fmax = 515633;
53 * @sdio: variant supports SDIO 53 * @sdio: variant supports SDIO
54 * @st_clkdiv: true if using a ST-specific clock divider algorithm 54 * @st_clkdiv: true if using a ST-specific clock divider algorithm
55 * @blksz_datactrl16: true if Block size is at b16..b30 position in datactrl register 55 * @blksz_datactrl16: true if Block size is at b16..b30 position in datactrl register
56 * @pwrreg_powerup: power up value for MMCIPOWER register
57 * @signal_direction: input/out direction of bus signals can be indicated
56 */ 58 */
57struct variant_data { 59struct variant_data {
58 unsigned int clkreg; 60 unsigned int clkreg;
@@ -63,18 +65,22 @@ struct variant_data {
63 bool sdio; 65 bool sdio;
64 bool st_clkdiv; 66 bool st_clkdiv;
65 bool blksz_datactrl16; 67 bool blksz_datactrl16;
68 u32 pwrreg_powerup;
69 bool signal_direction;
66}; 70};
67 71
68static struct variant_data variant_arm = { 72static struct variant_data variant_arm = {
69 .fifosize = 16 * 4, 73 .fifosize = 16 * 4,
70 .fifohalfsize = 8 * 4, 74 .fifohalfsize = 8 * 4,
71 .datalength_bits = 16, 75 .datalength_bits = 16,
76 .pwrreg_powerup = MCI_PWR_UP,
72}; 77};
73 78
74static struct variant_data variant_arm_extended_fifo = { 79static struct variant_data variant_arm_extended_fifo = {
75 .fifosize = 128 * 4, 80 .fifosize = 128 * 4,
76 .fifohalfsize = 64 * 4, 81 .fifohalfsize = 64 * 4,
77 .datalength_bits = 16, 82 .datalength_bits = 16,
83 .pwrreg_powerup = MCI_PWR_UP,
78}; 84};
79 85
80static struct variant_data variant_u300 = { 86static struct variant_data variant_u300 = {
@@ -83,6 +89,8 @@ static struct variant_data variant_u300 = {
83 .clkreg_enable = MCI_ST_U300_HWFCEN, 89 .clkreg_enable = MCI_ST_U300_HWFCEN,
84 .datalength_bits = 16, 90 .datalength_bits = 16,
85 .sdio = true, 91 .sdio = true,
92 .pwrreg_powerup = MCI_PWR_ON,
93 .signal_direction = true,
86}; 94};
87 95
88static struct variant_data variant_ux500 = { 96static struct variant_data variant_ux500 = {
@@ -93,6 +101,8 @@ static struct variant_data variant_ux500 = {
93 .datalength_bits = 24, 101 .datalength_bits = 24,
94 .sdio = true, 102 .sdio = true,
95 .st_clkdiv = true, 103 .st_clkdiv = true,
104 .pwrreg_powerup = MCI_PWR_ON,
105 .signal_direction = true,
96}; 106};
97 107
98static struct variant_data variant_ux500v2 = { 108static struct variant_data variant_ux500v2 = {
@@ -104,11 +114,35 @@ static struct variant_data variant_ux500v2 = {
104 .sdio = true, 114 .sdio = true,
105 .st_clkdiv = true, 115 .st_clkdiv = true,
106 .blksz_datactrl16 = true, 116 .blksz_datactrl16 = true,
117 .pwrreg_powerup = MCI_PWR_ON,
118 .signal_direction = true,
107}; 119};
108 120
109/* 121/*
110 * This must be called with host->lock held 122 * This must be called with host->lock held
111 */ 123 */
124static void mmci_write_clkreg(struct mmci_host *host, u32 clk)
125{
126 if (host->clk_reg != clk) {
127 host->clk_reg = clk;
128 writel(clk, host->base + MMCICLOCK);
129 }
130}
131
132/*
133 * This must be called with host->lock held
134 */
135static void mmci_write_pwrreg(struct mmci_host *host, u32 pwr)
136{
137 if (host->pwr_reg != pwr) {
138 host->pwr_reg = pwr;
139 writel(pwr, host->base + MMCIPOWER);
140 }
141}
142
143/*
144 * This must be called with host->lock held
145 */
112static void mmci_set_clkreg(struct mmci_host *host, unsigned int desired) 146static void mmci_set_clkreg(struct mmci_host *host, unsigned int desired)
113{ 147{
114 struct variant_data *variant = host->variant; 148 struct variant_data *variant = host->variant;
@@ -153,7 +187,7 @@ static void mmci_set_clkreg(struct mmci_host *host, unsigned int desired)
153 if (host->mmc->ios.bus_width == MMC_BUS_WIDTH_8) 187 if (host->mmc->ios.bus_width == MMC_BUS_WIDTH_8)
154 clk |= MCI_ST_8BIT_BUS; 188 clk |= MCI_ST_8BIT_BUS;
155 189
156 writel(clk, host->base + MMCICLOCK); 190 mmci_write_clkreg(host, clk);
157} 191}
158 192
159static void 193static void
@@ -166,14 +200,10 @@ mmci_request_end(struct mmci_host *host, struct mmc_request *mrq)
166 host->mrq = NULL; 200 host->mrq = NULL;
167 host->cmd = NULL; 201 host->cmd = NULL;
168 202
169 /*
170 * Need to drop the host lock here; mmc_request_done may call
171 * back into the driver...
172 */
173 spin_unlock(&host->lock);
174 pm_runtime_put(mmc_dev(host->mmc));
175 mmc_request_done(host->mmc, mrq); 203 mmc_request_done(host->mmc, mrq);
176 spin_lock(&host->lock); 204
205 pm_runtime_mark_last_busy(mmc_dev(host->mmc));
206 pm_runtime_put_autosuspend(mmc_dev(host->mmc));
177} 207}
178 208
179static void mmci_set_mask1(struct mmci_host *host, unsigned int mask) 209static void mmci_set_mask1(struct mmci_host *host, unsigned int mask)
@@ -607,6 +637,11 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
607 if (data->flags & MMC_DATA_READ) 637 if (data->flags & MMC_DATA_READ)
608 datactrl |= MCI_DPSM_DIRECTION; 638 datactrl |= MCI_DPSM_DIRECTION;
609 639
640 /* The ST Micro variants has a special bit to enable SDIO */
641 if (variant->sdio && host->mmc->card)
642 if (mmc_card_sdio(host->mmc->card))
643 datactrl |= MCI_ST_DPSM_SDIOEN;
644
610 /* 645 /*
611 * Attempt to use DMA operation mode, if this 646 * Attempt to use DMA operation mode, if this
612 * should fail, fall back to PIO mode 647 * should fail, fall back to PIO mode
@@ -635,11 +670,6 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
635 irqmask = MCI_TXFIFOHALFEMPTYMASK; 670 irqmask = MCI_TXFIFOHALFEMPTYMASK;
636 } 671 }
637 672
638 /* The ST Micro variants has a special bit to enable SDIO */
639 if (variant->sdio && host->mmc->card)
640 if (mmc_card_sdio(host->mmc->card))
641 datactrl |= MCI_ST_DPSM_SDIOEN;
642
643 writel(datactrl, base + MMCIDATACTRL); 673 writel(datactrl, base + MMCIDATACTRL);
644 writel(readl(base + MMCIMASK0) & ~MCI_DATAENDMASK, base + MMCIMASK0); 674 writel(readl(base + MMCIMASK0) & ~MCI_DATAENDMASK, base + MMCIMASK0);
645 mmci_set_mask1(host, irqmask); 675 mmci_set_mask1(host, irqmask);
@@ -786,7 +816,24 @@ static int mmci_pio_read(struct mmci_host *host, char *buffer, unsigned int rema
786 if (count <= 0) 816 if (count <= 0)
787 break; 817 break;
788 818
789 readsl(base + MMCIFIFO, ptr, count >> 2); 819 /*
820 * SDIO especially may want to send something that is
821 * not divisible by 4 (as opposed to card sectors
822 * etc). Therefore make sure to always read the last bytes
823 * while only doing full 32-bit reads towards the FIFO.
824 */
825 if (unlikely(count & 0x3)) {
826 if (count < 4) {
827 unsigned char buf[4];
828 readsl(base + MMCIFIFO, buf, 1);
829 memcpy(ptr, buf, count);
830 } else {
831 readsl(base + MMCIFIFO, ptr, count >> 2);
832 count &= ~0x3;
833 }
834 } else {
835 readsl(base + MMCIFIFO, ptr, count >> 2);
836 }
790 837
791 ptr += count; 838 ptr += count;
792 remain -= count; 839 remain -= count;
@@ -821,14 +868,13 @@ static int mmci_pio_write(struct mmci_host *host, char *buffer, unsigned int rem
821 */ 868 */
822 if (variant->sdio && 869 if (variant->sdio &&
823 mmc_card_sdio(host->mmc->card)) { 870 mmc_card_sdio(host->mmc->card)) {
871 u32 clk;
824 if (count < 8) 872 if (count < 8)
825 writel(readl(host->base + MMCICLOCK) & 873 clk = host->clk_reg & ~variant->clkreg_enable;
826 ~variant->clkreg_enable,
827 host->base + MMCICLOCK);
828 else 874 else
829 writel(readl(host->base + MMCICLOCK) | 875 clk = host->clk_reg | variant->clkreg_enable;
830 variant->clkreg_enable, 876
831 host->base + MMCICLOCK); 877 mmci_write_clkreg(host, clk);
832 } 878 }
833 879
834 /* 880 /*
@@ -1015,10 +1061,17 @@ static void mmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
1015static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) 1061static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1016{ 1062{
1017 struct mmci_host *host = mmc_priv(mmc); 1063 struct mmci_host *host = mmc_priv(mmc);
1064 struct variant_data *variant = host->variant;
1018 u32 pwr = 0; 1065 u32 pwr = 0;
1019 unsigned long flags; 1066 unsigned long flags;
1020 int ret; 1067 int ret;
1021 1068
1069 pm_runtime_get_sync(mmc_dev(mmc));
1070
1071 if (host->plat->ios_handler &&
1072 host->plat->ios_handler(mmc_dev(mmc), ios))
1073 dev_err(mmc_dev(mmc), "platform ios_handler failed\n");
1074
1022 switch (ios->power_mode) { 1075 switch (ios->power_mode) {
1023 case MMC_POWER_OFF: 1076 case MMC_POWER_OFF:
1024 if (host->vcc) 1077 if (host->vcc)
@@ -1035,22 +1088,38 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1035 * power should be rare so we print an error 1088 * power should be rare so we print an error
1036 * and return here. 1089 * and return here.
1037 */ 1090 */
1038 return; 1091 goto out;
1039 } 1092 }
1040 } 1093 }
1041 if (host->plat->vdd_handler) 1094 /*
1042 pwr |= host->plat->vdd_handler(mmc_dev(mmc), ios->vdd, 1095 * The ST Micro variant doesn't have the PL180s MCI_PWR_UP
1043 ios->power_mode); 1096 * and instead uses MCI_PWR_ON so apply whatever value is
1044 /* The ST version does not have this, fall through to POWER_ON */ 1097 * configured in the variant data.
1045 if (host->hw_designer != AMBA_VENDOR_ST) { 1098 */
1046 pwr |= MCI_PWR_UP; 1099 pwr |= variant->pwrreg_powerup;
1047 break; 1100
1048 } 1101 break;
1049 case MMC_POWER_ON: 1102 case MMC_POWER_ON:
1050 pwr |= MCI_PWR_ON; 1103 pwr |= MCI_PWR_ON;
1051 break; 1104 break;
1052 } 1105 }
1053 1106
1107 if (variant->signal_direction && ios->power_mode != MMC_POWER_OFF) {
1108 /*
1109 * The ST Micro variant has some additional bits
1110 * indicating signal direction for the signals in
1111 * the SD/MMC bus and feedback-clock usage.
1112 */
1113 pwr |= host->plat->sigdir;
1114
1115 if (ios->bus_width == MMC_BUS_WIDTH_4)
1116 pwr &= ~MCI_ST_DATA74DIREN;
1117 else if (ios->bus_width == MMC_BUS_WIDTH_1)
1118 pwr &= (~MCI_ST_DATA74DIREN &
1119 ~MCI_ST_DATA31DIREN &
1120 ~MCI_ST_DATA2DIREN);
1121 }
1122
1054 if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN) { 1123 if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN) {
1055 if (host->hw_designer != AMBA_VENDOR_ST) 1124 if (host->hw_designer != AMBA_VENDOR_ST)
1056 pwr |= MCI_ROD; 1125 pwr |= MCI_ROD;
@@ -1066,13 +1135,13 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1066 spin_lock_irqsave(&host->lock, flags); 1135 spin_lock_irqsave(&host->lock, flags);
1067 1136
1068 mmci_set_clkreg(host, ios->clock); 1137 mmci_set_clkreg(host, ios->clock);
1069 1138 mmci_write_pwrreg(host, pwr);
1070 if (host->pwr != pwr) {
1071 host->pwr = pwr;
1072 writel(pwr, host->base + MMCIPOWER);
1073 }
1074 1139
1075 spin_unlock_irqrestore(&host->lock, flags); 1140 spin_unlock_irqrestore(&host->lock, flags);
1141
1142 out:
1143 pm_runtime_mark_last_busy(mmc_dev(mmc));
1144 pm_runtime_put_autosuspend(mmc_dev(mmc));
1076} 1145}
1077 1146
1078static int mmci_get_ro(struct mmc_host *mmc) 1147static int mmci_get_ro(struct mmc_host *mmc)
@@ -1346,6 +1415,8 @@ static int __devinit mmci_probe(struct amba_device *dev,
1346 1415
1347 mmci_dma_setup(host); 1416 mmci_dma_setup(host);
1348 1417
1418 pm_runtime_set_autosuspend_delay(&dev->dev, 50);
1419 pm_runtime_use_autosuspend(&dev->dev);
1349 pm_runtime_put(&dev->dev); 1420 pm_runtime_put(&dev->dev);
1350 1421
1351 mmc_add_host(mmc); 1422 mmc_add_host(mmc);
@@ -1430,43 +1501,49 @@ static int __devexit mmci_remove(struct amba_device *dev)
1430 return 0; 1501 return 0;
1431} 1502}
1432 1503
1433#ifdef CONFIG_PM 1504#ifdef CONFIG_SUSPEND
1434static int mmci_suspend(struct amba_device *dev, pm_message_t state) 1505static int mmci_suspend(struct device *dev)
1435{ 1506{
1436 struct mmc_host *mmc = amba_get_drvdata(dev); 1507 struct amba_device *adev = to_amba_device(dev);
1508 struct mmc_host *mmc = amba_get_drvdata(adev);
1437 int ret = 0; 1509 int ret = 0;
1438 1510
1439 if (mmc) { 1511 if (mmc) {
1440 struct mmci_host *host = mmc_priv(mmc); 1512 struct mmci_host *host = mmc_priv(mmc);
1441 1513
1442 ret = mmc_suspend_host(mmc); 1514 ret = mmc_suspend_host(mmc);
1443 if (ret == 0) 1515 if (ret == 0) {
1516 pm_runtime_get_sync(dev);
1444 writel(0, host->base + MMCIMASK0); 1517 writel(0, host->base + MMCIMASK0);
1518 }
1445 } 1519 }
1446 1520
1447 return ret; 1521 return ret;
1448} 1522}
1449 1523
1450static int mmci_resume(struct amba_device *dev) 1524static int mmci_resume(struct device *dev)
1451{ 1525{
1452 struct mmc_host *mmc = amba_get_drvdata(dev); 1526 struct amba_device *adev = to_amba_device(dev);
1527 struct mmc_host *mmc = amba_get_drvdata(adev);
1453 int ret = 0; 1528 int ret = 0;
1454 1529
1455 if (mmc) { 1530 if (mmc) {
1456 struct mmci_host *host = mmc_priv(mmc); 1531 struct mmci_host *host = mmc_priv(mmc);
1457 1532
1458 writel(MCI_IRQENABLE, host->base + MMCIMASK0); 1533 writel(MCI_IRQENABLE, host->base + MMCIMASK0);
1534 pm_runtime_put(dev);
1459 1535
1460 ret = mmc_resume_host(mmc); 1536 ret = mmc_resume_host(mmc);
1461 } 1537 }
1462 1538
1463 return ret; 1539 return ret;
1464} 1540}
1465#else
1466#define mmci_suspend NULL
1467#define mmci_resume NULL
1468#endif 1541#endif
1469 1542
1543static const struct dev_pm_ops mmci_dev_pm_ops = {
1544 SET_SYSTEM_SLEEP_PM_OPS(mmci_suspend, mmci_resume)
1545};
1546
1470static struct amba_id mmci_ids[] = { 1547static struct amba_id mmci_ids[] = {
1471 { 1548 {
1472 .id = 0x00041180, 1549 .id = 0x00041180,
@@ -1512,26 +1589,15 @@ MODULE_DEVICE_TABLE(amba, mmci_ids);
1512static struct amba_driver mmci_driver = { 1589static struct amba_driver mmci_driver = {
1513 .drv = { 1590 .drv = {
1514 .name = DRIVER_NAME, 1591 .name = DRIVER_NAME,
1592 .pm = &mmci_dev_pm_ops,
1515 }, 1593 },
1516 .probe = mmci_probe, 1594 .probe = mmci_probe,
1517 .remove = __devexit_p(mmci_remove), 1595 .remove = __devexit_p(mmci_remove),
1518 .suspend = mmci_suspend,
1519 .resume = mmci_resume,
1520 .id_table = mmci_ids, 1596 .id_table = mmci_ids,
1521}; 1597};
1522 1598
1523static int __init mmci_init(void) 1599module_amba_driver(mmci_driver);
1524{
1525 return amba_driver_register(&mmci_driver);
1526}
1527
1528static void __exit mmci_exit(void)
1529{
1530 amba_driver_unregister(&mmci_driver);
1531}
1532 1600
1533module_init(mmci_init);
1534module_exit(mmci_exit);
1535module_param(fmax, uint, 0444); 1601module_param(fmax, uint, 0444);
1536 1602
1537MODULE_DESCRIPTION("ARM PrimeCell PL180/181 Multimedia Card Interface driver"); 1603MODULE_DESCRIPTION("ARM PrimeCell PL180/181 Multimedia Card Interface driver");
diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h
index 79e4143ab9df..d437ccf62d6b 100644
--- a/drivers/mmc/host/mmci.h
+++ b/drivers/mmc/host/mmci.h
@@ -13,16 +13,6 @@
13#define MCI_PWR_ON 0x03 13#define MCI_PWR_ON 0x03
14#define MCI_OD (1 << 6) 14#define MCI_OD (1 << 6)
15#define MCI_ROD (1 << 7) 15#define MCI_ROD (1 << 7)
16/*
17 * The ST Micro version does not have ROD and reuse the voltage registers
18 * for direction settings
19 */
20#define MCI_ST_DATA2DIREN (1 << 2)
21#define MCI_ST_CMDDIREN (1 << 3)
22#define MCI_ST_DATA0DIREN (1 << 4)
23#define MCI_ST_DATA31DIREN (1 << 5)
24#define MCI_ST_FBCLKEN (1 << 7)
25#define MCI_ST_DATA74DIREN (1 << 8)
26 16
27#define MMCICLOCK 0x004 17#define MMCICLOCK 0x004
28#define MCI_CLK_ENABLE (1 << 8) 18#define MCI_CLK_ENABLE (1 << 8)
@@ -160,7 +150,7 @@
160 (MCI_RXFIFOHALFFULLMASK | MCI_RXDATAAVLBLMASK | \ 150 (MCI_RXFIFOHALFFULLMASK | MCI_RXDATAAVLBLMASK | \
161 MCI_TXFIFOHALFEMPTYMASK) 151 MCI_TXFIFOHALFEMPTYMASK)
162 152
163#define NR_SG 16 153#define NR_SG 128
164 154
165struct clk; 155struct clk;
166struct variant_data; 156struct variant_data;
@@ -189,7 +179,8 @@ struct mmci_host {
189 179
190 unsigned int mclk; 180 unsigned int mclk;
191 unsigned int cclk; 181 unsigned int cclk;
192 u32 pwr; 182 u32 pwr_reg;
183 u32 clk_reg;
193 struct mmci_platform_data *plat; 184 struct mmci_platform_data *plat;
194 struct variant_data *variant; 185 struct variant_data *variant;
195 186
diff --git a/drivers/rtc/rtc-pl030.c b/drivers/rtc/rtc-pl030.c
index a4a1e534ed42..22bacdbf9139 100644
--- a/drivers/rtc/rtc-pl030.c
+++ b/drivers/rtc/rtc-pl030.c
@@ -185,18 +185,7 @@ static struct amba_driver pl030_driver = {
185 .id_table = pl030_ids, 185 .id_table = pl030_ids,
186}; 186};
187 187
188static int __init pl030_init(void) 188module_amba_driver(pl030_driver);
189{
190 return amba_driver_register(&pl030_driver);
191}
192
193static void __exit pl030_exit(void)
194{
195 amba_driver_unregister(&pl030_driver);
196}
197
198module_init(pl030_init);
199module_exit(pl030_exit);
200 189
201MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); 190MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
202MODULE_DESCRIPTION("ARM AMBA PL030 RTC Driver"); 191MODULE_DESCRIPTION("ARM AMBA PL030 RTC Driver");
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
index 3a470e291282..692de7360e94 100644
--- a/drivers/rtc/rtc-pl031.c
+++ b/drivers/rtc/rtc-pl031.c
@@ -431,18 +431,7 @@ static struct amba_driver pl031_driver = {
431 .remove = pl031_remove, 431 .remove = pl031_remove,
432}; 432};
433 433
434static int __init pl031_init(void) 434module_amba_driver(pl031_driver);
435{
436 return amba_driver_register(&pl031_driver);
437}
438
439static void __exit pl031_exit(void)
440{
441 amba_driver_unregister(&pl031_driver);
442}
443
444module_init(pl031_init);
445module_exit(pl031_exit);
446 435
447MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net"); 436MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net");
448MODULE_DESCRIPTION("ARM AMBA PL031 RTC Driver"); 437MODULE_DESCRIPTION("ARM AMBA PL031 RTC Driver");
diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c
index eef1524ae52e..3ff9e47bd218 100644
--- a/drivers/watchdog/sp805_wdt.c
+++ b/drivers/watchdog/sp805_wdt.c
@@ -370,17 +370,7 @@ static struct amba_driver sp805_wdt_driver = {
370 .remove = __devexit_p(sp805_wdt_remove), 370 .remove = __devexit_p(sp805_wdt_remove),
371}; 371};
372 372
373static int __init sp805_wdt_init(void) 373module_amba_driver(sp805_wdt_driver);
374{
375 return amba_driver_register(&sp805_wdt_driver);
376}
377module_init(sp805_wdt_init);
378
379static void __exit sp805_wdt_exit(void)
380{
381 amba_driver_unregister(&sp805_wdt_driver);
382}
383module_exit(sp805_wdt_exit);
384 374
385module_param(nowayout, int, 0); 375module_param(nowayout, int, 0);
386MODULE_PARM_DESC(nowayout, 376MODULE_PARM_DESC(nowayout,
diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h
index a9fab831caf8..7847e197730a 100644
--- a/include/linux/amba/bus.h
+++ b/include/linux/amba/bus.h
@@ -125,4 +125,13 @@ struct amba_device name##_device = { \
125 .periphid = id, \ 125 .periphid = id, \
126} 126}
127 127
128/*
129 * module_amba_driver() - Helper macro for drivers that don't do anything
130 * special in module init/exit. This eliminates a lot of boilerplate. Each
131 * module may only use this macro once, and calling it replaces module_init()
132 * and module_exit()
133 */
134#define module_amba_driver(__amba_drv) \
135 module_driver(__amba_drv, amba_driver_register, amba_driver_unregister)
136
128#endif 137#endif
diff --git a/include/linux/amba/mmci.h b/include/linux/amba/mmci.h
index 0101e9c17fa1..32a89cf5ec45 100644
--- a/include/linux/amba/mmci.h
+++ b/include/linux/amba/mmci.h
@@ -6,6 +6,19 @@
6 6
7#include <linux/mmc/host.h> 7#include <linux/mmc/host.h>
8 8
9
10/*
11 * These defines is places here due to access is needed from machine
12 * configuration files. The ST Micro version does not have ROD and
13 * reuse the voltage registers for direction settings.
14 */
15#define MCI_ST_DATA2DIREN (1 << 2)
16#define MCI_ST_CMDDIREN (1 << 3)
17#define MCI_ST_DATA0DIREN (1 << 4)
18#define MCI_ST_DATA31DIREN (1 << 5)
19#define MCI_ST_FBCLKEN (1 << 7)
20#define MCI_ST_DATA74DIREN (1 << 8)
21
9/* Just some dummy forwarding */ 22/* Just some dummy forwarding */
10struct dma_chan; 23struct dma_chan;
11 24
@@ -18,7 +31,8 @@ struct dma_chan;
18 * @ocr_mask: available voltages on the 4 pins from the block, this 31 * @ocr_mask: available voltages on the 4 pins from the block, this
19 * is ignored if a regulator is used, see the MMC_VDD_* masks in 32 * is ignored if a regulator is used, see the MMC_VDD_* masks in
20 * mmc/host.h 33 * mmc/host.h
21 * @vdd_handler: a callback function to translate a MMC_VDD_* 34 * @ios_handler: a callback function to act on specfic ios changes,
35 * used for example to control a levelshifter
22 * mask into a value to be binary (or set some other custom bits 36 * mask into a value to be binary (or set some other custom bits
23 * in MMCIPWR) or:ed and written into the MMCIPWR register of the 37 * in MMCIPWR) or:ed and written into the MMCIPWR register of the
24 * block. May also control external power based on the power_mode. 38 * block. May also control external power based on the power_mode.
@@ -31,6 +45,8 @@ struct dma_chan;
31 * @capabilities: the capabilities of the block as implemented in 45 * @capabilities: the capabilities of the block as implemented in
32 * this platform, signify anything MMC_CAP_* from mmc/host.h 46 * this platform, signify anything MMC_CAP_* from mmc/host.h
33 * @capabilities2: more capabilities, MMC_CAP2_* from mmc/host.h 47 * @capabilities2: more capabilities, MMC_CAP2_* from mmc/host.h
48 * @sigdir: a bit field indicating for what bits in the MMC bus the host
49 * should enable signal direction indication.
34 * @dma_filter: function used to select an appropriate RX and TX 50 * @dma_filter: function used to select an appropriate RX and TX
35 * DMA channel to be used for DMA, if and only if you're deploying the 51 * DMA channel to be used for DMA, if and only if you're deploying the
36 * generic DMA engine 52 * generic DMA engine
@@ -46,14 +62,14 @@ struct dma_chan;
46struct mmci_platform_data { 62struct mmci_platform_data {
47 unsigned int f_max; 63 unsigned int f_max;
48 unsigned int ocr_mask; 64 unsigned int ocr_mask;
49 u32 (*vdd_handler)(struct device *, unsigned int vdd, 65 int (*ios_handler)(struct device *, struct mmc_ios *);
50 unsigned char power_mode);
51 unsigned int (*status)(struct device *); 66 unsigned int (*status)(struct device *);
52 int gpio_wp; 67 int gpio_wp;
53 int gpio_cd; 68 int gpio_cd;
54 bool cd_invert; 69 bool cd_invert;
55 unsigned long capabilities; 70 unsigned long capabilities;
56 unsigned long capabilities2; 71 unsigned long capabilities2;
72 u32 sigdir;
57 bool (*dma_filter)(struct dma_chan *chan, void *filter_param); 73 bool (*dma_filter)(struct dma_chan *chan, void *filter_param);
58 void *dma_rx_param; 74 void *dma_rx_param;
59 void *dma_tx_param; 75 void *dma_tx_param;
diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c
index b37b702a3a6a..5119fdabcb98 100644
--- a/sound/arm/aaci.c
+++ b/sound/arm/aaci.c
@@ -1110,18 +1110,7 @@ static struct amba_driver aaci_driver = {
1110 .id_table = aaci_ids, 1110 .id_table = aaci_ids,
1111}; 1111};
1112 1112
1113static int __init aaci_init(void) 1113module_amba_driver(aaci_driver);
1114{
1115 return amba_driver_register(&aaci_driver);
1116}
1117
1118static void __exit aaci_exit(void)
1119{
1120 amba_driver_unregister(&aaci_driver);
1121}
1122
1123module_init(aaci_init);
1124module_exit(aaci_exit);
1125 1114
1126MODULE_LICENSE("GPL"); 1115MODULE_LICENSE("GPL");
1127MODULE_DESCRIPTION("ARM PrimeCell PL041 Advanced Audio CODEC Interface driver"); 1116MODULE_DESCRIPTION("ARM PrimeCell PL041 Advanced Audio CODEC Interface driver");