Lines Matching defs:sensor
99 static int stm_enable_irq(struct stm_thermal_sensor *sensor)
103 dev_dbg(sensor->dev, "low:%d high:%d\n", sensor->low_temp_enabled,
104 sensor->high_temp_enabled);
107 value = readl_relaxed(sensor->base + DTS_ITENR_OFFSET);
110 if (sensor->low_temp_enabled)
113 if (sensor->high_temp_enabled)
117 writel_relaxed(value, sensor->base + DTS_ITENR_OFFSET);
124 struct stm_thermal_sensor *sensor = sdata;
126 dev_dbg(sensor->dev, "sr:%d\n",
127 readl_relaxed(sensor->base + DTS_SR_OFFSET));
129 thermal_zone_device_update(sensor->th_dev, THERMAL_EVENT_UNSPECIFIED);
131 stm_enable_irq(sensor);
134 writel_relaxed(ICIFR_MASK, sensor->base + DTS_ICIFR_OFFSET);
139 static int stm_sensor_power_on(struct stm_thermal_sensor *sensor)
144 /* Enable sensor */
145 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
147 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);
154 ret = readl_poll_timeout(sensor->base + DTS_SR_OFFSET,
161 value = readl_relaxed(sensor->base +
164 writel_relaxed(value, sensor->base +
167 sensor->mode = THERMAL_DEVICE_ENABLED;
172 static int stm_sensor_power_off(struct stm_thermal_sensor *sensor)
176 sensor->mode = THERMAL_DEVICE_DISABLED;
179 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
181 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);
186 /* Disable sensor */
187 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
189 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);
192 return readl_poll_timeout(sensor->base + DTS_SR_OFFSET, value,
197 static int stm_thermal_calibration(struct stm_thermal_sensor *sensor)
203 clk_freq = clk_get_rate(sensor->clk);
214 value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
235 writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);
240 /* Fill in DTS structure with factory sensor values */
241 static int stm_thermal_read_factory_settings(struct stm_thermal_sensor *sensor)
244 sensor->t0 = readl_relaxed(sensor->base + DTS_T0VALR1_OFFSET) &
246 if (!sensor->t0)
247 sensor->t0 = TS1_T0_VAL0;
249 sensor->t0 = TS1_T0_VAL1;
252 sensor->fmt0 = ADJUST * (readl_relaxed(sensor->base +
256 sensor->ramp_coeff = readl_relaxed(sensor->base + DTS_RAMPVALR_OFFSET) &
259 if (!sensor->fmt0 || !sensor->ramp_coeff) {
260 dev_err(sensor->dev, "%s: wrong setting\n", __func__);
264 dev_dbg(sensor->dev, "%s: T0 = %doC, FMT0 = %dHz, RAMP_COEFF = %dHz/oC",
265 __func__, sensor->t0, sensor->fmt0, sensor->ramp_coeff);
270 static int stm_thermal_calculate_threshold(struct stm_thermal_sensor *sensor,
276 freqM = ((temp - sensor->t0) * sensor->ramp_coeff) / 1000 +
277 sensor->fmt0;
280 *th = clk_get_rate(sensor->clk) * SAMPLING_TIME / freqM;
284 dev_dbg(sensor->dev, "freqM=%d Hz, threshold=0x%x", freqM, *th);
290 static int stm_disable_irq(struct stm_thermal_sensor *sensor)
295 value = readl_relaxed(sensor->base + DTS_ITENR_OFFSET);
297 writel_relaxed(value, sensor->base + DTS_ITENR_OFFSET);
304 struct stm_thermal_sensor *sensor = thermal_zone_device_priv(tz);
308 dev_dbg(sensor->dev, "set trips %d <--> %d\n", low, high);
311 itr1 = readl_relaxed(sensor->base + DTS_ITR1_OFFSET);
320 sensor->low_temp_enabled = 1;
322 ret = stm_thermal_calculate_threshold(sensor, low - 500, &th);
328 sensor->low_temp_enabled = 0;
333 sensor->high_temp_enabled = 1;
334 ret = stm_thermal_calculate_threshold(sensor, high, &th);
340 sensor->high_temp_enabled = 0;
344 writel_relaxed(itr1, sensor->base + DTS_ITR1_OFFSET);
352 struct stm_thermal_sensor *sensor = thermal_zone_device_priv(tz);
356 if (sensor->mode != THERMAL_DEVICE_ENABLED)
360 ret = readl_relaxed_poll_timeout(sensor->base + DTS_DR_OFFSET, periods,
367 freqM = (clk_get_rate(sensor->clk) * SAMPLING_TIME) / periods;
372 *temp = (freqM - sensor->fmt0) * 1000 / sensor->ramp_coeff + sensor->t0;
378 static int stm_register_irq(struct stm_thermal_sensor *sensor)
380 struct device *dev = sensor->dev;
384 sensor->irq = platform_get_irq(pdev, 0);
385 if (sensor->irq < 0)
386 return sensor->irq;
388 ret = devm_request_threaded_irq(dev, sensor->irq,
392 dev->driver->name, sensor);
395 sensor->irq);
404 static int stm_thermal_sensor_off(struct stm_thermal_sensor *sensor)
408 stm_disable_irq(sensor);
410 ret = stm_sensor_power_off(sensor);
414 clk_disable_unprepare(sensor->clk);
419 static int stm_thermal_prepare(struct stm_thermal_sensor *sensor)
423 ret = clk_prepare_enable(sensor->clk);
427 ret = stm_thermal_read_factory_settings(sensor);
431 ret = stm_thermal_calibration(sensor);
438 clk_disable_unprepare(sensor->clk);
446 struct stm_thermal_sensor *sensor = dev_get_drvdata(dev);
448 return stm_thermal_sensor_off(sensor);
454 struct stm_thermal_sensor *sensor = dev_get_drvdata(dev);
456 ret = stm_thermal_prepare(sensor);
460 ret = stm_sensor_power_on(sensor);
464 thermal_zone_device_update(sensor->th_dev, THERMAL_EVENT_UNSPECIFIED);
465 stm_enable_irq(sensor);
487 struct stm_thermal_sensor *sensor;
497 sensor = devm_kzalloc(&pdev->dev, sizeof(*sensor), GFP_KERNEL);
498 if (!sensor)
501 platform_set_drvdata(pdev, sensor);
503 sensor->dev = &pdev->dev;
509 /* Populate sensor */
510 sensor->base = base;
512 sensor->clk = devm_clk_get(&pdev->dev, "pclk");
513 if (IS_ERR(sensor->clk)) {
516 return PTR_ERR(sensor->clk);
519 stm_disable_irq(sensor);
522 writel_relaxed(ICIFR_MASK, sensor->base + DTS_ICIFR_OFFSET);
524 /* Configure and enable HW sensor */
525 ret = stm_thermal_prepare(sensor);
527 dev_err(&pdev->dev, "Error prepare sensor: %d\n", ret);
531 ret = stm_sensor_power_on(sensor);
533 dev_err(&pdev->dev, "Error power on sensor: %d\n", ret);
537 sensor->th_dev = devm_thermal_of_zone_register(&pdev->dev, 0,
538 sensor,
541 if (IS_ERR(sensor->th_dev)) {
542 dev_err(&pdev->dev, "%s: thermal zone sensor registering KO\n",
544 ret = PTR_ERR(sensor->th_dev);
549 ret = stm_register_irq(sensor);
553 stm_enable_irq(sensor);
559 ret = thermal_add_hwmon_sysfs(sensor->th_dev);
574 struct stm_thermal_sensor *sensor = platform_get_drvdata(pdev);
576 stm_thermal_sensor_off(sensor);
577 thermal_remove_hwmon_sysfs(sensor->th_dev);