]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
Merge branch 'spi' of git://gitorious.org/linus-tree/linus-tree into spi/next
authorGrant Likely <grant.likely@secretlab.ca>
Tue, 10 Apr 2012 20:09:52 +0000 (14:09 -0600)
committerGrant Likely <grant.likely@secretlab.ca>
Tue, 10 Apr 2012 20:09:56 +0000 (14:09 -0600)
1  2 
drivers/spi/spi-omap2-mcspi.c

index bb9274c2526d7b109f131073a92d1d15037e2d38,cb2c0e390b1f19b45fd0674b594438704e3df1ec..33f54cd07fe00093f922383686371914a8b8521b
@@@ -34,8 -34,6 +34,8 @@@
  #include <linux/io.h>
  #include <linux/slab.h>
  #include <linux/pm_runtime.h>
 +#include <linux/of.h>
 +#include <linux/of_device.h>
  
  #include <linux/spi/spi.h>
  
@@@ -791,7 -789,7 +791,7 @@@ static int omap2_mcspi_setup(struct spi
        mcspi_dma = &mcspi->dma_channels[spi->chip_select];
  
        if (!cs) {
-               cs = kzalloc(sizeof *cs, GFP_KERNEL);
+               cs = devm_kzalloc(&spi->dev , sizeof *cs, GFP_KERNEL);
                if (!cs)
                        return -ENOMEM;
                cs->base = mcspi->base + spi->chip_select * 0x14;
@@@ -833,7 -831,6 +833,6 @@@ static void omap2_mcspi_cleanup(struct 
                cs = spi->controller_state;
                list_del(&cs->node);
  
-               kfree(spi->controller_state);
        }
  
        if (spi->chip_select < spi->master->num_chipselect) {
@@@ -1081,39 -1078,15 +1080,39 @@@ static int omap_mcspi_runtime_resume(st
        return 0;
  }
  
 +static struct omap2_mcspi_platform_config omap2_pdata = {
 +      .regs_offset = 0,
 +};
 +
 +static struct omap2_mcspi_platform_config omap4_pdata = {
 +      .regs_offset = OMAP4_MCSPI_REG_OFFSET,
 +};
 +
 +static const struct of_device_id omap_mcspi_of_match[] = {
 +      {
 +              .compatible = "ti,omap2-mcspi",
 +              .data = &omap2_pdata,
 +      },
 +      {
 +              .compatible = "ti,omap4-mcspi",
 +              .data = &omap4_pdata,
 +      },
 +      { },
 +};
 +MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
  
- static int __init omap2_mcspi_probe(struct platform_device *pdev)
+ static int __devinit omap2_mcspi_probe(struct platform_device *pdev)
  {
        struct spi_master       *master;
 -      struct omap2_mcspi_platform_config *pdata = pdev->dev.platform_data;
 +      struct omap2_mcspi_platform_config *pdata;
        struct omap2_mcspi      *mcspi;
        struct resource         *r;
        int                     status = 0, i;
        char                    wq_name[20];
 +      u32                     regs_offset = 0;
 +      static int              bus_num = 1;
 +      struct device_node      *node = pdev->dev.of_node;
 +      const struct of_device_id *match;
  
        master = spi_alloc_master(&pdev->dev, sizeof *mcspi);
        if (master == NULL) {
        /* the spi->mode bits understood by this driver: */
        master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
  
 -      if (pdev->id != -1)
 -              master->bus_num = pdev->id;
 -
        master->setup = omap2_mcspi_setup;
        master->transfer = omap2_mcspi_transfer;
        master->cleanup = omap2_mcspi_cleanup;
 -      master->num_chipselect = pdata->num_cs;
 +      master->dev.of_node = node;
 +
 +      match = of_match_device(omap_mcspi_of_match, &pdev->dev);
 +      if (match) {
 +              u32 num_cs = 1; /* default number of chipselect */
 +              pdata = match->data;
 +
 +              of_property_read_u32(node, "ti,spi-num-cs", &num_cs);
 +              master->num_chipselect = num_cs;
 +              master->bus_num = bus_num++;
 +      } else {
 +              pdata = pdev->dev.platform_data;
 +              master->num_chipselect = pdata->num_cs;
 +              if (pdev->id != -1)
 +                      master->bus_num = pdev->id;
 +      }
 +      regs_offset = pdata->regs_offset;
  
        dev_set_drvdata(&pdev->dev, master);
  
                goto free_master;
        }
  
 -      r->start += pdata->regs_offset;
 -      r->end += pdata->regs_offset;
 +      r->start += regs_offset;
 +      r->end += regs_offset;
        mcspi->phys = r->start;
-       if (!request_mem_region(r->start, resource_size(r),
-                               dev_name(&pdev->dev))) {
-               status = -EBUSY;
-               goto free_master;
-       }
  
-       mcspi->base = ioremap(r->start, resource_size(r));
+       mcspi->base = devm_request_and_ioremap(&pdev->dev, r);
        if (!mcspi->base) {
                dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
                status = -ENOMEM;
-               goto release_region;
+               goto free_master;
        }
  
        mcspi->dev = &pdev->dev;
                        GFP_KERNEL);
  
        if (mcspi->dma_channels == NULL)
-               goto unmap_io;
+               goto free_master;
  
        for (i = 0; i < master->num_chipselect; i++) {
                char dma_ch_name[14];
@@@ -1241,23 -1196,17 +1235,17 @@@ disable_pm
        pm_runtime_disable(&pdev->dev);
  dma_chnl_free:
        kfree(mcspi->dma_channels);
- unmap_io:
-       iounmap(mcspi->base);
- release_region:
-       release_mem_region(r->start, resource_size(r));
  free_master:
        kfree(master);
        platform_set_drvdata(pdev, NULL);
        return status;
  }
  
- static int __exit omap2_mcspi_remove(struct platform_device *pdev)
+ static int __devexit omap2_mcspi_remove(struct platform_device *pdev)
  {
        struct spi_master       *master;
        struct omap2_mcspi      *mcspi;
        struct omap2_mcspi_dma  *dma_channels;
-       struct resource         *r;
-       void __iomem *base;
  
        master = dev_get_drvdata(&pdev->dev);
        mcspi = spi_master_get_devdata(master);
  
        omap2_mcspi_disable_clocks(mcspi);
        pm_runtime_disable(&pdev->dev);
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       release_mem_region(r->start, resource_size(r));
  
-       base = mcspi->base;
        spi_unregister_master(master);
-       iounmap(base);
        kfree(dma_channels);
        destroy_workqueue(mcspi->wq);
        platform_set_drvdata(pdev, NULL);
@@@ -1324,24 -1269,11 +1308,12 @@@ static struct platform_driver omap2_mcs
        .driver = {
                .name =         "omap2_mcspi",
                .owner =        THIS_MODULE,
 -              .pm =           &omap2_mcspi_pm_ops
 +              .pm =           &omap2_mcspi_pm_ops,
 +              .of_match_table = omap_mcspi_of_match,
        },
-       .remove =       __exit_p(omap2_mcspi_remove),
+       .probe =        omap2_mcspi_probe,
+       .remove =       __devexit_p(omap2_mcspi_remove),
  };
  
- static int __init omap2_mcspi_init(void)
- {
-       return platform_driver_probe(&omap2_mcspi_driver, omap2_mcspi_probe);
- }
- subsys_initcall(omap2_mcspi_init);
- static void __exit omap2_mcspi_exit(void)
- {
-       platform_driver_unregister(&omap2_mcspi_driver);
- }
- module_exit(omap2_mcspi_exit);
+ module_platform_driver(omap2_mcspi_driver);
  MODULE_LICENSE("GPL");