Ventana: KBC: Removing the KBC usage on ventana
[linux-2.6.git] / arch / arm / mach-tegra / board-enterprise-sensors.c
index 1c3950f..2874971 100644 (file)
@@ -1,21 +1,34 @@
 /*
  * arch/arm/mach-tegra/board-enterprise-sensors.c
  *
- * Copyright (c) 2011, NVIDIA, All Rights Reserved.
+ * Copyright (c) 2011, NVIDIA CORPORATION, All rights reserved.
  *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
  *
+ * Neither the name of NVIDIA CORPORATION nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include <linux/i2c.h>
@@ -28,6 +41,7 @@
 #include <media/ar0832_main.h>
 #include <media/tps61050.h>
 #include <media/ov9726.h>
+#include <mach/edp.h>
 #include "cpu-tegra.h"
 #include "gpio-names.h"
 #include "board-enterprise.h"
@@ -36,11 +50,10 @@ static struct nct1008_platform_data enterprise_nct1008_pdata = {
        .supported_hwrev = true,
        .ext_range = true,
        .conv_rate = 0x08,
-       .offset = 0,
        .hysteresis = 5,
-       .shutdown_ext_limit = 75,
-       .shutdown_local_limit = 75,
-       .throttling_ext_limit = 90,
+       .shutdown_ext_limit = 90,
+       .shutdown_local_limit = 90,
+       .throttling_ext_limit = 75,
        .alarm_fn = tegra_throttling_enable,
 };
 
@@ -55,6 +68,13 @@ static struct i2c_board_info enterprise_i2c4_nct1008_board_info[] = {
 static void enterprise_nct1008_init(void)
 {
        int ret;
+       struct nct1008_platform_data *pdata;
+#ifdef CONFIG_TEGRA_EDP_LIMITS
+       const struct tegra_edp_limits *z;
+       int zones_sz;
+       int i;
+       bool throttle_ok = false;
+#endif
 
        tegra_gpio_enable(TEGRA_GPIO_PH7);
        ret = gpio_request(TEGRA_GPIO_PH7, "temp_alert");
@@ -70,8 +90,33 @@ static void enterprise_nct1008_init(void)
                return;
        }
 
+       /* Temperature guardband AP30S DSC: bug 844025 */
+       pdata = enterprise_i2c4_nct1008_board_info[0].platform_data;
+       pdata->offset = 33; /* 4 * 8.25C */
+
        i2c_register_board_info(4, enterprise_i2c4_nct1008_board_info,
                                ARRAY_SIZE(enterprise_i2c4_nct1008_board_info));
+#ifdef CONFIG_TEGRA_EDP_LIMITS
+       tegra_get_cpu_edp_limits(&z, &zones_sz);
+       zones_sz = min(zones_sz, MAX_ZONES);
+       for (i = 0; i < zones_sz; i++) {
+               enterprise_nct1008_pdata.thermal_zones[i] = z[i].temperature;
+               if (enterprise_nct1008_pdata.thermal_zones[i] ==
+                   enterprise_nct1008_pdata.throttling_ext_limit) {
+                       throttle_ok = true;
+               }
+       }
+
+       if (throttle_ok != true)
+               pr_warn("%s: WARNING! Throttling limit %dC would be inaccurate"
+                       " as it is NOT one of the EDP points\n",
+                       __func__, enterprise_nct1008_pdata.throttling_ext_limit);
+       else
+               pr_info("%s: Throttling limit %dC OK\n",
+                       __func__, enterprise_nct1008_pdata.throttling_ext_limit);
+
+       enterprise_nct1008_pdata.thermal_zones_sz = zones_sz;
+#endif
 }
 
 #define SENSOR_MPU_NAME "mpu3050"