[PATCH 2/2] ARM: kirkwood: Convert orion-nand to fdt
Jason Cooper
jason at lakedaemon.net
Sun Mar 11 23:23:03 EDT 2012
On Sun, Mar 11, 2012 at 02:33:26PM +0000, Jamie Lentin wrote:
> The DNS-320 and 325 have a NAND partitioned to store uboot, uimage and root
> filesystem. Store this information in devicetree.
>
> Signed-off-by: Jamie Lentin <jm at lentin.co.uk>
> ---
> .../devicetree/bindings/mtd/orion-nand.txt | 41 +++++++++++++++++++
> arch/arm/boot/dts/kirkwood-dns320.dts | 42 ++++++++++++++++++++
> arch/arm/boot/dts/kirkwood-dns325.dts | 42 ++++++++++++++++++++
> arch/arm/mach-kirkwood/board-dt.c | 30 --------------
> arch/arm/mach-kirkwood/common.c | 6 +++
> drivers/mtd/nand/orion_nand.c | 39 +++++++++++++++++-
> 6 files changed, 168 insertions(+), 32 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/mtd/orion-nand.txt
>
> diff --git a/Documentation/devicetree/bindings/mtd/orion-nand.txt b/Documentation/devicetree/bindings/mtd/orion-nand.txt
> new file mode 100644
> index 0000000..53fd469
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mtd/orion-nand.txt
> @@ -0,0 +1,41 @@
> +NAND support for Marvell Orion SoC platforms
> +
> +Required properties:
> +- compatible : "mrvl,orion-nand".
> +- reg : Base physical address of the NAND and length of memory mapped
> + region
> +
> +Optional properties:
> +- cle :
> +- ale :
> +- width :
> +- chip-delay :
> +
> +Examples:
> +
> +nand at f4000000 {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + cle = <0>;
> + ale = <1>;
> + width = <8>;
> + chip-delay = <25>;
> + compatible = "mrvl,orion-nand";
> + reg = <0xf4000000 0x400>;
> +
> + partition at 0 {
> + label = "u-boot";
> + reg = <0x0000000 0x100000>;
> + read-only;
> + };
> +
> + partition at 100000 {
> + label = "uImage";
> + reg = <0x0100000 0x200000>;
> + };
> +
> + partition at 300000 {
> + label = "root";
> + reg = <0x0300000 0x7d00000>;
> + };
You may want the example to include a partition for the dtb.
I'll let more experienced folks comment on the guts of the nand
bindings.
thx,
Jason.
> +};
> diff --git a/arch/arm/boot/dts/kirkwood-dns320.dts b/arch/arm/boot/dts/kirkwood-dns320.dts
> index c039041..6772f9d 100644
> --- a/arch/arm/boot/dts/kirkwood-dns320.dts
> +++ b/arch/arm/boot/dts/kirkwood-dns320.dts
> @@ -51,4 +51,46 @@
> dma-mask = <0xffffffff>;
> phy-version = "";
> };
> +
> + nand at f4000000 {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + cle = <0>;
> + ale = <1>;
> + width = <8>;
> + chip-delay = <25>;
> + compatible = "mrvl,orion-nand";
> + reg = <0xf4000000 0x400>;
> +
> + partition at 0 {
> + label = "u-boot";
> + reg = <0x0000000 0x100000>;
> + read-only;
> + };
> +
> + partition at 100000 {
> + label = "uImage";
> + reg = <0x0100000 0x500000>;
> + };
> +
> + partition at 600000 {
> + label = "ramdisk";
> + reg = <0x0600000 0x500000>;
> + };
> +
> + partition at b00000 {
> + label = "image";
> + reg = <0x0b00000 0x6600000>;
> + };
> +
> + partition at 7100000 {
> + label = "mini firmware";
> + reg = <0x7100000 0xa00000>;
> + };
> +
> + partition at 7b00000 {
> + label = "config";
> + reg = <0x7b00000 0x500000>;
> + };
> + };
> };
> diff --git a/arch/arm/boot/dts/kirkwood-dns325.dts b/arch/arm/boot/dts/kirkwood-dns325.dts
> index a7c2c26..34740ad 100644
> --- a/arch/arm/boot/dts/kirkwood-dns325.dts
> +++ b/arch/arm/boot/dts/kirkwood-dns325.dts
> @@ -37,4 +37,46 @@
> dma-mask = <0xffffffff>;
> phy-version = "";
> };
> +
> + nand at f4000000 {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + cle = <0>;
> + ale = <1>;
> + width = <8>;
> + chip-delay = <25>;
> + compatible = "mrvl,orion-nand";
> + reg = <0xf4000000 0x400>;
> +
> + partition at 0 {
> + label = "u-boot";
> + reg = <0x0000000 0x100000>;
> + read-only;
> + };
> +
> + partition at 100000 {
> + label = "uImage";
> + reg = <0x0100000 0x500000>;
> + };
> +
> + partition at 600000 {
> + label = "ramdisk";
> + reg = <0x0600000 0x500000>;
> + };
> +
> + partition at b00000 {
> + label = "image";
> + reg = <0x0b00000 0x6600000>;
> + };
> +
> + partition at 7100000 {
> + label = "mini firmware";
> + reg = <0x7100000 0xa00000>;
> + };
> +
> + partition at 7b00000 {
> + label = "config";
> + reg = <0x7b00000 0x500000>;
> + };
> + };
> };
> diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c
> index 0885713..d5bc60a 100644
> --- a/arch/arm/mach-kirkwood/board-dt.c
> +++ b/arch/arm/mach-kirkwood/board-dt.c
> @@ -158,35 +158,6 @@ static void __init dreamplug_init(void)
> * DNS-320 & DNS-325 specifics
> ****************************************************************************/
>
> -static struct mtd_partition dnskw_nand_parts[] = {
> - {
> - .name = "u-boot",
> - .offset = 0,
> - .size = SZ_1M,
> - .mask_flags = MTD_WRITEABLE
> - }, {
> - .name = "uImage",
> - .offset = MTDPART_OFS_NXTBLK,
> - .size = 5 * SZ_1M
> - }, {
> - .name = "ramdisk",
> - .offset = MTDPART_OFS_NXTBLK,
> - .size = 5 * SZ_1M
> - }, {
> - .name = "image",
> - .offset = MTDPART_OFS_NXTBLK,
> - .size = 102 * SZ_1M
> - }, {
> - .name = "mini firmware",
> - .offset = MTDPART_OFS_NXTBLK,
> - .size = 10 * SZ_1M
> - }, {
> - .name = "config",
> - .offset = MTDPART_OFS_NXTBLK,
> - .size = 5 * SZ_1M
> - },
> -};
> -
> static struct mv643xx_eth_platform_data dnskw_ge00_data = {
> .phy_addr = MV643XX_ETH_PHY_ADDR(8),
> };
> @@ -395,7 +366,6 @@ static void __init dnskw_init(void)
> u32 dev, rev;
>
> kirkwood_mpp_conf(dnskw_mpp_config);
> - kirkwood_nand_init(ARRAY_AND_SIZE(dnskw_nand_parts), 25);
>
> kirkwood_ge00_init(&dnskw_ge00_data);
> kirkwood_i2c_init();
> diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c
> index 70ee7ac..f135854 100644
> --- a/arch/arm/mach-kirkwood/common.c
> +++ b/arch/arm/mach-kirkwood/common.c
> @@ -505,6 +505,12 @@ static int __init kirkwood_clock_gate(void)
> of_node_put(np);
> }
>
> + np = of_find_compatible_node(NULL, NULL, "mrvl,orion-nand");
> + if (np && of_device_is_available(np)) {
> + kirkwood_clk_ctrl |= CGC_RUNIT;
> + of_node_put(np);
> + }
> +
> np = of_find_compatible_node(NULL, NULL, "mrvl,orion-sata");
> if (np && of_device_is_available(np)) {
> int nr_ports;
> diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c
> index 29f505a..5ae0030 100644
> --- a/drivers/mtd/nand/orion_nand.c
> +++ b/drivers/mtd/nand/orion_nand.c
> @@ -13,6 +13,7 @@
> #include <linux/slab.h>
> #include <linux/module.h>
> #include <linux/platform_device.h>
> +#include <linux/of.h>
> #include <linux/mtd/mtd.h>
> #include <linux/mtd/nand.h>
> #include <linux/mtd/partitions.h>
> @@ -74,11 +75,13 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
> static int __init orion_nand_probe(struct platform_device *pdev)
> {
> struct mtd_info *mtd;
> + struct mtd_part_parser_data ppdata = {};
> struct nand_chip *nc;
> struct orion_nand_data *board;
> struct resource *res;
> void __iomem *io_base;
> int ret = 0;
> + u32 val = 0;
>
> nc = kzalloc(sizeof(struct nand_chip) + sizeof(struct mtd_info), GFP_KERNEL);
> if (!nc) {
> @@ -101,7 +104,24 @@ static int __init orion_nand_probe(struct platform_device *pdev)
> goto no_res;
> }
>
> - board = pdev->dev.platform_data;
> + if (pdev->dev.of_node) {
> + board = kzalloc(sizeof(struct orion_nand_data), GFP_KERNEL);
> + if (!board) {
> + printk(KERN_ERR "orion_nand: failed to allocate board structure.\n");
> + ret = -ENOMEM;
> + goto no_res;
> + }
> + if (!of_property_read_u32(pdev->dev.of_node, "cle", &val))
> + board->cle = (u8)val;
> + if (!of_property_read_u32(pdev->dev.of_node, "ale", &val))
> + board->ale = (u8)val;
> + if (!of_property_read_u32(pdev->dev.of_node, "width", &val))
> + board->width = (u8)val;
> + if (!of_property_read_u32(pdev->dev.of_node,
> + "chip-delay", &val))
> + board->chip_delay = (u8)val;
> + } else
> + board = pdev->dev.platform_data;
>
> mtd->priv = nc;
> mtd->owner = THIS_MODULE;
> @@ -129,7 +149,8 @@ static int __init orion_nand_probe(struct platform_device *pdev)
> }
>
> mtd->name = "orion_nand";
> - ret = mtd_device_parse_register(mtd, NULL, 0,
> + ppdata.of_node = pdev->dev.of_node;
> + ret = mtd_device_parse_register(mtd, NULL, &ppdata,
> board->parts, board->nr_parts);
> if (ret) {
> nand_release(mtd);
> @@ -141,6 +162,8 @@ static int __init orion_nand_probe(struct platform_device *pdev)
> no_dev:
> platform_set_drvdata(pdev, NULL);
> iounmap(io_base);
> + if (pdev->dev.of_node)
> + kfree(board);
> no_res:
> kfree(nc);
>
> @@ -156,16 +179,28 @@ static int __devexit orion_nand_remove(struct platform_device *pdev)
>
> iounmap(nc->IO_ADDR_W);
>
> + if (pdev->dev.of_node)
> + kfree(nc->priv);
> kfree(nc);
>
> return 0;
> }
>
> +#ifdef CONFIG_OF
> +static struct of_device_id orion_nand_of_match_table[] = {
> + { .compatible = "mrvl,orion-nand", },
> + {},
> +};
> +#else
> +#define orion_nand_of_match_table NULL
> +#endif
> +
> static struct platform_driver orion_nand_driver = {
> .remove = __devexit_p(orion_nand_remove),
> .driver = {
> .name = "orion_nand",
> .owner = THIS_MODULE,
> + .of_match_table = of_match_ptr(orion_nand_of_match_table),
> },
> };
>
> --
> 1.7.9.1
>
More information about the linux-arm-kernel
mailing list