From 089648501da2f4458b635d692f5dc819b93c04e0 Mon Sep 17 00:00:00 2001 From: Nishanth Menon Date: Wed, 29 Feb 2012 23:33:39 +0100 Subject: [PATCH] --- yaml --- r: 296103 b: refs/heads/master c: ad54c3ddb472410f05083dbcf03fcec67ab7b2a5 h: refs/heads/master i: 296101: b7685678447e614245756b9c59161d3b71b5e0eb 296099: 5e7d29eb91f20bffc48b4aa907e8834fa54b41af 296095: 126c900f9935d615bb4c2347a2c5aee97bda8a65 v: v3 --- [refs] | 2 +- .../arch/arm/mach-omap2/smartreflex-class3.c | 1 + trunk/arch/arm/mach-omap2/smartreflex.c | 44 +++++++++++++++++++ trunk/arch/arm/mach-omap2/smartreflex.h | 1 + 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 12687c8bf504..9968cccf1da8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 74754cc5e047184588f35b3f9689a9c3e0599483 +refs/heads/master: ad54c3ddb472410f05083dbcf03fcec67ab7b2a5 diff --git a/trunk/arch/arm/mach-omap2/smartreflex-class3.c b/trunk/arch/arm/mach-omap2/smartreflex-class3.c index 53d9d0a5b39d..955566eefac4 100644 --- a/trunk/arch/arm/mach-omap2/smartreflex-class3.c +++ b/trunk/arch/arm/mach-omap2/smartreflex-class3.c @@ -29,6 +29,7 @@ static int sr_class3_enable(struct voltagedomain *voltdm) static int sr_class3_disable(struct voltagedomain *voltdm, int is_volt_reset) { + sr_disable_errgen(voltdm); omap_vp_disable(voltdm); sr_disable(voltdm); if (is_volt_reset) diff --git a/trunk/arch/arm/mach-omap2/smartreflex.c b/trunk/arch/arm/mach-omap2/smartreflex.c index eaf0d6e2f2e0..4b39c6489f6b 100644 --- a/trunk/arch/arm/mach-omap2/smartreflex.c +++ b/trunk/arch/arm/mach-omap2/smartreflex.c @@ -453,6 +453,50 @@ int sr_configure_errgen(struct voltagedomain *voltdm) return 0; } +/** + * sr_disable_errgen() - Disables SmartReflex AVS module's errgen component + * @voltdm: VDD pointer to which the SR module to be configured belongs to. + * + * This API is to be called from the smartreflex class driver to + * disable the error generator module inside the smartreflex module. + * + * Returns 0 on success and error value in case of failure. + */ +int sr_disable_errgen(struct voltagedomain *voltdm) +{ + u32 errconfig_offs, vpboundint_en; + u32 vpboundint_st; + struct omap_sr *sr = _sr_lookup(voltdm); + + if (IS_ERR(sr)) { + pr_warning("%s: omap_sr struct for sr_%s not found\n", + __func__, voltdm->name); + return -EINVAL; + } + + if (sr->ip_type == SR_TYPE_V1) { + errconfig_offs = ERRCONFIG_V1; + vpboundint_en = ERRCONFIG_VPBOUNDINTEN_V1; + vpboundint_st = ERRCONFIG_VPBOUNDINTST_V1; + } else if (sr->ip_type == SR_TYPE_V2) { + errconfig_offs = ERRCONFIG_V2; + vpboundint_en = ERRCONFIG_VPBOUNDINTEN_V2; + vpboundint_st = ERRCONFIG_VPBOUNDINTST_V2; + } else { + dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex" + "module without specifying the ip\n", __func__); + return -EINVAL; + } + + /* Disable the interrupts of ERROR module */ + sr_modify_reg(sr, errconfig_offs, vpboundint_en | vpboundint_st, 0); + + /* Disable the Sensor and errorgen */ + sr_modify_reg(sr, SRCONFIG, SRCONFIG_SENENABLE | SRCONFIG_ERRGEN_EN, 0); + + return 0; +} + /** * sr_configure_minmax() - Configures the smrtreflex to perform AVS using the * minmaxavg module. diff --git a/trunk/arch/arm/mach-omap2/smartreflex.h b/trunk/arch/arm/mach-omap2/smartreflex.h index fd61498f71e0..5809141171f8 100644 --- a/trunk/arch/arm/mach-omap2/smartreflex.h +++ b/trunk/arch/arm/mach-omap2/smartreflex.h @@ -240,6 +240,7 @@ void omap_sr_register_pmic(struct omap_sr_pmic_data *pmic_data); int sr_enable(struct voltagedomain *voltdm, unsigned long volt); void sr_disable(struct voltagedomain *voltdm); int sr_configure_errgen(struct voltagedomain *voltdm); +int sr_disable_errgen(struct voltagedomain *voltdm); int sr_configure_minmax(struct voltagedomain *voltdm); /* API to register the smartreflex class driver with the smartreflex driver */