Lines Matching +full:adc +full:- +full:use +full:- +full:res
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2011-2015, 2017, 2020, The Linux Foundation. All rights reserved.
62 /* Temperature in Milli Celsius reported during stage 0 if no ADC is present */
79 struct iio_channel *adc; member
90 ret = regmap_read(chip->map, chip->base + addr, &val); in qpnp_tm_read()
100 return regmap_write(chip->map, chip->base + addr, data); in qpnp_tm_write()
104 * qpnp_tm_get_temp_stage() - return over-temperature stage
118 if (chip->subtype == QPNP_TM_SUBTYPE_GEN1) in qpnp_tm_get_temp_stage()
135 WARN_ON(!mutex_is_locked(&chip->lock)); in qpnp_tm_update_temp_no_adc()
142 if (chip->subtype == QPNP_TM_SUBTYPE_GEN1) { in qpnp_tm_update_temp_no_adc()
144 stage_old = chip->stage; in qpnp_tm_update_temp_no_adc()
147 stage_old = alarm_state_map[chip->stage]; in qpnp_tm_update_temp_no_adc()
151 /* increasing stage, use lower bound */ in qpnp_tm_update_temp_no_adc()
152 chip->temp = (stage_new - 1) * TEMP_STAGE_STEP + in qpnp_tm_update_temp_no_adc()
153 chip->thresh * TEMP_THRESH_STEP + in qpnp_tm_update_temp_no_adc()
156 /* decreasing stage, use upper bound */ in qpnp_tm_update_temp_no_adc()
157 chip->temp = stage_new * TEMP_STAGE_STEP + in qpnp_tm_update_temp_no_adc()
158 chip->thresh * TEMP_THRESH_STEP - in qpnp_tm_update_temp_no_adc()
162 chip->stage = stage; in qpnp_tm_update_temp_no_adc()
173 return -EINVAL; in qpnp_tm_get_temp()
175 if (!chip->initialized) { in qpnp_tm_get_temp()
180 if (!chip->adc) { in qpnp_tm_get_temp()
181 mutex_lock(&chip->lock); in qpnp_tm_get_temp()
183 mutex_unlock(&chip->lock); in qpnp_tm_get_temp()
187 ret = iio_read_channel_processed(chip->adc, &mili_celsius); in qpnp_tm_get_temp()
191 chip->temp = mili_celsius; in qpnp_tm_get_temp()
194 *temp = chip->temp; in qpnp_tm_get_temp()
205 WARN_ON(!mutex_is_locked(&chip->lock)); in qpnp_tm_update_critical_trip_temp()
215 chip->thresh = THRESH_MIN; in qpnp_tm_update_critical_trip_temp()
220 chip->thresh = THRESH_MAX - in qpnp_tm_update_critical_trip_temp()
221 ((STAGE2_THRESHOLD_MAX - temp) / in qpnp_tm_update_critical_trip_temp()
225 chip->thresh = THRESH_MAX; in qpnp_tm_update_critical_trip_temp()
227 if (chip->adc) in qpnp_tm_update_critical_trip_temp()
230 dev_warn(chip->dev, in qpnp_tm_update_critical_trip_temp()
231 …"No ADC is configured and critical temperature is above the maximum stage 2 threshold of 140 C! Co… in qpnp_tm_update_critical_trip_temp()
235 reg |= chip->thresh; in qpnp_tm_update_critical_trip_temp()
248 trip_points = of_thermal_get_trip_points(chip->tz_dev); in qpnp_tm_set_trip_temp()
250 return -EINVAL; in qpnp_tm_set_trip_temp()
255 mutex_lock(&chip->lock); in qpnp_tm_set_trip_temp()
257 mutex_unlock(&chip->lock); in qpnp_tm_set_trip_temp()
271 thermal_zone_device_update(chip->tz_dev, THERMAL_EVENT_UNSPECIFIED); in qpnp_tm_isr()
282 ntrips = of_thermal_get_ntrips(chip->tz_dev); in qpnp_tm_get_critical_trip_temp()
286 trips = of_thermal_get_trip_points(chip->tz_dev); in qpnp_tm_get_critical_trip_temp()
291 if (of_thermal_is_trip_valid(chip->tz_dev, i) && in qpnp_tm_get_critical_trip_temp()
311 mutex_lock(&chip->lock); in qpnp_tm_init()
317 chip->thresh = reg & SHUTDOWN_CTRL1_THRESHOLD_MASK; in qpnp_tm_init()
318 chip->temp = DEFAULT_TEMP; in qpnp_tm_init()
323 chip->stage = ret; in qpnp_tm_init()
325 stage = chip->subtype == QPNP_TM_SUBTYPE_GEN1 in qpnp_tm_init()
326 ? chip->stage : alarm_state_map[chip->stage]; in qpnp_tm_init()
329 chip->temp = chip->thresh * TEMP_THRESH_STEP + in qpnp_tm_init()
330 (stage - 1) * TEMP_STAGE_STEP + in qpnp_tm_init()
338 /* Enable the thermal alarm PMIC module in always-on mode. */ in qpnp_tm_init()
342 chip->initialized = true; in qpnp_tm_init()
345 mutex_unlock(&chip->lock); in qpnp_tm_init()
354 u32 res; in qpnp_tm_probe() local
357 node = pdev->dev.of_node; in qpnp_tm_probe()
359 chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); in qpnp_tm_probe()
361 return -ENOMEM; in qpnp_tm_probe()
363 dev_set_drvdata(&pdev->dev, chip); in qpnp_tm_probe()
364 chip->dev = &pdev->dev; in qpnp_tm_probe()
366 mutex_init(&chip->lock); in qpnp_tm_probe()
368 chip->map = dev_get_regmap(pdev->dev.parent, NULL); in qpnp_tm_probe()
369 if (!chip->map) in qpnp_tm_probe()
370 return -ENXIO; in qpnp_tm_probe()
372 ret = of_property_read_u32(node, "reg", &res); in qpnp_tm_probe()
380 /* ADC based measurements are optional */ in qpnp_tm_probe()
381 chip->adc = devm_iio_channel_get(&pdev->dev, "thermal"); in qpnp_tm_probe()
382 if (IS_ERR(chip->adc)) { in qpnp_tm_probe()
383 ret = PTR_ERR(chip->adc); in qpnp_tm_probe()
384 chip->adc = NULL; in qpnp_tm_probe()
385 if (ret == -EPROBE_DEFER) in qpnp_tm_probe()
389 chip->base = res; in qpnp_tm_probe()
393 dev_err(&pdev->dev, "could not read type\n"); in qpnp_tm_probe()
399 dev_err(&pdev->dev, "could not read subtype\n"); in qpnp_tm_probe()
405 dev_err(&pdev->dev, "invalid type 0x%02x or subtype 0x%02x\n", in qpnp_tm_probe()
407 return -ENODEV; in qpnp_tm_probe()
410 chip->subtype = subtype; in qpnp_tm_probe()
417 chip->tz_dev = devm_thermal_zone_of_sensor_register( in qpnp_tm_probe()
418 &pdev->dev, 0, chip, &qpnp_tm_sensor_ops); in qpnp_tm_probe()
419 if (IS_ERR(chip->tz_dev)) { in qpnp_tm_probe()
420 dev_err(&pdev->dev, "failed to register sensor\n"); in qpnp_tm_probe()
421 return PTR_ERR(chip->tz_dev); in qpnp_tm_probe()
426 dev_err(&pdev->dev, "init failed\n"); in qpnp_tm_probe()
430 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, qpnp_tm_isr, in qpnp_tm_probe()
431 IRQF_ONESHOT, node->name, chip); in qpnp_tm_probe()
435 thermal_zone_device_update(chip->tz_dev, THERMAL_EVENT_UNSPECIFIED); in qpnp_tm_probe()
441 { .compatible = "qcom,spmi-temp-alarm" },
448 .name = "spmi-temp-alarm",
455 MODULE_ALIAS("platform:spmi-temp-alarm");