Commit 7084a42b authored by Mark Brown's avatar Mark Brown
Browse files

ASoC: Add I/O control bus information to factored out cache setup



While writes tend to be able to use a fairly bus independant format to
do the writes reads are all bus specific. To allow us to factor out
this code include the bus type as a parameter when setting up the
cache.

Initially just use this to factor out hw_write_t for I2C.

Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 030c819e
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -187,13 +187,20 @@ typedef int (*hw_read_t)(void *,char* ,int);

extern struct snd_ac97_bus_ops soc_ac97_ops;

enum snd_soc_control_type {
	SND_SOC_CUSTOM,
	SND_SOC_I2C,
	SND_SOC_SPI,
};

int snd_soc_register_platform(struct snd_soc_platform *platform);
void snd_soc_unregister_platform(struct snd_soc_platform *platform);
int snd_soc_register_codec(struct snd_soc_codec *codec);
void snd_soc_unregister_codec(struct snd_soc_codec *codec);
int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg);
int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
			       int addr_bits, int data_bits);
			       int addr_bits, int data_bits,
			       enum snd_soc_control_type control);

#ifdef CONFIG_PM
int snd_soc_suspend_device(struct device *dev);
+5 −5
Original line number Diff line number Diff line
@@ -564,7 +564,8 @@ static int wm8510_resume(struct platform_device *pdev)
 * initialise the WM8510 driver
 * register the mixer and dsp interfaces with the kernel
 */
static int wm8510_init(struct snd_soc_device *socdev)
static int wm8510_init(struct snd_soc_device *socdev,
		       enum snd_soc_control_type control)
{
	struct snd_soc_codec *codec = socdev->card->codec;
	int ret = 0;
@@ -580,7 +581,7 @@ static int wm8510_init(struct snd_soc_device *socdev)
	if (codec->reg_cache == NULL)
		return -ENOMEM;

