diff options
Diffstat (limited to 'sound/soc/codecs/da9055.c')
-rw-r--r-- | sound/soc/codecs/da9055.c | 103 |
1 files changed, 59 insertions, 44 deletions
diff --git a/sound/soc/codecs/da9055.c b/sound/soc/codecs/da9055.c index 52b79a487ac7..f118daa91234 100644 --- a/sound/soc/codecs/da9055.c +++ b/sound/soc/codecs/da9055.c | |||
@@ -18,6 +18,8 @@ | |||
18 | #include <linux/regmap.h> | 18 | #include <linux/regmap.h> |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/module.h> | 20 | #include <linux/module.h> |
21 | #include <linux/of.h> | ||
22 | #include <linux/of_device.h> | ||
21 | #include <sound/pcm.h> | 23 | #include <sound/pcm.h> |
22 | #include <sound/pcm_params.h> | 24 | #include <sound/pcm_params.h> |
23 | #include <sound/soc.h> | 25 | #include <sound/soc.h> |
@@ -321,22 +323,22 @@ static const char * const da9055_hpf_cutoff_txt[] = { | |||
321 | "Fs/24000", "Fs/12000", "Fs/6000", "Fs/3000" | 323 | "Fs/24000", "Fs/12000", "Fs/6000", "Fs/3000" |
322 | }; | 324 | }; |
323 | 325 | ||
324 | static const struct soc_enum da9055_dac_hpf_cutoff = | 326 | static SOC_ENUM_SINGLE_DECL(da9055_dac_hpf_cutoff, |
325 | SOC_ENUM_SINGLE(DA9055_DAC_FILTERS1, 4, 4, da9055_hpf_cutoff_txt); | 327 | DA9055_DAC_FILTERS1, 4, da9055_hpf_cutoff_txt); |
326 | 328 | ||
327 | static const struct soc_enum da9055_adc_hpf_cutoff = | 329 | static SOC_ENUM_SINGLE_DECL(da9055_adc_hpf_cutoff, |
328 | SOC_ENUM_SINGLE(DA9055_ADC_FILTERS1, 4, 4, da9055_hpf_cutoff_txt); | 330 | DA9055_ADC_FILTERS1, 4, da9055_hpf_cutoff_txt); |
329 | 331 | ||
330 | /* ADC and DAC voice mode (8kHz) high pass cutoff value */ | 332 | /* ADC and DAC voice mode (8kHz) high pass cutoff value */ |
331 | static const char * const da9055_vf_cutoff_txt[] = { | 333 | static const char * const da9055_vf_cutoff_txt[] = { |
332 | "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz" | 334 | "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz" |
333 | }; | 335 | }; |
334 | 336 | ||
335 | static const struct soc_enum da9055_dac_vf_cutoff = | 337 | static SOC_ENUM_SINGLE_DECL(da9055_dac_vf_cutoff, |
336 | SOC_ENUM_SINGLE(DA9055_DAC_FILTERS1, 0, 8, da9055_vf_cutoff_txt); | 338 | DA9055_DAC_FILTERS1, 0, da9055_vf_cutoff_txt); |
337 | 339 | ||
338 | static const struct soc_enum da9055_adc_vf_cutoff = | 340 | static SOC_ENUM_SINGLE_DECL(da9055_adc_vf_cutoff, |
339 | SOC_ENUM_SINGLE(DA9055_ADC_FILTERS1, 0, 8, da9055_vf_cutoff_txt); | 341 | DA9055_ADC_FILTERS1, 0, da9055_vf_cutoff_txt); |
340 | 342 | ||
341 | /* Gain ramping rate value */ | 343 | /* Gain ramping rate value */ |
342 | static const char * const da9055_gain_ramping_txt[] = { | 344 | static const char * const da9055_gain_ramping_txt[] = { |
@@ -344,44 +346,44 @@ static const char * const da9055_gain_ramping_txt[] = { | |||
344 | "nominal rate / 8" | 346 | "nominal rate / 8" |
345 | }; | 347 | }; |
346 | 348 | ||
347 | static const struct soc_enum da9055_gain_ramping_rate = | 349 | static SOC_ENUM_SINGLE_DECL(da9055_gain_ramping_rate, |
348 | SOC_ENUM_SINGLE(DA9055_GAIN_RAMP_CTRL, 0, 4, da9055_gain_ramping_txt); | 350 | DA9055_GAIN_RAMP_CTRL, 0, da9055_gain_ramping_txt); |
349 | 351 | ||
350 | /* DAC noise gate setup time value */ | 352 | /* DAC noise gate setup time value */ |
351 | static const char * const da9055_dac_ng_setup_time_txt[] = { | 353 | static const char * const da9055_dac_ng_setup_time_txt[] = { |
352 | "256 samples", "512 samples", "1024 samples", "2048 samples" | 354 | "256 samples", "512 samples", "1024 samples", "2048 samples" |
353 | }; | 355 | }; |
354 | 356 | ||
355 | static const struct soc_enum da9055_dac_ng_setup_time = | 357 | static SOC_ENUM_SINGLE_DECL(da9055_dac_ng_setup_time, |
356 | SOC_ENUM_SINGLE(DA9055_DAC_NG_SETUP_TIME, 0, 4, | 358 | DA9055_DAC_NG_SETUP_TIME, 0, |
357 | da9055_dac_ng_setup_time_txt); | 359 | da9055_dac_ng_setup_time_txt); |
358 | 360 | ||
359 | /* DAC noise gate rampup rate value */ | 361 | /* DAC noise gate rampup rate value */ |
360 | static const char * const da9055_dac_ng_rampup_txt[] = { | 362 | static const char * const da9055_dac_ng_rampup_txt[] = { |
361 | "0.02 ms/dB", "0.16 ms/dB" | 363 | "0.02 ms/dB", "0.16 ms/dB" |
362 | }; | 364 | }; |
363 | 365 | ||
364 | static const struct soc_enum da9055_dac_ng_rampup_rate = | 366 | static SOC_ENUM_SINGLE_DECL(da9055_dac_ng_rampup_rate, |
365 | SOC_ENUM_SINGLE(DA9055_DAC_NG_SETUP_TIME, 2, 2, | 367 | DA9055_DAC_NG_SETUP_TIME, 2, |
366 | da9055_dac_ng_rampup_txt); | 368 | da9055_dac_ng_rampup_txt); |
367 | 369 | ||
368 | /* DAC noise gate rampdown rate value */ | 370 | /* DAC noise gate rampdown rate value */ |
369 | static const char * const da9055_dac_ng_rampdown_txt[] = { | 371 | static const char * const da9055_dac_ng_rampdown_txt[] = { |
370 | "0.64 ms/dB", "20.48 ms/dB" | 372 | "0.64 ms/dB", "20.48 ms/dB" |
371 | }; | 373 | }; |
372 | 374 | ||
373 | static const struct soc_enum da9055_dac_ng_rampdown_rate = | 375 | static SOC_ENUM_SINGLE_DECL(da9055_dac_ng_rampdown_rate, |
374 | SOC_ENUM_SINGLE(DA9055_DAC_NG_SETUP_TIME, 3, 2, | 376 | DA9055_DAC_NG_SETUP_TIME, 3, |
375 | da9055_dac_ng_rampdown_txt); | 377 | da9055_dac_ng_rampdown_txt); |
376 | 378 | ||
377 | /* DAC soft mute rate value */ | 379 | /* DAC soft mute rate value */ |
378 | static const char * const da9055_dac_soft_mute_rate_txt[] = { | 380 | static const char * const da9055_dac_soft_mute_rate_txt[] = { |
379 | "1", "2", "4", "8", "16", "32", "64" | 381 | "1", "2", "4", "8", "16", "32", "64" |
380 | }; | 382 | }; |
381 | 383 | ||
382 | static const struct soc_enum da9055_dac_soft_mute_rate = | 384 | static SOC_ENUM_SINGLE_DECL(da9055_dac_soft_mute_rate, |
383 | SOC_ENUM_SINGLE(DA9055_DAC_FILTERS5, 4, 7, | 385 | DA9055_DAC_FILTERS5, 4, |
384 | da9055_dac_soft_mute_rate_txt); | 386 | da9055_dac_soft_mute_rate_txt); |
385 | 387 | ||
386 | /* DAC routing select */ | 388 | /* DAC routing select */ |
387 | static const char * const da9055_dac_src_txt[] = { | 389 | static const char * const da9055_dac_src_txt[] = { |
@@ -389,40 +391,40 @@ static const char * const da9055_dac_src_txt[] = { | |||
389 | "AIF input right" | 391 | "AIF input right" |
390 | }; | 392 | }; |
391 | 393 | ||
392 | static const struct soc_enum da9055_dac_l_src = | 394 | static SOC_ENUM_SINGLE_DECL(da9055_dac_l_src, |
393 | SOC_ENUM_SINGLE(DA9055_DIG_ROUTING_DAC, 0, 4, da9055_dac_src_txt); | 395 | DA9055_DIG_ROUTING_DAC, 0, da9055_dac_src_txt); |
394 | 396 | ||
395 | static const struct soc_enum da9055_dac_r_src = | 397 | static SOC_ENUM_SINGLE_DECL(da9055_dac_r_src, |
396 | SOC_ENUM_SINGLE(DA9055_DIG_ROUTING_DAC, 4, 4, da9055_dac_src_txt); | 398 | DA9055_DIG_ROUTING_DAC, 4, da9055_dac_src_txt); |
397 | 399 | ||
398 | /* MIC PGA Left source select */ | 400 | /* MIC PGA Left source select */ |
399 | static const char * const da9055_mic_l_src_txt[] = { | 401 | static const char * const da9055_mic_l_src_txt[] = { |
400 | "MIC1_P_N", "MIC1_P", "MIC1_N", "MIC2_L" | 402 | "MIC1_P_N", "MIC1_P", "MIC1_N", "MIC2_L" |
401 | }; | 403 | }; |
402 | 404 | ||
403 | static const struct soc_enum da9055_mic_l_src = | 405 | static SOC_ENUM_SINGLE_DECL(da9055_mic_l_src, |
404 | SOC_ENUM_SINGLE(DA9055_MIXIN_L_SELECT, 4, 4, da9055_mic_l_src_txt); | 406 | DA9055_MIXIN_L_SELECT, 4, da9055_mic_l_src_txt); |
405 | 407 | ||
406 | /* MIC PGA Right source select */ | 408 | /* MIC PGA Right source select */ |
407 | static const char * const da9055_mic_r_src_txt[] = { | 409 | static const char * const da9055_mic_r_src_txt[] = { |
408 | "MIC2_R_L", "MIC2_R", "MIC2_L" | 410 | "MIC2_R_L", "MIC2_R", "MIC2_L" |
409 | }; | 411 | }; |
410 | 412 | ||
411 | static const struct soc_enum da9055_mic_r_src = | 413 | static SOC_ENUM_SINGLE_DECL(da9055_mic_r_src, |
412 | SOC_ENUM_SINGLE(DA9055_MIXIN_R_SELECT, 4, 3, da9055_mic_r_src_txt); | 414 | DA9055_MIXIN_R_SELECT, 4, da9055_mic_r_src_txt); |
413 | 415 | ||
414 | /* ALC Input Signal Tracking rate select */ | 416 | /* ALC Input Signal Tracking rate select */ |
415 | static const char * const da9055_signal_tracking_rate_txt[] = { | 417 | static const char * const da9055_signal_tracking_rate_txt[] = { |
416 | "1/4", "1/16", "1/256", "1/65536" | 418 | "1/4", "1/16", "1/256", "1/65536" |
417 | }; | 419 | }; |
418 | 420 | ||
419 | static const struct soc_enum da9055_integ_attack_rate = | 421 | static SOC_ENUM_SINGLE_DECL(da9055_integ_attack_rate, |
420 | SOC_ENUM_SINGLE(DA9055_ALC_CTRL3, 4, 4, | 422 | DA9055_ALC_CTRL3, 4, |
421 | da9055_signal_tracking_rate_txt); | 423 | da9055_signal_tracking_rate_txt); |
422 | 424 | ||
423 | static const struct soc_enum da9055_integ_release_rate = | 425 | static SOC_ENUM_SINGLE_DECL(da9055_integ_release_rate, |
424 | SOC_ENUM_SINGLE(DA9055_ALC_CTRL3, 6, 4, | 426 | DA9055_ALC_CTRL3, 6, |
425 | da9055_signal_tracking_rate_txt); | 427 | da9055_signal_tracking_rate_txt); |
426 | 428 | ||
427 | /* ALC Attack Rate select */ | 429 | /* ALC Attack Rate select */ |
428 | static const char * const da9055_attack_rate_txt[] = { | 430 | static const char * const da9055_attack_rate_txt[] = { |
@@ -430,8 +432,8 @@ static const char * const da9055_attack_rate_txt[] = { | |||
430 | "5632/fs", "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs" | 432 | "5632/fs", "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs" |
431 | }; | 433 | }; |
432 | 434 | ||
433 | static const struct soc_enum da9055_attack_rate = | 435 | static SOC_ENUM_SINGLE_DECL(da9055_attack_rate, |
434 | SOC_ENUM_SINGLE(DA9055_ALC_CTRL2, 0, 13, da9055_attack_rate_txt); | 436 | DA9055_ALC_CTRL2, 0, da9055_attack_rate_txt); |
435 | 437 | ||
436 | /* ALC Release Rate select */ | 438 | /* ALC Release Rate select */ |
437 | static const char * const da9055_release_rate_txt[] = { | 439 | static const char * const da9055_release_rate_txt[] = { |
@@ -439,8 +441,8 @@ static const char * const da9055_release_rate_txt[] = { | |||
439 | "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs" | 441 | "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs" |
440 | }; | 442 | }; |
441 | 443 | ||
442 | static const struct soc_enum da9055_release_rate = | 444 | static SOC_ENUM_SINGLE_DECL(da9055_release_rate, |
443 | SOC_ENUM_SINGLE(DA9055_ALC_CTRL2, 4, 11, da9055_release_rate_txt); | 445 | DA9055_ALC_CTRL2, 4, da9055_release_rate_txt); |
444 | 446 | ||
445 | /* ALC Hold Time select */ | 447 | /* ALC Hold Time select */ |
446 | static const char * const da9055_hold_time_txt[] = { | 448 | static const char * const da9055_hold_time_txt[] = { |
@@ -449,8 +451,8 @@ static const char * const da9055_hold_time_txt[] = { | |||
449 | "253952/fs", "507904/fs", "1015808/fs", "2031616/fs" | 451 | "253952/fs", "507904/fs", "1015808/fs", "2031616/fs" |
450 | }; | 452 | }; |
451 | 453 | ||
452 | static const struct soc_enum da9055_hold_time = | 454 | static SOC_ENUM_SINGLE_DECL(da9055_hold_time, |
453 | SOC_ENUM_SINGLE(DA9055_ALC_CTRL3, 0, 16, da9055_hold_time_txt); | 455 | DA9055_ALC_CTRL3, 0, da9055_hold_time_txt); |
454 | 456 | ||
455 | static int da9055_get_alc_data(struct snd_soc_codec *codec, u8 reg_val) | 457 | static int da9055_get_alc_data(struct snd_soc_codec *codec, u8 reg_val) |
456 | { | 458 | { |
@@ -1523,17 +1525,30 @@ static int da9055_remove(struct i2c_client *client) | |||
1523 | return 0; | 1525 | return 0; |
1524 | } | 1526 | } |
1525 | 1527 | ||
1528 | /* | ||
1529 | * DO NOT change the device Ids. The naming is intentionally specific as both | ||
1530 | * the CODEC and PMIC parts of this chip are instantiated separately as I2C | ||
1531 | * devices (both have configurable I2C addresses, and are to all intents and | ||
1532 | * purposes separate). As a result there are specific DA9055 Ids for CODEC | ||
1533 | * and PMIC, which must be different to operate together. | ||
1534 | */ | ||
1526 | static const struct i2c_device_id da9055_i2c_id[] = { | 1535 | static const struct i2c_device_id da9055_i2c_id[] = { |
1527 | { "da9055", 0 }, | 1536 | { "da9055-codec", 0 }, |
1528 | { } | 1537 | { } |
1529 | }; | 1538 | }; |
1530 | MODULE_DEVICE_TABLE(i2c, da9055_i2c_id); | 1539 | MODULE_DEVICE_TABLE(i2c, da9055_i2c_id); |
1531 | 1540 | ||
1541 | static const struct of_device_id da9055_of_match[] = { | ||
1542 | { .compatible = "dlg,da9055-codec", }, | ||
1543 | { } | ||
1544 | }; | ||
1545 | |||
1532 | /* I2C codec control layer */ | 1546 | /* I2C codec control layer */ |
1533 | static struct i2c_driver da9055_i2c_driver = { | 1547 | static struct i2c_driver da9055_i2c_driver = { |
1534 | .driver = { | 1548 | .driver = { |
1535 | .name = "da9055", | 1549 | .name = "da9055-codec", |
1536 | .owner = THIS_MODULE, | 1550 | .owner = THIS_MODULE, |
1551 | .of_match_table = of_match_ptr(da9055_of_match), | ||
1537 | }, | 1552 | }, |
1538 | .probe = da9055_i2c_probe, | 1553 | .probe = da9055_i2c_probe, |
1539 | .remove = da9055_remove, | 1554 | .remove = da9055_remove, |