intel_th: Allow subdevice drivers to bring in own attribute groups
authorAlexander Shishkin <alexander.shishkin@linux.intel.com>
Fri, 4 Mar 2016 17:42:48 +0000 (19:42 +0200)
committerAlexander Shishkin <alexander.shishkin@linux.intel.com>
Fri, 8 Apr 2016 13:11:56 +0000 (16:11 +0300)
Some subdevices (MSU, PTI) need to register their own driver-specific
attribute groups. Provide a way for those to pass their attribute
groups to the core driver in their driver structure so that the
core can take care of creating and removing them.

Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Reviewed-by: Laurent Fert <laurent.fert@intel.com>
drivers/hwtracing/intel_th/core.c
drivers/hwtracing/intel_th/intel_th.h

index 4272f2ce5f6eef8e2c0b4309137f9c828bb9db14..db0691929a608b450fb176c28948d89392871347 100644 (file)
@@ -71,6 +71,15 @@ static int intel_th_probe(struct device *dev)
        if (ret)
                return ret;
 
+       if (thdrv->attr_group) {
+               ret = sysfs_create_group(&thdev->dev.kobj, thdrv->attr_group);
+               if (ret) {
+                       thdrv->remove(thdev);
+
+                       return ret;
+               }
+       }
+
        if (thdev->type == INTEL_TH_OUTPUT &&
            !intel_th_output_assigned(thdev))
                ret = hubdrv->assign(hub, thdev);
@@ -91,6 +100,9 @@ static int intel_th_remove(struct device *dev)
                        return err;
        }
 
+       if (thdrv->attr_group)
+               sysfs_remove_group(&thdev->dev.kobj, thdrv->attr_group);
+
        thdrv->remove(thdev);
 
        if (intel_th_output_assigned(thdev)) {
index eedd09332db6caf2eec08cfe69f2e1ac1160319a..15ebd48a29f2a0c39c0a5a3c5a2b850df4ca74f4 100644 (file)
@@ -115,6 +115,7 @@ intel_th_output_assigned(struct intel_th_device *thdev)
  * @enable:    enable tracing for a given output device
  * @disable:   disable tracing for a given output device
  * @fops:      file operations for device nodes
+ * @attr_group:        attributes provided by the driver
  *
  * Callbacks @probe and @remove are required for all device types.
  * Switch device driver needs to fill in @assign, @enable and @disable
@@ -139,6 +140,8 @@ struct intel_th_driver {
        void                    (*deactivate)(struct intel_th_device *thdev);
        /* file_operations for those who want a device node */
        const struct file_operations *fops;
+       /* optional attributes */
+       struct attribute_group  *attr_group;
 
        /* source ops */
        int                     (*set_output)(struct intel_th_device *thdev,