stm class: dummy_stm: Create multiple devices
authorAlexander Shishkin <alexander.shishkin@linux.intel.com>
Mon, 15 Feb 2016 17:12:03 +0000 (19:12 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 20 Feb 2016 22:09:14 +0000 (14:09 -0800)
STM framework should be able to handle multiple STM devices at a time,
each one with its own master allocation policy.

This patch changes dummy_stm driver to create multiple STM sinks to
help testing the framework.

Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/stm/dummy_stm.c

index 3709bef..4ff5961 100644 (file)
@@ -40,22 +40,61 @@ dummy_stm_packet(struct stm_data *stm_data, unsigned int master,
        return size;
 }
 
-static struct stm_data dummy_stm = {
-       .name           = "dummy_stm",
-       .sw_start       = 0x0000,
-       .sw_end         = 0xffff,
-       .sw_nchannels   = 0xffff,
-       .packet         = dummy_stm_packet,
-};
+#define DUMMY_STM_MAX 32
+
+static struct stm_data dummy_stm[DUMMY_STM_MAX];
+
+static int nr_dummies = 4;
+
+module_param(nr_dummies, int, 0600);
+
+static unsigned int dummy_stm_nr;
 
 static int dummy_stm_init(void)
 {
-       return stm_register_device(NULL, &dummy_stm, THIS_MODULE);
+       int i, ret = -ENOMEM, __nr_dummies = ACCESS_ONCE(nr_dummies);
+
+       if (__nr_dummies < 0 || __nr_dummies > DUMMY_STM_MAX)
+               return -EINVAL;
+
+       for (i = 0; i < __nr_dummies; i++) {
+               dummy_stm[i].name = kasprintf(GFP_KERNEL, "dummy_stm.%d", i);
+               if (!dummy_stm[i].name)
+                       goto fail_unregister;
+
+               dummy_stm[i].sw_start           = 0x0000;
+               dummy_stm[i].sw_end             = 0xffff;
+               dummy_stm[i].sw_nchannels       = 0xffff;
+               dummy_stm[i].packet             = dummy_stm_packet;
+
+               ret = stm_register_device(NULL, &dummy_stm[i], THIS_MODULE);
+               if (ret)
+                       goto fail_free;
+       }
+
+       dummy_stm_nr = __nr_dummies;
+
+       return 0;
+
+fail_unregister:
+       for (i--; i >= 0; i--) {
+               stm_unregister_device(&dummy_stm[i]);
+fail_free:
+               kfree(dummy_stm[i].name);
+       }
+
+       return ret;
+
 }
 
 static void dummy_stm_exit(void)
 {
-       stm_unregister_device(&dummy_stm);
+       int i;
+
+       for (i = 0; i < dummy_stm_nr; i++) {
+               stm_unregister_device(&dummy_stm[i]);
+               kfree(dummy_stm[i].name);
+       }
 }
 
 module_init(dummy_stm_init);