From patchwork Tue Feb 15 09:35:01 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arindam Nath X-Patchwork-Id: 558371 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 p1F9argr026346 for ; Tue, 15 Feb 2011 09:36:54 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754630Ab1BOJgt (ORCPT ); Tue, 15 Feb 2011 04:36:49 -0500 Received: from mail-iw0-f174.google.com ([209.85.214.174]:54223 "EHLO mail-iw0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754600Ab1BOJgo (ORCPT ); Tue, 15 Feb 2011 04:36:44 -0500 Received: by mail-iw0-f174.google.com with SMTP id 9so5731723iwn.19 for ; Tue, 15 Feb 2011 01:36:44 -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=UWTG+Sf8bWnV+DLRBn87ECX3sqUrfDFwi5Q4RELvyAk=; b=DC80OoHF7q5/Kkl7RfImWKvI6IkRV0gIA3acC3ygEG7DpA4ik1eb8GARaiTLbEGsD7 Lugtw3i8mXb+kqbGE6l6yxrp1yaHMi8Yaci7jHzkd5+Uo6FRQ9cokP1rl9Mc/+Z5AqcI j+3xoxrBTUbwQ3RnvE3laRpxBX4EsYHb93FY0= 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=IJHId8vFqyOKCDFq/myXmRnDypcnEnLnCYubayroWYdKPzP+p+MnLQ+t2iN4dfPYWD uuXqN7gLqqykCQ4yIMi5eYbUxWfMts5B3nm2YTRB7LyZFnBTIYTLSCkYri9DriNQ8fEc ajYIzK1UHuc4pnluHpZ/S5Mq+fphHfKjckkhY= Received: by 10.42.2.142 with SMTP id 14mr6591783ick.44.1297762604614; Tue, 15 Feb 2011 01:36:44 -0800 (PST) Received: from localhost ([122.167.0.108]) by mx.google.com with ESMTPS id jv9sm3062134icb.13.2011.02.15.01.36.39 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 15 Feb 2011 01:36:43 -0800 (PST) From: Arindam Nath To: cjb@laptop.org Cc: linux-mmc@vger.kernel.org, henry.su@amd.com, aaron.lu@amd.com, anath.amd@gmail.com, Arindam Nath Subject: [PATCH 03/12] mmc: sd: query function modes for uhs cards Date: Tue, 15 Feb 2011 15:05:01 +0530 Message-Id: <1297762510-2696-4-git-send-email-arindam.nath@amd.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1297762510-2696-1-git-send-email-arindam.nath@amd.com> References: <1297762510-2696-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]); Tue, 15 Feb 2011 09:36:54 +0000 (UTC) diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index e968d5c..2a84396 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 {