diff options
Diffstat (limited to 'sound/soc/codecs/wm8750.c')
-rw-r--r-- | sound/soc/codecs/wm8750.c | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/sound/soc/codecs/wm8750.c b/sound/soc/codecs/wm8750.c index 9847aa064d6b..4892e398a598 100644 --- a/sound/soc/codecs/wm8750.c +++ b/sound/soc/codecs/wm8750.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/pm.h> | 19 | #include <linux/pm.h> |
20 | #include <linux/i2c.h> | 20 | #include <linux/i2c.h> |
21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
22 | #include <linux/spi/spi.h> | ||
22 | #include <sound/core.h> | 23 | #include <sound/core.h> |
23 | #include <sound/pcm.h> | 24 | #include <sound/pcm.h> |
24 | #include <sound/pcm_params.h> | 25 | #include <sound/pcm_params.h> |
@@ -841,7 +842,7 @@ static struct snd_soc_device *wm8750_socdev; | |||
841 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) | 842 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) |
842 | 843 | ||
843 | /* | 844 | /* |
844 | * WM8731 2 wire address is determined by GPIO5 | 845 | * WM8750 2 wire address is determined by GPIO5 |
845 | * state during powerup. | 846 | * state during powerup. |
846 | * low = 0x1a | 847 | * low = 0x1a |
847 | * high = 0x1b | 848 | * high = 0x1b |
@@ -928,6 +929,62 @@ err_driver: | |||
928 | } | 929 | } |
929 | #endif | 930 | #endif |
930 | 931 | ||
932 | #if defined(CONFIG_SPI_MASTER) | ||
933 | static int __devinit wm8750_spi_probe(struct spi_device *spi) | ||
934 | { | ||
935 | struct snd_soc_device *socdev = wm8750_socdev; | ||
936 | struct snd_soc_codec *codec = socdev->codec; | ||
937 | int ret; | ||
938 | |||
939 | codec->control_data = spi; | ||
940 | |||
941 | ret = wm8750_init(socdev); | ||
942 | if (ret < 0) | ||
943 | dev_err(&spi->dev, "failed to initialise WM8750\n"); | ||
944 | |||
945 | return ret; | ||
946 | } | ||
947 | |||
948 | static int __devexit wm8750_spi_remove(struct spi_device *spi) | ||
949 | { | ||
950 | return 0; | ||
951 | } | ||
952 | |||
953 | static struct spi_driver wm8750_spi_driver = { | ||
954 | .driver = { | ||
955 | .name = "wm8750", | ||
956 | .bus = &spi_bus_type, | ||
957 | .owner = THIS_MODULE, | ||
958 | }, | ||
959 | .probe = wm8750_spi_probe, | ||
960 | .remove = __devexit_p(wm8750_spi_remove), | ||
961 | }; | ||
962 | |||
963 | static int wm8750_spi_write(struct spi_device *spi, const char *data, int len) | ||
964 | { | ||
965 | struct spi_transfer t; | ||
966 | struct spi_message m; | ||
967 | u8 msg[2]; | ||
968 | |||
969 | if (len <= 0) | ||
970 | return 0; | ||
971 | |||
972 | msg[0] = data[0]; | ||
973 | msg[1] = data[1]; | ||
974 | |||
975 | spi_message_init(&m); | ||
976 | memset(&t, 0, (sizeof t)); | ||
977 | |||
978 | t.tx_buf = &msg[0]; | ||
979 | t.len = len; | ||
980 | |||
981 | spi_message_add_tail(&t, &m); | ||
982 | spi_sync(spi, &m); | ||
983 | |||
984 | return len; | ||
985 | } | ||
986 | #endif | ||
987 | |||
931 | static int wm8750_probe(struct platform_device *pdev) | 988 | static int wm8750_probe(struct platform_device *pdev) |
932 | { | 989 | { |
933 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | 990 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); |
@@ -963,6 +1020,14 @@ static int wm8750_probe(struct platform_device *pdev) | |||
963 | ret = wm8750_add_i2c_device(pdev, setup); | 1020 | ret = wm8750_add_i2c_device(pdev, setup); |
964 | } | 1021 | } |
965 | #endif | 1022 | #endif |
1023 | #if defined(CONFIG_SPI_MASTER) | ||
1024 | if (setup->spi) { | ||
1025 | codec->hw_write = (hw_write_t)wm8750_spi_write; | ||
1026 | ret = spi_register_driver(&wm8750_spi_driver); | ||
1027 | if (ret != 0) | ||
1028 | printk(KERN_ERR "can't add spi driver"); | ||
1029 | } | ||
1030 | #endif | ||
966 | 1031 | ||
967 | if (ret != 0) { | 1032 | if (ret != 0) { |
968 | kfree(codec->private_data); | 1033 | kfree(codec->private_data); |
@@ -1005,6 +1070,9 @@ static int wm8750_remove(struct platform_device *pdev) | |||
1005 | i2c_unregister_device(codec->control_data); | 1070 | i2c_unregister_device(codec->control_data); |
1006 | i2c_del_driver(&wm8750_i2c_driver); | 1071 | i2c_del_driver(&wm8750_i2c_driver); |
1007 | #endif | 1072 | #endif |
1073 | #if defined(CONFIG_SPI_MASTER) | ||
1074 | spi_unregister_driver(&wm8750_spi_driver); | ||
1075 | #endif | ||
1008 | kfree(codec->private_data); | 1076 | kfree(codec->private_data); |
1009 | kfree(codec); | 1077 | kfree(codec); |
1010 | 1078 | ||