From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Subject: [PATCH 06/10] mtd: mxc_nand: split chip_select function and put it into devtype struct Date: Mon, 23 Apr 2012 11:23:38 +0200 Message-ID: <1335173022-22371-6-git-send-email-u.kleine-koenig@pengutronix.de> References: <20120423092240.GA18013@pengutronix.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20120423092240.GA18013-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: devicetree-discuss-bounces+gldd-devicetree-discuss=m.gmane.org-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Sender: devicetree-discuss-bounces+gldd-devicetree-discuss=m.gmane.org-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org To: linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, kernel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org List-Id: devicetree@vger.kernel.org U2lnbmVkLW9mZi1ieTogVXdlIEtsZWluZS1Lw7ZuaWcgPHUua2xlaW5lLWtvZW5pZ0BwZW5ndXRy b25peC5kZT4KLS0tCiBkcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMgfCAgIDMzICsrKysrKysr KysrKysrKysrKysrKysrKysrKystLS0tLQogMSBmaWxlIGNoYW5nZWQsIDI4IGluc2VydGlvbnMo KyksIDUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9teGNfbmFu ZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9teGNfbmFuZC5jCmluZGV4IDEzODlkNDAuLmJlMTdiN2Eg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYworKysgYi9kcml2ZXJzL210 ZC9uYW5kL214Y19uYW5kLmMKQEAgLTE1Myw2ICsxNTMsNyBAQCBzdHJ1Y3QgbXhjX25hbmRfZGV2 dHlwZV9kYXRhIHsKIAl2b2lkICgqaXJxX2NvbnRyb2wpKHN0cnVjdCBteGNfbmFuZF9ob3N0ICos IGludCk7CiAJdTMyICgqZ2V0X2VjY19zdGF0dXMpKHN0cnVjdCBteGNfbmFuZF9ob3N0ICopOwog CXN0cnVjdCBuYW5kX2VjY2xheW91dCAqZWNjbGF5b3V0XzUxMiwgKmVjY2xheW91dF8yaywgKmVj Y2xheW91dF80azsKKwl2b2lkICgqc2VsZWN0X2NoaXApKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBp bnQgY2hpcCk7CiB9OwogCiBzdHJ1Y3QgbXhjX25hbmRfaG9zdCB7CkBAIC03MjIsNyArNzIzLDcg QEAgc3RhdGljIGludCBteGNfbmFuZF92ZXJpZnlfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAog CiAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdXBwZXIgbGF5ZXIgZm9yIHNlbGVjdCBhbmQK ICAqIGRlc2VsZWN0IG9mIHRoZSBOQU5EIGNoaXAgKi8KLXN0YXRpYyB2b2lkIG14Y19uYW5kX3Nl bGVjdF9jaGlwKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY2hpcCkKK3N0YXRpYyB2b2lkIG14 Y19uYW5kX3NlbGVjdF9jaGlwX3YxX3YzKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY2hpcCkK IHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kX2NoaXAgPSBtdGQtPnByaXY7CiAJc3RydWN0IG14 Y19uYW5kX2hvc3QgKmhvc3QgPSBuYW5kX2NoaXAtPnByaXY7CkBAIC03NDEsMTEgKzc0MiwzMCBA QCBzdGF0aWMgdm9pZCBteGNfbmFuZF9zZWxlY3RfY2hpcChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwg aW50IGNoaXApCiAJCWNsa19lbmFibGUoaG9zdC0+Y2xrKTsKIAkJaG9zdC0+Y2xrX2FjdCA9IDE7 CiAJfQorfQorCitzdGF0aWMgdm9pZCBteGNfbmFuZF9zZWxlY3RfY2hpcF92MihzdHJ1Y3QgbXRk X2luZm8gKm10ZCwgaW50IGNoaXApCit7CisJc3RydWN0IG5hbmRfY2hpcCAqbmFuZF9jaGlwID0g bXRkLT5wcml2OworCXN0cnVjdCBteGNfbmFuZF9ob3N0ICpob3N0ID0gbmFuZF9jaGlwLT5wcml2 OworCisJaWYgKGNoaXAgPT0gLTEpIHsKKwkJLyogRGlzYWJsZSB0aGUgTkZDIGNsb2NrICovCisJ CWlmIChob3N0LT5jbGtfYWN0KSB7CisJCQljbGtfZGlzYWJsZShob3N0LT5jbGspOworCQkJaG9z dC0+Y2xrX2FjdCA9IDA7CisJCX0KKwkJcmV0dXJuOworCX0KIAotCWlmIChuZmNfaXNfdjIxKCkp IHsKLQkJaG9zdC0+YWN0aXZlX2NzID0gY2hpcDsKLQkJd3JpdGV3KGhvc3QtPmFjdGl2ZV9jcyA8 PCA0LCBORkNfVjFfVjJfQlVGX0FERFIpOworCWlmICghaG9zdC0+Y2xrX2FjdCkgeworCQkvKiBF bmFibGUgdGhlIE5GQyBjbG9jayAqLworCQljbGtfZW5hYmxlKGhvc3QtPmNsayk7CisJCWhvc3Qt PmNsa19hY3QgPSAxOwogCX0KKworCWhvc3QtPmFjdGl2ZV9jcyA9IGNoaXA7CisJd3JpdGV3KGhv c3QtPmFjdGl2ZV9jcyA8PCA0LCBORkNfVjFfVjJfQlVGX0FERFIpOwogfQogCiAvKgpAQCAtMTEx OCw2ICsxMTM4LDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9kZXZ0eXBlX2RhdGEg aW14MjFfbmFuZF9kZXZ0eXBlX2RhdGEgPSB7CiAJLmVjY2xheW91dF81MTIgPSAmbmFuZHYxX2h3 X2VjY29vYl9zbWFsbHBhZ2UsCiAJLmVjY2xheW91dF8yayA9ICZuYW5kdjFfaHdfZWNjb29iX2xh cmdlcGFnZSwKIAkuZWNjbGF5b3V0XzRrID0gJm5hbmR2MV9od19lY2Nvb2Jfc21hbGxwYWdlLCAv KiBYWFg6IG5lZWRzIGZpeCAqLworCS5zZWxlY3RfY2hpcCA9IG14Y19uYW5kX3NlbGVjdF9jaGlw X3YxX3YzLAogfTsKIAogLyogdjIxOiAyNSwgMzUgKi8KQEAgLTExMzQsNiArMTE1NSw3IEBAIHN0 YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX25hbmRfZGV2dHlwZV9kYXRhIGlteDI1X25hbmRfZGV2dHlw ZV9kYXRhID0gewogCS5lY2NsYXlvdXRfNTEyID0gJm5hbmR2Ml9od19lY2Nvb2Jfc21hbGxwYWdl LAogCS5lY2NsYXlvdXRfMmsgPSAmbmFuZHYyX2h3X2VjY29vYl9sYXJnZXBhZ2UsCiAJLmVjY2xh eW91dF80ayA9ICZuYW5kdjJfaHdfZWNjb29iXzRrLAorCS5zZWxlY3RfY2hpcCA9IG14Y19uYW5k X3NlbGVjdF9jaGlwX3YyLAogfTsKIAogLyogdjM6IDUxLCA1MyAqLwpAQCAtMTE1MCw2ICsxMTcy LDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9kZXZ0eXBlX2RhdGEgaW14NTFfbmFu ZF9kZXZ0eXBlX2RhdGEgPSB7CiAJLmVjY2xheW91dF81MTIgPSAmbmFuZHYyX2h3X2VjY29vYl9z bWFsbHBhZ2UsCiAJLmVjY2xheW91dF8yayA9ICZuYW5kdjJfaHdfZWNjb29iX2xhcmdlcGFnZSwK IAkuZWNjbGF5b3V0XzRrID0gJm5hbmR2Ml9od19lY2Nvb2Jfc21hbGxwYWdlLCAvKiBYWFg6IG5l ZWRzIGZpeCAqLworCS5zZWxlY3RfY2hpcCA9IG14Y19uYW5kX3NlbGVjdF9jaGlwX3YxX3YzLAog fTsKIAogc3RhdGljIGludCBfX2luaXQgbXhjbmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKQEAgLTExODQsNyArMTIwNyw2IEBAIHN0YXRpYyBpbnQgX19pbml0IG14Y25kX3By b2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJdGhpcy0+cHJpdiA9IGhvc3Q7CiAJ dGhpcy0+ZGV2X3JlYWR5ID0gbXhjX25hbmRfZGV2X3JlYWR5OwogCXRoaXMtPmNtZGZ1bmMgPSBt eGNfbmFuZF9jb21tYW5kOwotCXRoaXMtPnNlbGVjdF9jaGlwID0gbXhjX25hbmRfc2VsZWN0X2No aXA7CiAJdGhpcy0+cmVhZF9ieXRlID0gbXhjX25hbmRfcmVhZF9ieXRlOwogCXRoaXMtPnJlYWRf d29yZCA9IG14Y19uYW5kX3JlYWRfd29yZDsKIAl0aGlzLT53cml0ZV9idWYgPSBteGNfbmFuZF93 cml0ZV9idWY7CkBAIC0xMjQ3LDYgKzEyNjksNyBAQCBzdGF0aWMgaW50IF9faW5pdCBteGNuZF9w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCX0gZWxzZQogCQlCVUcoKTsKIAor CXRoaXMtPnNlbGVjdF9jaGlwID0gaG9zdC0+ZGV2dHlwZV9kYXRhLT5zZWxlY3RfY2hpcDsKIAl0 aGlzLT5lY2Muc2l6ZSA9IDUxMjsKIAl0aGlzLT5lY2MubGF5b3V0ID0gaG9zdC0+ZGV2dHlwZV9k YXRhLT5lY2NsYXlvdXRfNTEyOwogCi0tIAoxLjcuMTAKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmRldmljZXRyZWUtZGlzY3VzcyBtYWlsaW5nIGxpc3QK ZGV2aWNldHJlZS1kaXNjdXNzQGxpc3RzLm96bGFicy5vcmcKaHR0cHM6Ly9saXN0cy5vemxhYnMu b3JnL2xpc3RpbmZvL2RldmljZXRyZWUtZGlzY3Vzcwo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from metis.ext.pengutronix.de ([2001:6f8:1178:4:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1SMFVG-0001vf-Io for linux-mtd@lists.infradead.org; Mon, 23 Apr 2012 09:24:16 +0000 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= To: linux-mtd@lists.infradead.org Subject: [PATCH 06/10] mtd: mxc_nand: split chip_select function and put it into devtype struct Date: Mon, 23 Apr 2012 11:23:38 +0200 Message-Id: <1335173022-22371-6-git-send-email-u.kleine-koenig@pengutronix.de> In-Reply-To: <20120423092240.GA18013@pengutronix.de> References: <20120423092240.GA18013@pengutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: devicetree-discuss@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, kernel@pengutronix.de List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Signed-off-by: Uwe Kleine-König --- drivers/mtd/nand/mxc_nand.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index 1389d40..be17b7a 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c @@ -153,6 +153,7 @@ struct mxc_nand_devtype_data { void (*irq_control)(struct mxc_nand_host *, int); u32 (*get_ecc_status)(struct mxc_nand_host *); struct nand_ecclayout *ecclayout_512, *ecclayout_2k, *ecclayout_4k; + void (*select_chip)(struct mtd_info *mtd, int chip); }; struct mxc_nand_host { @@ -722,7 +723,7 @@ static int mxc_nand_verify_buf(struct mtd_info *mtd, /* This function is used by upper layer for select and * deselect of the NAND chip */ -static void mxc_nand_select_chip(struct mtd_info *mtd, int chip) +static void mxc_nand_select_chip_v1_v3(struct mtd_info *mtd, int chip) { struct nand_chip *nand_chip = mtd->priv; struct mxc_nand_host *host = nand_chip->priv; @@ -741,11 +742,30 @@ static void mxc_nand_select_chip(struct mtd_info *mtd, int chip) clk_enable(host->clk); host->clk_act = 1; } +} + +static void mxc_nand_select_chip_v2(struct mtd_info *mtd, int chip) +{ + struct nand_chip *nand_chip = mtd->priv; + struct mxc_nand_host *host = nand_chip->priv; + + if (chip == -1) { + /* Disable the NFC clock */ + if (host->clk_act) { + clk_disable(host->clk); + host->clk_act = 0; + } + return; + } - if (nfc_is_v21()) { - host->active_cs = chip; - writew(host->active_cs << 4, NFC_V1_V2_BUF_ADDR); + if (!host->clk_act) { + /* Enable the NFC clock */ + clk_enable(host->clk); + host->clk_act = 1; } + + host->active_cs = chip; + writew(host->active_cs << 4, NFC_V1_V2_BUF_ADDR); } /* @@ -1118,6 +1138,7 @@ static const struct mxc_nand_devtype_data imx21_nand_devtype_data = { .ecclayout_512 = &nandv1_hw_eccoob_smallpage, .ecclayout_2k = &nandv1_hw_eccoob_largepage, .ecclayout_4k = &nandv1_hw_eccoob_smallpage, /* XXX: needs fix */ + .select_chip = mxc_nand_select_chip_v1_v3, }; /* v21: 25, 35 */ @@ -1134,6 +1155,7 @@ static const struct mxc_nand_devtype_data imx25_nand_devtype_data = { .ecclayout_512 = &nandv2_hw_eccoob_smallpage, .ecclayout_2k = &nandv2_hw_eccoob_largepage, .ecclayout_4k = &nandv2_hw_eccoob_4k, + .select_chip = mxc_nand_select_chip_v2, }; /* v3: 51, 53 */ @@ -1150,6 +1172,7 @@ static const struct mxc_nand_devtype_data imx51_nand_devtype_data = { .ecclayout_512 = &nandv2_hw_eccoob_smallpage, .ecclayout_2k = &nandv2_hw_eccoob_largepage, .ecclayout_4k = &nandv2_hw_eccoob_smallpage, /* XXX: needs fix */ + .select_chip = mxc_nand_select_chip_v1_v3, }; static int __init mxcnd_probe(struct platform_device *pdev) @@ -1184,7 +1207,6 @@ static int __init mxcnd_probe(struct platform_device *pdev) this->priv = host; this->dev_ready = mxc_nand_dev_ready; this->cmdfunc = mxc_nand_command; - this->select_chip = mxc_nand_select_chip; this->read_byte = mxc_nand_read_byte; this->read_word = mxc_nand_read_word; this->write_buf = mxc_nand_write_buf; @@ -1247,6 +1269,7 @@ static int __init mxcnd_probe(struct platform_device *pdev) } else BUG(); + this->select_chip = host->devtype_data->select_chip; this->ecc.size = 512; this->ecc.layout = host->devtype_data->ecclayout_512; -- 1.7.10 From mboxrd@z Thu Jan 1 00:00:00 1970 From: u.kleine-koenig@pengutronix.de (=?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?=) Date: Mon, 23 Apr 2012 11:23:38 +0200 Subject: [PATCH 06/10] mtd: mxc_nand: split chip_select function and put it into devtype struct In-Reply-To: <20120423092240.GA18013@pengutronix.de> References: <20120423092240.GA18013@pengutronix.de> Message-ID: <1335173022-22371-6-git-send-email-u.kleine-koenig@pengutronix.de> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Signed-off-by: Uwe Kleine-K?nig --- drivers/mtd/nand/mxc_nand.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index 1389d40..be17b7a 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c @@ -153,6 +153,7 @@ struct mxc_nand_devtype_data { void (*irq_control)(struct mxc_nand_host *, int); u32 (*get_ecc_status)(struct mxc_nand_host *); struct nand_ecclayout *ecclayout_512, *ecclayout_2k, *ecclayout_4k; + void (*select_chip)(struct mtd_info *mtd, int chip); }; struct mxc_nand_host { @@ -722,7 +723,7 @@ static int mxc_nand_verify_buf(struct mtd_info *mtd, /* This function is used by upper layer for select and * deselect of the NAND chip */ -static void mxc_nand_select_chip(struct mtd_info *mtd, int chip) +static void mxc_nand_select_chip_v1_v3(struct mtd_info *mtd, int chip) { struct nand_chip *nand_chip = mtd->priv; struct mxc_nand_host *host = nand_chip->priv; @@ -741,11 +742,30 @@ static void mxc_nand_select_chip(struct mtd_info *mtd, int chip) clk_enable(host->clk); host->clk_act = 1; } +} + +static void mxc_nand_select_chip_v2(struct mtd_info *mtd, int chip) +{ + struct nand_chip *nand_chip = mtd->priv; + struct mxc_nand_host *host = nand_chip->priv; + + if (chip == -1) { + /* Disable the NFC clock */ + if (host->clk_act) { + clk_disable(host->clk); + host->clk_act = 0; + } + return; + } - if (nfc_is_v21()) { - host->active_cs = chip; - writew(host->active_cs << 4, NFC_V1_V2_BUF_ADDR); + if (!host->clk_act) { + /* Enable the NFC clock */ + clk_enable(host->clk); + host->clk_act = 1; } + + host->active_cs = chip; + writew(host->active_cs << 4, NFC_V1_V2_BUF_ADDR); } /* @@ -1118,6 +1138,7 @@ static const struct mxc_nand_devtype_data imx21_nand_devtype_data = { .ecclayout_512 = &nandv1_hw_eccoob_smallpage, .ecclayout_2k = &nandv1_hw_eccoob_largepage, .ecclayout_4k = &nandv1_hw_eccoob_smallpage, /* XXX: needs fix */ + .select_chip = mxc_nand_select_chip_v1_v3, }; /* v21: 25, 35 */ @@ -1134,6 +1155,7 @@ static const struct mxc_nand_devtype_data imx25_nand_devtype_data = { .ecclayout_512 = &nandv2_hw_eccoob_smallpage, .ecclayout_2k = &nandv2_hw_eccoob_largepage, .ecclayout_4k = &nandv2_hw_eccoob_4k, + .select_chip = mxc_nand_select_chip_v2, }; /* v3: 51, 53 */ @@ -1150,6 +1172,7 @@ static const struct mxc_nand_devtype_data imx51_nand_devtype_data = { .ecclayout_512 = &nandv2_hw_eccoob_smallpage, .ecclayout_2k = &nandv2_hw_eccoob_largepage, .ecclayout_4k = &nandv2_hw_eccoob_smallpage, /* XXX: needs fix */ + .select_chip = mxc_nand_select_chip_v1_v3, }; static int __init mxcnd_probe(struct platform_device *pdev) @@ -1184,7 +1207,6 @@ static int __init mxcnd_probe(struct platform_device *pdev) this->priv = host; this->dev_ready = mxc_nand_dev_ready; this->cmdfunc = mxc_nand_command; - this->select_chip = mxc_nand_select_chip; this->read_byte = mxc_nand_read_byte; this->read_word = mxc_nand_read_word; this->write_buf = mxc_nand_write_buf; @@ -1247,6 +1269,7 @@ static int __init mxcnd_probe(struct platform_device *pdev) } else BUG(); + this->select_chip = host->devtype_data->select_chip; this->ecc.size = 512; this->ecc.layout = host->devtype_data->ecclayout_512; -- 1.7.10