From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751528AbcBWXUp (ORCPT ); Tue, 23 Feb 2016 18:20:45 -0500 Received: from mail-am1on0078.outbound.protection.outlook.com ([157.56.112.78]:1969 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750780AbcBWXUn (ORCPT ); Tue, 23 Feb 2016 18:20:43 -0500 Authentication-Results: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=nxp.com; From: Han Xu To: , , , , , , , , , CC: , Subject: [PATCH 1/5] mtd: nand: gpmi: add GPMI NAND support for i.MX7D Date: Tue, 23 Feb 2016 17:04:49 -0600 Message-ID: <1456268693-8630-2-git-send-email-han.xu@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1456268693-8630-1-git-send-email-han.xu@nxp.com> References: <1456268693-8630-1-git-send-email-han.xu@nxp.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [192.88.168.49] X-ClientProxiedBy: BY1PR20CA0015.namprd20.prod.outlook.com (2a01:111:e400:51a4::25) To AM2PR04MB0771.eurprd04.prod.outlook.com (2a01:111:e400:840b::23) X-Microsoft-Exchange-Diagnostics: 1;AM2PR04MB0771;2:VTuTe1+nZdOlF3f/VSgq8/QkbZvbzqi/6JAQ0pALZUm/WZeBKn0OROKKRPuhpBqnFdjvXURITn/I55j5ISSzVKZ+nxZ+5Un6IY8zagtrpvUYMrcTpwN3DLJD16TQETPXTySUsrIqy67a5UabUn3lhg==;3:6Pm9DSSu/I1yc9pe1PlX+IQGeLuIXdNXNv0WF6O2KRWY3bMxuK5PeIeZ2RP1pVhNIPdwtRL2cmJmMJ+Dxgth+vAteBngazuK+a7SoOV1ckVa9jdO8VCsMFEwkP95CpUM;25:RqRl0m1omgkkTCFCnuWMSysVd0qH2x3mYQPZtztib9qhDsQxhNaN0cGPLhID4AcaoF9Ik/+IV2yJ5csrhScnUgAZyK6q4fVYLLZo9fOaQiqLqiTtGS1J7rxOoLQn6iNz5fJr98dwCA24SjNa23HwFdF//bI8prCrfMq7eBC41QuQixl9gAfPKR0PiFJB2yjX/Fs/ZMZTuBERIwO9wQbNJ3+u+Bft3EWWyhb3bov7F0YDNGzy3zW7QUe2HzJKiSWRDwCK34L7KggMsxd2HMUBJDJ7eNvN6I6elMZRdxPI+UTLI++NyRPD80n3WH7uCJVbb+RGsjnLJMZ3WAM8Qu47D73HcbEFdkFLB+iKY7IyIdE= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM2PR04MB0771; X-MS-Office365-Filtering-Correlation-Id: cc4ba472-4d68-43bc-0973-08d33ca7f1a8 X-Microsoft-Exchange-Diagnostics: 1;AM2PR04MB0771;20:QvazgesQDygMwJKjJPJTcp+GOs4/U3364Wt2g9AlxukxFuedl2fK4Wf6x4yy81wo7L7pdgqH2KfbRT/9jve/+iYg9zrjztclLj9D5n3BoSUPrWIV9KY84lqUiikRFDfuhXfd5XsJaBdSDqd1mhUl3/IjP7pVKUTP4kRLDDaQ6rTF+ALMjABXTKGjPf6L7KZCIRLxJfjwMxWtgDKuk3XeXAGMJms5OpgOmVzClcA2zOyROrg4uZHLvWdBaYLfoX3Uzf6i4DgG6SN8yRW2Eb+DeOukPMDkftOet5jlOQbnqDeOjntSEeQmJlkLZrLIAcRXjipdHff1uyqWaV29C/gVGxi5d5mFPLrk2e7lKUAKvO+9lM9kG3tqfKSEJgMSleE21kC5JUxDBPxMhy4k2OCeW6T6IADaeofzco0et6ODTH0qRH6A2+4TYyYqdNPnpaa3cOLNSNPRQzaI2EL7F81Q8YUQKZATHaz4GvSyVScPmAJVk03QThgyk688oA8RI8l/;4:+tywMCbCxda2H54DQjLOSk1SNL3NNIBiUT3kjkXuvFuF9cTU0rvYYeeyQyoisIek8FfAVfoDC+028OBVJtp6mQXDUZcOywcswLn7zThIKOF16kygrhvWnRwIEW0fHSIrhdn8aG8E5sf+503IKg/muBPD0p7rq3iaBa8dJg2FJc+rsVZoma1PD2MpdxOxx018kcu7PjQe0QmSYaxACWHAPtHqflDsLSGduQS4cXj3hCfrzNStV52HcXkI5rZcZY07gKk6QxUslWBSypY7FX+ah2Q9/c0e8Ke0uRehjmB773d76nWDnRB7tz+mDF0Q0aG7WJOaGixDPCbS5AfVGxg/L0v4leKqKkkbSKmNsCq+0n/Glb9+ht+A0JGah/fos4lAvhLrKMRIKgFBG9Np8s5vzdwfwS8WZ0M6KJZd4U8zQ9M= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001);SRVR:AM2PR04MB0771;BCL:0;PCL:0;RULEID:;SRVR:AM2PR04MB0771; X-Forefront-PRVS: 08617F610C X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(42186005)(87976001)(3846002)(50986999)(189998001)(76176999)(5001960100002)(36756003)(575784001)(66066001)(5008740100001)(47776003)(2906002)(1096002)(4326007)(2201001)(586003)(5004730100002)(48376002)(50466002)(6116002)(33646002)(92566002)(50226001)(229853001)(86362001)(2950100001)(122386002)(5003940100001)(19580395003)(19580405001)(5001770100001)(40100003)(7059030)(921003)(2004002)(2101003)(1121003)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:AM2PR04MB0771;H:chopperman.am.freescale.net;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM2PR04MB0771;23:45Et68HrjxkRGVYWB0nivN9s9xIgM+XapnYqTBI3Q?= =?us-ascii?Q?0l+7EX9WGMQUtwLP2xTxIsvJ80EyDwWnFZgYIYThvudy/LgSOTsNv6ea5Wfq?= =?us-ascii?Q?Qn6lSCpDkixsVT0G5JS5oRNtkanJmcFSfhAVGFbHe7FDKuwIRgQrVXZzSS8m?= =?us-ascii?Q?v0kOoxGYMfrruW2SBVBK83/X7eoG8f7ttMUb+9ckr7Hbc+bkqyDe9cIVJ8+6?= =?us-ascii?Q?P8QUQweO+gLNwwYXKRlh3g2F3u+CwvCKV9P/zbeb6KboB48vmZDZtAE9Yzkp?= =?us-ascii?Q?Jx8IITX8NC1gaAfZg/ZnaPeWArjZX6HOstC/MYsYKqk1PYRs1eTb57/9aPjG?= =?us-ascii?Q?0kfP3gF1KzmCn/XfHRbjYYMEYFbs9P4qsTaJal5W4zrUwisZ6I7lFHUFJgy3?= =?us-ascii?Q?WaTht0td+EgDE+SSGBnkQw6FMpZVnBwn0TDbg/4Kw1KsIom6o/+8s3/5SAeH?= =?us-ascii?Q?foBg44Ylz0OO9BHYO1n4o3Y4Q3E8gv3o9kr3VqCjdjw8Qj3wiRfIjD6fVGvk?= =?us-ascii?Q?Gld4GoGK4/EXTlXaVbmEzU7xuNjft1pE8ty+nvp3ZEiKWGuJite+bz4wrFhm?= =?us-ascii?Q?VwtBCP3yfdO9ICFz5OwlNTvUozPyfNMjo0VRUTiHTSA01/1SvlVbkiw8waHc?= =?us-ascii?Q?F2SM0UMR92g8/M29VwWZKsSQWi76f6QA4T9wqlVMv7STE0dJE4F4vwv8Jn0V?= =?us-ascii?Q?U8di+DNChQQGXCVU0marcrkqakfs47E01oG376g1dvZRR1oFvKMw5oVa5H2X?= =?us-ascii?Q?YxONw8s/hejxMyT6F1z6vqmN3nmTsl8KuWPUqZ57x/4i1GkpA/BKs8BZdn4W?= =?us-ascii?Q?8Txuuzow2h2oGM5KvVVUPlsBnCllJoTsJaPEZJAzpGM+iVB8pCxo30b9PsJD?= =?us-ascii?Q?bUs/s+zq11sTMxJkkM88aPoBAMmB/9dWVbqh0pjkvFoGmXsNxzVae2RsnRhk?= =?us-ascii?Q?CAYDLb6JyvWRK9xFMzw1iWCFiaz4llvESS3qzXVsy7CZWM5OmKnzU1cPqBMd?= =?us-ascii?Q?orGcxKeUNVeUL6bptwTi0iGND0xdxOiN7T22XkjuzpuhZ0aUG4HbcVcN1Lew?= =?us-ascii?Q?R0DJsgQhr7qxf1KXghXiOZaTgughRspFrXAS2D5N0cSPKJbIA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM2PR04MB0771;5:SiGCX2z/7eEOLFztFIk223l6WS72wwLyxuLtGpVr5P1zWfcBCvJeysHabsSgearJun+XLul/4PC2+r5dvehFcpn5FRAOHy0ikYTs+Zj9yPwRlxX5VMpM21jlpz2wsXGW/jaoPQci3GL0JGmnAD4HEw==;24:EnTyagfP/XTSEW60rKQjyB55RwIkN+Qqyf7e0KEZkOab63eO6BcLA0KhYjydvWDZfC9LteCxD66j6G8NswN+sBkdPdAc0HpySHa+HdIUMTU= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Feb 2016 23:20:37.1680 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM2PR04MB0771 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Han Xu support GPMI NAND on i.MX7D Signed-off-by: Han Xu --- drivers/mtd/nand/gpmi-nand/bch-regs.h | 14 +++++++------- drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 10 ++++++---- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 27 ++++++++++++++++++++++----- drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 7 +++++-- 4 files changed, 40 insertions(+), 18 deletions(-) diff --git a/drivers/mtd/nand/gpmi-nand/bch-regs.h b/drivers/mtd/nand/gpmi-nand/bch-regs.h index 05bb91f..53e58bc 100644 --- a/drivers/mtd/nand/gpmi-nand/bch-regs.h +++ b/drivers/mtd/nand/gpmi-nand/bch-regs.h @@ -1,7 +1,7 @@ /* * Freescale GPMI NAND Flash Driver * - * Copyright 2008-2011 Freescale Semiconductor, Inc. + * Copyright 2008-2015 Freescale Semiconductor, Inc. * Copyright 2008 Embedded Alley Solutions, Inc. * * This program is free software; you can redistribute it and/or modify @@ -54,7 +54,7 @@ #define MX6Q_BP_BCH_FLASH0LAYOUT0_ECC0 11 #define MX6Q_BM_BCH_FLASH0LAYOUT0_ECC0 (0x1f << MX6Q_BP_BCH_FLASH0LAYOUT0_ECC0) #define BF_BCH_FLASH0LAYOUT0_ECC0(v, x) \ - (GPMI_IS_MX6(x) \ + ((GPMI_IS_MX6(x) || GPMI_IS_MX7(x)) \ ? (((v) << MX6Q_BP_BCH_FLASH0LAYOUT0_ECC0) \ & MX6Q_BM_BCH_FLASH0LAYOUT0_ECC0) \ : (((v) << BP_BCH_FLASH0LAYOUT0_ECC0) \ @@ -65,7 +65,7 @@ #define MX6Q_BM_BCH_FLASH0LAYOUT0_GF_13_14 \ (0x1 << MX6Q_BP_BCH_FLASH0LAYOUT0_GF_13_14) #define BF_BCH_FLASH0LAYOUT0_GF(v, x) \ - ((GPMI_IS_MX6(x) && ((v) == 14)) \ + (((GPMI_IS_MX6(x) || GPMI_IS_MX7(x)) && ((v) == 14))\ ? (((1) << MX6Q_BP_BCH_FLASH0LAYOUT0_GF_13_14) \ & MX6Q_BM_BCH_FLASH0LAYOUT0_GF_13_14) \ : 0 \ @@ -77,7 +77,7 @@ #define MX6Q_BM_BCH_FLASH0LAYOUT0_DATA0_SIZE \ (0x3ff << BP_BCH_FLASH0LAYOUT0_DATA0_SIZE) #define BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(v, x) \ - (GPMI_IS_MX6(x) \ + ((GPMI_IS_MX6(x) || GPMI_IS_MX7(x)) \ ? (((v) >> 2) & MX6Q_BM_BCH_FLASH0LAYOUT0_DATA0_SIZE) \ : ((v) & BM_BCH_FLASH0LAYOUT0_DATA0_SIZE) \ ) @@ -96,7 +96,7 @@ #define MX6Q_BP_BCH_FLASH0LAYOUT1_ECCN 11 #define MX6Q_BM_BCH_FLASH0LAYOUT1_ECCN (0x1f << MX6Q_BP_BCH_FLASH0LAYOUT1_ECCN) #define BF_BCH_FLASH0LAYOUT1_ECCN(v, x) \ - (GPMI_IS_MX6(x) \ + ((GPMI_IS_MX6(x) || GPMI_IS_MX7(x)) \ ? (((v) << MX6Q_BP_BCH_FLASH0LAYOUT1_ECCN) \ & MX6Q_BM_BCH_FLASH0LAYOUT1_ECCN) \ : (((v) << BP_BCH_FLASH0LAYOUT1_ECCN) \ @@ -107,7 +107,7 @@ #define MX6Q_BM_BCH_FLASH0LAYOUT1_GF_13_14 \ (0x1 << MX6Q_BP_BCH_FLASH0LAYOUT1_GF_13_14) #define BF_BCH_FLASH0LAYOUT1_GF(v, x) \ - ((GPMI_IS_MX6(x) && ((v) == 14)) \ + (((GPMI_IS_MX6(x) || GPMI_IS_MX7(x)) && ((v) == 14))\ ? (((1) << MX6Q_BP_BCH_FLASH0LAYOUT1_GF_13_14) \ & MX6Q_BM_BCH_FLASH0LAYOUT1_GF_13_14) \ : 0 \ @@ -119,7 +119,7 @@ #define MX6Q_BM_BCH_FLASH0LAYOUT1_DATAN_SIZE \ (0x3ff << BP_BCH_FLASH0LAYOUT1_DATAN_SIZE) #define BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(v, x) \ - (GPMI_IS_MX6(x) \ + ((GPMI_IS_MX6(x) || GPMI_IS_MX7(x)) \ ? (((v) >> 2) & MX6Q_BM_BCH_FLASH0LAYOUT1_DATAN_SIZE) \ : ((v) & BM_BCH_FLASH0LAYOUT1_DATAN_SIZE) \ ) diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c index 0f68a99..8acbe04 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c @@ -1,7 +1,7 @@ /* * Freescale GPMI NAND Flash Driver * - * Copyright (C) 2008-2011 Freescale Semiconductor, Inc. + * Copyright (C) 2008-2015 Freescale Semiconductor, Inc. * Copyright (C) 2008 Embedded Alley Solutions, Inc. * * This program is free software; you can redistribute it and/or modify @@ -971,7 +971,8 @@ int gpmi_extra_init(struct gpmi_nand_data *this) struct nand_chip *chip = &this->nand; /* Enable the asynchronous EDO feature. */ - if (GPMI_IS_MX6(this) && chip->onfi_version) { + if ((GPMI_IS_MX6(this) || GPMI_IS_MX7(this)) && + chip->onfi_version) { int mode = onfi_get_async_timing_mode(chip); /* We only support the timing mode 4 and mode 5. */ @@ -1093,12 +1094,13 @@ int gpmi_is_ready(struct gpmi_nand_data *this, unsigned chip) if (GPMI_IS_MX23(this)) { mask = MX23_BM_GPMI_DEBUG_READY0 << chip; reg = readl(r->gpmi_regs + HW_GPMI_DEBUG); - } else if (GPMI_IS_MX28(this) || GPMI_IS_MX6(this)) { + } else if (GPMI_IS_MX28(this) || GPMI_IS_MX6(this) || + GPMI_IS_MX7(this)) { /* * In the imx6, all the ready/busy pins are bound * together. So we only need to check chip 0. */ - if (GPMI_IS_MX6(this)) + if (GPMI_IS_MX6(this) || GPMI_IS_MX7(this)) chip = 0; /* MX28 shares the same R/B register as MX6Q. */ diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c index 8122c69..1aba6e6 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c @@ -77,6 +77,12 @@ static const struct gpmi_devdata gpmi_devdata_imx6sx = { .max_chain_delay = 12, }; +static const struct gpmi_devdata gpmi_devdata_imx7d = { + .type = IS_MX7D, + .bch_max_ecc_strength = 62, + .max_chain_delay = 12, +}; + static irqreturn_t bch_irq(int irq, void *cookie) { struct gpmi_nand_data *this = cookie; @@ -575,6 +581,10 @@ static char *extra_clks_for_mx6q[GPMI_CLK_MAX] = { "gpmi_apb", "gpmi_bch", "gpmi_bch_apb", "per1_bch", }; +static char *extra_clks_for_mx7d[GPMI_CLK_MAX] = { + "gpmi_bch_apb", +}; + static int gpmi_get_clks(struct gpmi_nand_data *this) { struct resources *r = &this->resources; @@ -592,6 +602,8 @@ static int gpmi_get_clks(struct gpmi_nand_data *this) /* Get extra clocks */ if (GPMI_IS_MX6(this)) extra_clks = extra_clks_for_mx6q; + if (GPMI_IS_MX7(this)) + extra_clks = extra_clks_for_mx7d; if (!extra_clks) return 0; @@ -608,7 +620,7 @@ static int gpmi_get_clks(struct gpmi_nand_data *this) r->clock[i] = clk; } - if (GPMI_IS_MX6(this)) + if (GPMI_IS_MX6(this) || GPMI_IS_MX7(this)) /* * Set the default value for the gpmi clock. * @@ -1868,8 +1880,8 @@ static int gpmi_init_last(struct gpmi_nand_data *this) * (1) the chip is imx6, and * (2) the size of the ECC parity is byte aligned. */ - if (GPMI_IS_MX6(this) && - ((bch_geo->gf_len * bch_geo->ecc_strength) % 8) == 0) { + if ((GPMI_IS_MX6(this) || GPMI_IS_MX7(this)) && + ((bch_geo->gf_len * bch_geo->ecc_strength) % 8) == 0) { ecc->read_subpage = gpmi_ecc_read_subpage; chip->options |= NAND_SUBPAGE_READ; } @@ -1934,7 +1946,8 @@ static int gpmi_nand_init(struct gpmi_nand_data *this) if (ret) goto err_out; - ret = nand_scan_ident(mtd, GPMI_IS_MX6(this) ? 2 : 1, NULL); + ret = nand_scan_ident(mtd, GPMI_IS_MX6(this) || + GPMI_IS_MX7(this) ? 2 : 1, NULL); if (ret) goto err_out; @@ -1977,7 +1990,11 @@ static const struct of_device_id gpmi_nand_id_table[] = { }, { .compatible = "fsl,imx6sx-gpmi-nand", .data = &gpmi_devdata_imx6sx, - }, {} + }, { + .compatible = "fsl,imx7d-gpmi-nand", + .data = (void *)&gpmi_devdata_imx7d, + }, { /* sentinel */ } + }; MODULE_DEVICE_TABLE(of, gpmi_nand_id_table); diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h index 4e49a1f..a82555f 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h @@ -1,7 +1,7 @@ /* * Freescale GPMI NAND Flash Driver * - * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. + * Copyright (C) 2010-2015 Freescale Semiconductor, Inc. * Copyright (C) 2008 Embedded Alley Solutions, Inc. * * This program is free software; you can redistribute it and/or modify @@ -123,7 +123,8 @@ enum gpmi_type { IS_MX23, IS_MX28, IS_MX6Q, - IS_MX6SX + IS_MX6SX, + IS_MX7D, }; struct gpmi_devdata { @@ -305,6 +306,8 @@ void gpmi_copy_bits(u8 *dst, size_t dst_bit_off, #define GPMI_IS_MX28(x) ((x)->devdata->type == IS_MX28) #define GPMI_IS_MX6Q(x) ((x)->devdata->type == IS_MX6Q) #define GPMI_IS_MX6SX(x) ((x)->devdata->type == IS_MX6SX) +#define GPMI_IS_MX7D(x) ((x)->devdata->type == IS_MX7D) #define GPMI_IS_MX6(x) (GPMI_IS_MX6Q(x) || GPMI_IS_MX6SX(x)) +#define GPMI_IS_MX7(x) (GPMI_IS_MX7D(x)) #endif -- 1.9.1