Merge branch 'topic/arizona' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
authorMark Brown <broonie@kernel.org>
Wed, 4 May 2016 16:51:26 +0000 (17:51 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 4 May 2016 16:51:26 +0000 (17:51 +0100)
sound/soc/codecs/arizona.c
sound/soc/codecs/cs47l24.c
sound/soc/codecs/wm5102.c
sound/soc/codecs/wm5110.c
sound/soc/codecs/wm_adsp.c
sound/soc/codecs/wm_adsp.h

index 92d22a0..0239639 100644 (file)
@@ -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++;
index 6b8b557..e42ba06 100644 (file)
@@ -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;
 }
 
index a8b3e3f..7a539e0 100644 (file)
@@ -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;
 }
 
index 83ba70f..dd87af1 100644 (file)
@@ -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;
 }
 
index f835277..630ebcd 100644 (file)
@@ -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;
index b61cb57..feb61e2 100644 (file)
@@ -92,6 +92,7 @@ extern const struct snd_kcontrol_new wm_adsp_fw_controls[];
 
 int wm_adsp1_init(struct wm_adsp *dsp);
 int wm_adsp2_init(struct wm_adsp *dsp);
+void wm_adsp2_remove(struct wm_adsp *dsp);
 int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec);
 int wm_adsp2_codec_remove(struct wm_adsp *dsp, struct snd_soc_codec *codec);
 int wm_adsp1_event(struct snd_soc_dapm_widget *w,