aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/wm8753.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/wm8753.c')
-rw-r--r--sound/soc/codecs/wm8753.c71
1 files changed, 69 insertions, 2 deletions
diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c
index 8c4df44f3345..83ba4199c9c3 100644
--- a/sound/soc/codecs/wm8753.c
+++ b/sound/soc/codecs/wm8753.c
@@ -40,6 +40,7 @@
40#include <linux/pm.h> 40#include <linux/pm.h>
41#include <linux/i2c.h> 41#include <linux/i2c.h>
42#include <linux/platform_device.h> 42#include <linux/platform_device.h>
43#include <linux/spi/spi.h>
43#include <sound/core.h> 44#include <sound/core.h>
44#include <sound/pcm.h> 45#include <sound/pcm.h>
45#include <sound/pcm_params.h> 46#include <sound/pcm_params.h>
@@ -1719,6 +1720,63 @@ err_driver:
1719} 1720}
1720#endif 1721#endif
1721 1722
1723#if defined(CONFIG_SPI_MASTER)
1724static int __devinit wm8753_spi_probe(struct spi_device *spi)
1725{
1726 struct snd_soc_device *socdev = wm8753_socdev;
1727 struct snd_soc_codec *codec = socdev->codec;
1728 int ret;
1729
1730 codec->control_data = spi;
1731
1732 ret = wm8753_init(socdev);
1733 if (ret < 0)
1734 dev_err(&spi->dev, "failed to initialise WM8753\n");
1735
1736 return ret;
1737}
1738
1739static int __devexit wm8753_spi_remove(struct spi_device *spi)
1740{
1741 return 0;
1742}
1743
1744static struct spi_driver wm8753_spi_driver = {
1745 .driver = {
1746 .name = "wm8753",
1747 .bus = &spi_bus_type,
1748 .owner = THIS_MODULE,
1749 },
1750 .probe = wm8753_spi_probe,
1751 .remove = __devexit_p(wm8753_spi_remove),
1752};
1753
1754static int wm8753_spi_write(struct spi_device *spi, const char *data, int len)
1755{
1756 struct spi_transfer t;
1757 struct spi_message m;
1758 u8 msg[2];
1759
1760 if (len <= 0)
1761 return 0;
1762
1763 msg[0] = data[0];
1764 msg[1] = data[1];
1765
1766 spi_message_init(&m);
1767 memset(&t, 0, (sizeof t));
1768
1769 t.tx_buf = &msg[0];
1770 t.len = len;
1771
1772 spi_message_add_tail(&t, &m);
1773 spi_sync(spi, &m);
1774
1775 return len;
1776}
1777#endif
1778
1779
1722static int wm8753_probe(struct platform_device *pdev) 1780static int wm8753_probe(struct platform_device *pdev)
1723{ 1781{
1724 struct snd_soc_device *socdev = platform_get_drvdata(pdev); 1782 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
@@ -1753,8 +1811,14 @@ static int wm8753_probe(struct platform_device *pdev)
1753 codec->hw_write = (hw_write_t)i2c_master_send; 1811 codec->hw_write = (hw_write_t)i2c_master_send;
1754 ret = wm8753_add_i2c_device(pdev, setup); 1812 ret = wm8753_add_i2c_device(pdev, setup);
1755 } 1813 }
1756#else 1814#endif
1757 /* Add other interfaces here */ 1815#if defined(CONFIG_SPI_MASTER)
1816 if (setup->spi) {
1817 codec->hw_write = (hw_write_t)wm8753_spi_write;
1818 ret = spi_register_driver(&wm8753_spi_driver);
1819 if (ret != 0)
1820 printk(KERN_ERR "can't add spi driver");
1821 }
1758#endif 1822#endif
1759 1823
1760 if (ret != 0) { 1824 if (ret != 0) {
@@ -1798,6 +1862,9 @@ static int wm8753_remove(struct platform_device *pdev)
1798 i2c_unregister_device(codec->control_data); 1862 i2c_unregister_device(codec->control_data);
1799 i2c_del_driver(&wm8753_i2c_driver); 1863 i2c_del_driver(&wm8753_i2c_driver);
1800#endif 1864#endif
1865#if defined(CONFIG_SPI_MASTER)
1866 spi_unregister_driver(&wm8753_spi_driver);
1867#endif
1801 kfree(codec->private_data); 1868 kfree(codec->private_data);
1802 kfree(codec); 1869 kfree(codec);
1803 1870