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

Commit 0023f8a6 authored by Mark Brown's avatar Mark Brown
Browse files

Merge branch 'topic/arizona' of...

Merge branch 'topic/arizona' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-adsp
parents 9ee78757 56574d54
Loading
Loading
Loading
Loading
+18 −14
Original line number Diff line number Diff line
@@ -221,6 +221,8 @@ int arizona_init_spk(struct snd_soc_codec *codec)

	switch (arizona->type) {
	case WM8997:
	case CS47L24:
	case WM1831:
		break;
	default:
		ret = snd_soc_dapm_new_controls(dapm, &arizona_spkr, 1);
@@ -1122,7 +1124,6 @@ int arizona_anc_ev(struct snd_soc_dapm_widget *w,
		   int event)
{
	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
	unsigned int mask = 0x3 << w->shift;
	unsigned int val;

	switch (event) {
@@ -1136,7 +1137,7 @@ int arizona_anc_ev(struct snd_soc_dapm_widget *w,
		return 0;
	}

	snd_soc_update_bits(codec, ARIZONA_CLOCK_CONTROL, mask, val);
	snd_soc_write(codec, ARIZONA_CLOCK_CONTROL, val);

	return 0;
}
@@ -2035,7 +2036,21 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
			init_ratio, Fref, refdiv);

	while (div <= ARIZONA_FLL_MAX_REFDIV) {
		for (ratio = init_ratio; ratio <= ARIZONA_FLL_MAX_FRATIO;
		/* start from init_ratio because this may already give a
		 * fractional N.K
		 */
		for (ratio = init_ratio; ratio > 0; ratio--) {
			if (target % (ratio * Fref)) {
				cfg->refdiv = refdiv;
				cfg->fratio = ratio - 1;
				arizona_fll_dbg(fll,
					"pseudo: found fref=%u refdiv=%d(%d) ratio=%d\n",
					Fref, refdiv, div, ratio);
				return ratio;
			}
		}

		for (ratio = init_ratio + 1; ratio <= ARIZONA_FLL_MAX_FRATIO;
		     ratio++) {
			if ((ARIZONA_FLL_VCO_CORNER / 2) /
			    (fll->vco_mult * ratio) < Fref) {
@@ -2061,17 +2076,6 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
			}
		}

		for (ratio = init_ratio - 1; ratio > 0; ratio--) {
			if (target % (ratio * Fref)) {
				cfg->refdiv = refdiv;
				cfg->fratio = ratio - 1;
				arizona_fll_dbg(fll,
					"pseudo: found fref=%u refdiv=%d(%d) ratio=%d\n",
					Fref, refdiv, div, ratio);
				return ratio;
			}
		}

		div *= 2;
		Fref /= 2;
		refdiv++;
+5 −0
Original line number Diff line number Diff line
@@ -1271,10 +1271,15 @@ static int cs47l24_probe(struct platform_device *pdev)

static int cs47l24_remove(struct platform_device *pdev)
{
	struct cs47l24_priv *cs47l24 = platform_get_drvdata(pdev);

	snd_soc_unregister_platform(&pdev->dev);
	snd_soc_unregister_codec(&pdev->dev);
	pm_runtime_disable(&pdev->dev);

	wm_adsp2_remove(&cs47l24->core.adsp[1]);
	wm_adsp2_remove(&cs47l24->core.adsp[2]);

	return 0;
}

+4 −0
Original line number Diff line number Diff line
@@ -2093,10 +2093,14 @@ static int wm5102_probe(struct platform_device *pdev)

static int wm5102_remove(struct platform_device *pdev)
{
	struct wm5102_priv *wm5102 = platform_get_drvdata(pdev);

	snd_soc_unregister_platform(&pdev->dev);
	snd_soc_unregister_codec(&pdev->dev);
	pm_runtime_disable(&pdev->dev);

	wm_adsp2_remove(&wm5102->core.adsp[0]);

	return 0;
}

+6 −0
Original line number Diff line number Diff line
@@ -2435,10 +2435,16 @@ static int wm5110_probe(struct platform_device *pdev)

static int wm5110_remove(struct platform_device *pdev)
{
	struct wm5110_priv *wm5110 = platform_get_drvdata(pdev);
	int i;

	snd_soc_unregister_platform(&pdev->dev);
	snd_soc_unregister_codec(&pdev->dev);
	pm_runtime_disable(&pdev->dev);

	for (i = 0; i < WM5110_NUM_ADSP; i++)
		wm_adsp2_remove(&wm5110->core.adsp[i]);

	return 0;
}

+36 −16
Original line number Diff line number Diff line
@@ -1037,6 +1037,13 @@ static void wm_adsp_ctl_work(struct work_struct *work)
	kfree(ctl_work);
}

static void wm_adsp_free_ctl_blk(struct wm_coeff_ctl *ctl)
{
	kfree(ctl->cache);
	kfree(ctl->name);
	kfree(ctl);
}

static int wm_adsp_create_control(struct wm_adsp *dsp,
				  const struct wm_adsp_alg_region *alg_region,
				  unsigned int offset, unsigned int len,
@@ -1652,6 +1659,19 @@ static struct wm_adsp_alg_region *wm_adsp_create_region(struct wm_adsp *dsp,
	return alg_region;
}

static void wm_adsp_free_alg_regions(struct wm_adsp *dsp)
{
	struct wm_adsp_alg_region *alg_region;

	while (!list_empty(&dsp->alg_regions)) {
		alg_region = list_first_entry(&dsp->alg_regions,
					      struct wm_adsp_alg_region,
					      list);
		list_del(&alg_region->list);
		kfree(alg_region);
	}
}

static int wm_adsp1_setup_algs(struct wm_adsp *dsp)
{
	struct wmfw_adsp1_id_hdr adsp1_id;
@@ -2082,7 +2102,6 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
	struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec);
	struct wm_adsp *dsp = &dsps[w->shift];
	struct wm_adsp_alg_region *alg_region;
	struct wm_coeff_ctl *ctl;
	int ret;
	unsigned int val;
@@ -2162,13 +2181,8 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
		list_for_each_entry(ctl, &dsp->ctl_list, list)
			ctl->enabled = 0;

		while (!list_empty(&dsp->alg_regions)) {
			alg_region = list_first_entry(&dsp->alg_regions,
						      struct wm_adsp_alg_region,
						      list);
			list_del(&alg_region->list);
			kfree(alg_region);
		}

		wm_adsp_free_alg_regions(dsp);
		break;

	default:
@@ -2310,7 +2324,6 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
	struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec);
	struct wm_adsp *dsp = &dsps[w->shift];
	struct wm_adsp_alg_region *alg_region;
	struct wm_coeff_ctl *ctl;
	int ret;

@@ -2361,13 +2374,7 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
		list_for_each_entry(ctl, &dsp->ctl_list, list)
			ctl->enabled = 0;

		while (!list_empty(&dsp->alg_regions)) {
			alg_region = list_first_entry(&dsp->alg_regions,
						      struct wm_adsp_alg_region,
						      list);
			list_del(&alg_region->list);
			kfree(alg_region);
		}
		wm_adsp_free_alg_regions(dsp);

		if (wm_adsp_fw[dsp->fw].num_caps != 0)
			wm_adsp_buffer_free(dsp);
@@ -2432,6 +2439,19 @@ int wm_adsp2_init(struct wm_adsp *dsp)
}
EXPORT_SYMBOL_GPL(wm_adsp2_init);

void wm_adsp2_remove(struct wm_adsp *dsp)
{
	struct wm_coeff_ctl *ctl;

	while (!list_empty(&dsp->ctl_list)) {
		ctl = list_first_entry(&dsp->ctl_list, struct wm_coeff_ctl,
					list);
		list_del(&ctl->list);
		wm_adsp_free_ctl_blk(ctl);
	}
}
EXPORT_SYMBOL_GPL(wm_adsp2_remove);

int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream)
{
	struct wm_adsp_compr *compr;
Loading