1
0
Fork 0

mxc_epdc_fb: add support for automatically getting updated temperature from pmic

pull/1/head
Martin T. H. Sandsmark 2017-05-18 10:02:30 +02:00
parent 647c624a5e
commit ed5da916de
1 changed files with 68 additions and 3 deletions

View File

@ -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");