aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2009-07-10 18:28:16 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2009-08-03 11:59:16 -0400
commit27ded041f03026e8c6be9efc626e11ddfb4620c1 (patch)
treef8b156b2c31a97805c8341fd215648e989e12430 /sound/soc
parent8d50e447d19fec64adebeef55f2b60d695435412 (diff)
ASoC: Factor out 7 bit register 9 bit data SPI write
This converts all the Wolfson drivers using this format (the only devices that do) except WM8753 to use it. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/codecs/wm8510.c25
-rw-r--r--sound/soc/codecs/wm8728.c25
-rw-r--r--sound/soc/codecs/wm8731.c25
-rw-r--r--sound/soc/codecs/wm8750.c25
-rw-r--r--sound/soc/codecs/wm8988.c25
-rw-r--r--sound/soc/soc-cache.c39
6 files changed, 36 insertions, 128 deletions
diff --git a/sound/soc/codecs/wm8510.c b/sound/soc/codecs/wm8510.c
index 4ca724ff4c6e..bcd6a40171dc 100644
--- a/sound/soc/codecs/wm8510.c
+++ b/sound/soc/codecs/wm8510.c
@@ -737,30 +737,6 @@ static struct spi_driver wm8510_spi_driver = {
737 .probe = wm8510_spi_probe, 737 .probe = wm8510_spi_probe,
738 .remove = __devexit_p(wm8510_spi_remove), 738 .remove = __devexit_p(wm8510_spi_remove),
739}; 739};
740
741static int wm8510_spi_write(struct spi_device *spi, const char *data, int len)
742{
743 struct spi_transfer t;
744 struct spi_message m;
745 u8 msg[2];
746
747 if (len <= 0)
748 return 0;
749
750 msg[0] = data[0];
751 msg[1] = data[1];
752
753 spi_message_init(&m);
754 memset(&t, 0, (sizeof t));
755
756 t.tx_buf = &msg[0];
757 t.len = len;
758
759 spi_message_add_tail(&t, &m);
760 spi_sync(spi, &m);
761
762 return len;
763}
764#endif /* CONFIG_SPI_MASTER */ 740#endif /* CONFIG_SPI_MASTER */
765 741
766static int wm8510_probe(struct platform_device *pdev) 742static int wm8510_probe(struct platform_device *pdev)
@@ -790,7 +766,6 @@ static int wm8510_probe(struct platform_device *pdev)
790#endif 766#endif
791#if defined(CONFIG_SPI_MASTER) 767#if defined(CONFIG_SPI_MASTER)
792 if (setup->spi) { 768 if (setup->spi) {
793 codec->hw_write = (hw_write_t)wm8510_spi_write;
794 ret = spi_register_driver(&wm8510_spi_driver); 769 ret = spi_register_driver(&wm8510_spi_driver);
795 if (ret != 0) 770 if (ret != 0)
796 printk(KERN_ERR "can't add spi driver"); 771 printk(KERN_ERR "can't add spi driver");
diff --git a/sound/soc/codecs/wm8728.c b/sound/soc/codecs/wm8728.c
index a28630de9c91..16e969a762c3 100644
--- a/sound/soc/codecs/wm8728.c
+++ b/sound/soc/codecs/wm8728.c
@@ -425,30 +425,6 @@ static struct spi_driver wm8728_spi_driver = {
425 .probe = wm8728_spi_probe, 425 .probe = wm8728_spi_probe,
426 .remove = __devexit_p(wm8728_spi_remove), 426 .remove = __devexit_p(wm8728_spi_remove),
427}; 427};
428
429static int wm8728_spi_write(struct spi_device *spi, const char *data, int len)
430{
431 struct spi_transfer t;
432 struct spi_message m;
433 u8 msg[2];
434
435 if (len <= 0)
436 return 0;
437
438 msg[0] = data[0];
439 msg[1] = data[1];
440
441 spi_message_init(&m);
442 memset(&t, 0, (sizeof t));
443
444 t.tx_buf = &msg[0];
445 t.len = len;
446
447 spi_message_add_tail(&t, &m);
448 spi_sync(spi, &m);
449
450 return len;
451}
452#endif /* CONFIG_SPI_MASTER */ 428#endif /* CONFIG_SPI_MASTER */
453 429
454static int wm8728_probe(struct platform_device *pdev) 430static int wm8728_probe(struct platform_device *pdev)
@@ -478,7 +454,6 @@ static int wm8728_probe(struct platform_device *pdev)
478#endif 454#endif
479#if defined(CONFIG_SPI_MASTER) 455#if defined(CONFIG_SPI_MASTER)
480 if (setup->spi) { 456 if (setup->spi) {
481 codec->hw_write = (hw_write_t)wm8728_spi_write;
482 ret = spi_register_driver(&wm8728_spi_driver); 457 ret = spi_register_driver(&wm8728_spi_driver);
483 if (ret != 0) 458 if (ret != 0)
484 printk(KERN_ERR "can't add spi driver"); 459 printk(KERN_ERR "can't add spi driver");
diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c
index 27fc942a5ced..6232afd907ef 100644
--- a/sound/soc/codecs/wm8731.c
+++ b/sound/soc/codecs/wm8731.c
@@ -591,30 +591,6 @@ static void wm8731_unregister(struct wm8731_priv *wm8731)
591} 591}
592 592
593#if defined(CONFIG_SPI_MASTER) 593#if defined(CONFIG_SPI_MASTER)
594static int wm8731_spi_write(struct spi_device *spi, const char *data, int len)
595{
596 struct spi_transfer t;
597 struct spi_message m;
598 u8 msg[2];
599
600 if (len <= 0)
601 return 0;
602
603 msg[0] = data[0];
604 msg[1] = data[1];
605
606 spi_message_init(&m);
607 memset(&t, 0, (sizeof t));
608
609 t.tx_buf = &msg[0];
610 t.len = len;
611
612 spi_message_add_tail(&t, &m);
613 spi_sync(spi, &m);
614
615 return len;
616}
617
618static int __devinit wm8731_spi_probe(struct spi_device *spi) 594static int __devinit wm8731_spi_probe(struct spi_device *spi)
619{ 595{
620 struct snd_soc_codec *codec; 596 struct snd_soc_codec *codec;
@@ -626,7 +602,6 @@ static int __devinit wm8731_spi_probe(struct spi_device *spi)
626 602
627 codec = &wm8731->codec; 603 codec = &wm8731->codec;
628 codec->control_data = spi; 604 codec->control_data = spi;
629 codec->hw_write = (hw_write_t)wm8731_spi_write;
630 codec->dev = &spi->dev; 605 codec->dev = &spi->dev;
631 606
632 dev_set_drvdata(&spi->dev, wm8731); 607 dev_set_drvdata(&spi->dev, wm8731);
diff --git a/sound/soc/codecs/wm8750.c b/sound/soc/codecs/wm8750.c
index e6422b161678..4ba1e7e93fb4 100644
--- a/sound/soc/codecs/wm8750.c
+++ b/sound/soc/codecs/wm8750.c
@@ -911,30 +911,6 @@ static struct spi_driver wm8750_spi_driver = {
911 .probe = wm8750_spi_probe, 911 .probe = wm8750_spi_probe,
912 .remove = __devexit_p(wm8750_spi_remove), 912 .remove = __devexit_p(wm8750_spi_remove),
913}; 913};
914
915static int wm8750_spi_write(struct spi_device *spi, const char *data, int len)
916{
917 struct spi_transfer t;
918 struct spi_message m;
919 u8 msg[2];
920
921 if (len <= 0)
922 return 0;
923
924 msg[0] = data[0];
925 msg[1] = data[1];
926
927 spi_message_init(&m);
928 memset(&t, 0, (sizeof t));
929
930 t.tx_buf = &msg[0];
931 t.len = len;
932
933 spi_message_add_tail(&t, &m);
934 spi_sync(spi, &m);
935
936 return len;
937}
938#endif 914#endif
939 915
940static int wm8750_probe(struct platform_device *pdev) 916static int wm8750_probe(struct platform_device *pdev)
@@ -973,7 +949,6 @@ static int wm8750_probe(struct platform_device *pdev)
973#endif 949#endif
974#if defined(CONFIG_SPI_MASTER) 950#if defined(CONFIG_SPI_MASTER)
975 if (setup->spi) { 951 if (setup->spi) {
976 codec->hw_write = (hw_write_t)wm8750_spi_write;
977 ret = spi_register_driver(&wm8750_spi_driver); 952 ret = spi_register_driver(&wm8750_spi_driver);
978 if (ret != 0) 953 if (ret != 0)
979 printk(KERN_ERR "can't add spi driver"); 954 printk(KERN_ERR "can't add spi driver");
diff --git a/sound/soc/codecs/wm8988.c b/sound/soc/codecs/wm8988.c
index 7486d3ec787e..1c8653523c8c 100644
--- a/sound/soc/codecs/wm8988.c
+++ b/sound/soc/codecs/wm8988.c
@@ -979,30 +979,6 @@ static struct i2c_driver wm8988_i2c_driver = {
979#endif 979#endif
980 980
981#if defined(CONFIG_SPI_MASTER) 981#if defined(CONFIG_SPI_MASTER)
982static int wm8988_spi_write(struct spi_device *spi, const char *data, int len)
983{
984 struct spi_transfer t;
985 struct spi_message m;
986 u8 msg[2];
987
988 if (len <= 0)
989 return 0;
990
991 msg[0] = data[0];
992 msg[1] = data[1];
993
994 spi_message_init(&m);
995 memset(&t, 0, (sizeof t));
996
997 t.tx_buf = &msg[0];
998 t.len = len;
999
1000 spi_message_add_tail(&t, &m);
1001 spi_sync(spi, &m);
1002
1003 return len;
1004}
1005
1006static int __devinit wm8988_spi_probe(struct spi_device *spi) 982static int __devinit wm8988_spi_probe(struct spi_device *spi)
1007{ 983{
1008 struct wm8988_priv *wm8988; 984 struct wm8988_priv *wm8988;
@@ -1013,7 +989,6 @@ static int __devinit wm8988_spi_probe(struct spi_device *spi)
1013 return -ENOMEM; 989 return -ENOMEM;
1014 990
1015 codec = &wm8988->codec; 991 codec = &wm8988->codec;
1016 codec->hw_write = (hw_write_t)wm8988_spi_write;
1017 codec->control_data = spi; 992 codec->control_data = spi;
1018 codec->dev = &spi->dev; 993 codec->dev = &spi->dev;
1019 994
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c
index ab058b811633..56ec3f22bf1c 100644
--- a/sound/soc/soc-cache.c
+++ b/sound/soc/soc-cache.c
@@ -12,6 +12,7 @@
12 */ 12 */
13 13
14#include <linux/i2c.h> 14#include <linux/i2c.h>
15#include <linux/spi/spi.h>
15#include <sound/soc.h> 16#include <sound/soc.h>
16 17
17static unsigned int snd_soc_7_9_read(struct snd_soc_codec *codec, 18static unsigned int snd_soc_7_9_read(struct snd_soc_codec *codec,
@@ -46,6 +47,36 @@ static int snd_soc_7_9_write(struct snd_soc_codec *codec, unsigned int reg,
46 return -EIO; 47 return -EIO;
47} 48}
48 49
50#if defined(CONFIG_SPI_MASTER)
51static int snd_soc_7_9_spi_write(void *control_data, const char *data,
52 int len)
53{
54 struct spi_device *spi = control_data;
55 struct spi_transfer t;
56 struct spi_message m;
57 u8 msg[2];
58
59 if (len <= 0)
60 return 0;
61
62 msg[0] = data[0];
63 msg[1] = data[1];
64
65 spi_message_init(&m);
66 memset(&t, 0, (sizeof t));
67
68 t.tx_buf = &msg[0];
69 t.len = len;
70
71 spi_message_add_tail(&t, &m);
72 spi_sync(spi, &m);
73
74 return len;
75}
76#else
77#define snd_soc_7_9_spi_write NULL
78#endif
79
49static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg, 80static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg,
50 unsigned int value) 81 unsigned int value)
51{ 82{
@@ -115,12 +146,12 @@ static struct {
115 int addr_bits; 146 int addr_bits;
116 int data_bits; 147 int data_bits;
117 int (*write)(struct snd_soc_codec *codec, unsigned int, unsigned int); 148 int (*write)(struct snd_soc_codec *codec, unsigned int, unsigned int);
149 int (*spi_write)(void *, const char *, int);
118 unsigned int (*read)(struct snd_soc_codec *, unsigned int); 150 unsigned int (*read)(struct snd_soc_codec *, unsigned int);
119 unsigned int (*i2c_read)(struct snd_soc_codec *, unsigned int); 151 unsigned int (*i2c_read)(struct snd_soc_codec *, unsigned int);
120} io_types[] = { 152} io_types[] = {
121 { 7, 9, snd_soc_7_9_write, snd_soc_7_9_read }, 153 { 7, 9, snd_soc_7_9_write, snd_soc_7_9_spi_write, snd_soc_7_9_read },
122 { 8, 16, 154 { 8, 16, snd_soc_8_16_write, NULL, snd_soc_8_16_read,
123 snd_soc_8_16_write, snd_soc_8_16_read,
124 snd_soc_8_16_read_i2c }, 155 snd_soc_8_16_read_i2c },
125}; 156};
126 157
@@ -177,6 +208,8 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
177 break; 208 break;
178 209
179 case SND_SOC_SPI: 210 case SND_SOC_SPI:
211 if (io_types[i].spi_write)
212 codec->hw_write = io_types[i].spi_write;
180 break; 213 break;
181 } 214 }
182 215