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 <[email protected]> --- .../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@f4000000 { + #address-cells = <1>; + #size-cells = <1>; + cle = <0>; + ale = <1>; + width = <8>; + chip-delay = <25>; + compatible = "mrvl,orion-nand"; + reg = <0xf4000000 0x400>; + + partition@0 { + label = "u-boot"; + reg = <0x0000000 0x100000>; + read-only; + }; + + partition@100000 { + label = "uImage"; + reg = <0x0100000 0x200000>; + }; + + partition@300000 { + label = "root"; + reg = <0x0300000 0x7d00000>; + }; +}; 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@f4000000 { + #address-cells = <1>; + #size-cells = <1>; + cle = <0>; + ale = <1>; + width = <8>; + chip-delay = <25>; + compatible = "mrvl,orion-nand"; + reg = <0xf4000000 0x400>; + + partition@0 { + label = "u-boot"; + reg = <0x0000000 0x100000>; + read-only; + }; + + partition@100000 { + label = "uImage"; + reg = <0x0100000 0x500000>; + }; + + partition@600000 { + label = "ramdisk"; + reg = <0x0600000 0x500000>; + }; + + partition@b00000 { + label = "image"; + reg = <0x0b00000 0x6600000>; + }; + + partition@7100000 { + label = "mini firmware"; + reg = <0x7100000 0xa00000>; + }; + + partition@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@f4000000 { + #address-cells = <1>; + #size-cells = <1>; + cle = <0>; + ale = <1>; + width = <8>; + chip-delay = <25>; + compatible = "mrvl,orion-nand"; + reg = <0xf4000000 0x400>; + + partition@0 { + label = "u-boot"; + reg = <0x0000000 0x100000>; + read-only; + }; + + partition@100000 { + label = "uImage"; + reg = <0x0100000 0x500000>; + }; + + partition@600000 { + label = "ramdisk"; + reg = <0x0600000 0x500000>; + }; + + partition@b00000 { + label = "image"; + reg = <0x0b00000 0x6600000>; + }; + + partition@7100000 { + label = "mini firmware"; + reg = <0x7100000 0xa00000>; + }; + + partition@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 _______________________________________________ devicetree-discuss mailing list [email protected] https://lists.ozlabs.org/listinfo/devicetree-discuss
