Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f405b46 authored by Mark Brown's avatar Mark Brown
Browse files

Merge branch 'davinci' into for-2.6.32

Conflicts:
	sound/soc/davinci/davinci-i2s.c
parents 4ec5c969 efd13be0
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -9,6 +9,9 @@ config SND_DAVINCI_SOC
config SND_DAVINCI_SOC_I2S
	tristate

config SND_DAVINCI_SOC_MCASP
	tristate

config SND_DAVINCI_SOC_EVM
	tristate "SoC Audio support for DaVinci DM6446 or DM355 EVM"
	depends on SND_DAVINCI_SOC
@@ -19,6 +22,16 @@ config SND_DAVINCI_SOC_EVM
	  Say Y if you want to add support for SoC audio on TI
	  DaVinci DM6446 or DM355 EVM platforms.

config  SND_DM6467_SOC_EVM
	tristate "SoC Audio support for DaVinci DM6467 EVM"
	depends on SND_DAVINCI_SOC && MACH_DAVINCI_DM6467_EVM
	select SND_DAVINCI_SOC_MCASP
	select SND_SOC_TLV320AIC3X
	select SND_SOC_SPDIF

	help
	  Say Y if you want to add support for SoC audio on TI

config SND_DAVINCI_SOC_SFFSDR
	tristate "SoC Audio support for SFFSDR"
	depends on SND_DAVINCI_SOC && MACH_SFFSDR
+3 −0
Original line number Diff line number Diff line
# DAVINCI Platform Support
snd-soc-davinci-objs := davinci-pcm.o
snd-soc-davinci-i2s-objs := davinci-i2s.o
snd-soc-davinci-mcasp-objs:= davinci-mcasp.o

obj-$(CONFIG_SND_DAVINCI_SOC) += snd-soc-davinci.o
obj-$(CONFIG_SND_DAVINCI_SOC_I2S) += snd-soc-davinci-i2s.o
obj-$(CONFIG_SND_DAVINCI_SOC_MCASP) += snd-soc-davinci-mcasp.o

# DAVINCI Machine Support
snd-soc-evm-objs := davinci-evm.o
snd-soc-sffsdr-objs := davinci-sffsdr.o

obj-$(CONFIG_SND_DAVINCI_SOC_EVM) += snd-soc-evm.o
obj-$(CONFIG_SND_DM6467_SOC_EVM) += snd-soc-evm.o
obj-$(CONFIG_SND_DAVINCI_SOC_SFFSDR) += snd-soc-sffsdr.o
+48 −54
Original line number Diff line number Diff line
@@ -27,9 +27,10 @@
#include <mach/mux.h>

#include "../codecs/tlv320aic3x.h"
#include "../codecs/spdif_transciever.h"
#include "davinci-pcm.h"
#include "davinci-i2s.h"

#include "davinci-mcasp.h"

#define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \
		SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF)
