summaryrefslogtreecommitdiff
path: root/drivers/hwmon/tegra-tsensor.c
diff options
context:
space:
mode:
authorMarcel Ziswiler <marcel.ziswiler@toradex.com>2012-11-12 15:28:39 +0100
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2012-11-12 15:28:39 +0100
commitf987e832a9e79d2ce8009a5ea9c7b677624b3b30 (patch)
tree0dd09a5e6b4c60ee0a9916907dfc2cda83f3e496 /drivers/hwmon/tegra-tsensor.c
parentf737b7f46a72c099cf8ac88baff02fbf61b1a47c (diff)
parentfc993d9bc48f772133d8cd156c67c296477db070 (diff)
Merge branch 'l4t/l4t-r16-r2' into colibri
Conflicts: arch/arm/mach-tegra/tegra3_usb_phy.c arch/arm/mach-tegra/usb_phy.c drivers/usb/gadget/tegra_udc.c drivers/usb/otg/Makefile drivers/video/tegra/fb.c sound/soc/tegra/tegra_pcm.c
Diffstat (limited to 'drivers/hwmon/tegra-tsensor.c')
-rw-r--r--drivers/hwmon/tegra-tsensor.c82
1 files changed, 33 insertions, 49 deletions
diff --git a/drivers/hwmon/tegra-tsensor.c b/drivers/hwmon/tegra-tsensor.c
index 1c372a4bcce5..c5b16fe97063 100644
--- a/drivers/hwmon/tegra-tsensor.c
+++ b/drivers/hwmon/tegra-tsensor.c
@@ -1049,11 +1049,16 @@ static void get_quadratic_roots(struct tegra_tsensor_data *data,
and
(-(2*m*B+n)-sqrt(((2*m*B+n)^2-4*m(m*B^2+n*B+p-temp))))/(2*m*A)
+ After simplify ((2*m*B+n)^2-4*m(m*B^2+n*B+p-temp)),
+ Roots are:
+ (-(2*m*B+n)+sqrt((n^2-4*m(p-temp))))/(2*m*A)
+ and
+ (-(2*m*B+n)-sqrt((n^2-4*m(p-temp))))/(2*m*A)
*/
int v_e_minus6_2mB_n;
- int v_e_minus4_mB2_nB_p_minusTemp;
- int v_e_minus6_b2, v_e_minus6_4ac;
+ int v_e_minus6_4m_p_minusTemp;
+ int v_e_minus6_n2;
int v_e_minus6_b2_minus4ac;
int v_e_minus6_sqrt_b2_minus4ac;
s64 v_e_minus12_2mA;
@@ -1091,61 +1096,38 @@ static void get_quadratic_roots(struct tegra_tsensor_data *data,
v_e_minus12_2mA = temp_64;
/* computed 2mA */
- /* m * B^2 calculation */
- temp_64 = ((s64)data->B_e_minus6 * (s64)data->B_e_minus6);
+ temp_64 = ((s64)data->n_e_minus6 * (s64)data->n_e_minus6);
/* squaring give positive value */
temp_rem = do_div(temp_64, 1000000);
- /* we see overflow if do not divide above */
- temp_64 *= data->m_e_minus6;
- is_neg = false;
- if (temp_64 < 0) {
- is_neg = true;
- temp_64 *= -1;
- }
- temp_rem = do_div(temp_64, 1000000);
- temp_rem = do_div(temp_64, 100);
- if (is_neg)
- temp_64 *= -1;
- v_e_minus4_mB2_nB_p_minusTemp = (s32)temp_64;
-
- /* n * B calculation */
- temp_64 = ((s64)data->B_e_minus6 * (s64)data->n_e_minus6);
- is_neg = false;
- if (temp_64 < 0) {
- is_neg = true;
- temp_64 *= -1;
- }
- temp_rem = do_div(temp_64, 1000000);
- temp_rem = do_div(temp_64, 100);
- if (is_neg)
- temp_64 *= -1;
- temp_rem = (s32)temp_64;
- v_e_minus4_mB2_nB_p_minusTemp += temp_rem;
- v_e_minus4_mB2_nB_p_minusTemp += (
- (data->p_e_minus2 * 100) - (temp * 10000));
- /* computed ((m * B^2) + n * B + p - temp) * 10^4 */
-
- v_e_minus6_b2 = ((v_e_minus6_2mB_n / 1000)
- * (v_e_minus6_2mB_n / 1000));
- dev_dbg(data->hwmon_dev, "v_e_minus6_b2=%d\n", v_e_minus6_b2);
-
- v_e_minus6_4ac = ((4 * data->m_e_minus6) / 10)
- * ((v_e_minus4_mB2_nB_p_minusTemp) / 1000);
- dev_dbg(data->hwmon_dev, "v_e_minus6_4ac=%d\n", v_e_minus6_4ac);
-
- v_e_minus6_b2_minus4ac = (v_e_minus6_b2 - v_e_minus6_4ac);
+ v_e_minus6_n2 = (s32)temp_64;
+ /* computed n^2 */
+
+ v_e_minus6_4m_p_minusTemp = data->p_e_minus2 - (temp * 100);
+ v_e_minus6_4m_p_minusTemp *= 4 * data->m_e_minus6;
+ v_e_minus6_4m_p_minusTemp = DIV_ROUND_CLOSEST(
+ v_e_minus6_4m_p_minusTemp,100);
+ /* computed 4m*(p-T)*/
+
+ v_e_minus6_b2_minus4ac = (v_e_minus6_n2 - v_e_minus6_4m_p_minusTemp);
+
+ /* To preserve 1 decimal digits for sqrt(v_e_minus6_b2_minus4ac),
+ Make it 100 times, so
+ v_e_minus6_sqrt_b2_minus4ac=(int_sqrt(v_e_minus6_b2_minus4ac *100)*10^6)
+ /sqrt(10^6 * 100)
+ To avoid overflow,Simplify it to be:
+ v_e_minus6_sqrt_b2_minus4ac =(int_sqrt(v_e_minus6_b2_minus4ac *100)*100)
+ */
- v_e_minus6_sqrt_b2_minus4ac = DIV_ROUND_CLOSEST(
- (int_sqrt(v_e_minus6_b2_minus4ac)*1000000),
- int_sqrt(1000000));
+ v_e_minus6_sqrt_b2_minus4ac = (int_sqrt(v_e_minus6_b2_minus4ac * 100)
+ * 100);
dev_dbg(data->hwmon_dev, "A_e_minus12=%lld, B_e_minus6=%d, "
"m_e_minus6=%d, n_e_minus6=%d, p_e_minus2=%d, "
"temp=%d\n", data->A_e_minus12, data->B_e_minus6,
data->m_e_minus6,
data->n_e_minus6, data->p_e_minus2, (int)temp);
- dev_dbg(data->hwmon_dev, "2mB_n=%d, 2mA=%lld, mB2_nB_p_minusTemp=%d,"
+ dev_dbg(data->hwmon_dev, "2mB_n=%d, 2mA=%lld, 4m_p_minusTemp=%d,"
"b2_minus4ac=%d\n", v_e_minus6_2mB_n,
- v_e_minus12_2mA, v_e_minus4_mB2_nB_p_minusTemp,
+ v_e_minus12_2mA, v_e_minus6_4m_p_minusTemp,
v_e_minus6_b2_minus4ac);
temp_64=(s64)(-v_e_minus6_2mB_n - v_e_minus6_sqrt_b2_minus4ac) * 1000000;
@@ -1979,6 +1961,8 @@ static int __devexit tegra_tsensor_remove(struct platform_device *pdev)
return 0;
}
+#ifdef CONFIG_PM
+
static void save_tsensor_regs(struct tegra_tsensor_data *data)
{
int i;
@@ -2005,7 +1989,7 @@ static void restore_tsensor_regs(struct tegra_tsensor_data *data)
}
}
-#ifdef CONFIG_PM
+
static int tsensor_suspend(struct platform_device *pdev,
pm_message_t state)
{