Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf0d6dd9 authored by Mark Brown's avatar Mark Brown
Browse files

Merge remote-tracking branches 'asoc/fix/amd', 'asoc/fix/arizona',...

Merge remote-tracking branches 'asoc/fix/amd', 'asoc/fix/arizona', 'asoc/fix/dpcm', 'asoc/fix/dwc', 'asoc/fix/fsl' and 'asoc/fix/fsl-ssi' into asoc-linus
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -30,6 +30,8 @@ The compatible list for this generic sound card currently:
 "fsl,imx-audio-sgtl5000"
 "fsl,imx-audio-sgtl5000"
 (compatible with Documentation/devicetree/bindings/sound/imx-audio-sgtl5000.txt)
 (compatible with Documentation/devicetree/bindings/sound/imx-audio-sgtl5000.txt)


 "fsl,imx-audio-wm8960"

Required properties:
Required properties:


  - compatible		: Contains one of entries in the compatible list.
  - compatible		: Contains one of entries in the compatible list.
+1 −0
Original line number Original line Diff line number Diff line
@@ -635,6 +635,7 @@ static int acp_dma_open(struct snd_pcm_substream *substream)
					    SNDRV_PCM_HW_PARAM_PERIODS);
					    SNDRV_PCM_HW_PARAM_PERIODS);
	if (ret < 0) {
	if (ret < 0) {
		dev_err(prtd->platform->dev, "set integer constraint failed\n");
		dev_err(prtd->platform->dev, "set integer constraint failed\n");
		kfree(adata);
		return ret;
		return ret;
	}
	}


+42 −1
Original line number Original line Diff line number Diff line
@@ -1929,6 +1929,25 @@ static struct {
	{ 1000000, 13500000, 0,  1 },
	{ 1000000, 13500000, 0,  1 },
};
};


static const unsigned int pseudo_fref_max[ARIZONA_FLL_MAX_FRATIO] = {
	13500000,
	 6144000,
	 6144000,
	 3072000,
	 3072000,
	 2822400,
	 2822400,
	 1536000,
	 1536000,
	 1536000,
	 1536000,
	 1536000,
	 1536000,
	 1536000,
	 1536000,
	  768000,
};

static struct {
static struct {
	unsigned int min;
	unsigned int min;
	unsigned int max;
	unsigned int max;
@@ -2042,16 +2061,32 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
	/* Adjust FRATIO/refdiv to avoid integer mode if possible */
	/* Adjust FRATIO/refdiv to avoid integer mode if possible */
	refdiv = cfg->refdiv;
	refdiv = cfg->refdiv;


	arizona_fll_dbg(fll, "pseudo: initial ratio=%u fref=%u refdiv=%u\n",
			init_ratio, Fref, refdiv);

	while (div <= ARIZONA_FLL_MAX_REFDIV) {
	while (div <= ARIZONA_FLL_MAX_REFDIV) {
		for (ratio = init_ratio; ratio <= ARIZONA_FLL_MAX_FRATIO;
		for (ratio = init_ratio; ratio <= ARIZONA_FLL_MAX_FRATIO;
		     ratio++) {
		     ratio++) {
			if ((ARIZONA_FLL_VCO_CORNER / 2) /
			if ((ARIZONA_FLL_VCO_CORNER / 2) /
			    (fll->vco_mult * ratio) < Fref)
			    (fll->vco_mult * ratio) < Fref) {
				arizona_fll_dbg(fll, "pseudo: hit VCO corner\n");
				break;
				break;
			}

			if (Fref > pseudo_fref_max[ratio - 1]) {
				arizona_fll_dbg(fll,
					"pseudo: exceeded max fref(%u) for ratio=%u\n",
					pseudo_fref_max[ratio - 1],
					ratio);
				break;
			}


			if (target % (ratio * Fref)) {
			if (target % (ratio * Fref)) {
				cfg->refdiv = refdiv;
				cfg->refdiv = refdiv;
				cfg->fratio = ratio - 1;
				cfg->fratio = ratio - 1;
				arizona_fll_dbg(fll,
					"pseudo: found fref=%u refdiv=%d(%d) ratio=%d\n",
					Fref, refdiv, div, ratio);
				return ratio;
				return ratio;
			}
			}
		}
		}
@@ -2060,6 +2095,9 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
			if (target % (ratio * Fref)) {
			if (target % (ratio * Fref)) {
				cfg->refdiv = refdiv;
				cfg->refdiv = refdiv;
				cfg->fratio = ratio - 1;
				cfg->fratio = ratio - 1;
				arizona_fll_dbg(fll,
					"pseudo: found fref=%u refdiv=%d(%d) ratio=%d\n",
					Fref, refdiv, div, ratio);
				return ratio;
				return ratio;
			}
			}
		}
		}
@@ -2068,6 +2106,9 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
		Fref /= 2;
		Fref /= 2;
		refdiv++;
		refdiv++;
		init_ratio = arizona_find_fratio(Fref, NULL);
		init_ratio = arizona_find_fratio(Fref, NULL);
		arizona_fll_dbg(fll,
				"pseudo: change fref=%u refdiv=%d(%d) ratio=%u\n",
				Fref, refdiv, div, init_ratio);
	}
	}


	arizona_fll_warn(fll, "Falling back to integer mode operation\n");
	arizona_fll_warn(fll, "Falling back to integer mode operation\n");
