diff options
| author | Daniel Mack <zonque@gmail.com> | 2013-10-01 08:48:25 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@linaro.org> | 2013-10-03 09:14:37 -0400 |
| commit | d5fd3ccc2d9df493ad6f1eaf7aba72f690e98937 (patch) | |
| tree | e32d896baf377e744f430847f4d40b858c22a779 | |
| parent | 648c538204c23370c734d72921155cc24aff928d (diff) | |
ASoC: tas5086: move initialization code to own functions
We'll need to call code to initialize and reset the codec again at
resume time, so factor it out first.
Signed-off-by: Daniel Mack <zonque@gmail.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
| -rw-r--r-- | sound/soc/codecs/tas5086.c | 128 |
1 files changed, 72 insertions, 56 deletions
diff --git a/sound/soc/codecs/tas5086.c b/sound/soc/codecs/tas5086.c index 31b5868ef7c1..3a88c68145c2 100644 --- a/sound/soc/codecs/tas5086.c +++ b/sound/soc/codecs/tas5086.c | |||
| @@ -458,6 +458,75 @@ static int tas5086_mute_stream(struct snd_soc_dai *dai, int mute, int stream) | |||
| 458 | return regmap_write(priv->regmap, TAS5086_SOFT_MUTE, val); | 458 | return regmap_write(priv->regmap, TAS5086_SOFT_MUTE, val); |
| 459 | } | 459 | } |
| 460 | 460 | ||
| 461 | static void tas5086_reset(struct tas5086_private *priv) | ||
| 462 | { | ||
| 463 | if (gpio_is_valid(priv->gpio_nreset)) { | ||
| 464 | /* Reset codec - minimum assertion time is 400ns */ | ||
| 465 | gpio_direction_output(priv->gpio_nreset, 0); | ||
| 466 | udelay(1); | ||
| 467 | gpio_set_value(priv->gpio_nreset, 1); | ||
| 468 | |||
| 469 | /* Codec needs ~15ms to wake up */ | ||
| 470 | msleep(15); | ||
| 471 | } | ||
| 472 | } | ||
| 473 | |||
| 474 | /* charge period values in microseconds */ | ||
| 475 | static const int tas5086_charge_period[] = { | ||
| 476 | 13000, 16900, 23400, 31200, 41600, 54600, 72800, 96200, | ||
| 477 | 130000, 156000, 234000, 312000, 416000, 546000, 728000, 962000, | ||
| 478 | 1300000, 169000, 2340000, 3120000, 4160000, 5460000, 7280000, 9620000, | ||
| 479 | }; | ||
| 480 | |||
| 481 | static int tas5086_init(struct device *dev, struct tas5086_private *priv) | ||
| 482 | { | ||
| 483 | int ret, i; | ||
| 484 | |||
| 485 | /* | ||
| 486 | * If any of the channels is configured to start in Mid-Z mode, | ||
| 487 | * configure 'part 1' of the PWM starts to use Mid-Z, and tell | ||
| 488 | * all configured mid-z channels to start start under 'part 1'. | ||
| 489 | */ | ||
| 490 | if (priv->pwm_start_mid_z) | ||
| 491 | regmap_write(priv->regmap, TAS5086_PWM_START, | ||
| 492 | TAS5086_PWM_START_MIDZ_FOR_START_1 | | ||
| 493 | priv->pwm_start_mid_z); | ||
| 494 | |||
| 495 | /* lookup and set split-capacitor charge period */ | ||
| 496 | if (priv->charge_period == 0) { | ||
| 497 | regmap_write(priv->regmap, TAS5086_SPLIT_CAP_CHARGE, 0); | ||
| 498 | } else { | ||
| 499 | i = index_in_array(tas5086_charge_period, | ||
| 500 | ARRAY_SIZE(tas5086_charge_period), | ||
| 501 | priv->charge_period); | ||
| 502 | if (i >= 0) | ||
| 503 | regmap_write(priv->regmap, TAS5086_SPLIT_CAP_CHARGE, | ||
| 504 | i + 0x08); | ||
| 505 | else | ||
| 506 | dev_warn(dev, | ||
| 507 | "Invalid split-cap charge period of %d ns.\n", | ||
| 508 | priv->charge_period); | ||
| 509 | } | ||
| 510 | |||
| 511 | /* enable factory trim */ | ||
| 512 | ret = regmap_write(priv->regmap, TAS5086_OSC_TRIM, 0x00); | ||
| 513 | if (ret < 0) | ||
| 514 | return ret; | ||
| 515 | |||
| 516 | /* start all channels */ | ||
| 517 | ret = regmap_write(priv->regmap, TAS5086_SYS_CONTROL_2, 0x20); | ||
| 518 | if (ret < 0) | ||
| 519 | return ret; | ||
| 520 | |||
| 521 | /* mute all channels for now */ | ||
| 522 | ret = regmap_write(priv->regmap, TAS5086_SOFT_MUTE, | ||
| 523 | TAS5086_SOFT_MUTE_ALL); | ||
| 524 | if (ret < 0) | ||
| 525 | return ret; | ||
| 526 | |||
| 527 | return 0; | ||
| 528 | } | ||
| 529 | |||
| 461 | /* TAS5086 controls */ | 530 | /* TAS5086 controls */ |
| 462 | static const DECLARE_TLV_DB_SCALE(tas5086_dac_tlv, -10350, 50, 1); | 531 | static const DECLARE_TLV_DB_SCALE(tas5086_dac_tlv, -10350, 50, 1); |
| 463 | 532 | ||
| @@ -712,13 +781,6 @@ static const struct of_device_id tas5086_dt_ids[] = { | |||
| 712 | MODULE_DEVICE_TABLE(of, tas5086_dt_ids); | 781 | MODULE_DEVICE_TABLE(of, tas5086_dt_ids); |
| 713 | #endif | 782 | #endif |
| 714 | 783 | ||
| 715 | /* charge period values in microseconds */ | ||
| 716 | static const int tas5086_charge_period[] = { | ||
| 717 | 13000, 16900, 23400, 31200, 41600, 54600, 72800, 96200, | ||
| 718 | 130000, 156000, 234000, 312000, 416000, 546000, 728000, 962000, | ||
| 719 | 1300000, 169000, 2340000, 3120000, 4160000, 5460000, 7280000, 9620000, | ||
| 720 | }; | ||
| 721 | |||
| 722 | static int tas5086_probe(struct snd_soc_codec *codec) | 784 | static int tas5086_probe(struct snd_soc_codec *codec) |
| 723 | { | 785 | { |
| 724 | struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); | 786 | struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); |
| @@ -729,6 +791,7 @@ static int tas5086_probe(struct snd_soc_codec *codec) | |||
| 729 | 791 | ||
| 730 | if (of_match_device(of_match_ptr(tas5086_dt_ids), codec->dev)) { | 792 | if (of_match_device(of_match_ptr(tas5086_dt_ids), codec->dev)) { |
| 731 | struct device_node *of_node = codec->dev->of_node; | 793 | struct device_node *of_node = codec->dev->of_node; |
| 794 | |||
| 732 | of_property_read_u32(of_node, "ti,charge-period", | 795 | of_property_read_u32(of_node, "ti,charge-period", |
| 733 | &priv->charge_period); | 796 | &priv->charge_period); |
| 734 | 797 | ||
| @@ -743,39 +806,7 @@ static int tas5086_probe(struct snd_soc_codec *codec) | |||
| 743 | } | 806 | } |
| 744 | } | 807 | } |
| 745 | 808 | ||
| 746 | /* | 809 | ret = tas5086_init(codec->dev, priv); |
| 747 | * If any of the channels is configured to start in Mid-Z mode, | ||
| 748 | * configure 'part 1' of the PWM starts to use Mid-Z, and tell | ||
| 749 | * all configured mid-z channels to start start under 'part 1'. | ||
| 750 | */ | ||
| 751 | if (priv->pwm_start_mid_z) | ||
| 752 | regmap_write(priv->regmap, TAS5086_PWM_START, | ||
| 753 | TAS5086_PWM_START_MIDZ_FOR_START_1 | | ||
| 754 | priv->pwm_start_mid_z); | ||
| 755 | |||
| 756 | /* lookup and set split-capacitor charge period */ | ||
| 757 | if (priv->charge_period == 0) { | ||
| 758 | regmap_write(priv->regmap, TAS5086_SPLIT_CAP_CHARGE, 0); | ||
| 759 | } else { | ||
| 760 | i = index_in_array(tas5086_charge_period, | ||
| 761 | ARRAY_SIZE(tas5086_charge_period), | ||
| 762 | priv->charge_period); | ||
| 763 | if (i >= 0) | ||
| 764 | regmap_write(priv->regmap, TAS5086_SPLIT_CAP_CHARGE, | ||
| 765 | i + 0x08); | ||
| 766 | else | ||
| 767 | dev_warn(codec->dev, | ||
| 768 | "Invalid split-cap charge period of %d ns.\n", | ||
| 769 | priv->charge_period); | ||
| 770 | } | ||
| 771 | |||
| 772 | /* enable factory trim */ | ||
| 773 | ret = regmap_write(priv->regmap, TAS5086_OSC_TRIM, 0x00); | ||
| 774 | if (ret < 0) | ||
| 775 | return ret; | ||
| 776 | |||
| 777 | /* start all channels */ | ||
| 778 | ret = regmap_write(priv->regmap, TAS5086_SYS_CONTROL_2, 0x20); | ||
| 779 | if (ret < 0) | 810 | if (ret < 0) |
| 780 | return ret; | 811 | return ret; |
| 781 | 812 | ||
| @@ -784,12 +815,6 @@ static int tas5086_probe(struct snd_soc_codec *codec) | |||
| 784 | if (ret < 0) | 815 | if (ret < 0) |
| 785 | return ret; | 816 | return ret; |
| 786 | 817 | ||
| 787 | /* mute all channels for now */ | ||
| 788 | ret = regmap_write(priv->regmap, TAS5086_SOFT_MUTE, | ||
| 789 | TAS5086_SOFT_MUTE_ALL); | ||
| 790 | if (ret < 0) | ||
| 791 | return ret; | ||
| 792 | |||
| 793 | return 0; | 818 | return 0; |
| 794 | } | 819 | } |
| 795 | 820 | ||
| @@ -866,17 +891,8 @@ static int tas5086_i2c_probe(struct i2c_client *i2c, | |||
| 866 | if (devm_gpio_request(dev, gpio_nreset, "TAS5086 Reset")) | 891 | if (devm_gpio_request(dev, gpio_nreset, "TAS5086 Reset")) |
| 867 | gpio_nreset = -EINVAL; | 892 | gpio_nreset = -EINVAL; |
| 868 | 893 | ||
| 869 | if (gpio_is_valid(gpio_nreset)) { | ||
| 870 | /* Reset codec - minimum assertion time is 400ns */ | ||
| 871 | gpio_direction_output(gpio_nreset, 0); | ||
| 872 | udelay(1); | ||
| 873 | gpio_set_value(gpio_nreset, 1); | ||
| 874 | |||
| 875 | /* Codec needs ~15ms to wake up */ | ||
| 876 | msleep(15); | ||
| 877 | } | ||
| 878 | |||
| 879 | priv->gpio_nreset = gpio_nreset; | 894 | priv->gpio_nreset = gpio_nreset; |
| 895 | tas5086_reset(priv); | ||
| 880 | 896 | ||
| 881 | /* The TAS5086 always returns 0x03 in its TAS5086_DEV_ID register */ | 897 | /* The TAS5086 always returns 0x03 in its TAS5086_DEV_ID register */ |
| 882 | ret = regmap_read(priv->regmap, TAS5086_DEV_ID, &i); | 898 | ret = regmap_read(priv->regmap, TAS5086_DEV_ID, &i); |
