Lines Matching +full:thermal +full:- +full:calibration
1 // SPDX-License-Identifier: GPL-2.0
13 #include <linux/thermal.h>
69 * Thermal zone data
85 return container_of(s, struct qoriq_tmu_data, sensor[s->id]); in qoriq_sensor_to_data()
113 regmap_read(qdata->regmap, REGS_TMR, &val); in tmu_get_temp()
115 return -EAGAIN; in tmu_get_temp()
117 if (regmap_read_poll_timeout(qdata->regmap, in tmu_get_temp()
118 REGS_TRITSR(qsensor->id), in tmu_get_temp()
123 return -ENODATA; in tmu_get_temp()
125 if (qdata->ver == TMU_VER1) { in tmu_get_temp()
149 struct qoriq_sensor *sensor = &qdata->sensor[id]; in qoriq_tmu_register_tmu_zone()
152 sensor->id = id; in qoriq_tmu_register_tmu_zone()
159 if (ret == -ENODEV) in qoriq_tmu_register_tmu_zone()
165 if (qdata->ver == TMU_VER1) in qoriq_tmu_register_tmu_zone()
166 sites |= 0x1 << (15 - id); in qoriq_tmu_register_tmu_zone()
174 if (qdata->ver == TMU_VER1) { in qoriq_tmu_register_tmu_zone()
175 regmap_write(qdata->regmap, REGS_TMR, TMR_ME | TMR_ALPF | sites); in qoriq_tmu_register_tmu_zone()
177 regmap_write(qdata->regmap, REGS_V2_TMSR, sites); in qoriq_tmu_register_tmu_zone()
178 regmap_write(qdata->regmap, REGS_TMR, TMR_ME | TMR_ALPF_V2); in qoriq_tmu_register_tmu_zone()
189 const u32 *calibration; in qoriq_tmu_calibration() local
190 struct device_node *np = dev->of_node; in qoriq_tmu_calibration()
192 len = of_property_count_u32_elems(np, "fsl,tmu-range"); in qoriq_tmu_calibration()
193 if (len < 0 || (data->ver == TMU_VER1 && len > NUM_TTRCR_V1) || in qoriq_tmu_calibration()
194 (data->ver > TMU_VER1 && len > NUM_TTRCR_MAX)) { in qoriq_tmu_calibration()
199 val = of_property_read_u32_array(np, "fsl,tmu-range", data->ttrcr, len); in qoriq_tmu_calibration()
207 regmap_write(data->regmap, REGS_TTRnCR(i), data->ttrcr[i]); in qoriq_tmu_calibration()
209 calibration = of_get_property(np, "fsl,tmu-calibration", &len); in qoriq_tmu_calibration()
210 if (calibration == NULL || len % 8) { in qoriq_tmu_calibration()
211 dev_err(dev, "invalid calibration data.\n"); in qoriq_tmu_calibration()
212 return -ENODEV; in qoriq_tmu_calibration()
215 for (i = 0; i < len; i += 8, calibration += 2) { in qoriq_tmu_calibration()
216 val = of_read_number(calibration, 1); in qoriq_tmu_calibration()
217 regmap_write(data->regmap, REGS_TTCFGR, val); in qoriq_tmu_calibration()
218 val = of_read_number(calibration + 1, 1); in qoriq_tmu_calibration()
219 regmap_write(data->regmap, REGS_TSCFGR, val); in qoriq_tmu_calibration()
228 regmap_write(data->regmap, REGS_TIER, TIER_DISABLE); in qoriq_tmu_init_device()
232 if (data->ver == TMU_VER1) { in qoriq_tmu_init_device()
233 regmap_write(data->regmap, REGS_TMTMIR, TMTMIR_DEFAULT); in qoriq_tmu_init_device()
235 regmap_write(data->regmap, REGS_V2_TMTMIR, TMTMIR_DEFAULT); in qoriq_tmu_init_device()
236 regmap_write(data->regmap, REGS_V2_TEUMR(0), TEUMR0_V2); in qoriq_tmu_init_device()
240 regmap_write(data->regmap, REGS_TMR, TMR_DISABLE); in qoriq_tmu_init_device()
255 .n_yes_ranges = ARRAY_SIZE(qoriq_yes_ranges) - 1,
267 regmap_write(data->regmap, REGS_TMR, TMR_DISABLE); in qoriq_tmu_action()
268 clk_disable_unprepare(data->clk); in qoriq_tmu_action()
276 struct device_node *np = pdev->dev.of_node; in qoriq_tmu_probe()
277 struct device *dev = &pdev->dev; in qoriq_tmu_probe()
278 const bool little_endian = of_property_read_bool(np, "little-endian"); in qoriq_tmu_probe()
295 return -ENOMEM; in qoriq_tmu_probe()
304 data->regmap = devm_regmap_init_mmio(dev, base, ®map_config); in qoriq_tmu_probe()
305 ret = PTR_ERR_OR_ZERO(data->regmap); in qoriq_tmu_probe()
311 data->clk = devm_clk_get_optional(dev, NULL); in qoriq_tmu_probe()
312 if (IS_ERR(data->clk)) in qoriq_tmu_probe()
313 return PTR_ERR(data->clk); in qoriq_tmu_probe()
315 ret = clk_prepare_enable(data->clk); in qoriq_tmu_probe()
326 ret = regmap_read(data->regmap, REGS_IPBRR(0), &ver); in qoriq_tmu_probe()
328 dev_err(&pdev->dev, "Failed to read IP block version\n"); in qoriq_tmu_probe()
331 data->ver = (ver >> 8) & 0xff; in qoriq_tmu_probe()
335 ret = qoriq_tmu_calibration(dev, data); /* TMU calibration */ in qoriq_tmu_probe()
355 ret = regmap_update_bits(data->regmap, REGS_TMR, TMR_ME, 0); in qoriq_tmu_suspend()
359 clk_disable_unprepare(data->clk); in qoriq_tmu_suspend()
369 ret = clk_prepare_enable(data->clk); in qoriq_tmu_resume()
374 return regmap_update_bits(data->regmap, REGS_TMR, TMR_ME, TMR_ME); in qoriq_tmu_resume()
381 { .compatible = "fsl,qoriq-tmu", },
382 { .compatible = "fsl,imx8mq-tmu", },
398 MODULE_DESCRIPTION("QorIQ Thermal Monitoring Unit driver");