+2 −3
Original line number Original line Diff line number Diff line
@@ -645,6 +645,8 @@ static int dw_i2s_probe(struct platform_device *pdev)


	dev->dev = &pdev->dev;
	dev->dev = &pdev->dev;


	dev->i2s_reg_comp1 = I2S_COMP_PARAM_1;
	dev->i2s_reg_comp2 = I2S_COMP_PARAM_2;
	if (pdata) {
	if (pdata) {
		dev->capability = pdata->cap;
		dev->capability = pdata->cap;
		clk_id = NULL;
		clk_id = NULL;
@@ -652,9 +654,6 @@ static int dw_i2s_probe(struct platform_device *pdev)
		if (dev->quirks & DW_I2S_QUIRK_COMP_REG_OFFSET) {
		if (dev->quirks & DW_I2S_QUIRK_COMP_REG_OFFSET) {
			dev->i2s_reg_comp1 = pdata->i2s_reg_comp1;
			dev->i2s_reg_comp1 = pdata->i2s_reg_comp1;
			dev->i2s_reg_comp2 = pdata->i2s_reg_comp2;
			dev->i2s_reg_comp2 = pdata->i2s_reg_comp2;
		} else {
			dev->i2s_reg_comp1 = I2S_COMP_PARAM_1;
			dev->i2s_reg_comp2 = I2S_COMP_PARAM_2;
		}
		}
		ret = dw_configure_dai_by_pd(dev, dw_i2s_dai, res, pdata);
		ret = dw_configure_dai_by_pd(dev, dw_i2s_dai, res, pdata);
	} else {
	} else {
+22 −20
Original line number Original line Diff line number Diff line
@@ -112,20 +112,6 @@ struct fsl_ssi_rxtx_reg_val {
	struct fsl_ssi_reg_val tx;
	struct fsl_ssi_reg_val tx;
};
};


static const struct reg_default fsl_ssi_reg_defaults[] = {
	{CCSR_SSI_SCR,     0x00000000},
	{CCSR_SSI_SIER,    0x00003003},
	{CCSR_SSI_STCR,    0x00000200},
	{CCSR_SSI_SRCR,    0x00000200},
	{CCSR_SSI_STCCR,   0x00040000},
	{CCSR_SSI_SRCCR,   0x00040000},
	{CCSR_SSI_SACNT,   0x00000000},
	{CCSR_SSI_STMSK,   0x00000000},
	{CCSR_SSI_SRMSK,   0x00000000},
	{CCSR_SSI_SACCEN,  0x00000000},
	{CCSR_SSI_SACCDIS, 0x00000000},
};

static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)
static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)
{
{
	switch (reg) {
	switch (reg) {
@@ -190,8 +176,7 @@ static const struct regmap_config fsl_ssi_regconfig = {
	.val_bits = 32,
	.val_bits = 32,
	.reg_stride = 4,
	.reg_stride = 4,
	.val_format_endian = REGMAP_ENDIAN_NATIVE,
	.val_format_endian = REGMAP_ENDIAN_NATIVE,
	.reg_defaults = fsl_ssi_reg_defaults,
	.num_reg_defaults_raw = CCSR_SSI_SACCDIS / sizeof(uint32_t) + 1,
	.num_reg_defaults = ARRAY_SIZE(fsl_ssi_reg_defaults),
	.readable_reg = fsl_ssi_readable_reg,
	.readable_reg = fsl_ssi_readable_reg,
	.volatile_reg = fsl_ssi_volatile_reg,
	.volatile_reg = fsl_ssi_volatile_reg,
	.precious_reg = fsl_ssi_precious_reg,
	.precious_reg = fsl_ssi_precious_reg,
@@ -201,6 +186,7 @@ static const struct regmap_config fsl_ssi_regconfig = {


struct fsl_ssi_soc_data {
struct fsl_ssi_soc_data {
	bool imx;
	bool imx;
	bool imx21regs; /* imx21-class SSI - no SACC{ST,EN,DIS} regs */
	bool offline_config;
	bool offline_config;
	u32 sisr_write_mask;
	u32 sisr_write_mask;
};
};
@@ -303,6 +289,7 @@ static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = {


static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
	.imx = true,
	.imx = true,
	.imx21regs = true,
	.offline_config = true,
	.offline_config = true,
	.sisr_write_mask = 0,
	.sisr_write_mask = 0,
};
};
@@ -586,8 +573,12 @@ static void fsl_ssi_setup_ac97(struct fsl_ssi_private *ssi_private)
	 */
	 */
	regmap_write(regs, CCSR_SSI_SACNT,
	regmap_write(regs, CCSR_SSI_SACNT,
			CCSR_SSI_SACNT_AC97EN | CCSR_SSI_SACNT_FV);
			CCSR_SSI_SACNT_AC97EN | CCSR_SSI_SACNT_FV);

	/* no SACC{ST,EN,DIS} regs on imx21-class SSI */
	if (!ssi_private->soc->imx21regs) {
		regmap_write(regs, CCSR_SSI_SACCDIS, 0xff);
		regmap_write(regs, CCSR_SSI_SACCDIS, 0xff);
		regmap_write(regs, CCSR_SSI_SACCEN, 0x300);
		regmap_write(regs, CCSR_SSI_SACCEN, 0x300);
	}


	/*
	/*
	 * Enable SSI, Transmit and Receive. AC97 has to communicate with the
	 * Enable SSI, Transmit and Receive. AC97 has to communicate with the
@@ -1397,6 +1388,7 @@ static int fsl_ssi_probe(struct platform_device *pdev)
	struct resource *res;
	struct resource *res;
	void __iomem *iomem;
	void __iomem *iomem;
	char name[64];
	char name[64];
	struct regmap_config regconfig = fsl_ssi_regconfig;


	of_id = of_match_device(fsl_ssi_ids, &pdev->dev);
	of_id = of_match_device(fsl_ssi_ids, &pdev->dev);
	if (!of_id || !of_id->data)
	if (!of_id || !of_id->data)
@@ -1444,15 +1436,25 @@ static int fsl_ssi_probe(struct platform_device *pdev)
		return PTR_ERR(iomem);
		return PTR_ERR(iomem);
	ssi_private->ssi_phys = res->start;
	ssi_private->ssi_phys = res->start;


	if (ssi_private->soc->imx21regs) {
		/*
		 * According to datasheet imx21-class SSI
		 * don't have SACC{ST,EN,DIS} regs.
		 */
		regconfig.max_register = CCSR_SSI_SRMSK;
		regconfig.num_reg_defaults_raw =
			CCSR_SSI_SRMSK / sizeof(uint32_t) + 1;
	}

	ret = of_property_match_string(np, "clock-names", "ipg");
	ret = of_property_match_string(np, "clock-names", "ipg");
	if (ret < 0) {
	if (ret < 0) {
		ssi_private->has_ipg_clk_name = false;
		ssi_private->has_ipg_clk_name = false;
		ssi_private->regs = devm_regmap_init_mmio(&pdev->dev, iomem,
		ssi_private->regs = devm_regmap_init_mmio(&pdev->dev, iomem,
			&fsl_ssi_regconfig);
			&regconfig);
	} else {
	} else {
		ssi_private->has_ipg_clk_name = true;
		ssi_private->has_ipg_clk_name = true;
		ssi_private->regs = devm_regmap_init_mmio_clk(&pdev->dev,
		ssi_private->regs = devm_regmap_init_mmio_clk(&pdev->dev,
			"ipg", iomem, &fsl_ssi_regconfig);
			"ipg", iomem, &regconfig);
	}
	}
	if (IS_ERR(ssi_private->regs)) {
	if (IS_ERR(ssi_private->regs)) {
		dev_err(&pdev->dev, "Failed to init register map\n");
		dev_err(&pdev->dev, "Failed to init register map\n");
Loading