]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - tas2770sw-android/tas2770sw-android.git/commitdiff
Add slot width setting
authorTracy Yi <tracy-yi@ti.com>
Wed, 14 Feb 2018 09:29:26 +0000 (17:29 +0800)
committerTracy Yi <tracy-yi@ti.com>
Wed, 14 Feb 2018 09:29:26 +0000 (17:29 +0800)
Signed-off-by: Tracy Yi <tracy-yi@ti.com>
dts.readme
tas2770-codec.c
tas2770-regmap.c
tas2770.h

index 0c38f90ba4ea9faaf89a25706eaf5d561d800d50..4fc2fea68856aae35b4af2470138388cf02388af 100644 (file)
@@ -5,8 +5,9 @@ example for dts:
                        ti,reset-gpio = <&msmgpio 13 0>;
                        ti,irq-gpio = <&msmgpio 59 0>;
                        ti,asi-format = <0>; /* 0, i2S; 1, DSP;  */
                        ti,reset-gpio = <&msmgpio 13 0>;
                        ti,irq-gpio = <&msmgpio 59 0>;
                        ti,asi-format = <0>; /* 0, i2S; 1, DSP;  */
-                       ti,ppg = <0>; /* 0, 0dB default; 1, enable -2dB */
                        ti,left-slot = <0>; /* <left slot number> */
                        ti,right-slot = <1>; /* <right slot number> */
                        ti,left-slot = <0>; /* <left slot number> */
                        ti,right-slot = <1>; /* <right slot number> */
+                       ti,imon-slot-no = <0>; /* <current sense slot number> */
+                       ti,vmon-slot-no = <2>; /* <current voltage slot number> */
                        status = "ok";
                };
\ No newline at end of file
                        status = "ok";
                };
\ No newline at end of file
index e47a024ef50660fad8b762f51813d625aaf6fcec..1dabd7b7b9d74796d7875abe7fa956c3f41b9090 100644 (file)
@@ -47,6 +47,8 @@
 
 #define TAS2770_MDELAY 0xFFFFFFFE
 
 
 #define TAS2770_MDELAY 0xFFFFFFFE
 
+static int tas2770_set_slot(struct snd_soc_codec *codec, int slot_width);
+
 static unsigned int tas2770_codec_read(struct snd_soc_codec *codec,
                unsigned int reg)
 {
 static unsigned int tas2770_codec_read(struct snd_soc_codec *codec,
                unsigned int reg)
 {
@@ -106,9 +108,7 @@ static int tas2770_codec_suspend(struct snd_soc_codec *codec)
        mutex_lock(&pTAS2770->codec_lock);
 
        dev_dbg(pTAS2770->dev, "%s\n", __func__);
        mutex_lock(&pTAS2770->codec_lock);
 
        dev_dbg(pTAS2770->dev, "%s\n", __func__);
-       snd_soc_update_bits(codec, TAS2770_PowerControl,
-                       TAS2770_PowerControl_OperationalMode10_Mask,
-                       TAS2770_PowerControl_OperationalMode10_Shutdown);
+
        mutex_unlock(&pTAS2770->codec_lock);
        return ret;
 }
        mutex_unlock(&pTAS2770->codec_lock);
        return ret;
 }
@@ -121,9 +121,6 @@ static int tas2770_codec_resume(struct snd_soc_codec *codec)
        mutex_lock(&pTAS2770->codec_lock);
 
        dev_dbg(pTAS2770->dev, "%s\n", __func__);
        mutex_lock(&pTAS2770->codec_lock);
 
        dev_dbg(pTAS2770->dev, "%s\n", __func__);
-       snd_soc_update_bits(codec, TAS2770_PowerControl,
-               TAS2770_PowerControl_OperationalMode10_Mask,
-               TAS2770_PowerControl_OperationalMode10_Active);
 
        mutex_unlock(&pTAS2770->codec_lock);
        return ret;
 
        mutex_unlock(&pTAS2770->codec_lock);
        return ret;
