lkml.org 
[lkml]   [2018]   [Jan]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 13/17] ASoC: fsl_ssi: Setup AC97 in fsl_ssi_hw_init()
    Date
    AC97 configures most of registers earlier to start a communication
    with CODECs in order to successfully initialize CODEC. Currently,
    _fsl_ssi_set_dai_fmt() and fsl_ssi_setup_ac97() are called to get
    all SSI registers properly set.

    Since now the driver has a fsl_ssi_hw_init() to handle all register
    initial settings, this patch moves those register settings of AC97
    to the fsl_ssi_hw_init() as well.

    Meanwhile it applies _fsl_ssi_set_dai_fmt() call to AC97 only since
    other formats would be configured via normal set_dai_fmt() directly.

    This patch also adds fsl_ssi_hw_clean() to cleanup control bits for
    AC97 in the platform remote() function.

    Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com>
    Tested-by: Caleb Crome <caleb@crome.org>
    ---
    Changelog
    v2
    * Moved all to fsl_ssi_hw_init() in platform probe()
    * Added fsl_ssi_hw_clean() instead of dai remove()

    sound/soc/fsl/fsl_ssi.c | 26 ++++++++++++++++++++------
    1 file changed, 20 insertions(+), 6 deletions(-)

    diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
    index 50648f5..ebb3eb9 100644
    --- a/sound/soc/fsl/fsl_ssi.c
    +++ b/sound/soc/fsl/fsl_ssi.c
    @@ -987,9 +987,6 @@ static int _fsl_ssi_set_dai_fmt(struct device *dev,
    regmap_write(regs, REG_SSI_SRCR, srcr);
    regmap_write(regs, REG_SSI_SCR, scr);

    - if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_AC97)
    - fsl_ssi_setup_ac97(ssi);
    -
    return 0;
    }

    @@ -1255,10 +1252,28 @@ static int fsl_ssi_hw_init(struct fsl_ssi *ssi)
    regmap_update_bits(ssi->regs, REG_SSI_SCR,
    SSI_SCR_TCH_EN, SSI_SCR_TCH_EN);

    + /* AC97 should start earlier to communicate with CODECs */
    + if (fsl_ssi_is_ac97(ssi)) {
    + _fsl_ssi_set_dai_fmt(ssi->dev, ssi, ssi->dai_fmt);
    + fsl_ssi_setup_ac97(ssi);
    + }
    +
    return 0;
    }

    /**
    + * Clear SSI registers
    + */
    +static void fsl_ssi_hw_clean(struct fsl_ssi *ssi)
    +{
    + /* Disable registers for AC97 */
    + if (fsl_ssi_is_ac97(ssi)) {
    + regmap_write(ssi->regs, REG_SSI_SCR, 0);
    + regmap_write(ssi->regs, REG_SSI_SACNT, 0);
    + regmap_write(ssi->regs, REG_SSI_SOR, 0);
    + }
    +}
    +/**
    * Make every character in a string lower-case
    */
    static void make_lowercase(char *s)
    @@ -1540,9 +1555,6 @@ static int fsl_ssi_probe(struct platform_device *pdev)
    }

    done:
    - if (ssi->dai_fmt)
    - _fsl_ssi_set_dai_fmt(dev, ssi, ssi->dai_fmt);
    -
    /* Initially configures SSI registers */
    fsl_ssi_hw_init(ssi);

    @@ -1587,6 +1599,8 @@ static int fsl_ssi_remove(struct platform_device *pdev)
    {
    struct fsl_ssi *ssi = dev_get_drvdata(&pdev->dev);

    + fsl_ssi_hw_clean(ssi);
    +
    fsl_ssi_debugfs_remove(&ssi->dbg_stats);

    if (ssi->pdev)
    --
    2.7.4
    \
     
     \ /
      Last update: 2018-01-15 05:24    [W:4.030 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site