Lines Matching +full:temperature +full:- +full:lookup +full:- +full:table

1 // SPDX-License-Identifier: GPL-2.0
3 * TI Bandgap temperature sensor driver for J72XX SoC Family
5 * Copyright (C) 2021 Texas Instruments Incorporated - http://www.ti.com/
63 static void init_table(int factors_size, int *table, const s64 *factors) in init_table() argument
68 table[i] = compute_value(i, factors, factors_size, in init_table()
73 * struct err_values - structure containing error/reference values
74 * @refs: reference error values for -40C, 30C, 125C & 150C
75 * @errs: Actual error values for -40C, 30C, 125C & 150C read from the efuse
90 idx1 = err_vals->refs[seg]; in create_table_segments()
92 idx2 = err_vals->refs[seg + 1]; in create_table_segments()
93 err1 = err_vals->errs[seg]; in create_table_segments()
94 err2 = err_vals->errs[seg + 1]; in create_table_segments()
95 ref1 = err_vals->refs[seg]; in create_table_segments()
96 ref2 = err_vals->refs[seg + 1]; in create_table_segments()
100 * as the y-axis param and err in adc value as x-axis param in create_table_segments()
102 num = ref2 - ref1; in create_table_segments()
103 den = err2 - err1; in create_table_segments()
106 c = ref2 - m * err2; in create_table_segments()
114 err = (i - c) / m; in create_table_segments()
133 * Fill up the lookup table under 3 segments in prep_lookup_table()
134 * region -40C to +30C in prep_lookup_table()
141 /* Get to the first valid temperature */ in prep_lookup_table()
147 * Get to the last zero index and back fill the temperature for in prep_lookup_table()
152 while (i--) in prep_lookup_table()
153 derived_table[i] = derived_table[i + 1] - 300; in prep_lookup_table()
160 i = TABLE_SIZE - 1; in prep_lookup_table()
162 i--; in prep_lookup_table()
167 derived_table[i] = derived_table[i - 1] + inc * 100; in prep_lookup_table()
197 return (0 - tmp); in two_cmp()
203 int d01 = abs(s0 - s1); in vtm_get_best_value()
204 int d02 = abs(s0 - s2); in vtm_get_best_value()
205 int d12 = abs(s1 - s2); in vtm_get_best_value()
222 bgp = devdata->bgp; in k3_bgp_read_temp()
232 s0 = readl(bgp->base + devdata->stat_offset) & in k3_bgp_read_temp()
234 s1 = readl(bgp->base + devdata->stat_offset) & in k3_bgp_read_temp()
236 s2 = readl(bgp->base + devdata->stat_offset) & in k3_bgp_read_temp()
241 return -EINVAL; in k3_bgp_read_temp()
248 /* Get temperature callback function for thermal zone */
260 int low = 0, high = TABLE_SIZE - 1, mid; in k3_j72xx_bandgap_temp_to_adc_code()
262 if (temp > 160000 || temp < -50000) in k3_j72xx_bandgap_temp_to_adc_code()
263 return -EINVAL; in k3_j72xx_bandgap_temp_to_adc_code()
266 while (low < (high - 1)) { in k3_j72xx_bandgap_temp_to_adc_code()
284 { 0x0, -1, 0x4 }, in get_efuse_values()
285 { 0x0, 0xC, -1 }, in get_efuse_values()
297 /* Extract the offset value using bit-mask */ in get_efuse_values()
298 if (ct_offsets[id][i] == -1 && i == 1) { in get_efuse_values()
303 } else if (ct_offsets[id][i] == -1 && i == 2) { in get_efuse_values()
336 dev_dbg(dev, "Code Temperature\n"); in print_look_up_table()
350 struct device *dev = &pdev->dev; in k3_j72xx_bandgap_probe()
361 -490019999999999936, in k3_j72xx_bandgap_probe()
363 -1705800000000, in k3_j72xx_bandgap_probe()
365 -92627, in k3_j72xx_bandgap_probe()
369 -415230000000000000, in k3_j72xx_bandgap_probe()
371 -1157800000000, in k3_j72xx_bandgap_probe()
374 bgp = devm_kzalloc(&pdev->dev, sizeof(*bgp), GFP_KERNEL); in k3_j72xx_bandgap_probe()
376 return -ENOMEM; in k3_j72xx_bandgap_probe()
378 bgp->dev = dev; in k3_j72xx_bandgap_probe()
380 bgp->base = devm_ioremap_resource(dev, res); in k3_j72xx_bandgap_probe()
381 if (IS_ERR(bgp->base)) in k3_j72xx_bandgap_probe()
382 return PTR_ERR(bgp->base); in k3_j72xx_bandgap_probe()
385 bgp->cfg2_base = devm_ioremap_resource(dev, res); in k3_j72xx_bandgap_probe()
386 if (IS_ERR(bgp->cfg2_base)) in k3_j72xx_bandgap_probe()
387 return PTR_ERR(bgp->cfg2_base); in k3_j72xx_bandgap_probe()
391 workaround_needed = driver_data->has_errata_i2128; in k3_j72xx_bandgap_probe()
395 * for the temperature monitors to function properly. To determine in k3_j72xx_bandgap_probe()
412 dev_dbg(bgp->dev, "Work around %sneeded\n", in k3_j72xx_bandgap_probe()
424 val = readl(bgp->base + K3_VTM_DEVINFO_PWR0_OFFSET); in k3_j72xx_bandgap_probe()
428 data = devm_kcalloc(bgp->dev, cnt, sizeof(*data), GFP_KERNEL); in k3_j72xx_bandgap_probe()
430 ret = -ENOMEM; in k3_j72xx_bandgap_probe()
436 ret = -ENOMEM; in k3_j72xx_bandgap_probe()
440 derived_table = devm_kzalloc(bgp->dev, sizeof(*derived_table) * TABLE_SIZE, in k3_j72xx_bandgap_probe()
443 ret = -ENOMEM; in k3_j72xx_bandgap_probe()
460 /* ref adc values for -40C, 30C & 125C respectively */ in k3_j72xx_bandgap_probe()
473 val = readl(data[id].bgp->cfg2_base + data[id].ctrl_offset); in k3_j72xx_bandgap_probe()
477 writel(val, data[id].bgp->cfg2_base + data[id].ctrl_offset); in k3_j72xx_bandgap_probe()
479 bgp->ts_data[id] = &data[id]; in k3_j72xx_bandgap_probe()
480 ti_thermal = devm_thermal_of_zone_register(bgp->dev, id, &data[id], in k3_j72xx_bandgap_probe()
483 dev_err(bgp->dev, "thermal zone device is NULL\n"); in k3_j72xx_bandgap_probe()
499 writel((low_temp << 16) | high_max, data[0].bgp->cfg2_base + in k3_j72xx_bandgap_probe()
502 writel(K3_VTM_ANYMAXT_OUTRG_ALERT_EN, data[0].bgp->cfg2_base + in k3_j72xx_bandgap_probe()
518 pm_runtime_put_sync(&pdev->dev); in k3_j72xx_bandgap_probe()
519 pm_runtime_disable(&pdev->dev); in k3_j72xx_bandgap_probe()
526 pm_runtime_put_sync(&pdev->dev); in k3_j72xx_bandgap_remove()
527 pm_runtime_disable(&pdev->dev); in k3_j72xx_bandgap_remove()
540 .compatible = "ti,j721e-vtm",
544 .compatible = "ti,j7200-vtm",
555 .name = "k3-j72xx-soc-thermal",
562 MODULE_DESCRIPTION("K3 bandgap temperature sensor driver");
564 MODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>");