On Jul 26, 2007, at 8:56 AM, Anton Vorontsov wrote: > Signed-off-by: Anton Vorontsov <[EMAIL PROTECTED]> > --- > arch/powerpc/sysdev/fsl_soc.c | 76 ++++++++++++++++++++++++++++++ > +++++++++++ > arch/powerpc/sysdev/fsl_soc.h | 3 ++ > 2 files changed, 79 insertions(+), 0 deletions(-)
There should be 2nd patch with updates to documentation for the SPI device node. > > diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/ > fsl_soc.c > index 3289fab..0599851 100644 > --- a/arch/powerpc/sysdev/fsl_soc.c > +++ b/arch/powerpc/sysdev/fsl_soc.c > @@ -1125,3 +1125,79 @@ err: > arch_initcall(cpm_smc_uart_of_init); > > #endif /* CONFIG_8xx */ > + > +void (*fsl_spi_activate_cs)(u8 cs, u8 polarity) = NULL; > +EXPORT_SYMBOL(fsl_spi_activate_cs); > +void (*fsl_spi_deactivate_cs)(u8 cs, u8 polarity) = NULL; > +EXPORT_SYMBOL(fsl_spi_deactivate_cs); > + I don't think we should do it this way. We shouldn't arch_initcall() scan for fsl_spi, but have the board code call a function and pass some things into it. > +static int __init fsl_spi_of_init(void) > +{ > + struct device_node *np; > + unsigned int i; > + > + for (np = NULL, i = 1; > + (np = of_find_compatible_node(np, "spi", "fsl_spi")) != NULL; > + i++) { > + int ret = 0; > + const char *devid, *sysclk, *mode, *max_cs; > + struct resource res[2]; > + struct platform_device *pdev = NULL; > + struct fsl_spi_platform_data pdata = { > + .activate_cs = fsl_spi_activate_cs, > + .deactivate_cs = fsl_spi_deactivate_cs, > + }; > + > + memset(res, 0, sizeof(res)); > + > + devid = of_get_property(np, "device-id", NULL); > + sysclk = of_get_property(np, "sysclk", NULL); > + mode = of_get_property(np, "mode", NULL); > + max_cs = of_get_property(np, "max-chipselect", NULL); > + if (!devid || !sysclk || !mode || !max_cs) > + goto err; > + > + pdata.bus_num = *(u32 *)devid; > + pdata.sysclk = *(u32 *)sysclk; > + pdata.max_chipselect = *(u32 *)max_cs; > + if (!strcmp(mode, "qe")) > + pdata.qe_mode = 1; > + > + ret = of_address_to_resource(np, 0, &res[0]); > + if (ret) > + goto err; > + > + res[1].start = res[2].end = irq_of_parse_and_map(np, 0); > + if (res[1].start == NO_IRQ) > + goto err; > + > + res[1].name = "mpc83xx_spi"; > + res[1].flags = IORESOURCE_IRQ;; > + > + pdev = platform_device_alloc("mpc83xx_spi", i); > + if (!pdev) > + goto err; > + > + ret = platform_device_add_data(pdev, &pdata, sizeof(pdata)); > + if (ret) > + goto unreg; > + > + ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res)); > + if (ret) > + goto unreg; > + > + ret = platform_device_register(pdev); > + if (ret) > + goto unreg; > + > + continue; > +unreg: > + platform_device_del(pdev); > +err: > + continue; > + } > + > + return 0; > +} > + > +arch_initcall(fsl_spi_of_init); > diff --git a/arch/powerpc/sysdev/fsl_soc.h b/arch/powerpc/sysdev/ > fsl_soc.h > index 04e145b..c9de2a2 100644 > --- a/arch/powerpc/sysdev/fsl_soc.h > +++ b/arch/powerpc/sysdev/fsl_soc.h > @@ -8,5 +8,8 @@ extern phys_addr_t get_immrbase(void); > extern u32 get_brgfreq(void); > extern u32 get_baudrate(void); > > +extern void (*fsl_spi_activate_cs)(u8 cs, u8 polarity); > +extern void (*fsl_spi_deactivate_cs)(u8 cs, u8 polarity); > + > #endif > #endif > -- > 1.5.0.6 > _______________________________________________ > Linuxppc-dev mailing list > Linuxppc-dev@ozlabs.org > https://ozlabs.org/mailman/listinfo/linuxppc-dev _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev