blob: 5226ef8c0c2dc704fbdfb5586d94e4a4dc58ac6e [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);
Ulf Hanssona1fc4442014-10-21 17:16:14 +0200201 if (!ext_csd)
Pierre Ossman17b04292007-07-22 22:18:46 +0200202 return -ENOMEM;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100203
204 err = mmc_send_ext_csd(card, ext_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +0200205 if (err) {
Philip Rakity08ee80c2011-05-24 18:14:58 -0700206 kfree(ext_csd);
207 *new_ext_csd = NULL;
208
Wolfgang Mueesd08ebed2009-09-22 16:45:26 -0700209 /* If the host or the card can't do the switch,
210 * fail more gracefully. */
211 if ((err != -EINVAL)
212 && (err != -ENOSYS)
213 && (err != -EFAULT))
Philip Rakity08ee80c2011-05-24 18:14:58 -0700214 return err;
Pierre Ossmanadf66a02007-07-22 23:08:30 +0200215
216 /*
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100217 * High capacity cards should have this "magic" size
218 * stored in their CSD.
219 */
220 if (card->csd.capacity == (4096 * 512)) {
Girish K Sa3c76eb2011-10-11 11:44:09 +0530221 pr_err("%s: unable to read EXT_CSD "
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100222 "on a possible high capacity card. "
223 "Card will be ignored.\n",
224 mmc_hostname(card->host));
225 } else {
Joe Perches66061102014-09-12 14:56:56 -0700226 pr_warn("%s: unable to read EXT_CSD, performance might suffer\n",
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100227 mmc_hostname(card->host));
Pierre Ossman17b04292007-07-22 22:18:46 +0200228 err = 0;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100229 }
Philip Rakity08ee80c2011-05-24 18:14:58 -0700230 } else
231 *new_ext_csd = ext_csd;
Pierre Ossmanadf66a02007-07-22 23:08:30 +0200232
Philip Rakity08ee80c2011-05-24 18:14:58 -0700233 return err;
234}
235
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900236static void mmc_select_card_type(struct mmc_card *card)
237{
238 struct mmc_host *host = card->host;
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900239 u8 card_type = card->ext_csd.raw_card_type;
Lee Jones5f1a4dd2012-11-14 12:35:51 +0000240 u32 caps = host->caps, caps2 = host->caps2;
Seungwon Jeon577fb132014-04-23 17:08:44 +0900241 unsigned int hs_max_dtr = 0, hs200_max_dtr = 0;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900242 unsigned int avail_type = 0;
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900243
244 if (caps & MMC_CAP_MMC_HIGHSPEED &&
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900245 card_type & EXT_CSD_CARD_TYPE_HS_26) {
246 hs_max_dtr = MMC_HIGH_26_MAX_DTR;
247 avail_type |= EXT_CSD_CARD_TYPE_HS_26;
248 }
249
250 if (caps & MMC_CAP_MMC_HIGHSPEED &&
251 card_type & EXT_CSD_CARD_TYPE_HS_52) {
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900252 hs_max_dtr = MMC_HIGH_52_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900253 avail_type |= EXT_CSD_CARD_TYPE_HS_52;
254 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900255
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900256 if (caps & MMC_CAP_1_8V_DDR &&
257 card_type & EXT_CSD_CARD_TYPE_DDR_1_8V) {
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900258 hs_max_dtr = MMC_HIGH_DDR_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900259 avail_type |= EXT_CSD_CARD_TYPE_DDR_1_8V;
260 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900261
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900262 if (caps & MMC_CAP_1_2V_DDR &&
263 card_type & EXT_CSD_CARD_TYPE_DDR_1_2V) {
264 hs_max_dtr = MMC_HIGH_DDR_MAX_DTR;
265 avail_type |= EXT_CSD_CARD_TYPE_DDR_1_2V;
266 }
267
268 if (caps2 & MMC_CAP2_HS200_1_8V_SDR &&
269 card_type & EXT_CSD_CARD_TYPE_HS200_1_8V) {
Seungwon Jeon577fb132014-04-23 17:08:44 +0900270 hs200_max_dtr = MMC_HS200_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900271 avail_type |= EXT_CSD_CARD_TYPE_HS200_1_8V;
272 }
273
274 if (caps2 & MMC_CAP2_HS200_1_2V_SDR &&
275 card_type & EXT_CSD_CARD_TYPE_HS200_1_2V) {
Seungwon Jeon577fb132014-04-23 17:08:44 +0900276 hs200_max_dtr = MMC_HS200_MAX_DTR;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900277 avail_type |= EXT_CSD_CARD_TYPE_HS200_1_2V;
278 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900279
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900280 if (caps2 & MMC_CAP2_HS400_1_8V &&
281 card_type & EXT_CSD_CARD_TYPE_HS400_1_8V) {
282 hs200_max_dtr = MMC_HS200_MAX_DTR;
283 avail_type |= EXT_CSD_CARD_TYPE_HS400_1_8V;
284 }
285
286 if (caps2 & MMC_CAP2_HS400_1_2V &&
287 card_type & EXT_CSD_CARD_TYPE_HS400_1_2V) {
288 hs200_max_dtr = MMC_HS200_MAX_DTR;
289 avail_type |= EXT_CSD_CARD_TYPE_HS400_1_2V;
290 }
291
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900292 card->ext_csd.hs_max_dtr = hs_max_dtr;
Seungwon Jeon577fb132014-04-23 17:08:44 +0900293 card->ext_csd.hs200_max_dtr = hs200_max_dtr;
Seungwon Jeon2415c0e2014-04-23 17:07:58 +0900294 card->mmc_avail_type = avail_type;
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900295}
296
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200297static void mmc_manage_enhanced_area(struct mmc_card *card, u8 *ext_csd)
298{
Grégory Soutadé994324b2014-09-15 17:47:11 +0200299 u8 hc_erase_grp_sz, hc_wp_grp_sz;
300
301 /*
302 * Disable these attributes by default
303 */
304 card->ext_csd.enhanced_area_offset = -EINVAL;
305 card->ext_csd.enhanced_area_size = -EINVAL;
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200306
307 /*
308 * Enhanced area feature support -- check whether the eMMC
309 * card has the Enhanced area enabled. If so, export enhanced
310 * area offset and size to user by adding sysfs interface.
311 */
312 if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) &&
313 (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) {
Grégory Soutadé994324b2014-09-15 17:47:11 +0200314 if (card->ext_csd.partition_setting_completed) {
315 hc_erase_grp_sz =
316 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
317 hc_wp_grp_sz =
318 ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200319
Grégory Soutadé994324b2014-09-15 17:47:11 +0200320 /*
321 * calculate the enhanced data area offset, in bytes
322 */
323 card->ext_csd.enhanced_area_offset =
324 (ext_csd[139] << 24) + (ext_csd[138] << 16) +
325 (ext_csd[137] << 8) + ext_csd[136];
326 if (mmc_card_blockaddr(card))
327 card->ext_csd.enhanced_area_offset <<= 9;
328 /*
329 * calculate the enhanced data area size, in kilobytes
330 */
331 card->ext_csd.enhanced_area_size =
332 (ext_csd[142] << 16) + (ext_csd[141] << 8) +
333 ext_csd[140];
334 card->ext_csd.enhanced_area_size *=
335 (size_t)(hc_erase_grp_sz * hc_wp_grp_sz);
336 card->ext_csd.enhanced_area_size <<= 9;
337 } else {
338 pr_warn("%s: defines enhanced area without partition setting complete\n",
339 mmc_hostname(card->host));
340 }
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200341 }
342}
343
344static void mmc_manage_gp_partitions(struct mmc_card *card, u8 *ext_csd)
345{
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200346 int idx;
Grégory Soutadé994324b2014-09-15 17:47:11 +0200347 u8 hc_erase_grp_sz, hc_wp_grp_sz;
348 unsigned int part_size;
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200349
350 /*
351 * General purpose partition feature support --
352 * If ext_csd has the size of general purpose partitions,
353 * set size, part_cfg, partition name in mmc_part.
354 */
355 if (ext_csd[EXT_CSD_PARTITION_SUPPORT] &
356 EXT_CSD_PART_SUPPORT_PART_EN) {
Grégory Soutadé994324b2014-09-15 17:47:11 +0200357 hc_erase_grp_sz =
358 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
359 hc_wp_grp_sz =
360 ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200361
362 for (idx = 0; idx < MMC_NUM_GP_PARTITION; idx++) {
363 if (!ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3] &&
364 !ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 1] &&
365 !ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 2])
366 continue;
Grégory Soutadé994324b2014-09-15 17:47:11 +0200367 if (card->ext_csd.partition_setting_completed == 0) {
368 pr_warn("%s: has partition size defined without partition complete\n",
369 mmc_hostname(card->host));
370 break;
371 }
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200372 part_size =
373 (ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 2]
374 << 16) +
375 (ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 1]
376 << 8) +
377 ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3];
378 part_size *= (size_t)(hc_erase_grp_sz *
379 hc_wp_grp_sz);
380 mmc_part_add(card, part_size << 19,
381 EXT_CSD_PART_CONFIG_ACC_GP0 + idx,
382 "gp%d", idx, false,
383 MMC_BLK_DATA_AREA_GP);
384 }
385 }
386}
387
Philip Rakity08ee80c2011-05-24 18:14:58 -0700388/*
389 * Decode extended CSD.
390 */
391static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
392{
Namjae Jeone0c368d2011-10-06 23:41:38 +0900393 int err = 0, idx;
394 unsigned int part_size;
Philip Rakity08ee80c2011-05-24 18:14:58 -0700395
396 BUG_ON(!card);
397
398 if (!ext_csd)
399 return 0;
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100400
Kyungmin Park6da24b72010-08-10 18:01:36 -0700401 /* Version is coded in the CSD_STRUCTURE byte in the EXT_CSD register */
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700402 card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE];
Kyungmin Park6da24b72010-08-10 18:01:36 -0700403 if (card->csd.structure == 3) {
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700404 if (card->ext_csd.raw_ext_csd_structure > 2) {
Girish K Sa3c76eb2011-10-11 11:44:09 +0530405 pr_err("%s: unrecognised EXT_CSD structure "
Kyungmin Park6da24b72010-08-10 18:01:36 -0700406 "version %d\n", mmc_hostname(card->host),
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700407 card->ext_csd.raw_ext_csd_structure);
Kyungmin Park6da24b72010-08-10 18:01:36 -0700408 err = -EINVAL;
409 goto out;
410 }
411 }
412
Romain Izard03a59432014-06-27 10:51:07 +0200413 /*
414 * The EXT_CSD format is meant to be forward compatible. As long
415 * as CSD_STRUCTURE does not change, all values for EXT_CSD_REV
416 * are authorized, see JEDEC JESD84-B50 section B.8.
417 */
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700418 card->ext_csd.rev = ext_csd[EXT_CSD_REV];
Pierre Ossmand7604d72007-07-23 00:34:07 +0200419
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700420 card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0];
421 card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1];
422 card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2];
423 card->ext_csd.raw_sectors[3] = ext_csd[EXT_CSD_SEC_CNT + 3];
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700424 if (card->ext_csd.rev >= 2) {
Pierre Ossmand7604d72007-07-23 00:34:07 +0200425 card->ext_csd.sectors =
426 ext_csd[EXT_CSD_SEC_CNT + 0] << 0 |
427 ext_csd[EXT_CSD_SEC_CNT + 1] << 8 |
428 ext_csd[EXT_CSD_SEC_CNT + 2] << 16 |
429 ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Hanumath Prasadfc8a0982010-08-10 18:01:45 -0700430
431 /* Cards with density > 2GiB are sector addressed */
432 if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512)
Pierre Ossmand7604d72007-07-23 00:34:07 +0200433 mmc_card_set_blockaddr(card);
434 }
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900435
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700436 card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE];
Seungwon Jeon96cf5f02012-04-25 16:17:37 +0900437 mmc_select_card_type(card);
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100438
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700439 card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT];
440 card->ext_csd.raw_erase_timeout_mult =
441 ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT];
442 card->ext_csd.raw_hc_erase_grp_size =
443 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700444 if (card->ext_csd.rev >= 3) {
445 u8 sa_shift = ext_csd[EXT_CSD_S_A_TIMEOUT];
Andrei Warkentin371a6892011-04-11 18:10:25 -0500446 card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG];
447
448 /* EXT_CSD value is in units of 10ms, but we store in ms */
449 card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME];
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700450
451 /* Sleep / awake timeout in 100ns units */
452 if (sa_shift > 0 && sa_shift <= 0x17)
453 card->ext_csd.sa_timeout =
454 1 << ext_csd[EXT_CSD_S_A_TIMEOUT];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700455 card->ext_csd.erase_group_def =
456 ext_csd[EXT_CSD_ERASE_GROUP_DEF];
457 card->ext_csd.hc_erase_timeout = 300 *
458 ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT];
459 card->ext_csd.hc_erase_size =
460 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] << 10;
Andrei Warkentinf4c55222011-03-31 18:40:00 -0500461
462 card->ext_csd.rel_sectors = ext_csd[EXT_CSD_REL_WR_SEC_C];
Andrei Warkentin371a6892011-04-11 18:10:25 -0500463
464 /*
465 * There are two boot regions of equal size, defined in
466 * multiples of 128K.
467 */
Namjae Jeone0c368d2011-10-06 23:41:38 +0900468 if (ext_csd[EXT_CSD_BOOT_MULT] && mmc_boot_partition_access(card->host)) {
469 for (idx = 0; idx < MMC_NUM_BOOT_PARTITION; idx++) {
470 part_size = ext_csd[EXT_CSD_BOOT_MULT] << 17;
471 mmc_part_add(card, part_size,
472 EXT_CSD_PART_CONFIG_ACC_BOOT0 + idx,
Johan Rudholmadd710e2011-12-02 08:51:06 +0100473 "boot%d", idx, true,
474 MMC_BLK_DATA_AREA_BOOT);
Namjae Jeone0c368d2011-10-06 23:41:38 +0900475 }
476 }
Jarkko Lavinenb1ebe382009-09-22 16:44:34 -0700477 }
478
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700479 card->ext_csd.raw_hc_erase_gap_size =
Jurgen Heeksdd13b4e2012-02-01 13:30:55 +0100480 ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700481 card->ext_csd.raw_sec_trim_mult =
482 ext_csd[EXT_CSD_SEC_TRIM_MULT];
483 card->ext_csd.raw_sec_erase_mult =
484 ext_csd[EXT_CSD_SEC_ERASE_MULT];
485 card->ext_csd.raw_sec_feature_support =
486 ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT];
487 card->ext_csd.raw_trim_mult =
488 ext_csd[EXT_CSD_TRIM_MULT];
Philip Rakity836dc2f2013-04-04 20:18:11 +0100489 card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700490 if (card->ext_csd.rev >= 4) {
Grégory Soutadé69803d42014-09-15 17:47:09 +0200491 if (ext_csd[EXT_CSD_PARTITION_SETTING_COMPLETED] &
492 EXT_CSD_PART_SETTING_COMPLETED)
493 card->ext_csd.partition_setting_completed = 1;
494 else
495 card->ext_csd.partition_setting_completed = 0;
496
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200497 mmc_manage_enhanced_area(card, ext_csd);
Chuanxiao Dong709de99d2011-01-22 04:09:41 +0800498
Grégory Soutadéb4493ee2014-09-15 17:47:06 +0200499 mmc_manage_gp_partitions(card, ext_csd);
Namjae Jeone0c368d2011-10-06 23:41:38 +0900500
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700501 card->ext_csd.sec_trim_mult =
502 ext_csd[EXT_CSD_SEC_TRIM_MULT];
503 card->ext_csd.sec_erase_mult =
504 ext_csd[EXT_CSD_SEC_ERASE_MULT];
505 card->ext_csd.sec_feature_support =
506 ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT];
507 card->ext_csd.trim_timeout = 300 *
508 ext_csd[EXT_CSD_TRIM_MULT];
Johan Rudholmadd710e2011-12-02 08:51:06 +0100509
510 /*
511 * Note that the call to mmc_part_add above defaults to read
512 * only. If this default assumption is changed, the call must
513 * take into account the value of boot_locked below.
514 */
515 card->ext_csd.boot_ro_lock = ext_csd[EXT_CSD_BOOT_WP];
516 card->ext_csd.boot_ro_lockable = true;
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200517
518 /* Save power class values */
519 card->ext_csd.raw_pwr_cl_52_195 =
520 ext_csd[EXT_CSD_PWR_CL_52_195];
521 card->ext_csd.raw_pwr_cl_26_195 =
522 ext_csd[EXT_CSD_PWR_CL_26_195];
523 card->ext_csd.raw_pwr_cl_52_360 =
524 ext_csd[EXT_CSD_PWR_CL_52_360];
525 card->ext_csd.raw_pwr_cl_26_360 =
526 ext_csd[EXT_CSD_PWR_CL_26_360];
527 card->ext_csd.raw_pwr_cl_200_195 =
528 ext_csd[EXT_CSD_PWR_CL_200_195];
529 card->ext_csd.raw_pwr_cl_200_360 =
530 ext_csd[EXT_CSD_PWR_CL_200_360];
531 card->ext_csd.raw_pwr_cl_ddr_52_195 =
532 ext_csd[EXT_CSD_PWR_CL_DDR_52_195];
533 card->ext_csd.raw_pwr_cl_ddr_52_360 =
534 ext_csd[EXT_CSD_PWR_CL_DDR_52_360];
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900535 card->ext_csd.raw_pwr_cl_ddr_200_360 =
536 ext_csd[EXT_CSD_PWR_CL_DDR_200_360];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700537 }
538
Adrian Hunterb2499512011-08-29 16:42:11 +0300539 if (card->ext_csd.rev >= 5) {
Romain Izard7c4f10a2013-06-14 14:25:44 +0200540 /* Adjust production date as per JEDEC JESD84-B451 */
541 if (card->cid.year < 2010)
542 card->cid.year += 16;
543
Jaehoon Chung950d56a2012-09-17 08:42:02 +0000544 /* check whether the eMMC card supports BKOPS */
545 if (ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1) {
546 card->ext_csd.bkops = 1;
547 card->ext_csd.bkops_en = ext_csd[EXT_CSD_BKOPS_EN];
548 card->ext_csd.raw_bkops_status =
549 ext_csd[EXT_CSD_BKOPS_STATUS];
550 if (!card->ext_csd.bkops_en)
551 pr_info("%s: BKOPS_EN bit is not set\n",
552 mmc_hostname(card->host));
553 }
554
Jaehoon Chungeb0d8f12011-10-18 01:26:42 -0400555 /* check whether the eMMC card supports HPI */
556 if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x1) {
557 card->ext_csd.hpi = 1;
558 if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x2)
559 card->ext_csd.hpi_cmd = MMC_STOP_TRANSMISSION;
560 else
561 card->ext_csd.hpi_cmd = MMC_SEND_STATUS;
562 /*
563 * Indicate the maximum timeout to close
564 * a command interrupted by HPI
565 */
566 card->ext_csd.out_of_int_time =
567 ext_csd[EXT_CSD_OUT_OF_INTERRUPT_TIME] * 10;
568 }
569
Andrei Warkentinf4c55222011-03-31 18:40:00 -0500570 card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM];
Adrian Hunterb2499512011-08-29 16:42:11 +0300571 card->ext_csd.rst_n_function = ext_csd[EXT_CSD_RST_N_FUNCTION];
Loic Pallardy090d25f2012-11-17 18:08:24 -0500572
573 /*
574 * RPMB regions are defined in multiples of 128K.
575 */
576 card->ext_csd.raw_rpmb_size_mult = ext_csd[EXT_CSD_RPMB_MULT];
Balaji T Kd0123cc2013-01-25 17:00:30 +0530577 if (ext_csd[EXT_CSD_RPMB_MULT] && mmc_host_cmd23(card->host)) {
Loic Pallardy090d25f2012-11-17 18:08:24 -0500578 mmc_part_add(card, ext_csd[EXT_CSD_RPMB_MULT] << 17,
579 EXT_CSD_PART_CONFIG_ACC_RPMB,
580 "rpmb", 0, false,
581 MMC_BLK_DATA_AREA_RPMB);
582 }
Adrian Hunterb2499512011-08-29 16:42:11 +0300583 }
Andrei Warkentinf4c55222011-03-31 18:40:00 -0500584
Andrei Warkentin5238acb2011-09-24 12:12:30 -0400585 card->ext_csd.raw_erased_mem_count = ext_csd[EXT_CSD_ERASED_MEM_CONT];
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700586 if (ext_csd[EXT_CSD_ERASED_MEM_CONT])
587 card->erased_byte = 0xFF;
588 else
589 card->erased_byte = 0x0;
590
Seungwon Jeon336c7162011-10-25 09:43:12 +0900591 /* eMMC v4.5 or later */
Girish K Sbec87262011-10-13 12:04:16 +0530592 if (card->ext_csd.rev >= 6) {
Seungwon Jeon336c7162011-10-25 09:43:12 +0900593 card->ext_csd.feature_support |= MMC_DISCARD_FEATURE;
594
Seungwon Jeonb23cf0b2011-09-23 14:15:29 +0900595 card->ext_csd.generic_cmd6_time = 10 *
596 ext_csd[EXT_CSD_GENERIC_CMD6_TIME];
Girish K Sbec87262011-10-13 12:04:16 +0530597 card->ext_csd.power_off_longtime = 10 *
598 ext_csd[EXT_CSD_POWER_OFF_LONG_TIME];
Seungwon Jeonb23cf0b2011-09-23 14:15:29 +0900599
Seungwon Jeon336c7162011-10-25 09:43:12 +0900600 card->ext_csd.cache_size =
601 ext_csd[EXT_CSD_CACHE_SIZE + 0] << 0 |
602 ext_csd[EXT_CSD_CACHE_SIZE + 1] << 8 |
603 ext_csd[EXT_CSD_CACHE_SIZE + 2] << 16 |
604 ext_csd[EXT_CSD_CACHE_SIZE + 3] << 24;
Saugata Das42659002011-12-21 13:09:17 +0530605
606 if (ext_csd[EXT_CSD_DATA_SECTOR_SIZE] == 1)
607 card->ext_csd.data_sector_size = 4096;
608 else
609 card->ext_csd.data_sector_size = 512;
610
611 if ((ext_csd[EXT_CSD_DATA_TAG_SUPPORT] & 1) &&
612 (ext_csd[EXT_CSD_TAG_UNIT_SIZE] <= 8)) {
613 card->ext_csd.data_tag_unit_size =
614 ((unsigned int) 1 << ext_csd[EXT_CSD_TAG_UNIT_SIZE]) *
615 (card->ext_csd.data_sector_size);
616 } else {
617 card->ext_csd.data_tag_unit_size = 0;
618 }
Seungwon Jeonabd9ac12013-02-06 17:01:43 +0900619
620 card->ext_csd.max_packed_writes =
621 ext_csd[EXT_CSD_MAX_PACKED_WRITES];
622 card->ext_csd.max_packed_reads =
623 ext_csd[EXT_CSD_MAX_PACKED_READS];
Saugata Dasa5075eb2012-05-17 16:32:21 +0530624 } else {
625 card->ext_csd.data_sector_size = 512;
Seungwon Jeon336c7162011-10-25 09:43:12 +0900626 }
Seungwon Jeon881d1c22011-10-14 14:03:21 +0900627
Gwendal Grignou0f762422014-10-16 11:27:16 -0700628 /* eMMC v5 or later */
629 if (card->ext_csd.rev >= 7) {
630 memcpy(card->ext_csd.fwrev, &ext_csd[EXT_CSD_FIRMWARE_VERSION],
631 MMC_FIRMWARE_LEN);
632 card->ext_csd.ffu_capable =
633 (ext_csd[EXT_CSD_SUPPORTED_MODE] & 0x1) &&
634 !(ext_csd[EXT_CSD_FW_CONFIG] & 0x1);
635 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100636out:
Philip Rakity08ee80c2011-05-24 18:14:58 -0700637 return err;
638}
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100639
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700640static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width)
Philip Rakity08ee80c2011-05-24 18:14:58 -0700641{
642 u8 *bw_ext_csd;
643 int err;
644
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700645 if (bus_width == MMC_BUS_WIDTH_1)
646 return 0;
Philip Rakity08ee80c2011-05-24 18:14:58 -0700647
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700648 err = mmc_get_ext_csd(card, &bw_ext_csd);
649
650 if (err || bw_ext_csd == NULL) {
Philippe De Swertf6f44592012-04-11 23:32:05 +0300651 err = -EINVAL;
Philip Rakity08ee80c2011-05-24 18:14:58 -0700652 goto out;
653 }
654
Philip Rakity08ee80c2011-05-24 18:14:58 -0700655 /* only compare read only fields */
Jurgen Heeksdd13b4e2012-02-01 13:30:55 +0100656 err = !((card->ext_csd.raw_partition_support ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700657 bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700658 (card->ext_csd.raw_erased_mem_count ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700659 bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700660 (card->ext_csd.rev ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700661 bw_ext_csd[EXT_CSD_REV]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700662 (card->ext_csd.raw_ext_csd_structure ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700663 bw_ext_csd[EXT_CSD_STRUCTURE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700664 (card->ext_csd.raw_card_type ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700665 bw_ext_csd[EXT_CSD_CARD_TYPE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700666 (card->ext_csd.raw_s_a_timeout ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700667 bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700668 (card->ext_csd.raw_hc_erase_gap_size ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700669 bw_ext_csd[EXT_CSD_HC_WP_GRP_SIZE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700670 (card->ext_csd.raw_erase_timeout_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700671 bw_ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700672 (card->ext_csd.raw_hc_erase_grp_size ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700673 bw_ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700674 (card->ext_csd.raw_sec_trim_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700675 bw_ext_csd[EXT_CSD_SEC_TRIM_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700676 (card->ext_csd.raw_sec_erase_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700677 bw_ext_csd[EXT_CSD_SEC_ERASE_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700678 (card->ext_csd.raw_sec_feature_support ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700679 bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700680 (card->ext_csd.raw_trim_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700681 bw_ext_csd[EXT_CSD_TRIM_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700682 (card->ext_csd.raw_sectors[0] ==
683 bw_ext_csd[EXT_CSD_SEC_CNT + 0]) &&
684 (card->ext_csd.raw_sectors[1] ==
685 bw_ext_csd[EXT_CSD_SEC_CNT + 1]) &&
686 (card->ext_csd.raw_sectors[2] ==
687 bw_ext_csd[EXT_CSD_SEC_CNT + 2]) &&
688 (card->ext_csd.raw_sectors[3] ==
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200689 bw_ext_csd[EXT_CSD_SEC_CNT + 3]) &&
690 (card->ext_csd.raw_pwr_cl_52_195 ==
691 bw_ext_csd[EXT_CSD_PWR_CL_52_195]) &&
692 (card->ext_csd.raw_pwr_cl_26_195 ==
693 bw_ext_csd[EXT_CSD_PWR_CL_26_195]) &&
694 (card->ext_csd.raw_pwr_cl_52_360 ==
695 bw_ext_csd[EXT_CSD_PWR_CL_52_360]) &&
696 (card->ext_csd.raw_pwr_cl_26_360 ==
697 bw_ext_csd[EXT_CSD_PWR_CL_26_360]) &&
698 (card->ext_csd.raw_pwr_cl_200_195 ==
699 bw_ext_csd[EXT_CSD_PWR_CL_200_195]) &&
700 (card->ext_csd.raw_pwr_cl_200_360 ==
701 bw_ext_csd[EXT_CSD_PWR_CL_200_360]) &&
702 (card->ext_csd.raw_pwr_cl_ddr_52_195 ==
703 bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_195]) &&
704 (card->ext_csd.raw_pwr_cl_ddr_52_360 ==
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900705 bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_360]) &&
706 (card->ext_csd.raw_pwr_cl_ddr_200_360 ==
707 bw_ext_csd[EXT_CSD_PWR_CL_DDR_200_360]));
708
Philip Rakity08ee80c2011-05-24 18:14:58 -0700709 if (err)
710 err = -EINVAL;
711
712out:
Ulf Hansson00b41b52014-10-16 16:18:51 +0200713 kfree(bw_ext_csd);
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100714 return err;
715}
716
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100717MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
718 card->raw_cid[2], card->raw_cid[3]);
719MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
720 card->raw_csd[2], card->raw_csd[3]);
721MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700722MMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9);
723MMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9);
Gwendal Grignou0f762422014-10-16 11:27:16 -0700724MMC_DEV_ATTR(ffu_capable, "%d\n", card->ext_csd.ffu_capable);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100725MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);
726MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
727MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);
728MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid);
Bernie Thompson51e7e8b2013-02-27 12:19:17 -0800729MMC_DEV_ATTR(prv, "0x%x\n", card->cid.prv);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100730MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial);
Chuanxiao Dong709de99d2011-01-22 04:09:41 +0800731MMC_DEV_ATTR(enhanced_area_offset, "%llu\n",
732 card->ext_csd.enhanced_area_offset);
733MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size);
Loic Pallardy188cc042012-08-06 17:12:29 +0200734MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult);
735MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100736
Gwendal Grignou0f762422014-10-16 11:27:16 -0700737static ssize_t mmc_fwrev_show(struct device *dev,
738 struct device_attribute *attr,
739 char *buf)
740{
741 struct mmc_card *card = mmc_dev_to_card(dev);
742
743 if (card->ext_csd.rev < 7) {
744 return sprintf(buf, "0x%x\n", card->cid.fwrev);
745 } else {
746 return sprintf(buf, "0x%*phN\n", MMC_FIRMWARE_LEN,
747 card->ext_csd.fwrev);
748 }
749}
750
751static DEVICE_ATTR(fwrev, S_IRUGO, mmc_fwrev_show, NULL);
752
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100753static struct attribute *mmc_std_attrs[] = {
754 &dev_attr_cid.attr,
755 &dev_attr_csd.attr,
756 &dev_attr_date.attr,
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700757 &dev_attr_erase_size.attr,
758 &dev_attr_preferred_erase_size.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100759 &dev_attr_fwrev.attr,
Gwendal Grignou0f762422014-10-16 11:27:16 -0700760 &dev_attr_ffu_capable.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100761 &dev_attr_hwrev.attr,
762 &dev_attr_manfid.attr,
763 &dev_attr_name.attr,
764 &dev_attr_oemid.attr,
Bernie Thompson51e7e8b2013-02-27 12:19:17 -0800765 &dev_attr_prv.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100766 &dev_attr_serial.attr,
Chuanxiao Dong709de99d2011-01-22 04:09:41 +0800767 &dev_attr_enhanced_area_offset.attr,
768 &dev_attr_enhanced_area_size.attr,
Loic Pallardy188cc042012-08-06 17:12:29 +0200769 &dev_attr_raw_rpmb_size_mult.attr,
770 &dev_attr_rel_sectors.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100771 NULL,
772};
Axel Lind1e58212014-03-08 15:05:27 +0800773ATTRIBUTE_GROUPS(mmc_std);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100774
775static struct device_type mmc_type = {
Axel Lind1e58212014-03-08 15:05:27 +0800776 .groups = mmc_std_groups,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100777};
778
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100779/*
Girish K Sb87d8db2011-09-23 20:41:47 +0530780 * Select the PowerClass for the current bus width
781 * If power class is defined for 4/8 bit bus in the
782 * extended CSD register, select it by executing the
783 * mmc_switch command.
784 */
Seungwon Jeon23850492014-04-23 17:08:05 +0900785static int __mmc_select_powerclass(struct mmc_card *card,
786 unsigned int bus_width)
Girish K Sb87d8db2011-09-23 20:41:47 +0530787{
Seungwon Jeon23850492014-04-23 17:08:05 +0900788 struct mmc_host *host = card->host;
789 struct mmc_ext_csd *ext_csd = &card->ext_csd;
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200790 unsigned int pwrclass_val = 0;
Seungwon Jeon23850492014-04-23 17:08:05 +0900791 int err = 0;
Girish K Sb87d8db2011-09-23 20:41:47 +0530792
Girish K Sb87d8db2011-09-23 20:41:47 +0530793 switch (1 << host->ios.vdd) {
794 case MMC_VDD_165_195:
Seungwon Jeon23850492014-04-23 17:08:05 +0900795 if (host->ios.clock <= MMC_HIGH_26_MAX_DTR)
796 pwrclass_val = ext_csd->raw_pwr_cl_26_195;
797 else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR)
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200798 pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ?
Seungwon Jeon23850492014-04-23 17:08:05 +0900799 ext_csd->raw_pwr_cl_52_195 :
800 ext_csd->raw_pwr_cl_ddr_52_195;
801 else if (host->ios.clock <= MMC_HS200_MAX_DTR)
802 pwrclass_val = ext_csd->raw_pwr_cl_200_195;
Girish K Sb87d8db2011-09-23 20:41:47 +0530803 break;
Subhash Jadavani93fc5a42012-04-03 12:25:58 +0530804 case MMC_VDD_27_28:
805 case MMC_VDD_28_29:
806 case MMC_VDD_29_30:
807 case MMC_VDD_30_31:
808 case MMC_VDD_31_32:
Girish K Sb87d8db2011-09-23 20:41:47 +0530809 case MMC_VDD_32_33:
810 case MMC_VDD_33_34:
811 case MMC_VDD_34_35:
812 case MMC_VDD_35_36:
Seungwon Jeon23850492014-04-23 17:08:05 +0900813 if (host->ios.clock <= MMC_HIGH_26_MAX_DTR)
814 pwrclass_val = ext_csd->raw_pwr_cl_26_360;
815 else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR)
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200816 pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ?
Seungwon Jeon23850492014-04-23 17:08:05 +0900817 ext_csd->raw_pwr_cl_52_360 :
818 ext_csd->raw_pwr_cl_ddr_52_360;
819 else if (host->ios.clock <= MMC_HS200_MAX_DTR)
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900820 pwrclass_val = (bus_width == EXT_CSD_DDR_BUS_WIDTH_8) ?
821 ext_csd->raw_pwr_cl_ddr_200_360 :
822 ext_csd->raw_pwr_cl_200_360;
Girish K Sb87d8db2011-09-23 20:41:47 +0530823 break;
824 default:
Joe Perches66061102014-09-12 14:56:56 -0700825 pr_warn("%s: Voltage range not supported for power class\n",
826 mmc_hostname(host));
Girish K Sb87d8db2011-09-23 20:41:47 +0530827 return -EINVAL;
828 }
829
Girish K Sb87d8db2011-09-23 20:41:47 +0530830 if (bus_width & (EXT_CSD_BUS_WIDTH_8 | EXT_CSD_DDR_BUS_WIDTH_8))
831 pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_8BIT_MASK) >>
832 EXT_CSD_PWR_CL_8BIT_SHIFT;
833 else
834 pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_4BIT_MASK) >>
835 EXT_CSD_PWR_CL_4BIT_SHIFT;
836
837 /* If the power class is different from the default value */
838 if (pwrclass_val > 0) {
839 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
840 EXT_CSD_POWER_CLASS,
841 pwrclass_val,
Seungwon Jeon71fe3eb2011-10-18 13:20:57 +0900842 card->ext_csd.generic_cmd6_time);
Girish K Sb87d8db2011-09-23 20:41:47 +0530843 }
844
845 return err;
846}
847
Seungwon Jeon23850492014-04-23 17:08:05 +0900848static int mmc_select_powerclass(struct mmc_card *card)
849{
850 struct mmc_host *host = card->host;
851 u32 bus_width, ext_csd_bits;
852 int err, ddr;
853
854 /* Power class selection is supported for versions >= 4.0 */
855 if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
856 return 0;
857
858 bus_width = host->ios.bus_width;
859 /* Power class values are defined only for 4/8 bit bus */
860 if (bus_width == MMC_BUS_WIDTH_1)
861 return 0;
862
863 ddr = card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52;
864 if (ddr)
865 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
866 EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4;
867 else
868 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
869 EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4;
870
871 err = __mmc_select_powerclass(card, ext_csd_bits);
872 if (err)
873 pr_warn("%s: power class selection to bus width %d ddr %d failed\n",
874 mmc_hostname(host), 1 << bus_width, ddr);
875
876 return err;
877}
878
Girish K Sb87d8db2011-09-23 20:41:47 +0530879/*
Seungwon Jeon577fb132014-04-23 17:08:44 +0900880 * Set the bus speed for the selected speed mode.
Girish K Sa4924c72012-01-11 14:04:52 -0500881 */
Seungwon Jeon577fb132014-04-23 17:08:44 +0900882static void mmc_set_bus_speed(struct mmc_card *card)
Girish K Sa4924c72012-01-11 14:04:52 -0500883{
Seungwon Jeon577fb132014-04-23 17:08:44 +0900884 unsigned int max_dtr = (unsigned int)-1;
885
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900886 if ((mmc_card_hs200(card) || mmc_card_hs400(card)) &&
887 max_dtr > card->ext_csd.hs200_max_dtr)
Seungwon Jeon577fb132014-04-23 17:08:44 +0900888 max_dtr = card->ext_csd.hs200_max_dtr;
889 else if (mmc_card_hs(card) && max_dtr > card->ext_csd.hs_max_dtr)
890 max_dtr = card->ext_csd.hs_max_dtr;
891 else if (max_dtr > card->csd.max_dtr)
892 max_dtr = card->csd.max_dtr;
893
894 mmc_set_clock(card->host, max_dtr);
895}
896
897/*
898 * Select the bus width amoung 4-bit and 8-bit(SDR).
899 * If the bus width is changed successfully, return the selected width value.
900 * Zero is returned instead of error value if the wide width is not supported.
901 */
902static int mmc_select_bus_width(struct mmc_card *card)
903{
Girish K Sa4924c72012-01-11 14:04:52 -0500904 static unsigned ext_csd_bits[] = {
Girish K Sa4924c72012-01-11 14:04:52 -0500905 EXT_CSD_BUS_WIDTH_8,
Seungwon Jeon577fb132014-04-23 17:08:44 +0900906 EXT_CSD_BUS_WIDTH_4,
Girish K Sa4924c72012-01-11 14:04:52 -0500907 };
908 static unsigned bus_widths[] = {
Girish K Sa4924c72012-01-11 14:04:52 -0500909 MMC_BUS_WIDTH_8,
Seungwon Jeon577fb132014-04-23 17:08:44 +0900910 MMC_BUS_WIDTH_4,
Girish K Sa4924c72012-01-11 14:04:52 -0500911 };
Seungwon Jeon577fb132014-04-23 17:08:44 +0900912 struct mmc_host *host = card->host;
913 unsigned idx, bus_width = 0;
914 int err = 0;
Girish K Sa4924c72012-01-11 14:04:52 -0500915
Seungwon Jeon577fb132014-04-23 17:08:44 +0900916 if ((card->csd.mmca_vsn < CSD_SPEC_VER_4) &&
917 !(host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)))
918 return 0;
Girish K Sa4924c72012-01-11 14:04:52 -0500919
Seungwon Jeon577fb132014-04-23 17:08:44 +0900920 idx = (host->caps & MMC_CAP_8_BIT_DATA) ? 0 : 1;
Girish K Sa4924c72012-01-11 14:04:52 -0500921
922 /*
923 * Unlike SD, MMC cards dont have a configuration register to notify
924 * supported bus width. So bus test command should be run to identify
925 * the supported bus width or compare the ext csd values of current
926 * bus width and ext csd values of 1 bit mode read earlier.
927 */
Seungwon Jeon577fb132014-04-23 17:08:44 +0900928 for (; idx < ARRAY_SIZE(bus_widths); idx++) {
Girish K Sa4924c72012-01-11 14:04:52 -0500929 /*
930 * Host is capable of 8bit transfer, then switch
931 * the device to work in 8bit transfer mode. If the
932 * mmc switch command returns error then switch to
933 * 4bit transfer mode. On success set the corresponding
934 * bus width on the host.
935 */
936 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
937 EXT_CSD_BUS_WIDTH,
938 ext_csd_bits[idx],
939 card->ext_csd.generic_cmd6_time);
940 if (err)
941 continue;
942
Seungwon Jeon577fb132014-04-23 17:08:44 +0900943 bus_width = bus_widths[idx];
944 mmc_set_bus_width(host, bus_width);
Girish K Sa4924c72012-01-11 14:04:52 -0500945
Seungwon Jeon577fb132014-04-23 17:08:44 +0900946 /*
947 * If controller can't handle bus width test,
948 * compare ext_csd previously read in 1 bit mode
949 * against ext_csd at new bus width
950 */
Girish K Sa4924c72012-01-11 14:04:52 -0500951 if (!(host->caps & MMC_CAP_BUS_WIDTH_TEST))
Seungwon Jeon577fb132014-04-23 17:08:44 +0900952 err = mmc_compare_ext_csds(card, bus_width);
Girish K Sa4924c72012-01-11 14:04:52 -0500953 else
Seungwon Jeon577fb132014-04-23 17:08:44 +0900954 err = mmc_bus_test(card, bus_width);
955
956 if (!err) {
957 err = bus_width;
Girish K Sa4924c72012-01-11 14:04:52 -0500958 break;
Seungwon Jeon577fb132014-04-23 17:08:44 +0900959 } else {
960 pr_warn("%s: switch to bus width %d failed\n",
961 mmc_hostname(host), ext_csd_bits[idx]);
962 }
Girish K Sa4924c72012-01-11 14:04:52 -0500963 }
964
Seungwon Jeon577fb132014-04-23 17:08:44 +0900965 return err;
966}
967
968/*
969 * Switch to the high-speed mode
970 */
971static int mmc_select_hs(struct mmc_card *card)
972{
973 int err;
974
975 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
976 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS,
977 card->ext_csd.generic_cmd6_time,
978 true, true, true);
Girish K Sa4924c72012-01-11 14:04:52 -0500979 if (!err)
Seungwon Jeon577fb132014-04-23 17:08:44 +0900980 mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
981
982 return err;
983}
984
985/*
986 * Activate wide bus and DDR if supported.
987 */
988static int mmc_select_hs_ddr(struct mmc_card *card)
989{
990 struct mmc_host *host = card->host;
991 u32 bus_width, ext_csd_bits;
992 int err = 0;
993
994 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52))
995 return 0;
996
997 bus_width = host->ios.bus_width;
998 if (bus_width == MMC_BUS_WIDTH_1)
999 return 0;
1000
1001 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
1002 EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4;
1003
1004 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1005 EXT_CSD_BUS_WIDTH,
1006 ext_csd_bits,
1007 card->ext_csd.generic_cmd6_time);
1008 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001009 pr_err("%s: switch to bus width %d ddr failed\n",
Seungwon Jeon577fb132014-04-23 17:08:44 +09001010 mmc_hostname(host), 1 << bus_width);
1011 return err;
1012 }
1013
1014 /*
1015 * eMMC cards can support 3.3V to 1.2V i/o (vccq)
1016 * signaling.
1017 *
1018 * EXT_CSD_CARD_TYPE_DDR_1_8V means 3.3V or 1.8V vccq.
1019 *
1020 * 1.8V vccq at 3.3V core voltage (vcc) is not required
1021 * in the JEDEC spec for DDR.
1022 *
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001023 * Even (e)MMC card can support 3.3v to 1.2v vccq, but not all
1024 * host controller can support this, like some of the SDHCI
1025 * controller which connect to an eMMC device. Some of these
1026 * host controller still needs to use 1.8v vccq for supporting
1027 * DDR mode.
1028 *
1029 * So the sequence will be:
1030 * if (host and device can both support 1.2v IO)
1031 * use 1.2v IO;
1032 * else if (host and device can both support 1.8v IO)
1033 * use 1.8v IO;
1034 * so if host and device can only support 3.3v IO, this is the
1035 * last choice.
Seungwon Jeon577fb132014-04-23 17:08:44 +09001036 *
1037 * WARNING: eMMC rules are NOT the same as SD DDR
1038 */
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001039 err = -EINVAL;
1040 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V)
1041 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
Seungwon Jeon577fb132014-04-23 17:08:44 +09001042
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001043 if (err && (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V))
1044 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
1045
1046 /* make sure vccq is 3.3v after switching disaster */
1047 if (err)
1048 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330);
1049
1050 if (!err)
1051 mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
Seungwon Jeon577fb132014-04-23 17:08:44 +09001052
1053 return err;
1054}
1055
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001056static int mmc_select_hs400(struct mmc_card *card)
1057{
1058 struct mmc_host *host = card->host;
1059 int err = 0;
1060
1061 /*
1062 * HS400 mode requires 8-bit bus width
1063 */
1064 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 &&
1065 host->ios.bus_width == MMC_BUS_WIDTH_8))
1066 return 0;
1067
1068 /*
1069 * Before switching to dual data rate operation for HS400,
1070 * it is required to convert from HS200 mode to HS mode.
1071 */
1072 mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
1073 mmc_set_bus_speed(card);
1074
1075 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1076 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS,
1077 card->ext_csd.generic_cmd6_time,
1078 true, true, true);
1079 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001080 pr_err("%s: switch to high-speed from hs200 failed, err:%d\n",
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001081 mmc_hostname(host), err);
1082 return err;
1083 }
1084
1085 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1086 EXT_CSD_BUS_WIDTH,
1087 EXT_CSD_DDR_BUS_WIDTH_8,
1088 card->ext_csd.generic_cmd6_time);
1089 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001090 pr_err("%s: switch to bus width for hs400 failed, err:%d\n",
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001091 mmc_hostname(host), err);
1092 return err;
1093 }
1094
1095 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1096 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS400,
1097 card->ext_csd.generic_cmd6_time,
1098 true, true, true);
1099 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001100 pr_err("%s: switch to hs400 failed, err:%d\n",
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001101 mmc_hostname(host), err);
1102 return err;
1103 }
1104
1105 mmc_set_timing(host, MMC_TIMING_MMC_HS400);
1106 mmc_set_bus_speed(card);
1107
1108 return 0;
1109}
1110
Seungwon Jeon577fb132014-04-23 17:08:44 +09001111/*
1112 * For device supporting HS200 mode, the following sequence
1113 * should be done before executing the tuning process.
1114 * 1. set the desired bus width(4-bit or 8-bit, 1-bit is not supported)
1115 * 2. switch to HS200 mode
1116 * 3. set the clock to > 52Mhz and <=200MHz
1117 */
1118static int mmc_select_hs200(struct mmc_card *card)
1119{
1120 struct mmc_host *host = card->host;
1121 int err = -EINVAL;
1122
1123 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V)
1124 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
1125
1126 if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_8V)
1127 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
1128
1129 /* If fails try again during next card power cycle */
1130 if (err)
1131 goto err;
1132
1133 /*
1134 * Set the bus width(4 or 8) with host's support and
1135 * switch to HS200 mode if bus width is set successfully.
1136 */
1137 err = mmc_select_bus_width(card);
1138 if (!IS_ERR_VALUE(err)) {
Ulf Hansson4509f84772014-01-08 16:09:33 +01001139 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeon577fb132014-04-23 17:08:44 +09001140 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200,
1141 card->ext_csd.generic_cmd6_time,
1142 true, true, true);
1143 if (!err)
1144 mmc_set_timing(host, MMC_TIMING_MMC_HS200);
1145 }
Girish K Sa4924c72012-01-11 14:04:52 -05001146err:
1147 return err;
1148}
1149
1150/*
Seungwon Jeon577fb132014-04-23 17:08:44 +09001151 * Activate High Speed or HS200 mode if supported.
1152 */
1153static int mmc_select_timing(struct mmc_card *card)
1154{
1155 int err = 0;
1156
Ulf Hansson9e304d62014-10-20 11:49:21 +02001157 if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
Seungwon Jeon577fb132014-04-23 17:08:44 +09001158 goto bus_speed;
1159
1160 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200)
1161 err = mmc_select_hs200(card);
1162 else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS)
1163 err = mmc_select_hs(card);
1164
1165 if (err && err != -EBADMSG)
1166 return err;
1167
1168 if (err) {
1169 pr_warn("%s: switch to %s failed\n",
1170 mmc_card_hs(card) ? "high-speed" :
1171 (mmc_card_hs200(card) ? "hs200" : ""),
1172 mmc_hostname(card->host));
1173 err = 0;
1174 }
1175
1176bus_speed:
1177 /*
1178 * Set the bus speed to the selected bus timing.
1179 * If timing is not selected, backward compatible is the default.
1180 */
1181 mmc_set_bus_speed(card);
1182 return err;
1183}
1184
Stephen Boyd48d11e062014-09-22 12:26:10 -07001185const u8 tuning_blk_pattern_4bit[MMC_TUNING_BLK_PATTERN_4BIT_SIZE] = {
1186 0xff, 0x0f, 0xff, 0x00, 0xff, 0xcc, 0xc3, 0xcc,
1187 0xc3, 0x3c, 0xcc, 0xff, 0xfe, 0xff, 0xfe, 0xef,
1188 0xff, 0xdf, 0xff, 0xdd, 0xff, 0xfb, 0xff, 0xfb,
1189 0xbf, 0xff, 0x7f, 0xff, 0x77, 0xf7, 0xbd, 0xef,
1190 0xff, 0xf0, 0xff, 0xf0, 0x0f, 0xfc, 0xcc, 0x3c,
1191 0xcc, 0x33, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xee,
1192 0xff, 0xfd, 0xff, 0xfd, 0xdf, 0xff, 0xbf, 0xff,
1193 0xbb, 0xff, 0xf7, 0xff, 0xf7, 0x7f, 0x7b, 0xde,
1194};
1195EXPORT_SYMBOL(tuning_blk_pattern_4bit);
1196
1197const u8 tuning_blk_pattern_8bit[MMC_TUNING_BLK_PATTERN_8BIT_SIZE] = {
1198 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
1199 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc, 0xcc,
1200 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff, 0xff,
1201 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee, 0xff,
1202 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd, 0xdd,
1203 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xbb,
1204 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff,
1205 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee, 0xff,
1206 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00,
1207 0x00, 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc,
1208 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff,
1209 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee,
1210 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd,
1211 0xdd, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff,
1212 0xbb, 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff,
1213 0xff, 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee,
1214};
1215EXPORT_SYMBOL(tuning_blk_pattern_8bit);
1216
Seungwon Jeon577fb132014-04-23 17:08:44 +09001217/*
1218 * Execute tuning sequence to seek the proper bus operating
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001219 * conditions for HS200 and HS400, which sends CMD21 to the device.
Seungwon Jeon577fb132014-04-23 17:08:44 +09001220 */
1221static int mmc_hs200_tuning(struct mmc_card *card)
1222{
1223 struct mmc_host *host = card->host;
1224 int err = 0;
1225
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001226 /*
1227 * Timing should be adjusted to the HS400 target
1228 * operation frequency for tuning process
1229 */
1230 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 &&
1231 host->ios.bus_width == MMC_BUS_WIDTH_8)
1232 if (host->ops->prepare_hs400_tuning)
1233 host->ops->prepare_hs400_tuning(host, &host->ios);
1234
Seungwon Jeon577fb132014-04-23 17:08:44 +09001235 if (host->ops->execute_tuning) {
1236 mmc_host_clk_hold(host);
1237 err = host->ops->execute_tuning(host,
1238 MMC_SEND_TUNING_BLOCK_HS200);
1239 mmc_host_clk_release(host);
1240
1241 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001242 pr_err("%s: tuning execution failed\n",
Seungwon Jeon577fb132014-04-23 17:08:44 +09001243 mmc_hostname(host));
1244 }
1245
1246 return err;
1247}
1248
1249/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001250 * Handle the detection and initialisation of a card.
1251 *
Deepak Saxena87693922008-06-16 19:20:57 -07001252 * In the case of a resume, "oldcard" will contain the card
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001253 * we're trying to reinitialise.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001254 */
Pierre Ossman8c75dea2007-05-19 16:14:43 +02001255static int mmc_init_card(struct mmc_host *host, u32 ocr,
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001256 struct mmc_card *oldcard)
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001257{
1258 struct mmc_card *card;
Seungwon Jeon577fb132014-04-23 17:08:44 +09001259 int err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001260 u32 cid[4];
Philip Rakityb676f032011-02-13 23:13:09 -08001261 u32 rocr;
Philip Rakity08ee80c2011-05-24 18:14:58 -07001262 u8 *ext_csd = NULL;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001263
1264 BUG_ON(!host);
Pierre Ossmand84075c82007-08-09 13:23:56 +02001265 WARN_ON(!host->claimed);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001266
Stefan Nilsson XK44669032011-09-15 17:50:38 +02001267 /* Set correct bus mode for MMC before attempting init */
1268 if (!mmc_host_is_spi(host))
1269 mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);
1270
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001271 /*
1272 * Since we're changing the OCR value, we seem to
1273 * need to tell some cards to go back to the idle
1274 * state. We wait 1ms to give cards time to
1275 * respond.
Balaji T Kc3805462011-09-08 22:08:39 +05301276 * mmc_go_idle is needed for eMMC that are asleep
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001277 */
1278 mmc_go_idle(host);
1279
1280 /* The extra bit indicates that we support high capacity */
Philip Rakityb676f032011-02-13 23:13:09 -08001281 err = mmc_send_op_cond(host, ocr | (1 << 30), &rocr);
Pierre Ossman17b04292007-07-22 22:18:46 +02001282 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001283 goto err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001284
1285 /*
David Brownellaf517152007-08-08 09:11:32 -07001286 * For SPI, enable CRC as appropriate.
1287 */
1288 if (mmc_host_is_spi(host)) {
1289 err = mmc_spi_set_crc(host, use_spi_crc);
1290 if (err)
1291 goto err;
1292 }
1293
1294 /*
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001295 * Fetch CID from card.
1296 */
David Brownellaf517152007-08-08 09:11:32 -07001297 if (mmc_host_is_spi(host))
1298 err = mmc_send_cid(host, cid);
1299 else
1300 err = mmc_all_send_cid(host, cid);
Pierre Ossman17b04292007-07-22 22:18:46 +02001301 if (err)
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001302 goto err;
1303
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001304 if (oldcard) {
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001305 if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) {
1306 err = -ENOENT;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001307 goto err;
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001308 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001309
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001310 card = oldcard;
1311 } else {
1312 /*
1313 * Allocate card structure.
1314 */
Pierre Ossman51ec92e2008-03-21 23:54:50 +01001315 card = mmc_alloc_card(host, &mmc_type);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001316 if (IS_ERR(card)) {
1317 err = PTR_ERR(card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001318 goto err;
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001319 }
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001320
Ulf Hansson69041152013-09-13 11:31:33 +02001321 card->ocr = ocr;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001322 card->type = MMC_TYPE_MMC;
1323 card->rca = 1;
1324 memcpy(card->raw_cid, cid, sizeof(card->raw_cid));
1325 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001326
1327 /*
David Brownellaf517152007-08-08 09:11:32 -07001328 * For native busses: set card RCA and quit open drain mode.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001329 */
David Brownellaf517152007-08-08 09:11:32 -07001330 if (!mmc_host_is_spi(host)) {
1331 err = mmc_set_relative_addr(card);
1332 if (err)
1333 goto free_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001334
David Brownellaf517152007-08-08 09:11:32 -07001335 mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);
1336 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001337
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001338 if (!oldcard) {
1339 /*
1340 * Fetch CSD from card.
1341 */
1342 err = mmc_send_csd(card, card->raw_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +02001343 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001344 goto free_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001345
Pierre Ossmanbd766312007-05-01 16:11:57 +02001346 err = mmc_decode_csd(card);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001347 if (err)
Pierre Ossmanbd766312007-05-01 16:11:57 +02001348 goto free_card;
1349 err = mmc_decode_cid(card);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001350 if (err)
Pierre Ossmanbd766312007-05-01 16:11:57 +02001351 goto free_card;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001352 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001353
1354 /*
Sascha Hauer3d705d12014-08-19 10:45:51 +02001355 * handling only for cards supporting DSR and hosts requesting
1356 * DSR configuration
1357 */
1358 if (card->csd.dsr_imp && host->dsr_req)
1359 mmc_set_dsr(host);
1360
1361 /*
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001362 * Select card, as all following commands rely on that.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001363 */
David Brownellaf517152007-08-08 09:11:32 -07001364 if (!mmc_host_is_spi(host)) {
1365 err = mmc_select_card(card);
1366 if (err)
1367 goto free_card;
1368 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001369
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001370 if (!oldcard) {
1371 /*
David Brownellaf517152007-08-08 09:11:32 -07001372 * Fetch and process extended CSD.
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001373 */
Philip Rakity08ee80c2011-05-24 18:14:58 -07001374
1375 err = mmc_get_ext_csd(card, &ext_csd);
1376 if (err)
1377 goto free_card;
1378 err = mmc_read_ext_csd(card, ext_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +02001379 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001380 goto free_card;
Philip Rakityb676f032011-02-13 23:13:09 -08001381
1382 /* If doing byte addressing, check if required to do sector
1383 * addressing. Handle the case of <2GB cards needing sector
1384 * addressing. See section 8.1 JEDEC Standard JED84-A441;
1385 * ocr register has bit 30 set for sector addressing.
1386 */
1387 if (!(mmc_card_blockaddr(card)) && (rocr & (1<<30)))
1388 mmc_card_set_blockaddr(card);
1389
Adrian Hunterdfe86cb2010-08-11 14:17:46 -07001390 /* Erase size depends on CSD and Extended CSD */
1391 mmc_set_erase_size(card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001392 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001393
1394 /*
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001395 * If enhanced_area_en is TRUE, host needs to enable ERASE_GRP_DEF
Lucas De Marchi25985ed2011-03-30 22:57:33 -03001396 * bit. This bit will be lost every time after a reset or power off.
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001397 */
Grégory Soutadé69803d42014-09-15 17:47:09 +02001398 if (card->ext_csd.partition_setting_completed ||
Adrian Hunter83bb24a2012-03-13 05:19:13 -04001399 (card->ext_csd.rev >= 3 && (host->caps2 & MMC_CAP2_HC_ERASE_SZ))) {
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001400 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeonb23cf0b2011-09-23 14:15:29 +09001401 EXT_CSD_ERASE_GROUP_DEF, 1,
1402 card->ext_csd.generic_cmd6_time);
Chuanxiao Dong709de99d2011-01-22 04:09:41 +08001403
1404 if (err && err != -EBADMSG)
1405 goto free_card;
1406
1407 if (err) {
1408 err = 0;
1409 /*
1410 * Just disable enhanced area off & sz
1411 * will try to enable ERASE_GROUP_DEF
1412 * during next time reinit
1413 */
1414 card->ext_csd.enhanced_area_offset = -EINVAL;
1415 card->ext_csd.enhanced_area_size = -EINVAL;
1416 } else {
1417 card->ext_csd.erase_group_def = 1;
1418 /*
1419 * enable ERASE_GRP_DEF successfully.
1420 * This will affect the erase size, so
1421 * here need to reset erase size
1422 */
1423 mmc_set_erase_size(card);
1424 }
1425 }
1426
1427 /*
Philip Rakity41e2a482011-03-19 14:10:33 -04001428 * Ensure eMMC user default partition is enabled
1429 */
Andrei Warkentin371a6892011-04-11 18:10:25 -05001430 if (card->ext_csd.part_config & EXT_CSD_PART_CONFIG_ACC_MASK) {
1431 card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK;
1432 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG,
1433 card->ext_csd.part_config,
1434 card->ext_csd.part_time);
1435 if (err && err != -EBADMSG)
1436 goto free_card;
Philip Rakity41e2a482011-03-19 14:10:33 -04001437 }
1438
1439 /*
Ulf Hansson432356792013-06-10 17:03:45 +02001440 * Enable power_off_notification byte in the ext_csd register
Girish K Sbec87262011-10-13 12:04:16 +05301441 */
Ulf Hansson432356792013-06-10 17:03:45 +02001442 if (card->ext_csd.rev >= 6) {
Girish K Sbec87262011-10-13 12:04:16 +05301443 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1444 EXT_CSD_POWER_OFF_NOTIFICATION,
1445 EXT_CSD_POWER_ON,
1446 card->ext_csd.generic_cmd6_time);
1447 if (err && err != -EBADMSG)
1448 goto free_card;
Girish K Sbec87262011-10-13 12:04:16 +05301449
Girish K S96a85d52011-11-04 16:22:47 +05301450 /*
1451 * The err can be -EBADMSG or 0,
1452 * so check for success and update the flag
1453 */
1454 if (!err)
Ulf Hanssone6c08582012-10-05 12:45:39 -04001455 card->ext_csd.power_off_notification = EXT_CSD_POWER_ON;
Girish K S96a85d52011-11-04 16:22:47 +05301456 }
Girish K Sbec87262011-10-13 12:04:16 +05301457
1458 /*
Seungwon Jeon577fb132014-04-23 17:08:44 +09001459 * Select timing interface
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001460 */
Seungwon Jeon577fb132014-04-23 17:08:44 +09001461 err = mmc_select_timing(card);
1462 if (err)
1463 goto free_card;
Girish K Sa4924c72012-01-11 14:04:52 -05001464
Girish K Sa4924c72012-01-11 14:04:52 -05001465 if (mmc_card_hs200(card)) {
Seungwon Jeon577fb132014-04-23 17:08:44 +09001466 err = mmc_hs200_tuning(card);
1467 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001468 goto free_card;
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001469
1470 err = mmc_select_hs400(card);
1471 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001472 goto free_card;
Seungwon Jeon577fb132014-04-23 17:08:44 +09001473 } else if (mmc_card_hs(card)) {
1474 /* Select the desired bus width optionally */
1475 err = mmc_select_bus_width(card);
1476 if (!IS_ERR_VALUE(err)) {
1477 err = mmc_select_hs_ddr(card);
1478 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001479 goto free_card;
Adrian Hunteref0b27d2009-09-22 16:44:37 -07001480 }
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001481 }
1482
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001483 /*
Seungwon Jeon23850492014-04-23 17:08:05 +09001484 * Choose the power class with selected bus interface
1485 */
1486 mmc_select_powerclass(card);
1487
1488 /*
Subhash Jadavani52d09742012-03-06 17:59:12 +05301489 * Enable HPI feature (if supported)
1490 */
1491 if (card->ext_csd.hpi) {
1492 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1493 EXT_CSD_HPI_MGMT, 1,
1494 card->ext_csd.generic_cmd6_time);
1495 if (err && err != -EBADMSG)
1496 goto free_card;
1497 if (err) {
Joe Perches66061102014-09-12 14:56:56 -07001498 pr_warn("%s: Enabling HPI failed\n",
1499 mmc_hostname(card->host));
Subhash Jadavani52d09742012-03-06 17:59:12 +05301500 err = 0;
1501 } else
1502 card->ext_csd.hpi_en = 1;
1503 }
1504
1505 /*
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001506 * If cache size is higher than 0, this indicates
1507 * the existence of cache and it can be turned on.
1508 */
Ulf Hansson7536d3f2013-12-18 11:59:17 +01001509 if (card->ext_csd.cache_size > 0) {
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001510 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001511 EXT_CSD_CACHE_CTRL, 1,
1512 card->ext_csd.generic_cmd6_time);
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001513 if (err && err != -EBADMSG)
1514 goto free_card;
1515
1516 /*
1517 * Only if no error, cache is turned on successfully.
1518 */
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001519 if (err) {
Joe Perches66061102014-09-12 14:56:56 -07001520 pr_warn("%s: Cache is supported, but failed to turn on (%d)\n",
1521 mmc_hostname(card->host), err);
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001522 card->ext_csd.cache_ctrl = 0;
1523 err = 0;
1524 } else {
1525 card->ext_csd.cache_ctrl = 1;
1526 }
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001527 }
1528
Seungwon Jeonabd9ac12013-02-06 17:01:43 +09001529 /*
1530 * The mandatory minimum values are defined for packed command.
1531 * read: 5, write: 3
1532 */
1533 if (card->ext_csd.max_packed_writes >= 3 &&
1534 card->ext_csd.max_packed_reads >= 5 &&
1535 host->caps2 & MMC_CAP2_PACKED_CMD) {
1536 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1537 EXT_CSD_EXP_EVENTS_CTRL,
1538 EXT_CSD_PACKED_EVENT_EN,
1539 card->ext_csd.generic_cmd6_time);
1540 if (err && err != -EBADMSG)
1541 goto free_card;
1542 if (err) {
1543 pr_warn("%s: Enabling packed event failed\n",
1544 mmc_hostname(card->host));
1545 card->ext_csd.packed_event_en = 0;
1546 err = 0;
1547 } else {
1548 card->ext_csd.packed_event_en = 1;
1549 }
1550 }
1551
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001552 if (!oldcard)
1553 host->card = card;
1554
Ulf Hansson00b41b52014-10-16 16:18:51 +02001555 kfree(ext_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +02001556 return 0;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001557
1558free_card:
1559 if (!oldcard)
1560 mmc_remove_card(card);
1561err:
Ulf Hansson00b41b52014-10-16 16:18:51 +02001562 kfree(ext_csd);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001563
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001564 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001565}
1566
Ulf Hansson07a68212013-04-19 15:12:11 +02001567static int mmc_can_sleep(struct mmc_card *card)
1568{
1569 return (card && card->ext_csd.rev >= 3);
1570}
1571
1572static int mmc_sleep(struct mmc_host *host)
1573{
1574 struct mmc_command cmd = {0};
1575 struct mmc_card *card = host->card;
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001576 unsigned int timeout_ms = DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000);
Ulf Hansson07a68212013-04-19 15:12:11 +02001577 int err;
1578
Ulf Hansson07a68212013-04-19 15:12:11 +02001579 err = mmc_deselect_cards(host);
1580 if (err)
1581 return err;
1582
1583 cmd.opcode = MMC_SLEEP_AWAKE;
1584 cmd.arg = card->rca << 16;
1585 cmd.arg |= 1 << 15;
1586
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001587 /*
1588 * If the max_busy_timeout of the host is specified, validate it against
1589 * the sleep cmd timeout. A failure means we need to prevent the host
1590 * from doing hw busy detection, which is done by converting to a R1
1591 * response instead of a R1B.
1592 */
1593 if (host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) {
1594 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
1595 } else {
1596 cmd.flags = MMC_RSP_R1B | MMC_CMD_AC;
1597 cmd.busy_timeout = timeout_ms;
1598 }
1599
Ulf Hansson07a68212013-04-19 15:12:11 +02001600 err = mmc_wait_for_cmd(host, &cmd, 0);
1601 if (err)
1602 return err;
1603
1604 /*
1605 * If the host does not wait while the card signals busy, then we will
1606 * will have to wait the sleep/awake timeout. Note, we cannot use the
1607 * SEND_STATUS command to poll the status because that command (and most
1608 * others) is invalid while the card sleeps.
1609 */
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001610 if (!cmd.busy_timeout || !(host->caps & MMC_CAP_WAIT_WHILE_BUSY))
1611 mmc_delay(timeout_ms);
Ulf Hansson07a68212013-04-19 15:12:11 +02001612
1613 return err;
1614}
1615
Ulf Hanssone6c08582012-10-05 12:45:39 -04001616static int mmc_can_poweroff_notify(const struct mmc_card *card)
1617{
1618 return card &&
1619 mmc_card_mmc(card) &&
1620 (card->ext_csd.power_off_notification == EXT_CSD_POWER_ON);
1621}
1622
1623static int mmc_poweroff_notify(struct mmc_card *card, unsigned int notify_type)
1624{
1625 unsigned int timeout = card->ext_csd.generic_cmd6_time;
1626 int err;
1627
1628 /* Use EXT_CSD_POWER_OFF_SHORT as default notification type. */
1629 if (notify_type == EXT_CSD_POWER_OFF_LONG)
1630 timeout = card->ext_csd.power_off_longtime;
1631
Ulf Hansson878e2002013-09-09 11:57:57 +02001632 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1633 EXT_CSD_POWER_OFF_NOTIFICATION,
Ulf Hansson4509f84772014-01-08 16:09:33 +01001634 notify_type, timeout, true, false, false);
Ulf Hanssone6c08582012-10-05 12:45:39 -04001635 if (err)
1636 pr_err("%s: Power Off Notification timed out, %u\n",
1637 mmc_hostname(card->host), timeout);
1638
1639 /* Disable the power off notification after the switch operation. */
1640 card->ext_csd.power_off_notification = EXT_CSD_NO_POWER_NOTIFICATION;
1641
1642 return err;
1643}
1644
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001645/*
1646 * Host is being removed. Free up the current card.
1647 */
1648static void mmc_remove(struct mmc_host *host)
1649{
1650 BUG_ON(!host);
1651 BUG_ON(!host->card);
1652
1653 mmc_remove_card(host->card);
1654 host->card = NULL;
1655}
1656
1657/*
Adrian Hunterd3049502011-11-28 16:22:00 +02001658 * Card detection - card is alive.
1659 */
1660static int mmc_alive(struct mmc_host *host)
1661{
1662 return mmc_send_status(host->card, NULL);
1663}
1664
1665/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001666 * Card detection callback from host.
1667 */
1668static void mmc_detect(struct mmc_host *host)
1669{
1670 int err;
1671
1672 BUG_ON(!host);
1673 BUG_ON(!host->card);
1674
Ulf Hanssone94cfef2013-05-02 14:02:38 +02001675 mmc_get_card(host->card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001676
1677 /*
1678 * Just check if our card has been removed.
1679 */
Adrian Hunterd3049502011-11-28 16:22:00 +02001680 err = _mmc_detect_card_removed(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001681
Ulf Hanssone94cfef2013-05-02 14:02:38 +02001682 mmc_put_card(host->card);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001683
Pierre Ossman17b04292007-07-22 22:18:46 +02001684 if (err) {
Pierre Ossman4101c162007-05-19 13:39:01 +02001685 mmc_remove(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001686
1687 mmc_claim_host(host);
1688 mmc_detach_bus(host);
Ulf Hansson7f7e4122011-09-21 14:08:13 -04001689 mmc_power_off(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001690 mmc_release_host(host);
1691 }
1692}
1693
Ulf Hansson03d071f2013-06-10 17:03:43 +02001694static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001695{
Balaji T Kc3805462011-09-08 22:08:39 +05301696 int err = 0;
Ulf Hansson03d071f2013-06-10 17:03:43 +02001697 unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
1698 EXT_CSD_POWER_OFF_LONG;
Balaji T Kc3805462011-09-08 22:08:39 +05301699
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001700 BUG_ON(!host);
1701 BUG_ON(!host->card);
1702
1703 mmc_claim_host(host);
Maya Erez881d9262013-01-28 16:44:22 -05001704
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001705 if (mmc_card_suspended(host->card))
1706 goto out;
1707
Ulf Hansson39b94312013-05-02 14:02:36 +02001708 if (mmc_card_doing_bkops(host->card)) {
1709 err = mmc_stop_bkops(host->card);
1710 if (err)
1711 goto out;
1712 }
1713
Ulf Hansson10e5d962013-12-16 16:23:22 +01001714 err = mmc_flush_cache(host->card);
Maya Erez881d9262013-01-28 16:44:22 -05001715 if (err)
1716 goto out;
1717
Ulf Hansson432356792013-06-10 17:03:45 +02001718 if (mmc_can_poweroff_notify(host->card) &&
Ulf Hansson53275c22013-06-10 17:03:46 +02001719 ((host->caps2 & MMC_CAP2_FULL_PWR_CYCLE) || !is_suspend))
Ulf Hansson03d071f2013-06-10 17:03:43 +02001720 err = mmc_poweroff_notify(host->card, notify_type);
Ulf Hansson07a68212013-04-19 15:12:11 +02001721 else if (mmc_can_sleep(host->card))
1722 err = mmc_sleep(host);
Ulf Hanssone6c08582012-10-05 12:45:39 -04001723 else if (!mmc_host_is_spi(host))
Jaehoon Chung85e727e2012-05-31 20:31:47 +09001724 err = mmc_deselect_cards(host);
Nicolas Pitre95cdfb72009-09-22 16:45:29 -07001725
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001726 if (!err) {
Ulf Hansson74590262013-06-10 17:03:38 +02001727 mmc_power_off(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001728 mmc_card_set_suspended(host->card);
1729 }
Maya Erez881d9262013-01-28 16:44:22 -05001730out:
1731 mmc_release_host(host);
Balaji T Kc3805462011-09-08 22:08:39 +05301732 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001733}
1734
1735/*
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001736 * Suspend callback
Ulf Hansson03d071f2013-06-10 17:03:43 +02001737 */
1738static int mmc_suspend(struct mmc_host *host)
1739{
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001740 int err;
1741
1742 err = _mmc_suspend(host, true);
1743 if (!err) {
1744 pm_runtime_disable(&host->card->dev);
1745 pm_runtime_set_suspended(&host->card->dev);
1746 }
1747
1748 return err;
Ulf Hansson03d071f2013-06-10 17:03:43 +02001749}
1750
1751/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001752 * This function tries to determine if the same card is still present
1753 * and, if so, restore all state to it.
1754 */
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001755static int _mmc_resume(struct mmc_host *host)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001756{
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001757 int err = 0;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001758
1759 BUG_ON(!host);
1760 BUG_ON(!host->card);
1761
1762 mmc_claim_host(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001763
1764 if (!mmc_card_suspended(host->card))
1765 goto out;
1766
Ulf Hansson69041152013-09-13 11:31:33 +02001767 mmc_power_up(host, host->card->ocr);
Ulf Hansson69041152013-09-13 11:31:33 +02001768 err = mmc_init_card(host, host->card->ocr, host->card);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001769 mmc_card_clr_suspended(host->card);
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001770
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001771out:
1772 mmc_release_host(host);
Nicolas Pitre95cdfb72009-09-22 16:45:29 -07001773 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001774}
1775
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001776/*
1777 * Shutdown callback
1778 */
1779static int mmc_shutdown(struct mmc_host *host)
1780{
1781 int err = 0;
1782
1783 /*
1784 * In a specific case for poweroff notify, we need to resume the card
1785 * before we can shutdown it properly.
1786 */
1787 if (mmc_can_poweroff_notify(host->card) &&
1788 !(host->caps2 & MMC_CAP2_FULL_PWR_CYCLE))
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001789 err = _mmc_resume(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001790
1791 if (!err)
1792 err = _mmc_suspend(host, false);
1793
1794 return err;
1795}
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001796
1797/*
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001798 * Callback for resume.
1799 */
1800static int mmc_resume(struct mmc_host *host)
1801{
Ulf Hansson4d223782013-10-10 17:22:23 +02001802 int err = 0;
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001803
Ulf Hansson4d223782013-10-10 17:22:23 +02001804 if (!(host->caps & MMC_CAP_RUNTIME_RESUME)) {
1805 err = _mmc_resume(host);
1806 pm_runtime_set_active(&host->card->dev);
1807 pm_runtime_mark_last_busy(&host->card->dev);
1808 }
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001809 pm_runtime_enable(&host->card->dev);
1810
1811 return err;
1812}
1813
1814/*
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001815 * Callback for runtime_suspend.
1816 */
1817static int mmc_runtime_suspend(struct mmc_host *host)
1818{
1819 int err;
1820
1821 if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
1822 return 0;
1823
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001824 err = _mmc_suspend(host, true);
Ulf Hansson0cc81a82013-10-03 11:24:44 +02001825 if (err)
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001826 pr_err("%s: error %d doing aggessive suspend\n",
1827 mmc_hostname(host), err);
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001828
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001829 return err;
1830}
1831
1832/*
1833 * Callback for runtime_resume.
1834 */
1835static int mmc_runtime_resume(struct mmc_host *host)
1836{
1837 int err;
1838
Ulf Hansson4d223782013-10-10 17:22:23 +02001839 if (!(host->caps & (MMC_CAP_AGGRESSIVE_PM | MMC_CAP_RUNTIME_RESUME)))
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001840 return 0;
1841
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001842 err = _mmc_resume(host);
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001843 if (err)
1844 pr_err("%s: error %d doing aggessive resume\n",
1845 mmc_hostname(host), err);
1846
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001847 return 0;
1848}
1849
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001850static int mmc_power_restore(struct mmc_host *host)
Adrian Huntereae1aee2009-09-22 16:44:33 -07001851{
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001852 int ret;
1853
Adrian Huntereae1aee2009-09-22 16:44:33 -07001854 mmc_claim_host(host);
Ulf Hansson69041152013-09-13 11:31:33 +02001855 ret = mmc_init_card(host, host->card->ocr, host->card);
Adrian Huntereae1aee2009-09-22 16:44:33 -07001856 mmc_release_host(host);
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001857
1858 return ret;
Adrian Huntereae1aee2009-09-22 16:44:33 -07001859}
1860
Adrian Hunter9feae242009-09-22 16:44:32 -07001861static const struct mmc_bus_ops mmc_ops = {
1862 .remove = mmc_remove,
1863 .detect = mmc_detect,
Adrian Hunter9feae242009-09-22 16:44:32 -07001864 .suspend = mmc_suspend,
1865 .resume = mmc_resume,
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001866 .runtime_suspend = mmc_runtime_suspend,
1867 .runtime_resume = mmc_runtime_resume,
Adrian Huntereae1aee2009-09-22 16:44:33 -07001868 .power_restore = mmc_power_restore,
Adrian Hunterd3049502011-11-28 16:22:00 +02001869 .alive = mmc_alive,
Ulf Hansson486fdbb2013-06-10 17:03:44 +02001870 .shutdown = mmc_shutdown,
Adrian Hunter9feae242009-09-22 16:44:32 -07001871};
1872
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001873/*
1874 * Starting point for MMC card init.
1875 */
Andy Ross807e8e42011-01-03 10:36:56 -08001876int mmc_attach_mmc(struct mmc_host *host)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001877{
1878 int err;
Ulf Hansson69041152013-09-13 11:31:33 +02001879 u32 ocr, rocr;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001880
1881 BUG_ON(!host);
Pierre Ossmand84075c82007-08-09 13:23:56 +02001882 WARN_ON(!host->claimed);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001883
Stefan Nilsson XK44669032011-09-15 17:50:38 +02001884 /* Set correct bus mode for MMC before attempting attach */
1885 if (!mmc_host_is_spi(host))
1886 mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);
1887
Andy Ross807e8e42011-01-03 10:36:56 -08001888 err = mmc_send_op_cond(host, 0, &ocr);
1889 if (err)
1890 return err;
1891
Ulf Hansson2501c912013-10-30 01:00:18 +01001892 mmc_attach_bus(host, &mmc_ops);
Takashi Iwai8f230f42010-12-08 10:04:30 +01001893 if (host->ocr_avail_mmc)
1894 host->ocr_avail = host->ocr_avail_mmc;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001895
1896 /*
David Brownellaf517152007-08-08 09:11:32 -07001897 * We need to get OCR a different way for SPI.
1898 */
1899 if (mmc_host_is_spi(host)) {
1900 err = mmc_spi_read_ocr(host, 1, &ocr);
1901 if (err)
1902 goto err;
1903 }
1904
Ulf Hansson69041152013-09-13 11:31:33 +02001905 rocr = mmc_select_voltage(host, ocr);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001906
1907 /*
1908 * Can we support the voltage of the card?
1909 */
Ulf Hansson69041152013-09-13 11:31:33 +02001910 if (!rocr) {
Pierre Ossman109b5be2007-07-23 00:12:10 +02001911 err = -EINVAL;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001912 goto err;
Pierre Ossman109b5be2007-07-23 00:12:10 +02001913 }
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001914
1915 /*
1916 * Detect and init the card.
1917 */
Ulf Hansson69041152013-09-13 11:31:33 +02001918 err = mmc_init_card(host, rocr, NULL);
Pierre Ossman17b04292007-07-22 22:18:46 +02001919 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001920 goto err;
1921
1922 mmc_release_host(host);
Pierre Ossman4101c162007-05-19 13:39:01 +02001923 err = mmc_add_card(host->card);
Andy Ross807e8e42011-01-03 10:36:56 -08001924 mmc_claim_host(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001925 if (err)
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001926 goto remove_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001927
1928 return 0;
1929
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001930remove_card:
Andy Ross807e8e42011-01-03 10:36:56 -08001931 mmc_release_host(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001932 mmc_remove_card(host->card);
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001933 mmc_claim_host(host);
Andy Ross807e8e42011-01-03 10:36:56 -08001934 host->card = NULL;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001935err:
1936 mmc_detach_bus(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001937
Girish K Sa3c76eb2011-10-11 11:44:09 +05301938 pr_err("%s: error %d whilst initialising MMC card\n",
Pierre Ossman109b5be2007-07-23 00:12:10 +02001939 mmc_hostname(host), err);
1940
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001941 return err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001942}