Lines Matching defs:sensor

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