From patchwork Wed Mar 9 16:51:17 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Raffaele Recalcati X-Patchwork-Id: 86130 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 9858AB6F0D for ; Thu, 10 Mar 2011 03:51:56 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 2F2DB2808F; Wed, 9 Mar 2011 17:51:42 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id jMtyhiUa5JSc; Wed, 9 Mar 2011 17:51:41 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id BF829280A4; Wed, 9 Mar 2011 17:51:32 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id B93AB2808F for ; Wed, 9 Mar 2011 17:51:28 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6QEyrRn+tLtK for ; Wed, 9 Mar 2011 17:51:27 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-ew0-f44.google.com (mail-ew0-f44.google.com [209.85.215.44]) by theia.denx.de (Postfix) with ESMTPS id A76A328088 for ; Wed, 9 Mar 2011 17:51:27 +0100 (CET) Received: by mail-ew0-f44.google.com with SMTP id 19so221489ewy.3 for ; Wed, 09 Mar 2011 08:51:27 -0800 (PST) Received: by 10.14.19.199 with SMTP id n47mr4624956een.48.1299689487341; Wed, 09 Mar 2011 08:51:27 -0800 (PST) Received: from localhost.localdomain (host41-16-static.112-2-b.business.telecomitalia.it [2.112.16.41]) by mx.google.com with ESMTPS id b52sm1702392eei.7.2011.03.09.08.51.25 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 09 Mar 2011 08:51:26 -0800 (PST) From: Raffaele Recalcati To: u-boot list Date: Wed, 9 Mar 2011 17:51:17 +0100 Message-Id: <1299689478-22747-3-git-send-email-lamiaposta71@gmail.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1299689478-22747-1-git-send-email-lamiaposta71@gmail.com> References: <1299689478-22747-1-git-send-email-lamiaposta71@gmail.com> Cc: Raffaele Recalcati Subject: [U-Boot] [RFC 2/3] mmc: SEND_OP_COND considers card capabilities (voltage) X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.9 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de From: Raffaele Recalcati The first SEND_OP_COND (CMD1) is used only to ask card capabilities, waiting that the card is not busy. After it, an AND operation is done between card capabilities and host capabilities, (at the moment only for the voltage field). Finally the correct value is sent to the MMC. Signed-off-by: Raffaele Recalcati --- drivers/mmc/mmc.c | 21 +++++++++++++++++++-- include/mmc.h | 2 ++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 53ed36f..acd7479 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -348,17 +348,34 @@ sd_send_op_cond(struct mmc *mmc) int mmc_send_op_cond(struct mmc *mmc) { - int timeout = 1000; + int timeout = 10000; struct mmc_cmd cmd; int err; /* Some cards seem to need this */ mmc_go_idle(mmc); + /* Asking to the card its capabilities */ + do { + cmd.cmdidx = MMC_CMD_SEND_OP_COND; + cmd.resp_type = MMC_RSP_R3; + cmd.cmdarg = 0; + cmd.flags = 0; + + err = mmc_send_cmd(mmc, &cmd, NULL); + + if (err) + return err; + + udelay(1000); + } while (!(cmd.response[0] & OCR_BUSY) && timeout--); + do { cmd.cmdidx = MMC_CMD_SEND_OP_COND; cmd.resp_type = MMC_RSP_R3; - cmd.cmdarg = OCR_HCS | mmc->voltages; + cmd.cmdarg = ((mmc->voltages & + (cmd.response[0] & OCR_VOLTAGE_MASK)) | + (cmd.response[0] & OCR_ACCESS_MODE)); cmd.flags = 0; err = mmc_send_cmd(mmc, &cmd, NULL); diff --git a/include/mmc.h b/include/mmc.h index 4ee8e1c..d18526d 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -93,6 +93,8 @@ #define OCR_BUSY 0x80000000 #define OCR_HCS 0x40000000 +#define OCR_VOLTAGE_MASK 0x007FFF80 +#define OCR_ACCESS_MODE 0x60000000 #define MMC_STATUS_MASK (~0x0206BF7F) #define MMC_STATUS_RDY_FOR_DATA (1<<8)