|
|
|
@@ -225,9 +225,8 @@ static int sr_late_init(struct omap_sr *sr_info)
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
list_del(&sr_info->node);
|
|
|
|
|
dev_err(&sr_info->pdev->dev, "%s: ERROR in registering"
|
|
|
|
|
"interrupt handler. Smartreflex will"
|
|
|
|
|
"not function as desired\n", __func__);
|
|
|
|
|
dev_err(&sr_info->pdev->dev, "%s: ERROR in registering interrupt handler. Smartreflex will not function as desired\n",
|
|
|
|
|
__func__);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
@@ -356,8 +355,8 @@ int sr_configure_errgen(struct omap_sr *sr)
|
|
|
|
|
u8 senp_shift, senn_shift;
|
|
|
|
|
|
|
|
|
|
if (!sr) {
|
|
|
|
|
pr_warn("%s: NULL omap_sr from %pF\n", __func__,
|
|
|
|
|
(void *)_RET_IP_);
|
|
|
|
|
pr_warn("%s: NULL omap_sr from %pF\n",
|
|
|
|
|
__func__, (void *)_RET_IP_);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -387,8 +386,8 @@ int sr_configure_errgen(struct omap_sr *sr)
|
|
|
|
|
vpboundint_st = ERRCONFIG_VPBOUNDINTST_V2;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex"
|
|
|
|
|
"module without specifying the ip\n", __func__);
|
|
|
|
|
dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
|
|
|
|
|
__func__);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -423,8 +422,8 @@ int sr_disable_errgen(struct omap_sr *sr)
|
|
|
|
|
u32 vpboundint_en, vpboundint_st;
|
|
|
|
|
|
|
|
|
|
if (!sr) {
|
|
|
|
|
pr_warn("%s: NULL omap_sr from %pF\n", __func__,
|
|
|
|
|
(void *)_RET_IP_);
|
|
|
|
|
pr_warn("%s: NULL omap_sr from %pF\n",
|
|
|
|
|
__func__, (void *)_RET_IP_);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -440,8 +439,8 @@ int sr_disable_errgen(struct omap_sr *sr)
|
|
|
|
|
vpboundint_st = ERRCONFIG_VPBOUNDINTST_V2;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex"
|
|
|
|
|
"module without specifying the ip\n", __func__);
|
|
|
|
|
dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
|
|
|
|
|
__func__);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -478,8 +477,8 @@ int sr_configure_minmax(struct omap_sr *sr)
|
|
|
|
|
u8 senp_shift, senn_shift;
|
|
|
|
|
|
|
|
|
|
if (!sr) {
|
|
|
|
|
pr_warn("%s: NULL omap_sr from %pF\n", __func__,
|
|
|
|
|
(void *)_RET_IP_);
|
|
|
|
|
pr_warn("%s: NULL omap_sr from %pF\n",
|
|
|
|
|
__func__, (void *)_RET_IP_);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -504,8 +503,8 @@ int sr_configure_minmax(struct omap_sr *sr)
|
|
|
|
|
senp_shift = SRCONFIG_SENPENABLE_V2_SHIFT;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex"
|
|
|
|
|
"module without specifying the ip\n", __func__);
|
|
|
|
|
dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
|
|
|
|
|
__func__);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -537,8 +536,8 @@ int sr_configure_minmax(struct omap_sr *sr)
|
|
|
|
|
IRQENABLE_MCUBOUNDSINT | IRQENABLE_MCUDISABLEACKINT);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex"
|
|
|
|
|
"module without specifying the ip\n", __func__);
|
|
|
|
|
dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
|
|
|
|
|
__func__);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -563,16 +562,16 @@ int sr_enable(struct omap_sr *sr, unsigned long volt)
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
if (!sr) {
|
|
|
|
|
pr_warn("%s: NULL omap_sr from %pF\n", __func__,
|
|
|
|
|
(void *)_RET_IP_);
|
|
|
|
|
pr_warn("%s: NULL omap_sr from %pF\n",
|
|
|
|
|
__func__, (void *)_RET_IP_);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
volt_data = omap_voltage_get_voltdata(sr->voltdm, volt);
|
|
|
|
|
|
|
|
|
|
if (IS_ERR(volt_data)) {
|
|
|
|
|
dev_warn(&sr->pdev->dev, "%s: Unable to get voltage table"
|
|
|
|
|
"for nominal voltage %ld\n", __func__, volt);
|
|
|
|
|
dev_warn(&sr->pdev->dev, "%s: Unable to get voltage table for nominal voltage %ld\n",
|
|
|
|
|
__func__, volt);
|
|
|
|
|
return PTR_ERR(volt_data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -615,8 +614,8 @@ int sr_enable(struct omap_sr *sr, unsigned long volt)
|
|
|
|
|
void sr_disable(struct omap_sr *sr)
|
|
|
|
|
{
|
|
|
|
|
if (!sr) {
|
|
|
|
|
pr_warn("%s: NULL omap_sr from %pF\n", __func__,
|
|
|
|
|
(void *)_RET_IP_);
|
|
|
|
|
pr_warn("%s: NULL omap_sr from %pF\n",
|
|
|
|
|
__func__, (void *)_RET_IP_);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -658,13 +657,13 @@ int sr_register_class(struct omap_sr_class_data *class_data)
|
|
|
|
|
struct omap_sr *sr_info;
|
|
|
|
|
|
|
|
|
|
if (!class_data) {
|
|
|
|
|
pr_warning("%s:, Smartreflex class data passed is NULL\n",
|
|
|
|
|
pr_warn("%s:, Smartreflex class data passed is NULL\n",
|
|
|
|
|
__func__);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (sr_class) {
|
|
|
|
|
pr_warning("%s: Smartreflex class driver already registered\n",
|
|
|
|
|
pr_warn("%s: Smartreflex class driver already registered\n",
|
|
|
|
|
__func__);
|
|
|
|
|
return -EBUSY;
|
|
|
|
|
}
|
|
|
|
@@ -696,7 +695,7 @@ void omap_sr_enable(struct voltagedomain *voltdm)
|
|
|
|
|
struct omap_sr *sr = _sr_lookup(voltdm);
|
|
|
|
|
|
|
|
|
|
if (IS_ERR(sr)) {
|
|
|
|
|
pr_warning("%s: omap_sr struct for voltdm not found\n", __func__);
|
|
|
|
|
pr_warn("%s: omap_sr struct for voltdm not found\n", __func__);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -704,8 +703,8 @@ void omap_sr_enable(struct voltagedomain *voltdm)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) {
|
|
|
|
|
dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not"
|
|
|
|
|
"registered\n", __func__);
|
|
|
|
|
dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n",
|
|
|
|
|
__func__);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -728,7 +727,7 @@ void omap_sr_disable(struct voltagedomain *voltdm)
|
|
|
|
|
struct omap_sr *sr = _sr_lookup(voltdm);
|
|
|
|
|
|
|
|
|
|
if (IS_ERR(sr)) {
|
|
|
|
|
pr_warning("%s: omap_sr struct for voltdm not found\n", __func__);
|
|
|
|
|
pr_warn("%s: omap_sr struct for voltdm not found\n", __func__);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -736,8 +735,8 @@ void omap_sr_disable(struct voltagedomain *voltdm)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (!sr_class || !(sr_class->disable)) {
|
|
|
|
|
dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not"
|
|
|
|
|
"registered\n", __func__);
|
|
|
|
|
dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n",
|
|
|
|
|
__func__);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -760,7 +759,7 @@ void omap_sr_disable_reset_volt(struct voltagedomain *voltdm)
|
|
|
|
|
struct omap_sr *sr = _sr_lookup(voltdm);
|
|
|
|
|
|
|
|
|
|
if (IS_ERR(sr)) {
|
|
|
|
|
pr_warning("%s: omap_sr struct for voltdm not found\n", __func__);
|
|
|
|
|
pr_warn("%s: omap_sr struct for voltdm not found\n", __func__);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -768,8 +767,8 @@ void omap_sr_disable_reset_volt(struct voltagedomain *voltdm)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (!sr_class || !(sr_class->disable)) {
|
|
|
|
|
dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not"
|
|
|
|
|
"registered\n", __func__);
|
|
|
|
|
dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n",
|
|
|
|
|
__func__);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -787,8 +786,8 @@ void omap_sr_disable_reset_volt(struct voltagedomain *voltdm)
|
|
|
|
|
void omap_sr_register_pmic(struct omap_sr_pmic_data *pmic_data)
|
|
|
|
|
{
|
|
|
|
|
if (!pmic_data) {
|
|
|
|
|
pr_warning("%s: Trying to register NULL PMIC data structure"
|
|
|
|
|
"with smartreflex\n", __func__);
|
|
|
|
|
pr_warn("%s: Trying to register NULL PMIC data structure with smartreflex\n",
|
|
|
|
|
__func__);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -801,7 +800,7 @@ static int omap_sr_autocomp_show(void *data, u64 *val)
|
|
|
|
|
struct omap_sr *sr_info = data;
|
|
|
|
|
|
|
|
|
|
if (!sr_info) {
|
|
|
|
|
pr_warning("%s: omap_sr struct not found\n", __func__);
|
|
|
|
|
pr_warn("%s: omap_sr struct not found\n", __func__);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -815,13 +814,13 @@ static int omap_sr_autocomp_store(void *data, u64 val)
|
|
|
|
|
struct omap_sr *sr_info = data;
|
|
|
|
|
|
|
|
|
|
if (!sr_info) {
|
|
|
|
|
pr_warning("%s: omap_sr struct not found\n", __func__);
|
|
|
|
|
pr_warn("%s: omap_sr struct not found\n", __func__);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Sanity check */
|
|
|
|
|
if (val > 1) {
|
|
|
|
|
pr_warning("%s: Invalid argument %lld\n", __func__, val);
|
|
|
|
|
pr_warn("%s: Invalid argument %lld\n", __func__, val);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -848,19 +847,13 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|
|
|
|
int i, ret = 0;
|
|
|
|
|
|
|
|
|
|
sr_info = devm_kzalloc(&pdev->dev, sizeof(struct omap_sr), GFP_KERNEL);
|
|
|
|
|
if (!sr_info) {
|
|
|
|
|
dev_err(&pdev->dev, "%s: unable to allocate sr_info\n",
|
|
|
|
|
__func__);
|
|
|
|
|
if (!sr_info)
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sr_info->name = devm_kzalloc(&pdev->dev,
|
|
|
|
|
SMARTREFLEX_NAME_LEN, GFP_KERNEL);
|
|
|
|
|
if (!sr_info->name) {
|
|
|
|
|
dev_err(&pdev->dev, "%s: unable to allocate SR instance name\n",
|
|
|
|
|
__func__);
|
|
|
|
|
if (!sr_info->name)
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
platform_set_drvdata(pdev, sr_info);
|
|
|
|
|
|
|
|
|
@@ -912,7 +905,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|
|
|
|
if (sr_class) {
|
|
|
|
|
ret = sr_late_init(sr_info);
|
|
|
|
|
if (ret) {
|
|
|
|
|
pr_warning("%s: Error in SR late init\n", __func__);
|
|
|
|
|
pr_warn("%s: Error in SR late init\n", __func__);
|
|
|
|
|
goto err_list_del;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@@ -945,8 +938,8 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|
|
|
|
|
|
|
|
|
nvalue_dir = debugfs_create_dir("nvalue", sr_info->dbg_dir);
|
|
|
|
|
if (IS_ERR_OR_NULL(nvalue_dir)) {
|
|
|
|
|
dev_err(&pdev->dev, "%s: Unable to create debugfs directory"
|
|
|
|
|
"for n-values\n", __func__);
|
|
|
|
|
dev_err(&pdev->dev, "%s: Unable to create debugfs directory for n-values\n",
|
|
|
|
|
__func__);
|
|
|
|
|
ret = PTR_ERR(nvalue_dir);
|
|
|
|
|
goto err_debugfs;
|
|
|
|
|
}
|
|
|
|
@@ -1053,7 +1046,7 @@ static int __init sr_init(void)
|
|
|
|
|
if (sr_pmic_data && sr_pmic_data->sr_pmic_init)
|
|
|
|
|
sr_pmic_data->sr_pmic_init();
|
|
|
|
|
else
|
|
|
|
|
pr_warning("%s: No PMIC hook to init smartreflex\n", __func__);
|
|
|
|
|
pr_warn("%s: No PMIC hook to init smartreflex\n", __func__);
|
|
|
|
|
|
|
|
|
|
ret = platform_driver_probe(&smartreflex_driver, omap_sr_probe);
|
|
|
|
|
if (ret) {
|
|
|
|
|