2 * linux/arch/arm/mach-omap2/board-n800-mmc.c
4 * Copyright (C) 2006 Nokia Corporation
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/delay.h>
13 #include <linux/platform_device.h>
14 #include <linux/i2c/menelaus.h>
16 #include <asm/mach-types.h>
19 #include <mach/gpio.h>
21 #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
23 static const int slot_switch_gpio = 96;
25 static const int n810_slot2_pw_vddf = 23;
26 static const int n810_slot2_pw_vdd = 9;
28 static int slot1_cover_open;
29 static int slot2_cover_open;
30 static struct device *mmc_device;
33 * VMMC --> slot 1 (N800 & N810)
34 * VDCDC3_APE, VMCS2_APE --> slot 2 on N800
35 * GPIO96 --> Menelaus GPIO2
36 * GPIO23 --> controls slot2 VSD (N810 only)
37 * GPIO9 --> controls slot2 VIO_SD (N810 only)
40 static int n800_mmc_switch_slot(struct device *dev, int slot)
42 #ifdef CONFIG_MMC_DEBUG
43 dev_dbg(dev, "Choose slot %d\n", slot + 1);
46 omap_set_gpio_dataout(slot_switch_gpio, 0);
48 omap_set_gpio_dataout(slot_switch_gpio, 1);
52 static int n800_mmc_set_power_menelaus(struct device *dev, int slot,
53 int power_on, int vdd)
57 #ifdef CONFIG_MMC_DEBUG
58 dev_dbg(dev, "Set slot %d power: %s (vdd %d)\n", slot + 1,
59 power_on ? "on" : "off", vdd);
63 return menelaus_set_vmmc(0);
82 return menelaus_set_vmmc(mV);
85 return menelaus_set_vdcdc(3, 0);
110 case MMC_VDD_165_195:
116 return menelaus_set_vdcdc(3, mV);
121 static void nokia_mmc_set_power_internal(struct device *dev,
124 dev_dbg(dev, "Set internal slot power %s\n",
125 power_on ? "on" : "off");
128 omap_set_gpio_dataout(n810_slot2_pw_vddf, 1);
130 omap_set_gpio_dataout(n810_slot2_pw_vdd, 1);
133 omap_set_gpio_dataout(n810_slot2_pw_vdd, 0);
135 omap_set_gpio_dataout(n810_slot2_pw_vddf, 0);
140 static int n800_mmc_set_power(struct device *dev, int slot, int power_on,
143 if (machine_is_nokia_n800() || slot == 0)
144 return n800_mmc_set_power_menelaus(dev, slot, power_on, vdd);
146 nokia_mmc_set_power_internal(dev, power_on);
151 static int n800_mmc_set_bus_mode(struct device *dev, int slot, int bus_mode)
155 dev_dbg(dev, "Set slot %d bus mode %s\n", slot + 1,
156 bus_mode == MMC_BUSMODE_OPENDRAIN ? "open-drain" : "push-pull");
157 BUG_ON(slot != 0 && slot != 1);
160 case MMC_BUSMODE_OPENDRAIN:
161 r = menelaus_set_mmc_opendrain(slot, 1);
163 case MMC_BUSMODE_PUSHPULL:
164 r = menelaus_set_mmc_opendrain(slot, 0);
169 if (r != 0 && printk_ratelimit())
170 dev_err(dev, "MMC: unable to set bus mode for slot %d\n",
175 static int n800_mmc_get_cover_state(struct device *dev, int slot)
178 BUG_ON(slot != 1 && slot != 2);
180 return slot1_cover_open;
182 return slot2_cover_open;
185 static void n800_mmc_callback(void *data, u8 card_mask)
187 int bit, *openp, index;
189 if (machine_is_nokia_n800()) {
191 openp = &slot2_cover_open;
195 openp = &slot1_cover_open;
204 omap_mmc_notify_cover_event(mmc_device, index, *openp);
207 void n800_mmc_slot1_cover_handler(void *arg, int closed_state)
209 if (mmc_device == NULL)
212 slot1_cover_open = !closed_state;
213 omap_mmc_notify_cover_event(mmc_device, 0, closed_state);
216 static int n800_mmc_late_init(struct device *dev)
223 r = menelaus_set_slot_sel(1);
227 if (machine_is_nokia_n800())
232 r = menelaus_set_mmc_slot(2, 0, vs2sel, 1);
236 n800_mmc_set_power(dev, 0, MMC_POWER_ON, 16); /* MMC_VDD_28_29 */
237 n800_mmc_set_power(dev, 1, MMC_POWER_ON, 16);
239 r = menelaus_set_mmc_slot(1, 1, 0, 1);
242 r = menelaus_set_mmc_slot(2, 1, vs2sel, 1);
246 r = menelaus_get_slot_pin_states();
250 if (machine_is_nokia_n800()) {
252 openp = &slot2_cover_open;
255 openp = &slot1_cover_open;
256 slot2_cover_open = 0;
259 /* All slot pin bits seem to be inversed until first swith change */
260 if (r == 0xf || r == (0xf & ~bit))
268 r = menelaus_register_mmc_callback(n800_mmc_callback, NULL);
273 static void n800_mmc_shutdown(struct device *dev)
277 if (machine_is_nokia_n800())
282 menelaus_set_mmc_slot(1, 0, 0, 0);
283 menelaus_set_mmc_slot(2, 0, vs2sel, 0);
286 static void n800_mmc_cleanup(struct device *dev)
288 menelaus_unregister_mmc_callback();
290 omap_free_gpio(slot_switch_gpio);
292 if (machine_is_nokia_n810()) {
293 omap_free_gpio(n810_slot2_pw_vddf);
294 omap_free_gpio(n810_slot2_pw_vdd);
299 * MMC controller1 has two slots that are multiplexed via I2C.
300 * MMC controller2 is not in use.
302 static struct omap_mmc_platform_data mmc1_data = {
304 .switch_slot = n800_mmc_switch_slot,
305 .init = n800_mmc_late_init,
306 .cleanup = n800_mmc_cleanup,
307 .shutdown = n800_mmc_shutdown,
308 .max_freq = 24000000,
309 .dma_mask = 0xffffffff,
312 .set_power = n800_mmc_set_power,
313 .set_bus_mode = n800_mmc_set_bus_mode,
314 .get_cover_state= n800_mmc_get_cover_state,
315 .ocr_mask = MMC_VDD_165_195 | MMC_VDD_30_31 |
316 MMC_VDD_32_33 | MMC_VDD_33_34,
320 .set_power = n800_mmc_set_power,
321 .set_bus_mode = n800_mmc_set_bus_mode,
322 .get_cover_state= n800_mmc_get_cover_state,
323 .ocr_mask = MMC_VDD_165_195 | MMC_VDD_20_21 |
324 MMC_VDD_21_22 | MMC_VDD_22_23 | MMC_VDD_23_24 |
325 MMC_VDD_24_25 | MMC_VDD_27_28 | MMC_VDD_28_29 |
326 MMC_VDD_29_30 | MMC_VDD_30_31 | MMC_VDD_32_33 |
332 static struct omap_mmc_platform_data *mmc_data[OMAP24XX_NR_MMC];
334 void __init n800_mmc_init(void)
337 if (machine_is_nokia_n810()) {
338 mmc1_data.slots[0].name = "external";
341 * Some Samsung Movinand chips do not like open-ended
342 * multi-block reads and fall to braind-dead state
343 * while doing so. Reducing the number of blocks in
344 * the transfer or delays in clock disable do not help
346 mmc1_data.slots[1].name = "internal";
347 mmc1_data.slots[1].ban_openended = 1;
350 if (omap_request_gpio(slot_switch_gpio) < 0)
352 omap_set_gpio_dataout(slot_switch_gpio, 0);
353 omap_set_gpio_direction(slot_switch_gpio, 0);
355 if (machine_is_nokia_n810()) {
356 if (omap_request_gpio(n810_slot2_pw_vddf) < 0)
358 omap_set_gpio_dataout(n810_slot2_pw_vddf, 0);
359 omap_set_gpio_direction(n810_slot2_pw_vddf, 0);
361 if (omap_request_gpio(n810_slot2_pw_vdd) < 0)
363 omap_set_gpio_dataout(n810_slot2_pw_vdd, 0);
364 omap_set_gpio_direction(n810_slot2_pw_vdd, 0);
367 mmc_data[0] = &mmc1_data;
368 omap2_init_mmc(mmc_data, OMAP24XX_NR_MMC);
372 void __init n800_mmc_init(void)
376 void n800_mmc_slot1_cover_handler(void *arg, int state)