On Thu, Sep 27, 2012 at 01:51:18AM +0200, Hans J. Koch wrote: > On Wed, Sep 26, 2012 at 09:44:29AM -0400, Matt Porter wrote: > > Add ifdefery hacks to only use SRAM on Davinci. This > > needs to be cleaned up with a sane generic SRAM allocator > > (like the DT based driver available that can't be used on > > Davinci which is just starting DT conversion) before it > > can go upstream. > > I agree with that ;-) > Needing lots of ifdefs in *.c files is usually a bad sign... > > Thanks anyway for posting, it's good to have things like that in the archives. > > And please make driver code and documentation updates separate patches in the > future. Will separate out on v2. -Matt > > > > Adds DT, pinctrl, and runtime PM support for use on > > AM33xx. > > > > Signed-off-by: Matt Porter <mporter@xxxxxx> > > --- > > Documentation/devicetree/bindings/uio/pruss.txt | 17 ++++++ > > .../devicetree/bindings/uio/uio_pruss.txt | 17 ++++++ > > drivers/uio/Kconfig | 4 +- > > drivers/uio/uio_pruss.c | 63 +++++++++++++++++++- > > 4 files changed, 98 insertions(+), 3 deletions(-) > > create mode 100644 Documentation/devicetree/bindings/uio/pruss.txt > > create mode 100644 Documentation/devicetree/bindings/uio/uio_pruss.txt > > > > diff --git a/Documentation/devicetree/bindings/uio/pruss.txt b/Documentation/devicetree/bindings/uio/pruss.txt > > new file mode 100644 > > index 0000000..2ac45c5 > > --- /dev/null > > +++ b/Documentation/devicetree/bindings/uio/pruss.txt > > @@ -0,0 +1,17 @@ > > +TI PRUSS device > > + > > +Required properties: > > +- compatible : > > + - "ti,pruss-v1" for AM18xx/OMAP-L138/DA850 > > + - "ti,pruss-v2" for AM33xx. > > +- ti,pintc-offset : Offset of the PINTC from the PRUSS address base > > +- ti,hwmods: Name of the hwmod associated to the PRUSS > > + > > +Example: > > + > > +pruss: pruss@4a300000 { > > + compatible = "ti,pruss-v2"; > > + ti,hwmods = "pruss"; > > + reg = <0x4a300000 0x080000>; > > + ti,pintc-offset = <0x20000>; > > +}; > > diff --git a/Documentation/devicetree/bindings/uio/uio_pruss.txt b/Documentation/devicetree/bindings/uio/uio_pruss.txt > > new file mode 100644 > > index 0000000..2ac45c5 > > --- /dev/null > > +++ b/Documentation/devicetree/bindings/uio/uio_pruss.txt > > @@ -0,0 +1,17 @@ > > +TI PRUSS device > > + > > +Required properties: > > +- compatible : > > + - "ti,pruss-v1" for AM18xx/OMAP-L138/DA850 > > + - "ti,pruss-v2" for AM33xx. > > +- ti,pintc-offset : Offset of the PINTC from the PRUSS address base > > +- ti,hwmods: Name of the hwmod associated to the PRUSS > > + > > +Example: > > + > > +pruss: pruss@4a300000 { > > + compatible = "ti,pruss-v2"; > > + ti,hwmods = "pruss"; > > + reg = <0x4a300000 0x080000>; > > + ti,pintc-offset = <0x20000>; > > +}; > > diff --git a/drivers/uio/Kconfig b/drivers/uio/Kconfig > > index 6f3ea9b..8da7d9b 100644 > > --- a/drivers/uio/Kconfig > > +++ b/drivers/uio/Kconfig > > @@ -96,9 +96,9 @@ config UIO_NETX > > > > config UIO_PRUSS > > tristate "Texas Instruments PRUSS driver" > > - depends on ARCH_DAVINCI_DA850 > > + depends on ARCH_DAVINCI_DA850 || SOC_AM33XX > > help > > - PRUSS driver for OMAPL138/DA850/AM18XX devices > > + PRUSS driver for OMAPL138/DA850/AM18XX and AM33XX devices > > PRUSS driver requires user space components, examples and user space > > driver is available from below SVN repo - you may use anonymous login > > > > diff --git a/drivers/uio/uio_pruss.c b/drivers/uio/uio_pruss.c > > index 33a7a27..326ce40 100644 > > --- a/drivers/uio/uio_pruss.c > > +++ b/drivers/uio/uio_pruss.c > > @@ -25,7 +25,15 @@ > > #include <linux/clk.h> > > #include <linux/dma-mapping.h> > > #include <linux/slab.h> > > +#include <linux/of_address.h> > > +#include <linux/of_device.h> > > +#include <linux/pinctrl/consumer.h> > > +#include <linux/err.h> > > +#include <linux/pm_runtime.h> > > + > > +#ifdef CONFIG_ARCH_DAVINCI_DA850 > > #include <mach/sram.h> > > +#endif > > > > #define DRV_NAME "pruss_uio" > > #define DRV_VERSION "1.0" > > @@ -105,8 +113,10 @@ static void pruss_cleanup(struct platform_device *dev, > > dma_free_coherent(&dev->dev, extram_pool_sz, gdev->ddr_vaddr, > > gdev->ddr_paddr); > > } > > +#ifdef CONFIG_ARCH_DAVINCI_DA850 > > if (gdev->sram_vaddr) > > sram_free(gdev->sram_vaddr, sram_pool_sz); > > +#endif > > kfree(gdev->info); > > clk_put(gdev->pruss_clk); > > kfree(gdev); > > @@ -117,8 +127,10 @@ static int __devinit pruss_probe(struct platform_device *dev) > > struct uio_info *p; > > struct uio_pruss_dev *gdev; > > struct resource *regs_prussio; > > + struct resource res; > > int ret = -ENODEV, cnt = 0, len; > > struct uio_pruss_pdata *pdata = dev->dev.platform_data; > > + struct pinctrl *pinctrl; > > > > gdev = kzalloc(sizeof(struct uio_pruss_dev), GFP_KERNEL); > > if (!gdev) > > @@ -129,6 +141,7 @@ static int __devinit pruss_probe(struct platform_device *dev) > > kfree(gdev); > > return -ENOMEM; > > } > > +#ifdef CONFIG_ARCH_DAVINCI_DA850 > > /* Power on PRU in case its not done as part of boot-loader */ > > gdev->pruss_clk = clk_get(&dev->dev, "pruss"); > > if (IS_ERR(gdev->pruss_clk)) { > > @@ -140,6 +153,28 @@ static int __devinit pruss_probe(struct platform_device *dev) > > } else { > > clk_enable(gdev->pruss_clk); > > } > > +#endif > > + > > + if (dev->dev.of_node) { > > + pm_runtime_enable(&dev->dev); > > + ret = pm_runtime_get_sync(&dev->dev); > > + if (IS_ERR_VALUE(ret)) { > > + dev_err(&dev->dev, "pm_runtime_get_sync() failed\n"); > > + return ret; > > + } > > + > > + ret = of_address_to_resource(dev->dev.of_node, 0, &res); > > + if (IS_ERR_VALUE(ret)) { > > + dev_err(&dev->dev, "failed to parse DT reg\n"); > > + return ret; > > + } > > + regs_prussio = &res; > > + } > > + > > + pinctrl = devm_pinctrl_get_select_default(&dev->dev); > > + if (IS_ERR(pinctrl)) > > + dev_warn(&dev->dev, > > + "pins are not configured from the driver\n"); > > > > regs_prussio = platform_get_resource(dev, IORESOURCE_MEM, 0); > > if (!regs_prussio) { > > @@ -152,11 +187,13 @@ static int __devinit pruss_probe(struct platform_device *dev) > > goto out_free; > > } > > > > +#ifdef CONFIG_ARCH_DAVINCI_DA850 > > gdev->sram_vaddr = sram_alloc(sram_pool_sz, &(gdev->sram_paddr)); > > if (!gdev->sram_vaddr) { > > dev_err(&dev->dev, "Could not allocate SRAM pool\n"); > > goto out_free; > > } > > +#endif > > > > gdev->ddr_vaddr = dma_alloc_coherent(&dev->dev, extram_pool_sz, > > &(gdev->ddr_paddr), GFP_KERNEL | GFP_DMA); > > @@ -172,7 +209,17 @@ static int __devinit pruss_probe(struct platform_device *dev) > > goto out_free; > > } > > > > - gdev->pintc_base = pdata->pintc_base; > > + if (dev->dev.of_node) { > > + ret = of_property_read_u32(dev->dev.of_node, > > + "ti,pintc-offset", > > + &gdev->pintc_base); > > + if (ret < 0) { > > + dev_err(&dev->dev, > > + "Can't parse ti,pintc-offset property\n"); > > + goto out_free; > > + } > > + } else > > + gdev->pintc_base = pdata->pintc_base; > > gdev->hostirq_start = platform_get_irq(dev, 0); > > > > for (cnt = 0, p = gdev->info; cnt < MAX_PRUSS_EVT; cnt++, p++) { > > @@ -180,6 +227,7 @@ static int __devinit pruss_probe(struct platform_device *dev) > > p->mem[0].size = resource_size(regs_prussio); > > p->mem[0].memtype = UIO_MEM_PHYS; > > > > +#ifdef CONFIG_ARCH_DAVINCI_DA850 > > p->mem[1].addr = gdev->sram_paddr; > > p->mem[1].size = sram_pool_sz; > > p->mem[1].memtype = UIO_MEM_PHYS; > > @@ -187,6 +235,11 @@ static int __devinit pruss_probe(struct platform_device *dev) > > p->mem[2].addr = gdev->ddr_paddr; > > p->mem[2].size = extram_pool_sz; > > p->mem[2].memtype = UIO_MEM_PHYS; > > +#else > > + p->mem[1].addr = gdev->ddr_paddr; > > + p->mem[1].size = extram_pool_sz; > > + p->mem[1].memtype = UIO_MEM_PHYS; > > +#endif > > > > p->name = kasprintf(GFP_KERNEL, "pruss_evt%d", cnt); > > p->version = DRV_VERSION; > > @@ -218,12 +271,20 @@ static int __devexit pruss_remove(struct platform_device *dev) > > return 0; > > } > > > > +static const struct of_device_id pruss_dt_ids[] = { > > + { .compatible = "ti,pruss-v1", .data = NULL, }, > > + { .compatible = "ti,pruss-v2", .data = NULL, }, > > + {}, > > +}; > > +MODULE_DEVICE_TABLE(of, pruss_dt_ids); > > + > > static struct platform_driver pruss_driver = { > > .probe = pruss_probe, > > .remove = __devexit_p(pruss_remove), > > .driver = { > > .name = DRV_NAME, > > .owner = THIS_MODULE, > > + .of_match_table = pruss_dt_ids, > > }, > > }; > > > > -- > > 1.7.9.5 > > > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html