aboutsummaryrefslogtreecommitdiffstats
path: root/sound/i2c/other
diff options
context:
space:
mode:
Diffstat (limited to 'sound/i2c/other')
-rw-r--r--sound/i2c/other/ak4113.c19
-rw-r--r--sound/i2c/other/ak4114.c30
-rw-r--r--sound/i2c/other/ak4117.c10
-rw-r--r--sound/i2c/other/ak4xxx-adda.c2
4 files changed, 47 insertions, 14 deletions
diff --git a/sound/i2c/other/ak4113.c b/sound/i2c/other/ak4113.c
index c6bba99a90b2..88844881cbff 100644
--- a/sound/i2c/other/ak4113.c
+++ b/sound/i2c/other/ak4113.c
@@ -89,6 +89,7 @@ int snd_ak4113_create(struct snd_card *card, ak4113_read_t *read,
89 chip->private_data = private_data; 89 chip->private_data = private_data;
90 INIT_DELAYED_WORK(&chip->work, ak4113_stats); 90 INIT_DELAYED_WORK(&chip->work, ak4113_stats);
91 atomic_set(&chip->wq_processing, 0); 91 atomic_set(&chip->wq_processing, 0);
92 mutex_init(&chip->reinit_mutex);
92 93
93 for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++) 94 for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++)
94 chip->regmap[reg] = pgm[reg]; 95 chip->regmap[reg] = pgm[reg];
@@ -141,7 +142,9 @@ void snd_ak4113_reinit(struct ak4113 *chip)
141{ 142{
142 if (atomic_inc_return(&chip->wq_processing) == 1) 143 if (atomic_inc_return(&chip->wq_processing) == 1)
143 cancel_delayed_work_sync(&chip->work); 144 cancel_delayed_work_sync(&chip->work);
145 mutex_lock(&chip->reinit_mutex);
144 ak4113_init_regs(chip); 146 ak4113_init_regs(chip);
147 mutex_unlock(&chip->reinit_mutex);
145 /* bring up statistics / event queing */ 148 /* bring up statistics / event queing */
146 if (atomic_dec_and_test(&chip->wq_processing)) 149 if (atomic_dec_and_test(&chip->wq_processing))
147 schedule_delayed_work(&chip->work, HZ / 10); 150 schedule_delayed_work(&chip->work, HZ / 10);
@@ -636,3 +639,19 @@ static void ak4113_stats(struct work_struct *work)
636 if (atomic_dec_and_test(&chip->wq_processing)) 639 if (atomic_dec_and_test(&chip->wq_processing))
637 schedule_delayed_work(&chip->work, HZ / 10); 640 schedule_delayed_work(&chip->work, HZ / 10);
638} 641}
642
643#ifdef CONFIG_PM
644void snd_ak4113_suspend(struct ak4113 *chip)
645{
646 atomic_inc(&chip->wq_processing); /* don't schedule new work */
647 cancel_delayed_work_sync(&chip->work);
648}
649EXPORT_SYMBOL(snd_ak4113_suspend);
650
651void snd_ak4113_resume(struct ak4113 *chip)
652{
653 atomic_dec(&chip->wq_processing);
654 snd_ak4113_reinit(chip);
655}
656EXPORT_SYMBOL(snd_ak4113_resume);
657#endif
diff --git a/sound/i2c/other/ak4114.c b/sound/i2c/other/ak4114.c
index b70e6eccbd03..5a4cf3fab4ae 100644
--- a/sound/i2c/other/ak4114.c
+++ b/sound/i2c/other/ak4114.c
@@ -100,6 +100,7 @@ int snd_ak4114_create(struct snd_card *card,
100 chip->private_data = private_data; 100 chip->private_data = private_data;
101 INIT_DELAYED_WORK(&chip->work, ak4114_stats); 101 INIT_DELAYED_WORK(&chip->work, ak4114_stats);
102 atomic_set(&chip->wq_processing, 0); 102 atomic_set(&chip->wq_processing, 0);
103 mutex_init(&chip->reinit_mutex);
103 104
104 for (reg = 0; reg < 6; reg++) 105 for (reg = 0; reg < 6; reg++)
105 chip->regmap[reg] = pgm[reg]; 106 chip->regmap[reg] = pgm[reg];
@@ -122,6 +123,7 @@ int snd_ak4114_create(struct snd_card *card,
122 snd_ak4114_free(chip); 123 snd_ak4114_free(chip);
123 return err < 0 ? err : -EIO; 124 return err < 0 ? err : -EIO;
124} 125}
126EXPORT_SYMBOL(snd_ak4114_create);
125 127
126void snd_ak4114_reg_write(struct ak4114 *chip, unsigned char reg, unsigned char mask, unsigned char val) 128void snd_ak4114_reg_write(struct ak4114 *chip, unsigned char reg, unsigned char mask, unsigned char val)
127{ 129{
@@ -131,6 +133,7 @@ void snd_ak4114_reg_write(struct ak4114 *chip, unsigned char reg, unsigned char
131 reg_write(chip, reg, 133 reg_write(chip, reg,
132 (chip->txcsb[reg-AK4114_REG_TXCSB0] & ~mask) | val); 134 (chip->txcsb[reg-AK4114_REG_TXCSB0] & ~mask) | val);
133} 135}
136EXPORT_SYMBOL(snd_ak4114_reg_write);
134 137
135static void ak4114_init_regs(struct ak4114 *chip) 138static void ak4114_init_regs(struct ak4114 *chip)
136{ 139{
@@ -154,11 +157,14 @@ void snd_ak4114_reinit(struct ak4114 *chip)
154{ 157{
155 if (atomic_inc_return(&chip->wq_processing) == 1) 158 if (atomic_inc_return(&chip->wq_processing) == 1)
156 cancel_delayed_work_sync(&chip->work); 159 cancel_delayed_work_sync(&chip->work);
160 mutex_lock(&chip->reinit_mutex);
157 ak4114_init_regs(chip); 161 ak4114_init_regs(chip);
162 mutex_unlock(&chip->reinit_mutex);
158 /* bring up statistics / event queing */ 163 /* bring up statistics / event queing */
159 if (atomic_dec_and_test(&chip->wq_processing)) 164 if (atomic_dec_and_test(&chip->wq_processing))
160 schedule_delayed_work(&chip->work, HZ / 10); 165 schedule_delayed_work(&chip->work, HZ / 10);
161} 166}
167EXPORT_SYMBOL(snd_ak4114_reinit);
162 168
163static unsigned int external_rate(unsigned char rcs1) 169static unsigned int external_rate(unsigned char rcs1)
164{ 170{
@@ -503,6 +509,7 @@ int snd_ak4114_build(struct ak4114 *ak4114,
503 schedule_delayed_work(&ak4114->work, HZ / 10); 509 schedule_delayed_work(&ak4114->work, HZ / 10);
504 return 0; 510 return 0;
505} 511}
512EXPORT_SYMBOL(snd_ak4114_build);
506 513
507/* notify kcontrols if any parameters are changed */ 514/* notify kcontrols if any parameters are changed */
508static void ak4114_notify(struct ak4114 *ak4114, 515static void ak4114_notify(struct ak4114 *ak4114,
@@ -558,6 +565,7 @@ int snd_ak4114_external_rate(struct ak4114 *ak4114)
558 rcs1 = reg_read(ak4114, AK4114_REG_RCS1); 565 rcs1 = reg_read(ak4114, AK4114_REG_RCS1);
559 return external_rate(rcs1); 566 return external_rate(rcs1);
560} 567}
568EXPORT_SYMBOL(snd_ak4114_external_rate);
561 569
562int snd_ak4114_check_rate_and_errors(struct ak4114 *ak4114, unsigned int flags) 570int snd_ak4114_check_rate_and_errors(struct ak4114 *ak4114, unsigned int flags)
563{ 571{
@@ -605,6 +613,7 @@ int snd_ak4114_check_rate_and_errors(struct ak4114 *ak4114, unsigned int flags)
605 } 613 }
606 return res; 614 return res;
607} 615}
616EXPORT_SYMBOL(snd_ak4114_check_rate_and_errors);
608 617
609static void ak4114_stats(struct work_struct *work) 618static void ak4114_stats(struct work_struct *work)
610{ 619{
@@ -616,9 +625,18 @@ static void ak4114_stats(struct work_struct *work)
616 schedule_delayed_work(&chip->work, HZ / 10); 625 schedule_delayed_work(&chip->work, HZ / 10);
617} 626}
618 627
619EXPORT_SYMBOL(snd_ak4114_create); 628#ifdef CONFIG_PM
620EXPORT_SYMBOL(snd_ak4114_reg_write); 629void snd_ak4114_suspend(struct ak4114 *chip)
621EXPORT_SYMBOL(snd_ak4114_reinit); 630{
622EXPORT_SYMBOL(snd_ak4114_build); 631 atomic_inc(&chip->wq_processing); /* don't schedule new work */
623EXPORT_SYMBOL(snd_ak4114_external_rate); 632 cancel_delayed_work_sync(&chip->work);
624EXPORT_SYMBOL(snd_ak4114_check_rate_and_errors); 633}
634EXPORT_SYMBOL(snd_ak4114_suspend);
635
636void snd_ak4114_resume(struct ak4114 *chip)
637{
638 atomic_dec(&chip->wq_processing);
639 snd_ak4114_reinit(chip);
640}
641EXPORT_SYMBOL(snd_ak4114_resume);
642#endif
diff --git a/sound/i2c/other/ak4117.c b/sound/i2c/other/ak4117.c
index 88452e899bd9..48848909a5a9 100644
--- a/sound/i2c/other/ak4117.c
+++ b/sound/i2c/other/ak4117.c
@@ -91,9 +91,7 @@ int snd_ak4117_create(struct snd_card *card, ak4117_read_t *read, ak4117_write_t
91 chip->read = read; 91 chip->read = read;
92 chip->write = write; 92 chip->write = write;
93 chip->private_data = private_data; 93 chip->private_data = private_data;
94 init_timer(&chip->timer); 94 setup_timer(&chip->timer, snd_ak4117_timer, (unsigned long)chip);
95 chip->timer.data = (unsigned long)chip;
96 chip->timer.function = snd_ak4117_timer;
97 95
98 for (reg = 0; reg < 5; reg++) 96 for (reg = 0; reg < 5; reg++)
99 chip->regmap[reg] = pgm[reg]; 97 chip->regmap[reg] = pgm[reg];
@@ -139,8 +137,7 @@ void snd_ak4117_reinit(struct ak4117 *chip)
139 /* release powerdown, everything is initialized now */ 137 /* release powerdown, everything is initialized now */
140 reg_write(chip, AK4117_REG_PWRDN, old | AK4117_RST | AK4117_PWN); 138 reg_write(chip, AK4117_REG_PWRDN, old | AK4117_RST | AK4117_PWN);
141 chip->init = 0; 139 chip->init = 0;
142 chip->timer.expires = 1 + jiffies; 140 mod_timer(&chip->timer, 1 + jiffies);
143 add_timer(&chip->timer);
144} 141}
145 142
146static unsigned int external_rate(unsigned char rcs1) 143static unsigned int external_rate(unsigned char rcs1)
@@ -540,8 +537,7 @@ static void snd_ak4117_timer(unsigned long data)
540 if (chip->init) 537 if (chip->init)
541 return; 538 return;
542 snd_ak4117_check_rate_and_errors(chip, 0); 539 snd_ak4117_check_rate_and_errors(chip, 0);
543 chip->timer.expires = 1 + jiffies; 540 mod_timer(&chip->timer, 1 + jiffies);
544 add_timer(&chip->timer);
545} 541}
546 542
547EXPORT_SYMBOL(snd_ak4117_create); 543EXPORT_SYMBOL(snd_ak4117_create);
diff --git a/sound/i2c/other/ak4xxx-adda.c b/sound/i2c/other/ak4xxx-adda.c
index 67dbfde837ab..c65731088aa2 100644
--- a/sound/i2c/other/ak4xxx-adda.c
+++ b/sound/i2c/other/ak4xxx-adda.c
@@ -21,7 +21,7 @@
21 * 21 *
22 */ 22 */
23 23
24#include <asm/io.h> 24#include <linux/io.h>
25#include <linux/delay.h> 25#include <linux/delay.h>
26#include <linux/interrupt.h> 26#include <linux/interrupt.h>
27#include <linux/init.h> 27#include <linux/init.h>