blob: 4e30b6dc9ac53a360e5c3745387126d0e4ce9d3f [file] [log] [blame]
Hanumath Prasad008f8a22010-08-19 12:06:32 +01001/*
2 * Copyright (C) ST-Ericsson SA 2010
3 *
4 * Author: Hanumath Prasad <hanumath.prasad@stericsson.com>
5 * License terms: GNU General Public License (GPL) version 2
6 */
7
8#include <linux/kernel.h>
9#include <linux/gpio.h>
10#include <linux/amba/bus.h>
11#include <linux/amba/mmci.h>
12#include <linux/mmc/host.h>
13#include <linux/platform_device.h>
Linus Walleij865fab62012-10-18 14:20:16 +020014#include <linux/platform_data/dma-ste-dma40.h>
Hanumath Prasad008f8a22010-08-19 12:06:32 +010015
Linus Walleij4b4f7572011-02-15 15:01:35 +010016#include <asm/mach-types.h>
Arnd Bergmanne657bcf2013-03-21 22:51:12 +010017#include "devices.h"
Hanumath Prasad008f8a22010-08-19 12:06:32 +010018
Linus Walleij174e7792013-03-19 15:41:55 +010019#include "db8500-regs.h"
Rabin Vincentfbf1ead2010-09-29 19:46:32 +053020#include "devices-db8500.h"
Hanumath Prasad008f8a22010-08-19 12:06:32 +010021#include "board-mop500.h"
Linus Walleij5d7b8462010-10-14 13:57:59 +020022#include "ste-dma40-db8500.h"
Hanumath Prasad008f8a22010-08-19 12:06:32 +010023
Hanumath Prasad008f8a22010-08-19 12:06:32 +010024/*
Linus Walleijc15def12011-12-15 13:38:40 +010025 * v2 has a new version of this block that need to be forced, the number found
26 * in hardware is incorrect
27 */
28#define U8500_SDI_V2_PERIPHID 0x10480180
29
30/*
Rabin Vincentb8410a12010-08-09 19:18:17 +053031 * SDI 0 (MicroSD slot)
32 */
33
Linus Walleij5d7b8462010-10-14 13:57:59 +020034#ifdef CONFIG_STE_DMA40
35struct stedma40_chan_cfg mop500_sdi0_dma_cfg_rx = {
36 .mode = STEDMA40_MODE_LOGICAL,
37 .dir = STEDMA40_PERIPH_TO_MEM,
Lee Jones26955c07d2013-05-03 15:31:56 +010038 .dev_type = DB8500_DMA_DEV29_SD_MM0,
Linus Walleij5d7b8462010-10-14 13:57:59 +020039 .src_info.data_width = STEDMA40_WORD_WIDTH,
40 .dst_info.data_width = STEDMA40_WORD_WIDTH,
41};
42
43static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = {
44 .mode = STEDMA40_MODE_LOGICAL,
45 .dir = STEDMA40_MEM_TO_PERIPH,
Lee Jones26955c07d2013-05-03 15:31:56 +010046 .dev_type = DB8500_DMA_DEV29_SD_MM0,
Linus Walleij5d7b8462010-10-14 13:57:59 +020047 .src_info.data_width = STEDMA40_WORD_WIDTH,
48 .dst_info.data_width = STEDMA40_WORD_WIDTH,
49};
50#endif
51
Lee Jones5e1ac7d2012-05-29 14:40:04 +080052struct mmci_platform_data mop500_sdi0_data = {
Rabin Vincentb8410a12010-08-09 19:18:17 +053053 .ocr_mask = MMC_VDD_29_30,
Linus Walleij02a73432011-03-30 16:00:39 +020054 .f_max = 50000000,
55 .capabilities = MMC_CAP_4_BIT_DATA |
56 MMC_CAP_SD_HIGHSPEED |
57 MMC_CAP_MMC_HIGHSPEED,
Rabin Vincentb8410a12010-08-09 19:18:17 +053058 .gpio_wp = -1,
Ulf Hanssonbc521812011-12-13 16:57:55 +010059 .sigdir = MCI_ST_FBCLKEN |
60 MCI_ST_CMDDIREN |
61 MCI_ST_DATA0DIREN |
62 MCI_ST_DATA2DIREN,
Linus Walleij5d7b8462010-10-14 13:57:59 +020063#ifdef CONFIG_STE_DMA40
64 .dma_filter = stedma40_filter,
65 .dma_rx_param = &mop500_sdi0_dma_cfg_rx,
66 .dma_tx_param = &mop500_sdi0_dma_cfg_tx,
67#endif
Rabin Vincentb8410a12010-08-09 19:18:17 +053068};
69
Lee Jones18403422012-02-06 11:22:21 -080070static void sdi0_configure(struct device *parent)
Rabin Vincentb8410a12010-08-09 19:18:17 +053071{
Linus Walleij72930312011-03-24 16:13:13 +010072 /* Add the device, force v2 to subrevision 1 */
Lee Jones18403422012-02-06 11:22:21 -080073 db8500_add_sdi0(parent, &mop500_sdi0_data, U8500_SDI_V2_PERIPHID);
Rabin Vincentb8410a12010-08-09 19:18:17 +053074}
75
Lee Jones18403422012-02-06 11:22:21 -080076void mop500_sdi_tc35892_init(struct device *parent)
Linus Walleij4b4f7572011-02-15 15:01:35 +010077{
78 mop500_sdi0_data.gpio_cd = GPIO_SDMMC_CD;
Lee Jones18403422012-02-06 11:22:21 -080079 sdi0_configure(parent);
Linus Walleij4b4f7572011-02-15 15:01:35 +010080}
81
Rabin Vincentb8410a12010-08-09 19:18:17 +053082/*
Stefan Nilsson XK76d67172011-10-26 10:50:42 +020083 * SDI1 (SDIO WLAN)
84 */
85#ifdef CONFIG_STE_DMA40
86static struct stedma40_chan_cfg sdi1_dma_cfg_rx = {
87 .mode = STEDMA40_MODE_LOGICAL,
88 .dir = STEDMA40_PERIPH_TO_MEM,
Lee Jones26955c07d2013-05-03 15:31:56 +010089 .dev_type = DB8500_DMA_DEV32_SD_MM1,
Stefan Nilsson XK76d67172011-10-26 10:50:42 +020090 .src_info.data_width = STEDMA40_WORD_WIDTH,
91 .dst_info.data_width = STEDMA40_WORD_WIDTH,
92};
93
94static struct stedma40_chan_cfg sdi1_dma_cfg_tx = {
95 .mode = STEDMA40_MODE_LOGICAL,
96 .dir = STEDMA40_MEM_TO_PERIPH,
Lee Jones26955c07d2013-05-03 15:31:56 +010097 .dev_type = DB8500_DMA_DEV32_SD_MM1,
Stefan Nilsson XK76d67172011-10-26 10:50:42 +020098 .src_info.data_width = STEDMA40_WORD_WIDTH,
99 .dst_info.data_width = STEDMA40_WORD_WIDTH,
100};
101#endif
102
Lee Jones9cf24b12012-08-30 16:11:08 +0100103struct mmci_platform_data mop500_sdi1_data = {
Stefan Nilsson XK76d67172011-10-26 10:50:42 +0200104 .ocr_mask = MMC_VDD_29_30,
105 .f_max = 50000000,
106 .capabilities = MMC_CAP_4_BIT_DATA,
107 .gpio_cd = -1,
108 .gpio_wp = -1,
109#ifdef CONFIG_STE_DMA40
110 .dma_filter = stedma40_filter,
111 .dma_rx_param = &sdi1_dma_cfg_rx,
112 .dma_tx_param = &sdi1_dma_cfg_tx,
113#endif
114};
115
116/*
Hanumath Prasad008f8a22010-08-19 12:06:32 +0100117 * SDI 2 (POP eMMC, not on DB8500ed)
118 */
119
Linus Walleij5d7b8462010-10-14 13:57:59 +0200120#ifdef CONFIG_STE_DMA40
121struct stedma40_chan_cfg mop500_sdi2_dma_cfg_rx = {
122 .mode = STEDMA40_MODE_LOGICAL,
123 .dir = STEDMA40_PERIPH_TO_MEM,
Lee Jones26955c07d2013-05-03 15:31:56 +0100124 .dev_type = DB8500_DMA_DEV28_SD_MM2,
Linus Walleij5d7b8462010-10-14 13:57:59 +0200125 .src_info.data_width = STEDMA40_WORD_WIDTH,
126 .dst_info.data_width = STEDMA40_WORD_WIDTH,
127};
128
129static struct stedma40_chan_cfg mop500_sdi2_dma_cfg_tx = {
130 .mode = STEDMA40_MODE_LOGICAL,
131 .dir = STEDMA40_MEM_TO_PERIPH,
Lee Jones26955c07d2013-05-03 15:31:56 +0100132 .dev_type = DB8500_DMA_DEV28_SD_MM2,
Linus Walleij5d7b8462010-10-14 13:57:59 +0200133 .src_info.data_width = STEDMA40_WORD_WIDTH,
134 .dst_info.data_width = STEDMA40_WORD_WIDTH,
135};
136#endif
137
Lee Jones9cf24b12012-08-30 16:11:08 +0100138struct mmci_platform_data mop500_sdi2_data = {
Hanumath Prasad008f8a22010-08-19 12:06:32 +0100139 .ocr_mask = MMC_VDD_165_195,
Linus Walleij02a73432011-03-30 16:00:39 +0200140 .f_max = 50000000,
Linus Walleijc15def12011-12-15 13:38:40 +0100141 .capabilities = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA |
142 MMC_CAP_MMC_HIGHSPEED,
Hanumath Prasad008f8a22010-08-19 12:06:32 +0100143 .gpio_cd = -1,
144 .gpio_wp = -1,
Linus Walleij5d7b8462010-10-14 13:57:59 +0200145#ifdef CONFIG_STE_DMA40
146 .dma_filter = stedma40_filter,
147 .dma_rx_param = &mop500_sdi2_dma_cfg_rx,
148 .dma_tx_param = &mop500_sdi2_dma_cfg_tx,
149#endif
Hanumath Prasad008f8a22010-08-19 12:06:32 +0100150};
151
152/*
153 * SDI 4 (on-board eMMC)
154 */
155
Linus Walleij5d7b8462010-10-14 13:57:59 +0200156#ifdef CONFIG_STE_DMA40
157struct stedma40_chan_cfg mop500_sdi4_dma_cfg_rx = {
158 .mode = STEDMA40_MODE_LOGICAL,
159 .dir = STEDMA40_PERIPH_TO_MEM,
Lee Jones26955c07d2013-05-03 15:31:56 +0100160 .dev_type = DB8500_DMA_DEV42_SD_MM4,
Linus Walleij5d7b8462010-10-14 13:57:59 +0200161 .src_info.data_width = STEDMA40_WORD_WIDTH,
162 .dst_info.data_width = STEDMA40_WORD_WIDTH,
163};
164
165static struct stedma40_chan_cfg mop500_sdi4_dma_cfg_tx = {
166 .mode = STEDMA40_MODE_LOGICAL,
167 .dir = STEDMA40_MEM_TO_PERIPH,
Lee Jones26955c07d2013-05-03 15:31:56 +0100168 .dev_type = DB8500_DMA_DEV42_SD_MM4,
Linus Walleij5d7b8462010-10-14 13:57:59 +0200169 .src_info.data_width = STEDMA40_WORD_WIDTH,
170 .dst_info.data_width = STEDMA40_WORD_WIDTH,
171};
172#endif
173
Lee Jones5e1ac7d2012-05-29 14:40:04 +0800174struct mmci_platform_data mop500_sdi4_data = {
Hanumath Prasad008f8a22010-08-19 12:06:32 +0100175 .ocr_mask = MMC_VDD_29_30,
Linus Walleij02a73432011-03-30 16:00:39 +0200176 .f_max = 50000000,
Hanumath Prasad008f8a22010-08-19 12:06:32 +0100177 .capabilities = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA |
178 MMC_CAP_MMC_HIGHSPEED,
179 .gpio_cd = -1,
180 .gpio_wp = -1,
Linus Walleij5d7b8462010-10-14 13:57:59 +0200181#ifdef CONFIG_STE_DMA40
182 .dma_filter = stedma40_filter,
183 .dma_rx_param = &mop500_sdi4_dma_cfg_rx,
184 .dma_tx_param = &mop500_sdi4_dma_cfg_tx,
185#endif
Hanumath Prasad008f8a22010-08-19 12:06:32 +0100186};
187
Lee Jones18403422012-02-06 11:22:21 -0800188void __init mop500_sdi_init(struct device *parent)
Hanumath Prasad008f8a22010-08-19 12:06:32 +0100189{
Linus Walleijc15def12011-12-15 13:38:40 +0100190 /* PoP:ed eMMC */
Lee Jones18403422012-02-06 11:22:21 -0800191 db8500_add_sdi2(parent, &mop500_sdi2_data, U8500_SDI_V2_PERIPHID);
Bibek Basu4bc3a692011-02-15 10:46:59 +0100192 /* On-board eMMC */
Lee Jones18403422012-02-06 11:22:21 -0800193 db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID);
194
Linus Walleijedaa86a2010-12-02 12:05:18 +0100195 /*
Linus Walleij4b4f7572011-02-15 15:01:35 +0100196 * On boards with the TC35892 GPIO expander, sdi0 will finally
197 * be added when the TC35892 initializes and calls
Linus Walleijedaa86a2010-12-02 12:05:18 +0100198 * mop500_sdi_tc35892_init() above.
199 */
Hanumath Prasad008f8a22010-08-19 12:06:32 +0100200}
Lee Jones110c2c22011-08-26 16:54:07 +0100201
Lee Jones18403422012-02-06 11:22:21 -0800202void __init snowball_sdi_init(struct device *parent)
Lee Jones110c2c22011-08-26 16:54:07 +0100203{
Philippe Langlais2ab11592012-01-20 09:20:40 +0100204 /* On Snowball MMC_CAP_SD_HIGHSPEED isn't supported (Hardware issue?) */
205 mop500_sdi0_data.capabilities &= ~MMC_CAP_SD_HIGHSPEED;
Lee Jones110c2c22011-08-26 16:54:07 +0100206 /* On-board eMMC */
Lee Jones18403422012-02-06 11:22:21 -0800207 db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID);
Linus Walleijc15def12011-12-15 13:38:40 +0100208 /* External Micro SD slot */
Lee Jones110c2c22011-08-26 16:54:07 +0100209 mop500_sdi0_data.gpio_cd = SNOWBALL_SDMMC_CD_GPIO;
210 mop500_sdi0_data.cd_invert = true;
Lee Jones18403422012-02-06 11:22:21 -0800211 sdi0_configure(parent);
Lee Jones110c2c22011-08-26 16:54:07 +0100212}
213
Lee Jones18403422012-02-06 11:22:21 -0800214void __init hrefv60_sdi_init(struct device *parent)
Lee Jones110c2c22011-08-26 16:54:07 +0100215{
Linus Walleijc15def12011-12-15 13:38:40 +0100216 /* PoP:ed eMMC */
Lee Jones18403422012-02-06 11:22:21 -0800217 db8500_add_sdi2(parent, &mop500_sdi2_data, U8500_SDI_V2_PERIPHID);
Lee Jones110c2c22011-08-26 16:54:07 +0100218 /* On-board eMMC */
Lee Jones18403422012-02-06 11:22:21 -0800219 db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID);
Linus Walleijc15def12011-12-15 13:38:40 +0100220 /* External Micro SD slot */
Lee Jones110c2c22011-08-26 16:54:07 +0100221 mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO;
Lee Jones18403422012-02-06 11:22:21 -0800222 sdi0_configure(parent);
Linus Walleijc15def12011-12-15 13:38:40 +0100223 /* WLAN SDIO channel */
Lee Jones18403422012-02-06 11:22:21 -0800224 db8500_add_sdi1(parent, &mop500_sdi1_data, U8500_SDI_V2_PERIPHID);
Lee Jones110c2c22011-08-26 16:54:07 +0100225}