Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: ak4535: Convert to direct regmap API usage

I suspect the timer register may also be volatile.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>

+55 -13
+55 -11
sound/soc/codecs/ak4535.c
··· 18 18 #include <linux/delay.h> 19 19 #include <linux/pm.h> 20 20 #include <linux/i2c.h> 21 + #include <linux/regmap.h> 21 22 #include <linux/slab.h> 22 23 #include <sound/core.h> 23 24 #include <sound/pcm.h> ··· 30 29 31 30 /* codec private data */ 32 31 struct ak4535_priv { 32 + struct regmap *regmap; 33 33 unsigned int sysclk; 34 - enum snd_soc_control_type control_type; 35 34 }; 36 35 37 36 /* 38 37 * ak4535 register cache 39 38 */ 40 - static const u8 ak4535_reg[AK4535_CACHEREGNUM] = { 41 - 0x00, 0x80, 0x00, 0x03, 42 - 0x02, 0x00, 0x11, 0x01, 43 - 0x00, 0x40, 0x36, 0x10, 44 - 0x00, 0x00, 0x57, 0x00, 39 + static const struct reg_default ak4535_reg_defaults[] = { 40 + { 0, 0x00 }, 41 + { 1, 0x80 }, 42 + { 2, 0x00 }, 43 + { 3, 0x03 }, 44 + { 4, 0x02 }, 45 + { 5, 0x00 }, 46 + { 6, 0x11 }, 47 + { 7, 0x01 }, 48 + { 8, 0x00 }, 49 + { 9, 0x40 }, 50 + { 10, 0x36 }, 51 + { 11, 0x10 }, 52 + { 12, 0x00 }, 53 + { 13, 0x00 }, 54 + { 14, 0x57 }, 45 55 }; 56 + 57 + static bool ak4535_volatile(struct device *dev, unsigned int reg) 58 + { 59 + switch (reg) { 60 + case AK4535_STATUS: 61 + return true; 62 + default: 63 + return false; 64 + } 65 + } 46 66 47 67 static const char *ak4535_mono_gain[] = {"+6dB", "-17dB"}; 48 68 static const char *ak4535_mono_out[] = {"(L + R)/2", "Hi-Z"}; ··· 392 370 struct ak4535_priv *ak4535 = snd_soc_codec_get_drvdata(codec); 393 371 int ret; 394 372 395 - ret = snd_soc_codec_set_cache_io(codec, 8, 8, ak4535->control_type); 373 + codec->control_data = ak4535->regmap; 374 + ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_REGMAP); 396 375 if (ret < 0) { 397 376 dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); 398 377 return ret; ··· 413 390 return 0; 414 391 } 415 392 393 + static const struct regmap_config ak4535_regmap = { 394 + .reg_bits = 8, 395 + .val_bits = 8, 396 + 397 + .max_register = AK4535_STATUS, 398 + .volatile_reg = ak4535_volatile, 399 + 400 + .cache_type = REGCACHE_RBTREE, 401 + .reg_defaults = ak4535_reg_defaults, 402 + .num_reg_defaults = ARRAY_SIZE(ak4535_reg_defaults), 403 + }; 404 + 416 405 static struct snd_soc_codec_driver soc_codec_dev_ak4535 = { 417 406 .probe = ak4535_probe, 418 407 .remove = ak4535_remove, 419 408 .suspend = ak4535_suspend, 420 409 .resume = ak4535_resume, 421 410 .set_bias_level = ak4535_set_bias_level, 422 - .reg_cache_size = ARRAY_SIZE(ak4535_reg), 423 - .reg_word_size = sizeof(u8), 424 - .reg_cache_default = ak4535_reg, 425 411 .dapm_widgets = ak4535_dapm_widgets, 426 412 .num_dapm_widgets = ARRAY_SIZE(ak4535_dapm_widgets), 427 413 .dapm_routes = ak4535_audio_map, ··· 448 416 if (ak4535 == NULL) 449 417 return -ENOMEM; 450 418 419 + ak4535->regmap = regmap_init_i2c(i2c, &ak4535_regmap); 420 + if (IS_ERR(ak4535->regmap)) { 421 + ret = PTR_ERR(ak4535->regmap); 422 + dev_err(&i2c->dev, "Failed to init regmap: %d\n", ret); 423 + return ret; 424 + } 425 + 451 426 i2c_set_clientdata(i2c, ak4535); 452 - ak4535->control_type = SND_SOC_I2C; 453 427 454 428 ret = snd_soc_register_codec(&i2c->dev, 455 429 &soc_codec_dev_ak4535, &ak4535_dai, 1); 430 + if (ret != 0) 431 + regmap_exit(ak4535->regmap); 432 + 456 433 return ret; 457 434 } 458 435 459 436 static __devexit int ak4535_i2c_remove(struct i2c_client *client) 460 437 { 438 + struct ak4535_priv *ak4535 = i2c_get_clientdata(client); 439 + 461 440 snd_soc_unregister_codec(&client->dev); 441 + regmap_exit(ak4535->regmap); 462 442 return 0; 463 443 } 464 444
-2
sound/soc/codecs/ak4535.h
··· 34 34 #define AK4535_VOL 0xe 35 35 #define AK4535_STATUS 0xf 36 36 37 - #define AK4535_CACHEREGNUM 0x10 38 - 39 37 #endif