blob: bfe443daf4b06d1aba8fc33f0266887c1cf88ab7 [file] [log] [blame]
Ola Liljac0af14d2012-04-20 11:32:59 +02001/*
2 * Copyright (C) ST-Ericsson SA 2010
3 *
4 * License terms: GNU General Public License (GPL), version 2
5 */
6
7#include <linux/platform_device.h>
8#include <linux/init.h>
9#include <linux/gpio.h>
Linus Walleijbb16bd92012-10-10 14:27:58 +020010#include <linux/platform_data/pinctrl-nomadik.h>
Linus Walleij865fab62012-10-18 14:20:16 +020011#include <linux/platform_data/dma-ste-dma40.h>
Ola Liljac0af14d2012-04-20 11:32:59 +020012
Arnd Bergmanne657bcf2013-03-21 22:51:12 +010013#include "devices.h"
Arnd Bergmanneba52742013-03-21 22:51:08 +010014#include "irqs.h"
Arnd Bergmannab0fc6c2013-03-21 22:51:06 +010015#include <linux/platform_data/asoc-ux500-msp.h>
Ola Liljac0af14d2012-04-20 11:32:59 +020016
Linus Walleij08d98fe2012-05-07 10:34:16 +020017#include "ste-dma40-db8500.h"
Ola Liljac0af14d2012-04-20 11:32:59 +020018#include "board-mop500.h"
19#include "devices-db8500.h"
20#include "pins-db8500.h"
21
Ola Liljac0af14d2012-04-20 11:32:59 +020022static struct stedma40_chan_cfg msp0_dma_rx = {
23 .high_priority = true,
Lee Jones98b68ab2013-05-15 10:51:53 +010024 .dir = DMA_DEV_TO_MEM,
Lee Jones26955c07d2013-05-03 15:31:56 +010025 .dev_type = DB8500_DMA_DEV31_MSP0_SLIM0_CH0,
Ola Liljac0af14d2012-04-20 11:32:59 +020026};
27
28static struct stedma40_chan_cfg msp0_dma_tx = {
29 .high_priority = true,
Lee Jones98b68ab2013-05-15 10:51:53 +010030 .dir = DMA_MEM_TO_DEV,
Lee Jones26955c07d2013-05-03 15:31:56 +010031 .dev_type = DB8500_DMA_DEV31_MSP0_SLIM0_CH0,
Ola Liljac0af14d2012-04-20 11:32:59 +020032};
33
Lee Jones724ebbf2012-07-25 13:58:36 +010034struct msp_i2s_platform_data msp0_platform_data = {
Ola Liljac0af14d2012-04-20 11:32:59 +020035 .id = MSP_I2S_0,
36 .msp_i2s_dma_rx = &msp0_dma_rx,
37 .msp_i2s_dma_tx = &msp0_dma_tx,
38};
39
40static struct stedma40_chan_cfg msp1_dma_rx = {
41 .high_priority = true,
Lee Jones98b68ab2013-05-15 10:51:53 +010042 .dir = DMA_DEV_TO_MEM,
Lee Jones26955c07d2013-05-03 15:31:56 +010043 .dev_type = DB8500_DMA_DEV30_MSP3,
Ola Liljac0af14d2012-04-20 11:32:59 +020044};
45
46static struct stedma40_chan_cfg msp1_dma_tx = {
47 .high_priority = true,
Lee Jones98b68ab2013-05-15 10:51:53 +010048 .dir = DMA_MEM_TO_DEV,
Lee Jones26955c07d2013-05-03 15:31:56 +010049 .dev_type = DB8500_DMA_DEV30_MSP1,
Ola Liljac0af14d2012-04-20 11:32:59 +020050};
51
Lee Jones724ebbf2012-07-25 13:58:36 +010052struct msp_i2s_platform_data msp1_platform_data = {
Ola Liljac0af14d2012-04-20 11:32:59 +020053 .id = MSP_I2S_1,
54 .msp_i2s_dma_rx = NULL,
55 .msp_i2s_dma_tx = &msp1_dma_tx,
Ola Liljac0af14d2012-04-20 11:32:59 +020056};
57
58static struct stedma40_chan_cfg msp2_dma_rx = {
59 .high_priority = true,
Lee Jones98b68ab2013-05-15 10:51:53 +010060 .dir = DMA_DEV_TO_MEM,
Lee Jones26955c07d2013-05-03 15:31:56 +010061 .dev_type = DB8500_DMA_DEV14_MSP2,
Ola Liljac0af14d2012-04-20 11:32:59 +020062};
63
64static struct stedma40_chan_cfg msp2_dma_tx = {
65 .high_priority = true,
Lee Jones98b68ab2013-05-15 10:51:53 +010066 .dir = DMA_MEM_TO_DEV,
Lee Jones26955c07d2013-05-03 15:31:56 +010067 .dev_type = DB8500_DMA_DEV14_MSP2,
Ola Liljac0af14d2012-04-20 11:32:59 +020068 .use_fixed_channel = true,
69 .phy_channel = 1,
Ola Liljac0af14d2012-04-20 11:32:59 +020070};
71
Linus Walleij09486cb2012-05-07 10:29:38 +020072static struct platform_device *db8500_add_msp_i2s(struct device *parent,
73 int id,
Ola Liljac0af14d2012-04-20 11:32:59 +020074 resource_size_t base, int irq,
75 struct msp_i2s_platform_data *pdata)
76{
77 struct platform_device *pdev;
78 struct resource res[] = {
79 DEFINE_RES_MEM(base, SZ_4K),
80 DEFINE_RES_IRQ(irq),
81 };
82
83 pr_info("Register platform-device 'ux500-msp-i2s', id %d, irq %d\n",
84 id, irq);
85 pdev = platform_device_register_resndata(parent, "ux500-msp-i2s", id,
86 res, ARRAY_SIZE(res),
87 pdata, sizeof(*pdata));
88 if (!pdev) {
89 pr_err("Failed to register platform-device 'ux500-msp-i2s.%d'!\n",
90 id);
Linus Walleij09486cb2012-05-07 10:29:38 +020091 return NULL;
Ola Liljac0af14d2012-04-20 11:32:59 +020092 }
93
Linus Walleij09486cb2012-05-07 10:29:38 +020094 return pdev;
Ola Liljac0af14d2012-04-20 11:32:59 +020095}
96
Lee Jones97f50c62012-08-09 16:47:27 +010097/* Platform device for ASoC MOP500 machine */
98static struct platform_device snd_soc_mop500 = {
Lee Jones65b67d32012-09-14 15:43:52 +010099 .name = "snd-soc-mop500",
100 .id = 0,
101 .dev = {
102 .platform_data = NULL,
103 },
Ola Liljac0af14d2012-04-20 11:32:59 +0200104};
105
Lee Jones724ebbf2012-07-25 13:58:36 +0100106struct msp_i2s_platform_data msp2_platform_data = {
Ola Liljac0af14d2012-04-20 11:32:59 +0200107 .id = MSP_I2S_2,
108 .msp_i2s_dma_rx = &msp2_dma_rx,
109 .msp_i2s_dma_tx = &msp2_dma_tx,
110};
111
Lee Jones724ebbf2012-07-25 13:58:36 +0100112struct msp_i2s_platform_data msp3_platform_data = {
Ola Liljac0af14d2012-04-20 11:32:59 +0200113 .id = MSP_I2S_3,
114 .msp_i2s_dma_rx = &msp1_dma_rx,
115 .msp_i2s_dma_tx = NULL,
Ola Liljac0af14d2012-04-20 11:32:59 +0200116};
117
Lee Jones39b740b2012-09-14 15:46:29 +0100118void mop500_audio_init(struct device *parent)
Ola Liljac0af14d2012-04-20 11:32:59 +0200119{
Lee Jones97f50c62012-08-09 16:47:27 +0100120 pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__);
121 platform_device_register(&snd_soc_mop500);
Ola Liljac0af14d2012-04-20 11:32:59 +0200122
123 pr_info("Initialize MSP I2S-devices.\n");
Linus Walleij09486cb2012-05-07 10:29:38 +0200124 db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0,
125 &msp0_platform_data);
Lee Jones5ca032e2012-09-14 16:16:08 +0100126 db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1,
Linus Walleij09486cb2012-05-07 10:29:38 +0200127 &msp1_platform_data);
128 db8500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2,
129 &msp2_platform_data);
130 db8500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1,
131 &msp3_platform_data);
Ola Liljac0af14d2012-04-20 11:32:59 +0200132}