mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
ALSA: ASoC: Add WM8510 SPI support
Implement SPI support for WM8510, cut'n'pasting from the support for WM8731 contributed by Cliff Cai and Alan Horstmann since the wire format is the same for both codecs. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
dd0c0c805d
commit
5e357952b1
2 changed files with 69 additions and 2 deletions
|
@ -18,6 +18,7 @@
|
|||
#include <linux/pm.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
|
@ -747,6 +748,62 @@ err_driver:
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SPI_MASTER)
|
||||
static int __devinit wm8510_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
struct snd_soc_device *socdev = wm8510_socdev;
|
||||
struct snd_soc_codec *codec = socdev->codec;
|
||||
int ret;
|
||||
|
||||
codec->control_data = spi;
|
||||
|
||||
ret = wm8510_init(socdev);
|
||||
if (ret < 0)
|
||||
dev_err(&spi->dev, "failed to initialise WM8510\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit wm8510_spi_remove(struct spi_device *spi)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct spi_driver wm8510_spi_driver = {
|
||||
.driver = {
|
||||
.name = "wm8510",
|
||||
.bus = &spi_bus_type,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = wm8510_spi_probe,
|
||||
.remove = __devexit_p(wm8510_spi_remove),
|
||||
};
|
||||
|
||||
static int wm8510_spi_write(struct spi_device *spi, const char *data, int len)
|
||||
{
|
||||
struct spi_transfer t;
|
||||
struct spi_message m;
|
||||
u8 msg[2];
|
||||
|
||||
if (len <= 0)
|
||||
return 0;
|
||||
|
||||
msg[0] = data[0];
|
||||
msg[1] = data[1];
|
||||
|
||||
spi_message_init(&m);
|
||||
memset(&t, 0, (sizeof t));
|
||||
|
||||
t.tx_buf = &msg[0];
|
||||
t.len = len;
|
||||
|
||||
spi_message_add_tail(&t, &m);
|
||||
spi_sync(spi, &m);
|
||||
|
||||
return len;
|
||||
}
|
||||
#endif /* CONFIG_SPI_MASTER */
|
||||
|
||||
static int wm8510_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
|
||||
|
@ -772,8 +829,14 @@ static int wm8510_probe(struct platform_device *pdev)
|
|||
codec->hw_write = (hw_write_t)i2c_master_send;
|
||||
ret = wm8510_add_i2c_device(pdev, setup);
|
||||
}
|
||||
#else
|
||||
/* Add other interfaces here */
|
||||
#endif
|
||||
#if defined(CONFIG_SPI_MASTER)
|
||||
if (setup->spi) {
|
||||
codec->hw_write = (hw_write_t)wm8510_spi_write;
|
||||
ret = spi_register_driver(&wm8510_spi_driver);
|
||||
if (ret != 0)
|
||||
printk(KERN_ERR "can't add spi driver");
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ret != 0)
|
||||
|
@ -795,6 +858,9 @@ static int wm8510_remove(struct platform_device *pdev)
|
|||
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||
i2c_unregister_device(codec->control_data);
|
||||
i2c_del_driver(&wm8510_i2c_driver);
|
||||
#endif
|
||||
#if defined(CONFIG_SPI_MASTER)
|
||||
spi_unregister_driver(&wm8510_spi_driver);
|
||||
#endif
|
||||
kfree(codec);
|
||||
|
||||
|
|
|
@ -94,6 +94,7 @@
|
|||
#define WM8510_MCLKDIV_12 (7 << 5)
|
||||
|
||||
struct wm8510_setup_data {
|
||||
int spi;
|
||||
int i2c_bus;
|
||||
unsigned short i2c_address;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue