Lines Matching full:sensor
102 static int stm_enable_irq(struct stm_thermal_sensor *sensor) in stm_enable_irq() argument
106 dev_dbg(sensor->dev, "low:%d high:%d\n", sensor->low_temp_enabled, in stm_enable_irq()
107 sensor->high_temp_enabled); in stm_enable_irq()
110 value = readl_relaxed(sensor->base + DTS_ITENR_OFFSET); in stm_enable_irq()
113 if (sensor->low_temp_enabled) in stm_enable_irq()
116 if (sensor->high_temp_enabled) in stm_enable_irq()
120 writel_relaxed(value, sensor->base + DTS_ITENR_OFFSET); in stm_enable_irq()
127 struct stm_thermal_sensor *sensor = sdata; in stm_thermal_irq_handler() local
129 dev_dbg(sensor->dev, "sr:%d\n", in stm_thermal_irq_handler()
130 readl_relaxed(sensor->base + DTS_SR_OFFSET)); in stm_thermal_irq_handler()
132 thermal_zone_device_update(sensor->th_dev, THERMAL_EVENT_UNSPECIFIED); in stm_thermal_irq_handler()
134 stm_enable_irq(sensor); in stm_thermal_irq_handler()
137 writel_relaxed(ICIFR_MASK, sensor->base + DTS_ICIFR_OFFSET); in stm_thermal_irq_handler()
142 static int stm_sensor_power_on(struct stm_thermal_sensor *sensor) in stm_sensor_power_on() argument
147 /* Enable sensor */ in stm_sensor_power_on()
148 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_on()
150 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_on()
157 ret = readl_poll_timeout(sensor->base + DTS_SR_OFFSET, in stm_sensor_power_on()
164 value = readl_relaxed(sensor->base + in stm_sensor_power_on()
167 writel_relaxed(value, sensor->base + in stm_sensor_power_on()
170 sensor->mode = THERMAL_DEVICE_ENABLED; in stm_sensor_power_on()
175 static int stm_sensor_power_off(struct stm_thermal_sensor *sensor) in stm_sensor_power_off() argument
179 sensor->mode = THERMAL_DEVICE_DISABLED; in stm_sensor_power_off()
182 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_off()
184 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_off()
189 /* Disable sensor */ in stm_sensor_power_off()
190 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_off()
192 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET); in stm_sensor_power_off()
195 return readl_poll_timeout(sensor->base + DTS_SR_OFFSET, value, in stm_sensor_power_off()
200 static int stm_thermal_calibration(struct stm_thermal_sensor *sensor) in stm_thermal_calibration() argument
206 clk_freq = clk_get_rate(sensor->clk); in stm_thermal_calibration()
217 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET); in stm_thermal_calibration()
238 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET); in stm_thermal_calibration()
243 /* Fill in DTS structure with factory sensor values */
244 static int stm_thermal_read_factory_settings(struct stm_thermal_sensor *sensor) in stm_thermal_read_factory_settings() argument
247 sensor->t0 = readl_relaxed(sensor->base + DTS_T0VALR1_OFFSET) & in stm_thermal_read_factory_settings()
249 if (!sensor->t0) in stm_thermal_read_factory_settings()
250 sensor->t0 = TS1_T0_VAL0; in stm_thermal_read_factory_settings()
252 sensor->t0 = TS1_T0_VAL1; in stm_thermal_read_factory_settings()
255 sensor->fmt0 = ADJUST * (readl_relaxed(sensor->base + in stm_thermal_read_factory_settings()
259 sensor->ramp_coeff = readl_relaxed(sensor->base + DTS_RAMPVALR_OFFSET) & in stm_thermal_read_factory_settings()
262 if (!sensor->fmt0 || !sensor->ramp_coeff) { in stm_thermal_read_factory_settings()
263 dev_err(sensor->dev, "%s: wrong setting\n", __func__); in stm_thermal_read_factory_settings()
267 dev_dbg(sensor->dev, "%s: T0 = %doC, FMT0 = %dHz, RAMP_COEFF = %dHz/oC", in stm_thermal_read_factory_settings()
268 __func__, sensor->t0, sensor->fmt0, sensor->ramp_coeff); in stm_thermal_read_factory_settings()
273 static int stm_thermal_calculate_threshold(struct stm_thermal_sensor *sensor, in stm_thermal_calculate_threshold() argument
279 freqM = ((temp - sensor->t0) * sensor->ramp_coeff) / 1000 + in stm_thermal_calculate_threshold()
280 sensor->fmt0; in stm_thermal_calculate_threshold()
283 *th = clk_get_rate(sensor->clk) * SAMPLING_TIME / freqM; in stm_thermal_calculate_threshold()
287 dev_dbg(sensor->dev, "freqM=%d Hz, threshold=0x%x", freqM, *th); in stm_thermal_calculate_threshold()
293 static int stm_disable_irq(struct stm_thermal_sensor *sensor) in stm_disable_irq() argument
298 value = readl_relaxed(sensor->base + DTS_ITENR_OFFSET); in stm_disable_irq()
300 writel_relaxed(value, sensor->base + DTS_ITENR_OFFSET); in stm_disable_irq()
307 struct stm_thermal_sensor *sensor = data; in stm_thermal_set_trips() local
311 dev_dbg(sensor->dev, "set trips %d <--> %d\n", low, high); in stm_thermal_set_trips()
314 itr1 = readl_relaxed(sensor->base + DTS_ITR1_OFFSET); in stm_thermal_set_trips()
323 sensor->low_temp_enabled = 1; in stm_thermal_set_trips()
325 ret = stm_thermal_calculate_threshold(sensor, low - 500, &th); in stm_thermal_set_trips()
331 sensor->low_temp_enabled = 0; in stm_thermal_set_trips()
336 sensor->high_temp_enabled = 1; in stm_thermal_set_trips()
337 ret = stm_thermal_calculate_threshold(sensor, high, &th); in stm_thermal_set_trips()
343 sensor->high_temp_enabled = 0; in stm_thermal_set_trips()
347 writel_relaxed(itr1, sensor->base + DTS_ITR1_OFFSET); in stm_thermal_set_trips()
355 struct stm_thermal_sensor *sensor = data; in stm_thermal_get_temp() local
359 if (sensor->mode != THERMAL_DEVICE_ENABLED) in stm_thermal_get_temp()
363 ret = readl_relaxed_poll_timeout(sensor->base + DTS_DR_OFFSET, periods, in stm_thermal_get_temp()
370 freqM = (clk_get_rate(sensor->clk) * SAMPLING_TIME) / periods; in stm_thermal_get_temp()
375 *temp = (freqM - sensor->fmt0) * 1000 / sensor->ramp_coeff + sensor->t0; in stm_thermal_get_temp()
381 static int stm_register_irq(struct stm_thermal_sensor *sensor) in stm_register_irq() argument
383 struct device *dev = sensor->dev; in stm_register_irq()
387 sensor->irq = platform_get_irq(pdev, 0); in stm_register_irq()
388 if (sensor->irq < 0) in stm_register_irq()
389 return sensor->irq; in stm_register_irq()
391 ret = devm_request_threaded_irq(dev, sensor->irq, in stm_register_irq()
395 dev->driver->name, sensor); in stm_register_irq()
398 sensor->irq); in stm_register_irq()
407 static int stm_thermal_sensor_off(struct stm_thermal_sensor *sensor) in stm_thermal_sensor_off() argument
411 stm_disable_irq(sensor); in stm_thermal_sensor_off()
413 ret = stm_sensor_power_off(sensor); in stm_thermal_sensor_off()
417 clk_disable_unprepare(sensor->clk); in stm_thermal_sensor_off()
422 static int stm_thermal_prepare(struct stm_thermal_sensor *sensor) in stm_thermal_prepare() argument
426 ret = clk_prepare_enable(sensor->clk); in stm_thermal_prepare()
430 ret = stm_thermal_read_factory_settings(sensor); in stm_thermal_prepare()
434 ret = stm_thermal_calibration(sensor); in stm_thermal_prepare()
441 clk_disable_unprepare(sensor->clk); in stm_thermal_prepare()
449 struct stm_thermal_sensor *sensor = dev_get_drvdata(dev); in stm_thermal_suspend() local
451 return stm_thermal_sensor_off(sensor); in stm_thermal_suspend()
457 struct stm_thermal_sensor *sensor = dev_get_drvdata(dev); in stm_thermal_resume() local
459 ret = stm_thermal_prepare(sensor); in stm_thermal_resume()
463 ret = stm_sensor_power_on(sensor); in stm_thermal_resume()
467 thermal_zone_device_update(sensor->th_dev, THERMAL_EVENT_UNSPECIFIED); in stm_thermal_resume()
468 stm_enable_irq(sensor); in stm_thermal_resume()
490 struct stm_thermal_sensor *sensor; in stm_thermal_probe() local
501 sensor = devm_kzalloc(&pdev->dev, sizeof(*sensor), GFP_KERNEL); in stm_thermal_probe()
502 if (!sensor) in stm_thermal_probe()
505 platform_set_drvdata(pdev, sensor); in stm_thermal_probe()
507 sensor->dev = &pdev->dev; in stm_thermal_probe()
514 /* Populate sensor */ in stm_thermal_probe()
515 sensor->base = base; in stm_thermal_probe()
517 sensor->clk = devm_clk_get(&pdev->dev, "pclk"); in stm_thermal_probe()
518 if (IS_ERR(sensor->clk)) { in stm_thermal_probe()
521 return PTR_ERR(sensor->clk); in stm_thermal_probe()
524 stm_disable_irq(sensor); in stm_thermal_probe()
527 writel_relaxed(ICIFR_MASK, sensor->base + DTS_ICIFR_OFFSET); in stm_thermal_probe()
529 /* Configure and enable HW sensor */ in stm_thermal_probe()
530 ret = stm_thermal_prepare(sensor); in stm_thermal_probe()
532 dev_err(&pdev->dev, "Error prepare sensor: %d\n", ret); in stm_thermal_probe()
536 ret = stm_sensor_power_on(sensor); in stm_thermal_probe()
538 dev_err(&pdev->dev, "Error power on sensor: %d\n", ret); in stm_thermal_probe()
542 sensor->th_dev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, in stm_thermal_probe()
543 sensor, in stm_thermal_probe()
546 if (IS_ERR(sensor->th_dev)) { in stm_thermal_probe()
547 dev_err(&pdev->dev, "%s: thermal zone sensor registering KO\n", in stm_thermal_probe()
549 ret = PTR_ERR(sensor->th_dev); in stm_thermal_probe()
554 ret = stm_register_irq(sensor); in stm_thermal_probe()
558 stm_enable_irq(sensor); in stm_thermal_probe()
564 sensor->th_dev->tzp->no_hwmon = false; in stm_thermal_probe()
565 ret = thermal_add_hwmon_sysfs(sensor->th_dev); in stm_thermal_probe()
575 thermal_zone_of_sensor_unregister(&pdev->dev, sensor->th_dev); in stm_thermal_probe()
581 struct stm_thermal_sensor *sensor = platform_get_drvdata(pdev); in stm_thermal_remove() local
583 stm_thermal_sensor_off(sensor); in stm_thermal_remove()
584 thermal_remove_hwmon_sysfs(sensor->th_dev); in stm_thermal_remove()
585 thermal_zone_of_sensor_unregister(&pdev->dev, sensor->th_dev); in stm_thermal_remove()
601 MODULE_DESCRIPTION("STMicroelectronics STM32 Thermal Sensor Driver");