Lines Matching refs:chip
79 /* protects .thresh, .stage and chip registers */
90 static int qpnp_tm_read(struct qpnp_tm_chip *chip, u16 addr, u8 *data)
95 ret = regmap_read(chip->map, chip->base + addr, &val);
103 static int qpnp_tm_write(struct qpnp_tm_chip *chip, u16 addr, u8 data)
105 return regmap_write(chip->map, chip->base + addr, data);
111 * @chip: Pointer to the qpnp_tm chip
116 static long qpnp_tm_decode_temp(struct qpnp_tm_chip *chip, unsigned int stage)
118 if (!chip->temp_map || chip->thresh >= THRESH_COUNT || stage == 0 ||
122 return (*chip->temp_map)[chip->thresh][stage - 1];
127 * @chip: Pointer to the qpnp_tm chip
131 static int qpnp_tm_get_temp_stage(struct qpnp_tm_chip *chip)
136 ret = qpnp_tm_read(chip, QPNP_TM_REG_STATUS, ®);
140 if (chip->subtype == QPNP_TM_SUBTYPE_GEN1)
152 static int qpnp_tm_update_temp_no_adc(struct qpnp_tm_chip *chip)
157 WARN_ON(!mutex_is_locked(&chip->lock));
159 ret = qpnp_tm_get_temp_stage(chip);
164 if (chip->subtype == QPNP_TM_SUBTYPE_GEN1) {
166 stage_old = chip->stage;
169 stage_old = alarm_state_map[chip->stage];
174 chip->temp = qpnp_tm_decode_temp(chip, stage_new)
178 chip->temp = qpnp_tm_decode_temp(chip, stage_new + 1)
182 chip->stage = stage;
189 struct qpnp_tm_chip *chip = thermal_zone_device_priv(tz);
195 if (!chip->initialized) {
200 if (!chip->adc) {
201 mutex_lock(&chip->lock);
202 ret = qpnp_tm_update_temp_no_adc(chip);
203 mutex_unlock(&chip->lock);
207 ret = iio_read_channel_processed(chip->adc, &mili_celsius);
211 chip->temp = mili_celsius;
214 *temp = chip->temp;
219 static int qpnp_tm_update_critical_trip_temp(struct qpnp_tm_chip *chip,
222 long stage2_threshold_min = (*chip->temp_map)[THRESH_MIN][1];
223 long stage2_threshold_max = (*chip->temp_map)[THRESH_MAX][1];
227 WARN_ON(!mutex_is_locked(&chip->lock));
237 chip->thresh = THRESH_MIN;
242 chip->thresh = THRESH_MAX -
247 chip->thresh = THRESH_MAX;
249 if (chip->adc)
252 dev_warn(chip->dev,
258 reg |= chip->thresh;
262 return qpnp_tm_write(chip, QPNP_TM_REG_SHUTDOWN_CTRL1, reg);
267 struct qpnp_tm_chip *chip = thermal_zone_device_priv(tz);
271 ret = __thermal_zone_get_trip(chip->tz_dev, trip_id, &trip);
278 mutex_lock(&chip->lock);
279 ret = qpnp_tm_update_critical_trip_temp(chip, temp);
280 mutex_unlock(&chip->lock);
292 struct qpnp_tm_chip *chip = data;
294 thermal_zone_device_update(chip->tz_dev, THERMAL_EVENT_UNSPECIFIED);
299 static int qpnp_tm_get_critical_trip_temp(struct qpnp_tm_chip *chip)
304 for (i = 0; i < thermal_zone_get_num_trips(chip->tz_dev); i++) {
306 ret = thermal_zone_get_trip(chip->tz_dev, i, &trip);
322 static int qpnp_tm_init(struct qpnp_tm_chip *chip)
329 mutex_lock(&chip->lock);
331 ret = qpnp_tm_read(chip, QPNP_TM_REG_SHUTDOWN_CTRL1, ®);
335 chip->thresh = reg & SHUTDOWN_CTRL1_THRESHOLD_MASK;
336 chip->temp = DEFAULT_TEMP;
338 ret = qpnp_tm_get_temp_stage(chip);
341 chip->stage = ret;
343 stage = chip->subtype == QPNP_TM_SUBTYPE_GEN1
344 ? chip->stage : alarm_state_map[chip->stage];
347 chip->temp = qpnp_tm_decode_temp(chip, stage);
349 mutex_unlock(&chip->lock);
351 crit_temp = qpnp_tm_get_critical_trip_temp(chip);
353 mutex_lock(&chip->lock);
355 ret = qpnp_tm_update_critical_trip_temp(chip, crit_temp);
361 ret = qpnp_tm_write(chip, QPNP_TM_REG_ALARM_CTRL, reg);
363 chip->initialized = true;
366 mutex_unlock(&chip->lock);
372 struct qpnp_tm_chip *chip;
380 chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL);
381 if (!chip)
384 dev_set_drvdata(&pdev->dev, chip);
385 chip->dev = &pdev->dev;
387 mutex_init(&chip->lock);
389 chip->map = dev_get_regmap(pdev->dev.parent, NULL);
390 if (!chip->map)
402 chip->adc = devm_iio_channel_get(&pdev->dev, "thermal");
403 if (IS_ERR(chip->adc)) {
404 ret = PTR_ERR(chip->adc);
405 chip->adc = NULL;
410 chip->base = res;
412 ret = qpnp_tm_read(chip, QPNP_TM_REG_TYPE, &type);
417 ret = qpnp_tm_read(chip, QPNP_TM_REG_SUBTYPE, &subtype);
422 ret = qpnp_tm_read(chip, QPNP_TM_REG_DIG_MAJOR, &dig_major);
434 chip->subtype = subtype;
436 chip->temp_map = &temp_map_gen2_v1;
438 chip->temp_map = &temp_map_gen1;
445 chip->tz_dev = devm_thermal_of_zone_register(
446 &pdev->dev, 0, chip, &qpnp_tm_sensor_ops);
447 if (IS_ERR(chip->tz_dev))
448 return dev_err_probe(&pdev->dev, PTR_ERR(chip->tz_dev),
451 ret = qpnp_tm_init(chip);
455 devm_thermal_add_hwmon_sysfs(&pdev->dev, chip->tz_dev);
458 IRQF_ONESHOT, node->name, chip);
462 thermal_zone_device_update(chip->tz_dev, THERMAL_EVENT_UNSPECIFIED);