platform-ipu-core.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * Copyright (C) 2011 Pengutronix
  3. * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
  4. *
  5. * This program is free software; you can redistribute it and/or modify it under
  6. * the terms of the GNU General Public License version 2 as published by the
  7. * Free Software Foundation.
  8. */
  9. #include <linux/dma-mapping.h>
  10. #include <mach/hardware.h>
  11. #include <mach/devices-common.h>
  12. #define imx_ipu_core_entry_single(soc) \
  13. { \
  14. .iobase = soc ## _IPU_CTRL_BASE_ADDR, \
  15. .synirq = soc ## _INT_IPU_SYN, \
  16. .errirq = soc ## _INT_IPU_ERR, \
  17. }
  18. #ifdef CONFIG_SOC_IMX31
  19. const struct imx_ipu_core_data imx31_ipu_core_data __initconst =
  20. imx_ipu_core_entry_single(MX31);
  21. #endif
  22. #ifdef CONFIG_SOC_IMX35
  23. const struct imx_ipu_core_data imx35_ipu_core_data __initconst =
  24. imx_ipu_core_entry_single(MX35);
  25. #endif
  26. static struct platform_device *imx_ipu_coredev __initdata;
  27. struct platform_device *__init imx_add_ipu_core(
  28. const struct imx_ipu_core_data *data,
  29. const struct ipu_platform_data *pdata)
  30. {
  31. /* The resource order is important! */
  32. struct resource res[] = {
  33. {
  34. .start = data->iobase,
  35. .end = data->iobase + 0x5f,
  36. .flags = IORESOURCE_MEM,
  37. }, {
  38. .start = data->iobase + 0x88,
  39. .end = data->iobase + 0xb3,
  40. .flags = IORESOURCE_MEM,
  41. }, {
  42. .start = data->synirq,
  43. .end = data->synirq,
  44. .flags = IORESOURCE_IRQ,
  45. }, {
  46. .start = data->errirq,
  47. .end = data->errirq,
  48. .flags = IORESOURCE_IRQ,
  49. },
  50. };
  51. return imx_ipu_coredev = imx_add_platform_device("ipu-core", -1,
  52. res, ARRAY_SIZE(res), pdata, sizeof(*pdata));
  53. }
  54. struct platform_device *__init imx_alloc_mx3_camera(
  55. const struct imx_ipu_core_data *data,
  56. const struct mx3_camera_pdata *pdata)
  57. {
  58. struct resource res[] = {
  59. {
  60. .start = data->iobase + 0x60,
  61. .end = data->iobase + 0x87,
  62. .flags = IORESOURCE_MEM,
  63. },
  64. };
  65. int ret = -ENOMEM;
  66. struct platform_device *pdev;
  67. if (IS_ERR_OR_NULL(imx_ipu_coredev))
  68. return ERR_PTR(-ENODEV);
  69. pdev = platform_device_alloc("mx3-camera", 0);
  70. if (!pdev)
  71. goto err;
  72. pdev->dev.dma_mask = kmalloc(sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
  73. if (!pdev->dev.dma_mask)
  74. goto err;
  75. *pdev->dev.dma_mask = DMA_BIT_MASK(32);
  76. pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
  77. ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res));
  78. if (ret)
  79. goto err;
  80. if (pdata) {
  81. struct mx3_camera_pdata *copied_pdata;
  82. ret = platform_device_add_data(pdev, pdata, sizeof(*pdata));
  83. if (ret) {
  84. err:
  85. kfree(pdev->dev.dma_mask);
  86. platform_device_put(pdev);
  87. return ERR_PTR(-ENODEV);
  88. }
  89. copied_pdata = dev_get_platdata(&pdev->dev);
  90. copied_pdata->dma_dev = &imx_ipu_coredev->dev;
  91. }
  92. return pdev;
  93. }
  94. struct platform_device *__init imx_add_mx3_sdc_fb(
  95. const struct imx_ipu_core_data *data,
  96. struct mx3fb_platform_data *pdata)
  97. {
  98. struct resource res[] = {
  99. {
  100. .start = data->iobase + 0xb4,
  101. .end = data->iobase + 0x1bf,
  102. .flags = IORESOURCE_MEM,
  103. },
  104. };
  105. if (IS_ERR_OR_NULL(imx_ipu_coredev))
  106. return ERR_PTR(-ENODEV);
  107. pdata->dma_dev = &imx_ipu_coredev->dev;
  108. return imx_add_platform_device_dmamask("mx3_sdc_fb", -1,
  109. res, ARRAY_SIZE(res), pdata, sizeof(*pdata),
  110. DMA_BIT_MASK(32));
  111. }