@@ -150,7 +147,7 @@ static int tas2770_dac_event(struct snd_soc_dapm_widget *w,
        case SND_SOC_DAPM_POST_PMU:
                snd_soc_update_bits(codec, TAS2770_PowerControl,
                        TAS2770_PowerControl_OperationalMode10_Mask,
        case SND_SOC_DAPM_POST_PMU:
                snd_soc_update_bits(codec, TAS2770_PowerControl,
                        TAS2770_PowerControl_OperationalMode10_Mask,
-                       TAS2770_PowerControl_OperationalMode10_Active);
+                       TAS2770_PowerControl_OperationalMode10_Mute);
                break;
        case SND_SOC_DAPM_PRE_PMD:
                snd_soc_update_bits(codec, TAS2770_PowerControl,
                break;
        case SND_SOC_DAPM_PRE_PMD:
                snd_soc_update_bits(codec, TAS2770_PowerControl,
@@ -222,6 +219,7 @@ static int tas2770_hw_params(struct snd_pcm_substream *substream,
        struct snd_soc_codec *codec = dai->codec;
        struct tas2770_priv *pTAS2770 = snd_soc_codec_get_drvdata(codec);
        int ret = 0;
        struct snd_soc_codec *codec = dai->codec;
        struct tas2770_priv *pTAS2770 = snd_soc_codec_get_drvdata(codec);
        int ret = 0;
+       int slot_width_tmp = 16;
 
        dev_dbg(pTAS2770->dev, "%s, format: %d\n", __func__,
                params_format(params));
 
        dev_dbg(pTAS2770->dev, "%s, format: %d\n", __func__,
                params_format(params));
@@ -230,45 +228,53 @@ static int tas2770_hw_params(struct snd_pcm_substream *substream,
        case SNDRV_PCM_FORMAT_S16_LE:
                snd_soc_update_bits(codec,
                        TAS2770_TDMConfigurationReg2,
        case SNDRV_PCM_FORMAT_S16_LE:
                snd_soc_update_bits(codec,
                        TAS2770_TDMConfigurationReg2,
-                       TAS2770_TDMConfigurationReg2_RXWLEN32_Mask |
-                       TAS2770_TDMConfigurationReg2_RXSLEN10_Mask,
-                       TAS2770_TDMConfigurationReg2_RXWLEN32_16Bits |
-                       TAS2770_TDMConfigurationReg2_RXSLEN10_16Bits);
-                       pTAS2770->ch_size = 16;
+                       TAS2770_TDMConfigurationReg2_RXWLEN32_Mask,
+                       TAS2770_TDMConfigurationReg2_RXWLEN32_16Bits);
+                       pTAS2770->mnCh_size = 16;
+                       if (pTAS2770->mnSlot_width == 0)
+                               slot_width_tmp = 16;
                break;
        case SNDRV_PCM_FORMAT_S24_LE:
                        snd_soc_update_bits(codec,
                        TAS2770_TDMConfigurationReg2,
                break;
        case SNDRV_PCM_FORMAT_S24_LE:
                        snd_soc_update_bits(codec,
                        TAS2770_TDMConfigurationReg2,
-                       TAS2770_TDMConfigurationReg2_RXWLEN32_Mask |
-                       TAS2770_TDMConfigurationReg2_RXSLEN10_Mask,
-                       TAS2770_TDMConfigurationReg2_RXWLEN32_24Bits  |
-                       TAS2770_TDMConfigurationReg2_RXSLEN10_32Bits);
-                       pTAS2770->ch_size = 32;
+                       TAS2770_TDMConfigurationReg2_RXWLEN32_Mask,
+                       TAS2770_TDMConfigurationReg2_RXWLEN32_24Bits);
+                       pTAS2770->mnCh_size = 24;
+                       if (pTAS2770->mnSlot_width == 0)
+                               slot_width_tmp = 32;
                break;
        case SNDRV_PCM_FORMAT_S32_LE:
                        snd_soc_update_bits(codec,
                        TAS2770_TDMConfigurationReg2,
                break;
        case SNDRV_PCM_FORMAT_S32_LE:
                        snd_soc_update_bits(codec,
                        TAS2770_TDMConfigurationReg2,
-                       TAS2770_TDMConfigurationReg2_RXWLEN32_Mask |
-                       TAS2770_TDMConfigurationReg2_RXSLEN10_Mask,
-                       TAS2770_TDMConfigurationReg2_RXWLEN32_32Bits |
-                       TAS2770_TDMConfigurationReg2_RXSLEN10_32Bits);
-                       pTAS2770->ch_size = 32;
+                       TAS2770_TDMConfigurationReg2_RXWLEN32_Mask,
+                       TAS2770_TDMConfigurationReg2_RXWLEN32_32Bits);
+                       pTAS2770->mnCh_size = 32;
+                       if (pTAS2770->mnSlot_width == 0)
+                               slot_width_tmp = 32;
                break;
 
                break;
 
+       default:
+               dev_dbg(pTAS2770->dev, "Not supported params format\n");
+               return -EINVAL;
        }
 
        }
 
-       dev_dbg(pTAS2770->dev, "ch_size: %d\n", pTAS2770->ch_size);
+       /* If machine driver did not call set slot width */
+       if (pTAS2770->mnSlot_width == 0)
+               tas2770_set_slot(codec, slot_width_tmp);
+
+       dev_dbg(pTAS2770->dev, "mnCh_size: %d\n", pTAS2770->mnCh_size);
        snd_soc_update_bits(codec,
                TAS2770_TDMConfigurationReg5,
                TAS2770_TDMConfigurationReg5_VSNSTX_Mask |
                TAS2770_TDMConfigurationReg5_VSNSSLOT50_Mask,
                TAS2770_TDMConfigurationReg5_VSNSTX_Enable |
        snd_soc_update_bits(codec,
                TAS2770_TDMConfigurationReg5,
                TAS2770_TDMConfigurationReg5_VSNSTX_Mask |
                TAS2770_TDMConfigurationReg5_VSNSSLOT50_Mask,
                TAS2770_TDMConfigurationReg5_VSNSTX_Enable |
-               (pTAS2770->ch_size >> 3));
+               pTAS2770->mnVmon_slot_no);
        snd_soc_update_bits(codec,
                TAS2770_TDMConfigurationReg6,
                TAS2770_TDMConfigurationReg6_ISNSTX_Mask |
                TAS2770_TDMConfigurationReg6_ISNSSLOT50_Mask,
        snd_soc_update_bits(codec,
                TAS2770_TDMConfigurationReg6,
                TAS2770_TDMConfigurationReg6_ISNSTX_Mask |
                TAS2770_TDMConfigurationReg6_ISNSSLOT50_Mask,
-               TAS2770_TDMConfigurationReg6_ISNSTX_Enable);
+               TAS2770_TDMConfigurationReg6_ISNSTX_Enable |
+               pTAS2770->mnImon_slot_no);
 
        dev_dbg(pTAS2770->dev, "%s, sample rate: %d\n", __func__,
                params_rate(params));
 
        dev_dbg(pTAS2770->dev, "%s, sample rate: %d\n", __func__,
                params_rate(params));
@@ -391,10 +397,69 @@ static int tas2770_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
        return ret;
 }
 
        return ret;
 }
 
+static int tas2770_set_slot(struct snd_soc_codec *codec, int slot_width)
+{
+       int ret = 0;
+       struct tas2770_priv *pTAS2770 = snd_soc_codec_get_drvdata(codec);
+
+       switch (slot_width) {
+       case 16:
+       ret = snd_soc_update_bits(codec,
+               TAS2770_TDMConfigurationReg2,
+               TAS2770_TDMConfigurationReg2_RXSLEN10_Mask,
+               TAS2770_TDMConfigurationReg2_RXSLEN10_16Bits);
+       break;
+
+       case 24:
+       ret = snd_soc_update_bits(codec,
+               TAS2770_TDMConfigurationReg2,
+               TAS2770_TDMConfigurationReg2_RXSLEN10_Mask,
+               TAS2770_TDMConfigurationReg2_RXSLEN10_24Bits);
+       break;
+
+       case 32:
+       ret = snd_soc_update_bits(codec,
+               TAS2770_TDMConfigurationReg2,
+               TAS2770_TDMConfigurationReg2_RXSLEN10_Mask,
+               TAS2770_TDMConfigurationReg2_RXSLEN10_32Bits);
+       break;
+
+       case 0:
+       /* Do not change slot width */
+       break;
+
+       default:
+               dev_dbg(pTAS2770->dev, "slot width not supported");
+               ret = -EINVAL;
+       }
+
+       if (ret >= 0)
+               pTAS2770->mnSlot_width = slot_width;
+
+       return ret;
+}
+
+static int tas2770_set_dai_tdm_slot(struct snd_soc_dai *dai,
+               unsigned int tx_mask, unsigned int rx_mask,
+               int slots, int slot_width)
+{
+       int ret = 0;
+       struct snd_soc_codec *codec = dai->codec;
+       struct tas2770_priv *pTAS2770 = snd_soc_codec_get_drvdata(codec);
+
+       dev_dbg(pTAS2770->dev, "%s, tx_mask:%d, rx_mask:%d, slots:%d, slot_width:%d",
+                       __func__, tx_mask, rx_mask, slots, slot_width);
+
+       ret = tas2770_set_slot(codec, slot_width);
+
+       return ret;
+}
+
 static struct snd_soc_dai_ops tas2770_dai_ops = {
        .digital_mute = tas2770_mute,
        .hw_params  = tas2770_hw_params,
        .set_fmt    = tas2770_set_dai_fmt,
 static struct snd_soc_dai_ops tas2770_dai_ops = {
        .digital_mute = tas2770_mute,
        .hw_params  = tas2770_hw_params,
        .set_fmt    = tas2770_set_dai_fmt,
+       .set_tdm_slot = tas2770_set_dai_tdm_slot,
 };
 
 #define TAS2770_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
 };
 
 #define TAS2770_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
index 9afbbd0cd249909b8ac747ee4ab4f82a70dff7dc..8038b28cf0e37924bb42204bedef6c7fdecf2dc6 100644 (file)
@@ -278,6 +278,24 @@ static int tas2770_parse_dt(struct device *dev, struct tas2770_priv *pTAS2770)
                        pTAS2770->mnRightSlot);
        }
 
                        pTAS2770->mnRightSlot);
        }
 
