Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp2749027ybk; Mon, 18 May 2020 07:05:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw8xbNB/AtPQVM5XeKyUrvyKdMok+snGr56mtqjb6wHfWKz3RhzqbjutB/U65qrpIxrnMeQ X-Received: by 2002:a50:c3c2:: with SMTP id i2mr13403689edf.93.1589810700061; Mon, 18 May 2020 07:05:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589810700; cv=none; d=google.com; s=arc-20160816; b=AAMONO7ZIvM6nOfymc4GTiFEga6wgl8ng1D4bwgUc07CkBzy7WLZ50ztJBg62xW1Lk CxL+/1kfOYTKWukSNCNN55Mr6oQ+W5FdycPzqj6s26rxDT0dr3V7AdV/EZQX95LecaYj lkpsHgdeZ+tlle2DeLT/qIbMLdikqMOFqHsMTmJizaXAjLiE5LgF7axKcN+sOuN7vX91 Kmukg17gL6CTXxUu2XiDK4vvQsHop8qDaihfxl5h7tO1wG9abXA4fjSN1+ueraoOanJ5 J8ezRL8WhSGk8d5qIFmMnGo9Qh8+Q+9CtLg/M7v+vo9R63ADOoLmKznsiTemTttd7YwU lXSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=A4qhrGBB7f1ImMUQjw2ZKgOqKWcJqgmHu7USuIdXtmw=; b=LTGbrBSA6dw0L0hAvJgOtQ2++FVcMHHuZfnudlX7vNMq8BUPQ1vphoFBsoxoYk3bvi cAhrZSuE63Z3uBUZgaWDjRp7d9Aqi48Cf476RnW/WRlj80Q8GWrtd1iRH4gtmkBekmEy fJx+VKsKm9AiX+tBUbQTjSdrRwToqgEg4tftDbSkxRGuHXV2HY+WlOM9BaGQz6LrKSK0 0Y8t9k9zatuQ9wLispSR65SeOvTpwCNSAIo+tE3f2ca2S0kRyszPYdChijkl4iniKHpi 6v+4HZo8Wi4O7z7e/f+AkUxopfJ6GLGWboA+h1pfOM3Gr16Zd7ob+FaCkcJQtFNagXgC IyPg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=gNX8Gb7t; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i35si6872776edd.61.2020.05.18.07.04.35; Mon, 18 May 2020 07:05:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=gNX8Gb7t; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727844AbgEROAB (ORCPT + 99 others); Mon, 18 May 2020 10:00:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52990 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726989AbgEROAA (ORCPT ); Mon, 18 May 2020 10:00:00 -0400 Received: from mail-wm1-x344.google.com (mail-wm1-x344.google.com [IPv6:2a00:1450:4864:20::344]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 52039C061A0C for ; Mon, 18 May 2020 07:00:00 -0700 (PDT) Received: by mail-wm1-x344.google.com with SMTP id z4so8243790wmi.2 for ; Mon, 18 May 2020 07:00:00 -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=A4qhrGBB7f1ImMUQjw2ZKgOqKWcJqgmHu7USuIdXtmw=; b=gNX8Gb7t9f+17Sh19oR1/FX3dDWfwcfjItzuTVm38fPjpBZL5rxAWBVfbBDcXfzqo+ k9HBb0COHY0yTFuvcnwXC5s+tg8JiI3ChmbqhegauSCBPY4lgLCZEANVggSE4h1h++WL OeXJsMcN3fDmNgSEP0KBUlFjZenjg6iHt62Yi5WRgjwdj+V8DfWllTXH7GjxdsUombjb x++S50iPIAAuh2vN6g03F2bWnyyWwWbVcnFmsxsWByR8hrPDbf2U0RGwfZrPHyrMwECx tsIF9LXL4nWDYuYJTtiwQyy0yW+0cfOkluGsBW1r70EPWL69VM02NrC3gH/re2arOqTS PN2A== 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=A4qhrGBB7f1ImMUQjw2ZKgOqKWcJqgmHu7USuIdXtmw=; b=lzLjO8EtqObtRj1eOmxcy67s4h7lsq/BxgJPKvOmfQObfA3Bu9igk+xBJX2bhqj61t 0CLfu8XctdOl0V35eKJPZuxmJL2TOkUaRNCC2GXwmhOdmEnLr2tYzwiU8K9IZQ6GHLvJ rTxQ4MMRxedQEvbGy6NJ2eQIJca4rtTFtVEA3OXFEMorlqBeXCzIaJvkUp25geLigvqB NMnZYk8ZrroFK89+eSYs4MtME/cVfCgLAJzmb2gsdy74KCuh3t0NLnRupS6xL8zUSykN khVcnAmIBrWX5ZNz1/OOJoNQNI6MFsWUnvSY8du5pOq5PFR8ScDG8BnjE885U31w+Oze DJqA== X-Gm-Message-State: AOAM533kZe0xYrQn084oWrllWIlF0QUBHAqGeQclEXKPK+if0KUqt8I6 lLlp0ZvdN/uOTcU8BUlIask= X-Received: by 2002:a7b:c41a:: with SMTP id k26mr19981506wmi.85.1589810398945; Mon, 18 May 2020 06:59:58 -0700 (PDT) Received: from localhost.localdomain ([2a01:598:b884:8d4:84ab:c471:b6eb:fcab]) by smtp.gmail.com with ESMTPSA id 81sm18114519wme.16.2020.05.18.06.59.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2020 06:59:58 -0700 (PDT) From: Bean Huo To: miquel.raynal@bootlin.com, richard@nod.at, vigneshr@ti.com, s.hauer@pengutronix.de, boris.brezillon@collabora.com, derosier@gmail.com Cc: linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, huobean@gmail.com, Bean Huo Subject: [PATCH v4 1/5] mtd: rawnand: group all NAND specific ops into new nand_chip_ops Date: Mon, 18 May 2020 15:59:39 +0200 Message-Id: <20200518135943.11749-2-huobean@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200518135943.11749-1-huobean@gmail.com> References: <20200518135943.11749-1-huobean@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Bean Huo This patch is to create a new structure nand_chip_ops, and take all NAND specific functions out from nand_chip and put them in this new structure. Signed-off-by: Bean Huo --- drivers/mtd/nand/raw/nand_base.c | 20 +++++++++--------- drivers/mtd/nand/raw/nand_hynix.c | 2 +- drivers/mtd/nand/raw/nand_macronix.c | 10 ++++----- drivers/mtd/nand/raw/nand_micron.c | 2 +- include/linux/mtd/rawnand.h | 31 +++++++++++++++++----------- 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c index 2d2a216af120..7af21cf49290 100644 --- a/drivers/mtd/nand/raw/nand_base.c +++ b/drivers/mtd/nand/raw/nand_base.c @@ -3234,10 +3234,10 @@ static int nand_setup_read_retry(struct nand_chip *chip, int retry_mode) if (retry_mode >= chip->read_retries) return -EINVAL; - if (!chip->setup_read_retry) + if (!chip->ops.setup_read_retry) return -EOPNOTSUPP; - return chip->setup_read_retry(chip, retry_mode); + return chip->ops.setup_read_retry(chip, retry_mode); } static void nand_wait_readrdy(struct nand_chip *chip) @@ -4481,8 +4481,8 @@ static int nand_suspend(struct mtd_info *mtd) int ret = 0; mutex_lock(&chip->lock); - if (chip->suspend) - ret = chip->suspend(chip); + if (chip->ops.suspend) + ret = chip->ops.suspend(chip); if (!ret) chip->suspended = 1; mutex_unlock(&chip->lock); @@ -4500,8 +4500,8 @@ static void nand_resume(struct mtd_info *mtd) mutex_lock(&chip->lock); if (chip->suspended) { - if (chip->resume) - chip->resume(chip); + if (chip->ops.resume) + chip->ops.resume(chip); chip->suspended = 0; } else { pr_err("%s called for a chip which is not in suspended state\n", @@ -4530,10 +4530,10 @@ static int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) { struct nand_chip *chip = mtd_to_nand(mtd); - if (!chip->lock_area) + if (!chip->ops.lock_area) return -ENOTSUPP; - return chip->lock_area(chip, ofs, len); + return chip->ops.lock_area(chip, ofs, len); } /** @@ -4546,10 +4546,10 @@ static int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) { struct nand_chip *chip = mtd_to_nand(mtd); - if (!chip->unlock_area) + if (!chip->ops.unlock_area) return -ENOTSUPP; - return chip->unlock_area(chip, ofs, len); + return chip->ops.unlock_area(chip, ofs, len); } /* Set default functions */ diff --git a/drivers/mtd/nand/raw/nand_hynix.c b/drivers/mtd/nand/raw/nand_hynix.c index 7caedaa5b9e5..7d1be53f27f3 100644 --- a/drivers/mtd/nand/raw/nand_hynix.c +++ b/drivers/mtd/nand/raw/nand_hynix.c @@ -337,7 +337,7 @@ static int hynix_mlc_1xnm_rr_init(struct nand_chip *chip, rr->nregs = nregs; rr->regs = hynix_1xnm_mlc_read_retry_regs; hynix->read_retry = rr; - chip->setup_read_retry = hynix_nand_setup_read_retry; + chip->ops.setup_read_retry = hynix_nand_setup_read_retry; chip->read_retries = nmodes; out: diff --git a/drivers/mtd/nand/raw/nand_macronix.c b/drivers/mtd/nand/raw/nand_macronix.c index 09c254c97b5c..1472f925f386 100644 --- a/drivers/mtd/nand/raw/nand_macronix.c +++ b/drivers/mtd/nand/raw/nand_macronix.c @@ -130,7 +130,7 @@ static void macronix_nand_onfi_init(struct nand_chip *chip) return; chip->read_retries = MACRONIX_NUM_READ_RETRY_MODES; - chip->setup_read_retry = macronix_nand_setup_read_retry; + chip->ops.setup_read_retry = macronix_nand_setup_read_retry; if (p->supports_set_get_features) { bitmap_set(p->set_feature_list, @@ -242,8 +242,8 @@ static void macronix_nand_block_protection_support(struct nand_chip *chip) bitmap_set(chip->parameters.set_feature_list, ONFI_FEATURE_ADDR_MXIC_PROTECTION, 1); - chip->lock_area = mxic_nand_lock; - chip->unlock_area = mxic_nand_unlock; + chip->ops.lock_area = mxic_nand_lock; + chip->ops.unlock_area = mxic_nand_unlock; } static int nand_power_down_op(struct nand_chip *chip) @@ -312,8 +312,8 @@ static void macronix_nand_deep_power_down_support(struct nand_chip *chip) if (i < 0) return; - chip->suspend = mxic_nand_suspend; - chip->resume = mxic_nand_resume; + chip->ops.suspend = mxic_nand_suspend; + chip->ops.resume = mxic_nand_resume; } static int macronix_nand_init(struct nand_chip *chip) diff --git a/drivers/mtd/nand/raw/nand_micron.c b/drivers/mtd/nand/raw/nand_micron.c index b2b047b245f4..b3485b0995ad 100644 --- a/drivers/mtd/nand/raw/nand_micron.c +++ b/drivers/mtd/nand/raw/nand_micron.c @@ -84,7 +84,7 @@ static int micron_nand_onfi_init(struct nand_chip *chip) struct nand_onfi_vendor_micron *micron = (void *)p->onfi->vendor; chip->read_retries = micron->read_retry_options; - chip->setup_read_retry = micron_nand_setup_read_retry; + chip->ops.setup_read_retry = micron_nand_setup_read_retry; } if (p->supports_set_get_features) { diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h index 0f45b6984ad1..62932cc3ed8d 100644 --- a/include/linux/mtd/rawnand.h +++ b/include/linux/mtd/rawnand.h @@ -1025,6 +1025,23 @@ struct nand_legacy { struct nand_controller dummy_controller; }; +/** + * struct nand_chip_ops - NAND Chip specific operations + * @suspend: [REPLACEABLE] specific NAND device suspend operation + * @resume: [REPLACEABLE] specific NAND device resume operation + * @lock_area: [REPLACEABLE] specific NAND chip lock operation + * @unlock_area: [REPLACEABLE] specific NAND chip unlock operation + * @setup_read_retry: [FLASHSPECIFIC] flash (vendor) specific function for + * setting the read-retry mode. Mostly needed for MLC NAND. + */ +struct nand_chip_ops { + int (*suspend)(struct nand_chip *chip); + void (*resume)(struct nand_chip *chip); + int (*lock_area)(struct nand_chip *chip, loff_t ofs, u64 len); + int (*unlock_area)(struct nand_chip *chip, loff_t ofs, u64 len); + int (*setup_read_retry)(struct nand_chip *chip, int retry_mode); +}; + /** * struct nand_chip - NAND Private Flash Chip Data * @base: Inherit from the generic NAND device @@ -1033,8 +1050,6 @@ struct nand_legacy { * you're modifying an existing driver that is using those * fields/hooks, you should consider reworking the driver * avoid using them. - * @setup_read_retry: [FLASHSPECIFIC] flash (vendor) specific function for - * setting the read-retry mode. Mostly needed for MLC NAND. * @ecc: [BOARDSPECIFIC] ECC control structure * @buf_align: minimum buffer alignment required by a platform * @oob_poi: "poison value buffer," used for laying out OOB data @@ -1079,8 +1094,6 @@ struct nand_legacy { * @lock: lock protecting the suspended field. Also used to * serialize accesses to the NAND device. * @suspended: set to 1 when the device is suspended, 0 when it's not. - * @suspend: [REPLACEABLE] specific NAND device suspend operation - * @resume: [REPLACEABLE] specific NAND device resume operation * @bbt: [INTERN] bad block table pointer * @bbt_td: [REPLACEABLE] bad block table descriptor for flash * lookup. @@ -1094,8 +1107,7 @@ struct nand_legacy { * @manufacturer: [INTERN] Contains manufacturer information * @manufacturer.desc: [INTERN] Contains manufacturer's description * @manufacturer.priv: [INTERN] Contains manufacturer private information - * @lock_area: [REPLACEABLE] specific NAND chip lock operation - * @unlock_area: [REPLACEABLE] specific NAND chip unlock operation + * @ops: NAND-specific operations description structure */ struct nand_chip { @@ -1103,8 +1115,6 @@ struct nand_chip { struct nand_legacy legacy; - int (*setup_read_retry)(struct nand_chip *chip, int retry_mode); - unsigned int options; unsigned int bbt_options; @@ -1136,8 +1146,6 @@ struct nand_chip { struct mutex lock; unsigned int suspended : 1; - int (*suspend)(struct nand_chip *chip); - void (*resume)(struct nand_chip *chip); uint8_t *oob_poi; struct nand_controller *controller; @@ -1158,8 +1166,7 @@ struct nand_chip { void *priv; } manufacturer; - int (*lock_area)(struct nand_chip *chip, loff_t ofs, uint64_t len); - int (*unlock_area)(struct nand_chip *chip, loff_t ofs, uint64_t len); + struct nand_chip_ops ops; }; extern const struct mtd_ooblayout_ops nand_ooblayout_sp_ops; -- 2.17.1