Patchwork [1/1] mtd: st fsmc_nand: pass the ale and cmd resource via resource

login
register
mail settings
Submitter Jean-Christophe PLAGNIOL-VILLARD
Date Oct. 4, 2012, 1:14 p.m.
Message ID <1349356456-13371-1-git-send-email-plagnioj@jcrosoft.com>
Download mbox | patch
Permalink /patch/189094/
State Accepted
Commit 6d7b42a447f92eb3e7e410bbf62042693eb040f7
Headers show

Comments

Jean-Christophe PLAGNIOL-VILLARD - Oct. 4, 2012, 1:14 p.m.
Do not use the platform_data to pass resource and be smart in the drivers.
Just pass it via resource

Switch to devm_request_and_ioremap at the sametime

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Vipin Kumar <vipin.kumar@st.com>
Cc: linux-mtd@lists.infradead.org
---
 .../devicetree/bindings/mtd/fsmc-nand.txt          |   12 +++---
 arch/arm/boot/dts/spear13xx.dtsi                   |   10 ++---
 arch/arm/boot/dts/spear300.dtsi                    |    8 ++--
 arch/arm/boot/dts/spear310.dtsi                    |    8 ++--
 arch/arm/boot/dts/spear320.dtsi                    |    8 ++--
 arch/arm/boot/dts/spear600.dtsi                    |    8 ++--
 arch/arm/mach-u300/core.c                          |   14 ++++++-
 drivers/mtd/nand/fsmc_nand.c                       |   44 +++++---------------
 include/linux/mtd/fsmc.h                           |    3 --
 9 files changed, 49 insertions(+), 66 deletions(-)
Linus Walleij - Oct. 5, 2012, 12:49 p.m.
On Thu, Oct 4, 2012 at 3:14 PM, Jean-Christophe PLAGNIOL-VILLARD
<plagnioj@jcrosoft.com> wrote:

> Do not use the platform_data to pass resource and be smart in the drivers.
> Just pass it via resource
>
> Switch to devm_request_and_ioremap at the sametime
>
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Vipin Kumar <vipin.kumar@st.com>
> Cc: linux-mtd@lists.infradead.org

This is much better. Actually I was confused by these offsets recently...
Acked-by: Linus Walleij <linus.walleij@linaro.org>

My patch to convert the Nomadik to the FSMC driver will collide with this,
but I can sure fix it up as we run into it, no big deal.

Yours,
Linus Walleij
Jean-Christophe PLAGNIOL-VILLARD - Oct. 5, 2012, 2:20 p.m.
On 14:49 Fri 05 Oct     , Linus Walleij wrote:
> 
> On Thu, Oct 4, 2012 at 3:14 PM, Jean-Christophe PLAGNIOL-VILLARD
> <plagnioj@jcrosoft.com> wrote:
> 
> > Do not use the platform_data to pass resource and be smart in the drivers.
> > Just pass it via resource
> >
> > Switch to devm_request_and_ioremap at the sametime
> >
> > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> > Cc: Linus Walleij <linus.walleij@linaro.org>
> > Cc: Vipin Kumar <vipin.kumar@st.com>
> > Cc: linux-mtd@lists.infradead.org
> 
> This is much better. Actually I was confused by these offsets recently...
> Acked-by: Linus Walleij <linus.walleij@linaro.org>
> 
> My patch to convert the Nomadik to the FSMC driver will collide with this,
> but I can sure fix it up as we run into it, no big deal.
ha you did it too

I'll give it a try

