@@ -220,6 +220,13 @@ static void sr_start_vddautocomp(struct omap_sr *sr)
return;
}
+ if (sr_class->class_init &&
+ sr_class->class_init(sr->voltdm, sr_class->class_priv_data)) {
+ dev_err(&sr->pdev->dev,
+ "%s: SRClass initialization failed\n", __func__);
+ return;
+ }
+
if (!sr_class->enable(sr->voltdm))
sr->autocomp_active = true;
}
@@ -235,6 +242,13 @@ static void sr_stop_vddautocomp(struct omap_sr *sr)
if (sr->autocomp_active) {
sr_class->disable(sr->voltdm, 1);
+ if (sr_class->class_deinit &&
+ sr_class->class_deinit(sr->voltdm,
+ sr_class->class_priv_data)) {
+ dev_err(&sr->pdev->dev,
+ "%s: SR[%d]Class deinitialization failed\n",
+ __func__, sr->srid);
+ }
sr->autocomp_active = false;
}
}
@@ -167,6 +167,8 @@ struct omap_sr_pmic_data {
*
* @enable: API to enable a particular class smaartreflex.
* @disable: API to disable a particular class smartreflex.
+ * @class_init: API to do class specific initialization (optional)
+ * @class_deinit: API to do class specific initialization (optional)
* @configure: API to configure a particular class smartreflex.
* @notify: API to notify the class driver about an event in SR.
* Not needed for class3.
@@ -174,14 +176,19 @@ struct omap_sr_pmic_data {
* @class_type: specify which smartreflex class.
* Can be used by the SR driver to take any class
* based decisions.
+ * @class_priv_data: Class specific private data (optional)
*/
struct omap_sr_class_data {
int (*enable)(struct voltagedomain *voltdm);
int (*disable)(struct voltagedomain *voltdm, int is_volt_reset);
+ int (*class_init)(struct voltagedomain *voltdm, void *class_priv_data);
+ int (*class_deinit)(struct voltagedomain *voltdm,
+ void *class_priv_data);
int (*configure)(struct voltagedomain *voltdm);
int (*notify)(struct voltagedomain *voltdm, u32 status);
u8 notify_flags;
u8 class_type;
+ void *class_priv_data;
};
/**