platform-mxc-mmc.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * Copyright (C) 2010 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 "../hardware.h"
  11. #include "devices-common.h"
  12. #define imx_mxc_mmc_data_entry_single(soc, _devid, _id, _hwid, _size) \
  13. { \
  14. .devid = _devid, \
  15. .id = _id, \
  16. .iobase = soc ## _SDHC ## _hwid ## _BASE_ADDR, \
  17. .iosize = _size, \
  18. .irq = soc ## _INT_SDHC ## _hwid, \
  19. .dmareq = soc ## _DMA_REQ_SDHC ## _hwid, \
  20. }
  21. #define imx_mxc_mmc_data_entry(soc, _devid, _id, _hwid, _size) \
  22. [_id] = imx_mxc_mmc_data_entry_single(soc, _devid, _id, _hwid, _size)
  23. #ifdef CONFIG_SOC_IMX21
  24. const struct imx_mxc_mmc_data imx21_mxc_mmc_data[] __initconst = {
  25. #define imx21_mxc_mmc_data_entry(_id, _hwid) \
  26. imx_mxc_mmc_data_entry(MX21, "imx21-mmc", _id, _hwid, SZ_4K)
  27. imx21_mxc_mmc_data_entry(0, 1),
  28. imx21_mxc_mmc_data_entry(1, 2),
  29. };
  30. #endif /* ifdef CONFIG_SOC_IMX21 */
  31. #ifdef CONFIG_SOC_IMX27
  32. const struct imx_mxc_mmc_data imx27_mxc_mmc_data[] __initconst = {
  33. #define imx27_mxc_mmc_data_entry(_id, _hwid) \
  34. imx_mxc_mmc_data_entry(MX27, "imx21-mmc", _id, _hwid, SZ_4K)
  35. imx27_mxc_mmc_data_entry(0, 1),
  36. imx27_mxc_mmc_data_entry(1, 2),
  37. };
  38. #endif /* ifdef CONFIG_SOC_IMX27 */
  39. #ifdef CONFIG_SOC_IMX31
  40. const struct imx_mxc_mmc_data imx31_mxc_mmc_data[] __initconst = {
  41. #define imx31_mxc_mmc_data_entry(_id, _hwid) \
  42. imx_mxc_mmc_data_entry(MX31, "imx31-mmc", _id, _hwid, SZ_16K)
  43. imx31_mxc_mmc_data_entry(0, 1),
  44. imx31_mxc_mmc_data_entry(1, 2),
  45. };
  46. #endif /* ifdef CONFIG_SOC_IMX31 */
  47. struct platform_device *__init imx_add_mxc_mmc(
  48. const struct imx_mxc_mmc_data *data,
  49. const struct imxmmc_platform_data *pdata)
  50. {
  51. struct resource res[] = {
  52. {
  53. .start = data->iobase,
  54. .end = data->iobase + data->iosize - 1,
  55. .flags = IORESOURCE_MEM,
  56. }, {
  57. .start = data->irq,
  58. .end = data->irq,
  59. .flags = IORESOURCE_IRQ,
  60. }, {
  61. .start = data->dmareq,
  62. .end = data->dmareq,
  63. .flags = IORESOURCE_DMA,
  64. },
  65. };
  66. return imx_add_platform_device_dmamask(data->devid, data->id,
  67. res, ARRAY_SIZE(res),
  68. pdata, sizeof(*pdata), DMA_BIT_MASK(32));
  69. }