On Sun, Mar 25, 2012 at 12:17:24AM +0000, Jamie Lentin wrote: > Convert orion-nand to use fdt and add common setup to kirkwood.dtsi, including > a default value for chip-delay (all current boards seem to use 25 anyway). > > Add placeholder documentation for the bindings, for someone more knowledgable > than me to fill in the details of the properties. > > Move common partition table documentation into a separate file and reference > this.
Jamie, This looks great! In addition to Arnd's comments, could you split this into two? The orion_nand dt bindings work, and kirkwood making use of it? It's not earth-shattering, but it helps folks on orion5x/dove/etc pull it in and try it without worrying about kirkwood. > Signed-off-by: Jamie Lentin <[email protected]> > --- > Re-arranged documentation as you suggest, however it's tempting to > have this as a separate patch and add references to partition.txt > for the other binding documentation files. Let me know if you want > me to do this. If it's not too much trouble, this would be appreciated. thx, Jason. > Cheers for your help! > > .../devicetree/bindings/mtd/mtd-physmap.txt | 24 +-------- > .../devicetree/bindings/mtd/orion-nand.txt | 50 > ++++++++++++++++++++ > .../devicetree/bindings/mtd/partition.txt | 38 +++++++++++++++ > arch/arm/boot/dts/kirkwood.dtsi | 15 ++++++- > arch/arm/mach-kirkwood/common.c | 12 +++++ > drivers/mtd/nand/orion_nand.c | 34 +++++++++++++- > 6 files changed, 149 insertions(+), 24 deletions(-) > create mode 100644 Documentation/devicetree/bindings/mtd/orion-nand.txt > create mode 100644 Documentation/devicetree/bindings/mtd/partition.txt > > diff --git a/Documentation/devicetree/bindings/mtd/mtd-physmap.txt > b/Documentation/devicetree/bindings/mtd/mtd-physmap.txt > index 80152cb..9b873d4 100644 > --- a/Documentation/devicetree/bindings/mtd/mtd-physmap.txt > +++ b/Documentation/devicetree/bindings/mtd/mtd-physmap.txt > @@ -23,27 +23,9 @@ are defined: > - vendor-id : Contains the flash chip's vendor id (1 byte). > - device-id : Contains the flash chip's device id (1 byte). > > -In addition to the information on the mtd bank itself, the > -device tree may optionally contain additional information > -describing partitions of the address space. This can be > -used on platforms which have strong conventions about which > -portions of a flash are used for what purposes, but which don't > -use an on-flash partition table such as RedBoot. > - > -Each partition is represented as a sub-node of the mtd device. > -Each node's name represents the name of the corresponding > -partition of the mtd device. > - > -Flash partitions > - - reg : The partition's offset and size within the mtd bank. > - - label : (optional) The label / name for this partition. > - If omitted, the label is taken from the node name (excluding > - the unit address). > - - read-only : (optional) This parameter, if present, is a hint to > - Linux that this partition should only be mounted > - read-only. This is usually used for flash partitions > - containing early-boot firmware images or data which should not > - be clobbered. > +In addition to the information on the mtd bank itself, the device tree may > +optionally contain additional sub-nodes describing partitions of the address > +space. See partition.txt for more detail. > > Example: > > diff --git a/Documentation/devicetree/bindings/mtd/orion-nand.txt > b/Documentation/devicetree/bindings/mtd/orion-nand.txt > new file mode 100644 > index 0000000..e9acbd2 > --- /dev/null > +++ b/Documentation/devicetree/bindings/mtd/orion-nand.txt > @@ -0,0 +1,50 @@ > +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 : > +- bank-width : > +- chip-delay : > + > +In addition to the information on the mtd bank itself, the device tree may > +optionally contain additional sub-nodes describing partitions of the address > +space. See partition.txt for more detail. > + > +Examples: > + > +nand@f4000000 { > + #address-cells = <1>; > + #size-cells = <1>; > + cle = <0>; > + ale = <1>; > + bank-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 = "dtb"; > + reg = <0x0300000 0x100000>; > + }; > + > + partition@400000 { > + label = "root"; > + reg = <0x0400000 0x7d00000>; > + }; > +}; > diff --git a/Documentation/devicetree/bindings/mtd/partition.txt > b/Documentation/devicetree/bindings/mtd/partition.txt > new file mode 100644 > index 0000000..f114ce1 > --- /dev/null > +++ b/Documentation/devicetree/bindings/mtd/partition.txt > @@ -0,0 +1,38 @@ > +Representing flash partitions in devicetree > + > +Partitions can be represented by sub-nodes of an mtd device. This can be used > +on platforms which have strong conventions about which portions of a flash > are > +used for what purposes, but which don't use an on-flash partition table such > +as RedBoot. > + > +#address-cells & #size-cells must both be present in the mtd device and be > +equal to 1. > + > +Required properties: > +- reg : The partition's offset and size within the mtd bank. > + > +Optional properties: > +- label : The label / name for this partition. If omitted, the label is > taken > + from the node name (excluding the unit address). > +- read-only : This parameter, if present, is a hint to Linux that this > + partition should only be mounted read-only. This is usually used for flash > + partitions containing early-boot firmware images or data which should not > be > + clobbered. > + > +Examples: > + > + > +flash@0 { > + #address-cells = <1>; > + #size-cells = <1>; > + > + partition@0 { > + label = "u-boot"; > + reg = <0x0000000 0x100000>; > + read-only; > + }; > + > + uimage@100000 { > + reg = <0x0100000 0x200000>; > + }; > +]; > diff --git a/arch/arm/boot/dts/kirkwood.dtsi b/arch/arm/boot/dts/kirkwood.dtsi > index 3474ef8..6b80374 100644 > --- a/arch/arm/boot/dts/kirkwood.dtsi > +++ b/arch/arm/boot/dts/kirkwood.dtsi > @@ -5,7 +5,7 @@ > > ocp@f1000000 { > compatible = "simple-bus"; > - ranges = <0 0xf1000000 0x1000000>; > + ranges = <0 0xf1000000 0x4000000>; > #address-cells = <1>; > #size-cells = <1>; > > @@ -32,5 +32,18 @@ > reg = <0x10300 0x20>; > interrupts = <53>; > }; > + > + nand@3000000 { > + #address-cells = <1>; > + #size-cells = <1>; > + cle = <0>; > + ale = <1>; > + bank-width = <8>; > + compatible = "mrvl,orion-nand"; > + reg = <0x3000000 0x400>; > + chip-delay = <25>; > + /* set partition map and/or chip-delay in board dts */ > + status = "disabled"; > + }; > }; > }; > diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c > index a02cae8..3ad0373 100644 > --- a/arch/arm/mach-kirkwood/common.c > +++ b/arch/arm/mach-kirkwood/common.c > @@ -15,6 +15,7 @@ > #include <linux/ata_platform.h> > #include <linux/mtd/nand.h> > #include <linux/dma-mapping.h> > +#include <linux/of.h> > #include <net/dsa.h> > #include <asm/page.h> > #include <asm/timex.h> > @@ -482,6 +483,9 @@ static int __init kirkwood_clock_gate(void) > unsigned int curr = readl(CLOCK_GATING_CTRL); > u32 dev, rev; > > +#ifdef CONFIG_OF > + struct device_node *np; > +#endif > kirkwood_pcie_id(&dev, &rev); > printk(KERN_DEBUG "Gating clock of unused units\n"); > printk(KERN_DEBUG "before: 0x%08x\n", curr); > @@ -489,6 +493,14 @@ static int __init kirkwood_clock_gate(void) > /* Make sure those units are accessible */ > writel(curr | CGC_SATA0 | CGC_SATA1 | CGC_PEX0 | CGC_PEX1, > CLOCK_GATING_CTRL); > > +#ifdef CONFIG_OF > + 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); > + } > +#endif > + > /* For SATA: first shutdown the phy */ > if (!(kirkwood_clk_ctrl & CGC_SATA0)) { > /* Disable PLL and IVREF */ > diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c > index 29f505a..6a5f47b 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,25 @@ static int __init orion_nand_probe(struct > platform_device *pdev) > goto no_res; > } > > - board = pdev->dev.platform_data; > + if (pdev->dev.of_node) { > + board = devm_kzalloc(&pdev->dev, 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, "bank-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 +150,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); > @@ -161,11 +183,19 @@ static int __devexit orion_nand_remove(struct > platform_device *pdev) > return 0; > } > > +#ifdef CONFIG_OF > +static struct of_device_id orion_nand_of_match_table[] = { > + { .compatible = "mrvl,orion-nand", }, > + {}, > +}; > +#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
