blob: 13f8e3672606074e5ddd92a24b4e5b786f6bbbe3 [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
Ulf Hansson148bcab2014-10-20 11:33:53 +0200193 if (!mmc_can_ext_csd(card))
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 */
Ulf Hansson076ec382014-10-20 13:37:24 +0200391static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd)
Philip Rakity08ee80c2011-05-24 18:14:58 -0700392{
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 Dong709de992011-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
Ulf Hansson076ec382014-10-20 13:37:24 +0200640static int mmc_read_ext_csd(struct mmc_card *card)
641{
642 u8 *ext_csd = NULL;
643 int err;
644
645 err = mmc_get_ext_csd(card, &ext_csd);
646 if (err)
647 return err;
648
649 err = mmc_decode_ext_csd(card, ext_csd);
650 kfree(ext_csd);
651 return err;
652}
653
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700654static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width)
Philip Rakity08ee80c2011-05-24 18:14:58 -0700655{
656 u8 *bw_ext_csd;
657 int err;
658
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700659 if (bus_width == MMC_BUS_WIDTH_1)
660 return 0;
Philip Rakity08ee80c2011-05-24 18:14:58 -0700661
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700662 err = mmc_get_ext_csd(card, &bw_ext_csd);
663
664 if (err || bw_ext_csd == NULL) {
Philippe De Swertf6f44592012-04-11 23:32:05 +0300665 err = -EINVAL;
Philip Rakity08ee80c2011-05-24 18:14:58 -0700666 goto out;
667 }
668
Philip Rakity08ee80c2011-05-24 18:14:58 -0700669 /* only compare read only fields */
Jurgen Heeksdd13b4e2012-02-01 13:30:55 +0100670 err = !((card->ext_csd.raw_partition_support ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700671 bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700672 (card->ext_csd.raw_erased_mem_count ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700673 bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700674 (card->ext_csd.rev ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700675 bw_ext_csd[EXT_CSD_REV]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700676 (card->ext_csd.raw_ext_csd_structure ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700677 bw_ext_csd[EXT_CSD_STRUCTURE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700678 (card->ext_csd.raw_card_type ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700679 bw_ext_csd[EXT_CSD_CARD_TYPE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700680 (card->ext_csd.raw_s_a_timeout ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700681 bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700682 (card->ext_csd.raw_hc_erase_gap_size ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700683 bw_ext_csd[EXT_CSD_HC_WP_GRP_SIZE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700684 (card->ext_csd.raw_erase_timeout_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700685 bw_ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700686 (card->ext_csd.raw_hc_erase_grp_size ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700687 bw_ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700688 (card->ext_csd.raw_sec_trim_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700689 bw_ext_csd[EXT_CSD_SEC_TRIM_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700690 (card->ext_csd.raw_sec_erase_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700691 bw_ext_csd[EXT_CSD_SEC_ERASE_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700692 (card->ext_csd.raw_sec_feature_support ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700693 bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700694 (card->ext_csd.raw_trim_mult ==
Philip Rakity08ee80c2011-05-24 18:14:58 -0700695 bw_ext_csd[EXT_CSD_TRIM_MULT]) &&
Philip Rakityf39b2dd92011-07-07 09:04:55 -0700696 (card->ext_csd.raw_sectors[0] ==
697 bw_ext_csd[EXT_CSD_SEC_CNT + 0]) &&
698 (card->ext_csd.raw_sectors[1] ==
699 bw_ext_csd[EXT_CSD_SEC_CNT + 1]) &&
700 (card->ext_csd.raw_sectors[2] ==
701 bw_ext_csd[EXT_CSD_SEC_CNT + 2]) &&
702 (card->ext_csd.raw_sectors[3] ==
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200703 bw_ext_csd[EXT_CSD_SEC_CNT + 3]) &&
704 (card->ext_csd.raw_pwr_cl_52_195 ==
705 bw_ext_csd[EXT_CSD_PWR_CL_52_195]) &&
706 (card->ext_csd.raw_pwr_cl_26_195 ==
707 bw_ext_csd[EXT_CSD_PWR_CL_26_195]) &&
708 (card->ext_csd.raw_pwr_cl_52_360 ==
709 bw_ext_csd[EXT_CSD_PWR_CL_52_360]) &&
710 (card->ext_csd.raw_pwr_cl_26_360 ==
711 bw_ext_csd[EXT_CSD_PWR_CL_26_360]) &&
712 (card->ext_csd.raw_pwr_cl_200_195 ==
713 bw_ext_csd[EXT_CSD_PWR_CL_200_195]) &&
714 (card->ext_csd.raw_pwr_cl_200_360 ==
715 bw_ext_csd[EXT_CSD_PWR_CL_200_360]) &&
716 (card->ext_csd.raw_pwr_cl_ddr_52_195 ==
717 bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_195]) &&
718 (card->ext_csd.raw_pwr_cl_ddr_52_360 ==
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900719 bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_360]) &&
720 (card->ext_csd.raw_pwr_cl_ddr_200_360 ==
721 bw_ext_csd[EXT_CSD_PWR_CL_DDR_200_360]));
722
Philip Rakity08ee80c2011-05-24 18:14:58 -0700723 if (err)
724 err = -EINVAL;
725
726out:
Ulf Hansson00b41b52014-10-16 16:18:51 +0200727 kfree(bw_ext_csd);
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100728 return err;
729}
730
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100731MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
732 card->raw_cid[2], card->raw_cid[3]);
733MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
734 card->raw_csd[2], card->raw_csd[3]);
735MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700736MMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9);
737MMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9);
Gwendal Grignou0f762422014-10-16 11:27:16 -0700738MMC_DEV_ATTR(ffu_capable, "%d\n", card->ext_csd.ffu_capable);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100739MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);
740MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
741MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);
742MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid);
Bernie Thompson51e7e8b2013-02-27 12:19:17 -0800743MMC_DEV_ATTR(prv, "0x%x\n", card->cid.prv);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100744MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial);
Chuanxiao Dong709de992011-01-22 04:09:41 +0800745MMC_DEV_ATTR(enhanced_area_offset, "%llu\n",
746 card->ext_csd.enhanced_area_offset);
747MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size);
Loic Pallardy188cc042012-08-06 17:12:29 +0200748MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult);
749MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100750
Gwendal Grignou0f762422014-10-16 11:27:16 -0700751static ssize_t mmc_fwrev_show(struct device *dev,
752 struct device_attribute *attr,
753 char *buf)
754{
755 struct mmc_card *card = mmc_dev_to_card(dev);
756
757 if (card->ext_csd.rev < 7) {
758 return sprintf(buf, "0x%x\n", card->cid.fwrev);
759 } else {
760 return sprintf(buf, "0x%*phN\n", MMC_FIRMWARE_LEN,
761 card->ext_csd.fwrev);
762 }
763}
764
765static DEVICE_ATTR(fwrev, S_IRUGO, mmc_fwrev_show, NULL);
766
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100767static struct attribute *mmc_std_attrs[] = {
768 &dev_attr_cid.attr,
769 &dev_attr_csd.attr,
770 &dev_attr_date.attr,
Adrian Hunterdfe86cb2010-08-11 14:17:46 -0700771 &dev_attr_erase_size.attr,
772 &dev_attr_preferred_erase_size.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100773 &dev_attr_fwrev.attr,
Gwendal Grignou0f762422014-10-16 11:27:16 -0700774 &dev_attr_ffu_capable.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100775 &dev_attr_hwrev.attr,
776 &dev_attr_manfid.attr,
777 &dev_attr_name.attr,
778 &dev_attr_oemid.attr,
Bernie Thompson51e7e8b2013-02-27 12:19:17 -0800779 &dev_attr_prv.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100780 &dev_attr_serial.attr,
Chuanxiao Dong709de992011-01-22 04:09:41 +0800781 &dev_attr_enhanced_area_offset.attr,
782 &dev_attr_enhanced_area_size.attr,
Loic Pallardy188cc042012-08-06 17:12:29 +0200783 &dev_attr_raw_rpmb_size_mult.attr,
784 &dev_attr_rel_sectors.attr,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100785 NULL,
786};
Axel Lind1e58212014-03-08 15:05:27 +0800787ATTRIBUTE_GROUPS(mmc_std);
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100788
789static struct device_type mmc_type = {
Axel Lind1e58212014-03-08 15:05:27 +0800790 .groups = mmc_std_groups,
Pierre Ossman51ec92e2008-03-21 23:54:50 +0100791};
792
Pierre Ossman7ea239d2006-12-31 00:11:32 +0100793/*
Girish K Sb87d8db2011-09-23 20:41:47 +0530794 * Select the PowerClass for the current bus width
795 * If power class is defined for 4/8 bit bus in the
796 * extended CSD register, select it by executing the
797 * mmc_switch command.
798 */
Seungwon Jeon23850492014-04-23 17:08:05 +0900799static int __mmc_select_powerclass(struct mmc_card *card,
800 unsigned int bus_width)
Girish K Sb87d8db2011-09-23 20:41:47 +0530801{
Seungwon Jeon23850492014-04-23 17:08:05 +0900802 struct mmc_host *host = card->host;
803 struct mmc_ext_csd *ext_csd = &card->ext_csd;
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200804 unsigned int pwrclass_val = 0;
Seungwon Jeon23850492014-04-23 17:08:05 +0900805 int err = 0;
Girish K Sb87d8db2011-09-23 20:41:47 +0530806
Girish K Sb87d8db2011-09-23 20:41:47 +0530807 switch (1 << host->ios.vdd) {
808 case MMC_VDD_165_195:
Seungwon Jeon23850492014-04-23 17:08:05 +0900809 if (host->ios.clock <= MMC_HIGH_26_MAX_DTR)
810 pwrclass_val = ext_csd->raw_pwr_cl_26_195;
811 else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR)
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200812 pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ?
Seungwon Jeon23850492014-04-23 17:08:05 +0900813 ext_csd->raw_pwr_cl_52_195 :
814 ext_csd->raw_pwr_cl_ddr_52_195;
815 else if (host->ios.clock <= MMC_HS200_MAX_DTR)
816 pwrclass_val = ext_csd->raw_pwr_cl_200_195;
Girish K Sb87d8db2011-09-23 20:41:47 +0530817 break;
Subhash Jadavani93fc5a42012-04-03 12:25:58 +0530818 case MMC_VDD_27_28:
819 case MMC_VDD_28_29:
820 case MMC_VDD_29_30:
821 case MMC_VDD_30_31:
822 case MMC_VDD_31_32:
Girish K Sb87d8db2011-09-23 20:41:47 +0530823 case MMC_VDD_32_33:
824 case MMC_VDD_33_34:
825 case MMC_VDD_34_35:
826 case MMC_VDD_35_36:
Seungwon Jeon23850492014-04-23 17:08:05 +0900827 if (host->ios.clock <= MMC_HIGH_26_MAX_DTR)
828 pwrclass_val = ext_csd->raw_pwr_cl_26_360;
829 else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR)
Fredrik Soderstedt60443712013-04-23 16:27:07 +0200830 pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ?
Seungwon Jeon23850492014-04-23 17:08:05 +0900831 ext_csd->raw_pwr_cl_52_360 :
832 ext_csd->raw_pwr_cl_ddr_52_360;
833 else if (host->ios.clock <= MMC_HS200_MAX_DTR)
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900834 pwrclass_val = (bus_width == EXT_CSD_DDR_BUS_WIDTH_8) ?
835 ext_csd->raw_pwr_cl_ddr_200_360 :
836 ext_csd->raw_pwr_cl_200_360;
Girish K Sb87d8db2011-09-23 20:41:47 +0530837 break;
838 default:
Joe Perches66061102014-09-12 14:56:56 -0700839 pr_warn("%s: Voltage range not supported for power class\n",
840 mmc_hostname(host));
Girish K Sb87d8db2011-09-23 20:41:47 +0530841 return -EINVAL;
842 }
843
Girish K Sb87d8db2011-09-23 20:41:47 +0530844 if (bus_width & (EXT_CSD_BUS_WIDTH_8 | EXT_CSD_DDR_BUS_WIDTH_8))
845 pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_8BIT_MASK) >>
846 EXT_CSD_PWR_CL_8BIT_SHIFT;
847 else
848 pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_4BIT_MASK) >>
849 EXT_CSD_PWR_CL_4BIT_SHIFT;
850
851 /* If the power class is different from the default value */
852 if (pwrclass_val > 0) {
853 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
854 EXT_CSD_POWER_CLASS,
855 pwrclass_val,
Seungwon Jeon71fe3eb2011-10-18 13:20:57 +0900856 card->ext_csd.generic_cmd6_time);
Girish K Sb87d8db2011-09-23 20:41:47 +0530857 }
858
859 return err;
860}
861
Seungwon Jeon23850492014-04-23 17:08:05 +0900862static int mmc_select_powerclass(struct mmc_card *card)
863{
864 struct mmc_host *host = card->host;
865 u32 bus_width, ext_csd_bits;
866 int err, ddr;
867
868 /* Power class selection is supported for versions >= 4.0 */
Ulf Hansson148bcab2014-10-20 11:33:53 +0200869 if (!mmc_can_ext_csd(card))
Seungwon Jeon23850492014-04-23 17:08:05 +0900870 return 0;
871
872 bus_width = host->ios.bus_width;
873 /* Power class values are defined only for 4/8 bit bus */
874 if (bus_width == MMC_BUS_WIDTH_1)
875 return 0;
876
877 ddr = card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52;
878 if (ddr)
879 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
880 EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4;
881 else
882 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
883 EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4;
884
885 err = __mmc_select_powerclass(card, ext_csd_bits);
886 if (err)
887 pr_warn("%s: power class selection to bus width %d ddr %d failed\n",
888 mmc_hostname(host), 1 << bus_width, ddr);
889
890 return err;
891}
892
Girish K Sb87d8db2011-09-23 20:41:47 +0530893/*
Seungwon Jeon577fb132014-04-23 17:08:44 +0900894 * Set the bus speed for the selected speed mode.
Girish K Sa4924c72012-01-11 14:04:52 -0500895 */
Seungwon Jeon577fb132014-04-23 17:08:44 +0900896static void mmc_set_bus_speed(struct mmc_card *card)
Girish K Sa4924c72012-01-11 14:04:52 -0500897{
Seungwon Jeon577fb132014-04-23 17:08:44 +0900898 unsigned int max_dtr = (unsigned int)-1;
899
Seungwon Jeon0a5b6432014-04-23 17:14:58 +0900900 if ((mmc_card_hs200(card) || mmc_card_hs400(card)) &&
901 max_dtr > card->ext_csd.hs200_max_dtr)
Seungwon Jeon577fb132014-04-23 17:08:44 +0900902 max_dtr = card->ext_csd.hs200_max_dtr;
903 else if (mmc_card_hs(card) && max_dtr > card->ext_csd.hs_max_dtr)
904 max_dtr = card->ext_csd.hs_max_dtr;
905 else if (max_dtr > card->csd.max_dtr)
906 max_dtr = card->csd.max_dtr;
907
908 mmc_set_clock(card->host, max_dtr);
909}
910
911/*
912 * Select the bus width amoung 4-bit and 8-bit(SDR).
913 * If the bus width is changed successfully, return the selected width value.
914 * Zero is returned instead of error value if the wide width is not supported.
915 */
916static int mmc_select_bus_width(struct mmc_card *card)
917{
Girish K Sa4924c72012-01-11 14:04:52 -0500918 static unsigned ext_csd_bits[] = {
Girish K Sa4924c72012-01-11 14:04:52 -0500919 EXT_CSD_BUS_WIDTH_8,
Seungwon Jeon577fb132014-04-23 17:08:44 +0900920 EXT_CSD_BUS_WIDTH_4,
Girish K Sa4924c72012-01-11 14:04:52 -0500921 };
922 static unsigned bus_widths[] = {
Girish K Sa4924c72012-01-11 14:04:52 -0500923 MMC_BUS_WIDTH_8,
Seungwon Jeon577fb132014-04-23 17:08:44 +0900924 MMC_BUS_WIDTH_4,
Girish K Sa4924c72012-01-11 14:04:52 -0500925 };
Seungwon Jeon577fb132014-04-23 17:08:44 +0900926 struct mmc_host *host = card->host;
927 unsigned idx, bus_width = 0;
928 int err = 0;
Girish K Sa4924c72012-01-11 14:04:52 -0500929
Ulf Hansson148bcab2014-10-20 11:33:53 +0200930 if (!mmc_can_ext_csd(card) &&
Seungwon Jeon577fb132014-04-23 17:08:44 +0900931 !(host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)))
932 return 0;
Girish K Sa4924c72012-01-11 14:04:52 -0500933
Seungwon Jeon577fb132014-04-23 17:08:44 +0900934 idx = (host->caps & MMC_CAP_8_BIT_DATA) ? 0 : 1;
Girish K Sa4924c72012-01-11 14:04:52 -0500935
936 /*
937 * Unlike SD, MMC cards dont have a configuration register to notify
938 * supported bus width. So bus test command should be run to identify
939 * the supported bus width or compare the ext csd values of current
940 * bus width and ext csd values of 1 bit mode read earlier.
941 */
Seungwon Jeon577fb132014-04-23 17:08:44 +0900942 for (; idx < ARRAY_SIZE(bus_widths); idx++) {
Girish K Sa4924c72012-01-11 14:04:52 -0500943 /*
944 * Host is capable of 8bit transfer, then switch
945 * the device to work in 8bit transfer mode. If the
946 * mmc switch command returns error then switch to
947 * 4bit transfer mode. On success set the corresponding
948 * bus width on the host.
949 */
950 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
951 EXT_CSD_BUS_WIDTH,
952 ext_csd_bits[idx],
953 card->ext_csd.generic_cmd6_time);
954 if (err)
955 continue;
956
Seungwon Jeon577fb132014-04-23 17:08:44 +0900957 bus_width = bus_widths[idx];
958 mmc_set_bus_width(host, bus_width);
Girish K Sa4924c72012-01-11 14:04:52 -0500959
Seungwon Jeon577fb132014-04-23 17:08:44 +0900960 /*
961 * If controller can't handle bus width test,
962 * compare ext_csd previously read in 1 bit mode
963 * against ext_csd at new bus width
964 */
Girish K Sa4924c72012-01-11 14:04:52 -0500965 if (!(host->caps & MMC_CAP_BUS_WIDTH_TEST))
Seungwon Jeon577fb132014-04-23 17:08:44 +0900966 err = mmc_compare_ext_csds(card, bus_width);
Girish K Sa4924c72012-01-11 14:04:52 -0500967 else
Seungwon Jeon577fb132014-04-23 17:08:44 +0900968 err = mmc_bus_test(card, bus_width);
969
970 if (!err) {
971 err = bus_width;
Girish K Sa4924c72012-01-11 14:04:52 -0500972 break;
Seungwon Jeon577fb132014-04-23 17:08:44 +0900973 } else {
974 pr_warn("%s: switch to bus width %d failed\n",
975 mmc_hostname(host), ext_csd_bits[idx]);
976 }
Girish K Sa4924c72012-01-11 14:04:52 -0500977 }
978
Seungwon Jeon577fb132014-04-23 17:08:44 +0900979 return err;
980}
981
982/*
983 * Switch to the high-speed mode
984 */
985static int mmc_select_hs(struct mmc_card *card)
986{
987 int err;
988
989 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
990 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS,
991 card->ext_csd.generic_cmd6_time,
992 true, true, true);
Girish K Sa4924c72012-01-11 14:04:52 -0500993 if (!err)
Seungwon Jeon577fb132014-04-23 17:08:44 +0900994 mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
995
996 return err;
997}
998
999/*
1000 * Activate wide bus and DDR if supported.
1001 */
1002static int mmc_select_hs_ddr(struct mmc_card *card)
1003{
1004 struct mmc_host *host = card->host;
1005 u32 bus_width, ext_csd_bits;
1006 int err = 0;
1007
1008 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52))
1009 return 0;
1010
1011 bus_width = host->ios.bus_width;
1012 if (bus_width == MMC_BUS_WIDTH_1)
1013 return 0;
1014
1015 ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
1016 EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4;
1017
1018 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1019 EXT_CSD_BUS_WIDTH,
1020 ext_csd_bits,
1021 card->ext_csd.generic_cmd6_time);
1022 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001023 pr_err("%s: switch to bus width %d ddr failed\n",
Seungwon Jeon577fb132014-04-23 17:08:44 +09001024 mmc_hostname(host), 1 << bus_width);
1025 return err;
1026 }
1027
1028 /*
1029 * eMMC cards can support 3.3V to 1.2V i/o (vccq)
1030 * signaling.
1031 *
1032 * EXT_CSD_CARD_TYPE_DDR_1_8V means 3.3V or 1.8V vccq.
1033 *
1034 * 1.8V vccq at 3.3V core voltage (vcc) is not required
1035 * in the JEDEC spec for DDR.
1036 *
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001037 * Even (e)MMC card can support 3.3v to 1.2v vccq, but not all
1038 * host controller can support this, like some of the SDHCI
1039 * controller which connect to an eMMC device. Some of these
1040 * host controller still needs to use 1.8v vccq for supporting
1041 * DDR mode.
1042 *
1043 * So the sequence will be:
1044 * if (host and device can both support 1.2v IO)
1045 * use 1.2v IO;
1046 * else if (host and device can both support 1.8v IO)
1047 * use 1.8v IO;
1048 * so if host and device can only support 3.3v IO, this is the
1049 * last choice.
Seungwon Jeon577fb132014-04-23 17:08:44 +09001050 *
1051 * WARNING: eMMC rules are NOT the same as SD DDR
1052 */
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001053 err = -EINVAL;
1054 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V)
1055 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
Seungwon Jeon577fb132014-04-23 17:08:44 +09001056
Chuanxiao.Dong312449e2014-08-15 11:28:07 +08001057 if (err && (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V))
1058 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
1059
1060 /* make sure vccq is 3.3v after switching disaster */
1061 if (err)
1062 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330);
1063
1064 if (!err)
1065 mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
Seungwon Jeon577fb132014-04-23 17:08:44 +09001066
1067 return err;
1068}
1069
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001070static int mmc_select_hs400(struct mmc_card *card)
1071{
1072 struct mmc_host *host = card->host;
1073 int err = 0;
1074
1075 /*
1076 * HS400 mode requires 8-bit bus width
1077 */
1078 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 &&
1079 host->ios.bus_width == MMC_BUS_WIDTH_8))
1080 return 0;
1081
1082 /*
1083 * Before switching to dual data rate operation for HS400,
1084 * it is required to convert from HS200 mode to HS mode.
1085 */
1086 mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
1087 mmc_set_bus_speed(card);
1088
1089 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1090 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS,
1091 card->ext_csd.generic_cmd6_time,
1092 true, true, true);
1093 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001094 pr_err("%s: switch to high-speed from hs200 failed, err:%d\n",
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001095 mmc_hostname(host), err);
1096 return err;
1097 }
1098
1099 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1100 EXT_CSD_BUS_WIDTH,
1101 EXT_CSD_DDR_BUS_WIDTH_8,
1102 card->ext_csd.generic_cmd6_time);
1103 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001104 pr_err("%s: switch to bus width for hs400 failed, err:%d\n",
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001105 mmc_hostname(host), err);
1106 return err;
1107 }
1108
1109 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1110 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS400,
1111 card->ext_csd.generic_cmd6_time,
1112 true, true, true);
1113 if (err) {
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001114 pr_err("%s: switch to hs400 failed, err:%d\n",
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001115 mmc_hostname(host), err);
1116 return err;
1117 }
1118
1119 mmc_set_timing(host, MMC_TIMING_MMC_HS400);
1120 mmc_set_bus_speed(card);
1121
1122 return 0;
1123}
1124
Seungwon Jeon577fb132014-04-23 17:08:44 +09001125/*
1126 * For device supporting HS200 mode, the following sequence
1127 * should be done before executing the tuning process.
1128 * 1. set the desired bus width(4-bit or 8-bit, 1-bit is not supported)
1129 * 2. switch to HS200 mode
1130 * 3. set the clock to > 52Mhz and <=200MHz
1131 */
1132static int mmc_select_hs200(struct mmc_card *card)
1133{
1134 struct mmc_host *host = card->host;
1135 int err = -EINVAL;
1136
1137 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V)
1138 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
1139
1140 if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_8V)
1141 err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
1142
1143 /* If fails try again during next card power cycle */
1144 if (err)
1145 goto err;
1146
1147 /*
1148 * Set the bus width(4 or 8) with host's support and
1149 * switch to HS200 mode if bus width is set successfully.
1150 */
1151 err = mmc_select_bus_width(card);
1152 if (!IS_ERR_VALUE(err)) {
Ulf Hansson4509f84772014-01-08 16:09:33 +01001153 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeon577fb132014-04-23 17:08:44 +09001154 EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200,
1155 card->ext_csd.generic_cmd6_time,
1156 true, true, true);
1157 if (!err)
1158 mmc_set_timing(host, MMC_TIMING_MMC_HS200);
1159 }
Girish K Sa4924c72012-01-11 14:04:52 -05001160err:
1161 return err;
1162}
1163
1164/*
Seungwon Jeon577fb132014-04-23 17:08:44 +09001165 * Activate High Speed or HS200 mode if supported.
1166 */
1167static int mmc_select_timing(struct mmc_card *card)
1168{
1169 int err = 0;
1170
Ulf Hansson148bcab2014-10-20 11:33:53 +02001171 if (!mmc_can_ext_csd(card))
Seungwon Jeon577fb132014-04-23 17:08:44 +09001172 goto bus_speed;
1173
1174 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200)
1175 err = mmc_select_hs200(card);
1176 else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS)
1177 err = mmc_select_hs(card);
1178
1179 if (err && err != -EBADMSG)
1180 return err;
1181
1182 if (err) {
1183 pr_warn("%s: switch to %s failed\n",
1184 mmc_card_hs(card) ? "high-speed" :
1185 (mmc_card_hs200(card) ? "hs200" : ""),
1186 mmc_hostname(card->host));
1187 err = 0;
1188 }
1189
1190bus_speed:
1191 /*
1192 * Set the bus speed to the selected bus timing.
1193 * If timing is not selected, backward compatible is the default.
1194 */
1195 mmc_set_bus_speed(card);
1196 return err;
1197}
1198
Stephen Boyd48d11e062014-09-22 12:26:10 -07001199const u8 tuning_blk_pattern_4bit[MMC_TUNING_BLK_PATTERN_4BIT_SIZE] = {
1200 0xff, 0x0f, 0xff, 0x00, 0xff, 0xcc, 0xc3, 0xcc,
1201 0xc3, 0x3c, 0xcc, 0xff, 0xfe, 0xff, 0xfe, 0xef,
1202 0xff, 0xdf, 0xff, 0xdd, 0xff, 0xfb, 0xff, 0xfb,
1203 0xbf, 0xff, 0x7f, 0xff, 0x77, 0xf7, 0xbd, 0xef,
1204 0xff, 0xf0, 0xff, 0xf0, 0x0f, 0xfc, 0xcc, 0x3c,
1205 0xcc, 0x33, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xee,
1206 0xff, 0xfd, 0xff, 0xfd, 0xdf, 0xff, 0xbf, 0xff,
1207 0xbb, 0xff, 0xf7, 0xff, 0xf7, 0x7f, 0x7b, 0xde,
1208};
1209EXPORT_SYMBOL(tuning_blk_pattern_4bit);
1210
1211const u8 tuning_blk_pattern_8bit[MMC_TUNING_BLK_PATTERN_8BIT_SIZE] = {
1212 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
1213 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc, 0xcc,
1214 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff, 0xff,
1215 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee, 0xff,
1216 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd, 0xdd,
1217 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xbb,
1218 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff,
1219 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee, 0xff,
1220 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00,
1221 0x00, 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc,
1222 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff,
1223 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee,
1224 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd,
1225 0xdd, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff,
1226 0xbb, 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff,
1227 0xff, 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee,
1228};
1229EXPORT_SYMBOL(tuning_blk_pattern_8bit);
1230
Seungwon Jeon577fb132014-04-23 17:08:44 +09001231/*
1232 * Execute tuning sequence to seek the proper bus operating
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001233 * conditions for HS200 and HS400, which sends CMD21 to the device.
Seungwon Jeon577fb132014-04-23 17:08:44 +09001234 */
1235static int mmc_hs200_tuning(struct mmc_card *card)
1236{
1237 struct mmc_host *host = card->host;
1238 int err = 0;
1239
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001240 /*
1241 * Timing should be adjusted to the HS400 target
1242 * operation frequency for tuning process
1243 */
1244 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 &&
1245 host->ios.bus_width == MMC_BUS_WIDTH_8)
1246 if (host->ops->prepare_hs400_tuning)
1247 host->ops->prepare_hs400_tuning(host, &host->ios);
1248
Seungwon Jeon577fb132014-04-23 17:08:44 +09001249 if (host->ops->execute_tuning) {
1250 mmc_host_clk_hold(host);
1251 err = host->ops->execute_tuning(host,
1252 MMC_SEND_TUNING_BLOCK_HS200);
1253 mmc_host_clk_release(host);
1254
1255 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001256 pr_err("%s: tuning execution failed\n",
Seungwon Jeon577fb132014-04-23 17:08:44 +09001257 mmc_hostname(host));
1258 }
1259
1260 return err;
1261}
1262
1263/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001264 * Handle the detection and initialisation of a card.
1265 *
Deepak Saxena87693922008-06-16 19:20:57 -07001266 * In the case of a resume, "oldcard" will contain the card
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001267 * we're trying to reinitialise.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001268 */
Pierre Ossman8c75dea2007-05-19 16:14:43 +02001269static int mmc_init_card(struct mmc_host *host, u32 ocr,
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001270 struct mmc_card *oldcard)
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001271{
1272 struct mmc_card *card;
Seungwon Jeon577fb132014-04-23 17:08:44 +09001273 int err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001274 u32 cid[4];
Philip Rakityb676f032011-02-13 23:13:09 -08001275 u32 rocr;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001276
1277 BUG_ON(!host);
Pierre Ossmand84075c82007-08-09 13:23:56 +02001278 WARN_ON(!host->claimed);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001279
Stefan Nilsson XK44669032011-09-15 17:50:38 +02001280 /* Set correct bus mode for MMC before attempting init */
1281 if (!mmc_host_is_spi(host))
1282 mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);
1283
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001284 /*
1285 * Since we're changing the OCR value, we seem to
1286 * need to tell some cards to go back to the idle
1287 * state. We wait 1ms to give cards time to
1288 * respond.
Balaji T Kc3805462011-09-08 22:08:39 +05301289 * mmc_go_idle is needed for eMMC that are asleep
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001290 */
1291 mmc_go_idle(host);
1292
1293 /* The extra bit indicates that we support high capacity */
Philip Rakityb676f032011-02-13 23:13:09 -08001294 err = mmc_send_op_cond(host, ocr | (1 << 30), &rocr);
Pierre Ossman17b04292007-07-22 22:18:46 +02001295 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001296 goto err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001297
1298 /*
David Brownellaf517152007-08-08 09:11:32 -07001299 * For SPI, enable CRC as appropriate.
1300 */
1301 if (mmc_host_is_spi(host)) {
1302 err = mmc_spi_set_crc(host, use_spi_crc);
1303 if (err)
1304 goto err;
1305 }
1306
1307 /*
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001308 * Fetch CID from card.
1309 */
David Brownellaf517152007-08-08 09:11:32 -07001310 if (mmc_host_is_spi(host))
1311 err = mmc_send_cid(host, cid);
1312 else
1313 err = mmc_all_send_cid(host, cid);
Pierre Ossman17b04292007-07-22 22:18:46 +02001314 if (err)
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001315 goto err;
1316
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001317 if (oldcard) {
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001318 if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) {
1319 err = -ENOENT;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001320 goto err;
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001321 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001322
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001323 card = oldcard;
1324 } else {
1325 /*
1326 * Allocate card structure.
1327 */
Pierre Ossman51ec92e2008-03-21 23:54:50 +01001328 card = mmc_alloc_card(host, &mmc_type);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001329 if (IS_ERR(card)) {
1330 err = PTR_ERR(card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001331 goto err;
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001332 }
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001333
Ulf Hansson69041152013-09-13 11:31:33 +02001334 card->ocr = ocr;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001335 card->type = MMC_TYPE_MMC;
1336 card->rca = 1;
1337 memcpy(card->raw_cid, cid, sizeof(card->raw_cid));
1338 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001339
1340 /*
David Brownellaf517152007-08-08 09:11:32 -07001341 * For native busses: set card RCA and quit open drain mode.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001342 */
David Brownellaf517152007-08-08 09:11:32 -07001343 if (!mmc_host_is_spi(host)) {
1344 err = mmc_set_relative_addr(card);
1345 if (err)
1346 goto free_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001347
David Brownellaf517152007-08-08 09:11:32 -07001348 mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);
1349 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001350
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001351 if (!oldcard) {
1352 /*
1353 * Fetch CSD from card.
1354 */
1355 err = mmc_send_csd(card, card->raw_csd);
Pierre Ossman17b04292007-07-22 22:18:46 +02001356 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001357 goto free_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001358
Pierre Ossmanbd766312007-05-01 16:11:57 +02001359 err = mmc_decode_csd(card);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001360 if (err)
Pierre Ossmanbd766312007-05-01 16:11:57 +02001361 goto free_card;
1362 err = mmc_decode_cid(card);
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001363 if (err)
Pierre Ossmanbd766312007-05-01 16:11:57 +02001364 goto free_card;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001365 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001366
1367 /*
Sascha Hauer3d705d12014-08-19 10:45:51 +02001368 * handling only for cards supporting DSR and hosts requesting
1369 * DSR configuration
1370 */
1371 if (card->csd.dsr_imp && host->dsr_req)
1372 mmc_set_dsr(host);
1373
1374 /*
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001375 * Select card, as all following commands rely on that.
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001376 */
David Brownellaf517152007-08-08 09:11:32 -07001377 if (!mmc_host_is_spi(host)) {
1378 err = mmc_select_card(card);
1379 if (err)
1380 goto free_card;
1381 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001382
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001383 if (!oldcard) {
Ulf Hansson076ec382014-10-20 13:37:24 +02001384 /* Read extended CSD. */
1385 err = mmc_read_ext_csd(card);
Pierre Ossman17b04292007-07-22 22:18:46 +02001386 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001387 goto free_card;
Philip Rakityb676f032011-02-13 23:13:09 -08001388
1389 /* If doing byte addressing, check if required to do sector
1390 * addressing. Handle the case of <2GB cards needing sector
1391 * addressing. See section 8.1 JEDEC Standard JED84-A441;
1392 * ocr register has bit 30 set for sector addressing.
1393 */
1394 if (!(mmc_card_blockaddr(card)) && (rocr & (1<<30)))
1395 mmc_card_set_blockaddr(card);
1396
Adrian Hunterdfe86cb2010-08-11 14:17:46 -07001397 /* Erase size depends on CSD and Extended CSD */
1398 mmc_set_erase_size(card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001399 }
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001400
1401 /*
Chuanxiao Dong709de992011-01-22 04:09:41 +08001402 * If enhanced_area_en is TRUE, host needs to enable ERASE_GRP_DEF
Lucas De Marchi25985ed2011-03-30 22:57:33 -03001403 * bit. This bit will be lost every time after a reset or power off.
Chuanxiao Dong709de992011-01-22 04:09:41 +08001404 */
Grégory Soutadé69803d42014-09-15 17:47:09 +02001405 if (card->ext_csd.partition_setting_completed ||
Adrian Hunter83bb24a2012-03-13 05:19:13 -04001406 (card->ext_csd.rev >= 3 && (host->caps2 & MMC_CAP2_HC_ERASE_SZ))) {
Chuanxiao Dong709de992011-01-22 04:09:41 +08001407 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeonb23cf0b2011-09-23 14:15:29 +09001408 EXT_CSD_ERASE_GROUP_DEF, 1,
1409 card->ext_csd.generic_cmd6_time);
Chuanxiao Dong709de992011-01-22 04:09:41 +08001410
1411 if (err && err != -EBADMSG)
1412 goto free_card;
1413
1414 if (err) {
1415 err = 0;
1416 /*
1417 * Just disable enhanced area off & sz
1418 * will try to enable ERASE_GROUP_DEF
1419 * during next time reinit
1420 */
1421 card->ext_csd.enhanced_area_offset = -EINVAL;
1422 card->ext_csd.enhanced_area_size = -EINVAL;
1423 } else {
1424 card->ext_csd.erase_group_def = 1;
1425 /*
1426 * enable ERASE_GRP_DEF successfully.
1427 * This will affect the erase size, so
1428 * here need to reset erase size
1429 */
1430 mmc_set_erase_size(card);
1431 }
1432 }
1433
1434 /*
Philip Rakity41e2a482011-03-19 14:10:33 -04001435 * Ensure eMMC user default partition is enabled
1436 */
Andrei Warkentin371a6892011-04-11 18:10:25 -05001437 if (card->ext_csd.part_config & EXT_CSD_PART_CONFIG_ACC_MASK) {
1438 card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK;
1439 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG,
1440 card->ext_csd.part_config,
1441 card->ext_csd.part_time);
1442 if (err && err != -EBADMSG)
1443 goto free_card;
Philip Rakity41e2a482011-03-19 14:10:33 -04001444 }
1445
1446 /*
Ulf Hansson432356792013-06-10 17:03:45 +02001447 * Enable power_off_notification byte in the ext_csd register
Girish K Sbec87262011-10-13 12:04:16 +05301448 */
Ulf Hansson432356792013-06-10 17:03:45 +02001449 if (card->ext_csd.rev >= 6) {
Girish K Sbec87262011-10-13 12:04:16 +05301450 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1451 EXT_CSD_POWER_OFF_NOTIFICATION,
1452 EXT_CSD_POWER_ON,
1453 card->ext_csd.generic_cmd6_time);
1454 if (err && err != -EBADMSG)
1455 goto free_card;
Girish K Sbec87262011-10-13 12:04:16 +05301456
Girish K S96a85d52011-11-04 16:22:47 +05301457 /*
1458 * The err can be -EBADMSG or 0,
1459 * so check for success and update the flag
1460 */
1461 if (!err)
Ulf Hanssone6c08582012-10-05 12:45:39 -04001462 card->ext_csd.power_off_notification = EXT_CSD_POWER_ON;
Girish K S96a85d52011-11-04 16:22:47 +05301463 }
Girish K Sbec87262011-10-13 12:04:16 +05301464
1465 /*
Seungwon Jeon577fb132014-04-23 17:08:44 +09001466 * Select timing interface
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001467 */
Seungwon Jeon577fb132014-04-23 17:08:44 +09001468 err = mmc_select_timing(card);
1469 if (err)
1470 goto free_card;
Girish K Sa4924c72012-01-11 14:04:52 -05001471
Girish K Sa4924c72012-01-11 14:04:52 -05001472 if (mmc_card_hs200(card)) {
Seungwon Jeon577fb132014-04-23 17:08:44 +09001473 err = mmc_hs200_tuning(card);
1474 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001475 goto free_card;
Seungwon Jeon0a5b6432014-04-23 17:14:58 +09001476
1477 err = mmc_select_hs400(card);
1478 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001479 goto free_card;
Seungwon Jeon577fb132014-04-23 17:08:44 +09001480 } else if (mmc_card_hs(card)) {
1481 /* Select the desired bus width optionally */
1482 err = mmc_select_bus_width(card);
1483 if (!IS_ERR_VALUE(err)) {
1484 err = mmc_select_hs_ddr(card);
1485 if (err)
Andrew Gabbasov4b75bff2014-10-01 07:14:11 -05001486 goto free_card;
Adrian Hunteref0b27d2009-09-22 16:44:37 -07001487 }
Pierre Ossman89a73cf2007-05-01 15:08:30 +02001488 }
1489
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001490 /*
Seungwon Jeon23850492014-04-23 17:08:05 +09001491 * Choose the power class with selected bus interface
1492 */
1493 mmc_select_powerclass(card);
1494
1495 /*
Subhash Jadavani52d09742012-03-06 17:59:12 +05301496 * Enable HPI feature (if supported)
1497 */
1498 if (card->ext_csd.hpi) {
1499 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1500 EXT_CSD_HPI_MGMT, 1,
1501 card->ext_csd.generic_cmd6_time);
1502 if (err && err != -EBADMSG)
1503 goto free_card;
1504 if (err) {
Joe Perches66061102014-09-12 14:56:56 -07001505 pr_warn("%s: Enabling HPI failed\n",
1506 mmc_hostname(card->host));
Subhash Jadavani52d09742012-03-06 17:59:12 +05301507 err = 0;
1508 } else
1509 card->ext_csd.hpi_en = 1;
1510 }
1511
1512 /*
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001513 * If cache size is higher than 0, this indicates
1514 * the existence of cache and it can be turned on.
1515 */
Ulf Hansson7536d3f2013-12-18 11:59:17 +01001516 if (card->ext_csd.cache_size > 0) {
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001517 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001518 EXT_CSD_CACHE_CTRL, 1,
1519 card->ext_csd.generic_cmd6_time);
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001520 if (err && err != -EBADMSG)
1521 goto free_card;
1522
1523 /*
1524 * Only if no error, cache is turned on successfully.
1525 */
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001526 if (err) {
Joe Perches66061102014-09-12 14:56:56 -07001527 pr_warn("%s: Cache is supported, but failed to turn on (%d)\n",
1528 mmc_hostname(card->host), err);
Seungwon Jeon8bc06782011-12-09 17:47:17 +09001529 card->ext_csd.cache_ctrl = 0;
1530 err = 0;
1531 } else {
1532 card->ext_csd.cache_ctrl = 1;
1533 }
Seungwon Jeon881d1c22011-10-14 14:03:21 +09001534 }
1535
Seungwon Jeonabd9ac12013-02-06 17:01:43 +09001536 /*
1537 * The mandatory minimum values are defined for packed command.
1538 * read: 5, write: 3
1539 */
1540 if (card->ext_csd.max_packed_writes >= 3 &&
1541 card->ext_csd.max_packed_reads >= 5 &&
1542 host->caps2 & MMC_CAP2_PACKED_CMD) {
1543 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1544 EXT_CSD_EXP_EVENTS_CTRL,
1545 EXT_CSD_PACKED_EVENT_EN,
1546 card->ext_csd.generic_cmd6_time);
1547 if (err && err != -EBADMSG)
1548 goto free_card;
1549 if (err) {
1550 pr_warn("%s: Enabling packed event failed\n",
1551 mmc_hostname(card->host));
1552 card->ext_csd.packed_event_en = 0;
1553 err = 0;
1554 } else {
1555 card->ext_csd.packed_event_en = 1;
1556 }
1557 }
1558
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001559 if (!oldcard)
1560 host->card = card;
1561
Pierre Ossman17b04292007-07-22 22:18:46 +02001562 return 0;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001563
1564free_card:
1565 if (!oldcard)
1566 mmc_remove_card(card);
1567err:
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001568 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001569}
1570
Ulf Hansson07a68212013-04-19 15:12:11 +02001571static int mmc_can_sleep(struct mmc_card *card)
1572{
1573 return (card && card->ext_csd.rev >= 3);
1574}
1575
1576static int mmc_sleep(struct mmc_host *host)
1577{
1578 struct mmc_command cmd = {0};
1579 struct mmc_card *card = host->card;
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001580 unsigned int timeout_ms = DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000);
Ulf Hansson07a68212013-04-19 15:12:11 +02001581 int err;
1582
Ulf Hansson07a68212013-04-19 15:12:11 +02001583 err = mmc_deselect_cards(host);
1584 if (err)
1585 return err;
1586
1587 cmd.opcode = MMC_SLEEP_AWAKE;
1588 cmd.arg = card->rca << 16;
1589 cmd.arg |= 1 << 15;
1590
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001591 /*
1592 * If the max_busy_timeout of the host is specified, validate it against
1593 * the sleep cmd timeout. A failure means we need to prevent the host
1594 * from doing hw busy detection, which is done by converting to a R1
1595 * response instead of a R1B.
1596 */
1597 if (host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) {
1598 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
1599 } else {
1600 cmd.flags = MMC_RSP_R1B | MMC_CMD_AC;
1601 cmd.busy_timeout = timeout_ms;
1602 }
1603
Ulf Hansson07a68212013-04-19 15:12:11 +02001604 err = mmc_wait_for_cmd(host, &cmd, 0);
1605 if (err)
1606 return err;
1607
1608 /*
1609 * If the host does not wait while the card signals busy, then we will
1610 * will have to wait the sleep/awake timeout. Note, we cannot use the
1611 * SEND_STATUS command to poll the status because that command (and most
1612 * others) is invalid while the card sleeps.
1613 */
Ulf Hanssoncb962e02014-01-14 23:17:36 +01001614 if (!cmd.busy_timeout || !(host->caps & MMC_CAP_WAIT_WHILE_BUSY))
1615 mmc_delay(timeout_ms);
Ulf Hansson07a68212013-04-19 15:12:11 +02001616
1617 return err;
1618}
1619
Ulf Hanssone6c08582012-10-05 12:45:39 -04001620static int mmc_can_poweroff_notify(const struct mmc_card *card)
1621{
1622 return card &&
1623 mmc_card_mmc(card) &&
1624 (card->ext_csd.power_off_notification == EXT_CSD_POWER_ON);
1625}
1626
1627static int mmc_poweroff_notify(struct mmc_card *card, unsigned int notify_type)
1628{
1629 unsigned int timeout = card->ext_csd.generic_cmd6_time;
1630 int err;
1631
1632 /* Use EXT_CSD_POWER_OFF_SHORT as default notification type. */
1633 if (notify_type == EXT_CSD_POWER_OFF_LONG)
1634 timeout = card->ext_csd.power_off_longtime;
1635
Ulf Hansson878e2002013-09-09 11:57:57 +02001636 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
1637 EXT_CSD_POWER_OFF_NOTIFICATION,
Ulf Hansson4509f84772014-01-08 16:09:33 +01001638 notify_type, timeout, true, false, false);
Ulf Hanssone6c08582012-10-05 12:45:39 -04001639 if (err)
1640 pr_err("%s: Power Off Notification timed out, %u\n",
1641 mmc_hostname(card->host), timeout);
1642
1643 /* Disable the power off notification after the switch operation. */
1644 card->ext_csd.power_off_notification = EXT_CSD_NO_POWER_NOTIFICATION;
1645
1646 return err;
1647}
1648
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001649/*
1650 * Host is being removed. Free up the current card.
1651 */
1652static void mmc_remove(struct mmc_host *host)
1653{
1654 BUG_ON(!host);
1655 BUG_ON(!host->card);
1656
1657 mmc_remove_card(host->card);
1658 host->card = NULL;
1659}
1660
1661/*
Adrian Hunterd3049502011-11-28 16:22:00 +02001662 * Card detection - card is alive.
1663 */
1664static int mmc_alive(struct mmc_host *host)
1665{
1666 return mmc_send_status(host->card, NULL);
1667}
1668
1669/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001670 * Card detection callback from host.
1671 */
1672static void mmc_detect(struct mmc_host *host)
1673{
1674 int err;
1675
1676 BUG_ON(!host);
1677 BUG_ON(!host->card);
1678
Ulf Hanssone94cfef2013-05-02 14:02:38 +02001679 mmc_get_card(host->card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001680
1681 /*
1682 * Just check if our card has been removed.
1683 */
Adrian Hunterd3049502011-11-28 16:22:00 +02001684 err = _mmc_detect_card_removed(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001685
Ulf Hanssone94cfef2013-05-02 14:02:38 +02001686 mmc_put_card(host->card);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001687
Pierre Ossman17b04292007-07-22 22:18:46 +02001688 if (err) {
Pierre Ossman4101c162007-05-19 13:39:01 +02001689 mmc_remove(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001690
1691 mmc_claim_host(host);
1692 mmc_detach_bus(host);
Ulf Hansson7f7e4122011-09-21 14:08:13 -04001693 mmc_power_off(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001694 mmc_release_host(host);
1695 }
1696}
1697
Ulf Hansson03d071f2013-06-10 17:03:43 +02001698static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001699{
Balaji T Kc3805462011-09-08 22:08:39 +05301700 int err = 0;
Ulf Hansson03d071f2013-06-10 17:03:43 +02001701 unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
1702 EXT_CSD_POWER_OFF_LONG;
Balaji T Kc3805462011-09-08 22:08:39 +05301703
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001704 BUG_ON(!host);
1705 BUG_ON(!host->card);
1706
1707 mmc_claim_host(host);
Maya Erez881d9262013-01-28 16:44:22 -05001708
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001709 if (mmc_card_suspended(host->card))
1710 goto out;
1711
Ulf Hansson39b94312013-05-02 14:02:36 +02001712 if (mmc_card_doing_bkops(host->card)) {
1713 err = mmc_stop_bkops(host->card);
1714 if (err)
1715 goto out;
1716 }
1717
Ulf Hansson10e5d962013-12-16 16:23:22 +01001718 err = mmc_flush_cache(host->card);
Maya Erez881d9262013-01-28 16:44:22 -05001719 if (err)
1720 goto out;
1721
Ulf Hansson432356792013-06-10 17:03:45 +02001722 if (mmc_can_poweroff_notify(host->card) &&
Ulf Hansson53275c22013-06-10 17:03:46 +02001723 ((host->caps2 & MMC_CAP2_FULL_PWR_CYCLE) || !is_suspend))
Ulf Hansson03d071f2013-06-10 17:03:43 +02001724 err = mmc_poweroff_notify(host->card, notify_type);
Ulf Hansson07a68212013-04-19 15:12:11 +02001725 else if (mmc_can_sleep(host->card))
1726 err = mmc_sleep(host);
Ulf Hanssone6c08582012-10-05 12:45:39 -04001727 else if (!mmc_host_is_spi(host))
Jaehoon Chung85e727e2012-05-31 20:31:47 +09001728 err = mmc_deselect_cards(host);
Nicolas Pitre95cdfb72009-09-22 16:45:29 -07001729
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001730 if (!err) {
Ulf Hansson74590262013-06-10 17:03:38 +02001731 mmc_power_off(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001732 mmc_card_set_suspended(host->card);
1733 }
Maya Erez881d9262013-01-28 16:44:22 -05001734out:
1735 mmc_release_host(host);
Balaji T Kc3805462011-09-08 22:08:39 +05301736 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001737}
1738
1739/*
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001740 * Suspend callback
Ulf Hansson03d071f2013-06-10 17:03:43 +02001741 */
1742static int mmc_suspend(struct mmc_host *host)
1743{
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001744 int err;
1745
1746 err = _mmc_suspend(host, true);
1747 if (!err) {
1748 pm_runtime_disable(&host->card->dev);
1749 pm_runtime_set_suspended(&host->card->dev);
1750 }
1751
1752 return err;
Ulf Hansson03d071f2013-06-10 17:03:43 +02001753}
1754
1755/*
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001756 * This function tries to determine if the same card is still present
1757 * and, if so, restore all state to it.
1758 */
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001759static int _mmc_resume(struct mmc_host *host)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001760{
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001761 int err = 0;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001762
1763 BUG_ON(!host);
1764 BUG_ON(!host->card);
1765
1766 mmc_claim_host(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001767
1768 if (!mmc_card_suspended(host->card))
1769 goto out;
1770
Ulf Hansson69041152013-09-13 11:31:33 +02001771 mmc_power_up(host, host->card->ocr);
Ulf Hansson69041152013-09-13 11:31:33 +02001772 err = mmc_init_card(host, host->card->ocr, host->card);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001773 mmc_card_clr_suspended(host->card);
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001774
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001775out:
1776 mmc_release_host(host);
Nicolas Pitre95cdfb72009-09-22 16:45:29 -07001777 return err;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001778}
1779
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001780/*
1781 * Shutdown callback
1782 */
1783static int mmc_shutdown(struct mmc_host *host)
1784{
1785 int err = 0;
1786
1787 /*
1788 * In a specific case for poweroff notify, we need to resume the card
1789 * before we can shutdown it properly.
1790 */
1791 if (mmc_can_poweroff_notify(host->card) &&
1792 !(host->caps2 & MMC_CAP2_FULL_PWR_CYCLE))
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001793 err = _mmc_resume(host);
Ulf Hansson9ec775f2013-10-02 17:37:09 +02001794
1795 if (!err)
1796 err = _mmc_suspend(host, false);
1797
1798 return err;
1799}
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001800
1801/*
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001802 * Callback for resume.
1803 */
1804static int mmc_resume(struct mmc_host *host)
1805{
Ulf Hansson4d223782013-10-10 17:22:23 +02001806 int err = 0;
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001807
Ulf Hansson4d223782013-10-10 17:22:23 +02001808 if (!(host->caps & MMC_CAP_RUNTIME_RESUME)) {
1809 err = _mmc_resume(host);
1810 pm_runtime_set_active(&host->card->dev);
1811 pm_runtime_mark_last_busy(&host->card->dev);
1812 }
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001813 pm_runtime_enable(&host->card->dev);
1814
1815 return err;
1816}
1817
1818/*
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001819 * Callback for runtime_suspend.
1820 */
1821static int mmc_runtime_suspend(struct mmc_host *host)
1822{
1823 int err;
1824
1825 if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
1826 return 0;
1827
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001828 err = _mmc_suspend(host, true);
Ulf Hansson0cc81a82013-10-03 11:24:44 +02001829 if (err)
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001830 pr_err("%s: error %d doing aggessive suspend\n",
1831 mmc_hostname(host), err);
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001832
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001833 return err;
1834}
1835
1836/*
1837 * Callback for runtime_resume.
1838 */
1839static int mmc_runtime_resume(struct mmc_host *host)
1840{
1841 int err;
1842
Ulf Hansson4d223782013-10-10 17:22:23 +02001843 if (!(host->caps & (MMC_CAP_AGGRESSIVE_PM | MMC_CAP_RUNTIME_RESUME)))
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001844 return 0;
1845
Ulf Hansson0cb403a2013-10-10 14:20:05 +02001846 err = _mmc_resume(host);
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001847 if (err)
1848 pr_err("%s: error %d doing aggessive resume\n",
1849 mmc_hostname(host), err);
1850
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001851 return 0;
1852}
1853
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001854static int mmc_power_restore(struct mmc_host *host)
Adrian Huntereae1aee2009-09-22 16:44:33 -07001855{
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001856 int ret;
1857
Adrian Huntereae1aee2009-09-22 16:44:33 -07001858 mmc_claim_host(host);
Ulf Hansson69041152013-09-13 11:31:33 +02001859 ret = mmc_init_card(host, host->card->ocr, host->card);
Adrian Huntereae1aee2009-09-22 16:44:33 -07001860 mmc_release_host(host);
Ohad Ben-Cohen12ae6372010-10-02 13:54:06 +02001861
1862 return ret;
Adrian Huntereae1aee2009-09-22 16:44:33 -07001863}
1864
Adrian Hunter9feae242009-09-22 16:44:32 -07001865static const struct mmc_bus_ops mmc_ops = {
1866 .remove = mmc_remove,
1867 .detect = mmc_detect,
Adrian Hunter9feae242009-09-22 16:44:32 -07001868 .suspend = mmc_suspend,
1869 .resume = mmc_resume,
Ulf Hanssonc4d770d2013-05-02 14:02:39 +02001870 .runtime_suspend = mmc_runtime_suspend,
1871 .runtime_resume = mmc_runtime_resume,
Adrian Huntereae1aee2009-09-22 16:44:33 -07001872 .power_restore = mmc_power_restore,
Adrian Hunterd3049502011-11-28 16:22:00 +02001873 .alive = mmc_alive,
Ulf Hansson486fdbb2013-06-10 17:03:44 +02001874 .shutdown = mmc_shutdown,
Adrian Hunter9feae242009-09-22 16:44:32 -07001875};
1876
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001877/*
1878 * Starting point for MMC card init.
1879 */
Andy Ross807e8e42011-01-03 10:36:56 -08001880int mmc_attach_mmc(struct mmc_host *host)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001881{
1882 int err;
Ulf Hansson69041152013-09-13 11:31:33 +02001883 u32 ocr, rocr;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001884
1885 BUG_ON(!host);
Pierre Ossmand84075c82007-08-09 13:23:56 +02001886 WARN_ON(!host->claimed);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001887
Stefan Nilsson XK44669032011-09-15 17:50:38 +02001888 /* Set correct bus mode for MMC before attempting attach */
1889 if (!mmc_host_is_spi(host))
1890 mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);
1891
Andy Ross807e8e42011-01-03 10:36:56 -08001892 err = mmc_send_op_cond(host, 0, &ocr);
1893 if (err)
1894 return err;
1895
Ulf Hansson2501c912013-10-30 01:00:18 +01001896 mmc_attach_bus(host, &mmc_ops);
Takashi Iwai8f230f42010-12-08 10:04:30 +01001897 if (host->ocr_avail_mmc)
1898 host->ocr_avail = host->ocr_avail_mmc;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001899
1900 /*
David Brownellaf517152007-08-08 09:11:32 -07001901 * We need to get OCR a different way for SPI.
1902 */
1903 if (mmc_host_is_spi(host)) {
1904 err = mmc_spi_read_ocr(host, 1, &ocr);
1905 if (err)
1906 goto err;
1907 }
1908
Ulf Hansson69041152013-09-13 11:31:33 +02001909 rocr = mmc_select_voltage(host, ocr);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001910
1911 /*
1912 * Can we support the voltage of the card?
1913 */
Ulf Hansson69041152013-09-13 11:31:33 +02001914 if (!rocr) {
Pierre Ossman109b5be2007-07-23 00:12:10 +02001915 err = -EINVAL;
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001916 goto err;
Pierre Ossman109b5be2007-07-23 00:12:10 +02001917 }
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001918
1919 /*
1920 * Detect and init the card.
1921 */
Ulf Hansson69041152013-09-13 11:31:33 +02001922 err = mmc_init_card(host, rocr, NULL);
Pierre Ossman17b04292007-07-22 22:18:46 +02001923 if (err)
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001924 goto err;
1925
1926 mmc_release_host(host);
Pierre Ossman4101c162007-05-19 13:39:01 +02001927 err = mmc_add_card(host->card);
Andy Ross807e8e42011-01-03 10:36:56 -08001928 mmc_claim_host(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001929 if (err)
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001930 goto remove_card;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001931
1932 return 0;
1933
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001934remove_card:
Andy Ross807e8e42011-01-03 10:36:56 -08001935 mmc_release_host(host);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +02001936 mmc_remove_card(host->card);
Pierre Ossman2986d0b2007-07-22 17:52:06 +02001937 mmc_claim_host(host);
Andy Ross807e8e42011-01-03 10:36:56 -08001938 host->card = NULL;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001939err:
1940 mmc_detach_bus(host);
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001941
Girish K Sa3c76eb2011-10-11 11:44:09 +05301942 pr_err("%s: error %d whilst initialising MMC card\n",
Pierre Ossman109b5be2007-07-23 00:12:10 +02001943 mmc_hostname(host), err);
1944
Pierre Ossmanadf66a02007-07-22 23:08:30 +02001945 return err;
Pierre Ossman7ea239d2006-12-31 00:11:32 +01001946}