diff options
-rw-r--r-- | sound/soc/codecs/rt5677.c | 167 | ||||
-rw-r--r-- | sound/soc/codecs/rt5677.h | 3 |
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 | */ |
551 | static int rt5677_dsp_mode_i2c_write_addr(struct snd_soc_codec *codec, | 551 | static 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 | */ |
606 | static int rt5677_dsp_mode_i2c_read_addr( | 609 | static 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 | ||
638 | err: | 643 | err: |
@@ -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 | */ |
653 | static int rt5677_dsp_mode_i2c_write(struct snd_soc_codec *codec, | 658 | static 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 | */ |
668 | static unsigned int rt5677_dsp_mode_i2c_read( | 674 | static 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 | /** | 685 | static 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 | */ | ||
688 | static 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 | |||
713 | err: | ||
714 | return ret; | ||
715 | } | 696 | } |
716 | 697 | ||
717 | static int rt5677_set_dsp_vad(struct snd_soc_codec *codec, bool on) | 698 | static 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 | ||
4007 | static 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 | |||
4020 | static 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 | ||
4158 | static 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 | |||
4147 | static const struct regmap_config rt5677_regmap = { | 4169 | static 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 { | |||
1628 | struct rt5677_priv { | 1628 | struct 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__ */ |