Best Regards,
J.
Vipin Kumar - Oct. 8, 2012, 4:08 a.m.
On 10/4/2012 6:44 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> Do not use the platform_data to pass resource and be smart in the drivers.
> Just pass it via resource
>
> Switch to devm_request_and_ioremap at the sametime
>
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD<plagnioj@jcrosoft.com>
> Cc: Linus Walleij<linus.walleij@linaro.org>
> Cc: Vipin Kumar<vipin.kumar@st.com>
> Cc: linux-mtd@lists.infradead.org
> ---
>   .../devicetree/bindings/mtd/fsmc-nand.txt          |   12 +++---
>   arch/arm/boot/dts/spear13xx.dtsi                   |   10 ++---
>   arch/arm/boot/dts/spear300.dtsi                    |    8 ++--
>   arch/arm/boot/dts/spear310.dtsi                    |    8 ++--
>   arch/arm/boot/dts/spear320.dtsi                    |    8 ++--
>   arch/arm/boot/dts/spear600.dtsi                    |    8 ++--
>   arch/arm/mach-u300/core.c                          |   14 ++++++-
>   drivers/mtd/nand/fsmc_nand.c                       |   44 +++++---------------
>   include/linux/mtd/fsmc.h                           |    3 --
>   9 files changed, 49 insertions(+), 66 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/mtd/fsmc-nand.txt b/Documentation/devicetree/bindings/mtd/fsmc-nand.txt
> index e2c663b..e3ea32e 100644
> --- a/Documentation/devicetree/bindings/mtd/fsmc-nand.txt
> +++ b/Documentation/devicetree/bindings/mtd/fsmc-nand.txt
> @@ -3,9 +3,7 @@
>   Required properties:
>   - compatible : "st,spear600-fsmc-nand"
>   - reg : Address range of the mtd chip
> -- reg-names: Should contain the reg names "fsmc_regs" and "nand_data"
> -- st,ale-off : Chip specific offset to ALE
> -- st,cle-off : Chip specific offset to CLE
> +- reg-names: Should contain the reg names "fsmc_regs", "nand_data", "nand_addr" and "nand_cmd"
>
>   Optional properties:
>   - bank-width : Width (in bytes) of the device.  If not present, the width
> @@ -19,10 +17,10 @@ Example:
>   		#address-cells =<1>;
>   		#size-cells =<1>;
>   		reg =<0xd1800000 0x1000	/* FSMC Register */
> -		       0xd2000000 0x4000>;	/* NAND Base */
> -		reg-names = "fsmc_regs", "nand_data";
> -		st,ale-off =<0x20000>;
> -		st,cle-off =<0x10000>;
> +		       0xd2000000 0x0010	/* NAND Base DATA */
> +		       0xd2020000 0x0010	/* NAND Base ADDR */
> +		       0xd2010000 0x0010>;	/* NAND Base CMD */
> +		reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
>
>   		bank-width =<1>;
>   		nand-skip-bbtscan;
> diff --git a/arch/arm/boot/dts/spear13xx.dtsi b/arch/arm/boot/dts/spear13xx.dtsi
> index f7b84ac..14a6d15 100644
> --- a/arch/arm/boot/dts/spear13xx.dtsi
> +++ b/arch/arm/boot/dts/spear13xx.dtsi
> @@ -104,15 +104,15 @@
>   			compatible = "st,spear600-fsmc-nand";
>   			#address-cells =<1>;
>   			#size-cells =<1>;
> -			reg =<0xb0000000 0x1000	/* FSMC Register */
> -			       0xb0800000 0x0010>;	/* NAND Base */
> -			reg-names = "fsmc_regs", "nand_data";
> +			reg =<0xb0000000 0x1000	/* FSMC Register*/
> +			       0xb0800000 0x0010	/* NAND Base DATA */
> +			       0xb0820000 0x0010	/* NAND Base ADDR */
> +			       0xb0810000 0x0010>;	/* NAND Base CMD */
> +			reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
>   			interrupts =<0 20 0x4
>   				      0 21 0x4
>   				      0 22 0x4
>   				      0 23 0x4>;
> -			st,ale-off =<0x20000>;
> -			st,cle-off =<0x10000>;
>   			status = "disabled";
>   		};
>
> diff --git a/arch/arm/boot/dts/spear300.dtsi b/arch/arm/boot/dts/spear300.dtsi
> index ed3627c..bc43638 100644
> --- a/arch/arm/boot/dts/spear300.dtsi
> +++ b/arch/arm/boot/dts/spear300.dtsi
> @@ -38,10 +38,10 @@
>   			#address-cells =<1>;
>   			#size-cells =<1>;
>   			reg =<0x94000000 0x1000	/* FSMC Register */
> -			       0x80000000 0x0010>;	/* NAND Base */
> -			reg-names = "fsmc_regs", "nand_data";
> -			st,ale-off =<0x20000>;
> -			st,cle-off =<0x10000>;
> +			       0x80000000 0x0010	/* NAND Base DATA */
> +			       0x80020000 0x0010	/* NAND Base ADDR */
> +			       0x80010000 0x0010>;	/* NAND Base CMD */
> +			reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
>   			status = "disabled";
>   		};
>
> diff --git a/arch/arm/boot/dts/spear310.dtsi b/arch/arm/boot/dts/spear310.dtsi
> index 62fc4fb..7840e52 100644
> --- a/arch/arm/boot/dts/spear310.dtsi
> +++ b/arch/arm/boot/dts/spear310.dtsi
> @@ -32,10 +32,10 @@
>   			#address-cells =<1>;
>   			#size-cells =<1>;
>   			reg =<0x44000000 0x1000	/* FSMC Register */
> -			       0x40000000 0x0010>;	/* NAND Base */
> -			reg-names = "fsmc_regs", "nand_data";
> -			st,ale-off =<0x10000>;
> -			st,cle-off =<0x20000>;
> +			       0x40000000 0x0010	/* NAND Base DATA */
> +			       0x40020000 0x0010	/* NAND Base ADDR */
> +			       0x40010000 0x0010>;	/* NAND Base CMD */
> +			reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
>   			status = "disabled";
>   		};
>
> diff --git a/arch/arm/boot/dts/spear320.dtsi b/arch/arm/boot/dts/spear320.dtsi
> index 1f49d69..5ad8206 100644
> --- a/arch/arm/boot/dts/spear320.dtsi
> +++ b/arch/arm/boot/dts/spear320.dtsi
> @@ -38,10 +38,10 @@
>   			#address-cells =<1>;
>   			#size-cells =<1>;
>   			reg =<0x4c000000 0x1000	/* FSMC Register */
> -			       0x50000000 0x0010>;	/* NAND Base */
> -			reg-names = "fsmc_regs", "nand_data";
> -			st,ale-off =<0x20000>;
> -			st,cle-off =<0x10000>;
> +			       0x50000000 0x0010	/* NAND Base DATA */
> +			       0x50020000 0x0010	/* NAND Base ADDR */
> +			       0x50010000 0x0010>;	/* NAND Base CMD */
> +			reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
>   			status = "disabled";
>   		};
>
> diff --git a/arch/arm/boot/dts/spear600.dtsi b/arch/arm/boot/dts/spear600.dtsi
> index a3c36e4..4ecc66f 100644
> --- a/arch/arm/boot/dts/spear600.dtsi
> +++ b/arch/arm/boot/dts/spear600.dtsi
> @@ -67,10 +67,10 @@
>   			#address-cells =<1>;
>   			#size-cells =<1>;
>   			reg =<0xd1800000 0x1000	/* FSMC Register */
> -			       0xd2000000 0x4000>;	/* NAND Base */
> -			reg-names = "fsmc_regs", "nand_data";
> -			st,ale-off =<0x20000>;
> -			st,cle-off =<0x10000>;
> +			       0xd2000000 0x0010	/* NAND Base DATA */
> +			       0xd2020000 0x0010	/* NAND Base ADDR */
> +			       0xd2010000 0x0010>;	/* NAND Base CMD */
> +			reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
>   			status = "disabled";
>   		};
>
> diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c
> index ef6f602..527bcc2 100644
> --- a/arch/arm/mach-u300/core.c
> +++ b/arch/arm/mach-u300/core.c
> @@ -252,6 +252,18 @@ static struct resource rtc_resources[] = {
>    */
>   static struct resource fsmc_resources[] = {
>   	{
> +		.name  = "nand_addr",
> +		.start = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_ALE,
> +		.end   = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_ALE + SZ_16K - 1,
> +		.flags = IORESOURCE_MEM,
> +	},
> +	{
> +		.name  = "nand_cmd",
> +		.start = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_CLE,
> +		.end   = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_CLE + SZ_16K - 1,
> +		.flags = IORESOURCE_MEM,
> +	},
> +	{
>   		.name  = "nand_data",
>   		.start = U300_NAND_CS0_PHYS_BASE,
>   		.end   = U300_NAND_CS0_PHYS_BASE + SZ_16K - 1,
> @@ -1496,8 +1508,6 @@ static struct fsmc_nand_platform_data nand_platform_data = {
>   	.nr_partitions = ARRAY_SIZE(u300_partitions),
>   	.options = NAND_SKIP_BBTSCAN,
>   	.width = FSMC_NAND_BW8,
> -	.ale_off = PLAT_NAND_ALE,
> -	.cle_off = PLAT_NAND_CLE,
>   };
>
>   static struct platform_device nand_device = {
> diff --git a/drivers/mtd/nand/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c
> index 38d2624..cb86450 100644
> --- a/drivers/mtd/nand/fsmc_nand.c
> +++ b/drivers/mtd/nand/fsmc_nand.c
> @@ -876,8 +876,6 @@ static int __devinit fsmc_nand_probe_config_dt(struct platform_device *pdev,
>   			return -EINVAL;
>   		}
>   	}
> -	of_property_read_u32(np, "st,ale-off",&pdata->ale_off);
> -	of_property_read_u32(np, "st,cle-off",&pdata->cle_off);
>   	if (of_get_property(np, "nand-skip-bbtscan", NULL))
>   		pdata->options = NAND_SKIP_BBTSCAN;
>
> @@ -935,41 +933,28 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
>   	if (!res)
>   		return -EINVAL;
>
> -	if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
> -				pdev->name)) {
> -		dev_err(&pdev->dev, "Failed to get memory data resourse\n");
> -		return -ENOENT;
> -	}
> -
> -	host->data_pa = (dma_addr_t)res->start;
> -	host->data_va = devm_ioremap(&pdev->dev, res->start,
> -			resource_size(res));
> +	host->data_va = devm_request_and_ioremap(&pdev->dev, res);
>   	if (!host->data_va) {
>   		dev_err(&pdev->dev, "data ioremap failed\n");
>   		return -ENOMEM;
>   	}
> +	host->data_pa = (dma_addr_t)res->start;
>
> -	if (!devm_request_mem_region(&pdev->dev, res->start + pdata->ale_off,
> -			resource_size(res), pdev->name)) {
> -		dev_err(&pdev->dev, "Failed to get memory ale resourse\n");
> -		return -ENOENT;
> -	}
> +	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nand_addr");
> +	if (!res)
> +		return -EINVAL;
>
> -	host->addr_va = devm_ioremap(&pdev->dev, res->start + pdata->ale_off,
> -			resource_size(res));
> +	host->addr_va = devm_request_and_ioremap(&pdev->dev, res);
>   	if (!host->addr_va) {
>   		dev_err(&pdev->dev, "ale ioremap failed\n");
>   		return -ENOMEM;
>   	}
>
> -	if (!devm_request_mem_region(&pdev->dev, res->start + pdata->cle_off,
> -			resource_size(res), pdev->name)) {
> -		dev_err(&pdev->dev, "Failed to get memory cle resourse\n");
> -		return -ENOENT;
> -	}
> +	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nand_cmd");
> +	if (!res)
> +		return -EINVAL;
>
> -	host->cmd_va = devm_ioremap(&pdev->dev, res->start + pdata->cle_off,
> -			resource_size(res));
> +	host->cmd_va = devm_request_and_ioremap(&pdev->dev, res);
>   	if (!host->cmd_va) {
>   		dev_err(&pdev->dev, "ale ioremap failed\n");
>   		return -ENOMEM;
> @@ -979,14 +964,7 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
>   	if (!res)
>   		return -EINVAL;
>
> -	if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
> -			pdev->name)) {
> -		dev_err(&pdev->dev, "Failed to get memory regs resourse\n");
> -		return -ENOENT;
> -	}
> -
> -	host->regs_va = devm_ioremap(&pdev->dev, res->start,
> -			resource_size(res));
> +	host->regs_va = devm_request_and_ioremap(&pdev->dev, res);
>   	if (!host->regs_va) {
>   		dev_err(&pdev->dev, "regs ioremap failed\n");
>   		return -ENOMEM;
> diff --git a/include/linux/mtd/fsmc.h b/include/linux/mtd/fsmc.h
> index b200292..d6ed61e 100644
> --- a/include/linux/mtd/fsmc.h
> +++ b/include/linux/mtd/fsmc.h
> @@ -155,9 +155,6 @@ struct fsmc_nand_platform_data {
>   	unsigned int		width;
>   	unsigned int		bank;
>
> -	/* CLE, ALE offsets */
> -	unsigned int		cle_off;
> -	unsigned int		ale_off;
>   	enum access_mode	mode;
>
>   	void			(*select_bank)(uint32_t bank, uint32_t busw);

btw, I also have a few pending patches on this driver which I would be 
sending soon

Reviewed By: Vipin Kumar <vipin.kumar@st.com>
Artem Bityutskiy - Oct. 11, 2012, 11:15 a.m.
On Thu, 2012-10-04 at 15:14 +0200, Jean-Christophe PLAGNIOL-VILLARD
wrote:
> Do not use the platform_data to pass resource and be smart in the drivers.
> Just pass it via resource
> 
> Switch to devm_request_and_ioremap at the sametime
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>

Pushed to l2-mtd.git, thanks!

Patch

diff --git a/Documentation/devicetree/bindings/mtd/fsmc-nand.txt b/Documentation/devicetree/bindings/mtd/fsmc-nand.txt
index e2c663b..e3ea32e 100644
--- a/Documentation/devicetree/bindings/mtd/fsmc-nand.txt
+++ b/Documentation/devicetree/bindings/mtd/fsmc-nand.txt
@@ -3,9 +3,7 @@ 
 Required properties:
 - compatible : "st,spear600-fsmc-nand"
 - reg : Address range of the mtd chip
-- reg-names: Should contain the reg names "fsmc_regs" and "nand_data"
-- st,ale-off : Chip specific offset to ALE
-- st,cle-off : Chip specific offset to CLE
+- reg-names: Should contain the reg names "fsmc_regs", "nand_data", "nand_addr" and "nand_cmd"
 
 Optional properties:
 - bank-width : Width (in bytes) of the device.  If not present, the width
@@ -19,10 +17,10 @@  Example:
 		#address-cells = <1>;
 		#size-cells = <1>;
 		reg = <0xd1800000 0x1000	/* FSMC Register */
-		       0xd2000000 0x4000>;	/* NAND Base */
-		reg-names = "fsmc_regs", "nand_data";
-		st,ale-off = <0x20000>;
-		st,cle-off = <0x10000>;
+		       0xd2000000 0x0010	/* NAND Base DATA */
+		       0xd2020000 0x0010	/* NAND Base ADDR */
+		       0xd2010000 0x0010>;	/* NAND Base CMD */
+		reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
 
 		bank-width = <1>;
 		nand-skip-bbtscan;
diff --git a/arch/arm/boot/dts/spear13xx.dtsi b/arch/arm/boot/dts/spear13xx.dtsi
index f7b84ac..14a6d15 100644
--- a/arch/arm/boot/dts/spear13xx.dtsi
+++ b/arch/arm/boot/dts/spear13xx.dtsi
@@ -104,15 +104,15 @@ 
 			compatible = "st,spear600-fsmc-nand";
 			#address-cells = <1>;
 			#size-cells = <1>;
-			reg = <0xb0000000 0x1000	/* FSMC Register */
-			       0xb0800000 0x0010>;	/* NAND Base */
-			reg-names = "fsmc_regs", "nand_data";
+			reg = <0xb0000000 0x1000	/* FSMC Register*/
+			       0xb0800000 0x0010	/* NAND Base DATA */
+			       0xb0820000 0x0010	/* NAND Base ADDR */
+			       0xb0810000 0x0010>;	/* NAND Base CMD */
+			reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
 			interrupts = <0 20 0x4
 				      0 21 0x4
 				      0 22 0x4
 				      0 23 0x4>;
-			st,ale-off = <0x20000>;
-			st,cle-off = <0x10000>;
 			status = "disabled";
 		};
 
diff --git a/arch/arm/boot/dts/spear300.dtsi b/arch/arm/boot/dts/spear300.dtsi
index ed3627c..bc43638 100644
--- a/arch/arm/boot/dts/spear300.dtsi
+++ b/arch/arm/boot/dts/spear300.dtsi
@@ -38,10 +38,10 @@ 
 			#address-cells = <1>;
 			#size-cells = <1>;
 			reg = <0x94000000 0x1000	/* FSMC Register */
-			       0x80000000 0x0010>;	/* NAND Base */
-			reg-names = "fsmc_regs", "nand_data";
-			st,ale-off = <0x20000>;
-			st,cle-off = <0x10000>;
+			       0x80000000 0x0010	/* NAND Base DATA */
+			       0x80020000 0x0010	/* NAND Base ADDR */
+			       0x80010000 0x0010>;	/* NAND Base CMD */
+			reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
 			status = "disabled";
 		};
 
