/* Talert Thot threshold. Call it only if HAS(TALERT) is set */ static int temp_sensor_configure_thot(struct omap_bandgap *bg_ptr, int id, int t_hot) { struct temp_sensor_data *ts_data = bg_ptr->conf->sensors[id].ts_data; struct temp_sensor_registers *tsr; u32 thresh_val, reg_val; int cold, err = 0; tsr = bg_ptr->conf->sensors[id].registers; /* obtain the T cold value */ thresh_val = omap_bandgap_readl(bg_ptr, tsr->bgap_threshold); cold = (thresh_val & tsr->threshold_tcold_mask) >> __ffs(tsr->threshold_tcold_mask); if (t_hot <= cold) { /* change the t_cold to t_hot - 5000 millidegrees */ err |= add_hyst(t_hot, -ts_data->hyst_val, bg_ptr, id, &cold); /* write the new t_cold value */ reg_val = thresh_val & (~tsr->threshold_tcold_mask); reg_val |= cold << __ffs(tsr->threshold_tcold_mask); omap_bandgap_writel(bg_ptr, reg_val, tsr->bgap_threshold); thresh_val = reg_val; } /* write the new t_hot value */ reg_val = thresh_val & ~tsr->threshold_thot_mask; reg_val |= (t_hot << __ffs(tsr->threshold_thot_mask)); omap_bandgap_writel(bg_ptr, reg_val, tsr->bgap_threshold); if (err) { dev_err(bg_ptr->dev, "failed to reprogram thot threshold\n"); return -EIO; } return temp_sensor_unmask_interrupts(bg_ptr, id, t_hot, cold); }
static void temp_sensor_configure_tcold(struct scm *scm_ptr, int id, int t_cold) { int hot, thresh_val; u32 reg_val; struct omap4460plus_temp_sensor_registers *tsr; tsr = scm_ptr->registers[id]; /* obtain the T cold value */ thresh_val = omap4plus_scm_readl(scm_ptr, tsr->bgap_threshold); hot = (thresh_val & tsr->threshold_thot_mask) >> __ffs(tsr->threshold_thot_mask); if (t_cold >= hot) { /* change the t_hot to t_cold + 5000 millidegrees */ hot = add_hyst(t_cold, scm_ptr->ts_data[id]->hyst_val, scm_ptr, id); /* write the new t_hot value */ reg_val = thresh_val & (~tsr->threshold_thot_mask); reg_val |= hot << __ffs(tsr->threshold_thot_mask); omap4plus_scm_writel(scm_ptr, reg_val, tsr->bgap_threshold); thresh_val = reg_val; } /* write the new t_cold value */ reg_val = thresh_val & ~tsr->threshold_tcold_mask; reg_val |= (t_cold << __ffs(tsr->threshold_tcold_mask)); omap4plus_scm_writel(scm_ptr, reg_val, tsr->bgap_threshold); temp_sensor_unmask_interrupts(scm_ptr, id, hot, t_cold); }