Lines Matching refs:sensor

108 	struct stm_thermal_sensor *sensor = sdata;  in stm_thermal_alarm_irq()  local
111 sensor->irq_enabled = false; in stm_thermal_alarm_irq()
119 struct stm_thermal_sensor *sensor = sdata; in stm_thermal_alarm_irq_thread() local
122 value = readl_relaxed(sensor->base + DTS_SR_OFFSET); in stm_thermal_alarm_irq_thread()
125 writel_relaxed(LOW_THRESHOLD, sensor->base + DTS_CIFR_OFFSET); in stm_thermal_alarm_irq_thread()
128 writel_relaxed(HIGH_THRESHOLD, sensor->base + DTS_CIFR_OFFSET); in stm_thermal_alarm_irq_thread()
130 thermal_zone_device_update(sensor->th_dev, THERMAL_EVENT_UNSPECIFIED); in stm_thermal_alarm_irq_thread()
135 static int stm_sensor_power_on(struct stm_thermal_sensor *sensor) in stm_sensor_power_on() argument
141 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_on()
143 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_on()
150 ret = readl_poll_timeout(sensor->base + DTS_SR_OFFSET, in stm_sensor_power_on()
157 value = readl_relaxed(sensor->base + in stm_sensor_power_on()
160 writel_relaxed(value, sensor->base + in stm_sensor_power_on()
166 static int stm_sensor_power_off(struct stm_thermal_sensor *sensor) in stm_sensor_power_off() argument
171 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_off()
173 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_off()
179 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_off()
181 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_off()
184 return readl_poll_timeout(sensor->base + DTS_SR_OFFSET, value, in stm_sensor_power_off()
189 static int stm_thermal_calibration(struct stm_thermal_sensor *sensor) in stm_thermal_calibration() argument
195 clk_freq = clk_get_rate(sensor->clk); in stm_thermal_calibration()
206 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET); in stm_thermal_calibration()
227 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET); in stm_thermal_calibration()
233 static int stm_thermal_read_factory_settings(struct stm_thermal_sensor *sensor) in stm_thermal_read_factory_settings() argument
236 sensor->t0 = readl_relaxed(sensor->base + DTS_T0VALR1_OFFSET) & in stm_thermal_read_factory_settings()
238 if (!sensor->t0) in stm_thermal_read_factory_settings()
239 sensor->t0 = TS1_T0_VAL0; in stm_thermal_read_factory_settings()
241 sensor->t0 = TS1_T0_VAL1; in stm_thermal_read_factory_settings()
244 sensor->fmt0 = ADJUST * (readl_relaxed(sensor->base + in stm_thermal_read_factory_settings()
248 sensor->ramp_coeff = readl_relaxed(sensor->base + DTS_RAMPVALR_OFFSET) & in stm_thermal_read_factory_settings()
251 if (!sensor->fmt0 || !sensor->ramp_coeff) { in stm_thermal_read_factory_settings()
252 dev_err(sensor->dev, "%s: wrong setting\n", __func__); in stm_thermal_read_factory_settings()
256 dev_dbg(sensor->dev, "%s: T0 = %doC, FMT0 = %dHz, RAMP_COEFF = %dHz/oC", in stm_thermal_read_factory_settings()
257 __func__, sensor->t0, sensor->fmt0, sensor->ramp_coeff); in stm_thermal_read_factory_settings()
262 static int stm_thermal_calculate_threshold(struct stm_thermal_sensor *sensor, in stm_thermal_calculate_threshold() argument
269 sampling_time = (readl_relaxed(sensor->base + DTS_CFGR1_OFFSET) & in stm_thermal_calculate_threshold()
273 freqM = ((temp - sensor->t0) * sensor->ramp_coeff) in stm_thermal_calculate_threshold()
274 + sensor->fmt0; in stm_thermal_calculate_threshold()
276 dev_dbg(sensor->dev, "%s: freqM for threshold = %d Hz", in stm_thermal_calculate_threshold()
280 *th = clk_get_rate(sensor->clk); in stm_thermal_calculate_threshold()
291 static int stm_thermal_set_threshold(struct stm_thermal_sensor *sensor) in stm_thermal_set_threshold() argument
296 value = readl_relaxed(sensor->base + DTS_ITR1_OFFSET); in stm_thermal_set_threshold()
302 ret = stm_thermal_calculate_threshold(sensor, sensor->high_temp, &th); in stm_thermal_set_threshold()
308 if (sensor->low_temp_enabled) { in stm_thermal_set_threshold()
310 ret = stm_thermal_calculate_threshold(sensor, sensor->low_temp, in stm_thermal_set_threshold()
319 writel_relaxed(value, sensor->base + DTS_ITR1_OFFSET); in stm_thermal_set_threshold()
325 static int stm_disable_irq(struct stm_thermal_sensor *sensor) in stm_disable_irq() argument
330 value = readl_relaxed(sensor->base + DTS_ITENR_OFFSET); in stm_disable_irq()
332 sensor->base + DTS_ITENR_OFFSET); in stm_disable_irq()
334 dev_dbg(sensor->dev, "%s: IT disabled on sensor side", __func__); in stm_disable_irq()
340 static int stm_enable_irq(struct stm_thermal_sensor *sensor) in stm_enable_irq() argument
350 writel_relaxed(LOW_THRESHOLD, sensor->base + DTS_CIFR_OFFSET); in stm_enable_irq()
353 value = readl_relaxed(sensor->base + DTS_ITENR_OFFSET); in stm_enable_irq()
357 if (sensor->low_temp_enabled) { in stm_enable_irq()
359 writel_relaxed(HIGH_THRESHOLD, sensor->base + DTS_CIFR_OFFSET); in stm_enable_irq()
366 writel_relaxed(value, sensor->base + DTS_ITENR_OFFSET); in stm_enable_irq()
368 dev_dbg(sensor->dev, "%s: IT enabled on sensor side", __func__); in stm_enable_irq()
373 static int stm_thermal_update_threshold(struct stm_thermal_sensor *sensor) in stm_thermal_update_threshold() argument
377 sensor->mode = THERMAL_DEVICE_DISABLED; in stm_thermal_update_threshold()
379 ret = stm_sensor_power_off(sensor); in stm_thermal_update_threshold()
383 ret = stm_disable_irq(sensor); in stm_thermal_update_threshold()
387 ret = stm_thermal_set_threshold(sensor); in stm_thermal_update_threshold()
391 ret = stm_enable_irq(sensor); in stm_thermal_update_threshold()
395 ret = stm_sensor_power_on(sensor); in stm_thermal_update_threshold()
399 sensor->mode = THERMAL_DEVICE_ENABLED; in stm_thermal_update_threshold()
407 struct stm_thermal_sensor *sensor = data; in stm_thermal_get_temp() local
411 if (sensor->mode != THERMAL_DEVICE_ENABLED) in stm_thermal_get_temp()
415 ret = readl_poll_timeout(sensor->base + DTS_DR_OFFSET, freqM, in stm_thermal_get_temp()
426 sampling_time = (readl_relaxed(sensor->base + DTS_CFGR1_OFFSET) & in stm_thermal_get_temp()
433 freqM = clk_get_rate(sensor->clk) / freqM; in stm_thermal_get_temp()
437 dev_dbg(sensor->dev, "%s: freqM=%d\n", __func__, freqM); in stm_thermal_get_temp()
440 *temp = mcelsius(sensor->t0 + ((freqM - sensor->fmt0) / in stm_thermal_get_temp()
441 sensor->ramp_coeff)); in stm_thermal_get_temp()
443 dev_dbg(sensor->dev, "%s: temperature = %d millicelsius", in stm_thermal_get_temp()
447 if (sensor->num_trips > 1) { in stm_thermal_get_temp()
449 if (sensor->high_temp == sensor->temp_passive && in stm_thermal_get_temp()
450 celsius(*temp) >= sensor->temp_passive) { in stm_thermal_get_temp()
451 sensor->high_temp = sensor->temp_critical; in stm_thermal_get_temp()
452 sensor->low_temp = sensor->temp_passive; in stm_thermal_get_temp()
453 sensor->low_temp_enabled = true; in stm_thermal_get_temp()
454 ret = stm_thermal_update_threshold(sensor); in stm_thermal_get_temp()
459 if (sensor->high_temp == sensor->temp_critical && in stm_thermal_get_temp()
460 celsius(*temp) < sensor->temp_passive) { in stm_thermal_get_temp()
461 sensor->high_temp = sensor->temp_passive; in stm_thermal_get_temp()
462 sensor->low_temp_enabled = false; in stm_thermal_get_temp()
463 ret = stm_thermal_update_threshold(sensor); in stm_thermal_get_temp()
472 if (!sensor->irq_enabled && in stm_thermal_get_temp()
473 (celsius(*temp) < sensor->temp_critical)) { in stm_thermal_get_temp()
474 sensor->irq_enabled = true; in stm_thermal_get_temp()
475 enable_irq(sensor->irq); in stm_thermal_get_temp()
483 static int stm_register_irq(struct stm_thermal_sensor *sensor) in stm_register_irq() argument
485 struct device *dev = sensor->dev; in stm_register_irq()
489 sensor->irq = platform_get_irq(pdev, 0); in stm_register_irq()
490 if (sensor->irq < 0) { in stm_register_irq()
492 return sensor->irq; in stm_register_irq()
495 ret = devm_request_threaded_irq(dev, sensor->irq, in stm_register_irq()
499 dev->driver->name, sensor); in stm_register_irq()
502 sensor->irq); in stm_register_irq()
506 sensor->irq_enabled = true; in stm_register_irq()
513 static int stm_thermal_sensor_off(struct stm_thermal_sensor *sensor) in stm_thermal_sensor_off() argument
517 ret = stm_sensor_power_off(sensor); in stm_thermal_sensor_off()
521 clk_disable_unprepare(sensor->clk); in stm_thermal_sensor_off()
526 static int stm_thermal_prepare(struct stm_thermal_sensor *sensor) in stm_thermal_prepare() argument
529 struct device *dev = sensor->dev; in stm_thermal_prepare()
531 ret = clk_prepare_enable(sensor->clk); in stm_thermal_prepare()
535 ret = stm_thermal_read_factory_settings(sensor); in stm_thermal_prepare()
539 ret = stm_thermal_calibration(sensor); in stm_thermal_prepare()
544 ret = stm_thermal_set_threshold(sensor); in stm_thermal_prepare()
548 ret = stm_enable_irq(sensor); in stm_thermal_prepare()
552 ret = stm_sensor_power_on(sensor); in stm_thermal_prepare()
561 stm_disable_irq(sensor); in stm_thermal_prepare()
564 clk_disable_unprepare(sensor->clk); in stm_thermal_prepare()
573 struct stm_thermal_sensor *sensor = dev_get_drvdata(dev); in stm_thermal_suspend() local
575 ret = stm_thermal_sensor_off(sensor); in stm_thermal_suspend()
579 sensor->mode = THERMAL_DEVICE_DISABLED; in stm_thermal_suspend()
587 struct stm_thermal_sensor *sensor = dev_get_drvdata(dev); in stm_thermal_resume() local
589 ret = stm_thermal_prepare(sensor); in stm_thermal_resume()
593 sensor->mode = THERMAL_DEVICE_ENABLED; in stm_thermal_resume()
613 struct stm_thermal_sensor *sensor; in stm_thermal_probe() local
625 sensor = devm_kzalloc(&pdev->dev, sizeof(*sensor), GFP_KERNEL); in stm_thermal_probe()
626 if (!sensor) in stm_thermal_probe()
629 platform_set_drvdata(pdev, sensor); in stm_thermal_probe()
631 sensor->dev = &pdev->dev; in stm_thermal_probe()
639 sensor->base = base; in stm_thermal_probe()
641 sensor->clk = devm_clk_get(&pdev->dev, "pclk"); in stm_thermal_probe()
642 if (IS_ERR(sensor->clk)) { in stm_thermal_probe()
645 return PTR_ERR(sensor->clk); in stm_thermal_probe()
649 ret = stm_register_irq(sensor); in stm_thermal_probe()
653 sensor->th_dev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, in stm_thermal_probe()
654 sensor, in stm_thermal_probe()
657 if (IS_ERR(sensor->th_dev)) { in stm_thermal_probe()
660 ret = PTR_ERR(sensor->th_dev); in stm_thermal_probe()
664 if (!sensor->th_dev->ops->get_crit_temp) { in stm_thermal_probe()
670 ret = sensor->th_dev->ops->get_crit_temp(sensor->th_dev, in stm_thermal_probe()
671 &sensor->temp_critical); in stm_thermal_probe()
678 sensor->temp_critical = celsius(sensor->temp_critical); in stm_thermal_probe()
681 sensor->high_temp = sensor->temp_critical; in stm_thermal_probe()
683 trip = of_thermal_get_trip_points(sensor->th_dev); in stm_thermal_probe()
684 sensor->num_trips = of_thermal_get_ntrips(sensor->th_dev); in stm_thermal_probe()
687 for (i = (sensor->num_trips - 1); i >= 0; i--) { in stm_thermal_probe()
689 sensor->temp_passive = celsius(trip[i].temperature); in stm_thermal_probe()
691 sensor->high_temp = sensor->temp_passive; in stm_thermal_probe()
702 sensor->low_temp_enabled = false; in stm_thermal_probe()
705 ret = stm_thermal_prepare(sensor); in stm_thermal_probe()
716 sensor->th_dev->tzp->no_hwmon = false; in stm_thermal_probe()
717 ret = thermal_add_hwmon_sysfs(sensor->th_dev); in stm_thermal_probe()
721 sensor->mode = THERMAL_DEVICE_ENABLED; in stm_thermal_probe()
729 thermal_zone_of_sensor_unregister(&pdev->dev, sensor->th_dev); in stm_thermal_probe()
735 struct stm_thermal_sensor *sensor = platform_get_drvdata(pdev); in stm_thermal_remove() local
737 stm_thermal_sensor_off(sensor); in stm_thermal_remove()
738 thermal_remove_hwmon_sysfs(sensor->th_dev); in stm_thermal_remove()
739 thermal_zone_of_sensor_unregister(&pdev->dev, sensor->th_dev); in stm_thermal_remove()