aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/codecs/rt5677.c167
-rw-r--r--sound/soc/codecs/rt5677.h3
2 files changed, 102 insertions, 68 deletions
diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c
index 0d24dc45dfe4..4b6f7d57c1bb 100644
--- a/sound/soc/codecs/rt5677.c
+++ b/sound/soc/codecs/rt5677.c
@@ -541,49 +541,51 @@ static bool rt5677_readable_register(struct device *dev, unsigned int reg)
541 541
542/** 542/**
543 * rt5677_dsp_mode_i2c_write_addr - Write value to address on DSP mode. 543 * rt5677_dsp_mode_i2c_write_addr - Write value to address on DSP mode.
544 * @codec: SoC audio codec device. 544 * @rt5677: Private Data.
545 * @addr: Address index. 545 * @addr: Address index.
546 * @value: Address data. 546 * @value: Address data.
547 * 547 *
548 * 548 *
549 * Returns 0 for success or negative error code. 549 * Returns 0 for success or negative error code.
550 */ 550 */
551static int rt5677_dsp_mode_i2c_write_addr(struct snd_soc_codec *codec, 551static int rt5677_dsp_mode_i2c_write_addr(struct rt5677_priv *rt5677,
552 unsigned int addr, unsigned int value, unsigned int opcode) 552 unsigned int addr, unsigned int value, unsigned int opcode)
553{ 553{
554 struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); 554 struct snd_soc_codec *codec = rt5677->codec;
555 int ret; 555 int ret;
556 556
557 mutex_lock(&rt5677->dsp_cmd_lock); 557 mutex_lock(&rt5677->dsp_cmd_lock);
558 558
559 ret = regmap_write(rt5677->regmap, RT5677_DSP_I2C_ADDR_MSB, addr >> 16); 559 ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_MSB,
560 addr >> 16);
560 if (ret < 0) { 561 if (ret < 0) {
561 dev_err(codec->dev, "Failed to set addr msb value: %d\n", ret); 562 dev_err(codec->dev, "Failed to set addr msb value: %d\n", ret);
562 goto err; 563 goto err;
563 } 564 }
564 565
565 ret = regmap_write(rt5677->regmap, RT5677_DSP_I2C_ADDR_LSB, 566 ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_LSB,
566 addr & 0xffff); 567 addr & 0xffff);
567 if (ret < 0) { 568 if (ret < 0) {
568 dev_err(codec->dev, "Failed to set addr lsb value: %d\n", ret); 569 dev_err(codec->dev, "Failed to set addr lsb value: %d\n", ret);
569 goto err; 570 goto err;
570 } 571 }
571 572
572 ret = regmap_write(rt5677->regmap, RT5677_DSP_I2C_DATA_MSB, 573 ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_MSB,
573 value >> 16); 574 value >> 16);
574 if (ret < 0) { 575 if (ret < 0) {
575 dev_err(codec->dev, "Failed to set data msb value: %d\n", ret); 576 dev_err(codec->dev, "Failed to set data msb value: %d\n", ret);
576 goto err; 577 goto err;
577 } 578 }
578 579
579 ret = regmap_write(rt5677->regmap, RT5677_DSP_I2C_DATA_LSB, 580 ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_LSB,
580 value & 0xffff); 581 value & 0xffff);
581 if (ret < 0) { 582 if (ret < 0) {
582 dev_err(codec->dev, "Failed to set data lsb value: %d\n", ret); 583 dev_err(codec->dev, "Failed to set data lsb value: %d\n", ret);
583 goto err; 584 goto err;
584 } 585 }
585 586
586 ret = regmap_write(rt5677->regmap, RT5677_DSP_I2C_OP_CODE, opcode); 587 ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_OP_CODE,
588 opcode);
587 if (ret < 0) { 589 if (ret < 0) {
588 dev_err(codec->dev, "Failed to set op code value: %d\n", ret); 590 dev_err(codec->dev, "Failed to set op code value: %d\n", ret);
589 goto err; 591 goto err;
@@ -597,42 +599,45 @@ err:
597 599
598/** 600/**
599 * rt5677_dsp_mode_i2c_read_addr - Read value from address on DSP mode. 601 * rt5677_dsp_mode_i2c_read_addr - Read value from address on DSP mode.
600 * @codec: SoC audio codec device. 602 * rt5677: Private Data.
601 * @addr: Address index. 603 * @addr: Address index.
602 * @value: Address data. 604 * @value: Address data.
603 * 605 *
606 *
604 * Returns 0 for success or negative error code. 607 * Returns 0 for success or negative error code.
605 */ 608 */
606static int rt5677_dsp_mode_i2c_read_addr( 609static int rt5677_dsp_mode_i2c_read_addr(
607 struct snd_soc_codec *codec, unsigned int addr, unsigned int *value) 610 struct rt5677_priv *rt5677, unsigned int addr, unsigned int *value)
608{ 611{
609 struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); 612 struct snd_soc_codec *codec = rt5677->codec;
610 int ret; 613 int ret;
611 unsigned int msb, lsb; 614 unsigned int msb, lsb;
612 615
613 mutex_lock(&rt5677->dsp_cmd_lock); 616 mutex_lock(&rt5677->dsp_cmd_lock);
614 617
615 ret = regmap_write(rt5677->regmap, RT5677_DSP_I2C_ADDR_MSB, addr >> 16); 618 ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_MSB,
619 addr >> 16);
616 if (ret < 0) { 620 if (ret < 0) {
617 dev_err(codec->dev, "Failed to set addr msb value: %d\n", ret); 621 dev_err(codec->dev, "Failed to set addr msb value: %d\n", ret);
618 goto err; 622 goto err;
619 } 623 }
620 624
621 ret = regmap_write(rt5677->regmap, RT5677_DSP_I2C_ADDR_LSB, 625 ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_LSB,
622 addr & 0xffff); 626 addr & 0xffff);
623 if (ret < 0) { 627 if (ret < 0) {
624 dev_err(codec->dev, "Failed to set addr lsb value: %d\n", ret); 628 dev_err(codec->dev, "Failed to set addr lsb value: %d\n", ret);
625 goto err; 629 goto err;
626 } 630 }
627 631
628 ret = regmap_write(rt5677->regmap, RT5677_DSP_I2C_OP_CODE , 0x0002); 632 ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_OP_CODE,
633 0x0002);
629 if (ret < 0) { 634 if (ret < 0) {
630 dev_err(codec->dev, "Failed to set op code value: %d\n", ret); 635 dev_err(codec->dev, "Failed to set op code value: %d\n", ret);
631 goto err; 636 goto err;
632 } 637 }
633 638
634 regmap_read(rt5677->regmap, RT5677_DSP_I2C_DATA_MSB, &msb); 639 regmap_read(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_MSB, &msb);
635 regmap_read(rt5677->regmap, RT5677_DSP_I2C_DATA_LSB, &lsb); 640 regmap_read(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_LSB, &lsb);
636 *value = (msb << 16) | lsb; 641 *value = (msb << 16) | lsb;
637 642
638err: 643err:
@@ -643,17 +648,17 @@ err:
643 648
644/** 649/**
645 * rt5677_dsp_mode_i2c_write - Write register on DSP mode. 650 * rt5677_dsp_mode_i2c_write - Write register on DSP mode.
646 * @codec: SoC audio codec device. 651 * rt5677: Private Data.
647 * @reg: Register index. 652 * @reg: Register index.
648 * @value: Register data. 653 * @value: Register data.
649 * 654 *
650 * 655 *
651 * Returns 0 for success or negative error code. 656 * Returns 0 for success or negative error code.
652 */ 657 */
653static int rt5677_dsp_mode_i2c_write(struct snd_soc_codec *codec, 658static int rt5677_dsp_mode_i2c_write(struct rt5677_priv *rt5677,
654 unsigned int reg, unsigned int value) 659 unsigned int reg, unsigned int value)
655{ 660{
656 return rt5677_dsp_mode_i2c_write_addr(codec, 0x18020000 + reg * 2, 661 return rt5677_dsp_mode_i2c_write_addr(rt5677, 0x18020000 + reg * 2,
657 value, 0x0001); 662 value, 0x0001);
658} 663}
659 664
@@ -661,57 +666,33 @@ static int rt5677_dsp_mode_i2c_write(struct snd_soc_codec *codec,
661 * rt5677_dsp_mode_i2c_read - Read register on DSP mode. 666 * rt5677_dsp_mode_i2c_read - Read register on DSP mode.
662 * @codec: SoC audio codec device. 667 * @codec: SoC audio codec device.
663 * @reg: Register index. 668 * @reg: Register index.
669 * @value: Register data.
664 * 670 *
665 * 671 *
666 * Returns Register value. 672 * Returns 0 for success or negative error code.
667 */ 673 */
668static unsigned int rt5677_dsp_mode_i2c_read( 674static int rt5677_dsp_mode_i2c_read(
669 struct snd_soc_codec *codec, unsigned int reg) 675 struct rt5677_priv *rt5677, unsigned int reg, unsigned int *value)
670{ 676{
671 unsigned int value = 0; 677 int ret = rt5677_dsp_mode_i2c_read_addr(rt5677, 0x18020000 + reg * 2,
678 value);
672 679
673 rt5677_dsp_mode_i2c_read_addr(codec, 0x18020000 + reg * 2, &value); 680 *value &= 0xffff;
674 681
675 return value; 682 return ret;
676} 683}
677 684
678/** 685static void rt5677_set_dsp_mode(struct snd_soc_codec *codec, bool on)
679 * rt5677_dsp_mode_i2c_update_bits - update register on DSP mode.
680 * @codec: audio codec
681 * @reg: register index.
682 * @mask: register mask
683 * @value: new value
684 *
685 *
686 * Returns 1 for change, 0 for no change, or negative error code.
687 */
688static int rt5677_dsp_mode_i2c_update_bits(struct snd_soc_codec *codec,
689 unsigned int reg, unsigned int mask, unsigned int value)
690{ 686{
691 unsigned int old, new; 687 struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
692 int change, ret;
693
694 ret = rt5677_dsp_mode_i2c_read(codec, reg);
695 if (ret < 0) {
696 dev_err(codec->dev, "Failed to read reg: %d\n", ret);
697 goto err;
698 }
699 688
700 old = ret; 689 if (on) {
701 new = (old & ~mask) | (value & mask); 690 regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1, 0x2, 0x2);
702 change = old != new; 691 rt5677->is_dsp_mode = true;
703 if (change) { 692 } else {
704 ret = rt5677_dsp_mode_i2c_write(codec, reg, new); 693 regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1, 0x2, 0x0);
705 if (ret < 0) { 694 rt5677->is_dsp_mode = false;
706 dev_err(codec->dev,
707 "Failed to write reg: %d\n", ret);
708 goto err;
709 }
710 } 695 }
711 return change;
712
713err:
714 return ret;
715} 696}
716 697
717static int rt5677_set_dsp_vad(struct snd_soc_codec *codec, bool on) 698static int rt5677_set_dsp_vad(struct snd_soc_codec *codec, bool on)
@@ -733,9 +714,14 @@ static int rt5677_set_dsp_vad(struct snd_soc_codec *codec, bool on)
733 RT5677_LDO1_SEL_MASK, 0x0); 714 RT5677_LDO1_SEL_MASK, 0x0);
734 regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2, 715 regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
735 RT5677_PWR_LDO1, RT5677_PWR_LDO1); 716 RT5677_PWR_LDO1, RT5677_PWR_LDO1);
736 regmap_write(rt5677->regmap, RT5677_GLB_CLK2, 0x0080); 717 regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
718 RT5677_MCLK_SRC_MASK, RT5677_MCLK2_SRC);
719 regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK2,
720 RT5677_PLL2_PR_SRC_MASK | RT5677_DSP_CLK_SRC_MASK,
721 RT5677_PLL2_PR_SRC_MCLK2 | RT5677_DSP_CLK_SRC_BYPASS);
737 regmap_write(rt5677->regmap, RT5677_PWR_DSP2, 0x07ff); 722 regmap_write(rt5677->regmap, RT5677_PWR_DSP2, 0x07ff);
738 regmap_write(rt5677->regmap, RT5677_PWR_DSP1, 0x07ff); 723 regmap_write(rt5677->regmap, RT5677_PWR_DSP1, 0x07fd);
724 rt5677_set_dsp_mode(codec, true);
739 725
740 ret = request_firmware(&rt5677->fw1, RT5677_FIRMWARE1, 726 ret = request_firmware(&rt5677->fw1, RT5677_FIRMWARE1,
741 codec->dev); 727 codec->dev);
@@ -751,8 +737,7 @@ static int rt5677_set_dsp_vad(struct snd_soc_codec *codec, bool on)
751 release_firmware(rt5677->fw2); 737 release_firmware(rt5677->fw2);
752 } 738 }
753 739
754 rt5677_dsp_mode_i2c_update_bits(codec, RT5677_PWR_DSP1, 0x1, 740 regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1, 0x1, 0x0);
755 0x0);
756 741
757 regcache_cache_bypass(rt5677->regmap, false); 742 regcache_cache_bypass(rt5677->regmap, false);
758 regcache_cache_only(rt5677->regmap, true); 743 regcache_cache_only(rt5677->regmap, true);
@@ -762,9 +747,9 @@ static int rt5677_set_dsp_vad(struct snd_soc_codec *codec, bool on)
762 regcache_cache_only(rt5677->regmap, false); 747 regcache_cache_only(rt5677->regmap, false);
763 regcache_cache_bypass(rt5677->regmap, true); 748 regcache_cache_bypass(rt5677->regmap, true);
764 749
765 rt5677_dsp_mode_i2c_update_bits(codec, RT5677_PWR_DSP1, 0x1, 750 regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1, 0x1, 0x1);
766 0x1); 751 rt5677_set_dsp_mode(codec, false);
767 rt5677_dsp_mode_i2c_write(codec, RT5677_PWR_DSP1, 0x0001); 752 regmap_write(rt5677->regmap, RT5677_PWR_DSP1, 0x0001);
768 753
769 regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec); 754 regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec);
770 755
@@ -4019,6 +4004,32 @@ static int rt5677_resume(struct snd_soc_codec *codec)
4019#define rt5677_resume NULL 4004#define rt5677_resume NULL
4020#endif 4005#endif
4021 4006
4007static int rt5677_read(void *context, unsigned int reg, unsigned int *val)
4008{
4009 struct i2c_client *client = context;
4010 struct rt5677_priv *rt5677 = i2c_get_clientdata(client);
4011
4012 if (rt5677->is_dsp_mode)
4013 rt5677_dsp_mode_i2c_read(rt5677, reg, val);
4014 else
4015 regmap_read(rt5677->regmap_physical, reg, val);
4016
4017 return 0;
4018}
4019
4020static int rt5677_write(void *context, unsigned int reg, unsigned int val)
4021{
4022 struct i2c_client *client = context;
4023 struct rt5677_priv *rt5677 = i2c_get_clientdata(client);
4024
4025 if (rt5677->is_dsp_mode)
4026 rt5677_dsp_mode_i2c_write(rt5677, reg, val);
4027 else
4028 regmap_write(rt5677->regmap_physical, reg, val);
4029
4030 return 0;
4031}
4032
4022#define RT5677_STEREO_RATES SNDRV_PCM_RATE_8000_96000 4033#define RT5677_STEREO_RATES SNDRV_PCM_RATE_8000_96000
4023#define RT5677_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ 4034#define RT5677_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
4024 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8) 4035 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
@@ -4144,6 +4155,17 @@ static struct snd_soc_codec_driver soc_codec_dev_rt5677 = {
4144 .num_dapm_routes = ARRAY_SIZE(rt5677_dapm_routes), 4155 .num_dapm_routes = ARRAY_SIZE(rt5677_dapm_routes),
4145}; 4156};
4146 4157
4158static const struct regmap_config rt5677_regmap_physical = {
4159 .name = "physical",
4160 .reg_bits = 8,
4161 .val_bits = 16,
4162
4163 .max_register = RT5677_VENDOR_ID2 + 1,
4164 .readable_reg = rt5677_readable_register,
4165
4166 .cache_type = REGCACHE_NONE,
4167};
4168
4147static const struct regmap_config rt5677_regmap = { 4169static const struct regmap_config rt5677_regmap = {
4148 .reg_bits = 8, 4170 .reg_bits = 8,
4149 .val_bits = 16, 4171 .val_bits = 16,
@@ -4153,6 +4175,8 @@ static const struct regmap_config rt5677_regmap = {
4153 4175
4154 .volatile_reg = rt5677_volatile_register, 4176 .volatile_reg = rt5677_volatile_register,
4155 .readable_reg = rt5677_readable_register, 4177 .readable_reg = rt5677_readable_register,
4178 .reg_read = rt5677_read,
4179 .reg_write = rt5677_write,
4156 4180
4157 .cache_type = REGCACHE_RBTREE, 4181 .cache_type = REGCACHE_RBTREE,
4158 .reg_defaults = rt5677_reg, 4182 .reg_defaults = rt5677_reg,
@@ -4309,7 +4333,16 @@ static int rt5677_i2c_probe(struct i2c_client *i2c,
4309 msleep(10); 4333 msleep(10);
4310 } 4334 }
4311 4335
4312 rt5677->regmap = devm_regmap_init_i2c(i2c, &rt5677_regmap); 4336 rt5677->regmap_physical = devm_regmap_init_i2c(i2c,
4337 &rt5677_regmap_physical);
4338 if (IS_ERR(rt5677->regmap_physical)) {
4339 ret = PTR_ERR(rt5677->regmap_physical);
4340 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
4341 ret);
4342 return ret;
4343 }
4344
4345 rt5677->regmap = devm_regmap_init(&i2c->dev, NULL, i2c, &rt5677_regmap);
4313 if (IS_ERR(rt5677->regmap)) { 4346 if (IS_ERR(rt5677->regmap)) {
4314 ret = PTR_ERR(rt5677->regmap); 4347 ret = PTR_ERR(rt5677->regmap);
4315 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", 4348 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
diff --git a/sound/soc/codecs/rt5677.h b/sound/soc/codecs/rt5677.h
index 2f5b8c6c279e..9d473b2798d5 100644
--- a/sound/soc/codecs/rt5677.h
+++ b/sound/soc/codecs/rt5677.h
@@ -1628,7 +1628,7 @@ enum {
1628struct rt5677_priv { 1628struct rt5677_priv {
1629 struct snd_soc_codec *codec; 1629 struct snd_soc_codec *codec;
1630 struct rt5677_platform_data pdata; 1630 struct rt5677_platform_data pdata;
1631 struct regmap *regmap; 1631 struct regmap *regmap, *regmap_physical;
1632 const struct firmware *fw1, *fw2; 1632 const struct firmware *fw1, *fw2;
1633 struct mutex dsp_cmd_lock; 1633 struct mutex dsp_cmd_lock;
1634 1634
@@ -1646,6 +1646,7 @@ struct rt5677_priv {
1646#endif 1646#endif
1647 bool dsp_vad_en; 1647 bool dsp_vad_en;
1648 struct regmap_irq_chip_data *irq_data; 1648 struct regmap_irq_chip_data *irq_data;
1649 bool is_dsp_mode;
1649}; 1650};
1650 1651
1651#endif /* __RT5677_H__ */ 1652#endif /* __RT5677_H__ */