return 0;
}
+static u32 omap_bandgap_read_temp(struct omap_bandgap *bg_ptr, int id)
+{
+ struct temp_sensor_registers *tsr;
+ u32 temp, ctrl, reg;
+
+ tsr = bg_ptr->conf->sensors[id].registers;
+ reg = tsr->temp_sensor_ctrl;
+
+ if (OMAP_BANDGAP_HAS(bg_ptr, FREEZE_BIT)) {
+ ctrl = omap_bandgap_readl(bg_ptr, tsr->bgap_mask_ctrl);
+ ctrl |= tsr->mask_freeze_mask;
+ omap_bandgap_writel(bg_ptr, ctrl, tsr->bgap_mask_ctrl);
+ /*
+ * In case we cannot read from cur_dtemp / dtemp_0,
+ * then we read from the last valid temp read
+ */
+ reg = tsr->ctrl_dtemp_1;
+ }
+
+ /* read temperature */
+ temp = omap_bandgap_readl(bg_ptr, reg);
+ temp &= tsr->bgap_dtemp_mask;
+
+ if (OMAP_BANDGAP_HAS(bg_ptr, FREEZE_BIT)) {
+ ctrl = omap_bandgap_readl(bg_ptr, tsr->bgap_mask_ctrl);
+ ctrl &= ~tsr->mask_freeze_mask;
+ omap_bandgap_writel(bg_ptr, ctrl, tsr->bgap_mask_ctrl);
+ }
+
+ return temp;
+}
+
/* This is the Talert handler. Call it only if HAS(TALERT) is set */
static irqreturn_t talert_irq_handler(int irq, void *data)
{
struct omap_bandgap *bg_ptr = data;
struct temp_sensor_registers *tsr;
- u32 t_hot = 0, t_cold = 0, temp, ctrl;
+ u32 t_hot = 0, t_cold = 0, ctrl;
int i;
bg_ptr = data;
__func__, bg_ptr->conf->sensors[i].domain,
t_hot, t_cold);
- /* read temperature */
- temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl);
- temp &= tsr->bgap_dtemp_mask;
-
/* report temperature to whom may concern */
if (bg_ptr->conf->report_temperature)
bg_ptr->conf->report_temperature(bg_ptr, i);
u32 temp, reg_val;
/* Read the current on die temperature */
- tsr = bg_ptr->conf->sensors[id].registers;
- temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl);
- temp &= tsr->bgap_dtemp_mask;
+ temp = omap_bandgap_read_temp(bg_ptr, id);
+ tsr = bg_ptr->conf->sensors[id].registers;
reg_val = omap_bandgap_readl(bg_ptr, tsr->bgap_mask_ctrl);
+
if (temp < t_hot)
reg_val |= tsr->mask_hot_mask;
else
return ret;
tsr = bg_ptr->conf->sensors[id].registers;
- temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl);
- temp &= tsr->bgap_dtemp_mask;
+ 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)
temp |= 1 << __ffs(tsr->bgap_soc_mask);
omap_bandgap_writel(bg_ptr, temp, tsr->temp_sensor_ctrl);
/* Wait until DTEMP is updated */
- temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl);
- temp &= (tsr->bgap_dtemp_mask);
- while ((temp == 0) && --counter) {
- temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl);
- temp &= (tsr->bgap_dtemp_mask);
- }
+ temp = omap_bandgap_read_temp(bg_ptr, id);
+
+ while ((temp == 0) && --counter)
+ temp = omap_bandgap_read_temp(bg_ptr, id);
+
/* Start of Conversion = 0 */
temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl);
temp &= ~(1 << __ffs(tsr->bgap_soc_mask));