diff options
-rw-r--r-- | arch/arm/mach-realview/include/mach/irqs-eb.h | 23 | ||||
-rw-r--r-- | arch/arm/mach-u300/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-u300/core.c | 38 | ||||
-rw-r--r-- | arch/arm/mach-u300/mmc.c | 52 | ||||
-rw-r--r-- | arch/arm/mach-u300/mmc.h | 18 | ||||
-rw-r--r-- | arch/arm/mach-ux500/board-mop500-sdi.c | 21 | ||||
-rw-r--r-- | drivers/char/hw_random/nomadik-rng.c | 13 | ||||
-rw-r--r-- | drivers/dma/pl330.c | 13 | ||||
-rw-r--r-- | drivers/input/serio/ambakmi.c | 13 | ||||
-rw-r--r-- | drivers/mmc/host/mmci.c | 178 | ||||
-rw-r--r-- | drivers/mmc/host/mmci.h | 15 | ||||
-rw-r--r-- | drivers/rtc/rtc-pl030.c | 13 | ||||
-rw-r--r-- | drivers/rtc/rtc-pl031.c | 13 | ||||
-rw-r--r-- | drivers/watchdog/sp805_wdt.c | 12 | ||||
-rw-r--r-- | include/linux/amba/bus.h | 9 | ||||
-rw-r--r-- | include/linux/amba/mmci.h | 22 | ||||
-rw-r--r-- | sound/arm/aaci.c | 13 |
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 := | |||
8 | obj- := | 8 | obj- := |
9 | 9 | ||
10 | obj-$(CONFIG_ARCH_U300) += u300.o | 10 | obj-$(CONFIG_ARCH_U300) += u300.o |
11 | obj-$(CONFIG_MMC) += mmc.o | ||
12 | obj-$(CONFIG_SPI_PL022) += spi.o | 11 | obj-$(CONFIG_SPI_PL022) += spi.o |
13 | obj-$(CONFIG_MACH_U300_SPIDUMMY) += dummyspichip.o | 12 | obj-$(CONFIG_MACH_U300_SPIDUMMY) += dummyspichip.o |
14 | obj-$(CONFIG_I2C_STU300) += i2c.o | 13 | obj-$(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 */ |
118 | static AMBA_APB_DEVICE(pl172, "pl172", 0, U300_EMIF_CFG_BASE, { }, NULL); | 119 | static 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 */ |
126 | static AMBA_APB_DEVICE(pl022, "pl022", 0, U300_SPI_BASE, | 122 | static 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 | ||
128 | static 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 | |||
132 | static AMBA_APB_DEVICE(mmcsd, "mmci", 0, U300_MMCSD_BASE, | 146 | static 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 | ||
1833 | static 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 | } | ||
1841 | module_init(core_module_init); | ||
1842 | |||
1843 | /* Forward declare this function from the watchdog */ | 1847 | /* Forward declare this function from the watchdog */ |
1844 | void coh901327_watchdog_reset(void); | 1848 | void 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 | |||
25 | static 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 | |||
44 | int __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 | |||
16 | int __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 */ |
42 | static int sdi0_en = -1; | 35 | static int sdi0_en = -1; |
43 | static int sdi0_vsel = -1; | 36 | static int sdi0_vsel = -1; |
44 | 37 | ||
45 | static u32 mop500_sdi0_vdd_handler(struct device *dev, unsigned int vdd, | 38 | static 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 | ||
92 | static struct mmci_platform_data mop500_sdi0_data = { | 83 | static 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 | ||
110 | static int __init nmk_rng_init(void) | 110 | module_amba_driver(nmk_rng_driver); |
111 | { | ||
112 | return amba_driver_register(&nmk_rng_driver); | ||
113 | } | ||
114 | |||
115 | static void __devexit nmk_rng_exit(void) | ||
116 | { | ||
117 | amba_driver_unregister(&nmk_rng_driver); | ||
118 | } | ||
119 | |||
120 | module_init(nmk_rng_init); | ||
121 | module_exit(nmk_rng_exit); | ||
122 | 111 | ||
123 | MODULE_LICENSE("GPL"); | 112 | MODULE_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 | ||
1038 | static int __init pl330_init(void) | 1038 | module_amba_driver(pl330_driver); |
1039 | { | ||
1040 | return amba_driver_register(&pl330_driver); | ||
1041 | } | ||
1042 | module_init(pl330_init); | ||
1043 | |||
1044 | static void __exit pl330_exit(void) | ||
1045 | { | ||
1046 | amba_driver_unregister(&pl330_driver); | ||
1047 | return; | ||
1048 | } | ||
1049 | module_exit(pl330_exit); | ||
1050 | 1039 | ||
1051 | MODULE_AUTHOR("Jaswinder Singh <jassi.brar@samsung.com>"); | 1040 | MODULE_AUTHOR("Jaswinder Singh <jassi.brar@samsung.com>"); |
1052 | MODULE_DESCRIPTION("API Driver for PL330 DMAC"); | 1041 | MODULE_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 | ||
211 | static int __init amba_kmi_init(void) | 211 | module_amba_driver(ambakmi_driver); |
212 | { | ||
213 | return amba_driver_register(&ambakmi_driver); | ||
214 | } | ||
215 | |||
216 | static void __exit amba_kmi_exit(void) | ||
217 | { | ||
218 | amba_driver_unregister(&ambakmi_driver); | ||
219 | } | ||
220 | |||
221 | module_init(amba_kmi_init); | ||
222 | module_exit(amba_kmi_exit); | ||
223 | 212 | ||
224 | MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); | 213 | MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); |
225 | MODULE_DESCRIPTION("AMBA KMI controller driver"); | 214 | MODULE_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 | */ |
57 | struct variant_data { | 59 | struct 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 | ||
68 | static struct variant_data variant_arm = { | 72 | static 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 | ||
74 | static struct variant_data variant_arm_extended_fifo = { | 79 | static 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 | ||
80 | static struct variant_data variant_u300 = { | 86 | static 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 | ||
88 | static struct variant_data variant_ux500 = { | 96 | static 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 | ||
98 | static struct variant_data variant_ux500v2 = { | 108 | static 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 | */ |
124 | static 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 | */ | ||
135 | static 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 | */ | ||
112 | static void mmci_set_clkreg(struct mmci_host *host, unsigned int desired) | 146 | static 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 | ||
159 | static void | 193 | static 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 | ||
179 | static void mmci_set_mask1(struct mmci_host *host, unsigned int mask) | 209 | static 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) | |||
1015 | static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | 1061 | static 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 | ||
1078 | static int mmci_get_ro(struct mmc_host *mmc) | 1147 | static 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 |
1434 | static int mmci_suspend(struct amba_device *dev, pm_message_t state) | 1505 | static 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 | ||
1450 | static int mmci_resume(struct amba_device *dev) | 1524 | static 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 | ||
1543 | static const struct dev_pm_ops mmci_dev_pm_ops = { | ||
1544 | SET_SYSTEM_SLEEP_PM_OPS(mmci_suspend, mmci_resume) | ||
1545 | }; | ||
1546 | |||
1470 | static struct amba_id mmci_ids[] = { | 1547 | static struct amba_id mmci_ids[] = { |
1471 | { | 1548 | { |
1472 | .id = 0x00041180, | 1549 | .id = 0x00041180, |
@@ -1512,26 +1589,15 @@ MODULE_DEVICE_TABLE(amba, mmci_ids); | |||
1512 | static struct amba_driver mmci_driver = { | 1589 | static 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 | ||
1523 | static int __init mmci_init(void) | 1599 | module_amba_driver(mmci_driver); |
1524 | { | ||
1525 | return amba_driver_register(&mmci_driver); | ||
1526 | } | ||
1527 | |||
1528 | static void __exit mmci_exit(void) | ||
1529 | { | ||
1530 | amba_driver_unregister(&mmci_driver); | ||
1531 | } | ||
1532 | 1600 | ||
1533 | module_init(mmci_init); | ||
1534 | module_exit(mmci_exit); | ||
1535 | module_param(fmax, uint, 0444); | 1601 | module_param(fmax, uint, 0444); |
1536 | 1602 | ||
1537 | MODULE_DESCRIPTION("ARM PrimeCell PL180/181 Multimedia Card Interface driver"); | 1603 | MODULE_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 | ||
165 | struct clk; | 155 | struct clk; |
166 | struct variant_data; | 156 | struct 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 | ||
188 | static int __init pl030_init(void) | 188 | module_amba_driver(pl030_driver); |
189 | { | ||
190 | return amba_driver_register(&pl030_driver); | ||
191 | } | ||
192 | |||
193 | static void __exit pl030_exit(void) | ||
194 | { | ||
195 | amba_driver_unregister(&pl030_driver); | ||
196 | } | ||
197 | |||
198 | module_init(pl030_init); | ||
199 | module_exit(pl030_exit); | ||
200 | 189 | ||
201 | MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); | 190 | MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); |
202 | MODULE_DESCRIPTION("ARM AMBA PL030 RTC Driver"); | 191 | MODULE_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 | ||
434 | static int __init pl031_init(void) | 434 | module_amba_driver(pl031_driver); |
435 | { | ||
436 | return amba_driver_register(&pl031_driver); | ||
437 | } | ||
438 | |||
439 | static void __exit pl031_exit(void) | ||
440 | { | ||
441 | amba_driver_unregister(&pl031_driver); | ||
442 | } | ||
443 | |||
444 | module_init(pl031_init); | ||
445 | module_exit(pl031_exit); | ||
446 | 435 | ||
447 | MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net"); | 436 | MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net"); |
448 | MODULE_DESCRIPTION("ARM AMBA PL031 RTC Driver"); | 437 | MODULE_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 | ||
373 | static int __init sp805_wdt_init(void) | 373 | module_amba_driver(sp805_wdt_driver); |
374 | { | ||
375 | return amba_driver_register(&sp805_wdt_driver); | ||
376 | } | ||
377 | module_init(sp805_wdt_init); | ||
378 | |||
379 | static void __exit sp805_wdt_exit(void) | ||
380 | { | ||
381 | amba_driver_unregister(&sp805_wdt_driver); | ||
382 | } | ||
383 | module_exit(sp805_wdt_exit); | ||
384 | 374 | ||
385 | module_param(nowayout, int, 0); | 375 | module_param(nowayout, int, 0); |
386 | MODULE_PARM_DESC(nowayout, | 376 | MODULE_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 */ |
10 | struct dma_chan; | 23 | struct 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; | |||
46 | struct mmci_platform_data { | 62 | struct 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 | ||
1113 | static int __init aaci_init(void) | 1113 | module_amba_driver(aaci_driver); |
1114 | { | ||
1115 | return amba_driver_register(&aaci_driver); | ||
1116 | } | ||
1117 | |||
1118 | static void __exit aaci_exit(void) | ||
1119 | { | ||
1120 | amba_driver_unregister(&aaci_driver); | ||
1121 | } | ||
1122 | |||
1123 | module_init(aaci_init); | ||
1124 | module_exit(aaci_exit); | ||
1125 | 1114 | ||
1126 | MODULE_LICENSE("GPL"); | 1115 | MODULE_LICENSE("GPL"); |
1127 | MODULE_DESCRIPTION("ARM PrimeCell PL041 Advanced Audio CODEC Interface driver"); | 1116 | MODULE_DESCRIPTION("ARM PrimeCell PL041 Advanced Audio CODEC Interface driver"); |