static int therm_est_subdev_get_temp(void *data, long *temp) { struct thermal_zone_device *thz; thz = thermal_zone_device_find(data, therm_est_subdev_match); if (!thz || thz->ops->get_temp(thz, temp)) return -ENXIO; return 0; }
static int tegra_skin_get_temp(void *data, long *temp) { struct thermal_zone_device *thz; thz = thermal_zone_device_find(data, tegra_skin_match); if (!thz || thz->ops->get_temp(thz, temp)) *temp = 25000; return 0; }
static int fan_est_get_temp_func(const char *data, long *temp) { struct thermal_zone_device *thz; thz = thermal_zone_device_find((void *)data, fan_est_match); if (!thz || thz->ops->get_temp == NULL || thz->ops->get_temp(thz, temp)) *temp = 25000; return 0; }
static void mpu_dt_update(void) { struct device_node *np; struct board_info displayboard_info; static signed char mpu_gyro_orientation_1_95[] = { 0, 1, 0, 0, 0, 1, 1, 0, 0 }; static signed char mpu_gyro_orientation_fab0[] = { 0, -1, 0, -1, 0, 0, 0, 0, -1 }; static struct property orientation = { .name = "invensense,orientation", .value = mpu_gyro_orientation_1_95, .length = sizeof(mpu_gyro_orientation_1_95), }; np = of_find_compatible_node(NULL, NULL, "invensense,mpu6050"); if (np == NULL) { pr_err("%s: Cannot find mpu6050 node\n", __func__); return; } if (board_info.board_id == BOARD_E2549) { of_update_property(np, &orientation); } else { tegra_get_display_board_info(&displayboard_info); if (displayboard_info.fab == 0x0) { orientation.value = mpu_gyro_orientation_fab0; of_update_property(np, &orientation); } } of_node_put(np); } #endif static struct tegra_io_dpd csia_io = { .name = "CSIA", .io_dpd_reg_index = 0, .io_dpd_bit = 0, }; static struct tegra_io_dpd csib_io = { .name = "CSIB", .io_dpd_reg_index = 0, .io_dpd_bit = 1, }; static struct tegra_io_dpd csie_io = { .name = "CSIE", .io_dpd_reg_index = 1, .io_dpd_bit = 12, }; static int loki_mt9m114_power_on(struct mt9m114_power_rail *pw) { int err; if (unlikely(!pw || !pw->avdd || !pw->iovdd)) return -EFAULT; /* disable CSIA IOs DPD mode to turn on front camera for ardbeg */ tegra_io_dpd_disable(&csia_io); gpio_set_value(CAM_RSTN, 0); gpio_set_value(CAM2_PWDN, 1); usleep_range(1000, 1020); err = regulator_enable(pw->iovdd); if (unlikely(err)) goto mt9m114_iovdd_fail; err = regulator_enable(pw->avdd); if (unlikely(err)) goto mt9m114_avdd_fail; usleep_range(1000, 1020); gpio_set_value(CAM_RSTN, 1); gpio_set_value(CAM2_PWDN, 0); usleep_range(1000, 1020); /* return 1 to skip the in-driver power_on swquence */ return 1; mt9m114_avdd_fail: regulator_disable(pw->iovdd); mt9m114_iovdd_fail: gpio_set_value(CAM_RSTN, 0); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -ENODEV; } static int loki_mt9m114_power_off(struct mt9m114_power_rail *pw) { if (unlikely(!pw || !pw->avdd || !pw->iovdd)) { /* put CSIA IOs into DPD mode to * save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -EFAULT; } usleep_range(100, 120); gpio_set_value(CAM_RSTN, 0); usleep_range(100, 120); regulator_disable(pw->avdd); usleep_range(100, 120); regulator_disable(pw->iovdd); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return 1; } struct mt9m114_platform_data loki_mt9m114_pdata = { .power_on = loki_mt9m114_power_on, .power_off = loki_mt9m114_power_off, }; static int loki_ov7695_power_on(struct ov7695_power_rail *pw) { int err; if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) return -EFAULT; /* disable CSIA IOs DPD mode to turn on front camera for ardbeg */ tegra_io_dpd_disable(&csia_io); gpio_set_value(CAM2_PWDN, 0); usleep_range(1000, 1020); err = regulator_enable(pw->avdd); if (unlikely(err)) goto ov7695_avdd_fail; usleep_range(300, 320); err = regulator_enable(pw->iovdd); if (unlikely(err)) goto ov7695_iovdd_fail; usleep_range(1000, 1020); gpio_set_value(CAM2_PWDN, 1); usleep_range(1000, 1020); return 0; ov7695_iovdd_fail: regulator_disable(pw->avdd); ov7695_avdd_fail: gpio_set_value(CAM_RSTN, 0); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -ENODEV; } static int loki_ov7695_power_off(struct ov7695_power_rail *pw) { if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) { /* put CSIA IOs into DPD mode to * save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -EFAULT; } usleep_range(100, 120); regulator_disable(pw->iovdd); usleep_range(100, 120); regulator_disable(pw->avdd); usleep_range(100, 120); gpio_set_value(CAM2_PWDN, 0); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return 0; } struct ov7695_platform_data loki_ov7695_pdata = { .power_on = loki_ov7695_power_on, .power_off = loki_ov7695_power_off, }; static struct camera_data_blob loki_camera_lut[] = { {"loki_ov7695_pdata", &loki_ov7695_pdata}, {}, }; void __init loki_camera_auxdata(void *data) { struct of_dev_auxdata *aux_lut = data; while (aux_lut && aux_lut->compatible) { if (!strcmp(aux_lut->compatible, "nvidia,tegra124-camera")) { pr_info("%s: update camera lookup table.\n", __func__); aux_lut->platform_data = loki_camera_lut; } aux_lut++; } } static int loki_camera_init(void) { pr_debug("%s: ++\n", __func__); /* put CSIA/B/E IOs into DPD mode to * save additional power */ tegra_io_dpd_enable(&csia_io); tegra_io_dpd_enable(&csib_io); tegra_io_dpd_enable(&csie_io); /* Don't turn on CAM_MCLK for FFD fab a3 or higher */ if (board_info.board_id == BOARD_P2530 && board_info.fab >= 0xa3) loki_ov7695_pdata.mclk_name = "ext_mclk"; return 0; } static struct throttle_table tj_throttle_table[] = { /* CPU_THROT_LOW cannot be used by other than CPU */ /* CPU, GPU, C2BUS, C3BUS, SCLK, EMC */ { { 2295000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2269500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2244000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2218500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2193000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2167500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2142000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2116500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2091000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2065500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2040000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2014500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1989000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1963500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1938000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1912500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1887000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1861500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1836000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1606500, 790000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1581000, 776000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1555500, 762000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1530000, 749000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1504500, 735000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1479000, 721000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1453500, 707000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1428000, 693000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1402500, 679000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1377000, 666000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1351500, 652000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1326000, 638000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1300500, 624000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1275000, 610000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1249500, 596000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1224000, 582000, NO_CAP, NO_CAP, NO_CAP, 792000 } }, { { 1198500, 569000, NO_CAP, NO_CAP, NO_CAP, 792000 } }, { { 1173000, 555000, NO_CAP, NO_CAP, 360000, 792000 } }, { { 1147500, 541000, NO_CAP, NO_CAP, 360000, 792000 } }, { { 1122000, 527000, NO_CAP, 684000, 360000, 792000 } }, { { 1096500, 513000, 444000, 684000, 360000, 792000 } }, { { 1071000, 499000, 444000, 684000, 360000, 792000 } }, { { 1045500, 486000, 444000, 684000, 360000, 792000 } }, { { 1020000, 472000, 444000, 684000, 324000, 792000 } }, { { 994500, 458000, 444000, 684000, 324000, 792000 } }, { { 969000, 444000, 444000, 600000, 324000, 792000 } }, { { 943500, 430000, 444000, 600000, 324000, 792000 } }, { { 918000, 416000, 396000, 600000, 324000, 792000 } }, { { 892500, 402000, 396000, 600000, 324000, 792000 } }, { { 867000, 389000, 396000, 600000, 324000, 792000 } }, { { 841500, 375000, 396000, 600000, 288000, 792000 } }, { { 816000, 361000, 396000, 600000, 288000, 792000 } }, { { 790500, 347000, 396000, 600000, 288000, 792000 } }, { { 765000, 333000, 396000, 504000, 288000, 792000 } }, { { 739500, 319000, 348000, 504000, 288000, 792000 } }, { { 714000, 306000, 348000, 504000, 288000, 624000 } }, { { 688500, 292000, 348000, 504000, 288000, 624000 } }, { { 663000, 278000, 348000, 504000, 288000, 624000 } }, { { 637500, 264000, 348000, 504000, 288000, 624000 } }, { { 612000, 250000, 348000, 504000, 252000, 624000 } }, { { 586500, 236000, 348000, 504000, 252000, 624000 } }, { { 561000, 222000, 348000, 420000, 252000, 624000 } }, { { 535500, 209000, 288000, 420000, 252000, 624000 } }, { { 510000, 195000, 288000, 420000, 252000, 624000 } }, { { 484500, 181000, 288000, 420000, 252000, 624000 } }, { { 459000, 167000, 288000, 420000, 252000, 624000 } }, { { 433500, 153000, 288000, 420000, 252000, 396000 } }, { { 408000, 139000, 288000, 420000, 252000, 396000 } }, { { 382500, 126000, 288000, 420000, 252000, 396000 } }, { { 357000, 112000, 288000, 420000, 252000, 396000 } }, { { 331500, 98000, 288000, 420000, 252000, 396000 } }, { { 306000, 84000, 288000, 420000, 252000, 396000 } }, { { 280500, 84000, 288000, 420000, 252000, 396000 } }, { { 255000, 84000, 288000, 420000, 252000, 396000 } }, { { 229500, 84000, 288000, 420000, 252000, 396000 } }, { { 204000, 84000, 288000, 420000, 252000, 396000 } }, }; static struct balanced_throttle tj_throttle = { .throt_tab_size = ARRAY_SIZE(tj_throttle_table), .throt_tab = tj_throttle_table, }; static int __init loki_throttle_init(void) { if (of_machine_is_compatible("nvidia,loki") || of_machine_is_compatible("nvidia,t132loki")) balanced_throttle_register(&tj_throttle, "tegra-balanced"); return 0; } module_init(loki_throttle_init); static int loki_fan_est_match(struct thermal_zone_device *thz, void *data) { return (strcmp((char *)data, thz->type) == 0); } static int loki_fan_est_get_temp(void *data, long *temp) { struct thermal_zone_device *thz; thz = thermal_zone_device_find(data, loki_fan_est_match); if (!thz || thz->ops->get_temp(thz, temp)) *temp = 25000; return 0; } static struct thermal_zone_params fan_tzp = { .governor_name = "pid_thermal_gov", }; static int active_trip_temps_loki[] = {0, 60000, 68000, 79000, 90000, 140000, 150000, 160000, 170000, 180000}; static int active_hysteresis_loki[] = {0, 20000, 7000, 10000, 10000, 0, 0, 0, 0, 0}; static int active_trip_temps_foster[] = {0, 63000, 74000, 85000, 120000, 140000, 150000, 160000, 170000, 180000}; static int active_hysteresis_foster[] = {0, 15000, 11000, 6000, 4000, 0, 0, 0, 0, 0}; /*Fan thermal estimator data for P2548*/ static struct therm_fan_est_data fan_est_data = { .toffset = 0, .polling_period = 1100, .ndevs = 2, .devs = { { .dev_data = "CPU-therm", .get_temp = loki_fan_est_get_temp, .coeffs = { 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { .dev_data = "GPU-therm", .get_temp = loki_fan_est_get_temp, .coeffs = { 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, }, .cdev_type = "pwm-fan",