Merge remote-tracking branch 'asoc/fix/fsl-ssi' into asoc-linus
[sfrench/cifs-2.6.git] / sound / soc / fsl / fsl_ssi.c
index 059496ed9ad76c4771ccafbe593a1e0c971f9420..b9fabbf69db6c9830ebf0de211f62735a24297b8 100644 (file)
@@ -160,7 +160,7 @@ struct fsl_ssi_soc_data {
  */
 struct fsl_ssi_private {
        struct regmap *regs;
-       unsigned int irq;
+       int irq;
        struct snd_soc_dai_driver cpu_dai_drv;
 
        unsigned int dai_fmt;
@@ -603,10 +603,6 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
        factor = (div2 + 1) * (7 * psr + 1) * 2;
 
        for (i = 0; i < 255; i++) {
-               /* The bclk rate must be smaller than 1/5 sysclk rate */
-               if (factor * (i + 1) < 5)
-                       continue;
-
                tmprate = freq * factor * (i + 2);
 
                if (baudclk_is_used)
@@ -614,6 +610,13 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
                else
                        clkrate = clk_round_rate(ssi_private->baudclk, tmprate);
 
+               /*
+                * Hardware limitation: The bclk rate must be
+                * never greater than 1/5 IPG clock rate
+                */
+               if (clkrate * 5 > clk_get_rate(ssi_private->clk))
+                       continue;
+
                clkrate /= factor;
                afreq = clkrate / (i + 1);
 
@@ -992,8 +995,8 @@ static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask,
        regmap_update_bits(regs, CCSR_SSI_SCR, CCSR_SSI_SCR_SSIEN,
                        CCSR_SSI_SCR_SSIEN);
 
-       regmap_write(regs, CCSR_SSI_STMSK, tx_mask);
-       regmap_write(regs, CCSR_SSI_SRMSK, rx_mask);
+       regmap_write(regs, CCSR_SSI_STMSK, ~tx_mask);
+       regmap_write(regs, CCSR_SSI_SRMSK, ~rx_mask);
 
        regmap_update_bits(regs, CCSR_SSI_SCR, CCSR_SSI_SCR_SSIEN, val);
 
@@ -1362,8 +1365,8 @@ static int fsl_ssi_probe(struct platform_device *pdev)
        }
 
        ssi_private->irq = platform_get_irq(pdev, 0);
-       if (ssi_private->irq < 0) {
-               dev_err(&pdev->dev, "no irq for node %s\n", np->full_name);
+       if (!ssi_private->irq) {
+               dev_err(&pdev->dev, "no irq for node %s\n", pdev->name);
                return ssi_private->irq;
        }