mxc_epdc_fb: add support for automatically getting updated temperature from pmic
parent
647c624a5e
commit
ed5da916de
|
@ -78,6 +78,7 @@
|
|||
|
||||
#define DEFAULT_TEMP_INDEX 0
|
||||
#define DEFAULT_TEMP 20 /* room temp in deg Celsius */
|
||||
#define DEFAULT_TEMP_AUTO_UPDATE_PERIOD 60 /* 60 seconds */
|
||||
|
||||
#define INIT_UPDATE_MARKER 0x12345678
|
||||
#define PAN_UPDATE_MARKER 0x12345679
|
||||
|
@ -152,6 +153,7 @@ struct mxc_epdc_fb_data {
|
|||
struct regulator *display_regulator;
|
||||
struct regulator *vcom_regulator;
|
||||
struct regulator *v3p3_regulator;
|
||||
struct regulator *tmst_regulator;
|
||||
bool fw_default_load;
|
||||
int rev;
|
||||
|
||||
|
@ -171,6 +173,8 @@ struct mxc_epdc_fb_data {
|
|||
struct update_data_list *cur_update;
|
||||
struct mutex queue_mutex;
|
||||
int trt_entries;
|
||||
int temp_auto_update_period;
|
||||
unsigned long last_time_temp_auto_update;
|
||||
int temp_index;
|
||||
u8 *temp_range_bounds;
|
||||
struct mxcfb_waveform_modes wv_modes;
|
||||
|
@ -1269,7 +1273,6 @@ static void epdc_powerup(struct mxc_epdc_fb_data *fb_data)
|
|||
mutex_unlock(&fb_data->power_mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
fb_data->power_state = POWER_STATE_ON;
|
||||
|
||||
mutex_unlock(&fb_data->power_mutex);
|
||||
|
@ -1909,8 +1912,14 @@ static int mxc_epdc_fb_get_temp_index(struct mxc_epdc_fb_data *fb_data, int temp
|
|||
}
|
||||
|
||||
if (index < 0) {
|
||||
dev_err(fb_data->dev,
|
||||
"No TRT index match...using default temp index\n");
|
||||
if (temp < fb_data->temp_range_bounds[0]) {
|
||||
dev_dbg(fb_data->dev, "temperature < minimum range\n");
|
||||
return 0;
|
||||
}
|
||||
if (temp >= fb_data->temp_range_bounds[fb_data->trt_entries-1]) {
|
||||
dev_dbg(fb_data->dev, "temperature >= maximum range\n");
|
||||
return fb_data->trt_entries-1;
|
||||
}
|
||||
return DEFAULT_TEMP_INDEX;
|
||||
}
|
||||
|
||||
|
@ -1919,6 +1928,29 @@ static int mxc_epdc_fb_get_temp_index(struct mxc_epdc_fb_data *fb_data, int temp
|
|||
return index;
|
||||
}
|
||||
|
||||
int mxc_epdc_fb_read_temperature(struct mxc_epdc_fb_data *fb_data)
|
||||
{
|
||||
unsigned long now;
|
||||
int temperature;
|
||||
|
||||
/* Check if we need to auto update the temperature in regulate basis */
|
||||
if (!IS_ERR(fb_data->tmst_regulator) &&
|
||||
fb_data->temp_auto_update_period != FB_TEMP_AUTO_UPDATE_DISABLE) {
|
||||
now = get_seconds();
|
||||
if ((now - fb_data->last_time_temp_auto_update) >
|
||||
fb_data->temp_auto_update_period) {
|
||||
temperature = regulator_get_voltage(fb_data->tmst_regulator);
|
||||
dev_dbg(fb_data->dev, "auto temperature reading = %d\n", temperature);
|
||||
|
||||
if (temperature != 0xFF) {
|
||||
fb_data->last_time_temp_auto_update = now;
|
||||
fb_data->temp_index = mxc_epdc_fb_get_temp_index(fb_data, temperature);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mxc_epdc_fb_set_temperature(int temperature, struct fb_info *info)
|
||||
{
|
||||
struct mxc_epdc_fb_data *fb_data = info ?
|
||||
|
@ -1933,6 +1965,16 @@ int mxc_epdc_fb_set_temperature(int temperature, struct fb_info *info)
|
|||
}
|
||||
EXPORT_SYMBOL(mxc_epdc_fb_set_temperature);
|
||||
|
||||
int mxc_epdc_fb_set_temp_auto_update_period(int period, struct fb_info *info)
|
||||
{
|
||||
struct mxc_epdc_fb_data *fb_data = info ?
|
||||
(struct mxc_epdc_fb_data *)info:g_fb_data;
|
||||
|
||||
fb_data->temp_auto_update_period = period;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mxc_epdc_fb_set_auto_update(u32 auto_mode, struct fb_info *info)
|
||||
{
|
||||
struct mxc_epdc_fb_data *fb_data = info ?
|
||||
|
@ -2652,6 +2694,9 @@ static void epdc_submit_work_func(struct work_struct *work)
|
|||
&upd_data_list->update_desc->upd_data.update_region,
|
||||
&adj_update_region);
|
||||
|
||||
/* Check if auto temperature update is needed */
|
||||
mxc_epdc_fb_read_temperature(fb_data);
|
||||
|
||||
/*
|
||||
* Is the working buffer idle?
|
||||
* If the working buffer is busy, we must wait for the resource
|
||||
|
@ -3039,6 +3084,9 @@ static int mxc_epdc_fb_send_single_update(struct mxcfb_update_data *upd_data,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Check if auto temperature update is needed */
|
||||
mxc_epdc_fb_read_temperature(fb_data);
|
||||
|
||||
/* Pass selected waveform mode back to user */
|
||||
upd_data->waveform_mode = upd_desc->upd_data.waveform_mode;
|
||||
|
||||
|
@ -3294,6 +3342,14 @@ static int mxc_epdc_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
info);
|
||||
break;
|
||||
}
|
||||
case MXCFB_SET_TEMP_AUTO_UPDATE_PERIOD:
|
||||
{
|
||||
int period;
|
||||
if (!get_user(period, (int32_t __user *) arg))
|
||||
ret = mxc_epdc_fb_set_temp_auto_update_period(period,
|
||||
info);
|
||||
break;
|
||||
}
|
||||
case MXCFB_SET_AUTO_UPDATE_MODE:
|
||||
{
|
||||
u32 auto_mode = 0;
|
||||
|
@ -4356,6 +4412,9 @@ static void mxc_epdc_fb_fw_handler(const struct firmware *fw,
|
|||
/* Set default temperature index using TRT and room temp */
|
||||
fb_data->temp_index = mxc_epdc_fb_get_temp_index(fb_data, DEFAULT_TEMP);
|
||||
|
||||
/* Set default temperature auto update period */
|
||||
fb_data->temp_auto_update_period = DEFAULT_TEMP_AUTO_UPDATE_PERIOD;
|
||||
|
||||
/* Get offset and size for waveform data */
|
||||
wv_data_offs = sizeof(wv_file->wdh) + fb_data->trt_entries + 1;
|
||||
fb_data->waveform_buffer_size = fw->size - wv_data_offs;
|
||||
|
@ -4934,6 +4993,12 @@ int mxc_epdc_fb_probe(struct platform_device *pdev)
|
|||
goto out_dma_work_buf;
|
||||
}
|
||||
|
||||
fb_data->tmst_regulator = devm_regulator_get(&pdev->dev, "TMST");
|
||||
if (IS_ERR(fb_data->tmst_regulator)) {
|
||||
dev_info(&pdev->dev, "Unable to get TMST regulator."
|
||||
"err = 0x%x\n", (int)fb_data->tmst_regulator);
|
||||
}
|
||||
|
||||
if (device_create_file(info->dev, &fb_attrs[0]))
|
||||
dev_err(&pdev->dev, "Unable to create file from fb_attrs\n");
|
||||
|
||||
|
|
Loading…
Reference in New Issue