+       of_property_read_u32(np, "ti,imon-slot-no", &pTAS2770->mnImon_slot_no);
+       if (rc) {
+               dev_err(pTAS2770->dev, "Looking up %s property in node %s failed %d\n",
+                       "ti,imon-slot-no", np->full_name, rc);
+       } else {
+               dev_dbg(pTAS2770->dev, "ti,imon-slot-no=%d",
+                       pTAS2770->mnImon_slot_no);
+       }
+
+       of_property_read_u32(np, "ti,vmon-slot-no", &pTAS2770->mnVmon_slot_no);
+       if (rc) {
+               dev_err(pTAS2770->dev, "Looking up %s property in node %s failed %d\n",
+                       "ti,vmon-slot-no", np->full_name, rc);
+       } else {
+               dev_dbg(pTAS2770->dev, "ti,vmon-slot-no=%d",
+                       pTAS2770->mnVmon_slot_no);
+       }
+
        return ret;
 }
 
        return ret;
 }
 
@@ -348,6 +366,11 @@ static int tas2770_i2c_probe(struct i2c_client *client,
        pTAS2770->enableIRQ = tas2770_enableIRQ;
        pTAS2770->runtime_suspend = tas2770_runtime_suspend;
        pTAS2770->runtime_resume = tas2770_runtime_resume;
        pTAS2770->enableIRQ = tas2770_enableIRQ;
        pTAS2770->runtime_suspend = tas2770_runtime_suspend;
        pTAS2770->runtime_resume = tas2770_runtime_resume;
+       pTAS2770->mnCh_size = 0;
+       pTAS2770->mnSlot_width = 0;
+
+       tas2770_hw_reset(pTAS2770);
+
        mutex_init(&pTAS2770->dev_lock);
        if (nResult < 0)
                goto destroy_mutex;
        mutex_init(&pTAS2770->dev_lock);
        if (nResult < 0)
                goto destroy_mutex;
index b6b7e650a49744105a60dac813678065f5797486..42ec701d6c1bc19015164640f02c060d9af06f4f 100644 (file)
--- a/tas2770.h
+++ b/tas2770.h
@@ -729,7 +729,10 @@ struct tas2770_priv {
        int mnPPG;
        int mnLeftSlot;
        int mnRightSlot;
        int mnPPG;
        int mnLeftSlot;
        int mnRightSlot;
-       int ch_size;
+       int mnCh_size;
+       int mnSlot_width;
+       int mnVmon_slot_no;
+       int mnImon_slot_no;
        void (*hw_reset)(struct tas2770_priv *pTAS2770);
        void (*clearIRQ)(struct tas2770_priv *pTAS2770);
        void (*enableIRQ)(struct tas2770_priv *pTAS2770, bool enable);
        void (*hw_reset)(struct tas2770_priv *pTAS2770);
        void (*clearIRQ)(struct tas2770_priv *pTAS2770);
        void (*enableIRQ)(struct tas2770_priv *pTAS2770, bool enable);