audio: add HW resample for HDMIRX [1/1]
authorShuai Li <shuai.li@amlogic.com>
Wed, 27 Mar 2019 08:37:00 +0000 (16:37 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Sat, 30 Mar 2019 16:38:02 +0000 (09:38 -0700)
PD#SWPL-6118

Problem:
No resample will cause mismatch between
input and output if they are not at same
samplerate.

Solution:
Add resample for hdmirx case

Verify:
Local tested.

Change-Id: I298e401578bf49484d6b75fd736d2a74c38508e4
Signed-off-by: Shuai Li <shuai.li@amlogic.com>
12 files changed:
arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts
arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts
arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts
arch/arm64/boot/dts/amlogic/tl1_t962x2_x301.dts
sound/soc/amlogic/auge/ddr_mngr.c
sound/soc/amlogic/auge/ddr_mngr.h
sound/soc/amlogic/auge/extn.c
sound/soc/amlogic/auge/resample.c
sound/soc/amlogic/auge/resample.h
sound/soc/amlogic/auge/resample_hw.c
sound/soc/amlogic/auge/resample_hw.h
sound/soc/amlogic/auge/spdif.c

index 13a1dc3..bc370e2 100644 (file)
                 *      NONE,
                 *      TDMIN_LB, 6
                 *      LOOPBACK, 7
+                *      FRHDMIRX, 8
                 */
-               resample_module = <3>;
+               resample_module = <8>;
 
                status = "okay";
        };
index bfad1a2..c97fdeb 100644 (file)
                 *      NONE,
                 *      TDMIN_LB, 6
                 *      LOOPBACK, 7
+                *      FRHDMIRX, 8
                 */
-               resample_module = <3>;
+               resample_module = <8>;
 
                status = "okay";
        };
index e8a93e2..1d818aa 100644 (file)
                 *      NONE,
                 *      TDMIN_LB, 6
                 *      LOOPBACK, 7
+                *      FRHDMIRX, 8
                 */
-               resample_module = <3>;
+               resample_module = <8>;
 
                status = "okay";
        };
index 536b6a0..bf605d4 100644 (file)
                 *      NONE,
                 *      TDMIN_LB, 6
                 *      LOOPBACK, 7
+                *      FRHDMIRX, 8
                 */
-               resample_module = <3>;
+               resample_module = <8>;
 
                status = "okay";
        };
index 636c905..48babca 100644 (file)
@@ -388,10 +388,10 @@ void aml_toddr_set_fifos(struct toddr *to, unsigned int thresh)
        if (to->chipinfo
                        && to->chipinfo->src_sel_ctrl) {
                mask = 0xfff << 12 | 0xf << 8;
-               val = (thresh-1) << 12 | 2 << 8;
+               val = (thresh-2) << 12 | 2 << 8;
        } else {
                mask = 0xff << 16 | 0xf << 8;
-               val = (thresh-1) << 16 | 2 << 8;
+               val = (thresh-2) << 16 | 2 << 8;
        }
 
        aml_audiobus_update_bits(actrl, reg, mask, val);
@@ -479,28 +479,29 @@ void aml_toddr_write(struct toddr *to, unsigned int val)
 
        aml_audiobus_write(actrl, reg, val);
 }
-
-void aml_toddr_set_resample(struct toddr *to, bool enable)
+/* not for tl1 */
+static void aml_toddr_set_resample(struct toddr *to, bool enable)
 {
        struct aml_audio_controller *actrl = to->actrl;
        unsigned int reg_base = to->reg_base;
        unsigned int reg;
 
        reg = calc_toddr_address(EE_AUDIO_TODDR_A_CTRL0, reg_base);
-       aml_audiobus_update_bits(actrl, reg, 1<<30, enable<<30);
+       aml_audiobus_update_bits(actrl, reg, 1<<30, !!enable<<30);
 }
