blob: a7afab095716af06a85505ff3cdbe3a47da5ed66 [file] [log] [blame]
Russell Kinga09e64f2008-08-05 16:14:15 +01001/*
2 * MMC definitions for OMAP2
3 *
4 * Copyright (C) 2006 Nokia Corporation
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#ifndef __OMAP2_MMC_H
12#define __OMAP2_MMC_H
13
14#include <linux/types.h>
15#include <linux/device.h>
16#include <linux/mmc/host.h>
17
Tony Lindgrence491cf2009-10-20 09:40:47 -070018#include <plat/board.h>
Russell Kinga09e64f2008-08-05 16:14:15 +010019
Tony Lindgrend8874662008-12-10 17:37:16 -080020#define OMAP15XX_NR_MMC 1
21#define OMAP16XX_NR_MMC 2
22#define OMAP1_MMC_SIZE 0x080
23#define OMAP1_MMC1_BASE 0xfffb7800
24#define OMAP1_MMC2_BASE 0xfffb7c00 /* omap16xx only */
25
26#define OMAP24XX_NR_MMC 2
27#define OMAP34XX_NR_MMC 3
kishore kadiyala82cf8182009-09-22 16:45:25 -070028#define OMAP44XX_NR_MMC 5
Tony Lindgrend8874662008-12-10 17:37:16 -080029#define OMAP2420_MMC_SIZE OMAP1_MMC_SIZE
kishore kadiyala82cf8182009-09-22 16:45:25 -070030#define OMAP3_HSMMC_SIZE 0x200
31#define OMAP4_HSMMC_SIZE 0x1000
Tony Lindgrend8874662008-12-10 17:37:16 -080032#define OMAP2_MMC1_BASE 0x4809c000
33#define OMAP2_MMC2_BASE 0x480b4000
34#define OMAP3_MMC3_BASE 0x480ad000
kishore kadiyala82cf8182009-09-22 16:45:25 -070035#define OMAP4_MMC4_BASE 0x480d1000
36#define OMAP4_MMC5_BASE 0x480d5000
37#define OMAP4_MMC_REG_OFFSET 0x100
38#define HSMMC5 (1 << 4)
39#define HSMMC4 (1 << 3)
Tony Lindgrend8874662008-12-10 17:37:16 -080040#define HSMMC3 (1 << 2)
41#define HSMMC2 (1 << 1)
42#define HSMMC1 (1 << 0)
43
Russell Kinga09e64f2008-08-05 16:14:15 +010044#define OMAP_MMC_MAX_SLOTS 2
45
Kishore Kadiyala6ab89462011-03-01 13:12:56 -080046#define OMAP_HSMMC_SUPPORTS_DUAL_VOLT BIT(1)
47
48struct omap_mmc_dev_attr {
49 u8 flags;
50};
51
Russell Kinga09e64f2008-08-05 16:14:15 +010052struct omap_mmc_platform_data {
David Brownell01971f62009-03-23 18:23:47 -070053 /* back-link to device */
54 struct device *dev;
Russell Kinga09e64f2008-08-05 16:14:15 +010055
Tony Lindgrend8874662008-12-10 17:37:16 -080056 /* number of slots per controller */
Russell Kinga09e64f2008-08-05 16:14:15 +010057 unsigned nr_slots:2;
58
59 /* set if your board has components or wiring that limits the
60 * maximum frequency on the MMC bus */
61 unsigned int max_freq;
62
63 /* switch the bus to a new slot */
Adrian Hunterdb0fefc2010-02-15 10:03:34 -080064 int (*switch_slot)(struct device *dev, int slot);
Russell Kinga09e64f2008-08-05 16:14:15 +010065 /* initialize board-specific MMC functionality, can be NULL if
66 * not supported */
Adrian Hunterdb0fefc2010-02-15 10:03:34 -080067 int (*init)(struct device *dev);
68 void (*cleanup)(struct device *dev);
69 void (*shutdown)(struct device *dev);
Russell Kinga09e64f2008-08-05 16:14:15 +010070
71 /* To handle board related suspend/resume functionality for MMC */
72 int (*suspend)(struct device *dev, int slot);
73 int (*resume)(struct device *dev, int slot);
74
Denis Karpov1887bde2009-09-22 16:44:40 -070075 /* Return context loss count due to PM states changing */
76 int (*get_context_loss_count)(struct device *dev);
77
Tony Lindgrend8874662008-12-10 17:37:16 -080078 u64 dma_mask;
79
Kishore Kadiyala6ab89462011-03-01 13:12:56 -080080 /* Integrating attributes from the omap_hwmod layer */
81 u8 controller_flags;
82
kishore kadiyala91a0b082010-10-01 16:35:28 -070083 /* Register offset deviation */
84 u16 reg_offset;
85
Russell Kinga09e64f2008-08-05 16:14:15 +010086 struct omap_mmc_slot_data {
Tony Lindgrend8874662008-12-10 17:37:16 -080087
Tony Lindgren63509e32010-10-04 16:58:01 -070088 /*
89 * 4/8 wires and any additional host capabilities
90 * need to OR'd all capabilities (ref. linux/mmc/host.h)
91 */
92 u8 wires; /* Used for the MMC driver on omap1 and 2420 */
93 u32 caps; /* Used for the MMC driver on 2430 and later */
Tony Lindgren90c62bf2008-12-10 17:37:17 -080094
Tony Lindgrend8874662008-12-10 17:37:16 -080095 /*
96 * nomux means "standard" muxing is wrong on this board, and
97 * that board-specific code handled it before common init logic.
98 */
99 unsigned nomux:1;
100
101 /* switch pin can be for card detect (default) or card cover */
102 unsigned cover:1;
103
Tony Lindgrend8874662008-12-10 17:37:16 -0800104 /* use the internal clock */
105 unsigned internal_clock:1;
Tony Lindgren90c62bf2008-12-10 17:37:17 -0800106
Adrian Hunter23d99bb2009-09-22 16:44:48 -0700107 /* nonremovable e.g. eMMC */
108 unsigned nonremovable:1;
109
Denis Karpovdd498ef2009-09-22 16:44:49 -0700110 /* Try to sleep or power off when possible */
111 unsigned power_saving:1;
112
Adrian Hunter1df58db2010-02-15 10:03:34 -0800113 /* If using power_saving and the MMC power is not to go off */
114 unsigned no_off:1;
115
Adrian Huntere0eb2422010-02-15 10:03:34 -0800116 /* Regulator off remapped to sleep */
117 unsigned vcc_aux_disable_is_sleep:1;
118
stanley.miao03e7e172010-05-13 12:39:31 +0000119 /* we can put the features above into this variable */
120#define HSMMC_HAS_PBIAS (1 << 0)
Madhusudhan Chikkature07ad64b2010-10-01 16:35:25 -0700121#define HSMMC_HAS_UPDATED_RESET (1 << 1)
stanley.miao03e7e172010-05-13 12:39:31 +0000122 unsigned features;
123
Tony Lindgren90c62bf2008-12-10 17:37:17 -0800124 int switch_pin; /* gpio (card detect) */
125 int gpio_wp; /* gpio (write protect) */
Tony Lindgrend8874662008-12-10 17:37:16 -0800126
Adrian Hunterdb0fefc2010-02-15 10:03:34 -0800127 int (*set_bus_mode)(struct device *dev, int slot, int bus_mode);
128 int (*set_power)(struct device *dev, int slot,
129 int power_on, int vdd);
130 int (*get_ro)(struct device *dev, int slot);
Adrian Hunter9b7c18e2009-09-22 16:44:50 -0700131 int (*set_sleep)(struct device *dev, int slot, int sleep,
132 int vdd, int cardsleep);
Adrian Hunterce6f0012010-02-15 10:03:34 -0800133 void (*remux)(struct device *dev, int slot, int power_on);
Adrian Hunterdb0fefc2010-02-15 10:03:34 -0800134 /* Call back before enabling / disabling regulators */
135 void (*before_set_reg)(struct device *dev, int slot,
136 int power_on, int vdd);
137 /* Call back after enabling / disabling regulators */
138 void (*after_set_reg)(struct device *dev, int slot,
139 int power_on, int vdd);
Grazvydas Ignotas48168582010-08-10 18:01:52 -0700140 /* if we have special card, init it using this callback */
141 void (*init_card)(struct mmc_card *card);
Russell Kinga09e64f2008-08-05 16:14:15 +0100142
143 /* return MMC cover switch state, can be NULL if not supported.
144 *
145 * possible return values:
Tony Lindgrend8874662008-12-10 17:37:16 -0800146 * 0 - closed
147 * 1 - open
Russell Kinga09e64f2008-08-05 16:14:15 +0100148 */
Adrian Hunterdb0fefc2010-02-15 10:03:34 -0800149 int (*get_cover_state)(struct device *dev, int slot);
Russell Kinga09e64f2008-08-05 16:14:15 +0100150
151 const char *name;
152 u32 ocr_mask;
153
154 /* Card detection IRQs */
155 int card_detect_irq;
Adrian Hunterdb0fefc2010-02-15 10:03:34 -0800156 int (*card_detect)(struct device *dev, int slot);
Russell Kinga09e64f2008-08-05 16:14:15 +0100157
158 unsigned int ban_openended:1;
159
160 } slots[OMAP_MMC_MAX_SLOTS];
161};
162
Russell Kinga09e64f2008-08-05 16:14:15 +0100163/* called from board-specific card detection service routine */
Adrian Hunterdb0fefc2010-02-15 10:03:34 -0800164extern void omap_mmc_notify_cover_event(struct device *dev, int slot,
165 int is_closed);
Russell Kinga09e64f2008-08-05 16:14:15 +0100166
Tony Lindgrend8874662008-12-10 17:37:16 -0800167#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \
168 defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
169void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
170 int nr_controllers);
Anand Gadiyare08016d2011-03-01 13:12:55 -0800171void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data);
Tony Lindgrend8874662008-12-10 17:37:16 -0800172void omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
173 int nr_controllers);
Tony Lindgren0dffb5c2009-01-29 08:57:16 -0800174int omap_mmc_add(const char *name, int id, unsigned long base,
175 unsigned long size, unsigned int irq,
176 struct omap_mmc_platform_data *data);
Tony Lindgrend8874662008-12-10 17:37:16 -0800177#else
178static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
179 int nr_controllers)
180{
181}
Anand Gadiyare08016d2011-03-01 13:12:55 -0800182static inline void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data)
183{
184}
Tony Lindgrend8874662008-12-10 17:37:16 -0800185static inline void omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
186 int nr_controllers)
187{
188}
Tony Lindgren0dffb5c2009-01-29 08:57:16 -0800189static inline int omap_mmc_add(const char *name, int id, unsigned long base,
190 unsigned long size, unsigned int irq,
191 struct omap_mmc_platform_data *data)
Tony Lindgrend8874662008-12-10 17:37:16 -0800192{
193 return 0;
194}
195
196#endif
Russell Kinga09e64f2008-08-05 16:14:15 +0100197#endif