diff options
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/cs4270.c | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/sound/soc/codecs/cs4270.c b/sound/soc/codecs/cs4270.c index 7962874258fb..2c79a24186fd 100644 --- a/sound/soc/codecs/cs4270.c +++ b/sound/soc/codecs/cs4270.c | |||
@@ -212,7 +212,7 @@ static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai, | |||
212 | rates &= ~SNDRV_PCM_RATE_KNOT; | 212 | rates &= ~SNDRV_PCM_RATE_KNOT; |
213 | 213 | ||
214 | if (!rates) { | 214 | if (!rates) { |
215 | printk(KERN_ERR "cs4270: could not find a valid sample rate\n"); | 215 | dev_err(codec->dev, "could not find a valid sample rate\n"); |
216 | return -EINVAL; | 216 | return -EINVAL; |
217 | } | 217 | } |
218 | 218 | ||
@@ -253,7 +253,7 @@ static int cs4270_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
253 | cs4270->mode = format & SND_SOC_DAIFMT_FORMAT_MASK; | 253 | cs4270->mode = format & SND_SOC_DAIFMT_FORMAT_MASK; |
254 | break; | 254 | break; |
255 | default: | 255 | default: |
256 | printk(KERN_ERR "cs4270: invalid DAI format\n"); | 256 | dev_err(codec->dev, "invalid dai format\n"); |
257 | ret = -EINVAL; | 257 | ret = -EINVAL; |
258 | } | 258 | } |
259 | 259 | ||
@@ -284,7 +284,7 @@ static int cs4270_fill_cache(struct snd_soc_codec *codec) | |||
284 | CS4270_FIRSTREG | 0x80, CS4270_NUMREGS, cache); | 284 | CS4270_FIRSTREG | 0x80, CS4270_NUMREGS, cache); |
285 | 285 | ||
286 | if (length != CS4270_NUMREGS) { | 286 | if (length != CS4270_NUMREGS) { |
287 | printk(KERN_ERR "cs4270: I2C read failure, addr=0x%x\n", | 287 | dev_err(codec->dev, "i2c read failure, addr=0x%x\n", |
288 | i2c_client->addr); | 288 | i2c_client->addr); |
289 | return -EIO; | 289 | return -EIO; |
290 | } | 290 | } |
@@ -340,7 +340,7 @@ static int cs4270_i2c_write(struct snd_soc_codec *codec, unsigned int reg, | |||
340 | if (cache[reg - CS4270_FIRSTREG] != value) { | 340 | if (cache[reg - CS4270_FIRSTREG] != value) { |
341 | struct i2c_client *client = codec->control_data; | 341 | struct i2c_client *client = codec->control_data; |
342 | if (i2c_smbus_write_byte_data(client, reg, value)) { | 342 | if (i2c_smbus_write_byte_data(client, reg, value)) { |
343 | printk(KERN_ERR "cs4270: I2C write failed\n"); | 343 | dev_err(codec->dev, "i2c write failed\n"); |
344 | return -EIO; | 344 | return -EIO; |
345 | } | 345 | } |
346 | 346 | ||
@@ -391,7 +391,7 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, | |||
391 | 391 | ||
392 | if (i == NUM_MCLK_RATIOS) { | 392 | if (i == NUM_MCLK_RATIOS) { |
393 | /* We did not find a matching ratio */ | 393 | /* We did not find a matching ratio */ |
394 | printk(KERN_ERR "cs4270: could not find matching ratio\n"); | 394 | dev_err(codec->dev, "could not find matching ratio\n"); |
395 | return -EINVAL; | 395 | return -EINVAL; |
396 | } | 396 | } |
397 | 397 | ||
@@ -401,7 +401,7 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, | |||
401 | CS4270_PWRCTL_PDN_ADC | CS4270_PWRCTL_PDN_DAC | | 401 | CS4270_PWRCTL_PDN_ADC | CS4270_PWRCTL_PDN_DAC | |
402 | CS4270_PWRCTL_PDN); | 402 | CS4270_PWRCTL_PDN); |
403 | if (ret < 0) { | 403 | if (ret < 0) { |
404 | printk(KERN_ERR "cs4270: I2C write failed\n"); | 404 | dev_err(codec->dev, "i2c write failed\n"); |
405 | return ret; | 405 | return ret; |
406 | } | 406 | } |
407 | 407 | ||
@@ -413,7 +413,7 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, | |||
413 | 413 | ||
414 | ret = snd_soc_write(codec, CS4270_MODE, reg); | 414 | ret = snd_soc_write(codec, CS4270_MODE, reg); |
415 | if (ret < 0) { | 415 | if (ret < 0) { |
416 | printk(KERN_ERR "cs4270: I2C write failed\n"); | 416 | dev_err(codec->dev, "i2c write failed\n"); |
417 | return ret; | 417 | return ret; |
418 | } | 418 | } |
419 | 419 | ||
@@ -430,13 +430,13 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, | |||
430 | reg |= CS4270_FORMAT_DAC_LJ | CS4270_FORMAT_ADC_LJ; | 430 | reg |= CS4270_FORMAT_DAC_LJ | CS4270_FORMAT_ADC_LJ; |
431 | break; | 431 | break; |
432 | default: | 432 | default: |
433 | printk(KERN_ERR "cs4270: unknown format\n"); | 433 | dev_err(codec->dev, "unknown dai format\n"); |
434 | return -EINVAL; | 434 | return -EINVAL; |
435 | } | 435 | } |
436 | 436 | ||
437 | ret = snd_soc_write(codec, CS4270_FORMAT, reg); | 437 | ret = snd_soc_write(codec, CS4270_FORMAT, reg); |
438 | if (ret < 0) { | 438 | if (ret < 0) { |
439 | printk(KERN_ERR "cs4270: I2C write failed\n"); | 439 | dev_err(codec->dev, "i2c write failed\n"); |
440 | return ret; | 440 | return ret; |
441 | } | 441 | } |
442 | 442 | ||
@@ -447,7 +447,7 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, | |||
447 | reg &= ~CS4270_MUTE_AUTO; | 447 | reg &= ~CS4270_MUTE_AUTO; |
448 | ret = snd_soc_write(codec, CS4270_MUTE, reg); | 448 | ret = snd_soc_write(codec, CS4270_MUTE, reg); |
449 | if (ret < 0) { | 449 | if (ret < 0) { |
450 | printk(KERN_ERR "cs4270: I2C write failed\n"); | 450 | dev_err(codec->dev, "i2c write failed\n"); |
451 | return ret; | 451 | return ret; |
452 | } | 452 | } |
453 | 453 | ||
@@ -460,7 +460,7 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, | |||
460 | reg &= ~(CS4270_TRANS_SOFT | CS4270_TRANS_ZERO); | 460 | reg &= ~(CS4270_TRANS_SOFT | CS4270_TRANS_ZERO); |
461 | ret = cs4270_i2c_write(codec, CS4270_TRANS, reg); | 461 | ret = cs4270_i2c_write(codec, CS4270_TRANS, reg); |
462 | if (ret < 0) { | 462 | if (ret < 0) { |
463 | printk(KERN_ERR "I2C write failed\n"); | 463 | dev_err(codec->dev, "i2c write failed\n"); |
464 | return ret; | 464 | return ret; |
465 | } | 465 | } |
466 | 466 | ||
@@ -468,7 +468,7 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, | |||
468 | 468 | ||
469 | ret = snd_soc_write(codec, CS4270_PWRCTL, 0); | 469 | ret = snd_soc_write(codec, CS4270_PWRCTL, 0); |
470 | if (ret < 0) { | 470 | if (ret < 0) { |
471 | printk(KERN_ERR "cs4270: I2C write failed\n"); | 471 | dev_err(codec->dev, "i2c write failed\n"); |
472 | return ret; | 472 | return ret; |
473 | } | 473 | } |
474 | 474 | ||
@@ -570,7 +570,7 @@ static int cs4270_probe(struct platform_device *pdev) | |||
570 | /* Register PCMs */ | 570 | /* Register PCMs */ |
571 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); | 571 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); |
572 | if (ret < 0) { | 572 | if (ret < 0) { |
573 | printk(KERN_ERR "cs4270: failed to create PCMs\n"); | 573 | dev_err(codec->dev, "failed to create pcms\n"); |
574 | return ret; | 574 | return ret; |
575 | } | 575 | } |
576 | 576 | ||
@@ -580,7 +580,7 @@ static int cs4270_probe(struct platform_device *pdev) | |||
580 | 580 | ||
581 | kctrl = snd_soc_cnew(&cs4270_snd_controls[i], codec, NULL); | 581 | kctrl = snd_soc_cnew(&cs4270_snd_controls[i], codec, NULL); |
582 | if (!kctrl) { | 582 | if (!kctrl) { |
583 | printk(KERN_ERR "cs4270: error creating control '%s'\n", | 583 | dev_err(codec->dev, "error creating control '%s'\n", |
584 | cs4270_snd_controls[i].name); | 584 | cs4270_snd_controls[i].name); |
585 | ret = -ENOMEM; | 585 | ret = -ENOMEM; |
586 | goto error_free_pcms; | 586 | goto error_free_pcms; |
@@ -588,7 +588,7 @@ static int cs4270_probe(struct platform_device *pdev) | |||
588 | 588 | ||
589 | ret = snd_ctl_add(codec->card, kctrl); | 589 | ret = snd_ctl_add(codec->card, kctrl); |
590 | if (ret < 0) { | 590 | if (ret < 0) { |
591 | printk(KERN_ERR "cs4270: error adding control '%s'\n", | 591 | dev_err(codec->dev, "error adding control '%s'\n", |
592 | cs4270_snd_controls[i].name); | 592 | cs4270_snd_controls[i].name); |
593 | goto error_free_pcms; | 593 | goto error_free_pcms; |
594 | } | 594 | } |
@@ -597,7 +597,7 @@ static int cs4270_probe(struct platform_device *pdev) | |||
597 | /* And finally, register the socdev */ | 597 | /* And finally, register the socdev */ |
598 | ret = snd_soc_init_card(socdev); | 598 | ret = snd_soc_init_card(socdev); |
599 | if (ret < 0) { | 599 | if (ret < 0) { |
600 | printk(KERN_ERR "cs4270: failed to register card\n"); | 600 | dev_err(codec->dev, "failed to register card\n"); |
601 | goto error_free_pcms; | 601 | goto error_free_pcms; |
602 | } | 602 | } |
603 | 603 | ||
@@ -643,9 +643,9 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client, | |||
643 | * comment for cs4270_codec. | 643 | * comment for cs4270_codec. |
644 | */ | 644 | */ |
645 | if (cs4270_codec) { | 645 | if (cs4270_codec) { |
646 | printk(KERN_ERR "cs4270: ignoring CS4270 at addr %X\n", | 646 | dev_err(&i2c_client->dev, "ignoring CS4270 at addr %X\n", |
647 | i2c_client->addr); | 647 | i2c_client->addr); |
648 | printk(KERN_ERR "cs4270: only one CS4270 per board allowed\n"); | 648 | dev_err(&i2c_client->dev, "only one per board allowed\n"); |
649 | /* Should we return something other than ENODEV here? */ | 649 | /* Should we return something other than ENODEV here? */ |
650 | return -ENODEV; | 650 | return -ENODEV; |
651 | } | 651 | } |
@@ -654,35 +654,35 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client, | |||
654 | 654 | ||
655 | ret = i2c_smbus_read_byte_data(i2c_client, CS4270_CHIPID); | 655 | ret = i2c_smbus_read_byte_data(i2c_client, CS4270_CHIPID); |
656 | if (ret < 0) { | 656 | if (ret < 0) { |
657 | printk(KERN_ERR "cs4270: failed to read I2C at addr %X\n", | 657 | dev_err(&i2c_client->dev, "failed to read i2c at addr %X\n", |
658 | i2c_client->addr); | 658 | i2c_client->addr); |
659 | return ret; | 659 | return ret; |
660 | } | 660 | } |
661 | /* The top four bits of the chip ID should be 1100. */ | 661 | /* The top four bits of the chip ID should be 1100. */ |
662 | if ((ret & 0xF0) != 0xC0) { | 662 | if ((ret & 0xF0) != 0xC0) { |
663 | printk(KERN_ERR "cs4270: device at addr %X is not a CS4270\n", | 663 | dev_err(&i2c_client->dev, "device at addr %X is not a CS4270\n", |
664 | i2c_client->addr); | 664 | i2c_client->addr); |
665 | return -ENODEV; | 665 | return -ENODEV; |
666 | } | 666 | } |
667 | 667 | ||
668 | printk(KERN_INFO "cs4270: found device at I2C address %X\n", | 668 | dev_info(&i2c_client->dev, "found device at i2c address %X\n", |
669 | i2c_client->addr); | 669 | i2c_client->addr); |
670 | printk(KERN_INFO "cs4270: hardware revision %X\n", ret & 0xF); | 670 | dev_info(&i2c_client->dev, "hardware revision %X\n", ret & 0xF); |
671 | 671 | ||
672 | /* Allocate enough space for the snd_soc_codec structure | 672 | /* Allocate enough space for the snd_soc_codec structure |
673 | and our private data together. */ | 673 | and our private data together. */ |
674 | cs4270 = kzalloc(sizeof(struct cs4270_private), GFP_KERNEL); | 674 | cs4270 = kzalloc(sizeof(struct cs4270_private), GFP_KERNEL); |
675 | if (!cs4270) { | 675 | if (!cs4270) { |
676 | printk(KERN_ERR "cs4270: Could not allocate codec structure\n"); | 676 | dev_err(&i2c_client->dev, "could not allocate codec\n"); |
677 | return -ENOMEM; | 677 | return -ENOMEM; |
678 | } | 678 | } |
679 | codec = &cs4270->codec; | 679 | codec = &cs4270->codec; |
680 | cs4270_codec = codec; | ||
681 | 680 | ||
682 | mutex_init(&codec->mutex); | 681 | mutex_init(&codec->mutex); |
683 | INIT_LIST_HEAD(&codec->dapm_widgets); | 682 | INIT_LIST_HEAD(&codec->dapm_widgets); |
684 | INIT_LIST_HEAD(&codec->dapm_paths); | 683 | INIT_LIST_HEAD(&codec->dapm_paths); |
685 | 684 | ||
685 | codec->dev = &i2c_client->dev; | ||
686 | codec->name = "CS4270"; | 686 | codec->name = "CS4270"; |
687 | codec->owner = THIS_MODULE; | 687 | codec->owner = THIS_MODULE; |
688 | codec->dai = &cs4270_dai; | 688 | codec->dai = &cs4270_dai; |
@@ -698,17 +698,25 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client, | |||
698 | 698 | ||
699 | ret = cs4270_fill_cache(codec); | 699 | ret = cs4270_fill_cache(codec); |
700 | if (ret < 0) { | 700 | if (ret < 0) { |
701 | printk(KERN_ERR "cs4270: failed to fill register cache\n"); | 701 | dev_err(&i2c_client->dev, "failed to fill register cache\n"); |
702 | goto error_free_codec; | 702 | goto error_free_codec; |
703 | } | 703 | } |
704 | 704 | ||
705 | /* Initialize the DAI. Normally, we'd prefer to have a kmalloc'd DAI | ||
706 | * structure for each CS4270 device, but the machine driver needs to | ||
707 | * have a pointer to the DAI structure, so for now it must be a global | ||
708 | * variable. | ||
709 | */ | ||
710 | cs4270_dai.dev = &i2c_client->dev; | ||
711 | |||
705 | /* Register the DAI. If all the other ASoC driver have already | 712 | /* Register the DAI. If all the other ASoC driver have already |
706 | * registered, then this will call our probe function, so | 713 | * registered, then this will call our probe function, so |
707 | * cs4270_codec needs to be ready. | 714 | * cs4270_codec needs to be ready. |
708 | */ | 715 | */ |
716 | cs4270_codec = codec; | ||
709 | ret = snd_soc_register_dai(&cs4270_dai); | 717 | ret = snd_soc_register_dai(&cs4270_dai); |
710 | if (ret < 0) { | 718 | if (ret < 0) { |
711 | printk(KERN_ERR "cs4270: failed to register DAIe\n"); | 719 | dev_err(&i2c_client->dev, "failed to register DAIe\n"); |
712 | goto error_free_codec; | 720 | goto error_free_codec; |
713 | } | 721 | } |
714 | 722 | ||
@@ -718,6 +726,8 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client, | |||
718 | 726 | ||
719 | error_free_codec: | 727 | error_free_codec: |
720 | kfree(cs4270); | 728 | kfree(cs4270); |
729 | cs4270_codec = NULL; | ||
730 | cs4270_dai.dev = NULL; | ||
721 | 731 | ||
722 | return ret; | 732 | return ret; |
723 | } | 733 | } |
@@ -733,6 +743,8 @@ static int cs4270_i2c_remove(struct i2c_client *i2c_client) | |||
733 | struct cs4270_private *cs4270 = i2c_get_clientdata(i2c_client); | 743 | struct cs4270_private *cs4270 = i2c_get_clientdata(i2c_client); |
734 | 744 | ||
735 | kfree(cs4270); | 745 | kfree(cs4270); |
746 | cs4270_codec = NULL; | ||
747 | cs4270_dai.dev = NULL; | ||
736 | 748 | ||
737 | return 0; | 749 | return 0; |
738 | } | 750 | } |
@@ -776,7 +788,7 @@ EXPORT_SYMBOL_GPL(soc_codec_device_cs4270); | |||
776 | 788 | ||
777 | static int __init cs4270_init(void) | 789 | static int __init cs4270_init(void) |
778 | { | 790 | { |
779 | printk(KERN_INFO "Cirrus Logic CS4270 ALSA SoC Codec Driver\n"); | 791 | pr_info("Cirrus Logic CS4270 ALSA SoC Codec Driver\n"); |
780 | 792 | ||
781 | return i2c_add_driver(&cs4270_i2c_driver); | 793 | return i2c_add_driver(&cs4270_i2c_driver); |
782 | } | 794 | } |