Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp2425680ybl; Thu, 9 Jan 2020 12:32:04 -0800 (PST) X-Google-Smtp-Source: APXvYqyd1oKAi0oN59Z3fypvdpUqArs4ntrUmcyT/fXQqUli7rH7GJ8TF6FPA8o7gwZHpvzk/6tK X-Received: by 2002:aca:fdd1:: with SMTP id b200mr4441074oii.133.1578601924500; Thu, 09 Jan 2020 12:32:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578601924; cv=none; d=google.com; s=arc-20160816; b=OcZIcEy5TwttZBjBG2V9F/YLZYjTfYVrfuCBqK5UylZKr2KKHmWP+HHVnebpDELUoc UJ9m3SV/7eQsWkxh98xw27fo1vBV36zP6fkCBX+EUhS4/uCUJ5pyxS3NnQNfWZNB6ZuS 8J5yli17Gj3Q6w5fBEF3RrA8m8W4xaTEStKzCFqmniCUAXNb1fkPfeRgUOhEUZxSqp5s GCvzKVaLzYlthS2ZOs4gRPkbsISOQzDT5o6SZy2foR8roay3CMe+tS9EvvcxA1Mc1Lsz DVZVSYJvV1V61uC9ixvKb9M2abB35MHbImGvZS8CAzYmTKaQ/BszRrr29diqp+PLzVs4 Q3NA== 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 :organization:references:in-reply-to:message-id:subject:cc:to:from :date; bh=vhtXxVJER4QNgOWMxFS1P2LSJrXX+CIqKMemolTgQrE=; b=LBCDmIvD+dlnbrNvY5aH6suF4c9HEO7N+qKqgsZHIYYDEpmcQfn6npxWFL8WOO46XO LlFuR7P8kKy++FA5Hfh1DDP3UM38t0ISly5gScvRmOFVLZwCSVx/+/eju7uXESo8Rm6r 8JuQcDEQ0/EG/eYluK8sLw36ZJpDP0p2K5IEpjtnMaw+LO1STHKVPabTAv/0b7KEE5xe hZzcXMJxpM1xt8qNwEFAEcQMvAlnRuoUFt6n8rUnbM0WVBlI/RkgUq3husT6pzcDoFwr n2UfYiYWejTVb1+Ag7Fz9YgieruGa/WT9mgElTCZTonhNhHgQmXO9548vnoRWLdf9DVn inTQ== ARC-Authentication-Results: i=1; mx.google.com; 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 o128si4093330oih.66.2020.01.09.12.31.51; Thu, 09 Jan 2020 12:32:04 -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; 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 S1731480AbgAIRBc convert rfc822-to-8bit (ORCPT + 99 others); Thu, 9 Jan 2020 12:01:32 -0500 Received: from relay1-d.mail.gandi.net ([217.70.183.193]:50081 "EHLO relay1-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729533AbgAIRBc (ORCPT ); Thu, 9 Jan 2020 12:01:32 -0500 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id E5541240004; Thu, 9 Jan 2020 17:01:29 +0000 (UTC) Date: Thu, 9 Jan 2020 18:01:28 +0100 From: Miquel Raynal To: Mason Yang Cc: richard@nod.at, marek.vasut@gmail.com, dwmw2@infradead.org, bbrezillon@kernel.org, computersforpeace@gmail.com, vigneshr@ti.com, juliensu@mxic.com.tw, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org Subject: Re: [PATCH v2 4/4] mtd: rawnand: Add support Macronix deep power down mode Message-ID: <20200109180128.0f3e7b99@xps13> In-Reply-To: <1572256527-5074-5-git-send-email-masonccyang@mxic.com.tw> References: <1572256527-5074-1-git-send-email-masonccyang@mxic.com.tw> <1572256527-5074-5-git-send-email-masonccyang@mxic.com.tw> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) 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 Hi Mason, Mason Yang wrote on Mon, 28 Oct 2019 17:55:27 +0800: > Macronix AD series support deep power down mode for a minimum > power consumption state. > > Patch nand_suspend() & nand_resume() by Macronix specific > deep power down mode command and exit it. > > Signed-off-by: Mason Yang > --- > drivers/mtd/nand/raw/nand_macronix.c | 72 +++++++++++++++++++++++++++++++++++- > 1 file changed, 70 insertions(+), 2 deletions(-) > > diff --git a/drivers/mtd/nand/raw/nand_macronix.c b/drivers/mtd/nand/raw/nand_macronix.c > index 13929bf..3098bc0 100644 > --- a/drivers/mtd/nand/raw/nand_macronix.c > +++ b/drivers/mtd/nand/raw/nand_macronix.c > @@ -15,6 +15,8 @@ > #define MXIC_BLOCK_PROTECTION_ALL_LOCK 0x38 > #define MXIC_BLOCK_PROTECTION_ALL_UNLOCK 0x0 > > +#define NAND_CMD_POWER_DOWN 0xB9 I suppose this value is Macronix specific, and hence should have a MACRONIX_ or MXIC_ prefix instead of NAND_. > + > struct nand_onfi_vendor_macronix { > u8 reserved; > u8 reliability_func; > @@ -137,13 +139,66 @@ static int mxic_nand_unlock(struct nand_chip *chip, loff_t ofs, uint64_t len) > return ret; > } > > +int nand_power_down_op(struct nand_chip *chip) > +{ > + int ret; > + > + if (nand_has_exec_op(chip)) { > + struct nand_op_instr instrs[] = { > + NAND_OP_CMD(NAND_CMD_POWER_DOWN, 0), > + }; > + > + struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs); > + > + ret = nand_exec_op(chip, &op); > + if (ret) > + return ret; > + > + } else { > + chip->legacy.cmdfunc(chip, NAND_CMD_POWER_DOWN, -1, -1); > + } > + > + return 0; > +} > + > +static int mxic_nand_suspend(struct nand_chip *chip) > +{ > + int ret; > + > + nand_select_target(chip, 0); > + ret = nand_power_down_op(chip); > + if (ret < 0) > + pr_err("%s called for chip into suspend failed\n", __func__); What about something more specific? "Suspending MXIC NAND chip failed (%)\n", ret > + nand_deselect_target(chip); > + > + return ret; > +} > + > +static void mxic_nand_resume(struct nand_chip *chip) > +{ > + /* > + * Toggle #CS pin to resume NAND device and don't care > + * of the others CLE, #WE, #RE pins status. > + * Here sending power down command to toggle #CS line. The first sentence seems right, the second could be upgraded: The purpose of doing a power down operation is just to ensure some bytes will be sent over the NAND bus so that #CS gets toggled because this is why the chip is woken up. The content of the bytes sent on the NAND bus are not relevant at this time. Sending bytes on the bus is mandatory for a lot of NAND controllers otherwise they are not able to just assert/de-assert #CS. > + */ > + nand_select_target(chip, 0); > + nand_power_down_op(chip); Are you sure sending a power_down_op will not be interpreted by the chip? I would expect a sleeping delay here, even small. > + nand_deselect_target(chip); > +} > + > /* > - * Macronix NAND AC series support Block Protection by SET_FEATURES > + * Macronix NAND AC & AD series support Block Protection by SET_FEATURES > * to lock/unlock blocks. > */ > static int macronix_nand_init(struct nand_chip *chip) > { > - bool blockprotected = false; > + unsigned int i; > + bool blockprotected = false, powerdown = false; > + static const char * const power_down_dev[] = { > + "MX30LF1G28AD", > + "MX30LF2G28AD", > + "MX30LF4G28AD", > + }; > > if (nand_is_slc(chip)) > chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; > @@ -153,6 +208,14 @@ static int macronix_nand_init(struct nand_chip *chip) > > macronix_nand_onfi_init(chip); > > + for (i = 0; i < ARRAY_SIZE(power_down_dev); i++) { > + if (!strcmp(power_down_dev[i], chip->parameters.model)) { > + blockprotected = true; > + powerdown = true; > + break; > + } > + } > + > if (blockprotected) { > bitmap_set(chip->parameters.set_feature_list, > ONFI_FEATURE_ADDR_MXIC_PROTECTION, 1); > @@ -163,6 +226,11 @@ static int macronix_nand_init(struct nand_chip *chip) > chip->_unlock = mxic_nand_unlock; > } > > + if (powerdown) { > + chip->_suspend = mxic_nand_suspend; > + chip->_resume = mxic_nand_resume; > + } See my comment on patch 2. > + > return 0; > } > Thanks, Miquèl