diff --git a/arch/arm/boot/dts/spear310.dtsi b/arch/arm/boot/dts/spear310.dtsi
index 62fc4fb..7840e52 100644
--- a/arch/arm/boot/dts/spear310.dtsi
+++ b/arch/arm/boot/dts/spear310.dtsi
@@ -32,10 +32,10 @@ 
 			#address-cells = <1>;
 			#size-cells = <1>;
 			reg = <0x44000000 0x1000	/* FSMC Register */
-			       0x40000000 0x0010>;	/* NAND Base */
-			reg-names = "fsmc_regs", "nand_data";
-			st,ale-off = <0x10000>;
-			st,cle-off = <0x20000>;
+			       0x40000000 0x0010	/* NAND Base DATA */
+			       0x40020000 0x0010	/* NAND Base ADDR */
+			       0x40010000 0x0010>;	/* NAND Base CMD */
+			reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
 			status = "disabled";
 		};
 
diff --git a/arch/arm/boot/dts/spear320.dtsi b/arch/arm/boot/dts/spear320.dtsi
index 1f49d69..5ad8206 100644
--- a/arch/arm/boot/dts/spear320.dtsi
+++ b/arch/arm/boot/dts/spear320.dtsi
@@ -38,10 +38,10 @@ 
 			#address-cells = <1>;
 			#size-cells = <1>;
 			reg = <0x4c000000 0x1000	/* FSMC Register */
