Skip to content

Commit

Permalink
ALSA: ASoC: Add WM8753 SPI support
Browse files Browse the repository at this point in the history
Implement SPI support for WM8753, 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>
  • Loading branch information
Mark Brown authored and Takashi Iwai committed Oct 13, 2008
1 parent df91ddf commit dd0c0c8
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 2 deletions.
71 changes: 69 additions & 2 deletions sound/soc/codecs/wm8753.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,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>
Expand Down Expand Up @@ -1719,6 +1720,63 @@ static int wm8753_add_i2c_device(struct platform_device *pdev,
}
#endif

#if defined(CONFIG_SPI_MASTER)
static int __devinit wm8753_spi_probe(struct spi_device *spi)
{
struct snd_soc_device *socdev = wm8753_socdev;
struct snd_soc_codec *codec = socdev->codec;
int ret;

codec->control_data = spi;

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

return ret;
}

static int __devexit wm8753_spi_remove(struct spi_device *spi)
{
return 0;
}

static struct spi_driver wm8753_spi_driver = {
.driver = {
.name = "wm8753",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
.probe = wm8753_spi_probe,
.remove = __devexit_p(wm8753_spi_remove),
};

static int wm8753_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


static int wm8753_probe(struct platform_device *pdev)
{
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
Expand Down Expand Up @@ -1753,8 +1811,14 @@ static int wm8753_probe(struct platform_device *pdev)
codec->hw_write = (hw_write_t)i2c_master_send;
ret = wm8753_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)wm8753_spi_write;
ret = spi_register_driver(&wm8753_spi_driver);
if (ret != 0)
printk(KERN_ERR "can't add spi driver");
}
#endif

if (ret != 0) {
Expand Down Expand Up @@ -1797,6 +1861,9 @@ static int wm8753_remove(struct platform_device *pdev)
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_unregister_device(codec->control_data);
i2c_del_driver(&wm8753_i2c_driver);
#endif
#if defined(CONFIG_SPI_MASTER)
spi_unregister_driver(&wm8753_spi_driver);
#endif
kfree(codec->private_data);
kfree(codec);
Expand Down
1 change: 1 addition & 0 deletions sound/soc/codecs/wm8753.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
#define WM8753_ADCTL2 0x3f

struct wm8753_setup_data {
int spi;
int i2c_bus;
unsigned short i2c_address;
};
Expand Down

0 comments on commit dd0c0c8

Please sign in to comment.