ASoC: Intel: atom: Add sysfs entry in order to store FW version
authorSebastien Guiriec <sebastien.guiriec@intel.com>
Mon, 5 Dec 2016 16:45:02 +0000 (17:45 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 5 Dec 2016 17:22:24 +0000 (17:22 +0000)
This patch is adding a sysfs entry in order to be able to get
access to SST FW version.

Signed-off-by: Sebastien Guiriec <sebastien.guiriec@intel.com>
Acked-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/atom/sst/sst.c

index 9b6e27385dc90742a37ae2e17a4eca4fe4aca2dd..f9ba71315e335021b34aa18b4030a29b861bcac1 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/pm_qos.h>
 #include <linux/async.h>
 #include <linux/acpi.h>
+#include <linux/sysfs.h>
 #include <sound/core.h>
 #include <sound/soc.h>
 #include <asm/platform_sst_audio.h>
@@ -242,6 +243,32 @@ int sst_alloc_drv_context(struct intel_sst_drv **ctx,
 }
 EXPORT_SYMBOL_GPL(sst_alloc_drv_context);
 
+static ssize_t firmware_version_show(struct device *dev,
+                           struct device_attribute *attr, char *buf)
+{
+       struct intel_sst_drv *ctx = dev_get_drvdata(dev);
+
+       if (ctx->fw_version.type == 0 && ctx->fw_version.major == 0 &&
+           ctx->fw_version.minor == 0 && ctx->fw_version.build == 0)
+               return sprintf(buf, "FW not yet loaded\n");
+       else
+               return sprintf(buf, "v%02x.%02x.%02x.%02x\n",
+                              ctx->fw_version.type, ctx->fw_version.major,
+                              ctx->fw_version.minor, ctx->fw_version.build);
+
+}
+
+DEVICE_ATTR_RO(firmware_version);
+
+static const struct attribute *sst_fw_version_attrs[] = {
+       &dev_attr_firmware_version.attr,
+       NULL,
+};
+
+static const struct attribute_group sst_fw_version_attr_group = {
+       .attrs = (struct attribute **)sst_fw_version_attrs,
+};
+
 int sst_context_init(struct intel_sst_drv *ctx)
 {
        int ret = 0, i;
@@ -315,8 +342,19 @@ int sst_context_init(struct intel_sst_drv *ctx)
                dev_err(ctx->dev, "Firmware download failed:%d\n", ret);
                goto do_free_mem;
        }
+
+       ret = sysfs_create_group(&ctx->dev->kobj,
+                                &sst_fw_version_attr_group);
+       if (ret) {
+               dev_err(ctx->dev,
+                       "Unable to create sysfs\n");
+               goto err_sysfs;
+       }
+
        sst_register(ctx->dev);
        return 0;
+err_sysfs:
+       sysfs_remove_group(&ctx->dev->kobj, &sst_fw_version_attr_group);
 
 do_free_mem:
        destroy_workqueue(ctx->post_msg_wq);
@@ -330,6 +368,7 @@ void sst_context_cleanup(struct intel_sst_drv *ctx)
        pm_runtime_disable(ctx->dev);
        sst_unregister(ctx->dev);
        sst_set_fw_state_locked(ctx, SST_SHUTDOWN);
+       sysfs_remove_group(&ctx->dev->kobj, &sst_fw_version_attr_group);
        flush_scheduled_work();
        destroy_workqueue(ctx->post_msg_wq);
        pm_qos_remove_request(ctx->qos);