hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/sound/soc/codecs/ak5558.c
....@@ -11,6 +11,7 @@
1111 #include <linux/module.h>
1212 #include <linux/pm_runtime.h>
1313 #include <linux/regmap.h>
14
+#include <linux/regulator/consumer.h>
1415 #include <linux/slab.h>
1516
1617 #include <sound/initval.h>
....@@ -22,8 +23,15 @@
2223
2324 #include "ak5558.h"
2425
26
+#define AK5558_NUM_SUPPLIES 2
27
+static const char *ak5558_supply_names[AK5558_NUM_SUPPLIES] = {
28
+ "DVDD",
29
+ "AVDD",
30
+};
31
+
2532 /* AK5558 Codec Private Data */
2633 struct ak5558_priv {
34
+ struct regulator_bulk_data supplies[AK5558_NUM_SUPPLIES];
2735 struct snd_soc_component component;
2836 struct regmap *regmap;
2937 struct i2c_client *i2c;
....@@ -130,16 +138,12 @@
130138 u8 bits;
131139 int pcm_width = max(params_physical_width(params), ak5558->slot_width);
132140
133
- /* set master/slave audio interface */
134
- bits = snd_soc_component_read32(component, AK5558_02_CONTROL1);
135
- bits &= ~AK5558_BITS;
136
-
137141 switch (pcm_width) {
138142 case 16:
139
- bits |= AK5558_DIF_24BIT_MODE;
143
+ bits = AK5558_DIF_24BIT_MODE;
140144 break;
141145 case 32:
142
- bits |= AK5558_DIF_32BIT_MODE;
146
+ bits = AK5558_DIF_32BIT_MODE;
143147 break;
144148 default:
145149 return -EINVAL;
....@@ -168,18 +172,15 @@
168172 }
169173
170174 /* set master/slave audio interface */
171
- format = snd_soc_component_read32(component, AK5558_02_CONTROL1);
172
- format &= ~AK5558_DIF;
173
-
174175 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
175176 case SND_SOC_DAIFMT_I2S:
176
- format |= AK5558_DIF_I2S_MODE;
177
+ format = AK5558_DIF_I2S_MODE;
177178 break;
178179 case SND_SOC_DAIFMT_LEFT_J:
179
- format |= AK5558_DIF_MSB_MODE;
180
+ format = AK5558_DIF_MSB_MODE;
180181 break;
181182 case SND_SOC_DAIFMT_DSP_B:
182
- format |= AK5558_DIF_MSB_MODE;
183
+ format = AK5558_DIF_MSB_MODE;
183184 break;
184185 default:
185186 return -EINVAL;
....@@ -246,7 +247,7 @@
246247 &ak5558_rate_constraints);
247248 }
248249
249
-static struct snd_soc_dai_ops ak5558_dai_ops = {
250
+static const struct snd_soc_dai_ops ak5558_dai_ops = {
250251 .startup = ak5558_startup,
251252 .hw_params = ak5558_hw_params,
252253
....@@ -306,12 +307,22 @@
306307 regcache_cache_only(ak5558->regmap, true);
307308 ak5558_power_off(ak5558);
308309
310
+ regulator_bulk_disable(ARRAY_SIZE(ak5558->supplies),
311
+ ak5558->supplies);
309312 return 0;
310313 }
311314
312315 static int __maybe_unused ak5558_runtime_resume(struct device *dev)
313316 {
314317 struct ak5558_priv *ak5558 = dev_get_drvdata(dev);
318
+ int ret;
319
+
320
+ ret = regulator_bulk_enable(ARRAY_SIZE(ak5558->supplies),
321
+ ak5558->supplies);
322
+ if (ret != 0) {
323
+ dev_err(dev, "Failed to enable supplies: %d\n", ret);
324
+ return ret;
325
+ }
315326
316327 ak5558_power_off(ak5558);
317328 ak5558_power_on(ak5558);
....@@ -357,6 +368,7 @@
357368 {
358369 struct ak5558_priv *ak5558;
359370 int ret = 0;
371
+ int i;
360372
361373 ak5558 = devm_kzalloc(&i2c->dev, sizeof(*ak5558), GFP_KERNEL);
362374 if (!ak5558)
....@@ -374,6 +386,16 @@
374386 if (IS_ERR(ak5558->reset_gpiod))
375387 return PTR_ERR(ak5558->reset_gpiod);
376388
389
+ for (i = 0; i < ARRAY_SIZE(ak5558->supplies); i++)
390
+ ak5558->supplies[i].supply = ak5558_supply_names[i];
391
+
392
+ ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(ak5558->supplies),
393
+ ak5558->supplies);
394
+ if (ret != 0) {
395
+ dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
396
+ return ret;
397
+ }
398
+
377399 ret = devm_snd_soc_register_component(&i2c->dev,
378400 &soc_codec_dev_ak5558,
379401 &ak5558_dai, 1);
....@@ -381,6 +403,7 @@
381403 return ret;
382404
383405 pm_runtime_enable(&i2c->dev);
406
+ regcache_cache_only(ak5558->regmap, true);
384407
385408 return 0;
386409 }