/** * omap_bandgap_read_update_interval() - read the sensor update interval * @bg_ptr - pointer to bandgap instance * @id - sensor id * @interval - resulting update interval in miliseconds * * returns 0 on success or the proper error code */ int omap_bandgap_read_update_interval(struct omap_bandgap *bg_ptr, int id, int *interval) { struct temp_sensor_registers *tsr; u32 time; int ret; ret = omap_bandgap_validate(bg_ptr, id); if (ret) return ret; if (!OMAP_BANDGAP_HAS(bg_ptr, COUNTER)) return -ENOTSUPP; tsr = bg_ptr->conf->sensors[id].registers; time = omap_bandgap_readl(bg_ptr, tsr->bgap_counter); if (ret) return ret; time = (time & tsr->counter_mask) >> __ffs(tsr->counter_mask); time = time * 1000 / bg_ptr->clk_rate; *interval = time; return 0; }
/** * omap_bandgap_write_tcold() - sets the sensor tcold * @bg_ptr - pointer to bandgap instance * @id - sensor id * @val - desired tcold value * * returns 0 on success or the proper error code */ int omap_bandgap_write_tcold(struct omap_bandgap *bg_ptr, int id, int val) { struct temp_sensor_data *ts_data; struct temp_sensor_registers *tsr; u32 t_cold; int ret; ret = omap_bandgap_validate(bg_ptr, id); if (ret) return ret; if (!OMAP_BANDGAP_HAS(bg_ptr, TALERT)) return -ENOTSUPP; ts_data = bg_ptr->conf->sensors[id].ts_data; tsr = bg_ptr->conf->sensors[id].registers; if (val > ts_data->max_temp + ts_data->hyst_val) return -EINVAL; ret = temp_to_adc_conversion(val, bg_ptr, id, &t_cold); if (ret < 0) return ret; mutex_lock(&bg_ptr->bg_mutex); temp_sensor_configure_tcold(bg_ptr, id, t_cold); mutex_unlock(&bg_ptr->bg_mutex); return 0; }
/** * omap_bandgap_read_tcold() - reads sensor current tcold * @bg_ptr - pointer to bandgap instance * @id - sensor id * @tcold - resulting current tcold value * * returns 0 on success or the proper error code */ int omap_bandgap_read_tcold(struct omap_bandgap *bg_ptr, int id, int *tcold) { struct temp_sensor_registers *tsr; u32 temp; int ret; ret = omap_bandgap_validate(bg_ptr, id); if (ret) return ret; if (!OMAP_BANDGAP_HAS(bg_ptr, TALERT)) return -ENOTSUPP; tsr = bg_ptr->conf->sensors[id].registers; temp = omap_bandgap_readl(bg_ptr, tsr->bgap_threshold); temp = (temp & tsr->threshold_tcold_mask) >> __ffs(tsr->threshold_tcold_mask); ret |= adc_to_temp_conversion(bg_ptr, id, temp, &temp); if (ret) return -EIO; *tcold = temp; return 0; }
/** * omap_bandgap_get_sensor_data() - helper function to get thermal * framework related data. * @bg_ptr - pointer to bandgap instance * @id - sensor id * * returns data stored by set function with sensor id on success or NULL */ void *omap_bandgap_get_sensor_data(struct omap_bandgap *bg_ptr, int id) { int ret = omap_bandgap_validate(bg_ptr, id); if (ret) return ERR_PTR(ret); return bg_ptr->conf->sensors[id].data; }
/** * omap_bandgap_set_sensor_data() - helper function to store thermal * framework related data. * @bg_ptr - pointer to bandgap instance * @id - sensor id * @data - thermal framework related data to be stored * * returns 0 on success or the proper error code */ int omap_bandgap_set_sensor_data(struct omap_bandgap *bg_ptr, int id, void *data) { int ret = omap_bandgap_validate(bg_ptr, id); if (ret) return ret; bg_ptr->conf->sensors[id].data = data; return 0; }
/** * omap_bandgap_write_update_interval() - set the update interval * @bg_ptr - pointer to bandgap instance * @id - sensor id * @interval - desired update interval in miliseconds * * returns 0 on success or the proper error code */ int omap_bandgap_write_update_interval(struct omap_bandgap *bg_ptr, int id, u32 interval) { int ret = omap_bandgap_validate(bg_ptr, id); if (ret) return ret; if (!OMAP_BANDGAP_HAS(bg_ptr, COUNTER)) return -ENOTSUPP; interval = interval * bg_ptr->clk_rate / 1000; mutex_lock(&bg_ptr->bg_mutex); configure_temp_sensor_counter(bg_ptr, id, interval); mutex_unlock(&bg_ptr->bg_mutex); return 0; }
/** * omap_bandgap_read_temperature() - report current temperature * @bg_ptr - pointer to bandgap instance * @id - sensor id * @temperature - resulting temperature * * returns 0 on success or the proper error code */ int omap_bandgap_read_temperature(struct omap_bandgap *bg_ptr, int id, int *temperature) { struct temp_sensor_registers *tsr; u32 temp; int ret; ret = omap_bandgap_validate(bg_ptr, id); if (ret) return ret; tsr = bg_ptr->conf->sensors[id].registers; temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl); temp &= tsr->bgap_dtemp_mask; ret |= adc_to_temp_conversion(bg_ptr, id, temp, &temp); if (ret) return -EIO; *temperature = temp; return 0; }
/** * omap_bandgap_read_temperature() - report current temperature * @bg_ptr - pointer to bandgap instance * @id - sensor id * @temperature - resulting temperature * * returns 0 on success or the proper error code */ int omap_bandgap_read_temperature(struct omap_bandgap *bg_ptr, int id, int *temperature) { struct temp_sensor_registers *tsr; u32 temp; int ret; ret = omap_bandgap_validate(bg_ptr, id); if (ret) return ret; tsr = bg_ptr->conf->sensors[id].registers; mutex_lock(&bg_ptr->bg_mutex); temp = omap_bandgap_read_temp(bg_ptr, id); mutex_unlock(&bg_ptr->bg_mutex); ret |= adc_to_temp_conversion(bg_ptr, id, temp, &temp); if (ret) return -EIO; *temperature = temp; return 0; }