@@ -43,7 +44,7 @@ static int evm_hw_params(struct snd_pcm_substream *substream,
	unsigned sysclk;

	/* ASP1 on DM355 EVM is clocked by an external oscillator */
	if (machine_is_davinci_dm355_evm())
	if (machine_is_davinci_dm355_evm() || machine_is_davinci_dm6467_evm())
		sysclk = 27000000;

	/* ASP0 in DM6446 EVM is clocked by U55, as configured by
@@ -144,6 +145,24 @@ static struct snd_soc_dai_link evm_dai = {
	.ops = &evm_ops,
};

static struct snd_soc_dai_link dm6467_evm_dai[] = {
	{
		.name = "TLV320AIC3X",
		.stream_name = "AIC3X",
		.cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI],
		.codec_dai = &aic3x_dai,
		.init = evm_aic3x_init,
		.ops = &evm_ops,
	},
	{
		.name = "McASP",
		.stream_name = "spdif",
		.cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_DIT_DAI],
		.codec_dai = &dit_stub_dai,
		.ops = &evm_ops,
	},
};

/* davinci-evm audio machine driver */
static struct snd_soc_card snd_soc_card_evm = {
	.name = "DaVinci EVM",
@@ -152,12 +171,26 @@ static struct snd_soc_card snd_soc_card_evm = {
	.num_links = 1,
};

/* davinci dm6467 evm audio machine driver */
static struct snd_soc_card dm6467_snd_soc_card_evm = {
	.name = "DaVinci DM6467 EVM",
	.platform = &davinci_soc_platform,
	.dai_link = dm6467_evm_dai,
	.num_links = ARRAY_SIZE(dm6467_evm_dai),
};

/* evm audio private data */
static struct aic3x_setup_data evm_aic3x_setup = {
	.i2c_bus = 1,
	.i2c_address = 0x1b,
};

/* dm6467 evm audio private data */
static struct aic3x_setup_data dm6467_evm_aic3x_setup = {
       .i2c_bus = 1,
       .i2c_address = 0x18,
};

/* evm audio subsystem */
static struct snd_soc_device evm_snd_devdata = {
	.card = &snd_soc_card_evm,
@@ -165,60 +198,30 @@ static struct snd_soc_device evm_snd_devdata = {
	.codec_data = &evm_aic3x_setup,
};

/* DM6446 EVM uses ASP0; line-out is a pair of RCA jacks */
static struct resource evm_snd_resources[] = {
	{
		.start = DAVINCI_ASP0_BASE,
		.end = DAVINCI_ASP0_BASE + SZ_8K - 1,
		.flags = IORESOURCE_MEM,
	},
};

static struct evm_snd_platform_data evm_snd_data = {
	.tx_dma_ch	= DAVINCI_DMA_ASP0_TX,
	.rx_dma_ch	= DAVINCI_DMA_ASP0_RX,
};

/* DM335 EVM uses ASP1; line-out is a stereo mini-jack */
static struct resource dm335evm_snd_resources[] = {
	{
		.start = DAVINCI_ASP1_BASE,
		.end = DAVINCI_ASP1_BASE + SZ_8K - 1,
		.flags = IORESOURCE_MEM,
	},
};

static struct evm_snd_platform_data dm335evm_snd_data = {
	.tx_dma_ch	= DAVINCI_DMA_ASP1_TX,
	.rx_dma_ch	= DAVINCI_DMA_ASP1_RX,
/* evm audio subsystem */
static struct snd_soc_device dm6467_evm_snd_devdata = {
	.card = &dm6467_snd_soc_card_evm,
	.codec_dev = &soc_codec_dev_aic3x,
	.codec_data = &dm6467_evm_aic3x_setup,
};

static struct platform_device *evm_snd_device;

static int __init evm_init(void)
{
	struct resource *resources;
	unsigned num_resources;
	struct evm_snd_platform_data *data;
	struct snd_soc_device *evm_snd_dev_data;
	int index;
	int ret;

	if (machine_is_davinci_evm()) {
		davinci_cfg_reg(DM644X_MCBSP);

		resources = evm_snd_resources;
		num_resources = ARRAY_SIZE(evm_snd_resources);
		data = &evm_snd_data;
		evm_snd_dev_data = &evm_snd_devdata;
		index = 0;
	} else if (machine_is_davinci_dm355_evm()) {
		/* we don't use ASP1 IRQs, or we'd need to mux them ... */
		davinci_cfg_reg(DM355_EVT8_ASP1_TX);
		davinci_cfg_reg(DM355_EVT9_ASP1_RX);

		resources = dm335evm_snd_resources;
		num_resources = ARRAY_SIZE(dm335evm_snd_resources);
		data = &dm335evm_snd_data;
		evm_snd_dev_data = &evm_snd_devdata;
		index = 1;
	} else if (machine_is_davinci_dm6467_evm()) {
		evm_snd_dev_data = &dm6467_evm_snd_devdata;
		index = 0;
	} else
		return -EINVAL;

@@ -226,17 +229,8 @@ static int __init evm_init(void)
	if (!evm_snd_device)
		return -ENOMEM;

	platform_set_drvdata(evm_snd_device, &evm_snd_devdata);
	evm_snd_devdata.dev = &evm_snd_device->dev;
	platform_device_add_data(evm_snd_device, data, sizeof(*data));

	ret = platform_device_add_resources(evm_snd_device, resources,
			num_resources);
	if (ret) {
		platform_device_put(evm_snd_device);
		return ret;
	}

	platform_set_drvdata(evm_snd_device, evm_snd_dev_data);
	evm_snd_dev_data->dev = &evm_snd_device->dev;
	ret = platform_device_add(evm_snd_device);
	if (ret)
		platform_device_put(evm_snd_device);
+70 −51
Original line number Diff line number Diff line
@@ -470,15 +470,41 @@ static void davinci_i2s_shutdown(struct snd_pcm_substream *substream,
	davinci_mcbsp_stop(dev, playback);
}

static int davinci_i2s_probe(struct platform_device *pdev,
			     struct snd_soc_dai *dai)
#define DAVINCI_I2S_RATES	SNDRV_PCM_RATE_8000_96000

static struct snd_soc_dai_ops davinci_i2s_dai_ops = {
	.startup 	= davinci_i2s_startup,
	.shutdown	= davinci_i2s_shutdown,
	.prepare	= davinci_i2s_prepare,
	.trigger	= davinci_i2s_trigger,
	.hw_params	= davinci_i2s_hw_params,
	.set_fmt	= davinci_i2s_set_dai_fmt,

};

struct snd_soc_dai davinci_i2s_dai = {
	.name = "davinci-i2s",
	.id = 0,
	.playback = {
		.channels_min = 2,
		.channels_max = 2,
		.rates = DAVINCI_I2S_RATES,
		.formats = SNDRV_PCM_FMTBIT_S16_LE,},
	.capture = {
		.channels_min = 2,
		.channels_max = 2,
		.rates = DAVINCI_I2S_RATES,
		.formats = SNDRV_PCM_FMTBIT_S16_LE,},
	.ops = &davinci_i2s_dai_ops,

};
EXPORT_SYMBOL_GPL(davinci_i2s_dai);

static int davinci_i2s_probe(struct platform_device *pdev)
{
	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
	struct snd_soc_card *card = socdev->card;
	struct snd_soc_dai *cpu_dai = card->dai_link->cpu_dai;
	struct snd_platform_data *pdata = pdev->dev.platform_data;
	struct davinci_mcbsp_dev *dev;
	struct resource *mem, *ioarea;
	struct evm_snd_platform_data *pdata;
	struct resource *mem, *ioarea, *res;
	int ret;

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -500,9 +526,7 @@ static int davinci_i2s_probe(struct platform_device *pdev,
		goto err_release_region;
	}

	cpu_dai->private_data = dev;

	dev->clk = clk_get(&pdev->dev, NULL);
	dev->clk = clk_get(&pdev->dev, pdata->clk_name);
	if (IS_ERR(dev->clk)) {
		ret = -ENODEV;
		goto err_free_mem;
@@ -510,18 +534,37 @@ static int davinci_i2s_probe(struct platform_device *pdev,
	clk_enable(dev->clk);

	dev->base = (void __iomem *)IO_ADDRESS(mem->start);
	pdata = pdev->dev.platform_data;

	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK] = &davinci_i2s_pcm_out;
	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->channel = pdata->tx_dma_ch;
	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->dma_addr =
	    (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG);

	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE] = &davinci_i2s_pcm_in;
	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->channel = pdata->rx_dma_ch;
	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->dma_addr =
	    (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG);

	/* first TX, then RX */
	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
	if (!res) {
		dev_err(&pdev->dev, "no DMA resource\n");
		ret = -ENXIO;
		goto err_free_mem;
	}
	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->channel = res->start;

	res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
	if (!res) {
		dev_err(&pdev->dev, "no DMA resource\n");
		ret = -ENXIO;
		goto err_free_mem;
	}
	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->channel = res->start;

	davinci_i2s_dai.private_data = dev;
	ret = snd_soc_register_dai(&davinci_i2s_dai);
	if (ret != 0)
		goto err_free_mem;

	return 0;

err_free_mem:
@@ -532,64 +575,40 @@ static int davinci_i2s_probe(struct platform_device *pdev,
	return ret;
}

static void davinci_i2s_remove(struct platform_device *pdev,
			       struct snd_soc_dai *dai)
static int davinci_i2s_remove(struct platform_device *pdev)
{
	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
	struct snd_soc_card *card = socdev->card;
	struct snd_soc_dai *cpu_dai = card->dai_link->cpu_dai;
	struct davinci_mcbsp_dev *dev = cpu_dai->private_data;
	struct davinci_mcbsp_dev *dev = davinci_i2s_dai.private_data;
	struct resource *mem;

	snd_soc_unregister_dai(&davinci_i2s_dai);
	clk_disable(dev->clk);
	clk_put(dev->clk);
	dev->clk = NULL;

	kfree(dev);

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	release_mem_region(mem->start, (mem->end - mem->start) + 1);
}

#define DAVINCI_I2S_RATES	SNDRV_PCM_RATE_8000_96000

static struct snd_soc_dai_ops davinci_i2s_dai_ops = {
	.startup	= davinci_i2s_startup,
	.shutdown	= davinci_i2s_shutdown,
	.prepare	= davinci_i2s_prepare,
	.trigger	= davinci_i2s_trigger,
	.hw_params	= davinci_i2s_hw_params,
	.set_fmt	= davinci_i2s_set_dai_fmt,
};
	return 0;
}

struct snd_soc_dai davinci_i2s_dai = {
	.name = "davinci-i2s",
	.id = 0,
static struct platform_driver davinci_mcbsp_driver = {
	.probe		= davinci_i2s_probe,
	.remove		= davinci_i2s_remove,
	.playback = {
		.channels_min = 2,
		.channels_max = 2,
		.rates = DAVINCI_I2S_RATES,
		.formats = SNDRV_PCM_FMTBIT_S16_LE,},
	.capture = {
		.channels_min = 2,
		.channels_max = 2,
		.rates = DAVINCI_I2S_RATES,
		.formats = SNDRV_PCM_FMTBIT_S16_LE,},
	.ops = &davinci_i2s_dai_ops,
	.driver		= {
		.name	= "davinci-asp",
		.owner	= THIS_MODULE,
	},
};
EXPORT_SYMBOL_GPL(davinci_i2s_dai);

static int __init davinci_i2s_init(void)
{
	return snd_soc_register_dai(&davinci_i2s_dai);
	return platform_driver_register(&davinci_mcbsp_driver);
}
module_init(davinci_i2s_init);

static void __exit davinci_i2s_exit(void)
{
	snd_soc_unregister_dai(&davinci_i2s_dai);
	platform_driver_unregister(&davinci_mcbsp_driver);
}
module_exit(davinci_i2s_exit);

Loading