提交 7084a42b 编写于 作者: M Mark Brown

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: NMark Brown <broonie@opensource.wolfsonmicro.com>
上级 030c819e
...@@ -187,13 +187,20 @@ typedef int (*hw_read_t)(void *,char* ,int); ...@@ -187,13 +187,20 @@ typedef int (*hw_read_t)(void *,char* ,int);
extern struct snd_ac97_bus_ops soc_ac97_ops; 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); int snd_soc_register_platform(struct snd_soc_platform *platform);
void snd_soc_unregister_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); int snd_soc_register_codec(struct snd_soc_codec *codec);
void snd_soc_unregister_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_volatile_register(struct snd_soc_codec *codec, int reg);
int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, 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 #ifdef CONFIG_PM
int snd_soc_suspend_device(struct device *dev); int snd_soc_suspend_device(struct device *dev);
......
...@@ -564,7 +564,8 @@ static int wm8510_resume(struct platform_device *pdev) ...@@ -564,7 +564,8 @@ static int wm8510_resume(struct platform_device *pdev)
* initialise the WM8510 driver * initialise the WM8510 driver
* register the mixer and dsp interfaces with the kernel * 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; struct snd_soc_codec *codec = socdev->card->codec;
int ret = 0; int ret = 0;
...@@ -580,7 +581,7 @@ static int wm8510_init(struct snd_soc_device *socdev) ...@@ -580,7 +581,7 @@ static int wm8510_init(struct snd_soc_device *socdev)
if (codec->reg_cache == NULL) if (codec->reg_cache == NULL)
return -ENOMEM; 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) { if (ret < 0) {
printk(KERN_ERR "wm8510: failed to set cache I/O: %d\n", printk(KERN_ERR "wm8510: failed to set cache I/O: %d\n",
ret); ret);
...@@ -635,7 +636,7 @@ static int wm8510_i2c_probe(struct i2c_client *i2c, ...@@ -635,7 +636,7 @@ static int wm8510_i2c_probe(struct i2c_client *i2c,
i2c_set_clientdata(i2c, codec); i2c_set_clientdata(i2c, codec);
codec->control_data = i2c; codec->control_data = i2c;
ret = wm8510_init(socdev); ret = wm8510_init(socdev, SND_SOC_I2C);
if (ret < 0) if (ret < 0)
pr_err("failed to initialise WM8510\n"); pr_err("failed to initialise WM8510\n");
...@@ -715,7 +716,7 @@ static int __devinit wm8510_spi_probe(struct spi_device *spi) ...@@ -715,7 +716,7 @@ static int __devinit wm8510_spi_probe(struct spi_device *spi)
codec->control_data = spi; codec->control_data = spi;
ret = wm8510_init(socdev); ret = wm8510_init(socdev, SND_SOC_SPI);
if (ret < 0) if (ret < 0)
dev_err(&spi->dev, "failed to initialise WM8510\n"); dev_err(&spi->dev, "failed to initialise WM8510\n");
...@@ -784,7 +785,6 @@ static int wm8510_probe(struct platform_device *pdev) ...@@ -784,7 +785,6 @@ static int wm8510_probe(struct platform_device *pdev)
wm8510_socdev = socdev; wm8510_socdev = socdev;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
if (setup->i2c_address) { if (setup->i2c_address) {
codec->hw_write = (hw_write_t)i2c_master_send;
ret = wm8510_add_i2c_device(pdev, setup); ret = wm8510_add_i2c_device(pdev, setup);
} }
#endif #endif
......
...@@ -832,7 +832,8 @@ struct snd_soc_codec_device soc_codec_dev_wm8580 = { ...@@ -832,7 +832,8 @@ struct snd_soc_codec_device soc_codec_dev_wm8580 = {
}; };
EXPORT_SYMBOL_GPL(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; int ret, i;
struct snd_soc_codec *codec = &wm8580->codec; struct snd_soc_codec *codec = &wm8580->codec;
...@@ -859,7 +860,7 @@ static int wm8580_register(struct wm8580_priv *wm8580) ...@@ -859,7 +860,7 @@ static int wm8580_register(struct wm8580_priv *wm8580)
memcpy(codec->reg_cache, wm8580_reg, sizeof(wm8580_reg)); 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) { if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
goto err; goto err;
...@@ -944,14 +945,13 @@ static int wm8580_i2c_probe(struct i2c_client *i2c, ...@@ -944,14 +945,13 @@ static int wm8580_i2c_probe(struct i2c_client *i2c,
return -ENOMEM; return -ENOMEM;
codec = &wm8580->codec; codec = &wm8580->codec;
codec->hw_write = (hw_write_t)i2c_master_send;
i2c_set_clientdata(i2c, wm8580); i2c_set_clientdata(i2c, wm8580);
codec->control_data = i2c; codec->control_data = i2c;
codec->dev = &i2c->dev; codec->dev = &i2c->dev;
return wm8580_register(wm8580); return wm8580_register(wm8580, SND_SOC_I2C);
} }
static int wm8580_i2c_remove(struct i2c_client *client) static int wm8580_i2c_remove(struct i2c_client *client)
......
...@@ -248,7 +248,8 @@ static int wm8728_resume(struct platform_device *pdev) ...@@ -248,7 +248,8 @@ static int wm8728_resume(struct platform_device *pdev)
* initialise the WM8728 driver * initialise the WM8728 driver
* register the mixer and dsp interfaces with the kernel * 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; struct snd_soc_codec *codec = socdev->card->codec;
int ret = 0; int ret = 0;
...@@ -266,7 +267,7 @@ static int wm8728_init(struct snd_soc_device *socdev) ...@@ -266,7 +267,7 @@ static int wm8728_init(struct snd_soc_device *socdev)
if (codec->reg_cache == NULL) if (codec->reg_cache == NULL)
return -ENOMEM; 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) { if (ret < 0) {
printk(KERN_ERR "wm8728: failed to configure cache I/O: %d\n", printk(KERN_ERR "wm8728: failed to configure cache I/O: %d\n",
ret); ret);
...@@ -323,7 +324,7 @@ static int wm8728_i2c_probe(struct i2c_client *i2c, ...@@ -323,7 +324,7 @@ static int wm8728_i2c_probe(struct i2c_client *i2c,
i2c_set_clientdata(i2c, codec); i2c_set_clientdata(i2c, codec);
codec->control_data = i2c; codec->control_data = i2c;
ret = wm8728_init(socdev); ret = wm8728_init(socdev, SND_SOC_I2C);
if (ret < 0) if (ret < 0)
pr_err("failed to initialise WM8728\n"); pr_err("failed to initialise WM8728\n");
...@@ -403,7 +404,7 @@ static int __devinit wm8728_spi_probe(struct spi_device *spi) ...@@ -403,7 +404,7 @@ static int __devinit wm8728_spi_probe(struct spi_device *spi)
codec->control_data = spi; codec->control_data = spi;
ret = wm8728_init(socdev); ret = wm8728_init(socdev, SND_SOC_SPI);
if (ret < 0) if (ret < 0)
dev_err(&spi->dev, "failed to initialise WM8728\n"); dev_err(&spi->dev, "failed to initialise WM8728\n");
...@@ -472,7 +473,6 @@ static int wm8728_probe(struct platform_device *pdev) ...@@ -472,7 +473,6 @@ static int wm8728_probe(struct platform_device *pdev)
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
if (setup->i2c_address) { if (setup->i2c_address) {
codec->hw_write = (hw_write_t)i2c_master_send;
ret = wm8728_add_i2c_device(pdev, setup); ret = wm8728_add_i2c_device(pdev, setup);
} }
#endif #endif
......
...@@ -504,7 +504,8 @@ struct snd_soc_codec_device soc_codec_dev_wm8731 = { ...@@ -504,7 +504,8 @@ struct snd_soc_codec_device soc_codec_dev_wm8731 = {
}; };
EXPORT_SYMBOL_GPL(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; int ret;
struct snd_soc_codec *codec = &wm8731->codec; struct snd_soc_codec *codec = &wm8731->codec;
...@@ -531,7 +532,7 @@ static int wm8731_register(struct wm8731_priv *wm8731) ...@@ -531,7 +532,7 @@ static int wm8731_register(struct wm8731_priv *wm8731)
memcpy(codec->reg_cache, wm8731_reg, sizeof(wm8731_reg)); 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) { if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
goto err; goto err;
...@@ -630,7 +631,7 @@ static int __devinit wm8731_spi_probe(struct spi_device *spi) ...@@ -630,7 +631,7 @@ static int __devinit wm8731_spi_probe(struct spi_device *spi)
dev_set_drvdata(&spi->dev, wm8731); 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) static int __devexit wm8731_spi_remove(struct spi_device *spi)
...@@ -682,14 +683,13 @@ static __devinit int wm8731_i2c_probe(struct i2c_client *i2c, ...@@ -682,14 +683,13 @@ static __devinit int wm8731_i2c_probe(struct i2c_client *i2c,
return -ENOMEM; return -ENOMEM;
codec = &wm8731->codec; codec = &wm8731->codec;
codec->hw_write = (hw_write_t)i2c_master_send;
i2c_set_clientdata(i2c, wm8731); i2c_set_clientdata(i2c, wm8731);
codec->control_data = i2c; codec->control_data = i2c;
codec->dev = &i2c->dev; 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) static __devexit int wm8731_i2c_remove(struct i2c_client *client)
......
...@@ -711,7 +711,8 @@ static int wm8750_resume(struct platform_device *pdev) ...@@ -711,7 +711,8 @@ static int wm8750_resume(struct platform_device *pdev)
* initialise the WM8750 driver * initialise the WM8750 driver
* register the mixer and dsp interfaces with the kernel * register the mixer and dsp interfaces with the kernel
*/ */
static int wm8750_init(struct snd_soc_device *socdev) static int wm8750_init(struct snd_soc_device *socdev,
enum snd_soc_control_type control)
{ {
struct snd_soc_codec *codec = socdev->card->codec; struct snd_soc_codec *codec = socdev->card->codec;
int reg, ret = 0; int reg, ret = 0;
...@@ -726,7 +727,7 @@ static int wm8750_init(struct snd_soc_device *socdev) ...@@ -726,7 +727,7 @@ static int wm8750_init(struct snd_soc_device *socdev)
if (codec->reg_cache == NULL) if (codec->reg_cache == NULL)
return -ENOMEM; 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) { if (ret < 0) {
printk(KERN_ERR "wm8750: failed to set cache I/O: %d\n", ret); printk(KERN_ERR "wm8750: failed to set cache I/O: %d\n", ret);
goto err; goto err;
...@@ -809,7 +810,7 @@ static int wm8750_i2c_probe(struct i2c_client *i2c, ...@@ -809,7 +810,7 @@ static int wm8750_i2c_probe(struct i2c_client *i2c,
i2c_set_clientdata(i2c, codec); i2c_set_clientdata(i2c, codec);
codec->control_data = i2c; codec->control_data = i2c;
ret = wm8750_init(socdev); ret = wm8750_init(socdev, SND_SOC_I2C);
if (ret < 0) if (ret < 0)
pr_err("failed to initialise WM8750\n"); pr_err("failed to initialise WM8750\n");
...@@ -889,7 +890,7 @@ static int __devinit wm8750_spi_probe(struct spi_device *spi) ...@@ -889,7 +890,7 @@ static int __devinit wm8750_spi_probe(struct spi_device *spi)
codec->control_data = spi; codec->control_data = spi;
ret = wm8750_init(socdev); ret = wm8750_init(socdev, SND_SOC_SPI);
if (ret < 0) if (ret < 0)
dev_err(&spi->dev, "failed to initialise WM8750\n"); dev_err(&spi->dev, "failed to initialise WM8750\n");
...@@ -967,7 +968,6 @@ static int wm8750_probe(struct platform_device *pdev) ...@@ -967,7 +968,6 @@ static int wm8750_probe(struct platform_device *pdev)
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
if (setup->i2c_address) { if (setup->i2c_address) {
codec->hw_write = (hw_write_t)i2c_master_send;
ret = wm8750_add_i2c_device(pdev, setup); ret = wm8750_add_i2c_device(pdev, setup);
} }
#endif #endif
......
...@@ -747,7 +747,8 @@ struct snd_soc_codec_device soc_codec_dev_wm8960 = { ...@@ -747,7 +747,8 @@ struct snd_soc_codec_device soc_codec_dev_wm8960 = {
}; };
EXPORT_SYMBOL_GPL(soc_codec_dev_wm8960); EXPORT_SYMBOL_GPL(soc_codec_dev_wm8960);
static int wm8960_register(struct wm8960_priv *wm8960) static int wm8960_register(struct wm8960_priv *wm8960,
enum snd_soc_control_type control)
{ {
struct wm8960_data *pdata = wm8960->codec.dev->platform_data; struct wm8960_data *pdata = wm8960->codec.dev->platform_data;
struct snd_soc_codec *codec = &wm8960->codec; struct snd_soc_codec *codec = &wm8960->codec;
...@@ -785,7 +786,7 @@ static int wm8960_register(struct wm8960_priv *wm8960) ...@@ -785,7 +786,7 @@ static int wm8960_register(struct wm8960_priv *wm8960)
memcpy(codec->reg_cache, wm8960_reg, sizeof(wm8960_reg)); memcpy(codec->reg_cache, wm8960_reg, sizeof(wm8960_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) { if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
goto err; goto err;
...@@ -866,14 +867,13 @@ static __devinit int wm8960_i2c_probe(struct i2c_client *i2c, ...@@ -866,14 +867,13 @@ static __devinit int wm8960_i2c_probe(struct i2c_client *i2c,
return -ENOMEM; return -ENOMEM;
codec = &wm8960->codec; codec = &wm8960->codec;
codec->hw_write = (hw_write_t)i2c_master_send;
i2c_set_clientdata(i2c, wm8960); i2c_set_clientdata(i2c, wm8960);
codec->control_data = i2c; codec->control_data = i2c;
codec->dev = &i2c->dev; codec->dev = &i2c->dev;
return wm8960_register(wm8960); return wm8960_register(wm8960, SND_SOC_I2C);
} }
static __devexit int wm8960_i2c_remove(struct i2c_client *client) static __devexit int wm8960_i2c_remove(struct i2c_client *client)
......
...@@ -640,7 +640,8 @@ static int wm8971_resume(struct platform_device *pdev) ...@@ -640,7 +640,8 @@ static int wm8971_resume(struct platform_device *pdev)
return 0; return 0;
} }
static int wm8971_init(struct snd_soc_device *socdev) static int wm8971_init(struct snd_soc_device *socdev,
enum snd_soc_control_type control)
{ {
struct snd_soc_codec *codec = socdev->card->codec; struct snd_soc_codec *codec = socdev->card->codec;
int reg, ret = 0; int reg, ret = 0;
...@@ -656,7 +657,7 @@ static int wm8971_init(struct snd_soc_device *socdev) ...@@ -656,7 +657,7 @@ static int wm8971_init(struct snd_soc_device *socdev)
if (codec->reg_cache == NULL) if (codec->reg_cache == NULL)
return -ENOMEM; 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) { if (ret < 0) {
printk(KERN_ERR "wm8971: failed to set cache I/O: %d\n", ret); printk(KERN_ERR "wm8971: failed to set cache I/O: %d\n", ret);
goto err; goto err;
...@@ -734,7 +735,7 @@ static int wm8971_i2c_probe(struct i2c_client *i2c, ...@@ -734,7 +735,7 @@ static int wm8971_i2c_probe(struct i2c_client *i2c,
codec->control_data = i2c; codec->control_data = i2c;
ret = wm8971_init(socdev); ret = wm8971_init(socdev, SND_SOC_I2C);
if (ret < 0) if (ret < 0)
pr_err("failed to initialise WM8971\n"); pr_err("failed to initialise WM8971\n");
...@@ -844,7 +845,6 @@ static int wm8971_probe(struct platform_device *pdev) ...@@ -844,7 +845,6 @@ static int wm8971_probe(struct platform_device *pdev)
#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE) #if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
if (setup->i2c_address) { if (setup->i2c_address) {
codec->hw_write = (hw_write_t)i2c_master_send;
ret = wm8971_add_i2c_device(pdev, setup); ret = wm8971_add_i2c_device(pdev, setup);
} }
#endif #endif
......
...@@ -825,7 +825,8 @@ struct snd_soc_codec_device soc_codec_dev_wm8988 = { ...@@ -825,7 +825,8 @@ struct snd_soc_codec_device soc_codec_dev_wm8988 = {
}; };
EXPORT_SYMBOL_GPL(soc_codec_dev_wm8988); EXPORT_SYMBOL_GPL(soc_codec_dev_wm8988);
static int wm8988_register(struct wm8988_priv *wm8988) static int wm8988_register(struct wm8988_priv *wm8988,
enum snd_soc_control_type control)
{ {
struct snd_soc_codec *codec = &wm8988->codec; struct snd_soc_codec *codec = &wm8988->codec;
int ret; int ret;
...@@ -854,7 +855,7 @@ static int wm8988_register(struct wm8988_priv *wm8988) ...@@ -854,7 +855,7 @@ static int wm8988_register(struct wm8988_priv *wm8988)
memcpy(codec->reg_cache, wm8988_reg, memcpy(codec->reg_cache, wm8988_reg,
sizeof(wm8988_reg)); sizeof(wm8988_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) { if (ret < 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
goto err; goto err;
...@@ -927,14 +928,13 @@ static int wm8988_i2c_probe(struct i2c_client *i2c, ...@@ -927,14 +928,13 @@ static int wm8988_i2c_probe(struct i2c_client *i2c,
return -ENOMEM; return -ENOMEM;
codec = &wm8988->codec; codec = &wm8988->codec;
codec->hw_write = (hw_write_t)i2c_master_send;
i2c_set_clientdata(i2c, wm8988); i2c_set_clientdata(i2c, wm8988);
codec->control_data = i2c; codec->control_data = i2c;
codec->dev = &i2c->dev; codec->dev = &i2c->dev;
return wm8988_register(wm8988); return wm8988_register(wm8988, SND_SOC_I2C);
} }
static int wm8988_i2c_remove(struct i2c_client *client) static int wm8988_i2c_remove(struct i2c_client *client)
...@@ -1019,7 +1019,7 @@ static int __devinit wm8988_spi_probe(struct spi_device *spi) ...@@ -1019,7 +1019,7 @@ static int __devinit wm8988_spi_probe(struct spi_device *spi)
spi->dev.driver_data = wm8988; spi->dev.driver_data = wm8988;
return wm8988_register(wm8988); return wm8988_register(wm8988, SND_SOC_SPI);
} }
static int __devexit wm8988_spi_remove(struct spi_device *spi) static int __devexit wm8988_spi_remove(struct spi_device *spi)
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
* option) any later version. * option) any later version.
*/ */
#include <linux/i2c.h>
#include <sound/soc.h> #include <sound/soc.h>
static unsigned int snd_soc_7_9_read(struct snd_soc_codec *codec, static unsigned int snd_soc_7_9_read(struct snd_soc_codec *codec,
...@@ -62,6 +63,7 @@ static struct { ...@@ -62,6 +63,7 @@ static struct {
* @type: Type of cache. * @type: Type of cache.
* @addr_bits: Number of bits of register address data. * @addr_bits: Number of bits of register address data.
* @data_bits: Number of bits of data per register. * @data_bits: Number of bits of data per register.
* @control: Control bus used.
* *
* Register formats are frequently shared between many I2C and SPI * Register formats are frequently shared between many I2C and SPI
* devices. In order to promote code reuse the ASoC core provides * devices. In order to promote code reuse the ASoC core provides
...@@ -75,7 +77,8 @@ static struct { ...@@ -75,7 +77,8 @@ static struct {
* volatile registers. * volatile registers.
*/ */
int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, 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)
{ {
int i; int i;
...@@ -100,6 +103,20 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, ...@@ -100,6 +103,20 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
codec->write = io_types[i].write; codec->write = io_types[i].write;
codec->read = io_types[i].read; codec->read = io_types[i].read;
switch (control) {
case SND_SOC_CUSTOM:
break;
case SND_SOC_I2C:
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
codec->hw_write = (hw_write_t)i2c_master_send;
#endif
break;
case SND_SOC_SPI:
break;
}
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(snd_soc_codec_set_cache_io); EXPORT_SYMBOL_GPL(snd_soc_codec_set_cache_io);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册