	ret = snd_soc_codec_set_cache_io(codec, 7, 9);
	ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
	if (ret < 0) {
		printk(KERN_ERR "wm8510: failed to set cache I/O: %d\n",
		       ret);
@@ -635,7 +636,7 @@ static int wm8510_i2c_probe(struct i2c_client *i2c,
	i2c_set_clientdata(i2c, codec);
	codec->control_data = i2c;

	ret = wm8510_init(socdev);
	ret = wm8510_init(socdev, SND_SOC_I2C);
	if (ret < 0)
		pr_err("failed to initialise WM8510\n");

@@ -715,7 +716,7 @@ static int __devinit wm8510_spi_probe(struct spi_device *spi)

	codec->control_data = spi;

	ret = wm8510_init(socdev);
	ret = wm8510_init(socdev, SND_SOC_SPI);
	if (ret < 0)
		dev_err(&spi->dev, "failed to initialise WM8510\n");

@@ -784,7 +785,6 @@ static int wm8510_probe(struct platform_device *pdev)
	wm8510_socdev = socdev;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
	if (setup->i2c_address) {
		codec->hw_write = (hw_write_t)i2c_master_send;
		ret = wm8510_add_i2c_device(pdev, setup);
	}
#endif
+4 −4
Original line number Diff line number Diff line
@@ -832,7 +832,8 @@ struct snd_soc_codec_device soc_codec_dev_wm8580 = {
};
EXPORT_SYMBOL_GPL(soc_codec_dev_wm8580);

static int wm8580_register(struct wm8580_priv *wm8580)
static int wm8580_register(struct wm8580_priv *wm8580,
			   enum snd_soc_control_type control)
{
	int ret, i;
	struct snd_soc_codec *codec = &wm8580->codec;
@@ -859,7 +860,7 @@ static int wm8580_register(struct wm8580_priv *wm8580)

	memcpy(codec->reg_cache, wm8580_reg, sizeof(wm8580_reg));

	ret = snd_soc_codec_set_cache_io(codec, 7, 9);
	ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
	if (ret < 0) {
		dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
		goto err;
@@ -944,14 +945,13 @@ static int wm8580_i2c_probe(struct i2c_client *i2c,
		return -ENOMEM;

	codec = &wm8580->codec;
	codec->hw_write = (hw_write_t)i2c_master_send;

	i2c_set_clientdata(i2c, wm8580);
	codec->control_data = i2c;

	codec->dev = &i2c->dev;

	return wm8580_register(wm8580);
	return wm8580_register(wm8580, SND_SOC_I2C);
}

static int wm8580_i2c_remove(struct i2c_client *client)
+5 −5
Original line number Diff line number Diff line
@@ -248,7 +248,8 @@ static int wm8728_resume(struct platform_device *pdev)
 * initialise the WM8728 driver
 * register the mixer and dsp interfaces with the kernel
 */
static int wm8728_init(struct snd_soc_device *socdev)
static int wm8728_init(struct snd_soc_device *socdev,
		       enum snd_soc_control_type control)
{
	struct snd_soc_codec *codec = socdev->card->codec;
	int ret = 0;
@@ -266,7 +267,7 @@ static int wm8728_init(struct snd_soc_device *socdev)
	if (codec->reg_cache == NULL)
		return -ENOMEM;

	ret = snd_soc_codec_set_cache_io(codec, 7, 9);
	ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
	if (ret < 0) {
		printk(KERN_ERR "wm8728: failed to configure cache I/O: %d\n",
		       ret);
@@ -323,7 +324,7 @@ static int wm8728_i2c_probe(struct i2c_client *i2c,
	i2c_set_clientdata(i2c, codec);
	codec->control_data = i2c;

	ret = wm8728_init(socdev);
	ret = wm8728_init(socdev, SND_SOC_I2C);
	if (ret < 0)
		pr_err("failed to initialise WM8728\n");

@@ -403,7 +404,7 @@ static int __devinit wm8728_spi_probe(struct spi_device *spi)

	codec->control_data = spi;

	ret = wm8728_init(socdev);
	ret = wm8728_init(socdev, SND_SOC_SPI);
	if (ret < 0)
		dev_err(&spi->dev, "failed to initialise WM8728\n");

@@ -472,7 +473,6 @@ static int wm8728_probe(struct platform_device *pdev)

#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
	if (setup->i2c_address) {
		codec->hw_write = (hw_write_t)i2c_master_send;
		ret = wm8728_add_i2c_device(pdev, setup);
	}
#endif
+5 −5
Original line number Diff line number Diff line
@@ -504,7 +504,8 @@ struct snd_soc_codec_device soc_codec_dev_wm8731 = {
};
EXPORT_SYMBOL_GPL(soc_codec_dev_wm8731);

static int wm8731_register(struct wm8731_priv *wm8731)
static int wm8731_register(struct wm8731_priv *wm8731,
			   enum snd_soc_control_type control)
{
	int ret;
	struct snd_soc_codec *codec = &wm8731->codec;
@@ -531,7 +532,7 @@ static int wm8731_register(struct wm8731_priv *wm8731)

	memcpy(codec->reg_cache, wm8731_reg, sizeof(wm8731_reg));

	ret = snd_soc_codec_set_cache_io(codec, 7, 9);
	ret = snd_soc_codec_set_cache_io(codec, 7, 9, control);
	if (ret < 0) {
		dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
		goto err;
@@ -630,7 +631,7 @@ static int __devinit wm8731_spi_probe(struct spi_device *spi)

	dev_set_drvdata(&spi->dev, wm8731);

	return wm8731_register(wm8731);
	return wm8731_register(wm8731, SND_SOC_SPI);
}

static int __devexit wm8731_spi_remove(struct spi_device *spi)
@@ -682,14 +683,13 @@ static __devinit int wm8731_i2c_probe(struct i2c_client *i2c,
		return -ENOMEM;

	codec = &wm8731->codec;
	codec->hw_write = (hw_write_t)i2c_master_send;

	i2c_set_clientdata(i2c, wm8731);
	codec->control_data = i2c;

	codec->dev = &i2c->dev;

	return wm8731_register(wm8731);
	return wm8731_register(wm8731, SND_SOC_I2C);
}

static __devexit int wm8731_i2c_remove(struct i2c_client *client)
Loading