blob: d4ed62cab23dfde9cd5e496c0952b231f1fc07ca [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 {
Joe Perches66061102014-09-12 14:56:56 -0700229 pr_warn("%s: unable to read EXT_CSD, performance might suffer\n",
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100230 mmc_hostname(card->host));
Pierre Ossman17b04292007-07-22 22:18:46 +0200231 err = 0;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100232 }
Philip Rakity08ee80c2011-05-24 18:14:58 -0700233 } else
234 *new_ext_csd = ext_csd;
Pierre Ossmanadf66a02007-07-22 23:08:30 +0200235
Philip Rakity08ee80c2011-05-24 18:14:58 -0700236 return err;
237}
238
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900239static void mmc_select_card_type(struct mmc_card *card)
240{
241 struct mmc_host *host = card->host;
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900242 u8 card_type = card->ext_csd.raw_card_type;
Lee Jones5f1a4dd2012-11-14 12:35:51 +0000243 u32 caps = host->caps, caps2 = host->caps2;
Seungwon Jeon577fb132014-04-23 17:08:44 +0900244 unsigned int hs_max_dtr = 0, hs200_max_dtr = 0;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900245 unsigned int avail_type = 0;
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900246
247 if (caps & MMC_CAP_MMC_HIGHSPEED &&
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900248 card_type & EXT_CSD_CARD_TYPE_HS_26) {
249 hs_max_dtr = MMC_HIGH_26_MAX_DTR;
250 avail_type |= EXT_CSD_CARD_TYPE_HS_26;
251 }
252
253 if (caps & MMC_CAP_MMC_HIGHSPEED &&
254 card_type & EXT_CSD_CARD_TYPE_HS_52) {
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900255 hs_max_dtr = MMC_HIGH_52_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900256 avail_type |= EXT_CSD_CARD_TYPE_HS_52;
257 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900258
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900259 if (caps & MMC_CAP_1_8V_DDR &&
260 card_type & EXT_CSD_CARD_TYPE_DDR_1_8V) {
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900261 hs_max_dtr = MMC_HIGH_DDR_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900262 avail_type |= EXT_CSD_CARD_TYPE_DDR_1_8V;
263 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900264
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900265 if (caps & MMC_CAP_1_2V_DDR &&
266 card_type & EXT_CSD_CARD_TYPE_DDR_1_2V) {
267 hs_max_dtr = MMC_HIGH_DDR_MAX_DTR;
268 avail_type |= EXT_CSD_CARD_TYPE_DDR_1_2V;
269 }
270
271 if (caps2 & MMC_CAP2_HS200_1_8V_SDR &&
272 card_type & EXT_CSD_CARD_TYPE_HS200_1_8V) {
Seungwon Jeon577fb132014-04-23 17:08:44 +0900273 hs200_max_dtr = MMC_HS200_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900274 avail_type |= EXT_CSD_CARD_TYPE_HS200_1_8V;
275 }
276
277 if (caps2 & MMC_CAP2_HS200_1_2V_SDR &&
278 card_type & EXT_CSD_CARD_TYPE_HS200_1_2V) {
Seungwon Jeon577fb132014-04-23 17:08:44 +0900279 hs200_max_dtr = MMC_HS200_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900280 avail_type |= EXT_CSD_CARD_TYPE_HS200_1_2V;
281 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900282
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900283 if (caps2 & MMC_CAP2_HS400_1_8V &&
284 card_type & EXT_CSD_CARD_TYPE_HS400_1_8V) {
285 hs200_max_dtr = MMC_HS200_MAX_DTR;
286 avail_type |= EXT_CSD_CARD_TYPE_HS400_1_8V;
287 }
288
289 if (caps2 & MMC_CAP2_HS400_1_2V &&
290 card_type & EXT_CSD_CARD_TYPE_HS400_1_2V) {
291 hs200_max_dtr = MMC_HS200_MAX_DTR;
292 avail_type |= EXT_CSD_CARD_TYPE_HS400_1_2V;
293 }
294
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900295 card->ext_csd.hs_max_dtr = hs_max_dtr;
Seungwon Jeon577fb132014-04-23 17:08:44 +0900296 card->ext_csd.hs200_max_dtr = hs200_max_dtr;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900297 card->mmc_avail_type = avail_type;
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900298}
299
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200300static void mmc_manage_enhanced_area(struct mmc_card *card, u8 *ext_csd)
301{
Grégory Soutadé994324b2014-09-15 17:47:11 +0200302 u8 hc_erase_grp_sz, hc_wp_grp_sz;
303
304 /*
305 * Disable these attributes by default
306 */
307 card->ext_csd.enhanced_area_offset = -EINVAL;
308 card->ext_csd.enhanced_area_size = -EINVAL;
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200309
310 /*
311 * Enhanced area feature support -- check whether the eMMC
312 * card has the Enhanced area enabled. If so, export enhanced
313 * area offset and size to user by adding sysfs interface.
314 */
315 if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) &&
316 (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) {
Grégory Soutadé994324b2014-09-15 17:47:11 +0200317 if (card->ext_csd.partition_setting_completed) {
318 hc_erase_grp_sz =
319 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
320 hc_wp_grp_sz =
321 ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200322
Grégory Soutadé994324b2014-09-15 17:47:11 +0200323 /*
324 * calculate the enhanced data area offset, in bytes
325 */
326 card->ext_csd.enhanced_area_offset =
327 (ext_csd[139] << 24) + (ext_csd[138] << 16) +
328 (ext_csd[137] << 8) + ext_csd[136];
329 if (mmc_card_blockaddr(card))
330 card->ext_csd.enhanced_area_offset <<= 9;
331 /*
332 * calculate the enhanced data area size, in kilobytes
333 */
334 card->ext_csd.enhanced_area_size =
335 (ext_csd[142] << 16) + (ext_csd[141] << 8) +
336 ext_csd[140];
337 card->ext_csd.enhanced_area_size *=
338 (size_t)(hc_erase_grp_sz * hc_wp_grp_sz);
339 card->ext_csd.enhanced_area_size <<= 9;
340 } else {
341 pr_warn("%s: defines enhanced area without partition setting complete\n",
342 mmc_hostname(card->host));
343 }
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200344 }
345}
346
347static void mmc_manage_gp_partitions(struct mmc_card *card, u8 *ext_csd)
348{
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200349 int idx;
Grégory Soutadé994324b2014-09-15 17:47:11 +0200350 u8 hc_erase_grp_sz, hc_wp_grp_sz;
351 unsigned int part_size;
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200352
353 /*
354 * General purpose partition feature support --
355 * If ext_csd has the size of general purpose partitions,
356 * set size, part_cfg, partition name in mmc_part.
357 */
358 if (ext_csd[EXT_CSD_PARTITION_SUPPORT] &
359 EXT_CSD_PART_SUPPORT_PART_EN) {
Grégory Soutadé994324b2014-09-15 17:47:11 +0200360 hc_erase_grp_sz =
361 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
362 hc_wp_grp_sz =
363 ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200364
365 for (idx = 0; idx < MMC_NUM_GP_PARTITION; idx++) {
366 if (!ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3] &&
367 !ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 1] &&
368 !ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 2])
369 continue;
Grégory Soutadé994324b2014-09-15 17:47:11 +0200370 if (card->ext_csd.partition_setting_completed == 0) {
371 pr_warn("%s: has partition size defined without partition complete\n",
372 mmc_hostname(card->host));
373 break;
374 }
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200375 part_size =
376 (ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 2]
377 << 16) +
378 (ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 1]
379 << 8) +
380 ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3];
381 part_size *= (size_t)(hc_erase_grp_sz *
382 hc_wp_grp_sz);
383 mmc_part_add(card, part_size << 19,
384 EXT_CSD_PART_CONFIG_ACC_GP0 + idx,
385 "gp%d", idx, false,
386 MMC_BLK_DATA_AREA_GP);
387 }
388 }
389}
390
Philip Rakity08ee80c2011-05-24 18:14:58 -0700391/*
392 * Decode extended CSD.
393 */
394static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
395{
Namjae Jeone0c368d2011-10-06 23:41:38 +0900396 int err = 0, idx;
397 unsigned int part_size;
Philip Rakity08ee80c2011-05-24 18:14:58 -0700398
399 BUG_ON(!card);
400
401 if (!ext_csd)
402 return 0;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100403
Kyungmin Park6da24b72010-08-10 18:01:36 -0700404 /* Version is coded in the CSD_STRUCTURE byte in the EXT_CSD register */
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700405 card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE];
Kyungmin Park6da24b72010-08-10 18:01:36 -0700406 if (card->csd.structure == 3) {
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700407 if (card->ext_csd.raw_ext_csd_structure > 2) {
Girish K Sa3c76eb2011-10-11 11:44:09 +0530408 pr_err("%s: unrecognised EXT_CSD structure "
Kyungmin Park6da24b72010-08-10 18:01:36 -0700409 "version %d\n", mmc_hostname(card->host),
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700410 card->ext_csd.raw_ext_csd_structure);
Kyungmin Park6da24b72010-08-10 18:01:36 -0700411 err = -EINVAL;
412 goto out;
413 }
414 }
415
Romain Izard03a59432014-06-27 10:51:07 +0200416 /*
417 * The EXT_CSD format is meant to be forward compatible. As long
418 * as CSD_STRUCTURE does not change, all values for EXT_CSD_REV
419 * are authorized, see JEDEC JESD84-B50 section B.8.
420 */
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700421 card->ext_csd.rev = ext_csd[EXT_CSD_REV];
Pierre Ossmand7604d72007-07-23 00:34:07 +0200422
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700423 card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0];
424 card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1];
425 card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2];
426 card->ext_csd.raw_sectors[3] = ext_csd[EXT_CSD_SEC_CNT + 3];
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700427 if (card->ext_csd.rev >= 2) {
Pierre Ossmand7604d72007-07-23 00:34:07 +0200428 card->ext_csd.sectors =
429 ext_csd[EXT_CSD_SEC_CNT + 0] << 0 |
430 ext_csd[EXT_CSD_SEC_CNT + 1] << 8 |
431 ext_csd[EXT_CSD_SEC_CNT + 2] << 16 |
432 ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Hanumath Prasadfc8a0982010-08-10 18:01:45 -0700433
434 /* Cards with density > 2GiB are sector addressed */
435 if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512)
Pierre Ossmand7604d72007-07-23 00:34:07 +0200436 mmc_card_set_blockaddr(card);
437 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900438
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700439 card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE];
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900440 mmc_select_card_type(card);
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100441
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700442 card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT];
443 card->ext_csd.raw_erase_timeout_mult =
444 ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT];
445 card->ext_csd.raw_hc_erase_grp_size =
446 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700447 if (card->ext_csd.rev >= 3) {
448 u8 sa_shift = ext_csd[EXT_CSD_S_A_TIMEOUT];
Andrei Warkentin371a6892011-04-11 18:10:25 -0500449 card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG];
450
451 /* EXT_CSD value is in units of 10ms, but we store in ms */
452 card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME];
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700453
454 /* Sleep / awake timeout in 100ns units */
455 if (sa_shift > 0 && sa_shift <= 0x17)
456 card->ext_csd.sa_timeout =
457 1 << ext_csd[EXT_CSD_S_A_TIMEOUT];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700458 card->ext_csd.erase_group_def =
459 ext_csd[EXT_CSD_ERASE_GROUP_DEF];
460 card->ext_csd.hc_erase_timeout = 300 *
461 ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT];
462 card->ext_csd.hc_erase_size =
463 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] << 10;
Andrei Warkentinf4c55222011-03-31 18:40:00 -0500464
465 card->ext_csd.rel_sectors = ext_csd[EXT_CSD_REL_WR_SEC_C];
Andrei Warkentin371a6892011-04-11 18:10:25 -0500466
467 /*
468 * There are two boot regions of equal size, defined in
469 * multiples of 128K.
470 */
Namjae Jeone0c368d2011-10-06 23:41:38 +0900471 if (ext_csd[EXT_CSD_BOOT_MULT] && mmc_boot_partition_access(card->host)) {
472 for (idx = 0; idx < MMC_NUM_BOOT_PARTITION; idx++) {
473 part_size = ext_csd[EXT_CSD_BOOT_MULT] << 17;
474 mmc_part_add(card, part_size,
475 EXT_CSD_PART_CONFIG_ACC_BOOT0 + idx,
Johan Rudholmadd710e2011-12-02 08:51:06 +0100476 "boot%d", idx, true,
477 MMC_BLK_DATA_AREA_BOOT);
Namjae Jeone0c368d2011-10-06 23:41:38 +0900478 }
479 }
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700480 }
481
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700482 card->ext_csd.raw_hc_erase_gap_size =
Jurgen Heeksdd13b4e2012-02-01 13:30:55 +0100483 ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700484 card->ext_csd.raw_sec_trim_mult =
485 ext_csd[EXT_CSD_SEC_TRIM_MULT];
486 card->ext_csd.raw_sec_erase_mult =
487 ext_csd[EXT_CSD_SEC_ERASE_MULT];
488 card->ext_csd.raw_sec_feature_support =
489 ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT];
490 card->ext_csd.raw_trim_mult =
491 ext_csd[EXT_CSD_TRIM_MULT];
Philip Rakity836dc2f2013-04-04 20:18:11 +0100492 card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700493 if (card->ext_csd.rev >= 4) {
Grégory Soutadé69803d42014-09-15 17:47:09 +0200494 if (ext_csd[EXT_CSD_PARTITION_SETTING_COMPLETED] &
495 EXT_CSD_PART_SETTING_COMPLETED)
496 card->ext_csd.partition_setting_completed = 1;
497 else
498 card->ext_csd.partition_setting_completed = 0;
499
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200500 mmc_manage_enhanced_area(card, ext_csd);
Chuanxiao Dong709de99d2011-01-22 04:09:41 +0800501
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200502 mmc_manage_gp_partitions(card, ext_csd);
Namjae Jeone0c368d2011-10-06 23:41:38 +0900503
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700504 card->ext_csd.sec_trim_mult =
505 ext_csd[EXT_CSD_SEC_TRIM_MULT];
506 card->ext_csd.sec_erase_mult =
507 ext_csd[EXT_CSD_SEC_ERASE_MULT];
508 card->ext_csd.sec_feature_support =
509 ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT];
510 card->ext_csd.trim_timeout = 300 *
511 ext_csd[EXT_CSD_TRIM_MULT];
Johan Rudholmadd710e2011-12-02 08:51:06 +0100512
513 /*
514 * Note that the call to mmc_part_add above defaults to read
515 * only. If this default assumption is changed, the call must
516 * take into account the value of boot_locked below.
517 */
518 card->ext_csd.boot_ro_lock = ext_csd[EXT_CSD_BOOT_WP];
519 card->ext_csd.boot_ro_lockable = true;
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200520
521 /* Save power class values */
522 card->ext_csd.raw_pwr_cl_52_195 =
523 ext_csd[EXT_CSD_PWR_CL_52_195];
524 card->ext_csd.raw_pwr_cl_26_195 =
525 ext_csd[EXT_CSD_PWR_CL_26_195];
526 card->ext_csd.raw_pwr_cl_52_360 =
527 ext_csd[EXT_CSD_PWR_CL_52_360];
528 card->ext_csd.raw_pwr_cl_26_360 =
529 ext_csd[EXT_CSD_PWR_CL_26_360];
530 card->ext_csd.raw_pwr_cl_200_195 =
531 ext_csd[EXT_CSD_PWR_CL_200_195];
532 card->ext_csd.raw_pwr_cl_200_360 =
533 ext_csd[EXT_CSD_PWR_CL_200_360];
534 card->ext_csd.raw_pwr_cl_ddr_52_195 =
535 ext_csd[EXT_CSD_PWR_CL_DDR_52_195];
536 card->ext_csd.raw_pwr_cl_ddr_52_360 =
537 ext_csd[EXT_CSD_PWR_CL_DDR_52_360];
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900538 card->ext_csd.raw_pwr_cl_ddr_200_360 =
539 ext_csd[EXT_CSD_PWR_CL_DDR_200_360];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700540 }
541
Adrian Hunterb2499512011-08-29 16:42:11 +0300542 if (card->ext_csd.rev >= 5) {
Romain Izard7c4f10a2013-06-14 14:25:44 +0200543 /* Adjust production date as per JEDEC JESD84-B451 */
544 if (card->cid.year < 2010)
545 card->cid.year += 16;
546
Jaehoon Chung950d56a2012-09-17 08:42:02 +0000547 /* check whether the eMMC card supports BKOPS */
548 if (ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1) {
549 card->ext_csd.bkops = 1;
550 card->ext_csd.bkops_en = ext_csd[EXT_CSD_BKOPS_EN];
551 card->ext_csd.raw_bkops_status =
552 ext_csd[EXT_CSD_BKOPS_STATUS];
553 if (!card->ext_csd.bkops_en)
554 pr_info("%s: BKOPS_EN bit is not set\n",
555 mmc_hostname(card->host));
556 }
557
Jaehoon Chungeb0d8f12011-10-18 01:26:42 -0400558 /* check whether the eMMC card supports HPI */
559 if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x1) {
560 card->ext_csd.hpi = 1;
561 if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x2)
562 card->ext_csd.hpi_cmd = MMC_STOP_TRANSMISSION;
563 else
564 card->ext_csd.hpi_cmd = MMC_SEND_STATUS;
565 /*
566 * Indicate the maximum timeout to close
567 * a command interrupted by HPI
568 */
569 card->ext_csd.out_of_int_time =
570 ext_csd[EXT_CSD_OUT_OF_INTERRUPT_TIME] * 10;
571 }
572
Andrei Warkentinf4c55222011-03-31 18:40:00 -0500573 card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM];
Adrian Hunterb2499512011-08-29 16:42:11 +0300574 card->ext_csd.rst_n_function = ext_csd[EXT_CSD_RST_N_FUNCTION];
Loic Pallardy090d25f2012-11-17 18:08:24 -0500575
576 /*
577 * RPMB regions are defined in multiples of 128K.
578 */
579 card->ext_csd.raw_rpmb_size_mult = ext_csd[EXT_CSD_RPMB_MULT];
Balaji T Kd0123cc2013-01-25 17:00:30 +0530580 if (ext_csd[EXT_CSD_RPMB_MULT] && mmc_host_cmd23(card->host)) {
Loic Pallardy090d25f2012-11-17 18:08:24 -0500581 mmc_part_add(card, ext_csd[EXT_CSD_RPMB_MULT] << 17,
582 EXT_CSD_PART_CONFIG_ACC_RPMB,
583 "rpmb", 0, false,
584 MMC_BLK_DATA_AREA_RPMB);
585 }
Adrian Hunterb2499512011-08-29 16:42:11 +0300586 }
Andrei Warkentinf4c55222011-03-31 18:40:00 -0500587
Andrei Warkentin5238acb2011-09-24 12:12:30 -0400588 card->ext_csd.raw_erased_mem_count = ext_csd[EXT_CSD_ERASED_MEM_CONT];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700589 if (ext_csd[EXT_CSD_ERASED_MEM_CONT])
590 card->erased_byte = 0xFF;
591 else
592 card->erased_byte = 0x0;
593
Seungwon Jeon336c7162011-10-25 09:43:12 +0900594 /* eMMC v4.5 or later */
Girish K Sbec87262011-10-13 12:04:16 +0530595 if (card->ext_csd.rev >= 6) {
Seungwon Jeon336c7162011-10-25 09:43:12 +0900596 card->ext_csd.feature_support |= MMC_DISCARD_FEATURE;
597
Seungwon Jeonb23cf0b2011-09-23 14:15:29 +0900598 card->ext_csd.generic_cmd6_time = 10 *
599 ext_csd[EXT_CSD_GENERIC_CMD6_TIME];
Girish K Sbec87262011-10-13 12:04:16 +0530600 card->ext_csd.power_off_longtime = 10 *
601 ext_csd[EXT_CSD_POWER_OFF_LONG_TIME];
Seungwon Jeonb23cf0b2011-09-23 14:15:29 +0900602
Seungwon Jeon336c7162011-10-25 09:43:12 +0900603 card->ext_csd.cache_size =
604 ext_csd[EXT_CSD_CACHE_SIZE + 0] << 0 |
605 ext_csd[EXT_CSD_CACHE_SIZE + 1] << 8 |
606 ext_csd[EXT_CSD_CACHE_SIZE + 2] << 16 |
607 ext_csd[EXT_CSD_CACHE_SIZE + 3] << 24;
Saugata Das42659002011-12-21 13:09:17 +0530608
609 if (ext_csd[EXT_CSD_DATA_SECTOR_SIZE] == 1)
610 card->ext_csd.data_sector_size = 4096;
611 else
612 card->ext_csd.data_sector_size = 512;
613
614 if ((ext_csd[EXT_CSD_DATA_TAG_SUPPORT] & 1) &&
615 (ext_csd[EXT_CSD_TAG_UNIT_SIZE] <= 8)) {
616 card->ext_csd.data_tag_unit_size =
617 ((unsigned int) 1 << ext_csd[EXT_CSD_TAG_UNIT_SIZE]) *
618 (card->ext_csd.data_sector_size);
619 } else {
620 card->ext_csd.data_tag_unit_size = 0;
621 }
Seungwon Jeonabd9ac12013-02-06 17:01:43 +0900622
623 card->ext_csd.max_packed_writes =
624 ext_csd[EXT_CSD_MAX_PACKED_WRITES];
625 card->ext_csd.max_packed_reads =
626 ext_csd[EXT_CSD_MAX_PACKED_READS];
Saugata Dasa5075eb2012-05-17 16:32:21 +0530627 } else {
628 card->ext_csd.data_sector_size = 512;
Seungwon Jeon336c7162011-10-25 09:43:12 +0900629 }
Seungwon Jeon881d1c22011-10-14 14:03:21 +0900630
Gwendal Grignou0f762422014-10-16 11:27:16 -0700631 /* eMMC v5 or later */
632 if (card->ext_csd.rev >= 7) {
633 memcpy(card->ext_csd.fwrev, &ext_csd[EXT_CSD_FIRMWARE_VERSION],
634 MMC_FIRMWARE_LEN);
635 card->ext_csd.ffu_capable =
636 (ext_csd[EXT_CSD_SUPPORTED_MODE] & 0x1) &&
637 !(ext_csd[EXT_CSD_FW_CONFIG] & 0x1);
638 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100639out:
Philip Rakity08ee80c2011-05-24 18:14:58 -0700640 return err;
641}
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100642
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:
Ulf Hansson00b41b52014-10-16 16:18:51 +0200716 kfree(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);
Gwendal Grignou0f762422014-10-16 11:27:16 -0700727MMC_DEV_ATTR(ffu_capable, "%d\n", card->ext_csd.ffu_capable);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100728MMC_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
Gwendal Grignou0f762422014-10-16 11:27:16 -0700740static ssize_t mmc_fwrev_show(struct device *dev,
741 struct device_attribute *attr,
742 char *buf)
743{
744 struct mmc_card *card = mmc_dev_to_card(dev);
745
746 if (card->ext_csd.rev < 7) {
747 return sprintf(buf, "0x%x\n", card->cid.fwrev);
748 } else {
749 return sprintf(buf, "0x%*phN\n", MMC_FIRMWARE_LEN,
750 card->ext_csd.fwrev);
751 }
752}
753
754static DEVICE_ATTR(fwrev, S_IRUGO, mmc_fwrev_show, NULL);
755
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100756static struct attribute *mmc_std_attrs[] = {
757 &dev_attr_cid.attr,
758 &dev_attr_csd.attr,
759 &dev_attr_date.attr,
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700760 &dev_attr_erase_size.attr,
761 &dev_attr_preferred_erase_size.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100762 &dev_attr_fwrev.attr,
Gwendal Grignou0f762422014-10-16 11:27:16 -0700763 &dev_attr_ffu_capable.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100764 &dev_attr_hwrev.attr,
765 &dev_attr_manfid.attr,
766 &dev_attr_name.attr,
767 &dev_attr_oemid.attr,
Bernie Thompson51e7e8b2013-02-27 12:19:17 -0800768 &dev_attr_prv.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100769 &dev_attr_serial.attr,
Chuanxiao Dong709de99d2011-01-22 04:09:41 +0800770 &dev_attr_enhanced_area_offset.attr,
771 &dev_attr_enhanced_area_size.attr,
Loic Pallardy188cc042012-08-06 17:12:29 +0200772 &dev_attr_raw_rpmb_size_mult.attr,
773 &dev_attr_rel_sectors.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100774 NULL,
775};
Axel Lind1e58212014-03-08 15:05:27 +0800776ATTRIBUTE_GROUPS(mmc_std);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100777
778static struct device_type mmc_type = {
Axel Lind1e58212014-03-08 15:05:27 +0800779 .groups = mmc_std_groups,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100780};
781
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100782/*
Girish K Sb87d8db2011-09-23 20:41:47 +0530783 * Select the PowerClass for the current bus width
784 * If power class is defined for 4/8 bit bus in the
785 * extended CSD register, select it by executing the
786 * mmc_switch command.
787 */
Seungwon Jeon23850492014-04-23 17:08:05 +0900788static int __mmc_select_powerclass(struct mmc_card *card,
789 unsigned int bus_width)
Girish K Sb87d8db2011-09-23 20:41:47 +0530790{
Seungwon Jeon23850492014-04-23 17:08:05 +0900791 struct mmc_host *host = card->host;
792 struct mmc_ext_csd *ext_csd = &card->ext_csd;
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200793 unsigned int pwrclass_val = 0;
Seungwon Jeon23850492014-04-23 17:08:05 +0900794 int err = 0;
Girish K Sb87d8db2011-09-23 20:41:47 +0530795
Girish K Sb87d8db2011-09-23 20:41:47 +0530796 /* Power class selection is supported for versions >= 4.0 */
797 if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
798 return 0;
799
800 /* Power class values are defined only for 4/8 bit bus */
801 if (bus_width == EXT_CSD_BUS_WIDTH_1)
802 return 0;
803
804 switch (1 << host->ios.vdd) {
805 case MMC_VDD_165_195:
Seungwon Jeon23850492014-04-23 17:08:05 +0900806 if (host->ios.clock <= MMC_HIGH_26_MAX_DTR)
807 pwrclass_val = ext_csd->raw_pwr_cl_26_195;
808 else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR)
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200809 pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ?
Seungwon Jeon23850492014-04-23 17:08:05 +0900810 ext_csd->raw_pwr_cl_52_195 :
811 ext_csd->raw_pwr_cl_ddr_52_195;
812 else if (host->ios.clock <= MMC_HS200_MAX_DTR)
813 pwrclass_val = ext_csd->raw_pwr_cl_200_195;
Girish K Sb87d8db2011-09-23 20:41:47 +0530814 break;
Subhash Jadavani93fc5a42012-04-03 12:25:58 +0530815 case MMC_VDD_27_28:
816 case MMC_VDD_28_29:
817 case MMC_VDD_29_30:
818 case MMC_VDD_30_31:
819 case MMC_VDD_31_32:
Girish K Sb87d8db2011-09-23 20:41:47 +0530820 case MMC_VDD_32_33:
821 case MMC_VDD_33_34:
822 case MMC_VDD_34_35:
823 case MMC_VDD_35_36:
Seungwon Jeon23850492014-04-23 17:08:05 +0900824 if (host->ios.clock <= MMC_HIGH_26_MAX_DTR)
825 pwrclass_val = ext_csd->raw_pwr_cl_26_360;
826 else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR)
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200827 pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ?
Seungwon Jeon23850492014-04-23 17:08:05 +0900828 ext_csd->raw_pwr_cl_52_360 :
829 ext_csd->raw_pwr_cl_ddr_52_360;
830 else if (host->ios.clock <= MMC_HS200_MAX_DTR)
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900831 pwrclass_val = (bus_width == EXT_CSD_DDR_BUS_WIDTH_8) ?
832 ext_csd->raw_pwr_cl_ddr_200_360 :
833 ext_csd->raw_pwr_cl_200_360;
Girish K Sb87d8db2011-09-23 20:41:47 +0530834 break;
835 default:
Joe Perches66061102014-09-12 14:56:56 -0700836 pr_warn("%s: Voltage range not supported for power class\n",
837 mmc_hostname(host));
Girish K Sb87d8db2011-09-23 20:41:47 +0530838 return -EINVAL;
839 }
840
Girish K Sb87d8db2011-09-23 20:41:47 +0530841 if (bus_width & (EXT_CSD_BUS_WIDTH_8 | EXT_CSD_DDR_BUS_WIDTH_8))
842 pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_8BIT_MASK) >>
843 EXT_CSD_PWR_CL_8BIT_SHIFT;
844 else
845 pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_4BIT_MASK) >>
846 EXT_CSD_PWR_CL_4BIT_SHIFT;
847
848 /* If the power class is different from the default value */
849 if (pwrclass_val > 0) {
850 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
851 EXT_CSD_POWER_CLASS,
852 pwrclass_val,
Seungwon Jeon71fe3eb2011-10-18 13:20:57 +0900853 card->ext_csd.generic_cmd6_time);
Girish K Sb87d8db2011-09-23 20:41:47 +0530854 }
855
856 return err;
857}
858
Seungwon Jeon23850492014-04-23 17:08:05 +0900859static int mmc_select_powerclass(struct mmc_card *card)
860{
861 struct mmc_host *host = card->host;
862 u32 bus_width, ext_csd_bits;
863 int err, ddr;
864
865 /* Power class selection is supported for versions >= 4.0 */
866 if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
867 return 0;
868
869 bus_width = host->ios.bus_width;
870 /* Power class values are defined only for 4/8 bit bus */
871 if (bus_width == MMC_BUS_WIDTH_1)
872 return 0;
873
874 ddr = card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52;
875 if (ddr)
876 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
877 EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4;
878 else
879 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
880 EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4;
881
882 err = __mmc_select_powerclass(card, ext_csd_bits);
883 if (err)
884 pr_warn("%s: power class selection to bus width %d ddr %d failed\n",
885 mmc_hostname(host), 1 << bus_width, ddr);
886
887 return err;
888}
889
Girish K Sb87d8db2011-09-23 20:41:47 +0530890/*
Seungwon Jeon577fb132014-04-23 17:08:44 +0900891 * Set the bus speed for the selected speed mode.
Girish K Sa4924c72012-01-11 14:04:52 -0500892 */
Seungwon Jeon577fb132014-04-23 17:08:44 +0900893static void mmc_set_bus_speed(struct mmc_card *card)
Girish K Sa4924c72012-01-11 14:04:52 -0500894{
Seungwon Jeon577fb132014-04-23 17:08:44 +0900895 unsigned int max_dtr = (unsigned int)-1;
896
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900897 if ((mmc_card_hs200(card) || mmc_card_hs400(card)) &&
898 max_dtr > card->ext_csd.hs200_max_dtr)
Seungwon Jeon577fb132014-04-23 17:08:44 +0900899 max_dtr = card->ext_csd.hs200_max_dtr;
900 else if (mmc_card_hs(card) && max_dtr > card->ext_csd.hs_max_dtr)
901 max_dtr = card->ext_csd.hs_max_dtr;
902 else if (max_dtr > card->csd.max_dtr)
903 max_dtr = card->csd.max_dtr;
904
905 mmc_set_clock(card->host, max_dtr);
906}
907
908/*
909 * Select the bus width amoung 4-bit and 8-bit(SDR).
910 * If the bus width is changed successfully, return the selected width value.
911 * Zero is returned instead of error value if the wide width is not supported.
912 */
913static int mmc_select_bus_width(struct mmc_card *card)
914{
Girish K Sa4924c72012-01-11 14:04:52 -0500915 static unsigned ext_csd_bits[] = {
Girish K Sa4924c72012-01-11 14:04:52 -0500916 EXT_CSD_BUS_WIDTH_8,
Seungwon Jeon577fb132014-04-23 17:08:44 +0900917 EXT_CSD_BUS_WIDTH_4,
Girish K Sa4924c72012-01-11 14:04:52 -0500918 };
919 static unsigned bus_widths[] = {
Girish K Sa4924c72012-01-11 14:04:52 -0500920 MMC_BUS_WIDTH_8,
Seungwon Jeon577fb132014-04-23 17:08:44 +0900921 MMC_BUS_WIDTH_4,
Girish K Sa4924c72012-01-11 14:04:52 -0500922 };
Seungwon Jeon577fb132014-04-23 17:08:44 +0900923 struct mmc_host *host = card->host;
924 unsigned idx, bus_width = 0;
925 int err = 0;
Girish K Sa4924c72012-01-11 14:04:52 -0500926
Seungwon Jeon577fb132014-04-23 17:08:44 +0900927 if ((card->csd.mmca_vsn < CSD_SPEC_VER_4) &&
928 !(host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)))
929 return 0;
Girish K Sa4924c72012-01-11 14:04:52 -0500930
Seungwon Jeon577fb132014-04-23 17:08:44 +0900931 idx = (host->caps & MMC_CAP_8_BIT_DATA) ? 0 : 1;
Girish K Sa4924c72012-01-11 14:04:52 -0500932
933 /*
934 * Unlike SD, MMC cards dont have a configuration register to notify
935 * supported bus width. So bus test command should be run to identify
936 * the supported bus width or compare the ext csd values of current
937 * bus width and ext csd values of 1 bit mode read earlier.
938 */
Seungwon Jeon577fb132014-04-23 17:08:44 +0900939 for (; idx < ARRAY_SIZE(bus_widths); idx++) {
Girish K Sa4924c72012-01-11 14:04:52 -0500940 /*
941 * Host is capable of 8bit transfer, then switch
942 * the device to work in 8bit transfer mode. If the
943 * mmc switch command returns error then switch to
944 * 4bit transfer mode. On success set the corresponding
945 * bus width on the host.
946 */
947 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
948 EXT_CSD_BUS_WIDTH,
949 ext_csd_bits[idx],
950 card->ext_csd.generic_cmd6_time);
951 if (err)
952 continue;
953
Seungwon Jeon577fb132014-04-23 17:08:44 +0900954 bus_width = bus_widths[idx];
955 mmc_set_bus_width(host, bus_width);
Girish K Sa4924c72012-01-11 14:04:52 -0500956
Seungwon Jeon577fb132014-04-23 17:08:44 +0900957 /*
958 * If controller can't handle bus width test,
959 * compare ext_csd previously read in 1 bit mode
960 * against ext_csd at new bus width
961 */
Girish K Sa4924c72012-01-11 14:04:52 -0500962 if (!(host->caps & MMC_CAP_BUS_WIDTH_TEST))
Seungwon Jeon577fb132014-04-23 17:08:44 +0900963 err = mmc_compare_ext_csds(card, bus_width);
Girish K Sa4924c72012-01-11 14:04:52 -0500964 else
Seungwon Jeon577fb132014-04-23 17:08:44 +0900965 err = mmc_bus_test(card, bus_width);
966
967 if (!err) {
968 err = bus_width;
Girish K Sa4924c72012-01-11 14:04:52 -0500969 break;
Seungwon Jeon577fb132014-04-23 17:08:44 +0900970 } else {
971 pr_warn("%s: switch to bus width %d failed\n",
972 mmc_hostname(host), ext_csd_bits[idx]);
973 }
Girish K Sa4924c72012-01-11 14:04:52 -0500974 }
975
Seungwon Jeon577fb132014-04-23 17:08:44 +0900976 return err;
977}
978
979/*
980 * Switch to the high-speed mode
981 */
982static int mmc_select_hs(struct mmc_card *card)
983{
984 int err;
985
986 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
987 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS,
988 card->ext_csd.generic_cmd6_time,
989 true, true, true);
Girish K Sa4924c72012-01-11 14:04:52 -0500990 if (!err)
Seungwon Jeon577fb132014-04-23 17:08:44 +0900991 mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
992
993 return err;
994}
995
996/*
997 * Activate wide bus and DDR if supported.
998 */
999static int mmc_select_hs_ddr(struct mmc_card *card)
1000{
1001 struct mmc_host *host = card->host;
1002 u32 bus_width, ext_csd_bits;
1003 int err = 0;
1004
1005 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52))
1006 return 0;
1007
1008 bus_width = host->ios.bus_width;
1009 if (bus_width == MMC_BUS_WIDTH_1)
1010 return 0;
1011
1012 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
1013 EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4;
1014
1015 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1016 EXT_CSD_BUS_WIDTH,
1017 ext_csd_bits,
1018 card->ext_csd.generic_cmd6_time);
1019 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001020 pr_err("%s: switch to bus width %d ddr failed\n",
Seungwon Jeon577fb132014-04-23 17:08:44 +09001021 mmc_hostname(host), 1 << bus_width);
1022 return err;
1023 }
1024
1025 /*
1026 * eMMC cards can support 3.3V to 1.2V i/o (vccq)
1027 * signaling.
1028 *
1029 * EXT_CSD_CARD_TYPE_DDR_1_8V means 3.3V or 1.8V vccq.
1030 *
1031 * 1.8V vccq at 3.3V core voltage (vcc) is not required
1032 * in the JEDEC spec for DDR.
1033 *
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001034 * Even (e)MMC card can support 3.3v to 1.2v vccq, but not all
1035 * host controller can support this, like some of the SDHCI
1036 * controller which connect to an eMMC device. Some of these
1037 * host controller still needs to use 1.8v vccq for supporting
1038 * DDR mode.
1039 *
1040 * So the sequence will be:
1041 * if (host and device can both support 1.2v IO)
1042 * use 1.2v IO;
1043 * else if (host and device can both support 1.8v IO)
1044 * use 1.8v IO;
1045 * so if host and device can only support 3.3v IO, this is the
1046 * last choice.
Seungwon Jeon577fb132014-04-23 17:08:44 +09001047 *
1048 * WARNING: eMMC rules are NOT the same as SD DDR
1049 */
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001050 err = -EINVAL;
1051 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V)
1052 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
Seungwon Jeon577fb132014-04-23 17:08:44 +09001053
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001054 if (err && (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V))
1055 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
1056
1057 /* make sure vccq is 3.3v after switching disaster */
1058 if (err)
1059 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330);
1060
1061 if (!err)
1062 mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
Seungwon Jeon577fb132014-04-23 17:08:44 +09001063
1064 return err;
1065}
1066
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001067static int mmc_select_hs400(struct mmc_card *card)
1068{
1069 struct mmc_host *host = card->host;
1070 int err = 0;
1071
1072 /*
1073 * HS400 mode requires 8-bit bus width
1074 */
1075 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 &&
1076 host->ios.bus_width == MMC_BUS_WIDTH_8))
1077 return 0;
1078
1079 /*
1080 * Before switching to dual data rate operation for HS400,
1081 * it is required to convert from HS200 mode to HS mode.
1082 */
1083 mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
1084 mmc_set_bus_speed(card);
1085
1086 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1087 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS,
1088 card->ext_csd.generic_cmd6_time,
1089 true, true, true);
1090 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001091 pr_err("%s: switch to high-speed from hs200 failed, err:%d\n",
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001092 mmc_hostname(host), err);
1093 return err;
1094 }
1095
1096 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1097 EXT_CSD_BUS_WIDTH,
1098 EXT_CSD_DDR_BUS_WIDTH_8,
1099 card->ext_csd.generic_cmd6_time);
1100 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001101 pr_err("%s: switch to bus width for hs400 failed, err:%d\n",
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001102 mmc_hostname(host), err);
1103 return err;
1104 }
1105
1106 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1107 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS400,
1108 card->ext_csd.generic_cmd6_time,
1109 true, true, true);
1110 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001111 pr_err("%s: switch to hs400 failed, err:%d\n",
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001112 mmc_hostname(host), err);
1113 return err;
1114 }
1115
1116 mmc_set_timing(host, MMC_TIMING_MMC_HS400);
1117 mmc_set_bus_speed(card);
1118
1119 return 0;
1120}
1121
Seungwon Jeon577fb132014-04-23 17:08:44 +09001122/*
1123 * For device supporting HS200 mode, the following sequence
1124 * should be done before executing the tuning process.
1125 * 1. set the desired bus width(4-bit or 8-bit, 1-bit is not supported)
1126 * 2. switch to HS200 mode
1127 * 3. set the clock to > 52Mhz and <=200MHz
1128 */
1129static int mmc_select_hs200(struct mmc_card *card)
1130{
1131 struct mmc_host *host = card->host;
1132 int err = -EINVAL;
1133
1134 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V)
1135 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
1136
1137 if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_8V)
1138 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
1139
1140 /* If fails try again during next card power cycle */
1141 if (err)
1142 goto err;
1143
1144 /*
1145 * Set the bus width(4 or 8) with host's support and
1146 * switch to HS200 mode if bus width is set successfully.
1147 */
1148 err = mmc_select_bus_width(card);
1149 if (!IS_ERR_VALUE(err)) {
Ulf Hansson4509f84772014-01-08 16:09:33 +01001150 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeon577fb132014-04-23 17:08:44 +09001151 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200,
1152 card->ext_csd.generic_cmd6_time,
1153 true, true, true);
1154 if (!err)
1155 mmc_set_timing(host, MMC_TIMING_MMC_HS200);
1156 }
Girish K Sa4924c72012-01-11 14:04:52 -05001157err:
1158 return err;
1159}
1160
1161/*
Seungwon Jeon577fb132014-04-23 17:08:44 +09001162 * Activate High Speed or HS200 mode if supported.
1163 */
1164static int mmc_select_timing(struct mmc_card *card)
1165{
1166 int err = 0;
1167
1168 if ((card->csd.mmca_vsn < CSD_SPEC_VER_4 &&
1169 card->ext_csd.hs_max_dtr == 0))
1170 goto bus_speed;
1171
1172 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200)
1173 err = mmc_select_hs200(card);
1174 else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS)
1175 err = mmc_select_hs(card);
1176
1177 if (err && err != -EBADMSG)
1178 return err;
1179
1180 if (err) {
1181 pr_warn("%s: switch to %s failed\n",
1182 mmc_card_hs(card) ? "high-speed" :
1183 (mmc_card_hs200(card) ? "hs200" : ""),
1184 mmc_hostname(card->host));
1185 err = 0;
1186 }
1187
1188bus_speed:
1189 /*
1190 * Set the bus speed to the selected bus timing.
1191 * If timing is not selected, backward compatible is the default.
1192 */
1193 mmc_set_bus_speed(card);
1194 return err;
1195}
1196
Stephen Boyd48d11e062014-09-22 12:26:10 -07001197const u8 tuning_blk_pattern_4bit[MMC_TUNING_BLK_PATTERN_4BIT_SIZE] = {
1198 0xff, 0x0f, 0xff, 0x00, 0xff, 0xcc, 0xc3, 0xcc,
1199 0xc3, 0x3c, 0xcc, 0xff, 0xfe, 0xff, 0xfe, 0xef,
1200 0xff, 0xdf, 0xff, 0xdd, 0xff, 0xfb, 0xff, 0xfb,
1201 0xbf, 0xff, 0x7f, 0xff, 0x77, 0xf7, 0xbd, 0xef,
1202 0xff, 0xf0, 0xff, 0xf0, 0x0f, 0xfc, 0xcc, 0x3c,
1203 0xcc, 0x33, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xee,
1204 0xff, 0xfd, 0xff, 0xfd, 0xdf, 0xff, 0xbf, 0xff,
1205 0xbb, 0xff, 0xf7, 0xff, 0xf7, 0x7f, 0x7b, 0xde,
1206};
1207EXPORT_SYMBOL(tuning_blk_pattern_4bit);
1208
1209const u8 tuning_blk_pattern_8bit[MMC_TUNING_BLK_PATTERN_8BIT_SIZE] = {
1210 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
1211 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc, 0xcc,
1212 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff, 0xff,
1213 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee, 0xff,
1214 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd, 0xdd,
1215 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xbb,
1216 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff,
1217 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee, 0xff,
1218 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00,
1219 0x00, 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc,
1220 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff,
1221 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee,
1222 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd,
1223 0xdd, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff,
1224 0xbb, 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff,
1225 0xff, 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee,
1226};
1227EXPORT_SYMBOL(tuning_blk_pattern_8bit);
1228
Seungwon Jeon577fb132014-04-23 17:08:44 +09001229/*
1230 * Execute tuning sequence to seek the proper bus operating
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001231 * conditions for HS200 and HS400, which sends CMD21 to the device.
Seungwon Jeon577fb132014-04-23 17:08:44 +09001232 */
1233static int mmc_hs200_tuning(struct mmc_card *card)
1234{
1235 struct mmc_host *host = card->host;
1236 int err = 0;
1237
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001238 /*
1239 * Timing should be adjusted to the HS400 target
1240 * operation frequency for tuning process
1241 */
1242 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 &&
1243 host->ios.bus_width == MMC_BUS_WIDTH_8)
1244 if (host->ops->prepare_hs400_tuning)
1245 host->ops->prepare_hs400_tuning(host, &host->ios);
1246
Seungwon Jeon577fb132014-04-23 17:08:44 +09001247 if (host->ops->execute_tuning) {
1248 mmc_host_clk_hold(host);
1249 err = host->ops->execute_tuning(host,
1250 MMC_SEND_TUNING_BLOCK_HS200);
1251 mmc_host_clk_release(host);
1252
1253 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001254 pr_err("%s: tuning execution failed\n",
Seungwon Jeon577fb132014-04-23 17:08:44 +09001255 mmc_hostname(host));
1256 }
1257
1258 return err;
1259}
1260
1261/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001262 * Handle the detection and initialisation of a card.
1263 *
Deepak Saxena87693922008-06-16 19:20:57 -07001264 * In the case of a resume, "oldcard" will contain the card
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001265 * we're trying to reinitialise.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001266 */
Pierre Ossman8c75dea2007-05-19 16:14:43 +02001267static int mmc_init_card(struct mmc_host *host, u32 ocr,
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001268 struct mmc_card *oldcard)
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001269{
1270 struct mmc_card *card;
Seungwon Jeon577fb132014-04-23 17:08:44 +09001271 int err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001272 u32 cid[4];
Philip Rakityb676f032011-02-13 23:13:09 -08001273 u32 rocr;
Philip Rakity08ee80c2011-05-24 18:14:58 -07001274 u8 *ext_csd = NULL;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001275
1276 BUG_ON(!host);
Pierre Ossmand84075c82007-08-09 13:23:56 +02001277 WARN_ON(!host->claimed);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001278
Stefan Nilsson XK44669032011-09-15 17:50:38 +02001279 /* Set correct bus mode for MMC before attempting init */
1280 if (!mmc_host_is_spi(host))
1281 mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);
1282
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001283 /*
1284 * Since we're changing the OCR value, we seem to
1285 * need to tell some cards to go back to the idle
1286 * state. We wait 1ms to give cards time to
1287 * respond.
Balaji T Kc3805462011-09-08 22:08:39 +05301288 * mmc_go_idle is needed for eMMC that are asleep
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001289 */
1290 mmc_go_idle(host);
1291
1292 /* The extra bit indicates that we support high capacity */
Philip Rakityb676f032011-02-13 23:13:09 -08001293 err = mmc_send_op_cond(host, ocr | (1 << 30), &rocr);
Pierre Ossman17b04292007-07-22 22:18:46 +02001294 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001295 goto err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001296
1297 /*
David Brownellaf517152007-08-08 09:11:32 -07001298 * For SPI, enable CRC as appropriate.
1299 */
1300 if (mmc_host_is_spi(host)) {
1301 err = mmc_spi_set_crc(host, use_spi_crc);
1302 if (err)
1303 goto err;
1304 }
1305
1306 /*
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001307 * Fetch CID from card.
1308 */
David Brownellaf517152007-08-08 09:11:32 -07001309 if (mmc_host_is_spi(host))
1310 err = mmc_send_cid(host, cid);
1311 else
1312 err = mmc_all_send_cid(host, cid);
Pierre Ossman17b04292007-07-22 22:18:46 +02001313 if (err)
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001314 goto err;
1315
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001316 if (oldcard) {
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001317 if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) {
1318 err = -ENOENT;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001319 goto err;
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001320 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001321
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001322 card = oldcard;
1323 } else {
1324 /*
1325 * Allocate card structure.
1326 */
Pierre Ossman51ec92e2008-03-21 23:54:50 +01001327 card = mmc_alloc_card(host, &mmc_type);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001328 if (IS_ERR(card)) {
1329 err = PTR_ERR(card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001330 goto err;
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001331 }
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001332
Ulf Hansson69041152013-09-13 11:31:33 +02001333 card->ocr = ocr;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001334 card->type = MMC_TYPE_MMC;
1335 card->rca = 1;
1336 memcpy(card->raw_cid, cid, sizeof(card->raw_cid));
1337 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001338
1339 /*
David Brownellaf517152007-08-08 09:11:32 -07001340 * For native busses: set card RCA and quit open drain mode.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001341 */
David Brownellaf517152007-08-08 09:11:32 -07001342 if (!mmc_host_is_spi(host)) {
1343 err = mmc_set_relative_addr(card);
1344 if (err)
1345 goto free_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001346
David Brownellaf517152007-08-08 09:11:32 -07001347 mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);
1348 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001349
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001350 if (!oldcard) {
1351 /*
1352 * Fetch CSD from card.
1353 */
1354 err = mmc_send_csd(card, card->raw_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +02001355 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001356 goto free_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001357
Pierre Ossmanbd766312007-05-01 16:11:57 +02001358 err = mmc_decode_csd(card);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001359 if (err)
Pierre Ossmanbd766312007-05-01 16:11:57 +02001360 goto free_card;
1361 err = mmc_decode_cid(card);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001362 if (err)
Pierre Ossmanbd766312007-05-01 16:11:57 +02001363 goto free_card;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001364 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001365
1366 /*
Sascha Hauer3d705d12014-08-19 10:45:51 +02001367 * handling only for cards supporting DSR and hosts requesting
1368 * DSR configuration
1369 */
1370 if (card->csd.dsr_imp && host->dsr_req)
1371 mmc_set_dsr(host);
1372
1373 /*
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001374 * Select card, as all following commands rely on that.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001375 */
David Brownellaf517152007-08-08 09:11:32 -07001376 if (!mmc_host_is_spi(host)) {
1377 err = mmc_select_card(card);
1378 if (err)
1379 goto free_card;
1380 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001381
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001382 if (!oldcard) {
1383 /*
David Brownellaf517152007-08-08 09:11:32 -07001384 * Fetch and process extended CSD.
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001385 */
Philip Rakity08ee80c2011-05-24 18:14:58 -07001386
1387 err = mmc_get_ext_csd(card, &ext_csd);
1388 if (err)
1389 goto free_card;
1390 err = mmc_read_ext_csd(card, ext_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +02001391 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001392 goto free_card;
Philip Rakityb676f032011-02-13 23:13:09 -08001393
1394 /* If doing byte addressing, check if required to do sector
1395 * addressing. Handle the case of <2GB cards needing sector
1396 * addressing. See section 8.1 JEDEC Standard JED84-A441;
1397 * ocr register has bit 30 set for sector addressing.
1398 */
1399 if (!(mmc_card_blockaddr(card)) && (rocr & (1<<30)))
1400 mmc_card_set_blockaddr(card);
1401
Adrian Hunterdfe86cb2010-08-11 14:17:46 -07001402 /* Erase size depends on CSD and Extended CSD */
1403 mmc_set_erase_size(card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001404 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001405
1406 /*
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001407 * If enhanced_area_en is TRUE, host needs to enable ERASE_GRP_DEF
Lucas De Marchi25985ed2011-03-30 22:57:33 -03001408 * bit. This bit will be lost every time after a reset or power off.
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001409 */
Grégory Soutadé69803d42014-09-15 17:47:09 +02001410 if (card->ext_csd.partition_setting_completed ||
Adrian Hunter83bb24a2012-03-13 05:19:13 -04001411 (card->ext_csd.rev >= 3 && (host->caps2 & MMC_CAP2_HC_ERASE_SZ))) {
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001412 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeonb23cf0b2011-09-23 14:15:29 +09001413 EXT_CSD_ERASE_GROUP_DEF, 1,
1414 card->ext_csd.generic_cmd6_time);
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001415
1416 if (err && err != -EBADMSG)
1417 goto free_card;
1418
1419 if (err) {
1420 err = 0;
1421 /*
1422 * Just disable enhanced area off & sz
1423 * will try to enable ERASE_GROUP_DEF
1424 * during next time reinit
1425 */
1426 card->ext_csd.enhanced_area_offset = -EINVAL;
1427 card->ext_csd.enhanced_area_size = -EINVAL;
1428 } else {
1429 card->ext_csd.erase_group_def = 1;
1430 /*
1431 * enable ERASE_GRP_DEF successfully.
1432 * This will affect the erase size, so
1433 * here need to reset erase size
1434 */
1435 mmc_set_erase_size(card);
1436 }
1437 }
1438
1439 /*
Philip Rakity41e2a482011-03-19 14:10:33 -04001440 * Ensure eMMC user default partition is enabled
1441 */
Andrei Warkentin371a6892011-04-11 18:10:25 -05001442 if (card->ext_csd.part_config & EXT_CSD_PART_CONFIG_ACC_MASK) {
1443 card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK;
1444 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG,
1445 card->ext_csd.part_config,
1446 card->ext_csd.part_time);
1447 if (err && err != -EBADMSG)
1448 goto free_card;
Philip Rakity41e2a482011-03-19 14:10:33 -04001449 }
1450
1451 /*
Ulf Hansson432356792013-06-10 17:03:45 +02001452 * Enable power_off_notification byte in the ext_csd register
Girish K Sbec87262011-10-13 12:04:16 +05301453 */
Ulf Hansson432356792013-06-10 17:03:45 +02001454 if (card->ext_csd.rev >= 6) {
Girish K Sbec87262011-10-13 12:04:16 +05301455 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1456 EXT_CSD_POWER_OFF_NOTIFICATION,
1457 EXT_CSD_POWER_ON,
1458 card->ext_csd.generic_cmd6_time);
1459 if (err && err != -EBADMSG)
1460 goto free_card;
Girish K Sbec87262011-10-13 12:04:16 +05301461
Girish K S96a85d52011-11-04 16:22:47 +05301462 /*
1463 * The err can be -EBADMSG or 0,
1464 * so check for success and update the flag
1465 */
1466 if (!err)
Ulf Hanssone6c08582012-10-05 12:45:39 -04001467 card->ext_csd.power_off_notification = EXT_CSD_POWER_ON;
Girish K S96a85d52011-11-04 16:22:47 +05301468 }
Girish K Sbec87262011-10-13 12:04:16 +05301469
1470 /*
Seungwon Jeon577fb132014-04-23 17:08:44 +09001471 * Select timing interface
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001472 */
Seungwon Jeon577fb132014-04-23 17:08:44 +09001473 err = mmc_select_timing(card);
1474 if (err)
1475 goto free_card;
Girish K Sa4924c72012-01-11 14:04:52 -05001476
Girish K Sa4924c72012-01-11 14:04:52 -05001477 if (mmc_card_hs200(card)) {
Seungwon Jeon577fb132014-04-23 17:08:44 +09001478 err = mmc_hs200_tuning(card);
1479 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001480 goto free_card;
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001481
1482 err = mmc_select_hs400(card);
1483 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001484 goto free_card;
Seungwon Jeon577fb132014-04-23 17:08:44 +09001485 } else if (mmc_card_hs(card)) {
1486 /* Select the desired bus width optionally */
1487 err = mmc_select_bus_width(card);
1488 if (!IS_ERR_VALUE(err)) {
1489 err = mmc_select_hs_ddr(card);
1490 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001491 goto free_card;
Adrian Hunteref0b27d2009-09-22 16:44:37 -07001492 }
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001493 }
1494
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001495 /*
Seungwon Jeon23850492014-04-23 17:08:05 +09001496 * Choose the power class with selected bus interface
1497 */
1498 mmc_select_powerclass(card);
1499
1500 /*
Subhash Jadavani52d09742012-03-06 17:59:12 +05301501 * Enable HPI feature (if supported)
1502 */
1503 if (card->ext_csd.hpi) {
1504 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1505 EXT_CSD_HPI_MGMT, 1,
1506 card->ext_csd.generic_cmd6_time);
1507 if (err && err != -EBADMSG)
1508 goto free_card;
1509 if (err) {
Joe Perches66061102014-09-12 14:56:56 -07001510 pr_warn("%s: Enabling HPI failed\n",
1511 mmc_hostname(card->host));
Subhash Jadavani52d09742012-03-06 17:59:12 +05301512 err = 0;
1513 } else
1514 card->ext_csd.hpi_en = 1;
1515 }
1516
1517 /*
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001518 * If cache size is higher than 0, this indicates
1519 * the existence of cache and it can be turned on.
1520 */
Ulf Hansson7536d3f2013-12-18 11:59:17 +01001521 if (card->ext_csd.cache_size > 0) {
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001522 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001523 EXT_CSD_CACHE_CTRL, 1,
1524 card->ext_csd.generic_cmd6_time);
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001525 if (err && err != -EBADMSG)
1526 goto free_card;
1527
1528 /*
1529 * Only if no error, cache is turned on successfully.
1530 */
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001531 if (err) {
Joe Perches66061102014-09-12 14:56:56 -07001532 pr_warn("%s: Cache is supported, but failed to turn on (%d)\n",
1533 mmc_hostname(card->host), err);
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001534 card->ext_csd.cache_ctrl = 0;
1535 err = 0;
1536 } else {
1537 card->ext_csd.cache_ctrl = 1;
1538 }
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001539 }
1540
Seungwon Jeonabd9ac12013-02-06 17:01:43 +09001541 /*
1542 * The mandatory minimum values are defined for packed command.
1543 * read: 5, write: 3
1544 */
1545 if (card->ext_csd.max_packed_writes >= 3 &&
1546 card->ext_csd.max_packed_reads >= 5 &&
1547 host->caps2 & MMC_CAP2_PACKED_CMD) {
1548 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1549 EXT_CSD_EXP_EVENTS_CTRL,
1550 EXT_CSD_PACKED_EVENT_EN,
1551 card->ext_csd.generic_cmd6_time);
1552 if (err && err != -EBADMSG)
1553 goto free_card;
1554 if (err) {
1555 pr_warn("%s: Enabling packed event failed\n",
1556 mmc_hostname(card->host));
1557 card->ext_csd.packed_event_en = 0;
1558 err = 0;
1559 } else {
1560 card->ext_csd.packed_event_en = 1;
1561 }
1562 }
1563
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001564 if (!oldcard)
1565 host->card = card;
1566
Ulf Hansson00b41b52014-10-16 16:18:51 +02001567 kfree(ext_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +02001568 return 0;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001569
1570free_card:
1571 if (!oldcard)
1572 mmc_remove_card(card);
1573err:
Ulf Hansson00b41b52014-10-16 16:18:51 +02001574 kfree(ext_csd);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001575
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001576 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001577}
1578
Ulf Hansson07a68212013-04-19 15:12:11 +02001579static int mmc_can_sleep(struct mmc_card *card)
1580{
1581 return (card && card->ext_csd.rev >= 3);
1582}
1583
1584static int mmc_sleep(struct mmc_host *host)
1585{
1586 struct mmc_command cmd = {0};
1587 struct mmc_card *card = host->card;
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001588 unsigned int timeout_ms = DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000);
Ulf Hansson07a68212013-04-19 15:12:11 +02001589 int err;
1590
Ulf Hansson07a68212013-04-19 15:12:11 +02001591 err = mmc_deselect_cards(host);
1592 if (err)
1593 return err;
1594
1595 cmd.opcode = MMC_SLEEP_AWAKE;
1596 cmd.arg = card->rca << 16;
1597 cmd.arg |= 1 << 15;
1598
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001599 /*
1600 * If the max_busy_timeout of the host is specified, validate it against
1601 * the sleep cmd timeout. A failure means we need to prevent the host
1602 * from doing hw busy detection, which is done by converting to a R1
1603 * response instead of a R1B.
1604 */
1605 if (host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) {
1606 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
1607 } else {
1608 cmd.flags = MMC_RSP_R1B | MMC_CMD_AC;
1609 cmd.busy_timeout = timeout_ms;
1610 }
1611
Ulf Hansson07a68212013-04-19 15:12:11 +02001612 err = mmc_wait_for_cmd(host, &cmd, 0);
1613 if (err)
1614 return err;
1615
1616 /*
1617 * If the host does not wait while the card signals busy, then we will
1618 * will have to wait the sleep/awake timeout. Note, we cannot use the
1619 * SEND_STATUS command to poll the status because that command (and most
1620 * others) is invalid while the card sleeps.
1621 */
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001622 if (!cmd.busy_timeout || !(host->caps & MMC_CAP_WAIT_WHILE_BUSY))
1623 mmc_delay(timeout_ms);
Ulf Hansson07a68212013-04-19 15:12:11 +02001624
1625 return err;
1626}
1627
Ulf Hanssone6c08582012-10-05 12:45:39 -04001628static int mmc_can_poweroff_notify(const struct mmc_card *card)
1629{
1630 return card &&
1631 mmc_card_mmc(card) &&
1632 (card->ext_csd.power_off_notification == EXT_CSD_POWER_ON);
1633}
1634
1635static int mmc_poweroff_notify(struct mmc_card *card, unsigned int notify_type)
1636{
1637 unsigned int timeout = card->ext_csd.generic_cmd6_time;
1638 int err;
1639
1640 /* Use EXT_CSD_POWER_OFF_SHORT as default notification type. */
1641 if (notify_type == EXT_CSD_POWER_OFF_LONG)
1642 timeout = card->ext_csd.power_off_longtime;
1643
Ulf Hansson878e2002013-09-09 11:57:57 +02001644 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1645 EXT_CSD_POWER_OFF_NOTIFICATION,
Ulf Hansson4509f84772014-01-08 16:09:33 +01001646 notify_type, timeout, true, false, false);
Ulf Hanssone6c08582012-10-05 12:45:39 -04001647 if (err)
1648 pr_err("%s: Power Off Notification timed out, %u\n",
1649 mmc_hostname(card->host), timeout);
1650
1651 /* Disable the power off notification after the switch operation. */
1652 card->ext_csd.power_off_notification = EXT_CSD_NO_POWER_NOTIFICATION;
1653
1654 return err;
1655}
1656
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001657/*
1658 * Host is being removed. Free up the current card.
1659 */
1660static void mmc_remove(struct mmc_host *host)
1661{
1662 BUG_ON(!host);
1663 BUG_ON(!host->card);
1664
1665 mmc_remove_card(host->card);
1666 host->card = NULL;
1667}
1668
1669/*
Adrian Hunterd3049502011-11-28 16:22:00 +02001670 * Card detection - card is alive.
1671 */
1672static int mmc_alive(struct mmc_host *host)
1673{
1674 return mmc_send_status(host->card, NULL);
1675}
1676
1677/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001678 * Card detection callback from host.
1679 */
1680static void mmc_detect(struct mmc_host *host)
1681{
1682 int err;
1683
1684 BUG_ON(!host);
1685 BUG_ON(!host->card);
1686
Ulf Hanssone94cfef2013-05-02 14:02:38 +02001687 mmc_get_card(host->card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001688
1689 /*
1690 * Just check if our card has been removed.
1691 */
Adrian Hunterd3049502011-11-28 16:22:00 +02001692 err = _mmc_detect_card_removed(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001693
Ulf Hanssone94cfef2013-05-02 14:02:38 +02001694 mmc_put_card(host->card);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001695
Pierre Ossman17b04292007-07-22 22:18:46 +02001696 if (err) {
Pierre Ossman4101c162007-05-19 13:39:01 +02001697 mmc_remove(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001698
1699 mmc_claim_host(host);
1700 mmc_detach_bus(host);
Ulf Hansson7f7e4122011-09-21 14:08:13 -04001701 mmc_power_off(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001702 mmc_release_host(host);
1703 }
1704}
1705
Ulf Hansson03d071f2013-06-10 17:03:43 +02001706static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001707{
Balaji T Kc3805462011-09-08 22:08:39 +05301708 int err = 0;
Ulf Hansson03d071f2013-06-10 17:03:43 +02001709 unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
1710 EXT_CSD_POWER_OFF_LONG;
Balaji T Kc3805462011-09-08 22:08:39 +05301711
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001712 BUG_ON(!host);
1713 BUG_ON(!host->card);
1714
1715 mmc_claim_host(host);
Maya Erez881d9262013-01-28 16:44:22 -05001716
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001717 if (mmc_card_suspended(host->card))
1718 goto out;
1719
Ulf Hansson39b94312013-05-02 14:02:36 +02001720 if (mmc_card_doing_bkops(host->card)) {
1721 err = mmc_stop_bkops(host->card);
1722 if (err)
1723 goto out;
1724 }
1725
Ulf Hansson10e5d962013-12-16 16:23:22 +01001726 err = mmc_flush_cache(host->card);
Maya Erez881d9262013-01-28 16:44:22 -05001727 if (err)
1728 goto out;
1729
Ulf Hansson432356792013-06-10 17:03:45 +02001730 if (mmc_can_poweroff_notify(host->card) &&
Ulf Hansson53275c22013-06-10 17:03:46 +02001731 ((host->caps2 & MMC_CAP2_FULL_PWR_CYCLE) || !is_suspend))
Ulf Hansson03d071f2013-06-10 17:03:43 +02001732 err = mmc_poweroff_notify(host->card, notify_type);
Ulf Hansson07a68212013-04-19 15:12:11 +02001733 else if (mmc_can_sleep(host->card))
1734 err = mmc_sleep(host);
Ulf Hanssone6c08582012-10-05 12:45:39 -04001735 else if (!mmc_host_is_spi(host))
Jaehoon Chung85e727e2012-05-31 20:31:47 +09001736 err = mmc_deselect_cards(host);
Nicolas Pitre95cdfb72009-09-22 16:45:29 -07001737
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001738 if (!err) {
Ulf Hansson74590262013-06-10 17:03:38 +02001739 mmc_power_off(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001740 mmc_card_set_suspended(host->card);
1741 }
Maya Erez881d9262013-01-28 16:44:22 -05001742out:
1743 mmc_release_host(host);
Balaji T Kc3805462011-09-08 22:08:39 +05301744 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001745}
1746
1747/*
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001748 * Suspend callback
Ulf Hansson03d071f2013-06-10 17:03:43 +02001749 */
1750static int mmc_suspend(struct mmc_host *host)
1751{
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001752 int err;
1753
1754 err = _mmc_suspend(host, true);
1755 if (!err) {
1756 pm_runtime_disable(&host->card->dev);
1757 pm_runtime_set_suspended(&host->card->dev);
1758 }
1759
1760 return err;
Ulf Hansson03d071f2013-06-10 17:03:43 +02001761}
1762
1763/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001764 * This function tries to determine if the same card is still present
1765 * and, if so, restore all state to it.
1766 */
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001767static int _mmc_resume(struct mmc_host *host)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001768{
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001769 int err = 0;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001770
1771 BUG_ON(!host);
1772 BUG_ON(!host->card);
1773
1774 mmc_claim_host(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001775
1776 if (!mmc_card_suspended(host->card))
1777 goto out;
1778
Ulf Hansson69041152013-09-13 11:31:33 +02001779 mmc_power_up(host, host->card->ocr);
Ulf Hansson69041152013-09-13 11:31:33 +02001780 err = mmc_init_card(host, host->card->ocr, host->card);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001781 mmc_card_clr_suspended(host->card);
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001782
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001783out:
1784 mmc_release_host(host);
Nicolas Pitre95cdfb72009-09-22 16:45:29 -07001785 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001786}
1787
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001788/*
1789 * Shutdown callback
1790 */
1791static int mmc_shutdown(struct mmc_host *host)
1792{
1793 int err = 0;
1794
1795 /*
1796 * In a specific case for poweroff notify, we need to resume the card
1797 * before we can shutdown it properly.
1798 */
1799 if (mmc_can_poweroff_notify(host->card) &&
1800 !(host->caps2 & MMC_CAP2_FULL_PWR_CYCLE))
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001801 err = _mmc_resume(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001802
1803 if (!err)
1804 err = _mmc_suspend(host, false);
1805
1806 return err;
1807}
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001808
1809/*
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001810 * Callback for resume.
1811 */
1812static int mmc_resume(struct mmc_host *host)
1813{
Ulf Hansson4d223782013-10-10 17:22:23 +02001814 int err = 0;
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001815
Ulf Hansson4d223782013-10-10 17:22:23 +02001816 if (!(host->caps & MMC_CAP_RUNTIME_RESUME)) {
1817 err = _mmc_resume(host);
1818 pm_runtime_set_active(&host->card->dev);
1819 pm_runtime_mark_last_busy(&host->card->dev);
1820 }
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001821 pm_runtime_enable(&host->card->dev);
1822
1823 return err;
1824}
1825
1826/*
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001827 * Callback for runtime_suspend.
1828 */
1829static int mmc_runtime_suspend(struct mmc_host *host)
1830{
1831 int err;
1832
1833 if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
1834 return 0;
1835
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001836 err = _mmc_suspend(host, true);
Ulf Hansson0cc81a82013-10-03 11:24:44 +02001837 if (err)
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001838 pr_err("%s: error %d doing aggessive suspend\n",
1839 mmc_hostname(host), err);
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001840
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001841 return err;
1842}
1843
1844/*
1845 * Callback for runtime_resume.
1846 */
1847static int mmc_runtime_resume(struct mmc_host *host)
1848{
1849 int err;
1850
Ulf Hansson4d223782013-10-10 17:22:23 +02001851 if (!(host->caps & (MMC_CAP_AGGRESSIVE_PM | MMC_CAP_RUNTIME_RESUME)))
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001852 return 0;
1853
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001854 err = _mmc_resume(host);
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001855 if (err)
1856 pr_err("%s: error %d doing aggessive resume\n",
1857 mmc_hostname(host), err);
1858
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001859 return 0;
1860}
1861
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001862static int mmc_power_restore(struct mmc_host *host)
Adrian Huntereae1aee2009-09-22 16:44:33 -07001863{
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001864 int ret;
1865
Adrian Huntereae1aee2009-09-22 16:44:33 -07001866 mmc_claim_host(host);
Ulf Hansson69041152013-09-13 11:31:33 +02001867 ret = mmc_init_card(host, host->card->ocr, host->card);
Adrian Huntereae1aee2009-09-22 16:44:33 -07001868 mmc_release_host(host);
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001869
1870 return ret;
Adrian Huntereae1aee2009-09-22 16:44:33 -07001871}
1872
Adrian Hunter9feae242009-09-22 16:44:32 -07001873static const struct mmc_bus_ops mmc_ops = {
1874 .remove = mmc_remove,
1875 .detect = mmc_detect,
Adrian Hunter9feae242009-09-22 16:44:32 -07001876 .suspend = mmc_suspend,
1877 .resume = mmc_resume,
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001878 .runtime_suspend = mmc_runtime_suspend,
1879 .runtime_resume = mmc_runtime_resume,
Adrian Huntereae1aee2009-09-22 16:44:33 -07001880 .power_restore = mmc_power_restore,
Adrian Hunterd3049502011-11-28 16:22:00 +02001881 .alive = mmc_alive,
Ulf Hansson486fdbb2013-06-10 17:03:44 +02001882 .shutdown = mmc_shutdown,
Adrian Hunter9feae242009-09-22 16:44:32 -07001883};
1884
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001885/*
1886 * Starting point for MMC card init.
1887 */
Andy Ross807e8e42011-01-03 10:36:56 -08001888int mmc_attach_mmc(struct mmc_host *host)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001889{
1890 int err;
Ulf Hansson69041152013-09-13 11:31:33 +02001891 u32 ocr, rocr;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001892
1893 BUG_ON(!host);
Pierre Ossmand84075c82007-08-09 13:23:56 +02001894 WARN_ON(!host->claimed);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001895
Stefan Nilsson XK44669032011-09-15 17:50:38 +02001896 /* Set correct bus mode for MMC before attempting attach */
1897 if (!mmc_host_is_spi(host))
1898 mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);
1899
Andy Ross807e8e42011-01-03 10:36:56 -08001900 err = mmc_send_op_cond(host, 0, &ocr);
1901 if (err)
1902 return err;
1903
Ulf Hansson2501c912013-10-30 01:00:18 +01001904 mmc_attach_bus(host, &mmc_ops);
Takashi Iwai8f230f42010-12-08 10:04:30 +01001905 if (host->ocr_avail_mmc)
1906 host->ocr_avail = host->ocr_avail_mmc;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001907
1908 /*
David Brownellaf517152007-08-08 09:11:32 -07001909 * We need to get OCR a different way for SPI.
1910 */
1911 if (mmc_host_is_spi(host)) {
1912 err = mmc_spi_read_ocr(host, 1, &ocr);
1913 if (err)
1914 goto err;
1915 }
1916
Ulf Hansson69041152013-09-13 11:31:33 +02001917 rocr = mmc_select_voltage(host, ocr);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001918
1919 /*
1920 * Can we support the voltage of the card?
1921 */
Ulf Hansson69041152013-09-13 11:31:33 +02001922 if (!rocr) {
Pierre Ossman109b5be2007-07-23 00:12:10 +02001923 err = -EINVAL;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001924 goto err;
Pierre Ossman109b5be2007-07-23 00:12:10 +02001925 }
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001926
1927 /*
1928 * Detect and init the card.
1929 */
Ulf Hansson69041152013-09-13 11:31:33 +02001930 err = mmc_init_card(host, rocr, NULL);
Pierre Ossman17b04292007-07-22 22:18:46 +02001931 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001932 goto err;
1933
1934 mmc_release_host(host);
Pierre Ossman4101c162007-05-19 13:39:01 +02001935 err = mmc_add_card(host->card);
Andy Ross807e8e42011-01-03 10:36:56 -08001936 mmc_claim_host(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001937 if (err)
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001938 goto remove_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001939
1940 return 0;
1941
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001942remove_card:
Andy Ross807e8e42011-01-03 10:36:56 -08001943 mmc_release_host(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001944 mmc_remove_card(host->card);
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001945 mmc_claim_host(host);
Andy Ross807e8e42011-01-03 10:36:56 -08001946 host->card = NULL;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001947err:
1948 mmc_detach_bus(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001949
Girish K Sa3c76eb2011-10-11 11:44:09 +05301950 pr_err("%s: error %d whilst initialising MMC card\n",
Pierre Ossman109b5be2007-07-23 00:12:10 +02001951 mmc_hostname(host), err);
1952
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001953 return err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001954}