diff options
Diffstat (limited to 'sound/i2c/other')
-rw-r--r-- | sound/i2c/other/ak4113.c | 19 | ||||
-rw-r--r-- | sound/i2c/other/ak4114.c | 30 | ||||
-rw-r--r-- | sound/i2c/other/ak4117.c | 10 | ||||
-rw-r--r-- | sound/i2c/other/ak4xxx-adda.c | 2 |
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 | ||
644 | void 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 | } | ||
649 | EXPORT_SYMBOL(snd_ak4113_suspend); | ||
650 | |||
651 | void snd_ak4113_resume(struct ak4113 *chip) | ||
652 | { | ||
653 | atomic_dec(&chip->wq_processing); | ||
654 | snd_ak4113_reinit(chip); | ||
655 | } | ||
656 | EXPORT_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 | } |
126 | EXPORT_SYMBOL(snd_ak4114_create); | ||
125 | 127 | ||
126 | void snd_ak4114_reg_write(struct ak4114 *chip, unsigned char reg, unsigned char mask, unsigned char val) | 128 | void 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 | } |
136 | EXPORT_SYMBOL(snd_ak4114_reg_write); | ||
134 | 137 | ||
135 | static void ak4114_init_regs(struct ak4114 *chip) | 138 | static 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 | } |
167 | EXPORT_SYMBOL(snd_ak4114_reinit); | ||
162 | 168 | ||
163 | static unsigned int external_rate(unsigned char rcs1) | 169 | static 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 | } |
512 | EXPORT_SYMBOL(snd_ak4114_build); | ||
506 | 513 | ||
507 | /* notify kcontrols if any parameters are changed */ | 514 | /* notify kcontrols if any parameters are changed */ |
508 | static void ak4114_notify(struct ak4114 *ak4114, | 515 | static 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 | } |
568 | EXPORT_SYMBOL(snd_ak4114_external_rate); | ||
561 | 569 | ||
562 | int snd_ak4114_check_rate_and_errors(struct ak4114 *ak4114, unsigned int flags) | 570 | int 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 | } |
616 | EXPORT_SYMBOL(snd_ak4114_check_rate_and_errors); | ||
608 | 617 | ||
609 | static void ak4114_stats(struct work_struct *work) | 618 | static 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 | ||
619 | EXPORT_SYMBOL(snd_ak4114_create); | 628 | #ifdef CONFIG_PM |
620 | EXPORT_SYMBOL(snd_ak4114_reg_write); | 629 | void snd_ak4114_suspend(struct ak4114 *chip) |
621 | EXPORT_SYMBOL(snd_ak4114_reinit); | 630 | { |
622 | EXPORT_SYMBOL(snd_ak4114_build); | 631 | atomic_inc(&chip->wq_processing); /* don't schedule new work */ |
623 | EXPORT_SYMBOL(snd_ak4114_external_rate); | 632 | cancel_delayed_work_sync(&chip->work); |
624 | EXPORT_SYMBOL(snd_ak4114_check_rate_and_errors); | 633 | } |
634 | EXPORT_SYMBOL(snd_ak4114_suspend); | ||
635 | |||
636 | void snd_ak4114_resume(struct ak4114 *chip) | ||
637 | { | ||
638 | atomic_dec(&chip->wq_processing); | ||
639 | snd_ak4114_reinit(chip); | ||
640 | } | ||
641 | EXPORT_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 | ||
146 | static unsigned int external_rate(unsigned char rcs1) | 143 | static 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 | ||
547 | EXPORT_SYMBOL(snd_ak4117_create); | 543 | EXPORT_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> |