blob: 6390787fb32a966e0d9d3265f5730d567b496c1b [file] [log] [blame]
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001/*
Pierre Ossman70f10482007-07-11 20:04:50 +02002 * linux/drivers/mmc/core/mmc.c
Pierre Ossman7ea239d2006-12-31 00:11:32 +01003 *
4 * Copyright (C) 2003-2004 Russell King, All Rights Reserved.
5 * Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved.
6 * MMCv4 support Copyright (C) 2006 Philip Langdale, All Rights Reserved.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#include <linux/err.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090014#include <linux/slab.h>
Paul Gortmaker0205a902011-07-15 12:01:27 -040015#include <linux/stat.h>
Ulf Hansson0cb403a2013-10-10 14:20:05 +020016#include <linux/pm_runtime.h>
Pierre Ossman7ea239d2006-12-31 00:11:32 +010017
18#include <linux/mmc/host.h>
19#include <linux/mmc/card.h>
20#include <linux/mmc/mmc.h>
21
22#include "core.h"
Pierre Ossman4101c162007-05-19 13:39:01 +020023#include "bus.h"
Pierre Ossman7ea239d2006-12-31 00:11:32 +010024#include "mmc_ops.h"
Philip Rakity4c4cb172011-05-13 11:17:18 +053025#include "sd_ops.h"
Pierre Ossman7ea239d2006-12-31 00:11:32 +010026
27static const unsigned int tran_exp[] = {
28 10000, 100000, 1000000, 10000000,
29 0, 0, 0, 0
30};
31
32static const unsigned char tran_mant[] = {
33 0, 10, 12, 13, 15, 20, 25, 30,
34 35, 40, 45, 50, 55, 60, 70, 80,
35};
36
37static const unsigned int tacc_exp[] = {
38 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
39};
40
41static const unsigned int tacc_mant[] = {
42 0, 10, 12, 13, 15, 20, 25, 30,
43 35, 40, 45, 50, 55, 60, 70, 80,
44};
45
46#define UNSTUFF_BITS(resp,start,size) \
47 ({ \
48 const int __size = size; \
49 const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
50 const int __off = 3 - ((start) / 32); \
51 const int __shft = (start) & 31; \
52 u32 __res; \
53 \
54 __res = resp[__off] >> __shft; \
55 if (__size + __shft > 32) \
56 __res |= resp[__off-1] << ((32 - __shft) % 32); \
57 __res & __mask; \
58 })
59
60/*
61 * Given the decoded CSD structure, decode the raw CID to our CID structure.
62 */
Pierre Ossmanbd766312007-05-01 16:11:57 +020063static int mmc_decode_cid(struct mmc_card *card)
Pierre Ossman7ea239d2006-12-31 00:11:32 +010064{
65 u32 *resp = card->raw_cid;
66
67 /*
68 * The selection of the format here is based upon published
69 * specs from sandisk and from what people have reported.
70 */
71 switch (card->csd.mmca_vsn) {
72 case 0: /* MMC v1.0 - v1.2 */
73 case 1: /* MMC v1.4 */
74 card->cid.manfid = UNSTUFF_BITS(resp, 104, 24);
75 card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
76 card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
77 card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);
78 card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8);
79 card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8);
80 card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8);
81 card->cid.prod_name[6] = UNSTUFF_BITS(resp, 48, 8);
82 card->cid.hwrev = UNSTUFF_BITS(resp, 44, 4);
83 card->cid.fwrev = UNSTUFF_BITS(resp, 40, 4);
84 card->cid.serial = UNSTUFF_BITS(resp, 16, 24);
85 card->cid.month = UNSTUFF_BITS(resp, 12, 4);
86 card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997;
87 break;
88
89 case 2: /* MMC v2.0 - v2.2 */
90 case 3: /* MMC v3.1 - v3.3 */
91 case 4: /* MMC v4 */
92 card->cid.manfid = UNSTUFF_BITS(resp, 120, 8);
93 card->cid.oemid = UNSTUFF_BITS(resp, 104, 16);
94 card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
95 card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
96 card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);
97 card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8);
98 card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8);
99 card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8);
Bernie Thompson51e7e8b2013-02-27 12:19:17 -0800100 card->cid.prv = UNSTUFF_BITS(resp, 48, 8);
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100101 card->cid.serial = UNSTUFF_BITS(resp, 16, 32);
102 card->cid.month = UNSTUFF_BITS(resp, 12, 4);
103 card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997;
104 break;
105
106 default:
Girish K Sa3c76eb2011-10-11 11:44:09 +0530107 pr_err("%s: card has unknown MMCA version %d\n",
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100108 mmc_hostname(card->host), card->csd.mmca_vsn);
Pierre Ossmanbd766312007-05-01 16:11:57 +0200109 return -EINVAL;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100110 }
Pierre Ossmanbd766312007-05-01 16:11:57 +0200111
112 return 0;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100113}
114
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700115static void mmc_set_erase_size(struct mmc_card *card)
116{
117 if (card->ext_csd.erase_group_def & 1)
118 card->erase_size = card->ext_csd.hc_erase_size;
119 else
120 card->erase_size = card->csd.erase_size;
121
122 mmc_init_erase(card);
123}
124
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100125/*
126 * Given a 128-bit response, decode to our card CSD structure.
127 */
Pierre Ossmanbd766312007-05-01 16:11:57 +0200128static int mmc_decode_csd(struct mmc_card *card)
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100129{
130 struct mmc_csd *csd = &card->csd;
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700131 unsigned int e, m, a, b;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100132 u32 *resp = card->raw_csd;
133
134 /*
135 * We only understand CSD structure v1.1 and v1.2.
136 * v1.2 has extra information in bits 15, 11 and 10.
Kyungmin Park6da24b72010-08-10 18:01:36 -0700137 * We also support eMMC v4.4 & v4.41.
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100138 */
Kyungmin Park6da24b72010-08-10 18:01:36 -0700139 csd->structure = UNSTUFF_BITS(resp, 126, 2);
140 if (csd->structure == 0) {
Girish K Sa3c76eb2011-10-11 11:44:09 +0530141 pr_err("%s: unrecognised CSD structure version %d\n",
Kyungmin Park6da24b72010-08-10 18:01:36 -0700142 mmc_hostname(card->host), csd->structure);
Pierre Ossmanbd766312007-05-01 16:11:57 +0200143 return -EINVAL;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100144 }
145
146 csd->mmca_vsn = UNSTUFF_BITS(resp, 122, 4);
147 m = UNSTUFF_BITS(resp, 115, 4);
148 e = UNSTUFF_BITS(resp, 112, 3);
149 csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
150 csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100;
151
152 m = UNSTUFF_BITS(resp, 99, 4);
153 e = UNSTUFF_BITS(resp, 96, 3);
154 csd->max_dtr = tran_exp[e] * tran_mant[m];
155 csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);
156
157 e = UNSTUFF_BITS(resp, 47, 3);
158 m = UNSTUFF_BITS(resp, 62, 12);
159 csd->capacity = (1 + m) << (e + 2);
160
161 csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
162 csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
163 csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
164 csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
Sascha Hauer3d705d12014-08-19 10:45:51 +0200165 csd->dsr_imp = UNSTUFF_BITS(resp, 76, 1);
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100166 csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
167 csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
168 csd->write_partial = UNSTUFF_BITS(resp, 21, 1);
Pierre Ossmanbd766312007-05-01 16:11:57 +0200169
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700170 if (csd->write_blkbits >= 9) {
171 a = UNSTUFF_BITS(resp, 42, 5);
172 b = UNSTUFF_BITS(resp, 37, 5);
173 csd->erase_size = (a + 1) * (b + 1);
174 csd->erase_size <<= csd->write_blkbits - 9;
175 }
176
Pierre Ossmanbd766312007-05-01 16:11:57 +0200177 return 0;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100178}
179
180/*
Philip Rakity08ee80c2011-05-24 18:14:58 -0700181 * Read extended CSD.
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100182 */
Philip Rakity08ee80c2011-05-24 18:14:58 -0700183static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100184{
185 int err;
186 u8 *ext_csd;
187
188 BUG_ON(!card);
Philip Rakity08ee80c2011-05-24 18:14:58 -0700189 BUG_ON(!new_ext_csd);
190
191 *new_ext_csd = NULL;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100192
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100193 if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
Pierre Ossman17b04292007-07-22 22:18:46 +0200194 return 0;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100195
196 /*
197 * As the ext_csd is so large and mostly unused, we don't store the
198 * raw block in mmc_card.
199 */
200 ext_csd = kmalloc(512, GFP_KERNEL);
201 if (!ext_csd) {
Girish K Sa3c76eb2011-10-11 11:44:09 +0530202 pr_err("%s: could not allocate a buffer to "
Pierre Ossmanadf66a02007-07-22 23:08:30 +0200203 "receive the ext_csd.\n", mmc_hostname(card->host));
Pierre Ossman17b04292007-07-22 22:18:46 +0200204 return -ENOMEM;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100205 }
206
207 err = mmc_send_ext_csd(card, ext_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +0200208 if (err) {
Philip Rakity08ee80c2011-05-24 18:14:58 -0700209 kfree(ext_csd);
210 *new_ext_csd = NULL;
211
Wolfgang Mueesd08ebed2009-09-22 16:45:26 -0700212 /* If the host or the card can't do the switch,
213 * fail more gracefully. */
214 if ((err != -EINVAL)
215 && (err != -ENOSYS)
216 && (err != -EFAULT))
Philip Rakity08ee80c2011-05-24 18:14:58 -0700217 return err;
Pierre Ossmanadf66a02007-07-22 23:08:30 +0200218
219 /*
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100220 * High capacity cards should have this "magic" size
221 * stored in their CSD.
222 */
223 if (card->csd.capacity == (4096 * 512)) {
Girish K Sa3c76eb2011-10-11 11:44:09 +0530224 pr_err("%s: unable to read EXT_CSD "
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100225 "on a possible high capacity card. "
226 "Card will be ignored.\n",
227 mmc_hostname(card->host));
228 } else {
Girish K Sa3c76eb2011-10-11 11:44:09 +0530229 pr_warning("%s: unable to read "
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100230 "EXT_CSD, performance might "
231 "suffer.\n",
232 mmc_hostname(card->host));
Pierre Ossman17b04292007-07-22 22:18:46 +0200233 err = 0;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100234 }
Philip Rakity08ee80c2011-05-24 18:14:58 -0700235 } else
236 *new_ext_csd = ext_csd;
Pierre Ossmanadf66a02007-07-22 23:08:30 +0200237
Philip Rakity08ee80c2011-05-24 18:14:58 -0700238 return err;
239}
240
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900241static void mmc_select_card_type(struct mmc_card *card)
242{
243 struct mmc_host *host = card->host;
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900244 u8 card_type = card->ext_csd.raw_card_type;
Lee Jones5f1a4dd2012-11-14 12:35:51 +0000245 u32 caps = host->caps, caps2 = host->caps2;
Seungwon Jeon577fb132014-04-23 17:08:44 +0900246 unsigned int hs_max_dtr = 0, hs200_max_dtr = 0;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900247 unsigned int avail_type = 0;
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900248
249 if (caps & MMC_CAP_MMC_HIGHSPEED &&
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900250 card_type & EXT_CSD_CARD_TYPE_HS_26) {
251 hs_max_dtr = MMC_HIGH_26_MAX_DTR;
252 avail_type |= EXT_CSD_CARD_TYPE_HS_26;
253 }
254
255 if (caps & MMC_CAP_MMC_HIGHSPEED &&
256 card_type & EXT_CSD_CARD_TYPE_HS_52) {
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900257 hs_max_dtr = MMC_HIGH_52_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900258 avail_type |= EXT_CSD_CARD_TYPE_HS_52;
259 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900260
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900261 if (caps & MMC_CAP_1_8V_DDR &&
262 card_type & EXT_CSD_CARD_TYPE_DDR_1_8V) {
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900263 hs_max_dtr = MMC_HIGH_DDR_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900264 avail_type |= EXT_CSD_CARD_TYPE_DDR_1_8V;
265 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900266
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900267 if (caps & MMC_CAP_1_2V_DDR &&
268 card_type & EXT_CSD_CARD_TYPE_DDR_1_2V) {
269 hs_max_dtr = MMC_HIGH_DDR_MAX_DTR;
270 avail_type |= EXT_CSD_CARD_TYPE_DDR_1_2V;
271 }
272
273 if (caps2 & MMC_CAP2_HS200_1_8V_SDR &&
274 card_type & EXT_CSD_CARD_TYPE_HS200_1_8V) {
Seungwon Jeon577fb132014-04-23 17:08:44 +0900275 hs200_max_dtr = MMC_HS200_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900276 avail_type |= EXT_CSD_CARD_TYPE_HS200_1_8V;
277 }
278
279 if (caps2 & MMC_CAP2_HS200_1_2V_SDR &&
280 card_type & EXT_CSD_CARD_TYPE_HS200_1_2V) {
Seungwon Jeon577fb132014-04-23 17:08:44 +0900281 hs200_max_dtr = MMC_HS200_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900282 avail_type |= EXT_CSD_CARD_TYPE_HS200_1_2V;
283 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900284
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900285 if (caps2 & MMC_CAP2_HS400_1_8V &&
286 card_type & EXT_CSD_CARD_TYPE_HS400_1_8V) {
287 hs200_max_dtr = MMC_HS200_MAX_DTR;
288 avail_type |= EXT_CSD_CARD_TYPE_HS400_1_8V;
289 }
290
291 if (caps2 & MMC_CAP2_HS400_1_2V &&
292 card_type & EXT_CSD_CARD_TYPE_HS400_1_2V) {
293 hs200_max_dtr = MMC_HS200_MAX_DTR;
294 avail_type |= EXT_CSD_CARD_TYPE_HS400_1_2V;
295 }
296
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900297 card->ext_csd.hs_max_dtr = hs_max_dtr;
Seungwon Jeon577fb132014-04-23 17:08:44 +0900298 card->ext_csd.hs200_max_dtr = hs200_max_dtr;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900299 card->mmc_avail_type = avail_type;
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900300}
301
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200302static void mmc_manage_enhanced_area(struct mmc_card *card, u8 *ext_csd)
303{
Grégory Soutadé994324b2014-09-15 17:47:11 +0200304 u8 hc_erase_grp_sz, hc_wp_grp_sz;
305
306 /*
307 * Disable these attributes by default
308 */
309 card->ext_csd.enhanced_area_offset = -EINVAL;
310 card->ext_csd.enhanced_area_size = -EINVAL;
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200311
312 /*
313 * Enhanced area feature support -- check whether the eMMC
314 * card has the Enhanced area enabled. If so, export enhanced
315 * area offset and size to user by adding sysfs interface.
316 */
317 if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) &&
318 (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) {
Grégory Soutadé994324b2014-09-15 17:47:11 +0200319 if (card->ext_csd.partition_setting_completed) {
320 hc_erase_grp_sz =
321 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
322 hc_wp_grp_sz =
323 ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200324
Grégory Soutadé994324b2014-09-15 17:47:11 +0200325 /*
326 * calculate the enhanced data area offset, in bytes
327 */
328 card->ext_csd.enhanced_area_offset =
329 (ext_csd[139] << 24) + (ext_csd[138] << 16) +
330 (ext_csd[137] << 8) + ext_csd[136];
331 if (mmc_card_blockaddr(card))
332 card->ext_csd.enhanced_area_offset <<= 9;
333 /*
334 * calculate the enhanced data area size, in kilobytes
335 */
336 card->ext_csd.enhanced_area_size =
337 (ext_csd[142] << 16) + (ext_csd[141] << 8) +
338 ext_csd[140];
339 card->ext_csd.enhanced_area_size *=
340 (size_t)(hc_erase_grp_sz * hc_wp_grp_sz);
341 card->ext_csd.enhanced_area_size <<= 9;
342 } else {
343 pr_warn("%s: defines enhanced area without partition setting complete\n",
344 mmc_hostname(card->host));
345 }
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200346 }
347}
348
349static void mmc_manage_gp_partitions(struct mmc_card *card, u8 *ext_csd)
350{
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200351 int idx;
Grégory Soutadé994324b2014-09-15 17:47:11 +0200352 u8 hc_erase_grp_sz, hc_wp_grp_sz;
353 unsigned int part_size;
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200354
355 /*
356 * General purpose partition feature support --
357 * If ext_csd has the size of general purpose partitions,
358 * set size, part_cfg, partition name in mmc_part.
359 */
360 if (ext_csd[EXT_CSD_PARTITION_SUPPORT] &
361 EXT_CSD_PART_SUPPORT_PART_EN) {
Grégory Soutadé994324b2014-09-15 17:47:11 +0200362 hc_erase_grp_sz =
363 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
364 hc_wp_grp_sz =
365 ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200366
367 for (idx = 0; idx < MMC_NUM_GP_PARTITION; idx++) {
368 if (!ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3] &&
369 !ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 1] &&
370 !ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 2])
371 continue;
Grégory Soutadé994324b2014-09-15 17:47:11 +0200372 if (card->ext_csd.partition_setting_completed == 0) {
373 pr_warn("%s: has partition size defined without partition complete\n",
374 mmc_hostname(card->host));
375 break;
376 }
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200377 part_size =
378 (ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 2]
379 << 16) +
380 (ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 1]
381 << 8) +
382 ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3];
383 part_size *= (size_t)(hc_erase_grp_sz *
384 hc_wp_grp_sz);
385 mmc_part_add(card, part_size << 19,
386 EXT_CSD_PART_CONFIG_ACC_GP0 + idx,
387 "gp%d", idx, false,
388 MMC_BLK_DATA_AREA_GP);
389 }
390 }
391}
392
Philip Rakity08ee80c2011-05-24 18:14:58 -0700393/*
394 * Decode extended CSD.
395 */
396static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
397{
Namjae Jeone0c368d2011-10-06 23:41:38 +0900398 int err = 0, idx;
399 unsigned int part_size;
Philip Rakity08ee80c2011-05-24 18:14:58 -0700400
401 BUG_ON(!card);
402
403 if (!ext_csd)
404 return 0;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100405
Kyungmin Park6da24b72010-08-10 18:01:36 -0700406 /* Version is coded in the CSD_STRUCTURE byte in the EXT_CSD register */
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700407 card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE];
Kyungmin Park6da24b72010-08-10 18:01:36 -0700408 if (card->csd.structure == 3) {
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700409 if (card->ext_csd.raw_ext_csd_structure > 2) {
Girish K Sa3c76eb2011-10-11 11:44:09 +0530410 pr_err("%s: unrecognised EXT_CSD structure "
Kyungmin Park6da24b72010-08-10 18:01:36 -0700411 "version %d\n", mmc_hostname(card->host),
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700412 card->ext_csd.raw_ext_csd_structure);
Kyungmin Park6da24b72010-08-10 18:01:36 -0700413 err = -EINVAL;
414 goto out;
415 }
416 }
417
Romain Izard03a59432014-06-27 10:51:07 +0200418 /*
419 * The EXT_CSD format is meant to be forward compatible. As long
420 * as CSD_STRUCTURE does not change, all values for EXT_CSD_REV
421 * are authorized, see JEDEC JESD84-B50 section B.8.
422 */
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700423 card->ext_csd.rev = ext_csd[EXT_CSD_REV];
Pierre Ossmand7604d72007-07-23 00:34:07 +0200424
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700425 card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0];
426 card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1];
427 card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2];
428 card->ext_csd.raw_sectors[3] = ext_csd[EXT_CSD_SEC_CNT + 3];
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700429 if (card->ext_csd.rev >= 2) {
Pierre Ossmand7604d72007-07-23 00:34:07 +0200430 card->ext_csd.sectors =
431 ext_csd[EXT_CSD_SEC_CNT + 0] << 0 |
432 ext_csd[EXT_CSD_SEC_CNT + 1] << 8 |
433 ext_csd[EXT_CSD_SEC_CNT + 2] << 16 |
434 ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Hanumath Prasadfc8a0982010-08-10 18:01:45 -0700435
436 /* Cards with density > 2GiB are sector addressed */
437 if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512)
Pierre Ossmand7604d72007-07-23 00:34:07 +0200438 mmc_card_set_blockaddr(card);
439 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900440
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700441 card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE];
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900442 mmc_select_card_type(card);
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100443
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700444 card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT];
445 card->ext_csd.raw_erase_timeout_mult =
446 ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT];
447 card->ext_csd.raw_hc_erase_grp_size =
448 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700449 if (card->ext_csd.rev >= 3) {
450 u8 sa_shift = ext_csd[EXT_CSD_S_A_TIMEOUT];
Andrei Warkentin371a6892011-04-11 18:10:25 -0500451 card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG];
452
453 /* EXT_CSD value is in units of 10ms, but we store in ms */
454 card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME];
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700455
456 /* Sleep / awake timeout in 100ns units */
457 if (sa_shift > 0 && sa_shift <= 0x17)
458 card->ext_csd.sa_timeout =
459 1 << ext_csd[EXT_CSD_S_A_TIMEOUT];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700460 card->ext_csd.erase_group_def =
461 ext_csd[EXT_CSD_ERASE_GROUP_DEF];
462 card->ext_csd.hc_erase_timeout = 300 *
463 ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT];
464 card->ext_csd.hc_erase_size =
465 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] << 10;
Andrei Warkentinf4c55222011-03-31 18:40:00 -0500466
467 card->ext_csd.rel_sectors = ext_csd[EXT_CSD_REL_WR_SEC_C];
Andrei Warkentin371a6892011-04-11 18:10:25 -0500468
469 /*
470 * There are two boot regions of equal size, defined in
471 * multiples of 128K.
472 */
Namjae Jeone0c368d2011-10-06 23:41:38 +0900473 if (ext_csd[EXT_CSD_BOOT_MULT] && mmc_boot_partition_access(card->host)) {
474 for (idx = 0; idx < MMC_NUM_BOOT_PARTITION; idx++) {
475 part_size = ext_csd[EXT_CSD_BOOT_MULT] << 17;
476 mmc_part_add(card, part_size,
477 EXT_CSD_PART_CONFIG_ACC_BOOT0 + idx,
Johan Rudholmadd710e2011-12-02 08:51:06 +0100478 "boot%d", idx, true,
479 MMC_BLK_DATA_AREA_BOOT);
Namjae Jeone0c368d2011-10-06 23:41:38 +0900480 }
481 }
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700482 }
483
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700484 card->ext_csd.raw_hc_erase_gap_size =
Jurgen Heeksdd13b4e2012-02-01 13:30:55 +0100485 ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700486 card->ext_csd.raw_sec_trim_mult =
487 ext_csd[EXT_CSD_SEC_TRIM_MULT];
488 card->ext_csd.raw_sec_erase_mult =
489 ext_csd[EXT_CSD_SEC_ERASE_MULT];
490 card->ext_csd.raw_sec_feature_support =
491 ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT];
492 card->ext_csd.raw_trim_mult =
493 ext_csd[EXT_CSD_TRIM_MULT];
Philip Rakity836dc2f2013-04-04 20:18:11 +0100494 card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700495 if (card->ext_csd.rev >= 4) {
Grégory Soutadé69803d42014-09-15 17:47:09 +0200496 if (ext_csd[EXT_CSD_PARTITION_SETTING_COMPLETED] &
497 EXT_CSD_PART_SETTING_COMPLETED)
498 card->ext_csd.partition_setting_completed = 1;
499 else
500 card->ext_csd.partition_setting_completed = 0;
501
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200502 mmc_manage_enhanced_area(card, ext_csd);
Chuanxiao Dong709de99d2011-01-22 04:09:41 +0800503
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200504 mmc_manage_gp_partitions(card, ext_csd);
Namjae Jeone0c368d2011-10-06 23:41:38 +0900505
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700506 card->ext_csd.sec_trim_mult =
507 ext_csd[EXT_CSD_SEC_TRIM_MULT];
508 card->ext_csd.sec_erase_mult =
509 ext_csd[EXT_CSD_SEC_ERASE_MULT];
510 card->ext_csd.sec_feature_support =
511 ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT];
512 card->ext_csd.trim_timeout = 300 *
513 ext_csd[EXT_CSD_TRIM_MULT];
Johan Rudholmadd710e2011-12-02 08:51:06 +0100514
515 /*
516 * Note that the call to mmc_part_add above defaults to read
517 * only. If this default assumption is changed, the call must
518 * take into account the value of boot_locked below.
519 */
520 card->ext_csd.boot_ro_lock = ext_csd[EXT_CSD_BOOT_WP];
521 card->ext_csd.boot_ro_lockable = true;
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200522
523 /* Save power class values */
524 card->ext_csd.raw_pwr_cl_52_195 =
525 ext_csd[EXT_CSD_PWR_CL_52_195];
526 card->ext_csd.raw_pwr_cl_26_195 =
527 ext_csd[EXT_CSD_PWR_CL_26_195];
528 card->ext_csd.raw_pwr_cl_52_360 =
529 ext_csd[EXT_CSD_PWR_CL_52_360];
530 card->ext_csd.raw_pwr_cl_26_360 =
531 ext_csd[EXT_CSD_PWR_CL_26_360];
532 card->ext_csd.raw_pwr_cl_200_195 =
533 ext_csd[EXT_CSD_PWR_CL_200_195];
534 card->ext_csd.raw_pwr_cl_200_360 =
535 ext_csd[EXT_CSD_PWR_CL_200_360];
536 card->ext_csd.raw_pwr_cl_ddr_52_195 =
537 ext_csd[EXT_CSD_PWR_CL_DDR_52_195];
538 card->ext_csd.raw_pwr_cl_ddr_52_360 =
539 ext_csd[EXT_CSD_PWR_CL_DDR_52_360];
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900540 card->ext_csd.raw_pwr_cl_ddr_200_360 =
541 ext_csd[EXT_CSD_PWR_CL_DDR_200_360];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700542 }
543
Adrian Hunterb2499512011-08-29 16:42:11 +0300544 if (card->ext_csd.rev >= 5) {
Romain Izard7c4f10a2013-06-14 14:25:44 +0200545 /* Adjust production date as per JEDEC JESD84-B451 */
546 if (card->cid.year < 2010)
547 card->cid.year += 16;
548
Jaehoon Chung950d56a2012-09-17 08:42:02 +0000549 /* check whether the eMMC card supports BKOPS */
550 if (ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1) {
551 card->ext_csd.bkops = 1;
552 card->ext_csd.bkops_en = ext_csd[EXT_CSD_BKOPS_EN];
553 card->ext_csd.raw_bkops_status =
554 ext_csd[EXT_CSD_BKOPS_STATUS];
555 if (!card->ext_csd.bkops_en)
556 pr_info("%s: BKOPS_EN bit is not set\n",
557 mmc_hostname(card->host));
558 }
559
Jaehoon Chungeb0d8f12011-10-18 01:26:42 -0400560 /* check whether the eMMC card supports HPI */
561 if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x1) {
562 card->ext_csd.hpi = 1;
563 if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x2)
564 card->ext_csd.hpi_cmd = MMC_STOP_TRANSMISSION;
565 else
566 card->ext_csd.hpi_cmd = MMC_SEND_STATUS;
567 /*
568 * Indicate the maximum timeout to close
569 * a command interrupted by HPI
570 */
571 card->ext_csd.out_of_int_time =
572 ext_csd[EXT_CSD_OUT_OF_INTERRUPT_TIME] * 10;
573 }
574
Andrei Warkentinf4c55222011-03-31 18:40:00 -0500575 card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM];
Adrian Hunterb2499512011-08-29 16:42:11 +0300576 card->ext_csd.rst_n_function = ext_csd[EXT_CSD_RST_N_FUNCTION];
Loic Pallardy090d25f2012-11-17 18:08:24 -0500577
578 /*
579 * RPMB regions are defined in multiples of 128K.
580 */
581 card->ext_csd.raw_rpmb_size_mult = ext_csd[EXT_CSD_RPMB_MULT];
Balaji T Kd0123cc2013-01-25 17:00:30 +0530582 if (ext_csd[EXT_CSD_RPMB_MULT] && mmc_host_cmd23(card->host)) {
Loic Pallardy090d25f2012-11-17 18:08:24 -0500583 mmc_part_add(card, ext_csd[EXT_CSD_RPMB_MULT] << 17,
584 EXT_CSD_PART_CONFIG_ACC_RPMB,
585 "rpmb", 0, false,
586 MMC_BLK_DATA_AREA_RPMB);
587 }
Adrian Hunterb2499512011-08-29 16:42:11 +0300588 }
Andrei Warkentinf4c55222011-03-31 18:40:00 -0500589
Andrei Warkentin5238acb2011-09-24 12:12:30 -0400590 card->ext_csd.raw_erased_mem_count = ext_csd[EXT_CSD_ERASED_MEM_CONT];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700591 if (ext_csd[EXT_CSD_ERASED_MEM_CONT])
592 card->erased_byte = 0xFF;
593 else
594 card->erased_byte = 0x0;
595
Seungwon Jeon336c7162011-10-25 09:43:12 +0900596 /* eMMC v4.5 or later */
Girish K Sbec87262011-10-13 12:04:16 +0530597 if (card->ext_csd.rev >= 6) {
Seungwon Jeon336c7162011-10-25 09:43:12 +0900598 card->ext_csd.feature_support |= MMC_DISCARD_FEATURE;
599
Seungwon Jeonb23cf0b2011-09-23 14:15:29 +0900600 card->ext_csd.generic_cmd6_time = 10 *
601 ext_csd[EXT_CSD_GENERIC_CMD6_TIME];
Girish K Sbec87262011-10-13 12:04:16 +0530602 card->ext_csd.power_off_longtime = 10 *
603 ext_csd[EXT_CSD_POWER_OFF_LONG_TIME];
Seungwon Jeonb23cf0b2011-09-23 14:15:29 +0900604
Seungwon Jeon336c7162011-10-25 09:43:12 +0900605 card->ext_csd.cache_size =
606 ext_csd[EXT_CSD_CACHE_SIZE + 0] << 0 |
607 ext_csd[EXT_CSD_CACHE_SIZE + 1] << 8 |
608 ext_csd[EXT_CSD_CACHE_SIZE + 2] << 16 |
609 ext_csd[EXT_CSD_CACHE_SIZE + 3] << 24;
Saugata Das42659002011-12-21 13:09:17 +0530610
611 if (ext_csd[EXT_CSD_DATA_SECTOR_SIZE] == 1)
612 card->ext_csd.data_sector_size = 4096;
613 else
614 card->ext_csd.data_sector_size = 512;
615
616 if ((ext_csd[EXT_CSD_DATA_TAG_SUPPORT] & 1) &&
617 (ext_csd[EXT_CSD_TAG_UNIT_SIZE] <= 8)) {
618 card->ext_csd.data_tag_unit_size =
619 ((unsigned int) 1 << ext_csd[EXT_CSD_TAG_UNIT_SIZE]) *
620 (card->ext_csd.data_sector_size);
621 } else {
622 card->ext_csd.data_tag_unit_size = 0;
623 }
Seungwon Jeonabd9ac12013-02-06 17:01:43 +0900624
625 card->ext_csd.max_packed_writes =
626 ext_csd[EXT_CSD_MAX_PACKED_WRITES];
627 card->ext_csd.max_packed_reads =
628 ext_csd[EXT_CSD_MAX_PACKED_READS];
Saugata Dasa5075eb2012-05-17 16:32:21 +0530629 } else {
630 card->ext_csd.data_sector_size = 512;
Seungwon Jeon336c7162011-10-25 09:43:12 +0900631 }
Seungwon Jeon881d1c22011-10-14 14:03:21 +0900632
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100633out:
Philip Rakity08ee80c2011-05-24 18:14:58 -0700634 return err;
635}
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100636
Philip Rakity08ee80c2011-05-24 18:14:58 -0700637static inline void mmc_free_ext_csd(u8 *ext_csd)
638{
639 kfree(ext_csd);
640}
641
642
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700643static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width)
Philip Rakity08ee80c2011-05-24 18:14:58 -0700644{
645 u8 *bw_ext_csd;
646 int err;
647
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700648 if (bus_width == MMC_BUS_WIDTH_1)
649 return 0;
Philip Rakity08ee80c2011-05-24 18:14:58 -0700650
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700651 err = mmc_get_ext_csd(card, &bw_ext_csd);
652
653 if (err || bw_ext_csd == NULL) {
Philippe De Swertf6f44592012-04-11 23:32:05 +0300654 err = -EINVAL;
Philip Rakity08ee80c2011-05-24 18:14:58 -0700655 goto out;
656 }
657
Philip Rakity08ee80c2011-05-24 18:14:58 -0700658 /* only compare read only fields */
Jurgen Heeksdd13b4e2012-02-01 13:30:55 +0100659 err = !((card->ext_csd.raw_partition_support ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700660 bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700661 (card->ext_csd.raw_erased_mem_count ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700662 bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700663 (card->ext_csd.rev ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700664 bw_ext_csd[EXT_CSD_REV]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700665 (card->ext_csd.raw_ext_csd_structure ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700666 bw_ext_csd[EXT_CSD_STRUCTURE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700667 (card->ext_csd.raw_card_type ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700668 bw_ext_csd[EXT_CSD_CARD_TYPE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700669 (card->ext_csd.raw_s_a_timeout ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700670 bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700671 (card->ext_csd.raw_hc_erase_gap_size ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700672 bw_ext_csd[EXT_CSD_HC_WP_GRP_SIZE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700673 (card->ext_csd.raw_erase_timeout_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700674 bw_ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700675 (card->ext_csd.raw_hc_erase_grp_size ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700676 bw_ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700677 (card->ext_csd.raw_sec_trim_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700678 bw_ext_csd[EXT_CSD_SEC_TRIM_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700679 (card->ext_csd.raw_sec_erase_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700680 bw_ext_csd[EXT_CSD_SEC_ERASE_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700681 (card->ext_csd.raw_sec_feature_support ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700682 bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700683 (card->ext_csd.raw_trim_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700684 bw_ext_csd[EXT_CSD_TRIM_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700685 (card->ext_csd.raw_sectors[0] ==
686 bw_ext_csd[EXT_CSD_SEC_CNT + 0]) &&
687 (card->ext_csd.raw_sectors[1] ==
688 bw_ext_csd[EXT_CSD_SEC_CNT + 1]) &&
689 (card->ext_csd.raw_sectors[2] ==
690 bw_ext_csd[EXT_CSD_SEC_CNT + 2]) &&
691 (card->ext_csd.raw_sectors[3] ==
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200692 bw_ext_csd[EXT_CSD_SEC_CNT + 3]) &&
693 (card->ext_csd.raw_pwr_cl_52_195 ==
694 bw_ext_csd[EXT_CSD_PWR_CL_52_195]) &&
695 (card->ext_csd.raw_pwr_cl_26_195 ==
696 bw_ext_csd[EXT_CSD_PWR_CL_26_195]) &&
697 (card->ext_csd.raw_pwr_cl_52_360 ==
698 bw_ext_csd[EXT_CSD_PWR_CL_52_360]) &&
699 (card->ext_csd.raw_pwr_cl_26_360 ==
700 bw_ext_csd[EXT_CSD_PWR_CL_26_360]) &&
701 (card->ext_csd.raw_pwr_cl_200_195 ==
702 bw_ext_csd[EXT_CSD_PWR_CL_200_195]) &&
703 (card->ext_csd.raw_pwr_cl_200_360 ==
704 bw_ext_csd[EXT_CSD_PWR_CL_200_360]) &&
705 (card->ext_csd.raw_pwr_cl_ddr_52_195 ==
706 bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_195]) &&
707 (card->ext_csd.raw_pwr_cl_ddr_52_360 ==
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900708 bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_360]) &&
709 (card->ext_csd.raw_pwr_cl_ddr_200_360 ==
710 bw_ext_csd[EXT_CSD_PWR_CL_DDR_200_360]));
711
Philip Rakity08ee80c2011-05-24 18:14:58 -0700712 if (err)
713 err = -EINVAL;
714
715out:
716 mmc_free_ext_csd(bw_ext_csd);
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100717 return err;
718}
719
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100720MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
721 card->raw_cid[2], card->raw_cid[3]);
722MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
723 card->raw_csd[2], card->raw_csd[3]);
724MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700725MMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9);
726MMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100727MMC_DEV_ATTR(fwrev, "0x%x\n", card->cid.fwrev);
728MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);
729MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
730MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);
731MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid);
Bernie Thompson51e7e8b2013-02-27 12:19:17 -0800732MMC_DEV_ATTR(prv, "0x%x\n", card->cid.prv);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100733MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial);
Chuanxiao Dong709de99d2011-01-22 04:09:41 +0800734MMC_DEV_ATTR(enhanced_area_offset, "%llu\n",
735 card->ext_csd.enhanced_area_offset);
736MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size);
Loic Pallardy188cc042012-08-06 17:12:29 +0200737MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult);
738MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100739
740static struct attribute *mmc_std_attrs[] = {
741 &dev_attr_cid.attr,
742 &dev_attr_csd.attr,
743 &dev_attr_date.attr,
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700744 &dev_attr_erase_size.attr,
745 &dev_attr_preferred_erase_size.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100746 &dev_attr_fwrev.attr,
747 &dev_attr_hwrev.attr,
748 &dev_attr_manfid.attr,
749 &dev_attr_name.attr,
750 &dev_attr_oemid.attr,
Bernie Thompson51e7e8b2013-02-27 12:19:17 -0800751 &dev_attr_prv.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100752 &dev_attr_serial.attr,
Chuanxiao Dong709de99d2011-01-22 04:09:41 +0800753 &dev_attr_enhanced_area_offset.attr,
754 &dev_attr_enhanced_area_size.attr,
Loic Pallardy188cc042012-08-06 17:12:29 +0200755 &dev_attr_raw_rpmb_size_mult.attr,
756 &dev_attr_rel_sectors.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100757 NULL,
758};
Axel Lind1e58212014-03-08 15:05:27 +0800759ATTRIBUTE_GROUPS(mmc_std);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100760
761static struct device_type mmc_type = {
Axel Lind1e58212014-03-08 15:05:27 +0800762 .groups = mmc_std_groups,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100763};
764
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100765/*
Girish K Sb87d8db2011-09-23 20:41:47 +0530766 * Select the PowerClass for the current bus width
767 * If power class is defined for 4/8 bit bus in the
768 * extended CSD register, select it by executing the
769 * mmc_switch command.
770 */
Seungwon Jeon23850492014-04-23 17:08:05 +0900771static int __mmc_select_powerclass(struct mmc_card *card,
772 unsigned int bus_width)
Girish K Sb87d8db2011-09-23 20:41:47 +0530773{
Seungwon Jeon23850492014-04-23 17:08:05 +0900774 struct mmc_host *host = card->host;
775 struct mmc_ext_csd *ext_csd = &card->ext_csd;
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200776 unsigned int pwrclass_val = 0;
Seungwon Jeon23850492014-04-23 17:08:05 +0900777 int err = 0;
Girish K Sb87d8db2011-09-23 20:41:47 +0530778
Girish K Sb87d8db2011-09-23 20:41:47 +0530779 /* Power class selection is supported for versions >= 4.0 */
780 if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
781 return 0;
782
783 /* Power class values are defined only for 4/8 bit bus */
784 if (bus_width == EXT_CSD_BUS_WIDTH_1)
785 return 0;
786
787 switch (1 << host->ios.vdd) {
788 case MMC_VDD_165_195:
Seungwon Jeon23850492014-04-23 17:08:05 +0900789 if (host->ios.clock <= MMC_HIGH_26_MAX_DTR)
790 pwrclass_val = ext_csd->raw_pwr_cl_26_195;
791 else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR)
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200792 pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ?
Seungwon Jeon23850492014-04-23 17:08:05 +0900793 ext_csd->raw_pwr_cl_52_195 :
794 ext_csd->raw_pwr_cl_ddr_52_195;
795 else if (host->ios.clock <= MMC_HS200_MAX_DTR)
796 pwrclass_val = ext_csd->raw_pwr_cl_200_195;
Girish K Sb87d8db2011-09-23 20:41:47 +0530797 break;
Subhash Jadavani93fc5a42012-04-03 12:25:58 +0530798 case MMC_VDD_27_28:
799 case MMC_VDD_28_29:
800 case MMC_VDD_29_30:
801 case MMC_VDD_30_31:
802 case MMC_VDD_31_32:
Girish K Sb87d8db2011-09-23 20:41:47 +0530803 case MMC_VDD_32_33:
804 case MMC_VDD_33_34:
805 case MMC_VDD_34_35:
806 case MMC_VDD_35_36:
Seungwon Jeon23850492014-04-23 17:08:05 +0900807 if (host->ios.clock <= MMC_HIGH_26_MAX_DTR)
808 pwrclass_val = ext_csd->raw_pwr_cl_26_360;
809 else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR)
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200810 pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ?
Seungwon Jeon23850492014-04-23 17:08:05 +0900811 ext_csd->raw_pwr_cl_52_360 :
812 ext_csd->raw_pwr_cl_ddr_52_360;
813 else if (host->ios.clock <= MMC_HS200_MAX_DTR)
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900814 pwrclass_val = (bus_width == EXT_CSD_DDR_BUS_WIDTH_8) ?
815 ext_csd->raw_pwr_cl_ddr_200_360 :
816 ext_csd->raw_pwr_cl_200_360;
Girish K Sb87d8db2011-09-23 20:41:47 +0530817 break;
818 default:
819 pr_warning("%s: Voltage range not supported "
820 "for power class.\n", mmc_hostname(host));
821 return -EINVAL;
822 }
823
Girish K Sb87d8db2011-09-23 20:41:47 +0530824 if (bus_width & (EXT_CSD_BUS_WIDTH_8 | EXT_CSD_DDR_BUS_WIDTH_8))
825 pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_8BIT_MASK) >>
826 EXT_CSD_PWR_CL_8BIT_SHIFT;
827 else
828 pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_4BIT_MASK) >>
829 EXT_CSD_PWR_CL_4BIT_SHIFT;
830
831 /* If the power class is different from the default value */
832 if (pwrclass_val > 0) {
833 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
834 EXT_CSD_POWER_CLASS,
835 pwrclass_val,
Seungwon Jeon71fe3eb2011-10-18 13:20:57 +0900836 card->ext_csd.generic_cmd6_time);
Girish K Sb87d8db2011-09-23 20:41:47 +0530837 }
838
839 return err;
840}
841
Seungwon Jeon23850492014-04-23 17:08:05 +0900842static int mmc_select_powerclass(struct mmc_card *card)
843{
844 struct mmc_host *host = card->host;
845 u32 bus_width, ext_csd_bits;
846 int err, ddr;
847
848 /* Power class selection is supported for versions >= 4.0 */
849 if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
850 return 0;
851
852 bus_width = host->ios.bus_width;
853 /* Power class values are defined only for 4/8 bit bus */
854 if (bus_width == MMC_BUS_WIDTH_1)
855 return 0;
856
857 ddr = card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52;
858 if (ddr)
859 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
860 EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4;
861 else
862 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
863 EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4;
864
865 err = __mmc_select_powerclass(card, ext_csd_bits);
866 if (err)
867 pr_warn("%s: power class selection to bus width %d ddr %d failed\n",
868 mmc_hostname(host), 1 << bus_width, ddr);
869
870 return err;
871}
872
Girish K Sb87d8db2011-09-23 20:41:47 +0530873/*
Seungwon Jeon577fb132014-04-23 17:08:44 +0900874 * Set the bus speed for the selected speed mode.
Girish K Sa4924c72012-01-11 14:04:52 -0500875 */
Seungwon Jeon577fb132014-04-23 17:08:44 +0900876static void mmc_set_bus_speed(struct mmc_card *card)
Girish K Sa4924c72012-01-11 14:04:52 -0500877{
Seungwon Jeon577fb132014-04-23 17:08:44 +0900878 unsigned int max_dtr = (unsigned int)-1;
879
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900880 if ((mmc_card_hs200(card) || mmc_card_hs400(card)) &&
881 max_dtr > card->ext_csd.hs200_max_dtr)
Seungwon Jeon577fb132014-04-23 17:08:44 +0900882 max_dtr = card->ext_csd.hs200_max_dtr;
883 else if (mmc_card_hs(card) && max_dtr > card->ext_csd.hs_max_dtr)
884 max_dtr = card->ext_csd.hs_max_dtr;
885 else if (max_dtr > card->csd.max_dtr)
886 max_dtr = card->csd.max_dtr;
887
888 mmc_set_clock(card->host, max_dtr);
889}
890
891/*
892 * Select the bus width amoung 4-bit and 8-bit(SDR).
893 * If the bus width is changed successfully, return the selected width value.
894 * Zero is returned instead of error value if the wide width is not supported.
895 */
896static int mmc_select_bus_width(struct mmc_card *card)
897{
Girish K Sa4924c72012-01-11 14:04:52 -0500898 static unsigned ext_csd_bits[] = {
Girish K Sa4924c72012-01-11 14:04:52 -0500899 EXT_CSD_BUS_WIDTH_8,
Seungwon Jeon577fb132014-04-23 17:08:44 +0900900 EXT_CSD_BUS_WIDTH_4,
Girish K Sa4924c72012-01-11 14:04:52 -0500901 };
902 static unsigned bus_widths[] = {
Girish K Sa4924c72012-01-11 14:04:52 -0500903 MMC_BUS_WIDTH_8,
Seungwon Jeon577fb132014-04-23 17:08:44 +0900904 MMC_BUS_WIDTH_4,
Girish K Sa4924c72012-01-11 14:04:52 -0500905 };
Seungwon Jeon577fb132014-04-23 17:08:44 +0900906 struct mmc_host *host = card->host;
907 unsigned idx, bus_width = 0;
908 int err = 0;
Girish K Sa4924c72012-01-11 14:04:52 -0500909
Seungwon Jeon577fb132014-04-23 17:08:44 +0900910 if ((card->csd.mmca_vsn < CSD_SPEC_VER_4) &&
911 !(host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)))
912 return 0;
Girish K Sa4924c72012-01-11 14:04:52 -0500913
Seungwon Jeon577fb132014-04-23 17:08:44 +0900914 idx = (host->caps & MMC_CAP_8_BIT_DATA) ? 0 : 1;
Girish K Sa4924c72012-01-11 14:04:52 -0500915
916 /*
917 * Unlike SD, MMC cards dont have a configuration register to notify
918 * supported bus width. So bus test command should be run to identify
919 * the supported bus width or compare the ext csd values of current
920 * bus width and ext csd values of 1 bit mode read earlier.
921 */
Seungwon Jeon577fb132014-04-23 17:08:44 +0900922 for (; idx < ARRAY_SIZE(bus_widths); idx++) {
Girish K Sa4924c72012-01-11 14:04:52 -0500923 /*
924 * Host is capable of 8bit transfer, then switch
925 * the device to work in 8bit transfer mode. If the
926 * mmc switch command returns error then switch to
927 * 4bit transfer mode. On success set the corresponding
928 * bus width on the host.
929 */
930 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
931 EXT_CSD_BUS_WIDTH,
932 ext_csd_bits[idx],
933 card->ext_csd.generic_cmd6_time);
934 if (err)
935 continue;
936
Seungwon Jeon577fb132014-04-23 17:08:44 +0900937 bus_width = bus_widths[idx];
938 mmc_set_bus_width(host, bus_width);
Girish K Sa4924c72012-01-11 14:04:52 -0500939
Seungwon Jeon577fb132014-04-23 17:08:44 +0900940 /*
941 * If controller can't handle bus width test,
942 * compare ext_csd previously read in 1 bit mode
943 * against ext_csd at new bus width
944 */
Girish K Sa4924c72012-01-11 14:04:52 -0500945 if (!(host->caps & MMC_CAP_BUS_WIDTH_TEST))
Seungwon Jeon577fb132014-04-23 17:08:44 +0900946 err = mmc_compare_ext_csds(card, bus_width);
Girish K Sa4924c72012-01-11 14:04:52 -0500947 else
Seungwon Jeon577fb132014-04-23 17:08:44 +0900948 err = mmc_bus_test(card, bus_width);
949
950 if (!err) {
951 err = bus_width;
Girish K Sa4924c72012-01-11 14:04:52 -0500952 break;
Seungwon Jeon577fb132014-04-23 17:08:44 +0900953 } else {
954 pr_warn("%s: switch to bus width %d failed\n",
955 mmc_hostname(host), ext_csd_bits[idx]);
956 }
Girish K Sa4924c72012-01-11 14:04:52 -0500957 }
958
Seungwon Jeon577fb132014-04-23 17:08:44 +0900959 return err;
960}
961
962/*
963 * Switch to the high-speed mode
964 */
965static int mmc_select_hs(struct mmc_card *card)
966{
967 int err;
968
969 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
970 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS,
971 card->ext_csd.generic_cmd6_time,
972 true, true, true);
Girish K Sa4924c72012-01-11 14:04:52 -0500973 if (!err)
Seungwon Jeon577fb132014-04-23 17:08:44 +0900974 mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
975
976 return err;
977}
978
979/*
980 * Activate wide bus and DDR if supported.
981 */
982static int mmc_select_hs_ddr(struct mmc_card *card)
983{
984 struct mmc_host *host = card->host;
985 u32 bus_width, ext_csd_bits;
986 int err = 0;
987
988 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52))
989 return 0;
990
991 bus_width = host->ios.bus_width;
992 if (bus_width == MMC_BUS_WIDTH_1)
993 return 0;
994
995 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
996 EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4;
997
998 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
999 EXT_CSD_BUS_WIDTH,
1000 ext_csd_bits,
1001 card->ext_csd.generic_cmd6_time);
1002 if (err) {
1003 pr_warn("%s: switch to bus width %d ddr failed\n",
1004 mmc_hostname(host), 1 << bus_width);
1005 return err;
1006 }
1007
1008 /*
1009 * eMMC cards can support 3.3V to 1.2V i/o (vccq)
1010 * signaling.
1011 *
1012 * EXT_CSD_CARD_TYPE_DDR_1_8V means 3.3V or 1.8V vccq.
1013 *
1014 * 1.8V vccq at 3.3V core voltage (vcc) is not required
1015 * in the JEDEC spec for DDR.
1016 *
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001017 * Even (e)MMC card can support 3.3v to 1.2v vccq, but not all
1018 * host controller can support this, like some of the SDHCI
1019 * controller which connect to an eMMC device. Some of these
1020 * host controller still needs to use 1.8v vccq for supporting
1021 * DDR mode.
1022 *
1023 * So the sequence will be:
1024 * if (host and device can both support 1.2v IO)
1025 * use 1.2v IO;
1026 * else if (host and device can both support 1.8v IO)
1027 * use 1.8v IO;
1028 * so if host and device can only support 3.3v IO, this is the
1029 * last choice.
Seungwon Jeon577fb132014-04-23 17:08:44 +09001030 *
1031 * WARNING: eMMC rules are NOT the same as SD DDR
1032 */
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001033 err = -EINVAL;
1034 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V)
1035 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
Seungwon Jeon577fb132014-04-23 17:08:44 +09001036
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001037 if (err && (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V))
1038 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
1039
1040 /* make sure vccq is 3.3v after switching disaster */
1041 if (err)
1042 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330);
1043
1044 if (!err)
1045 mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
Seungwon Jeon577fb132014-04-23 17:08:44 +09001046
1047 return err;
1048}
1049
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001050static int mmc_select_hs400(struct mmc_card *card)
1051{
1052 struct mmc_host *host = card->host;
1053 int err = 0;
1054
1055 /*
1056 * HS400 mode requires 8-bit bus width
1057 */
1058 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 &&
1059 host->ios.bus_width == MMC_BUS_WIDTH_8))
1060 return 0;
1061
1062 /*
1063 * Before switching to dual data rate operation for HS400,
1064 * it is required to convert from HS200 mode to HS mode.
1065 */
1066 mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
1067 mmc_set_bus_speed(card);
1068
1069 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1070 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS,
1071 card->ext_csd.generic_cmd6_time,
1072 true, true, true);
1073 if (err) {
1074 pr_warn("%s: switch to high-speed from hs200 failed, err:%d\n",
1075 mmc_hostname(host), err);
1076 return err;
1077 }
1078
1079 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1080 EXT_CSD_BUS_WIDTH,
1081 EXT_CSD_DDR_BUS_WIDTH_8,
1082 card->ext_csd.generic_cmd6_time);
1083 if (err) {
1084 pr_warn("%s: switch to bus width for hs400 failed, err:%d\n",
1085 mmc_hostname(host), err);
1086 return err;
1087 }
1088
1089 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1090 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS400,
1091 card->ext_csd.generic_cmd6_time,
1092 true, true, true);
1093 if (err) {
1094 pr_warn("%s: switch to hs400 failed, err:%d\n",
1095 mmc_hostname(host), err);
1096 return err;
1097 }
1098
1099 mmc_set_timing(host, MMC_TIMING_MMC_HS400);
1100 mmc_set_bus_speed(card);
1101
1102 return 0;
1103}
1104
Seungwon Jeon577fb132014-04-23 17:08:44 +09001105/*
1106 * For device supporting HS200 mode, the following sequence
1107 * should be done before executing the tuning process.
1108 * 1. set the desired bus width(4-bit or 8-bit, 1-bit is not supported)
1109 * 2. switch to HS200 mode
1110 * 3. set the clock to > 52Mhz and <=200MHz
1111 */
1112static int mmc_select_hs200(struct mmc_card *card)
1113{
1114 struct mmc_host *host = card->host;
1115 int err = -EINVAL;
1116
1117 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V)
1118 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
1119
1120 if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_8V)
1121 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
1122
1123 /* If fails try again during next card power cycle */
1124 if (err)
1125 goto err;
1126
1127 /*
1128 * Set the bus width(4 or 8) with host's support and
1129 * switch to HS200 mode if bus width is set successfully.
1130 */
1131 err = mmc_select_bus_width(card);
1132 if (!IS_ERR_VALUE(err)) {
Ulf Hansson4509f84772014-01-08 16:09:33 +01001133 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeon577fb132014-04-23 17:08:44 +09001134 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200,
1135 card->ext_csd.generic_cmd6_time,
1136 true, true, true);
1137 if (!err)
1138 mmc_set_timing(host, MMC_TIMING_MMC_HS200);
1139 }
Girish K Sa4924c72012-01-11 14:04:52 -05001140err:
1141 return err;
1142}
1143
1144/*
Seungwon Jeon577fb132014-04-23 17:08:44 +09001145 * Activate High Speed or HS200 mode if supported.
1146 */
1147static int mmc_select_timing(struct mmc_card *card)
1148{
1149 int err = 0;
1150
1151 if ((card->csd.mmca_vsn < CSD_SPEC_VER_4 &&
1152 card->ext_csd.hs_max_dtr == 0))
1153 goto bus_speed;
1154
1155 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200)
1156 err = mmc_select_hs200(card);
1157 else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS)
1158 err = mmc_select_hs(card);
1159
1160 if (err && err != -EBADMSG)
1161 return err;
1162
1163 if (err) {
1164 pr_warn("%s: switch to %s failed\n",
1165 mmc_card_hs(card) ? "high-speed" :
1166 (mmc_card_hs200(card) ? "hs200" : ""),
1167 mmc_hostname(card->host));
1168 err = 0;
1169 }
1170
1171bus_speed:
1172 /*
1173 * Set the bus speed to the selected bus timing.
1174 * If timing is not selected, backward compatible is the default.
1175 */
1176 mmc_set_bus_speed(card);
1177 return err;
1178}
1179
Stephen Boyd48d11e062014-09-22 12:26:10 -07001180const u8 tuning_blk_pattern_4bit[MMC_TUNING_BLK_PATTERN_4BIT_SIZE] = {
1181 0xff, 0x0f, 0xff, 0x00, 0xff, 0xcc, 0xc3, 0xcc,
1182 0xc3, 0x3c, 0xcc, 0xff, 0xfe, 0xff, 0xfe, 0xef,
1183 0xff, 0xdf, 0xff, 0xdd, 0xff, 0xfb, 0xff, 0xfb,
1184 0xbf, 0xff, 0x7f, 0xff, 0x77, 0xf7, 0xbd, 0xef,
1185 0xff, 0xf0, 0xff, 0xf0, 0x0f, 0xfc, 0xcc, 0x3c,
1186 0xcc, 0x33, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xee,
1187 0xff, 0xfd, 0xff, 0xfd, 0xdf, 0xff, 0xbf, 0xff,
1188 0xbb, 0xff, 0xf7, 0xff, 0xf7, 0x7f, 0x7b, 0xde,
1189};
1190EXPORT_SYMBOL(tuning_blk_pattern_4bit);
1191
1192const u8 tuning_blk_pattern_8bit[MMC_TUNING_BLK_PATTERN_8BIT_SIZE] = {
1193 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
1194 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc, 0xcc,
1195 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff, 0xff,
1196 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee, 0xff,
1197 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd, 0xdd,
1198 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xbb,
1199 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff,
1200 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee, 0xff,
1201 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00,
1202 0x00, 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc,
1203 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff,
1204 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee,
1205 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd,
1206 0xdd, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff,
1207 0xbb, 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff,
1208 0xff, 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee,
1209};
1210EXPORT_SYMBOL(tuning_blk_pattern_8bit);
1211
Seungwon Jeon577fb132014-04-23 17:08:44 +09001212/*
1213 * Execute tuning sequence to seek the proper bus operating
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001214 * conditions for HS200 and HS400, which sends CMD21 to the device.
Seungwon Jeon577fb132014-04-23 17:08:44 +09001215 */
1216static int mmc_hs200_tuning(struct mmc_card *card)
1217{
1218 struct mmc_host *host = card->host;
1219 int err = 0;
1220
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001221 /*
1222 * Timing should be adjusted to the HS400 target
1223 * operation frequency for tuning process
1224 */
1225 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 &&
1226 host->ios.bus_width == MMC_BUS_WIDTH_8)
1227 if (host->ops->prepare_hs400_tuning)
1228 host->ops->prepare_hs400_tuning(host, &host->ios);
1229
Seungwon Jeon577fb132014-04-23 17:08:44 +09001230 if (host->ops->execute_tuning) {
1231 mmc_host_clk_hold(host);
1232 err = host->ops->execute_tuning(host,
1233 MMC_SEND_TUNING_BLOCK_HS200);
1234 mmc_host_clk_release(host);
1235
1236 if (err)
1237 pr_warn("%s: tuning execution failed\n",
1238 mmc_hostname(host));
1239 }
1240
1241 return err;
1242}
1243
1244/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001245 * Handle the detection and initialisation of a card.
1246 *
Deepak Saxena87693922008-06-16 19:20:57 -07001247 * In the case of a resume, "oldcard" will contain the card
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001248 * we're trying to reinitialise.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001249 */
Pierre Ossman8c75dea2007-05-19 16:14:43 +02001250static int mmc_init_card(struct mmc_host *host, u32 ocr,
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001251 struct mmc_card *oldcard)
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001252{
1253 struct mmc_card *card;
Seungwon Jeon577fb132014-04-23 17:08:44 +09001254 int err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001255 u32 cid[4];
Philip Rakityb676f032011-02-13 23:13:09 -08001256 u32 rocr;
Philip Rakity08ee80c2011-05-24 18:14:58 -07001257 u8 *ext_csd = NULL;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001258
1259 BUG_ON(!host);
Pierre Ossmand84075c82007-08-09 13:23:56 +02001260 WARN_ON(!host->claimed);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001261
Stefan Nilsson XK44669032011-09-15 17:50:38 +02001262 /* Set correct bus mode for MMC before attempting init */
1263 if (!mmc_host_is_spi(host))
1264 mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);
1265
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001266 /*
1267 * Since we're changing the OCR value, we seem to
1268 * need to tell some cards to go back to the idle
1269 * state. We wait 1ms to give cards time to
1270 * respond.
Balaji T Kc3805462011-09-08 22:08:39 +05301271 * mmc_go_idle is needed for eMMC that are asleep
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001272 */
1273 mmc_go_idle(host);
1274
1275 /* The extra bit indicates that we support high capacity */
Philip Rakityb676f032011-02-13 23:13:09 -08001276 err = mmc_send_op_cond(host, ocr | (1 << 30), &rocr);
Pierre Ossman17b04292007-07-22 22:18:46 +02001277 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001278 goto err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001279
1280 /*
David Brownellaf517152007-08-08 09:11:32 -07001281 * For SPI, enable CRC as appropriate.
1282 */
1283 if (mmc_host_is_spi(host)) {
1284 err = mmc_spi_set_crc(host, use_spi_crc);
1285 if (err)
1286 goto err;
1287 }
1288
1289 /*
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001290 * Fetch CID from card.
1291 */
David Brownellaf517152007-08-08 09:11:32 -07001292 if (mmc_host_is_spi(host))
1293 err = mmc_send_cid(host, cid);
1294 else
1295 err = mmc_all_send_cid(host, cid);
Pierre Ossman17b04292007-07-22 22:18:46 +02001296 if (err)
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001297 goto err;
1298
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001299 if (oldcard) {
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001300 if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) {
1301 err = -ENOENT;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001302 goto err;
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001303 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001304
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001305 card = oldcard;
1306 } else {
1307 /*
1308 * Allocate card structure.
1309 */
Pierre Ossman51ec92e2008-03-21 23:54:50 +01001310 card = mmc_alloc_card(host, &mmc_type);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001311 if (IS_ERR(card)) {
1312 err = PTR_ERR(card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001313 goto err;
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001314 }
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001315
Ulf Hansson69041152013-09-13 11:31:33 +02001316 card->ocr = ocr;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001317 card->type = MMC_TYPE_MMC;
1318 card->rca = 1;
1319 memcpy(card->raw_cid, cid, sizeof(card->raw_cid));
1320 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001321
1322 /*
David Brownellaf517152007-08-08 09:11:32 -07001323 * For native busses: set card RCA and quit open drain mode.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001324 */
David Brownellaf517152007-08-08 09:11:32 -07001325 if (!mmc_host_is_spi(host)) {
1326 err = mmc_set_relative_addr(card);
1327 if (err)
1328 goto free_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001329
David Brownellaf517152007-08-08 09:11:32 -07001330 mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);
1331 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001332
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001333 if (!oldcard) {
1334 /*
1335 * Fetch CSD from card.
1336 */
1337 err = mmc_send_csd(card, card->raw_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +02001338 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001339 goto free_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001340
Pierre Ossmanbd766312007-05-01 16:11:57 +02001341 err = mmc_decode_csd(card);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001342 if (err)
Pierre Ossmanbd766312007-05-01 16:11:57 +02001343 goto free_card;
1344 err = mmc_decode_cid(card);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001345 if (err)
Pierre Ossmanbd766312007-05-01 16:11:57 +02001346 goto free_card;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001347 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001348
1349 /*
Sascha Hauer3d705d12014-08-19 10:45:51 +02001350 * handling only for cards supporting DSR and hosts requesting
1351 * DSR configuration
1352 */
1353 if (card->csd.dsr_imp && host->dsr_req)
1354 mmc_set_dsr(host);
1355
1356 /*
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001357 * Select card, as all following commands rely on that.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001358 */
David Brownellaf517152007-08-08 09:11:32 -07001359 if (!mmc_host_is_spi(host)) {
1360 err = mmc_select_card(card);
1361 if (err)
1362 goto free_card;
1363 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001364
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001365 if (!oldcard) {
1366 /*
David Brownellaf517152007-08-08 09:11:32 -07001367 * Fetch and process extended CSD.
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001368 */
Philip Rakity08ee80c2011-05-24 18:14:58 -07001369
1370 err = mmc_get_ext_csd(card, &ext_csd);
1371 if (err)
1372 goto free_card;
1373 err = mmc_read_ext_csd(card, ext_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +02001374 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001375 goto free_card;
Philip Rakityb676f032011-02-13 23:13:09 -08001376
1377 /* If doing byte addressing, check if required to do sector
1378 * addressing. Handle the case of <2GB cards needing sector
1379 * addressing. See section 8.1 JEDEC Standard JED84-A441;
1380 * ocr register has bit 30 set for sector addressing.
1381 */
1382 if (!(mmc_card_blockaddr(card)) && (rocr & (1<<30)))
1383 mmc_card_set_blockaddr(card);
1384
Adrian Hunterdfe86cb2010-08-11 14:17:46 -07001385 /* Erase size depends on CSD and Extended CSD */
1386 mmc_set_erase_size(card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001387 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001388
1389 /*
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001390 * If enhanced_area_en is TRUE, host needs to enable ERASE_GRP_DEF
Lucas De Marchi25985ed2011-03-30 22:57:33 -03001391 * bit. This bit will be lost every time after a reset or power off.
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001392 */
Grégory Soutadé69803d42014-09-15 17:47:09 +02001393 if (card->ext_csd.partition_setting_completed ||
Adrian Hunter83bb24a2012-03-13 05:19:13 -04001394 (card->ext_csd.rev >= 3 && (host->caps2 & MMC_CAP2_HC_ERASE_SZ))) {
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001395 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeonb23cf0b2011-09-23 14:15:29 +09001396 EXT_CSD_ERASE_GROUP_DEF, 1,
1397 card->ext_csd.generic_cmd6_time);
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001398
1399 if (err && err != -EBADMSG)
1400 goto free_card;
1401
1402 if (err) {
1403 err = 0;
1404 /*
1405 * Just disable enhanced area off & sz
1406 * will try to enable ERASE_GROUP_DEF
1407 * during next time reinit
1408 */
1409 card->ext_csd.enhanced_area_offset = -EINVAL;
1410 card->ext_csd.enhanced_area_size = -EINVAL;
1411 } else {
1412 card->ext_csd.erase_group_def = 1;
1413 /*
1414 * enable ERASE_GRP_DEF successfully.
1415 * This will affect the erase size, so
1416 * here need to reset erase size
1417 */
1418 mmc_set_erase_size(card);
1419 }
1420 }
1421
1422 /*
Philip Rakity41e2a482011-03-19 14:10:33 -04001423 * Ensure eMMC user default partition is enabled
1424 */
Andrei Warkentin371a6892011-04-11 18:10:25 -05001425 if (card->ext_csd.part_config & EXT_CSD_PART_CONFIG_ACC_MASK) {
1426 card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK;
1427 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG,
1428 card->ext_csd.part_config,
1429 card->ext_csd.part_time);
1430 if (err && err != -EBADMSG)
1431 goto free_card;
Philip Rakity41e2a482011-03-19 14:10:33 -04001432 }
1433
1434 /*
Ulf Hansson432356792013-06-10 17:03:45 +02001435 * Enable power_off_notification byte in the ext_csd register
Girish K Sbec87262011-10-13 12:04:16 +05301436 */
Ulf Hansson432356792013-06-10 17:03:45 +02001437 if (card->ext_csd.rev >= 6) {
Girish K Sbec87262011-10-13 12:04:16 +05301438 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1439 EXT_CSD_POWER_OFF_NOTIFICATION,
1440 EXT_CSD_POWER_ON,
1441 card->ext_csd.generic_cmd6_time);
1442 if (err && err != -EBADMSG)
1443 goto free_card;
Girish K Sbec87262011-10-13 12:04:16 +05301444
Girish K S96a85d52011-11-04 16:22:47 +05301445 /*
1446 * The err can be -EBADMSG or 0,
1447 * so check for success and update the flag
1448 */
1449 if (!err)
Ulf Hanssone6c08582012-10-05 12:45:39 -04001450 card->ext_csd.power_off_notification = EXT_CSD_POWER_ON;
Girish K S96a85d52011-11-04 16:22:47 +05301451 }
Girish K Sbec87262011-10-13 12:04:16 +05301452
1453 /*
Seungwon Jeon577fb132014-04-23 17:08:44 +09001454 * Select timing interface
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001455 */
Seungwon Jeon577fb132014-04-23 17:08:44 +09001456 err = mmc_select_timing(card);
1457 if (err)
1458 goto free_card;
Girish K Sa4924c72012-01-11 14:04:52 -05001459
Girish K Sa4924c72012-01-11 14:04:52 -05001460 if (mmc_card_hs200(card)) {
Seungwon Jeon577fb132014-04-23 17:08:44 +09001461 err = mmc_hs200_tuning(card);
1462 if (err)
Girish K Sa4924c72012-01-11 14:04:52 -05001463 goto err;
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001464
1465 err = mmc_select_hs400(card);
1466 if (err)
1467 goto err;
Seungwon Jeon577fb132014-04-23 17:08:44 +09001468 } else if (mmc_card_hs(card)) {
1469 /* Select the desired bus width optionally */
1470 err = mmc_select_bus_width(card);
1471 if (!IS_ERR_VALUE(err)) {
1472 err = mmc_select_hs_ddr(card);
1473 if (err)
1474 goto err;
Adrian Hunteref0b27d2009-09-22 16:44:37 -07001475 }
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001476 }
1477
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001478 /*
Seungwon Jeon23850492014-04-23 17:08:05 +09001479 * Choose the power class with selected bus interface
1480 */
1481 mmc_select_powerclass(card);
1482
1483 /*
Subhash Jadavani52d09742012-03-06 17:59:12 +05301484 * Enable HPI feature (if supported)
1485 */
1486 if (card->ext_csd.hpi) {
1487 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1488 EXT_CSD_HPI_MGMT, 1,
1489 card->ext_csd.generic_cmd6_time);
1490 if (err && err != -EBADMSG)
1491 goto free_card;
1492 if (err) {
1493 pr_warning("%s: Enabling HPI failed\n",
1494 mmc_hostname(card->host));
1495 err = 0;
1496 } else
1497 card->ext_csd.hpi_en = 1;
1498 }
1499
1500 /*
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001501 * If cache size is higher than 0, this indicates
1502 * the existence of cache and it can be turned on.
1503 */
Ulf Hansson7536d3f2013-12-18 11:59:17 +01001504 if (card->ext_csd.cache_size > 0) {
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001505 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001506 EXT_CSD_CACHE_CTRL, 1,
1507 card->ext_csd.generic_cmd6_time);
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001508 if (err && err != -EBADMSG)
1509 goto free_card;
1510
1511 /*
1512 * Only if no error, cache is turned on successfully.
1513 */
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001514 if (err) {
1515 pr_warning("%s: Cache is supported, "
1516 "but failed to turn on (%d)\n",
1517 mmc_hostname(card->host), err);
1518 card->ext_csd.cache_ctrl = 0;
1519 err = 0;
1520 } else {
1521 card->ext_csd.cache_ctrl = 1;
1522 }
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001523 }
1524
Seungwon Jeonabd9ac12013-02-06 17:01:43 +09001525 /*
1526 * The mandatory minimum values are defined for packed command.
1527 * read: 5, write: 3
1528 */
1529 if (card->ext_csd.max_packed_writes >= 3 &&
1530 card->ext_csd.max_packed_reads >= 5 &&
1531 host->caps2 & MMC_CAP2_PACKED_CMD) {
1532 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1533 EXT_CSD_EXP_EVENTS_CTRL,
1534 EXT_CSD_PACKED_EVENT_EN,
1535 card->ext_csd.generic_cmd6_time);
1536 if (err && err != -EBADMSG)
1537 goto free_card;
1538 if (err) {
1539 pr_warn("%s: Enabling packed event failed\n",
1540 mmc_hostname(card->host));
1541 card->ext_csd.packed_event_en = 0;
1542 err = 0;
1543 } else {
1544 card->ext_csd.packed_event_en = 1;
1545 }
1546 }
1547
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001548 if (!oldcard)
1549 host->card = card;
1550
Philip Rakity08ee80c2011-05-24 18:14:58 -07001551 mmc_free_ext_csd(ext_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +02001552 return 0;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001553
1554free_card:
1555 if (!oldcard)
1556 mmc_remove_card(card);
1557err:
Philip Rakity08ee80c2011-05-24 18:14:58 -07001558 mmc_free_ext_csd(ext_csd);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001559
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001560 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001561}
1562
Ulf Hansson07a68212013-04-19 15:12:11 +02001563static int mmc_can_sleep(struct mmc_card *card)
1564{
1565 return (card && card->ext_csd.rev >= 3);
1566}
1567
1568static int mmc_sleep(struct mmc_host *host)
1569{
1570 struct mmc_command cmd = {0};
1571 struct mmc_card *card = host->card;
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001572 unsigned int timeout_ms = DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000);
Ulf Hansson07a68212013-04-19 15:12:11 +02001573 int err;
1574
Ulf Hansson07a68212013-04-19 15:12:11 +02001575 err = mmc_deselect_cards(host);
1576 if (err)
1577 return err;
1578
1579 cmd.opcode = MMC_SLEEP_AWAKE;
1580 cmd.arg = card->rca << 16;
1581 cmd.arg |= 1 << 15;
1582
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001583 /*
1584 * If the max_busy_timeout of the host is specified, validate it against
1585 * the sleep cmd timeout. A failure means we need to prevent the host
1586 * from doing hw busy detection, which is done by converting to a R1
1587 * response instead of a R1B.
1588 */
1589 if (host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) {
1590 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
1591 } else {
1592 cmd.flags = MMC_RSP_R1B | MMC_CMD_AC;
1593 cmd.busy_timeout = timeout_ms;
1594 }
1595
Ulf Hansson07a68212013-04-19 15:12:11 +02001596 err = mmc_wait_for_cmd(host, &cmd, 0);
1597 if (err)
1598 return err;
1599
1600 /*
1601 * If the host does not wait while the card signals busy, then we will
1602 * will have to wait the sleep/awake timeout. Note, we cannot use the
1603 * SEND_STATUS command to poll the status because that command (and most
1604 * others) is invalid while the card sleeps.
1605 */
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001606 if (!cmd.busy_timeout || !(host->caps & MMC_CAP_WAIT_WHILE_BUSY))
1607 mmc_delay(timeout_ms);
Ulf Hansson07a68212013-04-19 15:12:11 +02001608
1609 return err;
1610}
1611
Ulf Hanssone6c08582012-10-05 12:45:39 -04001612static int mmc_can_poweroff_notify(const struct mmc_card *card)
1613{
1614 return card &&
1615 mmc_card_mmc(card) &&
1616 (card->ext_csd.power_off_notification == EXT_CSD_POWER_ON);
1617}
1618
1619static int mmc_poweroff_notify(struct mmc_card *card, unsigned int notify_type)
1620{
1621 unsigned int timeout = card->ext_csd.generic_cmd6_time;
1622 int err;
1623
1624 /* Use EXT_CSD_POWER_OFF_SHORT as default notification type. */
1625 if (notify_type == EXT_CSD_POWER_OFF_LONG)
1626 timeout = card->ext_csd.power_off_longtime;
1627
Ulf Hansson878e2002013-09-09 11:57:57 +02001628 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1629 EXT_CSD_POWER_OFF_NOTIFICATION,
Ulf Hansson4509f84772014-01-08 16:09:33 +01001630 notify_type, timeout, true, false, false);
Ulf Hanssone6c08582012-10-05 12:45:39 -04001631 if (err)
1632 pr_err("%s: Power Off Notification timed out, %u\n",
1633 mmc_hostname(card->host), timeout);
1634
1635 /* Disable the power off notification after the switch operation. */
1636 card->ext_csd.power_off_notification = EXT_CSD_NO_POWER_NOTIFICATION;
1637
1638 return err;
1639}
1640
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001641/*
1642 * Host is being removed. Free up the current card.
1643 */
1644static void mmc_remove(struct mmc_host *host)
1645{
1646 BUG_ON(!host);
1647 BUG_ON(!host->card);
1648
1649 mmc_remove_card(host->card);
1650 host->card = NULL;
1651}
1652
1653/*
Adrian Hunterd3049502011-11-28 16:22:00 +02001654 * Card detection - card is alive.
1655 */
1656static int mmc_alive(struct mmc_host *host)
1657{
1658 return mmc_send_status(host->card, NULL);
1659}
1660
1661/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001662 * Card detection callback from host.
1663 */
1664static void mmc_detect(struct mmc_host *host)
1665{
1666 int err;
1667
1668 BUG_ON(!host);
1669 BUG_ON(!host->card);
1670
Ulf Hanssone94cfef2013-05-02 14:02:38 +02001671 mmc_get_card(host->card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001672
1673 /*
1674 * Just check if our card has been removed.
1675 */
Adrian Hunterd3049502011-11-28 16:22:00 +02001676 err = _mmc_detect_card_removed(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001677
Ulf Hanssone94cfef2013-05-02 14:02:38 +02001678 mmc_put_card(host->card);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001679
Pierre Ossman17b04292007-07-22 22:18:46 +02001680 if (err) {
Pierre Ossman4101c162007-05-19 13:39:01 +02001681 mmc_remove(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001682
1683 mmc_claim_host(host);
1684 mmc_detach_bus(host);
Ulf Hansson7f7e4122011-09-21 14:08:13 -04001685 mmc_power_off(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001686 mmc_release_host(host);
1687 }
1688}
1689
Ulf Hansson03d071f2013-06-10 17:03:43 +02001690static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001691{
Balaji T Kc3805462011-09-08 22:08:39 +05301692 int err = 0;
Ulf Hansson03d071f2013-06-10 17:03:43 +02001693 unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
1694 EXT_CSD_POWER_OFF_LONG;
Balaji T Kc3805462011-09-08 22:08:39 +05301695
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001696 BUG_ON(!host);
1697 BUG_ON(!host->card);
1698
1699 mmc_claim_host(host);
Maya Erez881d9262013-01-28 16:44:22 -05001700
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001701 if (mmc_card_suspended(host->card))
1702 goto out;
1703
Ulf Hansson39b94312013-05-02 14:02:36 +02001704 if (mmc_card_doing_bkops(host->card)) {
1705 err = mmc_stop_bkops(host->card);
1706 if (err)
1707 goto out;
1708 }
1709
Ulf Hansson10e5d962013-12-16 16:23:22 +01001710 err = mmc_flush_cache(host->card);
Maya Erez881d9262013-01-28 16:44:22 -05001711 if (err)
1712 goto out;
1713
Ulf Hansson432356792013-06-10 17:03:45 +02001714 if (mmc_can_poweroff_notify(host->card) &&
Ulf Hansson53275c22013-06-10 17:03:46 +02001715 ((host->caps2 & MMC_CAP2_FULL_PWR_CYCLE) || !is_suspend))
Ulf Hansson03d071f2013-06-10 17:03:43 +02001716 err = mmc_poweroff_notify(host->card, notify_type);
Ulf Hansson07a68212013-04-19 15:12:11 +02001717 else if (mmc_can_sleep(host->card))
1718 err = mmc_sleep(host);
Ulf Hanssone6c08582012-10-05 12:45:39 -04001719 else if (!mmc_host_is_spi(host))
Jaehoon Chung85e727e2012-05-31 20:31:47 +09001720 err = mmc_deselect_cards(host);
Nicolas Pitre95cdfb72009-09-22 16:45:29 -07001721
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001722 if (!err) {
Ulf Hansson74590262013-06-10 17:03:38 +02001723 mmc_power_off(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001724 mmc_card_set_suspended(host->card);
1725 }
Maya Erez881d9262013-01-28 16:44:22 -05001726out:
1727 mmc_release_host(host);
Balaji T Kc3805462011-09-08 22:08:39 +05301728 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001729}
1730
1731/*
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001732 * Suspend callback
Ulf Hansson03d071f2013-06-10 17:03:43 +02001733 */
1734static int mmc_suspend(struct mmc_host *host)
1735{
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001736 int err;
1737
1738 err = _mmc_suspend(host, true);
1739 if (!err) {
1740 pm_runtime_disable(&host->card->dev);
1741 pm_runtime_set_suspended(&host->card->dev);
1742 }
1743
1744 return err;
Ulf Hansson03d071f2013-06-10 17:03:43 +02001745}
1746
1747/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001748 * This function tries to determine if the same card is still present
1749 * and, if so, restore all state to it.
1750 */
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001751static int _mmc_resume(struct mmc_host *host)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001752{
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001753 int err = 0;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001754
1755 BUG_ON(!host);
1756 BUG_ON(!host->card);
1757
1758 mmc_claim_host(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001759
1760 if (!mmc_card_suspended(host->card))
1761 goto out;
1762
Ulf Hansson69041152013-09-13 11:31:33 +02001763 mmc_power_up(host, host->card->ocr);
Ulf Hansson69041152013-09-13 11:31:33 +02001764 err = mmc_init_card(host, host->card->ocr, host->card);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001765 mmc_card_clr_suspended(host->card);
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001766
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001767out:
1768 mmc_release_host(host);
Nicolas Pitre95cdfb72009-09-22 16:45:29 -07001769 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001770}
1771
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001772/*
1773 * Shutdown callback
1774 */
1775static int mmc_shutdown(struct mmc_host *host)
1776{
1777 int err = 0;
1778
1779 /*
1780 * In a specific case for poweroff notify, we need to resume the card
1781 * before we can shutdown it properly.
1782 */
1783 if (mmc_can_poweroff_notify(host->card) &&
1784 !(host->caps2 & MMC_CAP2_FULL_PWR_CYCLE))
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001785 err = _mmc_resume(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001786
1787 if (!err)
1788 err = _mmc_suspend(host, false);
1789
1790 return err;
1791}
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001792
1793/*
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001794 * Callback for resume.
1795 */
1796static int mmc_resume(struct mmc_host *host)
1797{
Ulf Hansson4d223782013-10-10 17:22:23 +02001798 int err = 0;
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001799
Ulf Hansson4d223782013-10-10 17:22:23 +02001800 if (!(host->caps & MMC_CAP_RUNTIME_RESUME)) {
1801 err = _mmc_resume(host);
1802 pm_runtime_set_active(&host->card->dev);
1803 pm_runtime_mark_last_busy(&host->card->dev);
1804 }
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001805 pm_runtime_enable(&host->card->dev);
1806
1807 return err;
1808}
1809
1810/*
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001811 * Callback for runtime_suspend.
1812 */
1813static int mmc_runtime_suspend(struct mmc_host *host)
1814{
1815 int err;
1816
1817 if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
1818 return 0;
1819
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001820 err = _mmc_suspend(host, true);
Ulf Hansson0cc81a82013-10-03 11:24:44 +02001821 if (err)
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001822 pr_err("%s: error %d doing aggessive suspend\n",
1823 mmc_hostname(host), err);
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001824
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001825 return err;
1826}
1827
1828/*
1829 * Callback for runtime_resume.
1830 */
1831static int mmc_runtime_resume(struct mmc_host *host)
1832{
1833 int err;
1834
Ulf Hansson4d223782013-10-10 17:22:23 +02001835 if (!(host->caps & (MMC_CAP_AGGRESSIVE_PM | MMC_CAP_RUNTIME_RESUME)))
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001836 return 0;
1837
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001838 err = _mmc_resume(host);
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001839 if (err)
1840 pr_err("%s: error %d doing aggessive resume\n",
1841 mmc_hostname(host), err);
1842
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001843 return 0;
1844}
1845
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001846static int mmc_power_restore(struct mmc_host *host)
Adrian Huntereae1aee2009-09-22 16:44:33 -07001847{
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001848 int ret;
1849
Adrian Huntereae1aee2009-09-22 16:44:33 -07001850 mmc_claim_host(host);
Ulf Hansson69041152013-09-13 11:31:33 +02001851 ret = mmc_init_card(host, host->card->ocr, host->card);
Adrian Huntereae1aee2009-09-22 16:44:33 -07001852 mmc_release_host(host);
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001853
1854 return ret;
Adrian Huntereae1aee2009-09-22 16:44:33 -07001855}
1856
Adrian Hunter9feae242009-09-22 16:44:32 -07001857static const struct mmc_bus_ops mmc_ops = {
1858 .remove = mmc_remove,
1859 .detect = mmc_detect,
Adrian Hunter9feae242009-09-22 16:44:32 -07001860 .suspend = mmc_suspend,
1861 .resume = mmc_resume,
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001862 .runtime_suspend = mmc_runtime_suspend,
1863 .runtime_resume = mmc_runtime_resume,
Adrian Huntereae1aee2009-09-22 16:44:33 -07001864 .power_restore = mmc_power_restore,
Adrian Hunterd3049502011-11-28 16:22:00 +02001865 .alive = mmc_alive,
Ulf Hansson486fdbb2013-06-10 17:03:44 +02001866 .shutdown = mmc_shutdown,
Adrian Hunter9feae242009-09-22 16:44:32 -07001867};
1868
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001869/*
1870 * Starting point for MMC card init.
1871 */
Andy Ross807e8e42011-01-03 10:36:56 -08001872int mmc_attach_mmc(struct mmc_host *host)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001873{
1874 int err;
Ulf Hansson69041152013-09-13 11:31:33 +02001875 u32 ocr, rocr;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001876
1877 BUG_ON(!host);
Pierre Ossmand84075c82007-08-09 13:23:56 +02001878 WARN_ON(!host->claimed);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001879
Stefan Nilsson XK44669032011-09-15 17:50:38 +02001880 /* Set correct bus mode for MMC before attempting attach */
1881 if (!mmc_host_is_spi(host))
1882 mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);
1883
Andy Ross807e8e42011-01-03 10:36:56 -08001884 err = mmc_send_op_cond(host, 0, &ocr);
1885 if (err)
1886 return err;
1887
Ulf Hansson2501c912013-10-30 01:00:18 +01001888 mmc_attach_bus(host, &mmc_ops);
Takashi Iwai8f230f42010-12-08 10:04:30 +01001889 if (host->ocr_avail_mmc)
1890 host->ocr_avail = host->ocr_avail_mmc;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001891
1892 /*
David Brownellaf517152007-08-08 09:11:32 -07001893 * We need to get OCR a different way for SPI.
1894 */
1895 if (mmc_host_is_spi(host)) {
1896 err = mmc_spi_read_ocr(host, 1, &ocr);
1897 if (err)
1898 goto err;
1899 }
1900
Ulf Hansson69041152013-09-13 11:31:33 +02001901 rocr = mmc_select_voltage(host, ocr);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001902
1903 /*
1904 * Can we support the voltage of the card?
1905 */
Ulf Hansson69041152013-09-13 11:31:33 +02001906 if (!rocr) {
Pierre Ossman109b5be2007-07-23 00:12:10 +02001907 err = -EINVAL;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001908 goto err;
Pierre Ossman109b5be2007-07-23 00:12:10 +02001909 }
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001910
1911 /*
1912 * Detect and init the card.
1913 */
Ulf Hansson69041152013-09-13 11:31:33 +02001914 err = mmc_init_card(host, rocr, NULL);
Pierre Ossman17b04292007-07-22 22:18:46 +02001915 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001916 goto err;
1917
1918 mmc_release_host(host);
Pierre Ossman4101c162007-05-19 13:39:01 +02001919 err = mmc_add_card(host->card);
Andy Ross807e8e42011-01-03 10:36:56 -08001920 mmc_claim_host(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001921 if (err)
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001922 goto remove_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001923
1924 return 0;
1925
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001926remove_card:
Andy Ross807e8e42011-01-03 10:36:56 -08001927 mmc_release_host(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001928 mmc_remove_card(host->card);
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001929 mmc_claim_host(host);
Andy Ross807e8e42011-01-03 10:36:56 -08001930 host->card = NULL;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001931err:
1932 mmc_detach_bus(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001933
Girish K Sa3c76eb2011-10-11 11:44:09 +05301934 pr_err("%s: error %d whilst initialising MMC card\n",
Pierre Ossman109b5be2007-07-23 00:12:10 +02001935 mmc_hostname(host), err);
1936
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001937 return err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001938}