From patchwork Fri Mar 4 11:32:40 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arindam Nath X-Patchwork-Id: 608741 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p24BXOPs029838 for ; Fri, 4 Mar 2011 11:33:46 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759400Ab1CDLdq (ORCPT ); Fri, 4 Mar 2011 06:33:46 -0500 Received: from mail-iw0-f174.google.com ([209.85.214.174]:35883 "EHLO mail-iw0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759397Ab1CDLdp (ORCPT ); Fri, 4 Mar 2011 06:33:45 -0500 Received: by iwn34 with SMTP id 34so1816372iwn.19 for ; Fri, 04 Mar 2011 03:33:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:sender:from:to:cc:subject:date:message-id :x-mailer:in-reply-to:references; bh=VN+OXx/E+6yNSwc44mxlGP6fKMQXg7PCPgxbVv9NlN4=; b=UFbe4dx4eQTJwlhsKMGF/FMQXixVmV+xbL0XculTiPO2+aVKYC4d/WhgNCZmDKJvG2 Spj1pMHiWicz51uyD/o6x2G0AXvBPw3CpcLHrw7Kx5g7f2f+4GbYFrmoYo0qWY2yn8Jv x7JWw2vUOcAzTqGZFYiALQOrZ+6KODtWJH0SU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; b=BiK0VA3R4f9RIfErRDe3EJBc676IxA4TNV7VfKufMoS3oLO2LR0MkfyA3XNV0nMOy8 RK2he/PcCeJbdVsx66shVSC41OlLMxQgCwigsl4J8ubfBAklqjBuxsSbzAKrOjsbCEys 2fb8FoDQMWeJ7aDu1yNpcG3RH/o5ZkGFdl0UU= Received: by 10.42.142.135 with SMTP id s7mr486521icu.247.1299238425254; Fri, 04 Mar 2011 03:33:45 -0800 (PST) Received: from localhost ([122.167.0.108]) by mx.google.com with ESMTPS id ye2sm696626icb.8.2011.03.04.03.33.38 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 04 Mar 2011 03:33:44 -0800 (PST) From: Arindam Nath To: cjb@laptop.org Cc: zhangfei.gao@gmail.com, prakity@marvell.com, subhashj@codeaurora.org, linux-mmc@vger.kernel.org, henry.su@amd.com, aaron.lu@amd.com, anath.amd@gmail.com, Arindam Nath Subject: [PATCH v2 03/12] mmc: sd: query function modes for uhs cards Date: Fri, 4 Mar 2011 17:02:40 +0530 Message-Id: <1299238369-1768-4-git-send-email-arindam.nath@amd.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1299238369-1768-1-git-send-email-arindam.nath@amd.com> References: <1299238369-1768-1-git-send-email-arindam.nath@amd.com> Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Fri, 04 Mar 2011 11:33:46 +0000 (UTC) diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 3e82599..a63956b 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -283,25 +283,94 @@ static int mmc_read_switch(struct mmc_card *card) return -ENOMEM; } - err = mmc_sd_switch(card, 0, 0, 1, status); - if (err) { - /* If the host or the card can't do the switch, - * fail more gracefully. */ - if ((err != -EINVAL) - && (err != -ENOSYS) - && (err != -EFAULT)) + if (card->scr.sda_spec3) { + /* First find out the supported Bus Speed Modes. */ + err = mmc_sd_switch(card, 0, 0, 1, status); + if (err) { + /* + * If the host or the card can't do the switch, + * fail more gracefully. + */ + if ((err != -EINVAL) + && (err != -ENOSYS) + && (err != -EFAULT)) + goto out; + + printk(KERN_WARNING "%s: problem reading " + "Bus Speed modes.\n", + mmc_hostname(card->host)); + err = 0; + goto out; + } - printk(KERN_WARNING "%s: problem reading switch " - "capabilities, performance might suffer.\n", - mmc_hostname(card->host)); - err = 0; + card->sw_caps.uhs_bus_mode = status[13]; + + /* Find out Driver Strengths supported by the card */ + err = mmc_sd_switch(card, 0, 2, 1, status); + if (err) { + /* + * If the host or the card can't do the switch, + * fail more gracefully. + */ + if ((err != -EINVAL) + && (err != -ENOSYS) + && (err != -EFAULT)) + goto out; + + printk(KERN_WARNING "%s: problem reading " + "Driver Strength.\n", + mmc_hostname(card->host)); + err = 0; - goto out; - } + goto out; + } - if (status[13] & 0x02) - card->sw_caps.hs_max_dtr = 50000000; + card->sw_caps.uhs_drv_type = status[9]; + + /* Find out Current Limits supported by the card */ + err = mmc_sd_switch(card, 0, 3, 1, status); + if (err) { + /* + * If the host or the card can't do the switch, + * fail more gracefully. + */ + if ((err != -EINVAL) + && (err != -ENOSYS) + && (err != -EFAULT)) + goto out; + + printk(KERN_WARNING "%s: problem reading " + "Current Limit.\n", + mmc_hostname(card->host)); + err = 0; + + goto out; + } + + card->sw_caps.uhs_curr_limit = status[7]; + } else { + err = mmc_sd_switch(card, 0, 0, 1, status); + if (err) { + /* + * If the host or the card can't do the switch, + * fail more gracefully. + */ + if ((err != -EINVAL) + && (err != -ENOSYS) + && (err != -EFAULT)) + goto out; + + printk(KERN_WARNING "%s: problem reading switch " + "capabilities, performance might suffer.\n", + mmc_hostname(card->host)); + err = 0; + goto out; + } + + if (status[13] & 0x02) + card->sw_caps.hs_max_dtr = 50000000; + } out: kfree(status); diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 22b0335..7080f22 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -75,6 +75,9 @@ struct sd_ssr { struct sd_switch_caps { unsigned int hs_max_dtr; + unsigned int uhs_bus_mode; + unsigned int uhs_drv_type; + unsigned int uhs_curr_limit; }; struct sdio_cccr {