-			       0x50000000 0x0010>;	/* NAND Base */
-			reg-names = "fsmc_regs", "nand_data";
-			st,ale-off = <0x20000>;
-			st,cle-off = <0x10000>;
+			       0x50000000 0x0010	/* NAND Base DATA */
+			       0x50020000 0x0010	/* NAND Base ADDR */
+			       0x50010000 0x0010>;	/* NAND Base CMD */
+			reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
 			status = "disabled";
 		};
 
diff --git a/arch/arm/boot/dts/spear600.dtsi b/arch/arm/boot/dts/spear600.dtsi
index a3c36e4..4ecc66f 100644
--- a/arch/arm/boot/dts/spear600.dtsi
+++ b/arch/arm/boot/dts/spear600.dtsi
@@ -67,10 +67,10 @@ 
 			#address-cells = <1>;
 			#size-cells = <1>;
 			reg = <0xd1800000 0x1000	/* FSMC Register */
-			       0xd2000000 0x4000>;	/* NAND Base */
-			reg-names = "fsmc_regs", "nand_data";
-			st,ale-off = <0x20000>;
-			st,cle-off = <0x10000>;
+			       0xd2000000 0x0010	/* NAND Base DATA */
+			       0xd2020000 0x0010	/* NAND Base ADDR */
+			       0xd2010000 0x0010>;	/* NAND Base CMD */
+			reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
 			status = "disabled";
 		};
 
diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c
index ef6f602..527bcc2 100644
--- a/arch/arm/mach-u300/core.c
+++ b/arch/arm/mach-u300/core.c
@@ -252,6 +252,18 @@  static struct resource rtc_resources[] = {
  */
 static struct resource fsmc_resources[] = {
 	{
+		.name  = "nand_addr",
+		.start = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_ALE,
+		.end   = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_ALE + SZ_16K - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	{
+		.name  = "nand_cmd",
+		.start = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_CLE,
+		.end   = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_CLE + SZ_16K - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	{
 		.name  = "nand_data",
 		.start = U300_NAND_CS0_PHYS_BASE,
 		.end   = U300_NAND_CS0_PHYS_BASE + SZ_16K - 1,
@@ -1496,8 +1508,6 @@  static struct fsmc_nand_platform_data nand_platform_data = {
 	.nr_partitions = ARRAY_SIZE(u300_partitions),
 	.options = NAND_SKIP_BBTSCAN,
 	.width = FSMC_NAND_BW8,
-	.ale_off = PLAT_NAND_ALE,
-	.cle_off = PLAT_NAND_CLE,
 };
 
 static struct platform_device nand_device = {
diff --git a/drivers/mtd/nand/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c
index 38d2624..cb86450 100644
--- a/drivers/mtd/nand/fsmc_nand.c
+++ b/drivers/mtd/nand/fsmc_nand.c
@@ -876,8 +876,6 @@  static int __devinit fsmc_nand_probe_config_dt(struct platform_device *pdev,
 			return -EINVAL;
 		}
 	}
-	of_property_read_u32(np, "st,ale-off", &pdata->ale_off);
-	of_property_read_u32(np, "st,cle-off", &pdata->cle_off);
 	if (of_get_property(np, "nand-skip-bbtscan", NULL))
 		pdata->options = NAND_SKIP_BBTSCAN;
 
@@ -935,41 +933,28 @@  static int __init fsmc_nand_probe(struct platform_device *pdev)
 	if (!res)
 		return -EINVAL;
 
-	if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
-				pdev->name)) {
-		dev_err(&pdev->dev, "Failed to get memory data resourse\n");
-		return -ENOENT;
-	}
-
-	host->data_pa = (dma_addr_t)res->start;
-	host->data_va = devm_ioremap(&pdev->dev, res->start,
-			resource_size(res));
+	host->data_va = devm_request_and_ioremap(&pdev->dev, res);
 	if (!host->data_va) {
 		dev_err(&pdev->dev, "data ioremap failed\n");
 		return -ENOMEM;
 	}
+	host->data_pa = (dma_addr_t)res->start;
 
-	if (!devm_request_mem_region(&pdev->dev, res->start + pdata->ale_off,
-			resource_size(res), pdev->name)) {
-		dev_err(&pdev->dev, "Failed to get memory ale resourse\n");
-		return -ENOENT;
-	}
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nand_addr");
+	if (!res)
+		return -EINVAL;
 
-	host->addr_va = devm_ioremap(&pdev->dev, res->start + pdata->ale_off,
-			resource_size(res));
+	host->addr_va = devm_request_and_ioremap(&pdev->dev, res);
 	if (!host->addr_va) {
 		dev_err(&pdev->dev, "ale ioremap failed\n");
 		return -ENOMEM;
 	}
 
-	if (!devm_request_mem_region(&pdev->dev, res->start + pdata->cle_off,
-			resource_size(res), pdev->name)) {
-		dev_err(&pdev->dev, "Failed to get memory cle resourse\n");
-		return -ENOENT;
-	}
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nand_cmd");
+	if (!res)
+		return -EINVAL;
 
-	host->cmd_va = devm_ioremap(&pdev->dev, res->start + pdata->cle_off,
-			resource_size(res));
+	host->cmd_va = devm_request_and_ioremap(&pdev->dev, res);
 	if (!host->cmd_va) {
 		dev_err(&pdev->dev, "ale ioremap failed\n");
 		return -ENOMEM;
@@ -979,14 +964,7 @@  static int __init fsmc_nand_probe(struct platform_device *pdev)
 	if (!res)
 		return -EINVAL;
 
-	if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
-			pdev->name)) {
-		dev_err(&pdev->dev, "Failed to get memory regs resourse\n");
-		return -ENOENT;
-	}
-
-	host->regs_va = devm_ioremap(&pdev->dev, res->start,
-			resource_size(res));
+	host->regs_va = devm_request_and_ioremap(&pdev->dev, res);
 	if (!host->regs_va) {
 		dev_err(&pdev->dev, "regs ioremap failed\n");
 		return -ENOMEM;
diff --git a/include/linux/mtd/fsmc.h b/include/linux/mtd/fsmc.h
index b200292..d6ed61e 100644
--- a/include/linux/mtd/fsmc.h
+++ b/include/linux/mtd/fsmc.h
@@ -155,9 +155,6 @@  struct fsmc_nand_platform_data {
 	unsigned int		width;
 	unsigned int		bank;
 
-	/* CLE, ALE offsets */
-	unsigned int		cle_off;
-	unsigned int		ale_off;
 	enum access_mode	mode;
 
 	void			(*select_bank)(uint32_t bank, uint32_t busw);