On Thu, Aug 04, 2016 at 03:58:33PM -0700, York Sun wrote: > Get endianness from device tree. Both big endian and little endian > are supported. Default to big endian for backward compatibility to > MPC85xx. > > Signed-off-by: York Sun <york.sun@xxxxxxx> > > --- > Change log > v3: no change > v2: Separated from "Add support for ARM-based SoCs" patch > > .../fsl/ddr.txt} | 6 ++ > drivers/edac/fsl_ddr_edac.c | 83 ++++++++++++++-------- > 2 files changed, 58 insertions(+), 31 deletions(-) > rename Documentation/devicetree/bindings/{powerpc/fsl/mem-ctrlr.txt => memory-controllers/fsl/ddr.txt} (74%) > > diff --git a/Documentation/devicetree/bindings/powerpc/fsl/mem-ctrlr.txt b/Documentation/devicetree/bindings/memory-controllers/fsl/ddr.txt > similarity index 74% > rename from Documentation/devicetree/bindings/powerpc/fsl/mem-ctrlr.txt > rename to Documentation/devicetree/bindings/memory-controllers/fsl/ddr.txt > index f87856f..62623f9 100644 > --- a/Documentation/devicetree/bindings/powerpc/fsl/mem-ctrlr.txt > +++ b/Documentation/devicetree/bindings/memory-controllers/fsl/ddr.txt > @@ -7,6 +7,10 @@ Properties: > "fsl,qoriq-memory-controller". > - reg : Address and size of DDR controller registers > - interrupts : Error interrupt of DDR controller > +- little-endian : Specifies little-endian access to registers > +- big-endian : Specifies big-endian access to registers > + > +If both little-endian and big-endian are omitted, big-endian will be used. > > Example 1: > > @@ -14,6 +18,7 @@ Example 1: > compatible = "fsl,bsc9132-memory-controller"; > reg = <0x2000 0x1000>; > interrupts = <16 2 1 8>; > + big-endian; > }; > > > @@ -24,4 +29,5 @@ Example 2: > "fsl,qoriq-memory-controller"; > reg = <0x8000 0x1000>; > interrupts = <16 2 1 23>; > + big-endian; > }; This needs an ACK from DT maintainers. They're on CC. > diff --git a/drivers/edac/fsl_ddr_edac.c b/drivers/edac/fsl_ddr_edac.c > index 88ecf7d..b1b7924 100644 > --- a/drivers/edac/fsl_ddr_edac.c > +++ b/drivers/edac/fsl_ddr_edac.c ... > @@ -470,6 +483,13 @@ int fsl_ddr_mc_err_probe(struct platform_device *op) > mci->ctl_name = pdata->name; > mci->dev_name = pdata->name; > > + if (of_find_property(op->dev.of_node, "little-endian", NULL)) > + little_endian = true; > + else if (of_find_property(op->dev.of_node, "big-endian", NULL)) > + little_endian = false; > + else > + little_endian = false; What happened here? Considering little_endian is static, this should suffice for its initialization: if (of_find_property(op->dev.of_node, "little-endian", NULL)) little_endian = true; > res = of_address_to_resource(op->dev.of_node, 0, &r); > if (res) { > pr_err("%s: Unable to get resource for MC err regs\n", > @@ -492,7 +512,7 @@ int fsl_ddr_mc_err_probe(struct platform_device *op) > goto err; > } > > - sdram_ctl = in_be32(pdata->mc_vbase + MC_DDR_SDRAM_CFG); > + sdram_ctl = ddr_in32(pdata->mc_vbase + MC_DDR_SDRAM_CFG); > if (!(sdram_ctl & DSC_ECC_EN)) { > /* no ECC */ > pr_warn("%s: No ECC DIMMs discovered\n", __func__); > @@ -520,11 +540,11 @@ int fsl_ddr_mc_err_probe(struct platform_device *op) > > /* store the original error disable bits */ > orig_ddr_err_disable = > - in_be32(pdata->mc_vbase + MC_ERR_DISABLE); > - out_be32(pdata->mc_vbase + MC_ERR_DISABLE, 0); > + ddr_in32(pdata->mc_vbase + MC_ERR_DISABLE); > + ddr_out32(pdata->mc_vbase + MC_ERR_DISABLE, 0); > > /* clear all error bits */ > - out_be32(pdata->mc_vbase + MC_ERR_DETECT, ~0); > + ddr_out32(pdata->mc_vbase + MC_ERR_DETECT, ~0); > > if (edac_mc_add_mc_with_groups(mci, fsl_ddr_dev_groups)) { > edac_dbg(3, "failed edac_mc_add_mc()\n"); > @@ -532,15 +552,15 @@ int fsl_ddr_mc_err_probe(struct platform_device *op) > } > > if (edac_op_state == EDAC_OPSTATE_INT) { > - out_be32(pdata->mc_vbase + MC_ERR_INT_EN, > - DDR_EIE_MBEE | DDR_EIE_SBEE); > + ddr_out32(pdata->mc_vbase + MC_ERR_INT_EN, > + DDR_EIE_MBEE | DDR_EIE_SBEE); > > /* store the original error management threshold */ > - orig_ddr_err_sbe = in_be32(pdata->mc_vbase + > + orig_ddr_err_sbe = ddr_in32(pdata->mc_vbase + > MC_ERR_SBE) & 0xff0000; > > /* set threshold to 1 error per interrupt */ > - out_be32(pdata->mc_vbase + MC_ERR_SBE, 0x10000); > + ddr_out32(pdata->mc_vbase + MC_ERR_SBE, 0x10000); > > /* register interrupts */ > pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0); > @@ -573,6 +593,7 @@ err: > edac_mc_free(mci); > return res; > } > +EXPORT_SYMBOL_GPL(fsl_ddr_mc_err_probe); What's that export for? -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply. -- -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html