devices-common.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * Copyright (C) ST-Ericsson SA 2010
  3. *
  4. * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
  5. * License terms: GNU General Public License (GPL), version 2.
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/dma-mapping.h>
  9. #include <linux/err.h>
  10. #include <linux/irq.h>
  11. #include <linux/slab.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/amba/bus.h>
  14. #include <mach/hardware.h>
  15. #include "devices-common.h"
  16. struct amba_device *
  17. dbx500_add_amba_device(const char *name, resource_size_t base,
  18. int irq, void *pdata, unsigned int periphid)
  19. {
  20. struct amba_device *dev;
  21. int ret;
  22. dev = kzalloc(sizeof *dev, GFP_KERNEL);
  23. if (!dev)
  24. return ERR_PTR(-ENOMEM);
  25. dev->dev.init_name = name;
  26. dev->res.start = base;
  27. dev->res.end = base + SZ_4K - 1;
  28. dev->res.flags = IORESOURCE_MEM;
  29. dev->dma_mask = DMA_BIT_MASK(32);
  30. dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
  31. dev->irq[0] = irq;
  32. dev->irq[1] = NO_IRQ;
  33. dev->periphid = periphid;
  34. dev->dev.platform_data = pdata;
  35. ret = amba_device_register(dev, &iomem_resource);
  36. if (ret) {
  37. kfree(dev);
  38. return ERR_PTR(ret);
  39. }
  40. return dev;
  41. }
  42. static struct platform_device *
  43. dbx500_add_platform_device(const char *name, int id, void *pdata,
  44. struct resource *res, int resnum)
  45. {
  46. struct platform_device *dev;
  47. int ret;
  48. dev = platform_device_alloc(name, id);
  49. if (!dev)
  50. return ERR_PTR(-ENOMEM);
  51. dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
  52. dev->dev.dma_mask = &dev->dev.coherent_dma_mask;
  53. ret = platform_device_add_resources(dev, res, resnum);
  54. if (ret)
  55. goto out_free;
  56. dev->dev.platform_data = pdata;
  57. ret = platform_device_add(dev);
  58. if (ret)
  59. goto out_free;
  60. return dev;
  61. out_free:
  62. platform_device_put(dev);
  63. return ERR_PTR(ret);
  64. }
  65. struct platform_device *
  66. dbx500_add_platform_device_4k1irq(const char *name, int id,
  67. resource_size_t base,
  68. int irq, void *pdata)
  69. {
  70. struct resource resources[] = {
  71. [0] = {
  72. .start = base,
  73. .end = base + SZ_4K - 1,
  74. .flags = IORESOURCE_MEM,
  75. },
  76. [1] = {
  77. .start = irq,
  78. .end = irq,
  79. .flags = IORESOURCE_IRQ,
  80. }
  81. };
  82. return dbx500_add_platform_device(name, id, pdata, resources,
  83. ARRAY_SIZE(resources));
  84. }