-
-void aml_toddr_set_resample_ab(struct toddr *to, int asrc_src_sel, bool enable)
+/* tl1 after */
+static void aml_toddr_set_resample_ab(struct toddr *to,
+               enum resample_idx index, bool enable)
 {
        struct aml_audio_controller *actrl = to->actrl;
        unsigned int reg_base = to->reg_base;
        unsigned int reg;
 
        reg = calc_toddr_address(EE_AUDIO_TODDR_A_CTRL1, reg_base);
-       if (asrc_src_sel == 0)
-               aml_audiobus_update_bits(actrl, reg, 1 << 27, enable << 27);
-       else
-               aml_audiobus_update_bits(actrl, reg, 1 << 26, enable << 26);
+       if (index == RESAMPLE_A)
+               aml_audiobus_update_bits(actrl, reg, 1 << 27, !!enable << 27);
+       else if (index == RESAMPLE_B)
+               aml_audiobus_update_bits(actrl, reg, 1 << 26, !!enable << 26);
 }
 
 static void aml_resample_enable(
@@ -508,12 +509,15 @@ static void aml_resample_enable(
        struct toddr_attach *p_attach_resample,
        bool enable)
 {
-       if (!to)
+       if (!to || !p_attach_resample) {
+               pr_err("%s(), NULL pointer.", __func__);
                return;
+       }
 
        if (to->chipinfo
                        && to->chipinfo->asrc_src_sel_ctrl) {
                /* fix asrc_src_sel */
+               /*
                switch (p_attach_resample->attach_module) {
                case LOOPBACK_A:
                        to->asrc_src_sel = ASRC_LOOPBACK_A;
@@ -525,21 +529,24 @@ static void aml_resample_enable(
                        to->asrc_src_sel = to->fifo_id;
                        break;
                }
+               */
+               to->asrc_src_sel = p_attach_resample->attach_module;
        }
 
        pr_info("toddr %d selects data to %s resample_%c for module:%s\n",
                to->fifo_id,
                enable ? "enable" : "disable",
-               (p_attach_resample->id == 0) ? 'a' : 'b',
+               (p_attach_resample->id == RESAMPLE_A) ? 'a' : 'b',
                toddr_src_get_str(p_attach_resample->attach_module)
                );
 
        if (enable) {
                int bitwidth = to->bitdepth;
                /* channels and bit depth for resample */
+
                if (to->chipinfo
                        && to->chipinfo->asrc_only_left_j
-                       && (to->src == SPDIFIN)
+                       /*&& (to->src == SPDIFIN)*/
                        && (bitwidth == 32)) {
                        struct aml_audio_controller *actrl = to->actrl;
                        unsigned int reg_base = to->reg_base;
@@ -583,13 +590,14 @@ static void aml_resample_enable(
                aml_toddr_set_resample(to, enable);
 }
 
-void aml_set_resample(int id, bool enable, int resample_module)
+void aml_set_resample(enum resample_idx id,
+               bool enable, enum toddr_src resample_module)
 {
        struct toddr_attach *p_attach_resample;
        struct toddr *to;
        bool update_running = false;
 
-       if (id == 0)
+       if (id == RESAMPLE_A)
                p_attach_resample = &attach_resample_a;
        else
                p_attach_resample = &attach_resample_b;
@@ -1370,13 +1378,13 @@ void frddr_deinit_without_mngr(unsigned int frddr_index)
        audiobus_write(reg, 0x0);
 }
 
-static int toddr_src_idx = -1;
+static enum toddr_src toddr_src_idx = TODDR_INVAL;
 
 static const char *const toddr_src_sel_texts[] = {
        "TDMIN_A", "TDMIN_B", "TDMIN_C", "SPDIFIN",
        "PDMIN", "FRATV", "TDMIN_LB", "LOOPBACK_A",
        "FRHDMIRX", "LOOPBACK_B", "SPDIFIN_LB",
-       "EARCRX_DMAC", "RESERVED", "RESERVED", "RESERVED",
+       "EARCRX_DMAC", "RESERVED_0", "RESERVED_1", "RESERVED_2",
        "VAD"
 };
 
@@ -1384,14 +1392,14 @@ static const struct soc_enum toddr_input_source_enum =
        SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(toddr_src_sel_texts),
                toddr_src_sel_texts);
 
-int toddr_src_get(void)
+enum toddr_src toddr_src_get(void)
 {
        return toddr_src_idx;
 }
 
-const char *toddr_src_get_str(int idx)
+const char *toddr_src_get_str(enum toddr_src idx)
 {
-       if (idx < 0 || idx > 15)
+       if (idx < TDMIN_A || idx > VAD)
                return NULL;
 
        return toddr_src_sel_texts[idx];
@@ -1409,6 +1417,8 @@ static int toddr_src_enum_set(struct snd_kcontrol *kcontrol,
        struct snd_ctl_elem_value *ucontrol)
 {
        toddr_src_idx = ucontrol->value.enumerated.item[0];
+       /* also update to resample src */
+       //set_resample_source(toddr_src_idx);
 
        return 0;
 }
index cfb92ee..4d87dce 100644 (file)
@@ -42,19 +42,29 @@ enum ddr_types {
  * from tl1, add new source FRATV, FRHDMIRX, LOOPBACK_B, SPDIFIN_LB, VAD
  */
 enum toddr_src {
-       TDMIN_A,
-       TDMIN_B,
-       TDMIN_C,
-       SPDIFIN,
-       PDMIN,
-       FRATV, /* NONE for axg, g12a, g12b */
-       TDMIN_LB,
-       LOOPBACK_A,
-       FRHDMIRX, /* from tl1 chipset*/
-       LOOPBACK_B,
-       SPDIFIN_LB,
-       EARCRX_DMAC, /* from sm1 chipset */
-       VAD,
+       TODDR_INVAL = -1,
+       TDMIN_A = 0,
+       TDMIN_B = 1,
+       TDMIN_C = 2,
+       SPDIFIN = 3,
+       PDMIN = 4,
+       FRATV = 5, /* NONE for axg, g12a, g12b */
+       TDMIN_LB = 6,
+       LOOPBACK_A = 7,
+       FRHDMIRX = 8, /* from tl1 chipset*/
+       LOOPBACK_B = 9,
+       SPDIFIN_LB = 10,
+       EARCRX_DMAC = 11,/* from sm1 chipset */
+       RESERVED_0 = 12,
+       RESERVED_1 = 13,
+       RESERVED_2 = 14,
+       VAD = 15,
+       TODDR_SRC_MAX = 16
+};
+
+enum resample_idx {
+       RESAMPLE_A,
+       RESAMPLE_B
 };
 
 enum resample_src {
@@ -177,7 +187,7 @@ struct toddr {
        enum toddr_src src;
        unsigned int fifo_id;
 
-       unsigned int asrc_src_sel;
+       enum toddr_src asrc_src_sel;
 
        int is_lb; /* check whether for loopback */
        int irq;
@@ -194,7 +204,7 @@ enum status {
 
 struct toddr_attach {
        bool enable;
-       int id;
+       enum resample_idx id;
        int status;
        /* which module should be attached,
         * check which toddr in use should be attached
@@ -259,7 +269,8 @@ unsigned int aml_toddr_read(struct toddr *to);
 void aml_toddr_write(struct toddr *to, unsigned int val);
 
 /* resample */
-void aml_set_resample(int id, bool enable, int resample_module);
+void aml_set_resample(enum resample_idx id,
+               bool enable, enum toddr_src resample_module);
 /* power detect */
 void aml_pwrdet_enable(bool enable, int pwrdet_module);
 /* Voice Activity Detection */
@@ -297,8 +308,8 @@ void aml_set_aed(bool enable, int aed_module);
 void frddr_init_without_mngr(unsigned int frddr_index, unsigned int src0_sel);
 void frddr_deinit_without_mngr(unsigned int frddr_index);
 
-int toddr_src_get(void);
-const char *toddr_src_get_str(int idx);
+enum toddr_src toddr_src_get(void);
+const char *toddr_src_get_str(enum toddr_src idx);
 int frddr_src_get(void);
 const char *frddr_src_get_str(int idx);
 
index 712c6aa..2777612 100644 (file)
@@ -37,6 +37,7 @@
 #include "ddr_mngr.h"
 #include "audio_utils.h"
 #include "frhdmirx_hw.h"
+#include "resample.h"
 
 #include <linux/amlogic/media/sound/misc.h>
 
@@ -371,6 +372,7 @@ static int extn_dai_startup(
        struct snd_pcm_substream *substream,
        struct snd_soc_dai *cpu_dai)
 {
+       resample_set_inner_rate(RESAMPLE_A);
        return 0;
 }
 
@@ -378,6 +380,7 @@ static void extn_dai_shutdown(
        struct snd_pcm_substream *substream,
        struct snd_soc_dai *cpu_dai)
 {
+       //resample_set(RESAMPLE_A, RATE_OFF);
 }
 
 static int extn_dai_prepare(
@@ -401,7 +404,7 @@ static int extn_dai_prepare(
        } else {
                struct toddr *to = p_extn->tddr;
                unsigned int msb = 0, lsb = 0, toddr_type = 0;
-               unsigned int src = toddr_src_get();
+               enum toddr_src src = toddr_src_get();
                struct toddr_fmt fmt;
 
                if (bit_depth == 24)
@@ -472,7 +475,7 @@ static int extn_dai_trigger(struct snd_pcm_substream *substream, int cmd,
                               struct snd_soc_dai *cpu_dai)
 {
        struct extn *p_extn = snd_soc_dai_get_drvdata(cpu_dai);
-       unsigned int src = toddr_src_get();
+       enum toddr_src src = toddr_src_get();
 
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
index 7c56eb1..aa09607 100644 (file)
@@ -27,8 +27,6 @@
 #include <sound/tlv.h>
 
 #include "resample.h"
-#include "resample_hw.h"
-#include "ddr_mngr.h"
 #include "regs.h"
 #include "iomap.h"
 
 
 /*#define __PTM_RESAMPLE_CLK__*/
 
-#define RESAMPLE_A    0
-#define RESAMPLE_B    1
+//#define RESAMPLE_A    0
+//#define RESAMPLE_B    1
 
 struct resample_chipinfo {
        int num;    /* support resample a/b */
-       int id;
+       enum resample_idx id;
 
        bool dividor_fn;
 };
@@ -60,15 +58,15 @@ struct audioresample {
 
        struct resample_chipinfo *chipinfo;
 
-       int id;
+       enum resample_idx id;
 
        /*which module should be resampled */
-       int resample_module;
+       enum toddr_src resample_module;
        /*  resample to the rate */
        int out_rate;
 
        /* sync with auge_resample_texts */
-       int asrc_rate_idx;
+       enum samplerate_index asrc_rate_idx;
 
        bool enable;
 };
@@ -77,11 +75,11 @@ struct audioresample *s_resample_a;
 
 struct audioresample *s_resample_b;
 
-static struct audioresample *get_audioresample(int id)
+static struct audioresample *get_audioresample(enum resample_idx id)
 {
        struct audioresample *p_resample;
 
-       p_resample = ((id == 0) ? s_resample_a : s_resample_b);
+       p_resample = ((id == RESAMPLE_A) ? s_resample_a : s_resample_b);
 
        if (!p_resample) {
                pr_debug("Not init audio resample\n");
@@ -93,7 +91,7 @@ static struct audioresample *get_audioresample(int id)
 
 int get_resample_module_num(void)
 {
-       struct audioresample *p_resample = get_audioresample(0);
+       struct audioresample *p_resample = get_audioresample(RESAMPLE_A);
 
        if (p_resample && p_resample->chipinfo)
                return p_resample->chipinfo->num;
@@ -101,6 +99,32 @@ int get_resample_module_num(void)
        return 1;
 }
 
+int set_resample_source(enum resample_idx id, enum toddr_src src)
+{
+       struct audioresample *p_resample = get_audioresample(id);
+       (void)p_resample;
+       (void)src;
+       //p_resample->resample_module = src;
+       return 0;
+}
+
+static int set_resample_rate_index(
+               enum resample_idx id, enum samplerate_index index)
+{
+       struct audioresample *p_resample = get_audioresample(id);
+
+       p_resample->asrc_rate_idx = index;
+       return 0;
+}
+
+static enum samplerate_index get_resample_rate_index(
+               enum resample_idx id)
+{
+       struct audioresample *p_resample = get_audioresample(id);
+
+       return p_resample->asrc_rate_idx;
+}
+
 static int resample_clk_set(struct audioresample *p_resample)
 {
        int ret = 0;
@@ -126,7 +150,7 @@ static int resample_clk_set(struct audioresample *p_resample)
                        clk_set_rate(p_resample->sclk, 48000 * CLK_RATIO);
                        clk_set_rate(p_resample->clk, 48000 * CLK_RATIO);
                }
-
+#if 0
                ret = clk_prepare_enable(p_resample->pll);
                if (ret) {
                        pr_err("Can't enable pll clock: %d\n", ret);
@@ -146,6 +170,7 @@ static int resample_clk_set(struct audioresample *p_resample)
                                ret);
                        return -EINVAL;
                }
+#endif
 
                pr_info("%s, resample_pll:%lu, sclk:%lu, clk:%lu\n",
                        __func__,
@@ -153,9 +178,11 @@ static int resample_clk_set(struct audioresample *p_resample)
                        clk_get_rate(p_resample->sclk),
                        clk_get_rate(p_resample->clk));
        } else {
+#if 0
                clk_disable_unprepare(p_resample->clk);
                clk_disable_unprepare(p_resample->sclk);
                clk_disable_unprepare(p_resample->pll);
+#endif
        }
 
        return ret;
@@ -194,25 +221,25 @@ static const char *const auge_resample_texts[] = {
        "Enable:192K",
 };
 
-static int resample_idx2rate(int index)
+static int resample_idx2rate(enum samplerate_index index)
 {
        int rate = 0;
 
-       if (index == 0)
+       if (index == RATE_OFF)
                rate = 0;
-       else if (index == 1)
+       else if (index == RATE_32K)
                rate = 32000;
-       else if (index == 2)
+       else if (index == RATE_44K)
                rate = 44100;
-       else if (index == 3)
+       else if (index == RATE_48K)
                rate = 48000;
-       else if (index == 4)
+       else if (index == RATE_88K)
                rate = 88200;
-       else if (index == 5)
+       else if (index == RATE_96K)
                rate = 96000;
-       else if (index == 6)
+       else if (index == RATE_176K)
                rate = 176400;
-       else if (index == 7)
+       else if (index == RATE_192K)
                rate = 192000;
 
        return rate;
@@ -238,38 +265,51 @@ static int resample_get_enum(
        return 0;
 }
 
-int resample_set(int id, int index)
+int resample_set(enum resample_idx id, enum samplerate_index index)
 {
-       int resample_rate = resample_idx2rate(index);
+       int resample_rate = 0;
        struct audioresample *p_resample = get_audioresample(id);
+       int ret = 0;
+
+       pr_info("%s resample_%c to %s, last %s\n",
+               __func__,
+               (id == RESAMPLE_A) ? 'a' : 'b',
+               auge_resample_texts[index],
+               auge_resample_texts[p_resample->asrc_rate_idx]);
 
        if (!p_resample)
                return 0;
 
-       if (index == p_resample->asrc_rate_idx)
-               return 0;
+       //if (index == p_resample->asrc_rate_idx)
+       //      return 0;
 
        p_resample->asrc_rate_idx = index;
 
-       pr_info("%s resample_%c %s\n",
-               __func__,
-               (id == 0) ? 'a' : 'b',
-               auge_resample_texts[index]);
-
-       if (audio_resample_set(p_resample, (bool)index, resample_rate))
-               return 0;
+       resample_rate = resample_idx2rate(index);
+       ret = audio_resample_set(p_resample, (bool)index, resample_rate);
+       if (ret)
+               return ret;
 
-       if ((index == 0) || (resample_rate == 0))
+       if (index == RATE_OFF)
                resample_disable(p_resample->id);
        else {
                resample_init(p_resample->id, resample_rate);
 
-               resample_set_hw_param(p_resample->id, index - 1);
+               resample_set_hw_param(p_resample->id, index);
        }
 
        return 0;
 }
 
+int resample_set_inner_rate(enum resample_idx id)
+{
+       enum samplerate_index index = get_resample_rate_index(id);
+
+       pr_debug("%s() index %d\n", __func__, id);
+
+       return resample_set(id, index);
+}
+
 static int resample_set_enum(
        struct snd_kcontrol *kcontrol,
        struct snd_ctl_elem_value *ucontrol)
@@ -282,7 +322,8 @@ static int resample_set_enum(
                return 0;
        }
 
-       resample_set(p_resample->id, index);
+       set_resample_rate_index(p_resample->id, index);
+       resample_set_inner_rate(p_resample->id);
 
        return 0;
 }
@@ -345,6 +386,10 @@ static const char *const auge_resample_module_texts[] = {
        "FRHDMIRX", /* from tl1 chipset*/
        "LOOPBACK_B",
        "SPDIFIN_LB",
+       "RESERVED_0",
+       "RESERVED_1",
+       "RESERVED_2",
+       "RESERVED_3",
        "VAD",
 };
 
@@ -388,7 +433,6 @@ static int resample_module_set_enum(
 
        return 0;
 }
-
 static const struct snd_kcontrol_new asrc_a_controls[] = {
        SOC_ENUM_EXT("Hardware resample enable",
                     auge_resample_enum,
@@ -566,6 +610,13 @@ static int resample_platform_probe(struct platform_device *pdev)
                return ret;
        }
 
+       ret = clk_prepare_enable(p_resample->clk);
+       if (ret) {
+               pr_err("Can't enable resample_clk clock: %d\n",
+                       ret);
+               return ret;
+       }
+
        p_resample->dev = dev;
 
        if (p_chipinfo && p_chipinfo->id == 1)
index a86c8c0..1c18d11 100644 (file)
 #ifndef __AML_AUDIO_RESAMPLE_H__
 #define __AML_AUDIO_RESAMPLE_H__
 
+#include "resample_hw.h"
+
 extern int card_add_resample_kcontrols(struct snd_soc_card *card);
 
-extern int resample_set(int id, int index);
+extern int resample_set(enum resample_idx id, enum samplerate_index index);
 
 extern int get_resample_module_num(void);
 
+int set_resample_source(enum resample_idx id, enum toddr_src src);
+
+int resample_set_inner_rate(enum resample_idx id);
+
 #endif
index 1722ce8..03ca3aa 100644 (file)
@@ -40,7 +40,7 @@ static u32 resample_coef_parameters_table[7][5] = {
        {0x00800000, 0x0, 0x0, 0x0, 0x0},
 };
 
-void resample_enable(int id, bool enable)
+void resample_enable(enum resample_idx id, bool enable)
 {
        int offset = EE_AUDIO_RESAMPLEB_CTRL0 - EE_AUDIO_RESAMPLEA_CTRL0;
        int reg = EE_AUDIO_RESAMPLEA_CTRL0 + offset * id;
@@ -58,7 +58,7 @@ void resample_enable(int id, bool enable)
                enable << 28);
 }
 
-int resample_init(int id, int input_sr)
+int resample_init(enum resample_idx id, int input_sr)
 {
        u16 Avg_cnt_init = 0;
        unsigned int clk_rate = 167000000;//clk81;
@@ -77,15 +77,15 @@ int resample_init(int id, int input_sr)
                Avg_cnt_init);
 
        audiobus_update_bits(reg,
-               0x3 << 26 | 0x3ff << 16 | 0xffff << 0,
+               0x3 << 26 | 0x3ff << 16 | 0xffff,
                0x0 << 26 | /* method0 */
                RESAMPLE_CNT_CONTROL << 16 |
-               Avg_cnt_init << 0);
+               Avg_cnt_init);
 
        return 0;
 }
 
-int resample_disable(int id)
+int resample_disable(enum resample_idx id)
 {
        int offset = EE_AUDIO_RESAMPLEB_CTRL0 - EE_AUDIO_RESAMPLEA_CTRL0;
        int reg = EE_AUDIO_RESAMPLEA_CTRL0 + offset * id;
@@ -95,15 +95,20 @@ int resample_disable(int id)
        return 0;
 }
 
-int resample_set_hw_param(int id, int index)
+int resample_set_hw_param(enum resample_idx id,
+               enum samplerate_index rate_index)
 {
        int i, reg, offset;
 
+       if (rate_index < RATE_32K) {
+               pr_info("%s(), inval index %d", __func__, rate_index);
+               return -EINVAL;
+       }
        offset = EE_AUDIO_RESAMPLEB_COEF0 - EE_AUDIO_RESAMPLEA_COEF0;
        reg = EE_AUDIO_RESAMPLEA_COEF0 + offset * id;
        for (i = 0; i < 5; i++) {
                audiobus_write((reg + i),
-                       resample_coef_parameters_table[index][i]);
+                       resample_coef_parameters_table[rate_index - 1][i]);
        }
 
        offset = EE_AUDIO_RESAMPLEB_CTRL2 - EE_AUDIO_RESAMPLEA_CTRL2;
@@ -113,15 +118,15 @@ int resample_set_hw_param(int id, int index)
 
        return 0;
 }
-
+/* not avail for tl1 */
 void resample_src_select(int src)
 {
        audiobus_update_bits(EE_AUDIO_RESAMPLEA_CTRL0,
                0x3 << 29,
                src << 29);
 }
-
-void resample_src_select_ab(int id, int src)
+/* for tl1 and after */
+void resample_src_select_ab(enum resample_idx id, enum toddr_src src)
 {
        int offset = EE_AUDIO_RESAMPLEB_CTRL3 - EE_AUDIO_RESAMPLEA_CTRL3;
        int reg = EE_AUDIO_RESAMPLEA_CTRL3 + offset * id;
@@ -131,7 +136,7 @@ void resample_src_select_ab(int id, int src)
                src << 16);
 }
 
-void resample_format_set(int id, int ch_num, int bits)
+void resample_format_set(enum resample_idx id, int ch_num, int bits)
 {
        int offset = EE_AUDIO_RESAMPLEB_CTRL3 - EE_AUDIO_RESAMPLEA_CTRL3;
        int reg = EE_AUDIO_RESAMPLEA_CTRL3 + offset * id;
@@ -140,7 +145,7 @@ void resample_format_set(int id, int ch_num, int bits)
                ch_num << 8 | (bits - 1) << 0);
 }
 
-int resample_ctrl_read(int id)
+int resample_ctrl_read(enum resample_idx id)
 {
        int offset = EE_AUDIO_RESAMPLEB_CTRL0 - EE_AUDIO_RESAMPLEA_CTRL0;
        int reg = EE_AUDIO_RESAMPLEA_CTRL0 + offset * id;
@@ -148,7 +153,7 @@ int resample_ctrl_read(int id)
        return audiobus_read(reg);
 }
 
-void resample_ctrl_write(int id, int value)
+void resample_ctrl_write(enum resample_idx id, int value)
 {
        int offset = EE_AUDIO_RESAMPLEB_CTRL0 - EE_AUDIO_RESAMPLEA_CTRL0;
        int reg = EE_AUDIO_RESAMPLEA_CTRL0 + offset * id;
index 1ec4b16..5d7c3dd 100644 (file)
 #ifndef __AML_AUDIO_RESAMPLE_HW_H__
 #define __AML_AUDIO_RESAMPLE_HW_H__
 
-extern void resample_enable(int id, bool enable);
-extern int resample_init(int id, int input_sr);
-extern int resample_disable(int id);
-extern int resample_set_hw_param(int id, int index);
+#include "ddr_mngr.h"
+
+enum samplerate_index {
+       RATE_OFF,
+       RATE_32K,
+       RATE_44K,
+       RATE_48K,
+       RATE_88K,
+       RATE_96K,
+       RATE_176K,
+       RATE_192K,
+};
+
+extern void resample_enable(enum resample_idx id, bool enable);
+extern int resample_init(enum resample_idx id, int input_sr);
+extern int resample_disable(enum resample_idx id);
+extern int resample_set_hw_param(enum resample_idx id,
+               enum samplerate_index rate_index);
 extern void resample_src_select(int src);
-extern void resample_src_select_ab(int id, int src);
-extern void resample_format_set(int id, int ch_num, int bits);
+extern void resample_src_select_ab(enum resample_idx id, enum toddr_src src);
+extern void resample_format_set(enum resample_idx id, int ch_num, int bits);
 
-extern int resample_ctrl_read(int id);
-extern void resample_ctrl_write(int id, int value);
+extern int resample_ctrl_read(enum resample_idx id);
+extern void resample_ctrl_write(enum resample_idx id, int value);
 
 #endif
index 5f7bb93..3a51ab0 100644 (file)
@@ -86,11 +86,11 @@ struct aml_spdif {
        /*
         * resample a/b do asrc for spdif in
         */
-       unsigned int asrc_id;
+       enum resample_idx asrc_id;
        /* spdif in do asrc for pcm,
         * if raw data, disable it automatically.
         */
-       unsigned int auto_asrc;
+       enum samplerate_index auto_asrc;
 
        /* check spdifin channel status for pcm or nonpcm */
        struct timer_list timer;
@@ -441,7 +441,7 @@ static void spdifin_audio_type_work_func(struct work_struct *work)
 
        if (val & 0x2)
                /* nonpcm, resample disable */
-               resample_set(p_spdif->asrc_id, 0);
+               resample_set(p_spdif->asrc_id, RATE_OFF);
        else
                /* pcm, resample which rate ? */
                resample_set(p_spdif->asrc_id, p_spdif->auto_asrc);
@@ -652,7 +652,7 @@ static void spdifin_status_event(struct aml_spdif *p_spdif)
 #ifdef __SPDIFIN_AUDIO_TYPE_HW__
                        /* resample disable, by hw */
                        if (!spdifin_check_audiotype_by_sw(p_spdif))
-                               resample_set(p_spdif->asrc_id, 0);
+                               resample_set(p_spdif->asrc_id, RATE_OFF);
 #endif
 #endif
                }
@@ -1075,7 +1075,7 @@ static void aml_dai_spdif_shutdown(
 #ifdef __SPDIFIN_AUDIO_TYPE_HW__
                /* resample disabled, by hw */
                if (!spdifin_check_audiotype_by_sw(p_spdif))
-                       resample_set(p_spdif->asrc_id, 0);
+                       resample_set(p_spdif->asrc_id, RATE_OFF);
 #endif
                clk_disable_unprepare(p_spdif->clk_spdifin);
                clk_disable_unprepare(p_spdif->fixed_clk);