summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorAnkita Garg <ankitag@nvidia.com>2014-01-15 15:10:23 -0800
committerDiwakar Tundlam <dtundlam@nvidia.com>2014-03-07 12:23:35 -0800
commite4f4af0d3722764bd8c5659fc308b698e6e28df9 (patch)
treef4c27f9bf4e01fb256ca957a6008c93ad570a1f7 /arch
parente7b57f42e4fbf3eb8d2cff6e1ef7bc812885ca17 (diff)
arm: tegra: loki: Batt temp and tdiode shutdown
This change enables reading the battery temperature and Tdiode through PMIC ADC and shutdown based on that. The adc value conversion to temperature is performed using a look-up table that maps the adc values to temp. The conversion table is based on values generated for Loki P2530 board. Bug 1408758 Bug 1398960 Change-Id: Ic27efe4f7b608ee355799c9498413a862dd4ea39 Signed-off-by: Ankita Garg <ankitag@nvidia.com> Signed-off-by: Anshul Jain <anshulj@nvidia.com> Reviewed-on: http://git-master/r/375907 Reviewed-by: Diwakar Tundlam <dtundlam@nvidia.com> Tested-by: Diwakar Tundlam <dtundlam@nvidia.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-tegra/board-loki-power.c51
-rw-r--r--arch/arm/mach-tegra/board-loki-sensors.c170
2 files changed, 164 insertions, 57 deletions
diff --git a/arch/arm/mach-tegra/board-loki-power.c b/arch/arm/mach-tegra/board-loki-power.c
index 31409c05aa2d..6a72aaf53384 100644
--- a/arch/arm/mach-tegra/board-loki-power.c
+++ b/arch/arm/mach-tegra/board-loki-power.c
@@ -368,11 +368,36 @@ static struct palmas_reg_init *loki_reg_init[PALMAS_NUM_REGS] = {
};
static struct iio_map palmas_adc_iio_maps[] = {
+ PALMAS_GPADC_IIO_MAP(NULL, NULL, NULL),
+};
+
+static struct iio_map palmas_adc_iio_maps_p2530_loki[] = {
+ PALMAS_GPADC_IIO_MAP(IN1, "generic-adc-thermal.0", "thermistor"),
+ PALMAS_GPADC_IIO_MAP(IN3, "generic-adc-thermal.1", "tdiode"),
+ PALMAS_GPADC_IIO_MAP(IN4, "generic-adc-thermal.2", "tbat"),
+ PALMAS_GPADC_IIO_MAP(NULL, NULL, NULL),
+};
+
+static struct iio_map palmas_adc_iio_maps_p2530_foster[] = {
PALMAS_GPADC_IIO_MAP(IN1, "generic-adc-thermal.0", "thermistor"),
PALMAS_GPADC_IIO_MAP(IN3, "generic-adc-thermal.1", "tdiode"),
PALMAS_GPADC_IIO_MAP(NULL, NULL, NULL),
};
+struct palmas_adc_auto_conv_property palmas_adc_auto_conv0_data = {
+ .adc_channel_number = PALMAS_ADC_CH_IN3, /* Tdiode */
+ /* Shutdown if ADC auto conversion is below 1487(>100C). */
+ .adc_low_threshold = 1487, /* 100C */
+ .adc_shutdown = true,
+};
+
+struct palmas_adc_auto_conv_property palmas_adc_auto_conv1_data = {
+ .adc_channel_number = PALMAS_ADC_CH_IN4, /* Tbat */
+ /* Shutdown if ADC auto conversion is below 748(>70C). */
+ .adc_low_threshold = 748, /* 70C */
+ .adc_shutdown = true,
+};
+
static struct palmas_gpadc_platform_data palmas_adc_pdata = {
/* If ch3_dual_current is true, it will measure ch3 input signal with
* ch3_current and the next current of ch3_current.
@@ -767,9 +792,32 @@ int __init loki_regulator_init(void)
reg_idata_smps123.constraints.init_uV = 1000000;
reg_idata_smps9.constraints.enable_time = 250;
+ tegra_get_board_info(&bi);
+
+ if (bi.board_id == BOARD_P2530 && bi.fab >= 0xa1) {
+
+ palmas_adc_pdata.auto_conversion_period_ms = 1000;
+ palmas_adc_pdata.adc_auto_conv0_data =
+ &palmas_adc_auto_conv0_data;
+
+ if (bi.sku == BOARD_SKU_FOSTER) {
+ pr_info("thermal: registering for foster\n");
+ palmas_adc_pdata.iio_maps =
+ palmas_adc_iio_maps_p2530_foster;
+ } else if (bi.sku == BOARD_SKU_100 || bi.sku == BOARD_SKU_0) {
+ pr_info("thermal: registering for loki\n");
+ palmas_adc_pdata.iio_maps =
+ palmas_adc_iio_maps_p2530_loki;
+ palmas_adc_pdata.adc_auto_conv1_data =
+ &palmas_adc_auto_conv1_data;
+ } else {
+ pr_err("palmas: Not a known SKU!\n");
+ }
+ }
+
+
i2c_register_board_info(4, palma_device,
ARRAY_SIZE(palma_device));
- tegra_get_board_info(&bi);
if (bi.board_id == BOARD_P2530 && bi.fab >= 0xa1) {
pmic_platform.reg_data[PALMAS_REG_SMPS7] =
PALMAS_REG_PDATA(smps7_a01);
@@ -784,6 +832,7 @@ int __init loki_regulator_init(void)
pmic_platform.reg_init[PALMAS_REG_LDO5] =
PALMAS_REG_INIT_DATA(ldo5_a01);
}
+
platform_device_register(&power_supply_extcon_device);
loki_cl_dvfs_init();
diff --git a/arch/arm/mach-tegra/board-loki-sensors.c b/arch/arm/mach-tegra/board-loki-sensors.c
index 6846027e65db..c0f0d1aab582 100644
--- a/arch/arm/mach-tegra/board-loki-sensors.c
+++ b/arch/arm/mach-tegra/board-loki-sensors.c
@@ -572,52 +572,6 @@ struct ntc_thermistor_adc_table {
int adc;
};
-/* This values are only for TegraTab platform. */
-static struct ntc_thermistor_adc_table loki_nff_thermistor_table[] = {
- { -40, 2725 }, { -39, 2725 }, { -38, 2724 }, { -37, 2723 },
- { -36, 2723 }, { -35, 2722 }, { -34, 2721 }, { -33, 2721 },
- { -32, 2720 }, { -31, 2719 }, { -30, 2718 }, { -29, 2717 },
- { -28, 2716 }, { -27, 2715 }, { -26, 2714 }, { -25, 2713 },
- { -24, 2712 }, { -23, 2711 }, { -22, 2709 }, { -21, 2708 },
- { -20, 2707 }, { -19, 2705 }, { -18, 2704 }, { -17, 2702 },
- { -16, 2701 }, { -15, 2699 }, { -14, 2697 }, { -13, 2696 },
- { -12, 2694 }, { -11, 2692 }, { -10, 2689 }, { -9, 2687 },
- { -8, 2685 }, { -7, 2683 }, { -6, 2681 }, { -5, 2678 },
- { -4, 2676 }, { -3, 2673 }, { -2, 2670 }, { -1, 2667 },
- { 0, 2664 }, { 1, 2661 }, { 2, 2658 }, { 3, 2655 },
- { 4, 2651 }, { 5, 2647 }, { 6, 2644 }, { 7, 2641 },
- { 8, 2637 }, { 9, 2633 }, { 10, 2628 }, { 11, 2624 },
- { 12, 2620 }, { 13, 2615 }, { 14, 2610 }, { 15, 2605 },
- { 16, 2600 }, { 17, 2596 }, { 18, 2590 }, { 19, 2585 },
- { 20, 2578 }, { 21, 2573 }, { 22, 2567 }, { 23, 2561 },
- { 24, 2555 }, { 25, 2548 }, { 26, 2542 }, { 27, 2535 },
- { 28, 2528 }, { 29, 2521 }, { 30, 2513 }, { 31, 2506 },
- { 32, 2498 }, { 33, 2491 }, { 34, 2482 }, { 35, 2473 },
- { 36, 2465 }, { 37, 2457 }, { 38, 2448 }, { 39, 2439 },
- { 40, 2429 }, { 41, 2420 }, { 42, 2411 }, { 43, 2401 },
- { 44, 2390 }, { 45, 2379 }, { 46, 2370 }, { 47, 2359 },
- { 48, 2349 }, { 49, 2337 }, { 50, 2325 }, { 51, 2314 },
- { 52, 2303 }, { 53, 2291 }, { 54, 2278 }, { 55, 2265 },
- { 56, 2254 }, { 57, 2241 }, { 58, 2229 }, { 59, 2215 },
- { 60, 2201 }, { 61, 2188 }, { 62, 2175 }, { 63, 2161 },
- { 64, 2147 }, { 65, 2132 }, { 66, 2118 }, { 67, 2104 },
- { 68, 2089 }, { 69, 2074 }, { 70, 2058 }, { 71, 2044 },
- { 72, 2029 }, { 73, 2014 }, { 74, 1998 }, { 75, 1981 },
- { 76, 1966 }, { 77, 1950 }, { 78, 1934 }, { 79, 1918 },
- { 80, 1900 }, { 81, 1885 }, { 82, 1868 }, { 83, 1851 },
- { 84, 1834 }, { 85, 1816 }, { 86, 1799 }, { 87, 1783 },
- { 88, 1765 }, { 89, 1747 }, { 90, 1728 }, { 91, 1711 },
- { 92, 1694 }, { 93, 1676 }, { 94, 1657 }, { 95, 1638 },
- { 96, 1621 }, { 97, 1603 }, { 98, 1585 }, { 99, 1566 },
- { 100, 1547 }, { 101, 1530 }, { 102, 1512 }, { 103, 1494 },
- { 104, 1475 }, { 105, 1456 }, { 106, 1438 }, { 107, 1421 },
- { 108, 1403 }, { 109, 1384 }, { 110, 1365 }, { 111, 1348 },
- { 112, 1331 }, { 113, 1313 }, { 114, 1294 }, { 115, 1276 },
- { 116, 1259 }, { 117, 1242 }, { 118, 1225 }, { 119, 1207 },
- { 120, 1189 }, { 121, 1173 }, { 122, 1157 }, { 123, 1140 },
- { 124, 1123 }, { 125, 1106 },
-};
-
static struct ntc_thermistor_adc_table loki_ffd_thermistor_table[] = {
{ -40, 4082 }, { -39, 4082 }, { -38, 4081 }, { -37, 4079 },
{ -36, 4078 }, { -35, 4077 }, { -34, 4075 }, { -33, 4074 },
@@ -663,6 +617,52 @@ static struct ntc_thermistor_adc_table loki_ffd_thermistor_table[] = {
{ 124, 459 }, { 125, 446 },
};
+static struct ntc_thermistor_adc_table loki_tbat_thermistor_table[] = {
+ { -40, 3906 }, { -39, 3896 }, { -38, 3886 }, { -37, 3875 },
+ { -36, 3862 }, { -35, 3847 }, { -34, 3836 }, { -33, 3823 },
+ { -32, 3809 }, { -31, 3793 }, { -30, 3776 }, { -29, 3761 },
+ { -28, 3746 }, { -27, 3729 }, { -26, 3710 }, { -25, 3689 },
+ { -24, 3672 }, { -23, 3653 }, { -22, 3633 }, { -21, 3611 },
+ { -20, 3586 }, { -19, 3566 }, { -18, 3544 }, { -17, 3521 },
+ { -16, 3495 }, { -15, 3466 }, { -14, 3443 }, { -13, 3418 },
+ { -12, 3391 }, { -11, 3361 }, { -10, 3330 }, { -9, 3303 },
+ { -8, 3275 }, { -7, 3244 }, { -6, 3212 }, { -5, 3176 },
+ { -4, 3147 }, { -3, 3115 }, { -2, 3082 }, { -1, 3046 },
+ { 0, 3008 }, { 1, 2976 }, { 2, 2942 }, { 3, 2906 },
+ { 4, 2868 }, { 5, 2827 }, { 6, 2793 }, { 7, 2757 },
+ { 8, 2719 }, { 9, 2679 }, { 10, 2636 }, { 11, 2601 },
+ { 12, 2564 }, { 13, 2525 }, { 14, 2484 }, { 15, 2440 },
+ { 16, 2404 }, { 17, 2367 }, { 18, 2328 }, { 19, 2286 },
+ { 20, 2243 }, { 21, 2207 }, { 22, 2170 }, { 23, 2131 },
+ { 24, 2090 }, { 25, 2048 }, { 26, 2013 }, { 27, 1976 },
+ { 28, 1939 }, { 29, 1899 }, { 30, 1859 }, { 31, 1825 },
+ { 32, 1790 }, { 33, 1754 }, { 34, 1717 }, { 35, 1678 },
+ { 36, 1646 }, { 37, 1613 }, { 38, 1579 }, { 39, 1544 },
+ { 40, 1508 }, { 41, 1478 }, { 42, 1447 }, { 43, 1416 },
+ { 44, 1383 }, { 45, 1350 }, { 46, 1322 }, { 47, 1294 },
+ { 48, 1264 }, { 49, 1235 }, { 50, 1204 }, { 51, 1179 },
+ { 52, 1153 }, { 53, 1126 }, { 54, 1099 }, { 55, 1072 },
+ { 56, 1048 }, { 57, 1025 }, { 58, 1001 }, { 59, 976 },
+ { 60, 952 }, { 61, 931 }, { 62, 909 }, { 63, 888 },
+ { 64, 866 }, { 65, 844 }, { 66, 825 }, { 67, 806 },
+ { 68, 787 }, { 69, 767 }, { 70, 748 }, { 71, 731 },
+ { 72, 714 }, { 73, 697 }, { 74, 680 }, { 75, 662 },
+ { 76, 647 }, { 77, 633 }, { 78, 617 }, { 79, 602 },
+ { 80, 587 }, { 81, 573 }, { 82, 560 }, { 83, 546 },
+ { 84, 533 }, { 85, 519 }, { 86, 507 }, { 87, 495 },
+ { 88, 483 }, { 89, 471 }, { 90, 459 }, { 91, 448 },
+ { 92, 437 }, { 93, 427 }, { 94, 416 }, { 95, 405 },
+ { 96, 396 }, { 97, 386 }, { 98, 377 }, { 99, 367 },
+ { 100, 358 }, { 101, 349 }, { 102, 341 }, { 103, 333 },
+ { 104, 324 }, { 105, 316 }, { 106, 309 }, { 107, 301 },
+ { 108, 294 }, { 109, 287 }, { 110, 279 }, { 111, 273 },
+ { 112, 266 }, { 113, 260 }, { 114, 254 }, { 115, 247 },
+ { 116, 242 }, { 117, 236 }, { 118, 230 }, { 119, 225 },
+ { 120, 219 }, { 121, 214 }, { 122, 209 }, { 123, 204 },
+ { 124, 199 }, { 125, 195 },
+};
+
+
static struct ntc_thermistor_adc_table *thermistor_table;
static int thermistor_table_size;
@@ -690,6 +690,35 @@ static int gadc_thermal_thermistor_adc_to_temp(
return temp;
};
+static struct ntc_thermistor_adc_table *tbat_thermistor_table;
+static int tbat_thermistor_table_size;
+
+static int gadc_tbat_thermistor_adc_to_temp(
+ struct gadc_thermal_platform_data *pdata, int val, int val2)
+{
+ int temp = 0, adc_hi, adc_lo;
+ int i;
+
+ for (i = 0; i < tbat_thermistor_table_size; i++)
+ if (val >= tbat_thermistor_table[i].adc)
+ break;
+
+ if (i == 0) {
+ temp = tbat_thermistor_table[i].temp * 1000;
+ } else if (i >= (tbat_thermistor_table_size - 1)) {
+ temp =
+ tbat_thermistor_table[tbat_thermistor_table_size - 1].temp *
+ 1000;
+ } else {
+ adc_hi = tbat_thermistor_table[i - 1].adc;
+ adc_lo = tbat_thermistor_table[i].adc;
+ temp = tbat_thermistor_table[i].temp * 1000;
+ temp -= ((val - adc_lo) * 1000 / (adc_hi - adc_lo));
+ }
+
+ return temp;
+};
+
#define TDIODE_PRECISION_MULTIPLIER 1000000000LL
#define TDIODE_MIN_TEMP -25000LL
#define TDIODE_MAX_TEMP 125000LL
@@ -734,6 +763,13 @@ static struct gadc_thermal_platform_data gadc_thermal_tdiode_pdata = {
.adc_to_temp = gadc_thermal_tdiode_adc_to_temp,
};
+static struct gadc_thermal_platform_data gadc_thermal_tbat_pdata = {
+ .iio_channel_name = "tbat",
+ .tz_name = "battery-temp",
+ .temp_offset = 0,
+ .adc_to_temp = gadc_tbat_thermistor_adc_to_temp,
+};
+
static struct platform_device gadc_thermal_thermistor = {
.name = "generic-adc-thermal",
.id = 0,
@@ -750,7 +786,21 @@ static struct platform_device gadc_thermal_tdiode = {
},
};
-static struct platform_device *gadc_thermal_devices[] = {
+static struct platform_device gadc_tbat_thermistor = {
+ .name = "generic-adc-thermal",
+ .id = 2,
+ .dev = {
+ .platform_data = &gadc_thermal_tbat_pdata,
+ },
+};
+
+static struct platform_device *gadc_thermal_devices_p2530[] = {
+ &gadc_thermal_thermistor,
+ &gadc_thermal_tdiode,
+ &gadc_tbat_thermistor,
+};
+
+static struct platform_device *gadc_thermal_devices_p2530_foster[] = {
&gadc_thermal_thermistor,
&gadc_thermal_tdiode,
};
@@ -758,18 +808,26 @@ static struct platform_device *gadc_thermal_devices[] = {
int __init loki_sensors_init(void)
{
tegra_get_board_info(&board_info);
- platform_add_devices(gadc_thermal_devices,
- ARRAY_SIZE(gadc_thermal_devices));
-
- if (board_info.board_id == BOARD_E2548 ||
- board_info.board_id == BOARD_E2549) {
- thermistor_table = &loki_nff_thermistor_table[0];
- thermistor_table_size = ARRAY_SIZE(loki_nff_thermistor_table);
- } else if (board_info.board_id == BOARD_P2530) {
+
+ if (board_info.board_id == BOARD_P2530 && board_info.fab >= 0xa1) {
thermistor_table = &loki_ffd_thermistor_table[0];
thermistor_table_size = ARRAY_SIZE(loki_ffd_thermistor_table);
+ if (board_info.sku == BOARD_SKU_FOSTER) {
+ platform_add_devices(gadc_thermal_devices_p2530_foster,
+ ARRAY_SIZE(gadc_thermal_devices_p2530_foster));
+ } else if (board_info.sku == BOARD_SKU_100 ||
+ board_info.sku == BOARD_SKU_0) {
+ tbat_thermistor_table =
+ &loki_tbat_thermistor_table[0];
+ tbat_thermistor_table_size =
+ ARRAY_SIZE(loki_tbat_thermistor_table);
+ platform_add_devices(gadc_thermal_devices_p2530,
+ ARRAY_SIZE(gadc_thermal_devices_p2530));
+
+ } else {
+ pr_err("thermal: Not a known sku\n");
+ }
}
-
loki_fan_est_init();
if (!(board_info.board_id == BOARD_P2530 &&
board_info.sku == BOARD_SKU_FOSTER)) {