Lines Matching refs:data

218 static void imx_set_panic_temp(struct imx_thermal_data *data,
221 const struct thermal_soc_data *soc_data = data->socdata;
222 struct regmap *map = data->tempmon;
225 critical_value = (data->c2 - panic_temp) / data->c1;
233 static void imx_set_alarm_temp(struct imx_thermal_data *data,
236 struct regmap *map = data->tempmon;
237 const struct thermal_soc_data *soc_data = data->socdata;
240 data->alarm_temp = alarm_temp;
242 if (data->socdata->version == TEMPMON_IMX7D)
243 alarm_value = alarm_temp / 1000 + data->c1 - 25;
245 alarm_value = (data->c2 - alarm_temp) / data->c1;
255 struct imx_thermal_data *data = thermal_zone_device_priv(tz);
256 const struct thermal_soc_data *soc_data = data->socdata;
257 struct regmap *map = data->tempmon;
262 ret = pm_runtime_resume_and_get(data->dev);
275 if (data->socdata->version == TEMPMON_IMX7D)
276 *temp = (n_meas - data->c1 + 25) * 1000;
278 *temp = data->c2 - n_meas * data->c1;
281 if (data->socdata->version == TEMPMON_IMX6Q) {
282 if (data->alarm_temp == trips[IMX_TRIP_PASSIVE].temperature &&
284 imx_set_alarm_temp(data, trips[IMX_TRIP_CRITICAL].temperature);
285 if (data->alarm_temp == trips[IMX_TRIP_CRITICAL].temperature &&
287 imx_set_alarm_temp(data, trips[IMX_TRIP_PASSIVE].temperature);
288 dev_dbg(data->dev, "thermal alarm off: T < %d\n",
289 data->alarm_temp / 1000);
293 if (*temp != data->last_temp) {
294 dev_dbg(data->dev, "millicelsius: %d\n", *temp);
295 data->last_temp = *temp;
299 if (!data->irq_enabled && *temp < data->alarm_temp) {
300 data->irq_enabled = true;
301 enable_irq(data->irq);
304 pm_runtime_put(data->dev);
312 struct imx_thermal_data *data = thermal_zone_device_priv(tz);
315 pm_runtime_get(data->dev);
317 if (!data->irq_enabled) {
318 data->irq_enabled = true;
319 enable_irq(data->irq);
322 pm_runtime_put(data->dev);
324 if (data->irq_enabled) {
325 disable_irq(data->irq);
326 data->irq_enabled = false;
336 struct imx_thermal_data *data = thermal_zone_device_priv(tz);
340 ret = pm_runtime_resume_and_get(data->dev);
356 imx_set_alarm_temp(data, temp);
358 pm_runtime_put(data->dev);
388 struct imx_thermal_data *data = platform_get_drvdata(pdev);
393 dev_err(&pdev->dev, "invalid sensor calibration data\n");
398 * On i.MX7D, we only use the calibration data at 25C to get the temp,
401 if (data->socdata->version == TEMPMON_IMX7D) {
402 data->c1 = (ocotp_ana1 >> 9) & 0x1ff;
430 data->c1 = temp64;
431 data->c2 = n1 * data->c1 + 28581;
438 struct imx_thermal_data *data = platform_get_drvdata(pdev);
443 data->temp_grade = "Commercial";
444 data->temp_max = 95000;
447 data->temp_grade = "Extended Commercial";
448 data->temp_max = 105000;
451 data->temp_grade = "Industrial";
452 data->temp_max = 105000;
455 data->temp_grade = "Automotive";
456 data->temp_max = 125000;
464 trips[IMX_TRIP_PASSIVE].temperature = data->temp_max - (1000 * 10);
465 trips[IMX_TRIP_CRITICAL].temperature = data->temp_max - (1000 * 5);
475 "fsl,tempmon-data");
484 dev_err(&pdev->dev, "failed to read sensor data: %d\n", ret);
493 dev_err(&pdev->dev, "failed to read sensor data: %d\n", ret);
524 struct imx_thermal_data *data = dev;
527 data->irq_enabled = false;
534 struct imx_thermal_data *data = dev;
536 dev_dbg(data->dev, "THERMAL ALARM: T > %d\n", data->alarm_temp / 1000);
538 thermal_zone_device_update(data->tz, THERMAL_EVENT_UNSPECIFIED);
544 { .compatible = "fsl,imx6q-tempmon", .data = &thermal_imx6q_data, },
545 { .compatible = "fsl,imx6sx-tempmon", .data = &thermal_imx6sx_data, },
546 { .compatible = "fsl,imx7d-tempmon", .data = &thermal_imx7d_data, },
556 static int imx_thermal_register_legacy_cooling(struct imx_thermal_data *data)
561 data->policy = cpufreq_cpu_get(0);
562 if (!data->policy) {
567 np = of_get_cpu_node(data->policy->cpu, NULL);
570 data->cdev = cpufreq_cooling_register(data->policy);
571 if (IS_ERR(data->cdev)) {
572 ret = PTR_ERR(data->cdev);
573 cpufreq_cpu_put(data->policy);
582 static void imx_thermal_unregister_legacy_cooling(struct imx_thermal_data *data)
584 cpufreq_cooling_unregister(data->cdev);
585 cpufreq_cpu_put(data->policy);
590 static inline int imx_thermal_register_legacy_cooling(struct imx_thermal_data *data)
595 static inline void imx_thermal_unregister_legacy_cooling(struct imx_thermal_data *data)
602 struct imx_thermal_data *data;
607 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
608 if (!data)
611 data->dev = &pdev->dev;
619 data->tempmon = map;
621 data->socdata = of_device_get_match_data(&pdev->dev);
622 if (!data->socdata) {
628 if (data->socdata->version == TEMPMON_IMX6SX) {
636 regmap_write(map, data->socdata->low_alarm_ctrl + REG_SET,
637 data->socdata->low_alarm_mask);
640 data->irq = platform_get_irq(pdev, 0);
641 if (data->irq < 0)
642 return data->irq;
644 platform_set_drvdata(pdev, data);
654 dev_err(&pdev->dev, "failed to init from fsl,tempmon-data\n");
660 regmap_write(map, data->socdata->sensor_ctrl + REG_CLR,
661 data->socdata->power_down_mask);
662 regmap_write(map, data->socdata->sensor_ctrl + REG_CLR,
663 data->socdata->measure_temp_mask);
664 regmap_write(map, data->socdata->measure_freq_ctrl + REG_CLR,
665 data->socdata->measure_freq_mask);
666 if (data->socdata->version != TEMPMON_IMX7D)
669 regmap_write(map, data->socdata->sensor_ctrl + REG_SET,
670 data->socdata->power_down_mask);
672 ret = imx_thermal_register_legacy_cooling(data);
677 data->thermal_clk = devm_clk_get(&pdev->dev, NULL);
678 if (IS_ERR(data->thermal_clk)) {
679 ret = PTR_ERR(data->thermal_clk);
693 ret = clk_prepare_enable(data->thermal_clk);
699 data->tz = thermal_zone_device_register_with_trips("imx_thermal_zone",
702 BIT(IMX_TRIP_PASSIVE), data,
706 if (IS_ERR(data->tz)) {
707 ret = PTR_ERR(data->tz);
714 " critical:%dC passive:%dC\n", data->temp_grade,
715 data->temp_max / 1000, trips[IMX_TRIP_CRITICAL].temperature / 1000,
719 regmap_write(map, data->socdata->measure_freq_ctrl + REG_CLR,
720 data->socdata->measure_freq_mask);
722 regmap_write(map, data->socdata->measure_freq_ctrl + REG_SET,
723 measure_freq << data->socdata->measure_freq_shift);
724 imx_set_alarm_temp(data, trips[IMX_TRIP_PASSIVE].temperature);
726 if (data->socdata->version == TEMPMON_IMX6SX)
727 imx_set_panic_temp(data, trips[IMX_TRIP_CRITICAL].temperature);
729 regmap_write(map, data->socdata->sensor_ctrl + REG_CLR,
730 data->socdata->power_down_mask);
731 regmap_write(map, data->socdata->sensor_ctrl + REG_SET,
732 data->socdata->measure_temp_mask);
738 pm_runtime_enable(data->dev);
740 ret = pm_runtime_resume_and_get(data->dev);
744 data->irq_enabled = true;
745 ret = thermal_zone_device_enable(data->tz);
749 ret = devm_request_threaded_irq(&pdev->dev, data->irq,
751 0, "imx_thermal", data);
757 pm_runtime_put(data->dev);
762 thermal_zone_device_unregister(data->tz);
764 pm_runtime_put_noidle(data->dev);
765 pm_runtime_disable(data->dev);
767 clk_disable_unprepare(data->thermal_clk);
769 imx_thermal_unregister_legacy_cooling(data);
776 struct imx_thermal_data *data = platform_get_drvdata(pdev);
778 pm_runtime_put_noidle(data->dev);
779 pm_runtime_disable(data->dev);
781 thermal_zone_device_unregister(data->tz);
782 imx_thermal_unregister_legacy_cooling(data);
789 struct imx_thermal_data *data = dev_get_drvdata(dev);
799 ret = thermal_zone_device_disable(data->tz);
803 return pm_runtime_force_suspend(data->dev);
808 struct imx_thermal_data *data = dev_get_drvdata(dev);
811 ret = pm_runtime_force_resume(data->dev);
815 return thermal_zone_device_enable(data->tz);
820 struct imx_thermal_data *data = dev_get_drvdata(dev);
821 const struct thermal_soc_data *socdata = data->socdata;
822 struct regmap *map = data->tempmon;
835 clk_disable_unprepare(data->thermal_clk);
842 struct imx_thermal_data *data = dev_get_drvdata(dev);
843 const struct thermal_soc_data *socdata = data->socdata;
844 struct regmap *map = data->tempmon;
847 ret = clk_prepare_enable(data->thermal_clk);