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);
                        return err;
        }
 
+       if (thdrv->attr_group)
+               sysfs_remove_group(&thdev->dev.kobj, thdrv->attr_group);
+
        thdrv->remove(thdev);
 
        if (intel_th_output_assigned(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
        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,