diff options
| -rw-r--r-- | sound/soc/codecs/wm8753.c | 71 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8753.h | 1 |
2 files changed, 70 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) | ||
| 1724 | static 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 | |||
| 1739 | static int __devexit wm8753_spi_remove(struct spi_device *spi) | ||
| 1740 | { | ||
| 1741 | return 0; | ||
| 1742 | } | ||
| 1743 | |||
| 1744 | static 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 | |||
| 1754 | static 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 | |||
| 1722 | static int wm8753_probe(struct platform_device *pdev) | 1780 | static 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 | ||
diff --git a/sound/soc/codecs/wm8753.h b/sound/soc/codecs/wm8753.h index 7defde069f1d..6678379c0a29 100644 --- a/sound/soc/codecs/wm8753.h +++ b/sound/soc/codecs/wm8753.h | |||
| @@ -79,6 +79,7 @@ | |||
| 79 | #define WM8753_ADCTL2 0x3f | 79 | #define WM8753_ADCTL2 0x3f |
| 80 | 80 | ||
| 81 | struct wm8753_setup_data { | 81 | struct wm8753_setup_data { |
| 82 | int spi; | ||
| 82 | int i2c_bus; | 83 | int i2c_bus; |
| 83 | unsigned short i2c_address; | 84 | unsigned short i2c_address; |
| 84 | }; | 85 | }; |
