linux/arch/arm/plat-mxc/devices/platform-imx-ssi.c
<<
>>
Prefs
   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 <mach/hardware.h>
  10#include <mach/devices-common.h>
  11
  12#define imx_imx_ssi_data_entry(soc, _id, _hwid, _size)                  \
  13        [_id] = {                                                       \
  14                .id = _id,                                              \
  15                .iobase = soc ## _SSI ## _hwid ## _BASE_ADDR,           \
  16                .iosize = _size,                                        \
  17                .irq = soc ## _INT_SSI ## _hwid,                        \
  18                .dmatx0 = soc ## _DMA_REQ_SSI ## _hwid ## _TX0,         \
  19                .dmarx0 = soc ## _DMA_REQ_SSI ## _hwid ## _RX0,         \
  20                .dmatx1 = soc ## _DMA_REQ_SSI ## _hwid ## _TX1,         \
  21                .dmarx1 = soc ## _DMA_REQ_SSI ## _hwid ## _RX1,         \
  22        }
  23
  24#ifdef CONFIG_SOC_IMX21
  25const struct imx_imx_ssi_data imx21_imx_ssi_data[] __initconst = {
  26#define imx21_imx_ssi_data_entry(_id, _hwid)                            \
  27        imx_imx_ssi_data_entry(MX21, _id, _hwid, SZ_4K)
  28        imx21_imx_ssi_data_entry(0, 1),
  29        imx21_imx_ssi_data_entry(1, 2),
  30};
  31#endif /* ifdef CONFIG_SOC_IMX21 */
  32
  33#ifdef CONFIG_SOC_IMX25
  34const struct imx_imx_ssi_data imx25_imx_ssi_data[] __initconst = {
  35#define imx25_imx_ssi_data_entry(_id, _hwid)                            \
  36        imx_imx_ssi_data_entry(MX25, _id, _hwid, SZ_4K)
  37        imx25_imx_ssi_data_entry(0, 1),
  38        imx25_imx_ssi_data_entry(1, 2),
  39};
  40#endif /* ifdef CONFIG_SOC_IMX25 */
  41
  42#ifdef CONFIG_SOC_IMX27
  43const struct imx_imx_ssi_data imx27_imx_ssi_data[] __initconst = {
  44#define imx27_imx_ssi_data_entry(_id, _hwid)                            \
  45        imx_imx_ssi_data_entry(MX27, _id, _hwid, SZ_4K)
  46        imx27_imx_ssi_data_entry(0, 1),
  47        imx27_imx_ssi_data_entry(1, 2),
  48};
  49#endif /* ifdef CONFIG_SOC_IMX27 */
  50
  51#ifdef CONFIG_SOC_IMX31
  52const struct imx_imx_ssi_data imx31_imx_ssi_data[] __initconst = {
  53#define imx31_imx_ssi_data_entry(_id, _hwid)                            \
  54        imx_imx_ssi_data_entry(MX31, _id, _hwid, SZ_4K)
  55        imx31_imx_ssi_data_entry(0, 1),
  56        imx31_imx_ssi_data_entry(1, 2),
  57};
  58#endif /* ifdef CONFIG_SOC_IMX31 */
  59
  60#ifdef CONFIG_SOC_IMX35
  61const struct imx_imx_ssi_data imx35_imx_ssi_data[] __initconst = {
  62#define imx35_imx_ssi_data_entry(_id, _hwid)                            \
  63        imx_imx_ssi_data_entry(MX35, _id, _hwid, SZ_4K)
  64        imx35_imx_ssi_data_entry(0, 1),
  65        imx35_imx_ssi_data_entry(1, 2),
  66};
  67#endif /* ifdef CONFIG_SOC_IMX35 */
  68
  69#ifdef CONFIG_SOC_IMX51
  70const struct imx_imx_ssi_data imx51_imx_ssi_data[] __initconst = {
  71#define imx51_imx_ssi_data_entry(_id, _hwid)                            \
  72        imx_imx_ssi_data_entry(MX51, _id, _hwid, SZ_4K)
  73        imx51_imx_ssi_data_entry(0, 1),
  74        imx51_imx_ssi_data_entry(1, 2),
  75        imx51_imx_ssi_data_entry(2, 3),
  76};
  77#endif /* ifdef CONFIG_SOC_IMX51 */
  78
  79struct platform_device *__init imx_add_imx_ssi(
  80                const struct imx_imx_ssi_data *data,
  81                const struct imx_ssi_platform_data *pdata)
  82{
  83        struct resource res[] = {
  84                {
  85                        .start = data->iobase,
  86                        .end = data->iobase + data->iosize - 1,
  87                        .flags = IORESOURCE_MEM,
  88                }, {
  89                        .start = data->irq,
  90                        .end = data->irq,
  91                        .flags = IORESOURCE_IRQ,
  92                },
  93#define DMARES(_name) {                                                 \
  94        .name = #_name,                                                 \
  95        .start = data->dma ## _name,                                    \
  96        .end = data->dma ## _name,                                      \
  97        .flags = IORESOURCE_DMA,                                        \
  98}
  99                DMARES(tx0),
 100                DMARES(rx0),
 101                DMARES(tx1),
 102                DMARES(rx1),
 103        };
 104
 105        return imx_add_platform_device("imx-ssi", data->id,
 106                        res, ARRAY_SIZE(res),
 107                        pdata, sizeof(*pdata));
 108}
 109