Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp725015imu; Thu, 20 Dec 2018 04:26:41 -0800 (PST) X-Google-Smtp-Source: AFSGD/VLY0J+5n3eNzcgzI1lnYu6MTgZbs0LqFR/xmmRPTYSDxfUOL51bToHm+Usccb/6J751KuY X-Received: by 2002:a17:902:b18b:: with SMTP id s11mr23824812plr.56.1545308801334; Thu, 20 Dec 2018 04:26:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545308801; cv=none; d=google.com; s=arc-20160816; b=RJ7KD/PSY++HdkMe/VXDWX3GLZdxSa6p3KHtbz1sfoyWcxGN84AAtQIQiI8oZ5DoB2 BBlf2SKLbZhQDES0uCvuhUCS06IP/6Ri9IcjNKc1k0fKbbttwnyrYwunXLrZQsxmteJr o6CS6yilatzIFN3SsgSItf2scCyYKIC+VpxJHP6VD5uuX1y5cdRjbf/yS0CzlXX795ee o+kRIXYfWQ652KTIn5sFygNH4bEHk0yhcLYe3JPqtEj9xpN/ZH4BdKoCRR9dXDp8qfCI QRrhwyEBKQof4DGvhks5LvePgYQ/WZ7cTABq0AcfyQAz/hbWqeiJRYQlonniVnUtJrl1 yY0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=GYHcZnKc4LtAyyZdEGwrJ7xeSfjkpQBo5Wt9Thy7XdM=; b=KPsQMdMdZlT7Pg6iROUI1HpjLNAD8pAWh/1KsJHDkKYXacHTTp2aav8z8Gmge0oaNq sp/w3FOJt2IJVxXtJXb0yHvP1RHheOYukFQhNNcnLh6tpGqY9S3qDlO011EUc2iw9MxI SxoIq/bsdL/GtpyLUSP5W+05Xol2XcFi4iwGEE7Me5z5B6cpLu4HB3ZI5kpCf8UNDSHX 2nk9im5qQQyLJ0bBTgNlzwObokOjahNh+/7g0Z2HnM4c1A3bJDPHuG4uhBbdLMSiXYOU ztb4Wn03AkWYztNDDuItwDh6OczjnvJY6n0CQN1hQlszArGcH8FjKbIWDqi2IhzJBZMX ui0g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=EExEgydu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a8si5576465pgw.380.2018.12.20.04.26.22; Thu, 20 Dec 2018 04:26:41 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=EExEgydu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731428AbeLTJWx (ORCPT + 99 others); Thu, 20 Dec 2018 04:22:53 -0500 Received: from mail.kernel.org ([198.145.29.99]:47628 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730050AbeLTJWu (ORCPT ); Thu, 20 Dec 2018 04:22:50 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6543620656; Thu, 20 Dec 2018 09:22:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1545297768; bh=EwowOeuAQQdDGRKIWiLBKc8YLv+5YxZRknfLTOrPDxQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EExEgyduZN3Y32lJR0ATCUfbcrKYdbjXdAoTqr/nP2Zysb1uDoeRJP4avoPbIaZsy 8FhcWDx0CrjOCs+VEGUSZp5X2NEcxwKHvx+5l2aW/UD7sO/TujkKcOJYLpaUADO98k a6GWMz6WBDwShGbYGsvHatKzmUz1RJf9LfKrS8s4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ladislav Michl , Andrzej Zaborowski , Tony Lindgren , Aaro Koskinen , Ulf Hansson Subject: [PATCH 4.9 10/61] MMC: OMAP: fix broken MMC on OMAP15XX/OMAP5910/OMAP310 Date: Thu, 20 Dec 2018 10:18:10 +0100 Message-Id: <20181220085844.140650279@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20181220085843.743900603@linuxfoundation.org> References: <20181220085843.743900603@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Aaro Koskinen commit e8cde625bfe8a714a856e1366bcbb259d7346095 upstream. Since v2.6.22 or so there has been reports [1] about OMAP MMC being broken on OMAP15XX based hardware (OMAP5910 and OMAP310). The breakage seems to have been caused by commit 46a6730e3ff9 ("mmc-omap: Fix omap to use MMC_POWER_ON") that changed clock enabling to be done on MMC_POWER_ON. This can happen multiple times in a row, and on 15XX the hardware doesn't seem to like it and the MMC just stops responding. Fix by memorizing the power mode and do the init only when necessary. Before the patch (on Palm TE): mmc0: new SD card at address b368 mmcblk0: mmc0:b368 SDC 977 MiB mmci-omap mmci-omap.0: command timeout (CMD18) mmci-omap mmci-omap.0: command timeout (CMD13) mmci-omap mmci-omap.0: command timeout (CMD13) mmci-omap mmci-omap.0: command timeout (CMD12) [x 6] mmci-omap mmci-omap.0: command timeout (CMD13) [x 6] mmcblk0: error -110 requesting status mmci-omap mmci-omap.0: command timeout (CMD8) mmci-omap mmci-omap.0: command timeout (CMD18) mmci-omap mmci-omap.0: command timeout (CMD13) mmci-omap mmci-omap.0: command timeout (CMD13) mmci-omap mmci-omap.0: command timeout (CMD12) [x 6] mmci-omap mmci-omap.0: command timeout (CMD13) [x 6] mmcblk0: error -110 requesting status mmcblk0: recovery failed! print_req_error: I/O error, dev mmcblk0, sector 0 Buffer I/O error on dev mmcblk0, logical block 0, async page read mmcblk0: unable to read partition table After the patch: mmc0: new SD card at address b368 mmcblk0: mmc0:b368 SDC 977 MiB mmcblk0: p1 The patch is based on a fix and analysis done by Ladislav Michl. Tested on OMAP15XX/OMAP310 (Palm TE), OMAP1710 (Nokia 770) and OMAP2420 (Nokia N810). [1] https://marc.info/?t=123175197000003&r=1&w=2 Fixes: 46a6730e3ff9 ("mmc-omap: Fix omap to use MMC_POWER_ON") Reported-by: Ladislav Michl Reported-by: Andrzej Zaborowski Tested-by: Ladislav Michl Acked-by: Tony Lindgren Signed-off-by: Aaro Koskinen Cc: stable@vger.kernel.org Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/mmc/host/omap.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c @@ -104,6 +104,7 @@ struct mmc_omap_slot { unsigned int vdd; u16 saved_con; u16 bus_mode; + u16 power_mode; unsigned int fclk_freq; struct tasklet_struct cover_tasklet; @@ -1157,7 +1158,7 @@ static void mmc_omap_set_ios(struct mmc_ struct mmc_omap_slot *slot = mmc_priv(mmc); struct mmc_omap_host *host = slot->host; int i, dsor; - int clk_enabled; + int clk_enabled, init_stream; mmc_omap_select_slot(slot, 0); @@ -1167,6 +1168,7 @@ static void mmc_omap_set_ios(struct mmc_ slot->vdd = ios->vdd; clk_enabled = 0; + init_stream = 0; switch (ios->power_mode) { case MMC_POWER_OFF: mmc_omap_set_power(slot, 0, ios->vdd); @@ -1174,13 +1176,17 @@ static void mmc_omap_set_ios(struct mmc_ case MMC_POWER_UP: /* Cannot touch dsor yet, just power up MMC */ mmc_omap_set_power(slot, 1, ios->vdd); + slot->power_mode = ios->power_mode; goto exit; case MMC_POWER_ON: mmc_omap_fclk_enable(host, 1); clk_enabled = 1; dsor |= 1 << 11; + if (slot->power_mode != MMC_POWER_ON) + init_stream = 1; break; } + slot->power_mode = ios->power_mode; if (slot->bus_mode != ios->bus_mode) { if (slot->pdata->set_bus_mode != NULL) @@ -1196,7 +1202,7 @@ static void mmc_omap_set_ios(struct mmc_ for (i = 0; i < 2; i++) OMAP_MMC_WRITE(host, CON, dsor); slot->saved_con = dsor; - if (ios->power_mode == MMC_POWER_ON) { + if (init_stream) { /* worst case at 400kHz, 80 cycles makes 200 microsecs */ int usecs = 250; @@ -1234,6 +1240,7 @@ static int mmc_omap_new_slot(struct mmc_ slot->host = host; slot->mmc = mmc; slot->id = id; + slot->power_mode = MMC_POWER_UNDEFINED; slot->pdata = &host->pdata->slots[id]; host->slots[id] = slot;