162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/drivers/mmc/core/sd.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2003-2004 Russell King, All Rights Reserved. 662306a36Sopenharmony_ci * SD support Copyright (C) 2004 Ian Molton, All Rights Reserved. 762306a36Sopenharmony_ci * Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved. 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/err.h> 1162306a36Sopenharmony_ci#include <linux/sizes.h> 1262306a36Sopenharmony_ci#include <linux/slab.h> 1362306a36Sopenharmony_ci#include <linux/stat.h> 1462306a36Sopenharmony_ci#include <linux/pm_runtime.h> 1562306a36Sopenharmony_ci#include <linux/random.h> 1662306a36Sopenharmony_ci#include <linux/scatterlist.h> 1762306a36Sopenharmony_ci#include <linux/sysfs.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include <linux/mmc/host.h> 2062306a36Sopenharmony_ci#include <linux/mmc/card.h> 2162306a36Sopenharmony_ci#include <linux/mmc/mmc.h> 2262306a36Sopenharmony_ci#include <linux/mmc/sd.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#include "core.h" 2562306a36Sopenharmony_ci#include "card.h" 2662306a36Sopenharmony_ci#include "host.h" 2762306a36Sopenharmony_ci#include "bus.h" 2862306a36Sopenharmony_ci#include "mmc_ops.h" 2962306a36Sopenharmony_ci#include "sd.h" 3062306a36Sopenharmony_ci#include "sd_ops.h" 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic const unsigned int tran_exp[] = { 3362306a36Sopenharmony_ci 10000, 100000, 1000000, 10000000, 3462306a36Sopenharmony_ci 0, 0, 0, 0 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic const unsigned char tran_mant[] = { 3862306a36Sopenharmony_ci 0, 10, 12, 13, 15, 20, 25, 30, 3962306a36Sopenharmony_ci 35, 40, 45, 50, 55, 60, 70, 80, 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic const unsigned int taac_exp[] = { 4362306a36Sopenharmony_ci 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic const unsigned int taac_mant[] = { 4762306a36Sopenharmony_ci 0, 10, 12, 13, 15, 20, 25, 30, 4862306a36Sopenharmony_ci 35, 40, 45, 50, 55, 60, 70, 80, 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic const unsigned int sd_au_size[] = { 5262306a36Sopenharmony_ci 0, SZ_16K / 512, SZ_32K / 512, SZ_64K / 512, 5362306a36Sopenharmony_ci SZ_128K / 512, SZ_256K / 512, SZ_512K / 512, SZ_1M / 512, 5462306a36Sopenharmony_ci SZ_2M / 512, SZ_4M / 512, SZ_8M / 512, (SZ_8M + SZ_4M) / 512, 5562306a36Sopenharmony_ci SZ_16M / 512, (SZ_16M + SZ_8M) / 512, SZ_32M / 512, SZ_64M / 512, 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define UNSTUFF_BITS(resp,start,size) \ 5962306a36Sopenharmony_ci ({ \ 6062306a36Sopenharmony_ci const int __size = size; \ 6162306a36Sopenharmony_ci const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \ 6262306a36Sopenharmony_ci const int __off = 3 - ((start) / 32); \ 6362306a36Sopenharmony_ci const int __shft = (start) & 31; \ 6462306a36Sopenharmony_ci u32 __res; \ 6562306a36Sopenharmony_ci \ 6662306a36Sopenharmony_ci __res = resp[__off] >> __shft; \ 6762306a36Sopenharmony_ci if (__size + __shft > 32) \ 6862306a36Sopenharmony_ci __res |= resp[__off-1] << ((32 - __shft) % 32); \ 6962306a36Sopenharmony_ci __res & __mask; \ 7062306a36Sopenharmony_ci }) 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define SD_POWEROFF_NOTIFY_TIMEOUT_MS 1000 7362306a36Sopenharmony_ci#define SD_WRITE_EXTR_SINGLE_TIMEOUT_MS 1000 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistruct sd_busy_data { 7662306a36Sopenharmony_ci struct mmc_card *card; 7762306a36Sopenharmony_ci u8 *reg_buf; 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci/* 8162306a36Sopenharmony_ci * Given the decoded CSD structure, decode the raw CID to our CID structure. 8262306a36Sopenharmony_ci */ 8362306a36Sopenharmony_civoid mmc_decode_cid(struct mmc_card *card) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci u32 *resp = card->raw_cid; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci /* 8862306a36Sopenharmony_ci * Add the raw card ID (cid) data to the entropy pool. It doesn't 8962306a36Sopenharmony_ci * matter that not all of it is unique, it's just bonus entropy. 9062306a36Sopenharmony_ci */ 9162306a36Sopenharmony_ci add_device_randomness(&card->raw_cid, sizeof(card->raw_cid)); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci /* 9462306a36Sopenharmony_ci * SD doesn't currently have a version field so we will 9562306a36Sopenharmony_ci * have to assume we can parse this. 9662306a36Sopenharmony_ci */ 9762306a36Sopenharmony_ci card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); 9862306a36Sopenharmony_ci card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); 9962306a36Sopenharmony_ci card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); 10062306a36Sopenharmony_ci card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); 10162306a36Sopenharmony_ci card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); 10262306a36Sopenharmony_ci card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); 10362306a36Sopenharmony_ci card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); 10462306a36Sopenharmony_ci card->cid.hwrev = UNSTUFF_BITS(resp, 60, 4); 10562306a36Sopenharmony_ci card->cid.fwrev = UNSTUFF_BITS(resp, 56, 4); 10662306a36Sopenharmony_ci card->cid.serial = UNSTUFF_BITS(resp, 24, 32); 10762306a36Sopenharmony_ci card->cid.year = UNSTUFF_BITS(resp, 12, 8); 10862306a36Sopenharmony_ci card->cid.month = UNSTUFF_BITS(resp, 8, 4); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci card->cid.year += 2000; /* SD cards year offset */ 11162306a36Sopenharmony_ci} 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* 11462306a36Sopenharmony_ci * Given a 128-bit response, decode to our card CSD structure. 11562306a36Sopenharmony_ci */ 11662306a36Sopenharmony_cistatic int mmc_decode_csd(struct mmc_card *card) 11762306a36Sopenharmony_ci{ 11862306a36Sopenharmony_ci struct mmc_csd *csd = &card->csd; 11962306a36Sopenharmony_ci unsigned int e, m, csd_struct; 12062306a36Sopenharmony_ci u32 *resp = card->raw_csd; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci csd_struct = UNSTUFF_BITS(resp, 126, 2); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci switch (csd_struct) { 12562306a36Sopenharmony_ci case 0: 12662306a36Sopenharmony_ci m = UNSTUFF_BITS(resp, 115, 4); 12762306a36Sopenharmony_ci e = UNSTUFF_BITS(resp, 112, 3); 12862306a36Sopenharmony_ci csd->taac_ns = (taac_exp[e] * taac_mant[m] + 9) / 10; 12962306a36Sopenharmony_ci csd->taac_clks = UNSTUFF_BITS(resp, 104, 8) * 100; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci m = UNSTUFF_BITS(resp, 99, 4); 13262306a36Sopenharmony_ci e = UNSTUFF_BITS(resp, 96, 3); 13362306a36Sopenharmony_ci csd->max_dtr = tran_exp[e] * tran_mant[m]; 13462306a36Sopenharmony_ci csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci e = UNSTUFF_BITS(resp, 47, 3); 13762306a36Sopenharmony_ci m = UNSTUFF_BITS(resp, 62, 12); 13862306a36Sopenharmony_ci csd->capacity = (1 + m) << (e + 2); 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4); 14162306a36Sopenharmony_ci csd->read_partial = UNSTUFF_BITS(resp, 79, 1); 14262306a36Sopenharmony_ci csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); 14362306a36Sopenharmony_ci csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); 14462306a36Sopenharmony_ci csd->dsr_imp = UNSTUFF_BITS(resp, 76, 1); 14562306a36Sopenharmony_ci csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); 14662306a36Sopenharmony_ci csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); 14762306a36Sopenharmony_ci csd->write_partial = UNSTUFF_BITS(resp, 21, 1); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci if (UNSTUFF_BITS(resp, 46, 1)) { 15062306a36Sopenharmony_ci csd->erase_size = 1; 15162306a36Sopenharmony_ci } else if (csd->write_blkbits >= 9) { 15262306a36Sopenharmony_ci csd->erase_size = UNSTUFF_BITS(resp, 39, 7) + 1; 15362306a36Sopenharmony_ci csd->erase_size <<= csd->write_blkbits - 9; 15462306a36Sopenharmony_ci } 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci if (UNSTUFF_BITS(resp, 13, 1)) 15762306a36Sopenharmony_ci mmc_card_set_readonly(card); 15862306a36Sopenharmony_ci break; 15962306a36Sopenharmony_ci case 1: 16062306a36Sopenharmony_ci /* 16162306a36Sopenharmony_ci * This is a block-addressed SDHC or SDXC card. Most 16262306a36Sopenharmony_ci * interesting fields are unused and have fixed 16362306a36Sopenharmony_ci * values. To avoid getting tripped by buggy cards, 16462306a36Sopenharmony_ci * we assume those fixed values ourselves. 16562306a36Sopenharmony_ci */ 16662306a36Sopenharmony_ci mmc_card_set_blockaddr(card); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci csd->taac_ns = 0; /* Unused */ 16962306a36Sopenharmony_ci csd->taac_clks = 0; /* Unused */ 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci m = UNSTUFF_BITS(resp, 99, 4); 17262306a36Sopenharmony_ci e = UNSTUFF_BITS(resp, 96, 3); 17362306a36Sopenharmony_ci csd->max_dtr = tran_exp[e] * tran_mant[m]; 17462306a36Sopenharmony_ci csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); 17562306a36Sopenharmony_ci csd->c_size = UNSTUFF_BITS(resp, 48, 22); 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* SDXC cards have a minimum C_SIZE of 0x00FFFF */ 17862306a36Sopenharmony_ci if (csd->c_size >= 0xFFFF) 17962306a36Sopenharmony_ci mmc_card_set_ext_capacity(card); 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci m = UNSTUFF_BITS(resp, 48, 22); 18262306a36Sopenharmony_ci csd->capacity = (1 + m) << 10; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci csd->read_blkbits = 9; 18562306a36Sopenharmony_ci csd->read_partial = 0; 18662306a36Sopenharmony_ci csd->write_misalign = 0; 18762306a36Sopenharmony_ci csd->read_misalign = 0; 18862306a36Sopenharmony_ci csd->r2w_factor = 4; /* Unused */ 18962306a36Sopenharmony_ci csd->write_blkbits = 9; 19062306a36Sopenharmony_ci csd->write_partial = 0; 19162306a36Sopenharmony_ci csd->erase_size = 1; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci if (UNSTUFF_BITS(resp, 13, 1)) 19462306a36Sopenharmony_ci mmc_card_set_readonly(card); 19562306a36Sopenharmony_ci break; 19662306a36Sopenharmony_ci default: 19762306a36Sopenharmony_ci pr_err("%s: unrecognised CSD structure version %d\n", 19862306a36Sopenharmony_ci mmc_hostname(card->host), csd_struct); 19962306a36Sopenharmony_ci return -EINVAL; 20062306a36Sopenharmony_ci } 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci card->erase_size = csd->erase_size; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci return 0; 20562306a36Sopenharmony_ci} 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci/* 20862306a36Sopenharmony_ci * Given a 64-bit response, decode to our card SCR structure. 20962306a36Sopenharmony_ci */ 21062306a36Sopenharmony_cistatic int mmc_decode_scr(struct mmc_card *card) 21162306a36Sopenharmony_ci{ 21262306a36Sopenharmony_ci struct sd_scr *scr = &card->scr; 21362306a36Sopenharmony_ci unsigned int scr_struct; 21462306a36Sopenharmony_ci u32 resp[4]; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci resp[3] = card->raw_scr[1]; 21762306a36Sopenharmony_ci resp[2] = card->raw_scr[0]; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci scr_struct = UNSTUFF_BITS(resp, 60, 4); 22062306a36Sopenharmony_ci if (scr_struct != 0) { 22162306a36Sopenharmony_ci pr_err("%s: unrecognised SCR structure version %d\n", 22262306a36Sopenharmony_ci mmc_hostname(card->host), scr_struct); 22362306a36Sopenharmony_ci return -EINVAL; 22462306a36Sopenharmony_ci } 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci scr->sda_vsn = UNSTUFF_BITS(resp, 56, 4); 22762306a36Sopenharmony_ci scr->bus_widths = UNSTUFF_BITS(resp, 48, 4); 22862306a36Sopenharmony_ci if (scr->sda_vsn == SCR_SPEC_VER_2) 22962306a36Sopenharmony_ci /* Check if Physical Layer Spec v3.0 is supported */ 23062306a36Sopenharmony_ci scr->sda_spec3 = UNSTUFF_BITS(resp, 47, 1); 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci if (scr->sda_spec3) { 23362306a36Sopenharmony_ci scr->sda_spec4 = UNSTUFF_BITS(resp, 42, 1); 23462306a36Sopenharmony_ci scr->sda_specx = UNSTUFF_BITS(resp, 38, 4); 23562306a36Sopenharmony_ci } 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci if (UNSTUFF_BITS(resp, 55, 1)) 23862306a36Sopenharmony_ci card->erased_byte = 0xFF; 23962306a36Sopenharmony_ci else 24062306a36Sopenharmony_ci card->erased_byte = 0x0; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci if (scr->sda_spec4) 24362306a36Sopenharmony_ci scr->cmds = UNSTUFF_BITS(resp, 32, 4); 24462306a36Sopenharmony_ci else if (scr->sda_spec3) 24562306a36Sopenharmony_ci scr->cmds = UNSTUFF_BITS(resp, 32, 2); 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci /* SD Spec says: any SD Card shall set at least bits 0 and 2 */ 24862306a36Sopenharmony_ci if (!(scr->bus_widths & SD_SCR_BUS_WIDTH_1) || 24962306a36Sopenharmony_ci !(scr->bus_widths & SD_SCR_BUS_WIDTH_4)) { 25062306a36Sopenharmony_ci pr_err("%s: invalid bus width\n", mmc_hostname(card->host)); 25162306a36Sopenharmony_ci return -EINVAL; 25262306a36Sopenharmony_ci } 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci return 0; 25562306a36Sopenharmony_ci} 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci/* 25862306a36Sopenharmony_ci * Fetch and process SD Status register. 25962306a36Sopenharmony_ci */ 26062306a36Sopenharmony_cistatic int mmc_read_ssr(struct mmc_card *card) 26162306a36Sopenharmony_ci{ 26262306a36Sopenharmony_ci unsigned int au, es, et, eo; 26362306a36Sopenharmony_ci __be32 *raw_ssr; 26462306a36Sopenharmony_ci u32 resp[4] = {}; 26562306a36Sopenharmony_ci u8 discard_support; 26662306a36Sopenharmony_ci int i; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci if (!(card->csd.cmdclass & CCC_APP_SPEC)) { 26962306a36Sopenharmony_ci pr_warn("%s: card lacks mandatory SD Status function\n", 27062306a36Sopenharmony_ci mmc_hostname(card->host)); 27162306a36Sopenharmony_ci return 0; 27262306a36Sopenharmony_ci } 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci raw_ssr = kmalloc(sizeof(card->raw_ssr), GFP_KERNEL); 27562306a36Sopenharmony_ci if (!raw_ssr) 27662306a36Sopenharmony_ci return -ENOMEM; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci if (mmc_app_sd_status(card, raw_ssr)) { 27962306a36Sopenharmony_ci pr_warn("%s: problem reading SD Status register\n", 28062306a36Sopenharmony_ci mmc_hostname(card->host)); 28162306a36Sopenharmony_ci kfree(raw_ssr); 28262306a36Sopenharmony_ci return 0; 28362306a36Sopenharmony_ci } 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci for (i = 0; i < 16; i++) 28662306a36Sopenharmony_ci card->raw_ssr[i] = be32_to_cpu(raw_ssr[i]); 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci kfree(raw_ssr); 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci /* 29162306a36Sopenharmony_ci * UNSTUFF_BITS only works with four u32s so we have to offset the 29262306a36Sopenharmony_ci * bitfield positions accordingly. 29362306a36Sopenharmony_ci */ 29462306a36Sopenharmony_ci au = UNSTUFF_BITS(card->raw_ssr, 428 - 384, 4); 29562306a36Sopenharmony_ci if (au) { 29662306a36Sopenharmony_ci if (au <= 9 || card->scr.sda_spec3) { 29762306a36Sopenharmony_ci card->ssr.au = sd_au_size[au]; 29862306a36Sopenharmony_ci es = UNSTUFF_BITS(card->raw_ssr, 408 - 384, 16); 29962306a36Sopenharmony_ci et = UNSTUFF_BITS(card->raw_ssr, 402 - 384, 6); 30062306a36Sopenharmony_ci if (es && et) { 30162306a36Sopenharmony_ci eo = UNSTUFF_BITS(card->raw_ssr, 400 - 384, 2); 30262306a36Sopenharmony_ci card->ssr.erase_timeout = (et * 1000) / es; 30362306a36Sopenharmony_ci card->ssr.erase_offset = eo * 1000; 30462306a36Sopenharmony_ci } 30562306a36Sopenharmony_ci } else { 30662306a36Sopenharmony_ci pr_warn("%s: SD Status: Invalid Allocation Unit size\n", 30762306a36Sopenharmony_ci mmc_hostname(card->host)); 30862306a36Sopenharmony_ci } 30962306a36Sopenharmony_ci } 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci /* 31262306a36Sopenharmony_ci * starting SD5.1 discard is supported if DISCARD_SUPPORT (b313) is set 31362306a36Sopenharmony_ci */ 31462306a36Sopenharmony_ci resp[3] = card->raw_ssr[6]; 31562306a36Sopenharmony_ci discard_support = UNSTUFF_BITS(resp, 313 - 288, 1); 31662306a36Sopenharmony_ci card->erase_arg = (card->scr.sda_specx && discard_support) ? 31762306a36Sopenharmony_ci SD_DISCARD_ARG : SD_ERASE_ARG; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci return 0; 32062306a36Sopenharmony_ci} 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci/* 32362306a36Sopenharmony_ci * Fetches and decodes switch information 32462306a36Sopenharmony_ci */ 32562306a36Sopenharmony_cistatic int mmc_read_switch(struct mmc_card *card) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci int err; 32862306a36Sopenharmony_ci u8 *status; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci if (card->scr.sda_vsn < SCR_SPEC_VER_1) 33162306a36Sopenharmony_ci return 0; 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci if (!(card->csd.cmdclass & CCC_SWITCH)) { 33462306a36Sopenharmony_ci pr_warn("%s: card lacks mandatory switch function, performance might suffer\n", 33562306a36Sopenharmony_ci mmc_hostname(card->host)); 33662306a36Sopenharmony_ci return 0; 33762306a36Sopenharmony_ci } 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci status = kmalloc(64, GFP_KERNEL); 34062306a36Sopenharmony_ci if (!status) 34162306a36Sopenharmony_ci return -ENOMEM; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci /* 34462306a36Sopenharmony_ci * Find out the card's support bits with a mode 0 operation. 34562306a36Sopenharmony_ci * The argument does not matter, as the support bits do not 34662306a36Sopenharmony_ci * change with the arguments. 34762306a36Sopenharmony_ci */ 34862306a36Sopenharmony_ci err = mmc_sd_switch(card, 0, 0, 0, status); 34962306a36Sopenharmony_ci if (err) { 35062306a36Sopenharmony_ci /* 35162306a36Sopenharmony_ci * If the host or the card can't do the switch, 35262306a36Sopenharmony_ci * fail more gracefully. 35362306a36Sopenharmony_ci */ 35462306a36Sopenharmony_ci if (err != -EINVAL && err != -ENOSYS && err != -EFAULT) 35562306a36Sopenharmony_ci goto out; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci pr_warn("%s: problem reading Bus Speed modes\n", 35862306a36Sopenharmony_ci mmc_hostname(card->host)); 35962306a36Sopenharmony_ci err = 0; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci goto out; 36262306a36Sopenharmony_ci } 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci if (status[13] & SD_MODE_HIGH_SPEED) 36562306a36Sopenharmony_ci card->sw_caps.hs_max_dtr = HIGH_SPEED_MAX_DTR; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci if (card->scr.sda_spec3) { 36862306a36Sopenharmony_ci card->sw_caps.sd3_bus_mode = status[13]; 36962306a36Sopenharmony_ci /* Driver Strengths supported by the card */ 37062306a36Sopenharmony_ci card->sw_caps.sd3_drv_type = status[9]; 37162306a36Sopenharmony_ci card->sw_caps.sd3_curr_limit = status[7] | status[6] << 8; 37262306a36Sopenharmony_ci } 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ciout: 37562306a36Sopenharmony_ci kfree(status); 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci return err; 37862306a36Sopenharmony_ci} 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci/* 38162306a36Sopenharmony_ci * Test if the card supports high-speed mode and, if so, switch to it. 38262306a36Sopenharmony_ci */ 38362306a36Sopenharmony_ciint mmc_sd_switch_hs(struct mmc_card *card) 38462306a36Sopenharmony_ci{ 38562306a36Sopenharmony_ci int err; 38662306a36Sopenharmony_ci u8 *status; 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci if (card->scr.sda_vsn < SCR_SPEC_VER_1) 38962306a36Sopenharmony_ci return 0; 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci if (!(card->csd.cmdclass & CCC_SWITCH)) 39262306a36Sopenharmony_ci return 0; 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED)) 39562306a36Sopenharmony_ci return 0; 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci if (card->sw_caps.hs_max_dtr == 0) 39862306a36Sopenharmony_ci return 0; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci status = kmalloc(64, GFP_KERNEL); 40162306a36Sopenharmony_ci if (!status) 40262306a36Sopenharmony_ci return -ENOMEM; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci err = mmc_sd_switch(card, 1, 0, HIGH_SPEED_BUS_SPEED, status); 40562306a36Sopenharmony_ci if (err) 40662306a36Sopenharmony_ci goto out; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci if ((status[16] & 0xF) != HIGH_SPEED_BUS_SPEED) { 40962306a36Sopenharmony_ci pr_warn("%s: Problem switching card into high-speed mode!\n", 41062306a36Sopenharmony_ci mmc_hostname(card->host)); 41162306a36Sopenharmony_ci err = 0; 41262306a36Sopenharmony_ci } else { 41362306a36Sopenharmony_ci err = 1; 41462306a36Sopenharmony_ci } 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ciout: 41762306a36Sopenharmony_ci kfree(status); 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci return err; 42062306a36Sopenharmony_ci} 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_cistatic int sd_select_driver_type(struct mmc_card *card, u8 *status) 42362306a36Sopenharmony_ci{ 42462306a36Sopenharmony_ci int card_drv_type, drive_strength, drv_type; 42562306a36Sopenharmony_ci int err; 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci card->drive_strength = 0; 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci card_drv_type = card->sw_caps.sd3_drv_type | SD_DRIVER_TYPE_B; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci drive_strength = mmc_select_drive_strength(card, 43262306a36Sopenharmony_ci card->sw_caps.uhs_max_dtr, 43362306a36Sopenharmony_ci card_drv_type, &drv_type); 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci if (drive_strength) { 43662306a36Sopenharmony_ci err = mmc_sd_switch(card, 1, 2, drive_strength, status); 43762306a36Sopenharmony_ci if (err) 43862306a36Sopenharmony_ci return err; 43962306a36Sopenharmony_ci if ((status[15] & 0xF) != drive_strength) { 44062306a36Sopenharmony_ci pr_warn("%s: Problem setting drive strength!\n", 44162306a36Sopenharmony_ci mmc_hostname(card->host)); 44262306a36Sopenharmony_ci return 0; 44362306a36Sopenharmony_ci } 44462306a36Sopenharmony_ci card->drive_strength = drive_strength; 44562306a36Sopenharmony_ci } 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci if (drv_type) 44862306a36Sopenharmony_ci mmc_set_driver_type(card->host, drv_type); 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci return 0; 45162306a36Sopenharmony_ci} 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_cistatic void sd_update_bus_speed_mode(struct mmc_card *card) 45462306a36Sopenharmony_ci{ 45562306a36Sopenharmony_ci /* 45662306a36Sopenharmony_ci * If the host doesn't support any of the UHS-I modes, fallback on 45762306a36Sopenharmony_ci * default speed. 45862306a36Sopenharmony_ci */ 45962306a36Sopenharmony_ci if (!mmc_host_uhs(card->host)) { 46062306a36Sopenharmony_ci card->sd_bus_speed = 0; 46162306a36Sopenharmony_ci return; 46262306a36Sopenharmony_ci } 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci if ((card->host->caps & MMC_CAP_UHS_SDR104) && 46562306a36Sopenharmony_ci (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104)) { 46662306a36Sopenharmony_ci card->sd_bus_speed = UHS_SDR104_BUS_SPEED; 46762306a36Sopenharmony_ci } else if ((card->host->caps & MMC_CAP_UHS_DDR50) && 46862306a36Sopenharmony_ci (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_DDR50)) { 46962306a36Sopenharmony_ci card->sd_bus_speed = UHS_DDR50_BUS_SPEED; 47062306a36Sopenharmony_ci } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | 47162306a36Sopenharmony_ci MMC_CAP_UHS_SDR50)) && (card->sw_caps.sd3_bus_mode & 47262306a36Sopenharmony_ci SD_MODE_UHS_SDR50)) { 47362306a36Sopenharmony_ci card->sd_bus_speed = UHS_SDR50_BUS_SPEED; 47462306a36Sopenharmony_ci } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | 47562306a36Sopenharmony_ci MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25)) && 47662306a36Sopenharmony_ci (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR25)) { 47762306a36Sopenharmony_ci card->sd_bus_speed = UHS_SDR25_BUS_SPEED; 47862306a36Sopenharmony_ci } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | 47962306a36Sopenharmony_ci MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25 | 48062306a36Sopenharmony_ci MMC_CAP_UHS_SDR12)) && (card->sw_caps.sd3_bus_mode & 48162306a36Sopenharmony_ci SD_MODE_UHS_SDR12)) { 48262306a36Sopenharmony_ci card->sd_bus_speed = UHS_SDR12_BUS_SPEED; 48362306a36Sopenharmony_ci } 48462306a36Sopenharmony_ci} 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_cistatic int sd_set_bus_speed_mode(struct mmc_card *card, u8 *status) 48762306a36Sopenharmony_ci{ 48862306a36Sopenharmony_ci int err; 48962306a36Sopenharmony_ci unsigned int timing = 0; 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci switch (card->sd_bus_speed) { 49262306a36Sopenharmony_ci case UHS_SDR104_BUS_SPEED: 49362306a36Sopenharmony_ci timing = MMC_TIMING_UHS_SDR104; 49462306a36Sopenharmony_ci card->sw_caps.uhs_max_dtr = UHS_SDR104_MAX_DTR; 49562306a36Sopenharmony_ci break; 49662306a36Sopenharmony_ci case UHS_DDR50_BUS_SPEED: 49762306a36Sopenharmony_ci timing = MMC_TIMING_UHS_DDR50; 49862306a36Sopenharmony_ci card->sw_caps.uhs_max_dtr = UHS_DDR50_MAX_DTR; 49962306a36Sopenharmony_ci break; 50062306a36Sopenharmony_ci case UHS_SDR50_BUS_SPEED: 50162306a36Sopenharmony_ci timing = MMC_TIMING_UHS_SDR50; 50262306a36Sopenharmony_ci card->sw_caps.uhs_max_dtr = UHS_SDR50_MAX_DTR; 50362306a36Sopenharmony_ci break; 50462306a36Sopenharmony_ci case UHS_SDR25_BUS_SPEED: 50562306a36Sopenharmony_ci timing = MMC_TIMING_UHS_SDR25; 50662306a36Sopenharmony_ci card->sw_caps.uhs_max_dtr = UHS_SDR25_MAX_DTR; 50762306a36Sopenharmony_ci break; 50862306a36Sopenharmony_ci case UHS_SDR12_BUS_SPEED: 50962306a36Sopenharmony_ci timing = MMC_TIMING_UHS_SDR12; 51062306a36Sopenharmony_ci card->sw_caps.uhs_max_dtr = UHS_SDR12_MAX_DTR; 51162306a36Sopenharmony_ci break; 51262306a36Sopenharmony_ci default: 51362306a36Sopenharmony_ci return 0; 51462306a36Sopenharmony_ci } 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ci err = mmc_sd_switch(card, 1, 0, card->sd_bus_speed, status); 51762306a36Sopenharmony_ci if (err) 51862306a36Sopenharmony_ci return err; 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci if ((status[16] & 0xF) != card->sd_bus_speed) 52162306a36Sopenharmony_ci pr_warn("%s: Problem setting bus speed mode!\n", 52262306a36Sopenharmony_ci mmc_hostname(card->host)); 52362306a36Sopenharmony_ci else { 52462306a36Sopenharmony_ci mmc_set_timing(card->host, timing); 52562306a36Sopenharmony_ci mmc_set_clock(card->host, card->sw_caps.uhs_max_dtr); 52662306a36Sopenharmony_ci } 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci return 0; 52962306a36Sopenharmony_ci} 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci/* Get host's max current setting at its current voltage */ 53262306a36Sopenharmony_cistatic u32 sd_get_host_max_current(struct mmc_host *host) 53362306a36Sopenharmony_ci{ 53462306a36Sopenharmony_ci u32 voltage, max_current; 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ci voltage = 1 << host->ios.vdd; 53762306a36Sopenharmony_ci switch (voltage) { 53862306a36Sopenharmony_ci case MMC_VDD_165_195: 53962306a36Sopenharmony_ci max_current = host->max_current_180; 54062306a36Sopenharmony_ci break; 54162306a36Sopenharmony_ci case MMC_VDD_29_30: 54262306a36Sopenharmony_ci case MMC_VDD_30_31: 54362306a36Sopenharmony_ci max_current = host->max_current_300; 54462306a36Sopenharmony_ci break; 54562306a36Sopenharmony_ci case MMC_VDD_32_33: 54662306a36Sopenharmony_ci case MMC_VDD_33_34: 54762306a36Sopenharmony_ci max_current = host->max_current_330; 54862306a36Sopenharmony_ci break; 54962306a36Sopenharmony_ci default: 55062306a36Sopenharmony_ci max_current = 0; 55162306a36Sopenharmony_ci } 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci return max_current; 55462306a36Sopenharmony_ci} 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_cistatic int sd_set_current_limit(struct mmc_card *card, u8 *status) 55762306a36Sopenharmony_ci{ 55862306a36Sopenharmony_ci int current_limit = SD_SET_CURRENT_NO_CHANGE; 55962306a36Sopenharmony_ci int err; 56062306a36Sopenharmony_ci u32 max_current; 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci /* 56362306a36Sopenharmony_ci * Current limit switch is only defined for SDR50, SDR104, and DDR50 56462306a36Sopenharmony_ci * bus speed modes. For other bus speed modes, we do not change the 56562306a36Sopenharmony_ci * current limit. 56662306a36Sopenharmony_ci */ 56762306a36Sopenharmony_ci if ((card->sd_bus_speed != UHS_SDR50_BUS_SPEED) && 56862306a36Sopenharmony_ci (card->sd_bus_speed != UHS_SDR104_BUS_SPEED) && 56962306a36Sopenharmony_ci (card->sd_bus_speed != UHS_DDR50_BUS_SPEED)) 57062306a36Sopenharmony_ci return 0; 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_ci /* 57362306a36Sopenharmony_ci * Host has different current capabilities when operating at 57462306a36Sopenharmony_ci * different voltages, so find out its max current first. 57562306a36Sopenharmony_ci */ 57662306a36Sopenharmony_ci max_current = sd_get_host_max_current(card->host); 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci /* 57962306a36Sopenharmony_ci * We only check host's capability here, if we set a limit that is 58062306a36Sopenharmony_ci * higher than the card's maximum current, the card will be using its 58162306a36Sopenharmony_ci * maximum current, e.g. if the card's maximum current is 300ma, and 58262306a36Sopenharmony_ci * when we set current limit to 200ma, the card will draw 200ma, and 58362306a36Sopenharmony_ci * when we set current limit to 400/600/800ma, the card will draw its 58462306a36Sopenharmony_ci * maximum 300ma from the host. 58562306a36Sopenharmony_ci * 58662306a36Sopenharmony_ci * The above is incorrect: if we try to set a current limit that is 58762306a36Sopenharmony_ci * not supported by the card, the card can rightfully error out the 58862306a36Sopenharmony_ci * attempt, and remain at the default current limit. This results 58962306a36Sopenharmony_ci * in a 300mA card being limited to 200mA even though the host 59062306a36Sopenharmony_ci * supports 800mA. Failures seen with SanDisk 8GB UHS cards with 59162306a36Sopenharmony_ci * an iMX6 host. --rmk 59262306a36Sopenharmony_ci */ 59362306a36Sopenharmony_ci if (max_current >= 800 && 59462306a36Sopenharmony_ci card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_800) 59562306a36Sopenharmony_ci current_limit = SD_SET_CURRENT_LIMIT_800; 59662306a36Sopenharmony_ci else if (max_current >= 600 && 59762306a36Sopenharmony_ci card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_600) 59862306a36Sopenharmony_ci current_limit = SD_SET_CURRENT_LIMIT_600; 59962306a36Sopenharmony_ci else if (max_current >= 400 && 60062306a36Sopenharmony_ci card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_400) 60162306a36Sopenharmony_ci current_limit = SD_SET_CURRENT_LIMIT_400; 60262306a36Sopenharmony_ci else if (max_current >= 200 && 60362306a36Sopenharmony_ci card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200) 60462306a36Sopenharmony_ci current_limit = SD_SET_CURRENT_LIMIT_200; 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci if (current_limit != SD_SET_CURRENT_NO_CHANGE) { 60762306a36Sopenharmony_ci err = mmc_sd_switch(card, 1, 3, current_limit, status); 60862306a36Sopenharmony_ci if (err) 60962306a36Sopenharmony_ci return err; 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci if (((status[15] >> 4) & 0x0F) != current_limit) 61262306a36Sopenharmony_ci pr_warn("%s: Problem setting current limit!\n", 61362306a36Sopenharmony_ci mmc_hostname(card->host)); 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci } 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci return 0; 61862306a36Sopenharmony_ci} 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci/* 62162306a36Sopenharmony_ci * UHS-I specific initialization procedure 62262306a36Sopenharmony_ci */ 62362306a36Sopenharmony_cistatic int mmc_sd_init_uhs_card(struct mmc_card *card) 62462306a36Sopenharmony_ci{ 62562306a36Sopenharmony_ci int err; 62662306a36Sopenharmony_ci u8 *status; 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_ci if (!(card->csd.cmdclass & CCC_SWITCH)) 62962306a36Sopenharmony_ci return 0; 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci status = kmalloc(64, GFP_KERNEL); 63262306a36Sopenharmony_ci if (!status) 63362306a36Sopenharmony_ci return -ENOMEM; 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_ci /* Set 4-bit bus width */ 63662306a36Sopenharmony_ci err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4); 63762306a36Sopenharmony_ci if (err) 63862306a36Sopenharmony_ci goto out; 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4); 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci /* 64362306a36Sopenharmony_ci * Select the bus speed mode depending on host 64462306a36Sopenharmony_ci * and card capability. 64562306a36Sopenharmony_ci */ 64662306a36Sopenharmony_ci sd_update_bus_speed_mode(card); 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_ci /* Set the driver strength for the card */ 64962306a36Sopenharmony_ci err = sd_select_driver_type(card, status); 65062306a36Sopenharmony_ci if (err) 65162306a36Sopenharmony_ci goto out; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci /* Set current limit for the card */ 65462306a36Sopenharmony_ci err = sd_set_current_limit(card, status); 65562306a36Sopenharmony_ci if (err) 65662306a36Sopenharmony_ci goto out; 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci /* Set bus speed mode of the card */ 65962306a36Sopenharmony_ci err = sd_set_bus_speed_mode(card, status); 66062306a36Sopenharmony_ci if (err) 66162306a36Sopenharmony_ci goto out; 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_ci /* 66462306a36Sopenharmony_ci * SPI mode doesn't define CMD19 and tuning is only valid for SDR50 and 66562306a36Sopenharmony_ci * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. 66662306a36Sopenharmony_ci */ 66762306a36Sopenharmony_ci if (!mmc_host_is_spi(card->host) && 66862306a36Sopenharmony_ci (card->host->ios.timing == MMC_TIMING_UHS_SDR50 || 66962306a36Sopenharmony_ci card->host->ios.timing == MMC_TIMING_UHS_DDR50 || 67062306a36Sopenharmony_ci card->host->ios.timing == MMC_TIMING_UHS_SDR104)) { 67162306a36Sopenharmony_ci err = mmc_execute_tuning(card); 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_ci /* 67462306a36Sopenharmony_ci * As SD Specifications Part1 Physical Layer Specification 67562306a36Sopenharmony_ci * Version 3.01 says, CMD19 tuning is available for unlocked 67662306a36Sopenharmony_ci * cards in transfer state of 1.8V signaling mode. The small 67762306a36Sopenharmony_ci * difference between v3.00 and 3.01 spec means that CMD19 67862306a36Sopenharmony_ci * tuning is also available for DDR50 mode. 67962306a36Sopenharmony_ci */ 68062306a36Sopenharmony_ci if (err && card->host->ios.timing == MMC_TIMING_UHS_DDR50) { 68162306a36Sopenharmony_ci pr_warn("%s: ddr50 tuning failed\n", 68262306a36Sopenharmony_ci mmc_hostname(card->host)); 68362306a36Sopenharmony_ci err = 0; 68462306a36Sopenharmony_ci } 68562306a36Sopenharmony_ci } 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_ciout: 68862306a36Sopenharmony_ci kfree(status); 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci return err; 69162306a36Sopenharmony_ci} 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ciMMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1], 69462306a36Sopenharmony_ci card->raw_cid[2], card->raw_cid[3]); 69562306a36Sopenharmony_ciMMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1], 69662306a36Sopenharmony_ci card->raw_csd[2], card->raw_csd[3]); 69762306a36Sopenharmony_ciMMC_DEV_ATTR(scr, "%08x%08x\n", card->raw_scr[0], card->raw_scr[1]); 69862306a36Sopenharmony_ciMMC_DEV_ATTR(ssr, 69962306a36Sopenharmony_ci "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x\n", 70062306a36Sopenharmony_ci card->raw_ssr[0], card->raw_ssr[1], card->raw_ssr[2], 70162306a36Sopenharmony_ci card->raw_ssr[3], card->raw_ssr[4], card->raw_ssr[5], 70262306a36Sopenharmony_ci card->raw_ssr[6], card->raw_ssr[7], card->raw_ssr[8], 70362306a36Sopenharmony_ci card->raw_ssr[9], card->raw_ssr[10], card->raw_ssr[11], 70462306a36Sopenharmony_ci card->raw_ssr[12], card->raw_ssr[13], card->raw_ssr[14], 70562306a36Sopenharmony_ci card->raw_ssr[15]); 70662306a36Sopenharmony_ciMMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year); 70762306a36Sopenharmony_ciMMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9); 70862306a36Sopenharmony_ciMMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9); 70962306a36Sopenharmony_ciMMC_DEV_ATTR(fwrev, "0x%x\n", card->cid.fwrev); 71062306a36Sopenharmony_ciMMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev); 71162306a36Sopenharmony_ciMMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid); 71262306a36Sopenharmony_ciMMC_DEV_ATTR(name, "%s\n", card->cid.prod_name); 71362306a36Sopenharmony_ciMMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid); 71462306a36Sopenharmony_ciMMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial); 71562306a36Sopenharmony_ciMMC_DEV_ATTR(ocr, "0x%08x\n", card->ocr); 71662306a36Sopenharmony_ciMMC_DEV_ATTR(rca, "0x%04x\n", card->rca); 71762306a36Sopenharmony_ci 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_cistatic ssize_t mmc_dsr_show(struct device *dev, struct device_attribute *attr, 72062306a36Sopenharmony_ci char *buf) 72162306a36Sopenharmony_ci{ 72262306a36Sopenharmony_ci struct mmc_card *card = mmc_dev_to_card(dev); 72362306a36Sopenharmony_ci struct mmc_host *host = card->host; 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_ci if (card->csd.dsr_imp && host->dsr_req) 72662306a36Sopenharmony_ci return sysfs_emit(buf, "0x%x\n", host->dsr); 72762306a36Sopenharmony_ci /* return default DSR value */ 72862306a36Sopenharmony_ci return sysfs_emit(buf, "0x%x\n", 0x404); 72962306a36Sopenharmony_ci} 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_cistatic DEVICE_ATTR(dsr, S_IRUGO, mmc_dsr_show, NULL); 73262306a36Sopenharmony_ci 73362306a36Sopenharmony_ciMMC_DEV_ATTR(vendor, "0x%04x\n", card->cis.vendor); 73462306a36Sopenharmony_ciMMC_DEV_ATTR(device, "0x%04x\n", card->cis.device); 73562306a36Sopenharmony_ciMMC_DEV_ATTR(revision, "%u.%u\n", card->major_rev, card->minor_rev); 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_ci#define sdio_info_attr(num) \ 73862306a36Sopenharmony_cistatic ssize_t info##num##_show(struct device *dev, struct device_attribute *attr, char *buf) \ 73962306a36Sopenharmony_ci{ \ 74062306a36Sopenharmony_ci struct mmc_card *card = mmc_dev_to_card(dev); \ 74162306a36Sopenharmony_ci \ 74262306a36Sopenharmony_ci if (num > card->num_info) \ 74362306a36Sopenharmony_ci return -ENODATA; \ 74462306a36Sopenharmony_ci if (!card->info[num - 1][0]) \ 74562306a36Sopenharmony_ci return 0; \ 74662306a36Sopenharmony_ci return sysfs_emit(buf, "%s\n", card->info[num - 1]); \ 74762306a36Sopenharmony_ci} \ 74862306a36Sopenharmony_cistatic DEVICE_ATTR_RO(info##num) 74962306a36Sopenharmony_ci 75062306a36Sopenharmony_cisdio_info_attr(1); 75162306a36Sopenharmony_cisdio_info_attr(2); 75262306a36Sopenharmony_cisdio_info_attr(3); 75362306a36Sopenharmony_cisdio_info_attr(4); 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_cistatic struct attribute *sd_std_attrs[] = { 75662306a36Sopenharmony_ci &dev_attr_vendor.attr, 75762306a36Sopenharmony_ci &dev_attr_device.attr, 75862306a36Sopenharmony_ci &dev_attr_revision.attr, 75962306a36Sopenharmony_ci &dev_attr_info1.attr, 76062306a36Sopenharmony_ci &dev_attr_info2.attr, 76162306a36Sopenharmony_ci &dev_attr_info3.attr, 76262306a36Sopenharmony_ci &dev_attr_info4.attr, 76362306a36Sopenharmony_ci &dev_attr_cid.attr, 76462306a36Sopenharmony_ci &dev_attr_csd.attr, 76562306a36Sopenharmony_ci &dev_attr_scr.attr, 76662306a36Sopenharmony_ci &dev_attr_ssr.attr, 76762306a36Sopenharmony_ci &dev_attr_date.attr, 76862306a36Sopenharmony_ci &dev_attr_erase_size.attr, 76962306a36Sopenharmony_ci &dev_attr_preferred_erase_size.attr, 77062306a36Sopenharmony_ci &dev_attr_fwrev.attr, 77162306a36Sopenharmony_ci &dev_attr_hwrev.attr, 77262306a36Sopenharmony_ci &dev_attr_manfid.attr, 77362306a36Sopenharmony_ci &dev_attr_name.attr, 77462306a36Sopenharmony_ci &dev_attr_oemid.attr, 77562306a36Sopenharmony_ci &dev_attr_serial.attr, 77662306a36Sopenharmony_ci &dev_attr_ocr.attr, 77762306a36Sopenharmony_ci &dev_attr_rca.attr, 77862306a36Sopenharmony_ci &dev_attr_dsr.attr, 77962306a36Sopenharmony_ci NULL, 78062306a36Sopenharmony_ci}; 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_cistatic umode_t sd_std_is_visible(struct kobject *kobj, struct attribute *attr, 78362306a36Sopenharmony_ci int index) 78462306a36Sopenharmony_ci{ 78562306a36Sopenharmony_ci struct device *dev = kobj_to_dev(kobj); 78662306a36Sopenharmony_ci struct mmc_card *card = mmc_dev_to_card(dev); 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci /* CIS vendor and device ids, revision and info string are available only for Combo cards */ 78962306a36Sopenharmony_ci if ((attr == &dev_attr_vendor.attr || 79062306a36Sopenharmony_ci attr == &dev_attr_device.attr || 79162306a36Sopenharmony_ci attr == &dev_attr_revision.attr || 79262306a36Sopenharmony_ci attr == &dev_attr_info1.attr || 79362306a36Sopenharmony_ci attr == &dev_attr_info2.attr || 79462306a36Sopenharmony_ci attr == &dev_attr_info3.attr || 79562306a36Sopenharmony_ci attr == &dev_attr_info4.attr 79662306a36Sopenharmony_ci ) &&!mmc_card_sd_combo(card)) 79762306a36Sopenharmony_ci return 0; 79862306a36Sopenharmony_ci 79962306a36Sopenharmony_ci return attr->mode; 80062306a36Sopenharmony_ci} 80162306a36Sopenharmony_ci 80262306a36Sopenharmony_cistatic const struct attribute_group sd_std_group = { 80362306a36Sopenharmony_ci .attrs = sd_std_attrs, 80462306a36Sopenharmony_ci .is_visible = sd_std_is_visible, 80562306a36Sopenharmony_ci}; 80662306a36Sopenharmony_ci__ATTRIBUTE_GROUPS(sd_std); 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_cistruct device_type sd_type = { 80962306a36Sopenharmony_ci .groups = sd_std_groups, 81062306a36Sopenharmony_ci}; 81162306a36Sopenharmony_ci 81262306a36Sopenharmony_ci/* 81362306a36Sopenharmony_ci * Fetch CID from card. 81462306a36Sopenharmony_ci */ 81562306a36Sopenharmony_ciint mmc_sd_get_cid(struct mmc_host *host, u32 ocr, u32 *cid, u32 *rocr) 81662306a36Sopenharmony_ci{ 81762306a36Sopenharmony_ci int err; 81862306a36Sopenharmony_ci u32 max_current; 81962306a36Sopenharmony_ci int retries = 10; 82062306a36Sopenharmony_ci u32 pocr = ocr; 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_citry_again: 82362306a36Sopenharmony_ci if (!retries) { 82462306a36Sopenharmony_ci ocr &= ~SD_OCR_S18R; 82562306a36Sopenharmony_ci pr_warn("%s: Skipping voltage switch\n", mmc_hostname(host)); 82662306a36Sopenharmony_ci } 82762306a36Sopenharmony_ci 82862306a36Sopenharmony_ci /* 82962306a36Sopenharmony_ci * Since we're changing the OCR value, we seem to 83062306a36Sopenharmony_ci * need to tell some cards to go back to the idle 83162306a36Sopenharmony_ci * state. We wait 1ms to give cards time to 83262306a36Sopenharmony_ci * respond. 83362306a36Sopenharmony_ci */ 83462306a36Sopenharmony_ci mmc_go_idle(host); 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_ci /* 83762306a36Sopenharmony_ci * If SD_SEND_IF_COND indicates an SD 2.0 83862306a36Sopenharmony_ci * compliant card and we should set bit 30 83962306a36Sopenharmony_ci * of the ocr to indicate that we can handle 84062306a36Sopenharmony_ci * block-addressed SDHC cards. 84162306a36Sopenharmony_ci */ 84262306a36Sopenharmony_ci err = mmc_send_if_cond(host, ocr); 84362306a36Sopenharmony_ci if (!err) 84462306a36Sopenharmony_ci ocr |= SD_OCR_CCS; 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci /* 84762306a36Sopenharmony_ci * If the host supports one of UHS-I modes, request the card 84862306a36Sopenharmony_ci * to switch to 1.8V signaling level. If the card has failed 84962306a36Sopenharmony_ci * repeatedly to switch however, skip this. 85062306a36Sopenharmony_ci */ 85162306a36Sopenharmony_ci if (retries && mmc_host_uhs(host)) 85262306a36Sopenharmony_ci ocr |= SD_OCR_S18R; 85362306a36Sopenharmony_ci 85462306a36Sopenharmony_ci /* 85562306a36Sopenharmony_ci * If the host can supply more than 150mA at current voltage, 85662306a36Sopenharmony_ci * XPC should be set to 1. 85762306a36Sopenharmony_ci */ 85862306a36Sopenharmony_ci max_current = sd_get_host_max_current(host); 85962306a36Sopenharmony_ci if (max_current > 150) 86062306a36Sopenharmony_ci ocr |= SD_OCR_XPC; 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci err = mmc_send_app_op_cond(host, ocr, rocr); 86362306a36Sopenharmony_ci if (err) 86462306a36Sopenharmony_ci return err; 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_ci /* 86762306a36Sopenharmony_ci * In case the S18A bit is set in the response, let's start the signal 86862306a36Sopenharmony_ci * voltage switch procedure. SPI mode doesn't support CMD11. 86962306a36Sopenharmony_ci * Note that, according to the spec, the S18A bit is not valid unless 87062306a36Sopenharmony_ci * the CCS bit is set as well. We deliberately deviate from the spec in 87162306a36Sopenharmony_ci * regards to this, which allows UHS-I to be supported for SDSC cards. 87262306a36Sopenharmony_ci */ 87362306a36Sopenharmony_ci if (!mmc_host_is_spi(host) && (ocr & SD_OCR_S18R) && 87462306a36Sopenharmony_ci rocr && (*rocr & SD_ROCR_S18A)) { 87562306a36Sopenharmony_ci err = mmc_set_uhs_voltage(host, pocr); 87662306a36Sopenharmony_ci if (err == -EAGAIN) { 87762306a36Sopenharmony_ci retries--; 87862306a36Sopenharmony_ci goto try_again; 87962306a36Sopenharmony_ci } else if (err) { 88062306a36Sopenharmony_ci retries = 0; 88162306a36Sopenharmony_ci goto try_again; 88262306a36Sopenharmony_ci } 88362306a36Sopenharmony_ci } 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci err = mmc_send_cid(host, cid); 88662306a36Sopenharmony_ci return err; 88762306a36Sopenharmony_ci} 88862306a36Sopenharmony_ci 88962306a36Sopenharmony_ciint mmc_sd_get_csd(struct mmc_card *card) 89062306a36Sopenharmony_ci{ 89162306a36Sopenharmony_ci int err; 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_ci /* 89462306a36Sopenharmony_ci * Fetch CSD from card. 89562306a36Sopenharmony_ci */ 89662306a36Sopenharmony_ci err = mmc_send_csd(card, card->raw_csd); 89762306a36Sopenharmony_ci if (err) 89862306a36Sopenharmony_ci return err; 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci err = mmc_decode_csd(card); 90162306a36Sopenharmony_ci if (err) 90262306a36Sopenharmony_ci return err; 90362306a36Sopenharmony_ci 90462306a36Sopenharmony_ci return 0; 90562306a36Sopenharmony_ci} 90662306a36Sopenharmony_ci 90762306a36Sopenharmony_cistatic int mmc_sd_get_ro(struct mmc_host *host) 90862306a36Sopenharmony_ci{ 90962306a36Sopenharmony_ci int ro; 91062306a36Sopenharmony_ci 91162306a36Sopenharmony_ci /* 91262306a36Sopenharmony_ci * Some systems don't feature a write-protect pin and don't need one. 91362306a36Sopenharmony_ci * E.g. because they only have micro-SD card slot. For those systems 91462306a36Sopenharmony_ci * assume that the SD card is always read-write. 91562306a36Sopenharmony_ci */ 91662306a36Sopenharmony_ci if (host->caps2 & MMC_CAP2_NO_WRITE_PROTECT) 91762306a36Sopenharmony_ci return 0; 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_ci if (!host->ops->get_ro) 92062306a36Sopenharmony_ci return -1; 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_ci ro = host->ops->get_ro(host); 92362306a36Sopenharmony_ci 92462306a36Sopenharmony_ci return ro; 92562306a36Sopenharmony_ci} 92662306a36Sopenharmony_ci 92762306a36Sopenharmony_ciint mmc_sd_setup_card(struct mmc_host *host, struct mmc_card *card, 92862306a36Sopenharmony_ci bool reinit) 92962306a36Sopenharmony_ci{ 93062306a36Sopenharmony_ci int err; 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ci if (!reinit) { 93362306a36Sopenharmony_ci /* 93462306a36Sopenharmony_ci * Fetch SCR from card. 93562306a36Sopenharmony_ci */ 93662306a36Sopenharmony_ci err = mmc_app_send_scr(card); 93762306a36Sopenharmony_ci if (err) 93862306a36Sopenharmony_ci return err; 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_ci err = mmc_decode_scr(card); 94162306a36Sopenharmony_ci if (err) 94262306a36Sopenharmony_ci return err; 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_ci /* 94562306a36Sopenharmony_ci * Fetch and process SD Status register. 94662306a36Sopenharmony_ci */ 94762306a36Sopenharmony_ci err = mmc_read_ssr(card); 94862306a36Sopenharmony_ci if (err) 94962306a36Sopenharmony_ci return err; 95062306a36Sopenharmony_ci 95162306a36Sopenharmony_ci /* Erase init depends on CSD and SSR */ 95262306a36Sopenharmony_ci mmc_init_erase(card); 95362306a36Sopenharmony_ci } 95462306a36Sopenharmony_ci 95562306a36Sopenharmony_ci /* 95662306a36Sopenharmony_ci * Fetch switch information from card. Note, sd3_bus_mode can change if 95762306a36Sopenharmony_ci * voltage switch outcome changes, so do this always. 95862306a36Sopenharmony_ci */ 95962306a36Sopenharmony_ci err = mmc_read_switch(card); 96062306a36Sopenharmony_ci if (err) 96162306a36Sopenharmony_ci return err; 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci /* 96462306a36Sopenharmony_ci * For SPI, enable CRC as appropriate. 96562306a36Sopenharmony_ci * This CRC enable is located AFTER the reading of the 96662306a36Sopenharmony_ci * card registers because some SDHC cards are not able 96762306a36Sopenharmony_ci * to provide valid CRCs for non-512-byte blocks. 96862306a36Sopenharmony_ci */ 96962306a36Sopenharmony_ci if (mmc_host_is_spi(host)) { 97062306a36Sopenharmony_ci err = mmc_spi_set_crc(host, use_spi_crc); 97162306a36Sopenharmony_ci if (err) 97262306a36Sopenharmony_ci return err; 97362306a36Sopenharmony_ci } 97462306a36Sopenharmony_ci 97562306a36Sopenharmony_ci /* 97662306a36Sopenharmony_ci * Check if read-only switch is active. 97762306a36Sopenharmony_ci */ 97862306a36Sopenharmony_ci if (!reinit) { 97962306a36Sopenharmony_ci int ro = mmc_sd_get_ro(host); 98062306a36Sopenharmony_ci 98162306a36Sopenharmony_ci if (ro < 0) { 98262306a36Sopenharmony_ci pr_warn("%s: host does not support reading read-only switch, assuming write-enable\n", 98362306a36Sopenharmony_ci mmc_hostname(host)); 98462306a36Sopenharmony_ci } else if (ro > 0) { 98562306a36Sopenharmony_ci mmc_card_set_readonly(card); 98662306a36Sopenharmony_ci } 98762306a36Sopenharmony_ci } 98862306a36Sopenharmony_ci 98962306a36Sopenharmony_ci return 0; 99062306a36Sopenharmony_ci} 99162306a36Sopenharmony_ci 99262306a36Sopenharmony_ciunsigned mmc_sd_get_max_clock(struct mmc_card *card) 99362306a36Sopenharmony_ci{ 99462306a36Sopenharmony_ci unsigned max_dtr = (unsigned int)-1; 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ci if (mmc_card_hs(card)) { 99762306a36Sopenharmony_ci if (max_dtr > card->sw_caps.hs_max_dtr) 99862306a36Sopenharmony_ci max_dtr = card->sw_caps.hs_max_dtr; 99962306a36Sopenharmony_ci } else if (max_dtr > card->csd.max_dtr) { 100062306a36Sopenharmony_ci max_dtr = card->csd.max_dtr; 100162306a36Sopenharmony_ci } 100262306a36Sopenharmony_ci 100362306a36Sopenharmony_ci return max_dtr; 100462306a36Sopenharmony_ci} 100562306a36Sopenharmony_ci 100662306a36Sopenharmony_cistatic bool mmc_sd_card_using_v18(struct mmc_card *card) 100762306a36Sopenharmony_ci{ 100862306a36Sopenharmony_ci /* 100962306a36Sopenharmony_ci * According to the SD spec., the Bus Speed Mode (function group 1) bits 101062306a36Sopenharmony_ci * 2 to 4 are zero if the card is initialized at 3.3V signal level. Thus 101162306a36Sopenharmony_ci * they can be used to determine if the card has already switched to 101262306a36Sopenharmony_ci * 1.8V signaling. 101362306a36Sopenharmony_ci */ 101462306a36Sopenharmony_ci return card->sw_caps.sd3_bus_mode & 101562306a36Sopenharmony_ci (SD_MODE_UHS_SDR50 | SD_MODE_UHS_SDR104 | SD_MODE_UHS_DDR50); 101662306a36Sopenharmony_ci} 101762306a36Sopenharmony_ci 101862306a36Sopenharmony_cistatic int sd_write_ext_reg(struct mmc_card *card, u8 fno, u8 page, u16 offset, 101962306a36Sopenharmony_ci u8 reg_data) 102062306a36Sopenharmony_ci{ 102162306a36Sopenharmony_ci struct mmc_host *host = card->host; 102262306a36Sopenharmony_ci struct mmc_request mrq = {}; 102362306a36Sopenharmony_ci struct mmc_command cmd = {}; 102462306a36Sopenharmony_ci struct mmc_data data = {}; 102562306a36Sopenharmony_ci struct scatterlist sg; 102662306a36Sopenharmony_ci u8 *reg_buf; 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_ci reg_buf = kzalloc(512, GFP_KERNEL); 102962306a36Sopenharmony_ci if (!reg_buf) 103062306a36Sopenharmony_ci return -ENOMEM; 103162306a36Sopenharmony_ci 103262306a36Sopenharmony_ci mrq.cmd = &cmd; 103362306a36Sopenharmony_ci mrq.data = &data; 103462306a36Sopenharmony_ci 103562306a36Sopenharmony_ci /* 103662306a36Sopenharmony_ci * Arguments of CMD49: 103762306a36Sopenharmony_ci * [31:31] MIO (0 = memory). 103862306a36Sopenharmony_ci * [30:27] FNO (function number). 103962306a36Sopenharmony_ci * [26:26] MW - mask write mode (0 = disable). 104062306a36Sopenharmony_ci * [25:18] page number. 104162306a36Sopenharmony_ci * [17:9] offset address. 104262306a36Sopenharmony_ci * [8:0] length (0 = 1 byte). 104362306a36Sopenharmony_ci */ 104462306a36Sopenharmony_ci cmd.arg = fno << 27 | page << 18 | offset << 9; 104562306a36Sopenharmony_ci 104662306a36Sopenharmony_ci /* The first byte in the buffer is the data to be written. */ 104762306a36Sopenharmony_ci reg_buf[0] = reg_data; 104862306a36Sopenharmony_ci 104962306a36Sopenharmony_ci data.flags = MMC_DATA_WRITE; 105062306a36Sopenharmony_ci data.blksz = 512; 105162306a36Sopenharmony_ci data.blocks = 1; 105262306a36Sopenharmony_ci data.sg = &sg; 105362306a36Sopenharmony_ci data.sg_len = 1; 105462306a36Sopenharmony_ci sg_init_one(&sg, reg_buf, 512); 105562306a36Sopenharmony_ci 105662306a36Sopenharmony_ci cmd.opcode = SD_WRITE_EXTR_SINGLE; 105762306a36Sopenharmony_ci cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; 105862306a36Sopenharmony_ci 105962306a36Sopenharmony_ci mmc_set_data_timeout(&data, card); 106062306a36Sopenharmony_ci mmc_wait_for_req(host, &mrq); 106162306a36Sopenharmony_ci 106262306a36Sopenharmony_ci kfree(reg_buf); 106362306a36Sopenharmony_ci 106462306a36Sopenharmony_ci /* 106562306a36Sopenharmony_ci * Note that, the SD card is allowed to signal busy on DAT0 up to 1s 106662306a36Sopenharmony_ci * after the CMD49. Although, let's leave this to be managed by the 106762306a36Sopenharmony_ci * caller. 106862306a36Sopenharmony_ci */ 106962306a36Sopenharmony_ci 107062306a36Sopenharmony_ci if (cmd.error) 107162306a36Sopenharmony_ci return cmd.error; 107262306a36Sopenharmony_ci if (data.error) 107362306a36Sopenharmony_ci return data.error; 107462306a36Sopenharmony_ci 107562306a36Sopenharmony_ci return 0; 107662306a36Sopenharmony_ci} 107762306a36Sopenharmony_ci 107862306a36Sopenharmony_cistatic int sd_read_ext_reg(struct mmc_card *card, u8 fno, u8 page, 107962306a36Sopenharmony_ci u16 offset, u16 len, u8 *reg_buf) 108062306a36Sopenharmony_ci{ 108162306a36Sopenharmony_ci u32 cmd_args; 108262306a36Sopenharmony_ci 108362306a36Sopenharmony_ci /* 108462306a36Sopenharmony_ci * Command arguments of CMD48: 108562306a36Sopenharmony_ci * [31:31] MIO (0 = memory). 108662306a36Sopenharmony_ci * [30:27] FNO (function number). 108762306a36Sopenharmony_ci * [26:26] reserved (0). 108862306a36Sopenharmony_ci * [25:18] page number. 108962306a36Sopenharmony_ci * [17:9] offset address. 109062306a36Sopenharmony_ci * [8:0] length (0 = 1 byte, 1ff = 512 bytes). 109162306a36Sopenharmony_ci */ 109262306a36Sopenharmony_ci cmd_args = fno << 27 | page << 18 | offset << 9 | (len -1); 109362306a36Sopenharmony_ci 109462306a36Sopenharmony_ci return mmc_send_adtc_data(card, card->host, SD_READ_EXTR_SINGLE, 109562306a36Sopenharmony_ci cmd_args, reg_buf, 512); 109662306a36Sopenharmony_ci} 109762306a36Sopenharmony_ci 109862306a36Sopenharmony_cistatic int sd_parse_ext_reg_power(struct mmc_card *card, u8 fno, u8 page, 109962306a36Sopenharmony_ci u16 offset) 110062306a36Sopenharmony_ci{ 110162306a36Sopenharmony_ci int err; 110262306a36Sopenharmony_ci u8 *reg_buf; 110362306a36Sopenharmony_ci 110462306a36Sopenharmony_ci reg_buf = kzalloc(512, GFP_KERNEL); 110562306a36Sopenharmony_ci if (!reg_buf) 110662306a36Sopenharmony_ci return -ENOMEM; 110762306a36Sopenharmony_ci 110862306a36Sopenharmony_ci /* Read the extension register for power management function. */ 110962306a36Sopenharmony_ci err = sd_read_ext_reg(card, fno, page, offset, 512, reg_buf); 111062306a36Sopenharmony_ci if (err) { 111162306a36Sopenharmony_ci pr_warn("%s: error %d reading PM func of ext reg\n", 111262306a36Sopenharmony_ci mmc_hostname(card->host), err); 111362306a36Sopenharmony_ci goto out; 111462306a36Sopenharmony_ci } 111562306a36Sopenharmony_ci 111662306a36Sopenharmony_ci /* PM revision consists of 4 bits. */ 111762306a36Sopenharmony_ci card->ext_power.rev = reg_buf[0] & 0xf; 111862306a36Sopenharmony_ci 111962306a36Sopenharmony_ci /* Power Off Notification support at bit 4. */ 112062306a36Sopenharmony_ci if (reg_buf[1] & BIT(4)) 112162306a36Sopenharmony_ci card->ext_power.feature_support |= SD_EXT_POWER_OFF_NOTIFY; 112262306a36Sopenharmony_ci 112362306a36Sopenharmony_ci /* Power Sustenance support at bit 5. */ 112462306a36Sopenharmony_ci if (reg_buf[1] & BIT(5)) 112562306a36Sopenharmony_ci card->ext_power.feature_support |= SD_EXT_POWER_SUSTENANCE; 112662306a36Sopenharmony_ci 112762306a36Sopenharmony_ci /* Power Down Mode support at bit 6. */ 112862306a36Sopenharmony_ci if (reg_buf[1] & BIT(6)) 112962306a36Sopenharmony_ci card->ext_power.feature_support |= SD_EXT_POWER_DOWN_MODE; 113062306a36Sopenharmony_ci 113162306a36Sopenharmony_ci card->ext_power.fno = fno; 113262306a36Sopenharmony_ci card->ext_power.page = page; 113362306a36Sopenharmony_ci card->ext_power.offset = offset; 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_ciout: 113662306a36Sopenharmony_ci kfree(reg_buf); 113762306a36Sopenharmony_ci return err; 113862306a36Sopenharmony_ci} 113962306a36Sopenharmony_ci 114062306a36Sopenharmony_cistatic int sd_parse_ext_reg_perf(struct mmc_card *card, u8 fno, u8 page, 114162306a36Sopenharmony_ci u16 offset) 114262306a36Sopenharmony_ci{ 114362306a36Sopenharmony_ci int err; 114462306a36Sopenharmony_ci u8 *reg_buf; 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ci reg_buf = kzalloc(512, GFP_KERNEL); 114762306a36Sopenharmony_ci if (!reg_buf) 114862306a36Sopenharmony_ci return -ENOMEM; 114962306a36Sopenharmony_ci 115062306a36Sopenharmony_ci err = sd_read_ext_reg(card, fno, page, offset, 512, reg_buf); 115162306a36Sopenharmony_ci if (err) { 115262306a36Sopenharmony_ci pr_warn("%s: error %d reading PERF func of ext reg\n", 115362306a36Sopenharmony_ci mmc_hostname(card->host), err); 115462306a36Sopenharmony_ci goto out; 115562306a36Sopenharmony_ci } 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci /* PERF revision. */ 115862306a36Sopenharmony_ci card->ext_perf.rev = reg_buf[0]; 115962306a36Sopenharmony_ci 116062306a36Sopenharmony_ci /* FX_EVENT support at bit 0. */ 116162306a36Sopenharmony_ci if (reg_buf[1] & BIT(0)) 116262306a36Sopenharmony_ci card->ext_perf.feature_support |= SD_EXT_PERF_FX_EVENT; 116362306a36Sopenharmony_ci 116462306a36Sopenharmony_ci /* Card initiated self-maintenance support at bit 0. */ 116562306a36Sopenharmony_ci if (reg_buf[2] & BIT(0)) 116662306a36Sopenharmony_ci card->ext_perf.feature_support |= SD_EXT_PERF_CARD_MAINT; 116762306a36Sopenharmony_ci 116862306a36Sopenharmony_ci /* Host initiated self-maintenance support at bit 1. */ 116962306a36Sopenharmony_ci if (reg_buf[2] & BIT(1)) 117062306a36Sopenharmony_ci card->ext_perf.feature_support |= SD_EXT_PERF_HOST_MAINT; 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci /* Cache support at bit 0. */ 117362306a36Sopenharmony_ci if ((reg_buf[4] & BIT(0)) && !mmc_card_broken_sd_cache(card)) 117462306a36Sopenharmony_ci card->ext_perf.feature_support |= SD_EXT_PERF_CACHE; 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_ci /* Command queue support indicated via queue depth bits (0 to 4). */ 117762306a36Sopenharmony_ci if (reg_buf[6] & 0x1f) 117862306a36Sopenharmony_ci card->ext_perf.feature_support |= SD_EXT_PERF_CMD_QUEUE; 117962306a36Sopenharmony_ci 118062306a36Sopenharmony_ci card->ext_perf.fno = fno; 118162306a36Sopenharmony_ci card->ext_perf.page = page; 118262306a36Sopenharmony_ci card->ext_perf.offset = offset; 118362306a36Sopenharmony_ci 118462306a36Sopenharmony_ciout: 118562306a36Sopenharmony_ci kfree(reg_buf); 118662306a36Sopenharmony_ci return err; 118762306a36Sopenharmony_ci} 118862306a36Sopenharmony_ci 118962306a36Sopenharmony_cistatic int sd_parse_ext_reg(struct mmc_card *card, u8 *gen_info_buf, 119062306a36Sopenharmony_ci u16 *next_ext_addr) 119162306a36Sopenharmony_ci{ 119262306a36Sopenharmony_ci u8 num_regs, fno, page; 119362306a36Sopenharmony_ci u16 sfc, offset, ext = *next_ext_addr; 119462306a36Sopenharmony_ci u32 reg_addr; 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_ci /* 119762306a36Sopenharmony_ci * Parse only one register set per extension, as that is sufficient to 119862306a36Sopenharmony_ci * support the standard functions. This means another 48 bytes in the 119962306a36Sopenharmony_ci * buffer must be available. 120062306a36Sopenharmony_ci */ 120162306a36Sopenharmony_ci if (ext + 48 > 512) 120262306a36Sopenharmony_ci return -EFAULT; 120362306a36Sopenharmony_ci 120462306a36Sopenharmony_ci /* Standard Function Code */ 120562306a36Sopenharmony_ci memcpy(&sfc, &gen_info_buf[ext], 2); 120662306a36Sopenharmony_ci 120762306a36Sopenharmony_ci /* Address to the next extension. */ 120862306a36Sopenharmony_ci memcpy(next_ext_addr, &gen_info_buf[ext + 40], 2); 120962306a36Sopenharmony_ci 121062306a36Sopenharmony_ci /* Number of registers for this extension. */ 121162306a36Sopenharmony_ci num_regs = gen_info_buf[ext + 42]; 121262306a36Sopenharmony_ci 121362306a36Sopenharmony_ci /* We support only one register per extension. */ 121462306a36Sopenharmony_ci if (num_regs != 1) 121562306a36Sopenharmony_ci return 0; 121662306a36Sopenharmony_ci 121762306a36Sopenharmony_ci /* Extension register address. */ 121862306a36Sopenharmony_ci memcpy(®_addr, &gen_info_buf[ext + 44], 4); 121962306a36Sopenharmony_ci 122062306a36Sopenharmony_ci /* 9 bits (0 to 8) contains the offset address. */ 122162306a36Sopenharmony_ci offset = reg_addr & 0x1ff; 122262306a36Sopenharmony_ci 122362306a36Sopenharmony_ci /* 8 bits (9 to 16) contains the page number. */ 122462306a36Sopenharmony_ci page = reg_addr >> 9 & 0xff ; 122562306a36Sopenharmony_ci 122662306a36Sopenharmony_ci /* 4 bits (18 to 21) contains the function number. */ 122762306a36Sopenharmony_ci fno = reg_addr >> 18 & 0xf; 122862306a36Sopenharmony_ci 122962306a36Sopenharmony_ci /* Standard Function Code for power management. */ 123062306a36Sopenharmony_ci if (sfc == 0x1) 123162306a36Sopenharmony_ci return sd_parse_ext_reg_power(card, fno, page, offset); 123262306a36Sopenharmony_ci 123362306a36Sopenharmony_ci /* Standard Function Code for performance enhancement. */ 123462306a36Sopenharmony_ci if (sfc == 0x2) 123562306a36Sopenharmony_ci return sd_parse_ext_reg_perf(card, fno, page, offset); 123662306a36Sopenharmony_ci 123762306a36Sopenharmony_ci return 0; 123862306a36Sopenharmony_ci} 123962306a36Sopenharmony_ci 124062306a36Sopenharmony_cistatic int sd_read_ext_regs(struct mmc_card *card) 124162306a36Sopenharmony_ci{ 124262306a36Sopenharmony_ci int err, i; 124362306a36Sopenharmony_ci u8 num_ext, *gen_info_buf; 124462306a36Sopenharmony_ci u16 rev, len, next_ext_addr; 124562306a36Sopenharmony_ci 124662306a36Sopenharmony_ci if (mmc_host_is_spi(card->host)) 124762306a36Sopenharmony_ci return 0; 124862306a36Sopenharmony_ci 124962306a36Sopenharmony_ci if (!(card->scr.cmds & SD_SCR_CMD48_SUPPORT)) 125062306a36Sopenharmony_ci return 0; 125162306a36Sopenharmony_ci 125262306a36Sopenharmony_ci gen_info_buf = kzalloc(512, GFP_KERNEL); 125362306a36Sopenharmony_ci if (!gen_info_buf) 125462306a36Sopenharmony_ci return -ENOMEM; 125562306a36Sopenharmony_ci 125662306a36Sopenharmony_ci /* 125762306a36Sopenharmony_ci * Read 512 bytes of general info, which is found at function number 0, 125862306a36Sopenharmony_ci * at page 0 and with no offset. 125962306a36Sopenharmony_ci */ 126062306a36Sopenharmony_ci err = sd_read_ext_reg(card, 0, 0, 0, 512, gen_info_buf); 126162306a36Sopenharmony_ci if (err) { 126262306a36Sopenharmony_ci pr_err("%s: error %d reading general info of SD ext reg\n", 126362306a36Sopenharmony_ci mmc_hostname(card->host), err); 126462306a36Sopenharmony_ci goto out; 126562306a36Sopenharmony_ci } 126662306a36Sopenharmony_ci 126762306a36Sopenharmony_ci /* General info structure revision. */ 126862306a36Sopenharmony_ci memcpy(&rev, &gen_info_buf[0], 2); 126962306a36Sopenharmony_ci 127062306a36Sopenharmony_ci /* Length of general info in bytes. */ 127162306a36Sopenharmony_ci memcpy(&len, &gen_info_buf[2], 2); 127262306a36Sopenharmony_ci 127362306a36Sopenharmony_ci /* Number of extensions to be find. */ 127462306a36Sopenharmony_ci num_ext = gen_info_buf[4]; 127562306a36Sopenharmony_ci 127662306a36Sopenharmony_ci /* 127762306a36Sopenharmony_ci * We only support revision 0 and limit it to 512 bytes for simplicity. 127862306a36Sopenharmony_ci * No matter what, let's return zero to allow us to continue using the 127962306a36Sopenharmony_ci * card, even if we can't support the features from the SD function 128062306a36Sopenharmony_ci * extensions registers. 128162306a36Sopenharmony_ci */ 128262306a36Sopenharmony_ci if (rev != 0 || len > 512) { 128362306a36Sopenharmony_ci pr_warn("%s: non-supported SD ext reg layout\n", 128462306a36Sopenharmony_ci mmc_hostname(card->host)); 128562306a36Sopenharmony_ci goto out; 128662306a36Sopenharmony_ci } 128762306a36Sopenharmony_ci 128862306a36Sopenharmony_ci /* 128962306a36Sopenharmony_ci * Parse the extension registers. The first extension should start 129062306a36Sopenharmony_ci * immediately after the general info header (16 bytes). 129162306a36Sopenharmony_ci */ 129262306a36Sopenharmony_ci next_ext_addr = 16; 129362306a36Sopenharmony_ci for (i = 0; i < num_ext; i++) { 129462306a36Sopenharmony_ci err = sd_parse_ext_reg(card, gen_info_buf, &next_ext_addr); 129562306a36Sopenharmony_ci if (err) { 129662306a36Sopenharmony_ci pr_err("%s: error %d parsing SD ext reg\n", 129762306a36Sopenharmony_ci mmc_hostname(card->host), err); 129862306a36Sopenharmony_ci goto out; 129962306a36Sopenharmony_ci } 130062306a36Sopenharmony_ci } 130162306a36Sopenharmony_ci 130262306a36Sopenharmony_ciout: 130362306a36Sopenharmony_ci kfree(gen_info_buf); 130462306a36Sopenharmony_ci return err; 130562306a36Sopenharmony_ci} 130662306a36Sopenharmony_ci 130762306a36Sopenharmony_cistatic bool sd_cache_enabled(struct mmc_host *host) 130862306a36Sopenharmony_ci{ 130962306a36Sopenharmony_ci return host->card->ext_perf.feature_enabled & SD_EXT_PERF_CACHE; 131062306a36Sopenharmony_ci} 131162306a36Sopenharmony_ci 131262306a36Sopenharmony_cistatic int sd_flush_cache(struct mmc_host *host) 131362306a36Sopenharmony_ci{ 131462306a36Sopenharmony_ci struct mmc_card *card = host->card; 131562306a36Sopenharmony_ci u8 *reg_buf, fno, page; 131662306a36Sopenharmony_ci u16 offset; 131762306a36Sopenharmony_ci int err; 131862306a36Sopenharmony_ci 131962306a36Sopenharmony_ci if (!sd_cache_enabled(host)) 132062306a36Sopenharmony_ci return 0; 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci reg_buf = kzalloc(512, GFP_KERNEL); 132362306a36Sopenharmony_ci if (!reg_buf) 132462306a36Sopenharmony_ci return -ENOMEM; 132562306a36Sopenharmony_ci 132662306a36Sopenharmony_ci /* 132762306a36Sopenharmony_ci * Set Flush Cache at bit 0 in the performance enhancement register at 132862306a36Sopenharmony_ci * 261 bytes offset. 132962306a36Sopenharmony_ci */ 133062306a36Sopenharmony_ci fno = card->ext_perf.fno; 133162306a36Sopenharmony_ci page = card->ext_perf.page; 133262306a36Sopenharmony_ci offset = card->ext_perf.offset + 261; 133362306a36Sopenharmony_ci 133462306a36Sopenharmony_ci err = sd_write_ext_reg(card, fno, page, offset, BIT(0)); 133562306a36Sopenharmony_ci if (err) { 133662306a36Sopenharmony_ci pr_warn("%s: error %d writing Cache Flush bit\n", 133762306a36Sopenharmony_ci mmc_hostname(host), err); 133862306a36Sopenharmony_ci goto out; 133962306a36Sopenharmony_ci } 134062306a36Sopenharmony_ci 134162306a36Sopenharmony_ci err = mmc_poll_for_busy(card, SD_WRITE_EXTR_SINGLE_TIMEOUT_MS, false, 134262306a36Sopenharmony_ci MMC_BUSY_EXTR_SINGLE); 134362306a36Sopenharmony_ci if (err) 134462306a36Sopenharmony_ci goto out; 134562306a36Sopenharmony_ci 134662306a36Sopenharmony_ci /* 134762306a36Sopenharmony_ci * Read the Flush Cache bit. The card shall reset it, to confirm that 134862306a36Sopenharmony_ci * it's has completed the flushing of the cache. 134962306a36Sopenharmony_ci */ 135062306a36Sopenharmony_ci err = sd_read_ext_reg(card, fno, page, offset, 1, reg_buf); 135162306a36Sopenharmony_ci if (err) { 135262306a36Sopenharmony_ci pr_warn("%s: error %d reading Cache Flush bit\n", 135362306a36Sopenharmony_ci mmc_hostname(host), err); 135462306a36Sopenharmony_ci goto out; 135562306a36Sopenharmony_ci } 135662306a36Sopenharmony_ci 135762306a36Sopenharmony_ci if (reg_buf[0] & BIT(0)) 135862306a36Sopenharmony_ci err = -ETIMEDOUT; 135962306a36Sopenharmony_ciout: 136062306a36Sopenharmony_ci kfree(reg_buf); 136162306a36Sopenharmony_ci return err; 136262306a36Sopenharmony_ci} 136362306a36Sopenharmony_ci 136462306a36Sopenharmony_cistatic int sd_enable_cache(struct mmc_card *card) 136562306a36Sopenharmony_ci{ 136662306a36Sopenharmony_ci u8 *reg_buf; 136762306a36Sopenharmony_ci int err; 136862306a36Sopenharmony_ci 136962306a36Sopenharmony_ci card->ext_perf.feature_enabled &= ~SD_EXT_PERF_CACHE; 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_ci reg_buf = kzalloc(512, GFP_KERNEL); 137262306a36Sopenharmony_ci if (!reg_buf) 137362306a36Sopenharmony_ci return -ENOMEM; 137462306a36Sopenharmony_ci 137562306a36Sopenharmony_ci /* 137662306a36Sopenharmony_ci * Set Cache Enable at bit 0 in the performance enhancement register at 137762306a36Sopenharmony_ci * 260 bytes offset. 137862306a36Sopenharmony_ci */ 137962306a36Sopenharmony_ci err = sd_write_ext_reg(card, card->ext_perf.fno, card->ext_perf.page, 138062306a36Sopenharmony_ci card->ext_perf.offset + 260, BIT(0)); 138162306a36Sopenharmony_ci if (err) { 138262306a36Sopenharmony_ci pr_warn("%s: error %d writing Cache Enable bit\n", 138362306a36Sopenharmony_ci mmc_hostname(card->host), err); 138462306a36Sopenharmony_ci goto out; 138562306a36Sopenharmony_ci } 138662306a36Sopenharmony_ci 138762306a36Sopenharmony_ci err = mmc_poll_for_busy(card, SD_WRITE_EXTR_SINGLE_TIMEOUT_MS, false, 138862306a36Sopenharmony_ci MMC_BUSY_EXTR_SINGLE); 138962306a36Sopenharmony_ci if (!err) 139062306a36Sopenharmony_ci card->ext_perf.feature_enabled |= SD_EXT_PERF_CACHE; 139162306a36Sopenharmony_ci 139262306a36Sopenharmony_ciout: 139362306a36Sopenharmony_ci kfree(reg_buf); 139462306a36Sopenharmony_ci return err; 139562306a36Sopenharmony_ci} 139662306a36Sopenharmony_ci 139762306a36Sopenharmony_ci/* 139862306a36Sopenharmony_ci * Handle the detection and initialisation of a card. 139962306a36Sopenharmony_ci * 140062306a36Sopenharmony_ci * In the case of a resume, "oldcard" will contain the card 140162306a36Sopenharmony_ci * we're trying to reinitialise. 140262306a36Sopenharmony_ci */ 140362306a36Sopenharmony_cistatic int mmc_sd_init_card(struct mmc_host *host, u32 ocr, 140462306a36Sopenharmony_ci struct mmc_card *oldcard) 140562306a36Sopenharmony_ci{ 140662306a36Sopenharmony_ci struct mmc_card *card; 140762306a36Sopenharmony_ci int err; 140862306a36Sopenharmony_ci u32 cid[4]; 140962306a36Sopenharmony_ci u32 rocr = 0; 141062306a36Sopenharmony_ci bool v18_fixup_failed = false; 141162306a36Sopenharmony_ci 141262306a36Sopenharmony_ci WARN_ON(!host->claimed); 141362306a36Sopenharmony_ciretry: 141462306a36Sopenharmony_ci err = mmc_sd_get_cid(host, ocr, cid, &rocr); 141562306a36Sopenharmony_ci if (err) 141662306a36Sopenharmony_ci return err; 141762306a36Sopenharmony_ci 141862306a36Sopenharmony_ci if (oldcard) { 141962306a36Sopenharmony_ci if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) { 142062306a36Sopenharmony_ci pr_debug("%s: Perhaps the card was replaced\n", 142162306a36Sopenharmony_ci mmc_hostname(host)); 142262306a36Sopenharmony_ci return -ENOENT; 142362306a36Sopenharmony_ci } 142462306a36Sopenharmony_ci 142562306a36Sopenharmony_ci card = oldcard; 142662306a36Sopenharmony_ci } else { 142762306a36Sopenharmony_ci /* 142862306a36Sopenharmony_ci * Allocate card structure. 142962306a36Sopenharmony_ci */ 143062306a36Sopenharmony_ci card = mmc_alloc_card(host, &sd_type); 143162306a36Sopenharmony_ci if (IS_ERR(card)) 143262306a36Sopenharmony_ci return PTR_ERR(card); 143362306a36Sopenharmony_ci 143462306a36Sopenharmony_ci card->ocr = ocr; 143562306a36Sopenharmony_ci card->type = MMC_TYPE_SD; 143662306a36Sopenharmony_ci memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); 143762306a36Sopenharmony_ci } 143862306a36Sopenharmony_ci 143962306a36Sopenharmony_ci /* 144062306a36Sopenharmony_ci * Call the optional HC's init_card function to handle quirks. 144162306a36Sopenharmony_ci */ 144262306a36Sopenharmony_ci if (host->ops->init_card) 144362306a36Sopenharmony_ci host->ops->init_card(host, card); 144462306a36Sopenharmony_ci 144562306a36Sopenharmony_ci /* 144662306a36Sopenharmony_ci * For native busses: get card RCA and quit open drain mode. 144762306a36Sopenharmony_ci */ 144862306a36Sopenharmony_ci if (!mmc_host_is_spi(host)) { 144962306a36Sopenharmony_ci err = mmc_send_relative_addr(host, &card->rca); 145062306a36Sopenharmony_ci if (err) 145162306a36Sopenharmony_ci goto free_card; 145262306a36Sopenharmony_ci } 145362306a36Sopenharmony_ci 145462306a36Sopenharmony_ci if (!oldcard) { 145562306a36Sopenharmony_ci err = mmc_sd_get_csd(card); 145662306a36Sopenharmony_ci if (err) 145762306a36Sopenharmony_ci goto free_card; 145862306a36Sopenharmony_ci 145962306a36Sopenharmony_ci mmc_decode_cid(card); 146062306a36Sopenharmony_ci } 146162306a36Sopenharmony_ci 146262306a36Sopenharmony_ci /* 146362306a36Sopenharmony_ci * handling only for cards supporting DSR and hosts requesting 146462306a36Sopenharmony_ci * DSR configuration 146562306a36Sopenharmony_ci */ 146662306a36Sopenharmony_ci if (card->csd.dsr_imp && host->dsr_req) 146762306a36Sopenharmony_ci mmc_set_dsr(host); 146862306a36Sopenharmony_ci 146962306a36Sopenharmony_ci /* 147062306a36Sopenharmony_ci * Select card, as all following commands rely on that. 147162306a36Sopenharmony_ci */ 147262306a36Sopenharmony_ci if (!mmc_host_is_spi(host)) { 147362306a36Sopenharmony_ci err = mmc_select_card(card); 147462306a36Sopenharmony_ci if (err) 147562306a36Sopenharmony_ci goto free_card; 147662306a36Sopenharmony_ci } 147762306a36Sopenharmony_ci 147862306a36Sopenharmony_ci err = mmc_sd_setup_card(host, card, oldcard != NULL); 147962306a36Sopenharmony_ci if (err) 148062306a36Sopenharmony_ci goto free_card; 148162306a36Sopenharmony_ci 148262306a36Sopenharmony_ci /* 148362306a36Sopenharmony_ci * If the card has not been power cycled, it may still be using 1.8V 148462306a36Sopenharmony_ci * signaling. Detect that situation and try to initialize a UHS-I (1.8V) 148562306a36Sopenharmony_ci * transfer mode. 148662306a36Sopenharmony_ci */ 148762306a36Sopenharmony_ci if (!v18_fixup_failed && !mmc_host_is_spi(host) && mmc_host_uhs(host) && 148862306a36Sopenharmony_ci mmc_sd_card_using_v18(card) && 148962306a36Sopenharmony_ci host->ios.signal_voltage != MMC_SIGNAL_VOLTAGE_180) { 149062306a36Sopenharmony_ci if (mmc_host_set_uhs_voltage(host) || 149162306a36Sopenharmony_ci mmc_sd_init_uhs_card(card)) { 149262306a36Sopenharmony_ci v18_fixup_failed = true; 149362306a36Sopenharmony_ci mmc_power_cycle(host, ocr); 149462306a36Sopenharmony_ci if (!oldcard) 149562306a36Sopenharmony_ci mmc_remove_card(card); 149662306a36Sopenharmony_ci goto retry; 149762306a36Sopenharmony_ci } 149862306a36Sopenharmony_ci goto cont; 149962306a36Sopenharmony_ci } 150062306a36Sopenharmony_ci 150162306a36Sopenharmony_ci /* Initialization sequence for UHS-I cards */ 150262306a36Sopenharmony_ci if (rocr & SD_ROCR_S18A && mmc_host_uhs(host)) { 150362306a36Sopenharmony_ci err = mmc_sd_init_uhs_card(card); 150462306a36Sopenharmony_ci if (err) 150562306a36Sopenharmony_ci goto free_card; 150662306a36Sopenharmony_ci } else { 150762306a36Sopenharmony_ci /* 150862306a36Sopenharmony_ci * Attempt to change to high-speed (if supported) 150962306a36Sopenharmony_ci */ 151062306a36Sopenharmony_ci err = mmc_sd_switch_hs(card); 151162306a36Sopenharmony_ci if (err > 0) 151262306a36Sopenharmony_ci mmc_set_timing(card->host, MMC_TIMING_SD_HS); 151362306a36Sopenharmony_ci else if (err) 151462306a36Sopenharmony_ci goto free_card; 151562306a36Sopenharmony_ci 151662306a36Sopenharmony_ci /* 151762306a36Sopenharmony_ci * Set bus speed. 151862306a36Sopenharmony_ci */ 151962306a36Sopenharmony_ci mmc_set_clock(host, mmc_sd_get_max_clock(card)); 152062306a36Sopenharmony_ci 152162306a36Sopenharmony_ci if (host->ios.timing == MMC_TIMING_SD_HS && 152262306a36Sopenharmony_ci host->ops->prepare_sd_hs_tuning) { 152362306a36Sopenharmony_ci err = host->ops->prepare_sd_hs_tuning(host, card); 152462306a36Sopenharmony_ci if (err) 152562306a36Sopenharmony_ci goto free_card; 152662306a36Sopenharmony_ci } 152762306a36Sopenharmony_ci 152862306a36Sopenharmony_ci /* 152962306a36Sopenharmony_ci * Switch to wider bus (if supported). 153062306a36Sopenharmony_ci */ 153162306a36Sopenharmony_ci if ((host->caps & MMC_CAP_4_BIT_DATA) && 153262306a36Sopenharmony_ci (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) { 153362306a36Sopenharmony_ci err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4); 153462306a36Sopenharmony_ci if (err) 153562306a36Sopenharmony_ci goto free_card; 153662306a36Sopenharmony_ci 153762306a36Sopenharmony_ci mmc_set_bus_width(host, MMC_BUS_WIDTH_4); 153862306a36Sopenharmony_ci } 153962306a36Sopenharmony_ci 154062306a36Sopenharmony_ci if (host->ios.timing == MMC_TIMING_SD_HS && 154162306a36Sopenharmony_ci host->ops->execute_sd_hs_tuning) { 154262306a36Sopenharmony_ci err = host->ops->execute_sd_hs_tuning(host, card); 154362306a36Sopenharmony_ci if (err) 154462306a36Sopenharmony_ci goto free_card; 154562306a36Sopenharmony_ci } 154662306a36Sopenharmony_ci } 154762306a36Sopenharmony_cicont: 154862306a36Sopenharmony_ci if (!oldcard) { 154962306a36Sopenharmony_ci /* Read/parse the extension registers. */ 155062306a36Sopenharmony_ci err = sd_read_ext_regs(card); 155162306a36Sopenharmony_ci if (err) 155262306a36Sopenharmony_ci goto free_card; 155362306a36Sopenharmony_ci } 155462306a36Sopenharmony_ci 155562306a36Sopenharmony_ci /* Enable internal SD cache if supported. */ 155662306a36Sopenharmony_ci if (card->ext_perf.feature_support & SD_EXT_PERF_CACHE) { 155762306a36Sopenharmony_ci err = sd_enable_cache(card); 155862306a36Sopenharmony_ci if (err) 155962306a36Sopenharmony_ci goto free_card; 156062306a36Sopenharmony_ci } 156162306a36Sopenharmony_ci 156262306a36Sopenharmony_ci if (host->cqe_ops && !host->cqe_enabled) { 156362306a36Sopenharmony_ci err = host->cqe_ops->cqe_enable(host, card); 156462306a36Sopenharmony_ci if (!err) { 156562306a36Sopenharmony_ci host->cqe_enabled = true; 156662306a36Sopenharmony_ci host->hsq_enabled = true; 156762306a36Sopenharmony_ci pr_info("%s: Host Software Queue enabled\n", 156862306a36Sopenharmony_ci mmc_hostname(host)); 156962306a36Sopenharmony_ci } 157062306a36Sopenharmony_ci } 157162306a36Sopenharmony_ci 157262306a36Sopenharmony_ci if (host->caps2 & MMC_CAP2_AVOID_3_3V && 157362306a36Sopenharmony_ci host->ios.signal_voltage == MMC_SIGNAL_VOLTAGE_330) { 157462306a36Sopenharmony_ci pr_err("%s: Host failed to negotiate down from 3.3V\n", 157562306a36Sopenharmony_ci mmc_hostname(host)); 157662306a36Sopenharmony_ci err = -EINVAL; 157762306a36Sopenharmony_ci goto free_card; 157862306a36Sopenharmony_ci } 157962306a36Sopenharmony_ci 158062306a36Sopenharmony_ci host->card = card; 158162306a36Sopenharmony_ci return 0; 158262306a36Sopenharmony_ci 158362306a36Sopenharmony_cifree_card: 158462306a36Sopenharmony_ci if (!oldcard) 158562306a36Sopenharmony_ci mmc_remove_card(card); 158662306a36Sopenharmony_ci 158762306a36Sopenharmony_ci return err; 158862306a36Sopenharmony_ci} 158962306a36Sopenharmony_ci 159062306a36Sopenharmony_ci/* 159162306a36Sopenharmony_ci * Host is being removed. Free up the current card. 159262306a36Sopenharmony_ci */ 159362306a36Sopenharmony_cistatic void mmc_sd_remove(struct mmc_host *host) 159462306a36Sopenharmony_ci{ 159562306a36Sopenharmony_ci mmc_remove_card(host->card); 159662306a36Sopenharmony_ci host->card = NULL; 159762306a36Sopenharmony_ci} 159862306a36Sopenharmony_ci 159962306a36Sopenharmony_ci/* 160062306a36Sopenharmony_ci * Card detection - card is alive. 160162306a36Sopenharmony_ci */ 160262306a36Sopenharmony_cistatic int mmc_sd_alive(struct mmc_host *host) 160362306a36Sopenharmony_ci{ 160462306a36Sopenharmony_ci return mmc_send_status(host->card, NULL); 160562306a36Sopenharmony_ci} 160662306a36Sopenharmony_ci 160762306a36Sopenharmony_ci/* 160862306a36Sopenharmony_ci * Card detection callback from host. 160962306a36Sopenharmony_ci */ 161062306a36Sopenharmony_cistatic void mmc_sd_detect(struct mmc_host *host) 161162306a36Sopenharmony_ci{ 161262306a36Sopenharmony_ci int err; 161362306a36Sopenharmony_ci 161462306a36Sopenharmony_ci mmc_get_card(host->card, NULL); 161562306a36Sopenharmony_ci 161662306a36Sopenharmony_ci /* 161762306a36Sopenharmony_ci * Just check if our card has been removed. 161862306a36Sopenharmony_ci */ 161962306a36Sopenharmony_ci err = _mmc_detect_card_removed(host); 162062306a36Sopenharmony_ci 162162306a36Sopenharmony_ci mmc_put_card(host->card, NULL); 162262306a36Sopenharmony_ci 162362306a36Sopenharmony_ci if (err) { 162462306a36Sopenharmony_ci mmc_sd_remove(host); 162562306a36Sopenharmony_ci 162662306a36Sopenharmony_ci mmc_claim_host(host); 162762306a36Sopenharmony_ci mmc_detach_bus(host); 162862306a36Sopenharmony_ci mmc_power_off(host); 162962306a36Sopenharmony_ci mmc_release_host(host); 163062306a36Sopenharmony_ci } 163162306a36Sopenharmony_ci} 163262306a36Sopenharmony_ci 163362306a36Sopenharmony_cistatic int sd_can_poweroff_notify(struct mmc_card *card) 163462306a36Sopenharmony_ci{ 163562306a36Sopenharmony_ci return card->ext_power.feature_support & SD_EXT_POWER_OFF_NOTIFY; 163662306a36Sopenharmony_ci} 163762306a36Sopenharmony_ci 163862306a36Sopenharmony_cistatic int sd_busy_poweroff_notify_cb(void *cb_data, bool *busy) 163962306a36Sopenharmony_ci{ 164062306a36Sopenharmony_ci struct sd_busy_data *data = cb_data; 164162306a36Sopenharmony_ci struct mmc_card *card = data->card; 164262306a36Sopenharmony_ci int err; 164362306a36Sopenharmony_ci 164462306a36Sopenharmony_ci /* 164562306a36Sopenharmony_ci * Read the status register for the power management function. It's at 164662306a36Sopenharmony_ci * one byte offset and is one byte long. The Power Off Notification 164762306a36Sopenharmony_ci * Ready is bit 0. 164862306a36Sopenharmony_ci */ 164962306a36Sopenharmony_ci err = sd_read_ext_reg(card, card->ext_power.fno, card->ext_power.page, 165062306a36Sopenharmony_ci card->ext_power.offset + 1, 1, data->reg_buf); 165162306a36Sopenharmony_ci if (err) { 165262306a36Sopenharmony_ci pr_warn("%s: error %d reading status reg of PM func\n", 165362306a36Sopenharmony_ci mmc_hostname(card->host), err); 165462306a36Sopenharmony_ci return err; 165562306a36Sopenharmony_ci } 165662306a36Sopenharmony_ci 165762306a36Sopenharmony_ci *busy = !(data->reg_buf[0] & BIT(0)); 165862306a36Sopenharmony_ci return 0; 165962306a36Sopenharmony_ci} 166062306a36Sopenharmony_ci 166162306a36Sopenharmony_cistatic int sd_poweroff_notify(struct mmc_card *card) 166262306a36Sopenharmony_ci{ 166362306a36Sopenharmony_ci struct sd_busy_data cb_data; 166462306a36Sopenharmony_ci u8 *reg_buf; 166562306a36Sopenharmony_ci int err; 166662306a36Sopenharmony_ci 166762306a36Sopenharmony_ci reg_buf = kzalloc(512, GFP_KERNEL); 166862306a36Sopenharmony_ci if (!reg_buf) 166962306a36Sopenharmony_ci return -ENOMEM; 167062306a36Sopenharmony_ci 167162306a36Sopenharmony_ci /* 167262306a36Sopenharmony_ci * Set the Power Off Notification bit in the power management settings 167362306a36Sopenharmony_ci * register at 2 bytes offset. 167462306a36Sopenharmony_ci */ 167562306a36Sopenharmony_ci err = sd_write_ext_reg(card, card->ext_power.fno, card->ext_power.page, 167662306a36Sopenharmony_ci card->ext_power.offset + 2, BIT(0)); 167762306a36Sopenharmony_ci if (err) { 167862306a36Sopenharmony_ci pr_warn("%s: error %d writing Power Off Notify bit\n", 167962306a36Sopenharmony_ci mmc_hostname(card->host), err); 168062306a36Sopenharmony_ci goto out; 168162306a36Sopenharmony_ci } 168262306a36Sopenharmony_ci 168362306a36Sopenharmony_ci /* Find out when the command is completed. */ 168462306a36Sopenharmony_ci err = mmc_poll_for_busy(card, SD_WRITE_EXTR_SINGLE_TIMEOUT_MS, false, 168562306a36Sopenharmony_ci MMC_BUSY_EXTR_SINGLE); 168662306a36Sopenharmony_ci if (err) 168762306a36Sopenharmony_ci goto out; 168862306a36Sopenharmony_ci 168962306a36Sopenharmony_ci cb_data.card = card; 169062306a36Sopenharmony_ci cb_data.reg_buf = reg_buf; 169162306a36Sopenharmony_ci err = __mmc_poll_for_busy(card->host, 0, SD_POWEROFF_NOTIFY_TIMEOUT_MS, 169262306a36Sopenharmony_ci &sd_busy_poweroff_notify_cb, &cb_data); 169362306a36Sopenharmony_ci 169462306a36Sopenharmony_ciout: 169562306a36Sopenharmony_ci kfree(reg_buf); 169662306a36Sopenharmony_ci return err; 169762306a36Sopenharmony_ci} 169862306a36Sopenharmony_ci 169962306a36Sopenharmony_cistatic int _mmc_sd_suspend(struct mmc_host *host) 170062306a36Sopenharmony_ci{ 170162306a36Sopenharmony_ci struct mmc_card *card = host->card; 170262306a36Sopenharmony_ci int err = 0; 170362306a36Sopenharmony_ci 170462306a36Sopenharmony_ci mmc_claim_host(host); 170562306a36Sopenharmony_ci 170662306a36Sopenharmony_ci if (mmc_card_suspended(card)) 170762306a36Sopenharmony_ci goto out; 170862306a36Sopenharmony_ci 170962306a36Sopenharmony_ci if (sd_can_poweroff_notify(card)) 171062306a36Sopenharmony_ci err = sd_poweroff_notify(card); 171162306a36Sopenharmony_ci else if (!mmc_host_is_spi(host)) 171262306a36Sopenharmony_ci err = mmc_deselect_cards(host); 171362306a36Sopenharmony_ci 171462306a36Sopenharmony_ci if (!err) { 171562306a36Sopenharmony_ci mmc_power_off(host); 171662306a36Sopenharmony_ci mmc_card_set_suspended(card); 171762306a36Sopenharmony_ci } 171862306a36Sopenharmony_ci 171962306a36Sopenharmony_ciout: 172062306a36Sopenharmony_ci mmc_release_host(host); 172162306a36Sopenharmony_ci return err; 172262306a36Sopenharmony_ci} 172362306a36Sopenharmony_ci 172462306a36Sopenharmony_ci/* 172562306a36Sopenharmony_ci * Callback for suspend 172662306a36Sopenharmony_ci */ 172762306a36Sopenharmony_cistatic int mmc_sd_suspend(struct mmc_host *host) 172862306a36Sopenharmony_ci{ 172962306a36Sopenharmony_ci int err; 173062306a36Sopenharmony_ci 173162306a36Sopenharmony_ci err = _mmc_sd_suspend(host); 173262306a36Sopenharmony_ci if (!err) { 173362306a36Sopenharmony_ci pm_runtime_disable(&host->card->dev); 173462306a36Sopenharmony_ci pm_runtime_set_suspended(&host->card->dev); 173562306a36Sopenharmony_ci } 173662306a36Sopenharmony_ci 173762306a36Sopenharmony_ci return err; 173862306a36Sopenharmony_ci} 173962306a36Sopenharmony_ci 174062306a36Sopenharmony_ci/* 174162306a36Sopenharmony_ci * This function tries to determine if the same card is still present 174262306a36Sopenharmony_ci * and, if so, restore all state to it. 174362306a36Sopenharmony_ci */ 174462306a36Sopenharmony_cistatic int _mmc_sd_resume(struct mmc_host *host) 174562306a36Sopenharmony_ci{ 174662306a36Sopenharmony_ci int err = 0; 174762306a36Sopenharmony_ci 174862306a36Sopenharmony_ci mmc_claim_host(host); 174962306a36Sopenharmony_ci 175062306a36Sopenharmony_ci if (!mmc_card_suspended(host->card)) 175162306a36Sopenharmony_ci goto out; 175262306a36Sopenharmony_ci 175362306a36Sopenharmony_ci mmc_power_up(host, host->card->ocr); 175462306a36Sopenharmony_ci err = mmc_sd_init_card(host, host->card->ocr, host->card); 175562306a36Sopenharmony_ci mmc_card_clr_suspended(host->card); 175662306a36Sopenharmony_ci 175762306a36Sopenharmony_ciout: 175862306a36Sopenharmony_ci mmc_release_host(host); 175962306a36Sopenharmony_ci return err; 176062306a36Sopenharmony_ci} 176162306a36Sopenharmony_ci 176262306a36Sopenharmony_ci/* 176362306a36Sopenharmony_ci * Callback for resume 176462306a36Sopenharmony_ci */ 176562306a36Sopenharmony_cistatic int mmc_sd_resume(struct mmc_host *host) 176662306a36Sopenharmony_ci{ 176762306a36Sopenharmony_ci pm_runtime_enable(&host->card->dev); 176862306a36Sopenharmony_ci return 0; 176962306a36Sopenharmony_ci} 177062306a36Sopenharmony_ci 177162306a36Sopenharmony_ci/* 177262306a36Sopenharmony_ci * Callback for runtime_suspend. 177362306a36Sopenharmony_ci */ 177462306a36Sopenharmony_cistatic int mmc_sd_runtime_suspend(struct mmc_host *host) 177562306a36Sopenharmony_ci{ 177662306a36Sopenharmony_ci int err; 177762306a36Sopenharmony_ci 177862306a36Sopenharmony_ci if (!(host->caps & MMC_CAP_AGGRESSIVE_PM)) 177962306a36Sopenharmony_ci return 0; 178062306a36Sopenharmony_ci 178162306a36Sopenharmony_ci err = _mmc_sd_suspend(host); 178262306a36Sopenharmony_ci if (err) 178362306a36Sopenharmony_ci pr_err("%s: error %d doing aggressive suspend\n", 178462306a36Sopenharmony_ci mmc_hostname(host), err); 178562306a36Sopenharmony_ci 178662306a36Sopenharmony_ci return err; 178762306a36Sopenharmony_ci} 178862306a36Sopenharmony_ci 178962306a36Sopenharmony_ci/* 179062306a36Sopenharmony_ci * Callback for runtime_resume. 179162306a36Sopenharmony_ci */ 179262306a36Sopenharmony_cistatic int mmc_sd_runtime_resume(struct mmc_host *host) 179362306a36Sopenharmony_ci{ 179462306a36Sopenharmony_ci int err; 179562306a36Sopenharmony_ci 179662306a36Sopenharmony_ci err = _mmc_sd_resume(host); 179762306a36Sopenharmony_ci if (err && err != -ENOMEDIUM) 179862306a36Sopenharmony_ci pr_err("%s: error %d doing runtime resume\n", 179962306a36Sopenharmony_ci mmc_hostname(host), err); 180062306a36Sopenharmony_ci 180162306a36Sopenharmony_ci return 0; 180262306a36Sopenharmony_ci} 180362306a36Sopenharmony_ci 180462306a36Sopenharmony_cistatic int mmc_sd_hw_reset(struct mmc_host *host) 180562306a36Sopenharmony_ci{ 180662306a36Sopenharmony_ci mmc_power_cycle(host, host->card->ocr); 180762306a36Sopenharmony_ci return mmc_sd_init_card(host, host->card->ocr, host->card); 180862306a36Sopenharmony_ci} 180962306a36Sopenharmony_ci 181062306a36Sopenharmony_cistatic const struct mmc_bus_ops mmc_sd_ops = { 181162306a36Sopenharmony_ci .remove = mmc_sd_remove, 181262306a36Sopenharmony_ci .detect = mmc_sd_detect, 181362306a36Sopenharmony_ci .runtime_suspend = mmc_sd_runtime_suspend, 181462306a36Sopenharmony_ci .runtime_resume = mmc_sd_runtime_resume, 181562306a36Sopenharmony_ci .suspend = mmc_sd_suspend, 181662306a36Sopenharmony_ci .resume = mmc_sd_resume, 181762306a36Sopenharmony_ci .alive = mmc_sd_alive, 181862306a36Sopenharmony_ci .shutdown = mmc_sd_suspend, 181962306a36Sopenharmony_ci .hw_reset = mmc_sd_hw_reset, 182062306a36Sopenharmony_ci .cache_enabled = sd_cache_enabled, 182162306a36Sopenharmony_ci .flush_cache = sd_flush_cache, 182262306a36Sopenharmony_ci}; 182362306a36Sopenharmony_ci 182462306a36Sopenharmony_ci/* 182562306a36Sopenharmony_ci * Starting point for SD card init. 182662306a36Sopenharmony_ci */ 182762306a36Sopenharmony_ciint mmc_attach_sd(struct mmc_host *host) 182862306a36Sopenharmony_ci{ 182962306a36Sopenharmony_ci int err; 183062306a36Sopenharmony_ci u32 ocr, rocr; 183162306a36Sopenharmony_ci 183262306a36Sopenharmony_ci WARN_ON(!host->claimed); 183362306a36Sopenharmony_ci 183462306a36Sopenharmony_ci err = mmc_send_app_op_cond(host, 0, &ocr); 183562306a36Sopenharmony_ci if (err) 183662306a36Sopenharmony_ci return err; 183762306a36Sopenharmony_ci 183862306a36Sopenharmony_ci mmc_attach_bus(host, &mmc_sd_ops); 183962306a36Sopenharmony_ci if (host->ocr_avail_sd) 184062306a36Sopenharmony_ci host->ocr_avail = host->ocr_avail_sd; 184162306a36Sopenharmony_ci 184262306a36Sopenharmony_ci /* 184362306a36Sopenharmony_ci * We need to get OCR a different way for SPI. 184462306a36Sopenharmony_ci */ 184562306a36Sopenharmony_ci if (mmc_host_is_spi(host)) { 184662306a36Sopenharmony_ci mmc_go_idle(host); 184762306a36Sopenharmony_ci 184862306a36Sopenharmony_ci err = mmc_spi_read_ocr(host, 0, &ocr); 184962306a36Sopenharmony_ci if (err) 185062306a36Sopenharmony_ci goto err; 185162306a36Sopenharmony_ci } 185262306a36Sopenharmony_ci 185362306a36Sopenharmony_ci /* 185462306a36Sopenharmony_ci * Some SD cards claims an out of spec VDD voltage range. Let's treat 185562306a36Sopenharmony_ci * these bits as being in-valid and especially also bit7. 185662306a36Sopenharmony_ci */ 185762306a36Sopenharmony_ci ocr &= ~0x7FFF; 185862306a36Sopenharmony_ci 185962306a36Sopenharmony_ci rocr = mmc_select_voltage(host, ocr); 186062306a36Sopenharmony_ci 186162306a36Sopenharmony_ci /* 186262306a36Sopenharmony_ci * Can we support the voltage(s) of the card(s)? 186362306a36Sopenharmony_ci */ 186462306a36Sopenharmony_ci if (!rocr) { 186562306a36Sopenharmony_ci err = -EINVAL; 186662306a36Sopenharmony_ci goto err; 186762306a36Sopenharmony_ci } 186862306a36Sopenharmony_ci 186962306a36Sopenharmony_ci /* 187062306a36Sopenharmony_ci * Detect and init the card. 187162306a36Sopenharmony_ci */ 187262306a36Sopenharmony_ci err = mmc_sd_init_card(host, rocr, NULL); 187362306a36Sopenharmony_ci if (err) 187462306a36Sopenharmony_ci goto err; 187562306a36Sopenharmony_ci 187662306a36Sopenharmony_ci mmc_release_host(host); 187762306a36Sopenharmony_ci err = mmc_add_card(host->card); 187862306a36Sopenharmony_ci if (err) 187962306a36Sopenharmony_ci goto remove_card; 188062306a36Sopenharmony_ci 188162306a36Sopenharmony_ci mmc_claim_host(host); 188262306a36Sopenharmony_ci return 0; 188362306a36Sopenharmony_ci 188462306a36Sopenharmony_ciremove_card: 188562306a36Sopenharmony_ci mmc_remove_card(host->card); 188662306a36Sopenharmony_ci host->card = NULL; 188762306a36Sopenharmony_ci mmc_claim_host(host); 188862306a36Sopenharmony_cierr: 188962306a36Sopenharmony_ci mmc_detach_bus(host); 189062306a36Sopenharmony_ci 189162306a36Sopenharmony_ci pr_err("%s: error %d whilst initialising SD card\n", 189262306a36Sopenharmony_ci mmc_hostname(host), err); 189362306a36Sopenharmony_ci 189462306a36Sopenharmony_ci return err; 189562306a36Sopenharmony_ci} 1896