diff options
-rw-r--r-- | arch/arm/mach-tegra/board-cardhu-power.c | 27 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-cardhu-sensors.c | 37 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-cardhu.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-cardhu.h | 3 |
4 files changed, 59 insertions, 11 deletions
diff --git a/arch/arm/mach-tegra/board-cardhu-power.c b/arch/arm/mach-tegra/board-cardhu-power.c index f593d9fe4d11..6af7c4a85b51 100644 --- a/arch/arm/mach-tegra/board-cardhu-power.c +++ b/arch/arm/mach-tegra/board-cardhu-power.c @@ -33,6 +33,7 @@ #include <mach/iomap.h> #include <mach/irqs.h> #include <mach/pinmux.h> +#include <mach/edp.h> #include "gpio-names.h" #include "board.h" @@ -943,3 +944,29 @@ int __init cardhu_power_off_init(void) return 0; } +#ifdef CONFIG_TEGRA_EDP_LIMITS +/* + * placeholder for now. needs to be changed with characterized data. + * step size cannot be less than 4C + */ +static struct tegra_edp_limits cardhu_edp_limits[] = { +/* Temperature 1 CPU 2 CPUs 3 CPUs 4 CPUs */ + {60, {1400000, 1300000, 1300000, 1300000}}, + {70, {1400000, 1300000, 1300000, 1260000}}, + {80, {1400000, 1300000, 1300000, 1200000}}, + {90, {1400000, 1300000, 1300000, 1100000}}, +}; + +void cardhu_thermal_zones_info(struct tegra_edp_limits **z, int *sz) +{ + *z = cardhu_edp_limits; + *sz = ARRAY_SIZE(cardhu_edp_limits); +} + +int __init cardhu_edp_init(void) +{ + // FIXME: uncomment to override default EDP with above table + //tegra_init_cpu_edp_limits(cardhu_edp_limits, ARRAY_SIZE(cardhu_edp_limits)); + return 0; +} +#endif diff --git a/arch/arm/mach-tegra/board-cardhu-sensors.c b/arch/arm/mach-tegra/board-cardhu-sensors.c index 7948e89b9f99..094db0a20eae 100644 --- a/arch/arm/mach-tegra/board-cardhu-sensors.c +++ b/arch/arm/mach-tegra/board-cardhu-sensors.c @@ -35,6 +35,7 @@ #include <media/sh532u.h> #include <mach/gpio.h> +#include <mach/edp.h> #include "gpio-names.h" #include "board-cardhu.h" @@ -428,6 +429,8 @@ static struct i2c_board_info cardhu_i2c8_board_info[] = { }, }; +extern void tegra_throttling_enable(bool enable); + static struct nct1008_platform_data cardhu_nct1008_pdata = { .supported_hwrev = true, .ext_range = false, @@ -436,8 +439,8 @@ static struct nct1008_platform_data cardhu_nct1008_pdata = { .hysteresis = 5, .shutdown_ext_limit = 75, .shutdown_local_limit = 75, - .throttling_ext_limit = 60, - .alarm_fn = NULL, + .throttling_ext_limit = 90, + .alarm_fn = tegra_throttling_enable, }; static struct i2c_board_info cardhu_i2c4_bq27510_board_info[] = { @@ -447,7 +450,7 @@ static struct i2c_board_info cardhu_i2c4_bq27510_board_info[] = { }, }; -static struct i2c_board_info cardhu_i2c4_board_info[] = { +static struct i2c_board_info cardhu_i2c4_nct1008_board_info[] = { { I2C_BOARD_INFO("nct1008", 0x4C), .platform_data = &cardhu_nct1008_pdata, @@ -455,10 +458,19 @@ static struct i2c_board_info cardhu_i2c4_board_info[] = { } }; +#ifdef CONFIG_TEGRA_EDP_LIMITS +extern void cardhu_thermal_zones_info(struct tegra_edp_limits **, int *); +#endif + static int cardhu_nct1008_init(void) { int nct1008_port = -1; int ret; +#ifdef CONFIG_TEGRA_EDP_LIMITS + struct tegra_edp_limits *z; + int zones_sz; + int i; +#endif if ((board_info.board_id == BOARD_E1198) || (board_info.board_id == BOARD_E1291)) { @@ -471,8 +483,7 @@ static int cardhu_nct1008_init(void) if (nct1008_port >= 0) { /* FIXME: enable irq when throttling is supported */ - /* cardhu_i2c4_board_info[0].irq = */ - /* TEGRA_GPIO_TO_IRQ(nct1008_port); */ + cardhu_i2c4_nct1008_board_info[0].irq = TEGRA_GPIO_TO_IRQ(nct1008_port); ret = gpio_request(nct1008_port, "temp_alert"); if (ret < 0) @@ -483,8 +494,16 @@ static int cardhu_nct1008_init(void) gpio_free(nct1008_port); else tegra_gpio_enable(nct1008_port); - } + +#ifdef CONFIG_TEGRA_EDP_LIMITS + cardhu_thermal_zones_info(&z, &zones_sz); + zones_sz = min(zones_sz, MAX_ZONES); + for (i = 0; i < zones_sz; i++) + cardhu_nct1008_pdata.thermal_zones[i] = z[i].temperature; + + cardhu_nct1008_pdata.thermal_zones_sz = zones_sz; +#endif return ret; } @@ -628,9 +647,6 @@ int __init cardhu_sensors_init(void) pmu_tca6416_init(); - i2c_register_board_info(4, cardhu_i2c4_board_info, - ARRAY_SIZE(cardhu_i2c4_board_info)); - if (board_info.board_id == BOARD_E1291) i2c_register_board_info(4, cardhu_i2c4_bq27510_board_info, ARRAY_SIZE(cardhu_i2c4_bq27510_board_info)); @@ -642,6 +658,9 @@ int __init cardhu_sensors_init(void) if (err) return err; + i2c_register_board_info(4, cardhu_i2c4_nct1008_board_info, + ARRAY_SIZE(cardhu_i2c4_nct1008_board_info)); + #ifdef CONFIG_MPU_SENSORS_MPU3050 cardhu_mpuirq_init(); #endif diff --git a/arch/arm/mach-tegra/board-cardhu.c b/arch/arm/mach-tegra/board-cardhu.c index 64f108eb4b5f..dced282926c0 100644 --- a/arch/arm/mach-tegra/board-cardhu.c +++ b/arch/arm/mach-tegra/board-cardhu.c @@ -604,6 +604,9 @@ static void __init tegra_cardhu_init(void) cardhu_pinmux_init(); cardhu_i2c_init(); cardhu_usb_init(); +#ifdef CONFIG_TEGRA_EDP_LIMITS + cardhu_edp_init(); +#endif snprintf(serial, sizeof(serial), "%llx", tegra_chip_uid()); andusb_plat.serial_number = kstrdup(serial, GFP_KERNEL); platform_add_devices(cardhu_devices, ARRAY_SIZE(cardhu_devices)); diff --git a/arch/arm/mach-tegra/board-cardhu.h b/arch/arm/mach-tegra/board-cardhu.h index 05af0b482725..955e453fc39f 100644 --- a/arch/arm/mach-tegra/board-cardhu.h +++ b/arch/arm/mach-tegra/board-cardhu.h @@ -125,8 +125,6 @@ #define TPS6591X_IRQ_BASE TEGRA_NR_IRQS #define TPS6591X_IRQ_END (TPS6591X_IRQ_BASE + 24) - - int cardhu_charge_init(void); int cardhu_regulator_init(void); int cardhu_suspend_init(void); @@ -142,6 +140,7 @@ int cardhu_gpio_switch_regulator_init(void); int cardhu_pins_state_init(void); int cardhu_emc_init(void); int cardhu_power_off_init(void); +int cardhu_edp_init(void); /* Touchscreen GPIO addresses */ #ifdef CONFIG_TOUCHSCREEN_PANJIT_I2C |