From patchwork Wed Sep 27 08:35:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Izard X-Patchwork-Id: 819050 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pwm-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="jbfL4Wdp"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3y2B7c152Cz9t4Z for ; Wed, 27 Sep 2017 18:39:08 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752698AbdI0IiS (ORCPT ); Wed, 27 Sep 2017 04:38:18 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:49704 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752491AbdI0IgS (ORCPT ); Wed, 27 Sep 2017 04:36:18 -0400 Received: by mail-wm0-f68.google.com with SMTP id r74so15372103wme.4; Wed, 27 Sep 2017 01:36:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=YbTyumyy6P4kge3veVl/A0z9dzATwB6TcaPmHuC1BkA=; b=jbfL4WdpgAFTGIUHTMUkozrT8YPYvH/Qe3M/a3Z1dN3sK3+xHrTKrq1L+GrmSWLvEz IEQ/6/+PQFd3yvhgfCLGF/CMXzebyu+kmOH7AjhZ252ReTObm0W8XnJusQbzpJwFZceK jWVRYuoXPb7F2MnBEIrJD1p0FfRjDaqUWEdPBiFK83vlydVVnh4R94e9klHsbB2n+TZW OaiN+0be9kWZuaRTz5HEdnqMcxpapFAqWeTl8JWbqzWLO9IHakXvH9vJEVFowoa3f4IR XUvT89QoKjeMa/kFSevm66QOsXZ9yfk6pLQTw77vCO4Y4C8sRqMLdcXU3EDFoKxoKV25 IJPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=YbTyumyy6P4kge3veVl/A0z9dzATwB6TcaPmHuC1BkA=; b=jCdg+BaiF1LWI1DYXT9AtVgYq3SZZ3Ob0YH0sDVOfGg4aFyIseOzldQR+xEfzHunBg BIRPSz1EcTO3e5ZMPeYMJMUbEkZa1BbNr64GPniZhZDWZrp2xHmXqTwDUfCe5TcccpoJ H4dP1ivYizYHAOlXLz2a+/Urlyls5cyWmg7lvS8dravNdkRpRqKLXTJQbyodXSbY9L3l pN82G8PN9AMQ5Wiz2b2VfvHn85CwJaja6wSMTBaKFrQkHBLYcbc6FvNzGWadyU7L+zvv 96t9D9sqMEZZndeOyZg+jpeSxXaoAYYntNMShsRzNavb+EwLHUNdHJbXTqNP7J1JVDmO Qelw== X-Gm-Message-State: AHPjjUi5al8DGWexOEQ9V3h71klCrxyAfYZoZT5ocVSSjYYptdT1mQp1 bADRUJgwHMr7MfEX/1VnhP0= X-Google-Smtp-Source: AOwi7QCDvaTM95g9jizq059H+Q/H/WJwHn5cqLxwodS6V9OvQfJiuMBrYNYZfbKgx8so/m+IqdnIRw== X-Received: by 10.28.140.18 with SMTP id o18mr863571wmd.145.1506501376157; Wed, 27 Sep 2017 01:36:16 -0700 (PDT) Received: from localhost.localdomain (146.187.3.109.rev.sfr.net. [109.3.187.146]) by smtp.gmail.com with ESMTPSA id r6sm9699900wrg.40.2017.09.27.01.36.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Sep 2017 01:36:15 -0700 (PDT) From: Romain Izard To: Boris Brezillon , Michael Turquette , Stephen Boyd , Lee Jones , Wenyou Yang , Josh Wu , Richard Weinberger , David Woodhouse , Brian Norris , Marek Vasut , Cyrille Pitchen , Thierry Reding , Richard Genoud , Greg Kroah-Hartman , Jiri Slaby , Alan Stern , Ludovic Desroches , Nicolas Ferre , Alexandre Belloni Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org, linux-pwm@vger.kernel.org, linux-serial@vger.kernel.org, linux-usb@vger.kernel.org, Romain Izard Subject: [PATCH v3 4/8] mtd: nand: atmel: Avoid ECC errors when leaving backup mode Date: Wed, 27 Sep 2017 10:35:51 +0200 Message-Id: <20170927083555.16580-5-romain.izard.pro@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170927083555.16580-1-romain.izard.pro@gmail.com> References: <20170927083555.16580-1-romain.izard.pro@gmail.com> Sender: linux-pwm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pwm@vger.kernel.org During backup mode, the contents of all registers will be cleared as the SoC will be completely powered down. For a product that boots on NAND Flash memory, the bootloader will obviously use the related controller to read the Flash and correct any detected error in the memory, before handling back control to the kernel's resuming entry point. But it does not clean the NAND controller registers after use and on its side the kernel driver expects the error locator to be powered down and in a clean state. Add a resume hook for the PMECC error locator, and reset its registers. Signed-off-by: Romain Izard --- Change in v3: * keep the PMECC disabled when not in use, and use atmel_pmecc_resume to reset the controller after the bootloader has left it enabled. drivers/mtd/nand/atmel/nand-controller.c | 3 +++ drivers/mtd/nand/atmel/pmecc.c | 22 ++++++++++++++-------- drivers/mtd/nand/atmel/pmecc.h | 1 + 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/mtd/nand/atmel/nand-controller.c b/drivers/mtd/nand/atmel/nand-controller.c index f25eca79f4e5..86c2199380c2 100644 --- a/drivers/mtd/nand/atmel/nand-controller.c +++ b/drivers/mtd/nand/atmel/nand-controller.c @@ -2530,6 +2530,9 @@ static __maybe_unused int atmel_nand_controller_resume(struct device *dev) struct atmel_nand_controller *nc = dev_get_drvdata(dev); struct atmel_nand *nand; + if (nand->pmecc) + atmel_pmecc_resume(nand->pmecc); + list_for_each_entry(nand, &nc->chips, node) { int i; diff --git a/drivers/mtd/nand/atmel/pmecc.c b/drivers/mtd/nand/atmel/pmecc.c index 146af8218314..ff09c0f25dd4 100644 --- a/drivers/mtd/nand/atmel/pmecc.c +++ b/drivers/mtd/nand/atmel/pmecc.c @@ -765,6 +765,12 @@ void atmel_pmecc_get_generated_eccbytes(struct atmel_pmecc_user *user, } EXPORT_SYMBOL_GPL(atmel_pmecc_get_generated_eccbytes); +void atmel_pmecc_reset(struct atmel_pmecc *pmecc) +{ + writel(PMECC_CTRL_RST, pmecc->regs.base + ATMEL_PMECC_CTRL); + writel(PMECC_CTRL_DISABLE, pmecc->regs.base + ATMEL_PMECC_CTRL); +} + int atmel_pmecc_enable(struct atmel_pmecc_user *user, int op) { struct atmel_pmecc *pmecc = user->pmecc; @@ -797,14 +803,17 @@ EXPORT_SYMBOL_GPL(atmel_pmecc_enable); void atmel_pmecc_disable(struct atmel_pmecc_user *user) { - struct atmel_pmecc *pmecc = user->pmecc; - - writel(PMECC_CTRL_RST, pmecc->regs.base + ATMEL_PMECC_CTRL); - writel(PMECC_CTRL_DISABLE, pmecc->regs.base + ATMEL_PMECC_CTRL); + atmel_pmecc_reset(user->pmecc); mutex_unlock(&user->pmecc->lock); } EXPORT_SYMBOL_GPL(atmel_pmecc_disable); +void atmel_pmecc_resume(struct atmel_pmecc_user *user) +{ + atmel_pmecc_reset(user->pmecc); +} +EXPORT_SYMBOL_GPL(atmel_pmecc_resume); + int atmel_pmecc_wait_rdy(struct atmel_pmecc_user *user) { struct atmel_pmecc *pmecc = user->pmecc; @@ -855,10 +864,7 @@ static struct atmel_pmecc *atmel_pmecc_create(struct platform_device *pdev, /* Disable all interrupts before registering the PMECC handler. */ writel(0xffffffff, pmecc->regs.base + ATMEL_PMECC_IDR); - - /* Reset the ECC engine */ - writel(PMECC_CTRL_RST, pmecc->regs.base + ATMEL_PMECC_CTRL); - writel(PMECC_CTRL_DISABLE, pmecc->regs.base + ATMEL_PMECC_CTRL); + atmel_pmecc_reset(pmecc); return pmecc; } diff --git a/drivers/mtd/nand/atmel/pmecc.h b/drivers/mtd/nand/atmel/pmecc.h index a8ddbfca2ea5..488a90f1965d 100644 --- a/drivers/mtd/nand/atmel/pmecc.h +++ b/drivers/mtd/nand/atmel/pmecc.h @@ -63,6 +63,7 @@ void atmel_pmecc_destroy_user(struct atmel_pmecc_user *user); int atmel_pmecc_enable(struct atmel_pmecc_user *user, int op); void atmel_pmecc_disable(struct atmel_pmecc_user *user); +void atmel_pmecc_resume(struct atmel_pmecc_user *user); int atmel_pmecc_wait_rdy(struct atmel_pmecc_user *user); int atmel_pmecc_correct_sector(struct atmel_pmecc_user *user, int sector, void *data, void *ecc);