ASoC: Intel: Skylake: Commonize library load
authorSubhransu S. Prusty <subhransu.s.prusty@intel.com>
Tue, 25 Apr 2017 06:48:20 +0000 (12:18 +0530)
committerMark Brown <broonie@kernel.org>
Wed, 26 Apr 2017 14:47:37 +0000 (15:47 +0100)
request firmware, strip extended manifest and release library changes
are common to kabylake and APL.

So move these common code to utils to be reused in later patches for
kabylake library load.

Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Acked-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/skylake/bxt-sst.c
sound/soc/intel/skylake/skl-sst-dsp.h
sound/soc/intel/skylake/skl-sst-utils.c

index 2bf6ebe29f50120412a6027944834197e60c380c..d26545ee3e586bc48e26762fd04c0e12fc664636 100644 (file)
@@ -53,18 +53,6 @@ static unsigned int bxt_get_errorcode(struct sst_dsp *ctx)
         return sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE);
 }
 
-static void sst_bxt_release_library(struct skl_lib_info *linfo, int lib_count)
-{
-       int i;
-
-       for (i = 1; i < lib_count; i++) {
-               if (linfo[i].fw) {
-                       release_firmware(linfo[i].fw);
-                       linfo[i].fw = NULL;
-               }
-       }
-}
-
 static int
 bxt_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo, int lib_count)
 {
@@ -75,26 +63,10 @@ bxt_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo, int lib_count)
 
        /* library indices start from 1 to N. 0 represents base FW */
        for (i = 1; i < lib_count; i++) {
-               if (linfo[i].fw == NULL) {
-                       ret = request_firmware(&linfo[i].fw, linfo[i].name,
-                                               ctx->dev);
-                       if (ret < 0) {
-                               dev_err(ctx->dev, "Request lib %s failed:%d\n",
-                                       linfo[i].name, ret);
-                               goto load_library_failed;
-                       }
-               }
-
-               if (skl->is_first_boot) {
-                       ret = snd_skl_parse_uuids(ctx, linfo[i].fw,
+               ret = skl_prepare_lib_load(skl, &skl->lib_info[i], &stripped_fw,
                                        BXT_ADSP_FW_BIN_HDR_OFFSET, i);
-                       if (ret < 0)
-                               goto load_library_failed;
-               }
-
-               stripped_fw.data = linfo[i].fw->data;
-               stripped_fw.size = linfo[i].fw->size;
-               skl_dsp_strip_extended_manifest(&stripped_fw);
+               if (ret < 0)
+                       goto load_library_failed;
 
                stream_tag = ctx->dsp_ops.prepare(ctx->dev, 0x40,
                                        stripped_fw.size, &dmab);
@@ -121,7 +93,7 @@ bxt_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo, int lib_count)
        return ret;
 
 load_library_failed:
-       sst_bxt_release_library(linfo, lib_count);
+       skl_release_library(linfo, lib_count);
        return ret;
 }
 
@@ -648,7 +620,7 @@ EXPORT_SYMBOL_GPL(bxt_sst_init_fw);
 void bxt_sst_dsp_cleanup(struct device *dev, struct skl_sst *ctx)
 {
 
-       sst_bxt_release_library(ctx->lib_info, ctx->lib_count);
+       skl_release_library(ctx->lib_info, ctx->lib_count);
        if (ctx->dsp->fw)
                release_firmware(ctx->dsp->fw);
        skl_freeup_uuid_list(ctx);
index c1f95e23933d33f59546e8d8bf960f0e157f898b..6d9aed23d5cd5f858dbe5a8369c5374638938969 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <linux/interrupt.h>
 #include <linux/uuid.h>
+#include <linux/firmware.h>
 #include <sound/memalloc.h>
 #include "skl-sst-cldma.h"
 
@@ -145,7 +146,7 @@ struct skl_dsp_fw_ops {
        int (*load_fw)(struct sst_dsp  *ctx);
        /* FW module parser/loader */
        int (*load_library)(struct sst_dsp *ctx,
-               struct skl_lib_info *linfo, int count);
+               struct skl_lib_info *linfo, int lib_count);
        int (*parse_fw)(struct sst_dsp *ctx);
        int (*set_state_D0)(struct sst_dsp *ctx, unsigned int core_id);
        int (*set_state_D3)(struct sst_dsp *ctx, unsigned int core_id);
@@ -250,5 +251,9 @@ void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable);
 int skl_sst_ctx_init(struct device *dev, int irq, const char *fw_name,
                struct skl_dsp_loader_ops dsp_ops, struct skl_sst **dsp,
                struct sst_dsp_device *skl_dev);
+int skl_prepare_lib_load(struct skl_sst *skl, struct skl_lib_info *linfo,
+                       struct firmware *stripped_fw,
+                       unsigned int hdr_offset, int index);
+void skl_release_library(struct skl_lib_info *linfo, int lib_count);
 
 #endif /*__SKL_SST_DSP_H__*/
index a72152123c3c0e3666be17a7e2c37e9288f33094..81ee251881b448bca09791246f4ab6a2cfc29871 100644 (file)
@@ -398,3 +398,46 @@ int skl_sst_ctx_init(struct device *dev, int irq, const char *fw_name,
 
        return ret;
 }
+
+int skl_prepare_lib_load(struct skl_sst *skl, struct skl_lib_info *linfo,
+               struct firmware *stripped_fw,
+               unsigned int hdr_offset, int index)
+{
+       int ret;
+       struct sst_dsp *dsp = skl->dsp;
+
+       if (linfo->fw == NULL) {
+               ret = request_firmware(&linfo->fw, linfo->name,
+                                       skl->dev);
+               if (ret < 0) {
+                       dev_err(skl->dev, "Request lib %s failed:%d\n",
+                               linfo->name, ret);
+                       return ret;
+               }
+       }
+
+       if (skl->is_first_boot) {
+               ret = snd_skl_parse_uuids(dsp, linfo->fw, hdr_offset, index);
+               if (ret < 0)
+                       return ret;
+       }
+
+       stripped_fw->data = linfo->fw->data;
+       stripped_fw->size = linfo->fw->size;
+       skl_dsp_strip_extended_manifest(stripped_fw);
+
+       return 0;
+}
+
+void skl_release_library(struct skl_lib_info *linfo, int lib_count)
+{
+       int i;
+
+       /* library indices start from 1 to N. 0 represents base FW */
+       for (i = 1; i < lib_count; i++) {
+               if (linfo[i].fw) {
+                       release_firmware(linfo[i].fw);
+                       linfo[i].fw = NULL;
+               }
+       }
+}