Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca10d8a3 authored by Ajay Singh Parmar's avatar Ajay Singh Parmar Committed by Stephen Boyd
Browse files

msm_fb: hdmi: Boot param support for resolution change



Boot param support for dynamic resolution change for HDMI
as primary case like MPQ. With this change, MPQ can also
be configured for different resolutions than the default
1080p@60Hz using boot parameters.

CRs-Fixed: 373211
Change-Id: I2c8537724ddd1ece7e81e6022afb9315c5147aa2
Signed-off-by: default avatarAjay Singh Parmar <aparmar@codeaurora.org>
parent 3ead0b72
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1045,7 +1045,8 @@ static void set_mdp_clocks_for_wuxga(void)
	}
}

void __init apq8064_set_display_params(char *prim_panel, char *ext_panel)
void __init apq8064_set_display_params(char *prim_panel, char *ext_panel,
		unsigned char resolution)
{
	/*
	 * For certain MPQ boards, HDMI should be set as primary display
@@ -1080,4 +1081,6 @@ void __init apq8064_set_display_params(char *prim_panel, char *ext_panel)
		pr_debug("msm_fb_pdata.ext_panel_name %s\n",
			msm_fb_pdata.ext_panel_name);
	}

	msm_fb_pdata.ext_resolution = resolution;
}
+13 −1
Original line number Diff line number Diff line
@@ -657,6 +657,9 @@ static int apq8064_change_memory_power(u64 start, u64 size,

static char prim_panel_name[PANEL_NAME_MAX_LEN];
static char ext_panel_name[PANEL_NAME_MAX_LEN];

static int ext_resolution;

static int __init prim_display_setup(char *param)
{
	if (strnlen(param, PANEL_NAME_MAX_LEN))
@@ -673,9 +676,18 @@ static int __init ext_display_setup(char *param)
}
early_param("ext_display", ext_display_setup);

static int __init hdmi_resulution_setup(char *param)
{
	int ret;
	ret = kstrtoint(param, 10, &ext_resolution);
	return ret;
}
early_param("ext_resolution", hdmi_resulution_setup);

static void __init apq8064_reserve(void)
{
	apq8064_set_display_params(prim_panel_name, ext_panel_name);
	apq8064_set_display_params(prim_panel_name, ext_panel_name,
		ext_resolution);
	msm_reserve();
	if (apq8064_fmem_pdata.size) {
#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION)
+2 −1
Original line number Diff line number Diff line
@@ -87,7 +87,8 @@ unsigned char apq8064_hdmi_as_primary_selected(void);
void apq8064_init_fb(void);
void apq8064_allocate_fb_region(void);
void apq8064_mdp_writeback(struct memtype_reserve *reserve_table);
void __init apq8064_set_display_params(char *prim_panel, char *ext_panel);
void __init apq8064_set_display_params(char *prim_panel, char *ext_panel,
		unsigned char resolution);

void apq8064_init_gpu(void);
void apq8064_pm8xxx_gpio_mpp_init(void);
+1 −0
Original line number Diff line number Diff line
@@ -475,6 +475,7 @@ struct msm_wfd_platform_data {
struct msm_fb_platform_data {
	int (*detect_client)(const char *name);
	int mddi_prescan;
	unsigned char ext_resolution;
	int (*allow_set_offset)(void);
	char prim_panel_name[PANEL_NAME_MAX_LEN];
	char ext_panel_name[PANEL_NAME_MAX_LEN];
+24 −4
Original line number Diff line number Diff line
@@ -1974,13 +1974,15 @@ EXPORT_SYMBOL(hdmi_common_read_edid);

bool hdmi_common_get_video_format_from_drv_data(struct msm_fb_data_type *mfd)
{
	uint32 format;
	uint32 format = HDMI_VFRMT_1920x1080p60_16_9;
	struct fb_var_screeninfo *var = &mfd->fbi->var;
	bool changed = TRUE;

	if (var->reserved[2]) {
		format = var->reserved[2]-1;
		DEV_DBG("reserved format is %d\n", format);
	} else if (hdmi_prim_resolution) {
		format = hdmi_prim_resolution - 1;
	} else {
		DEV_DBG("detecting resolution from %dx%d use var->reserved[3]"
			" to specify mode", mfd->var_xres, mfd->var_yres);
@@ -1995,15 +1997,33 @@ bool hdmi_common_get_video_format_from_drv_data(struct msm_fb_data_type *mfd)
				: HDMI_VFRMT_720x576p50_16_9;
			break;
		case 1280:
			if (mfd->var_frame_rate == 50000)
				format = HDMI_VFRMT_1280x720p50_16_9;
			else
				format = HDMI_VFRMT_1280x720p60_16_9;
			break;
		case 1440:
			format = (mfd->var_yres == 480)
			format = (mfd->var_yres == 240) /* interlaced has half
							   of y res.
							*/
				? HDMI_VFRMT_1440x480i60_16_9
				: HDMI_VFRMT_1440x576i50_16_9;
			break;
		case 1920:
			if (mfd->var_yres == 540) {/* interlaced */
				format = HDMI_VFRMT_1920x1080i60_16_9;
			} else if (mfd->var_yres == 1080) {
				if (mfd->var_frame_rate == 50000)
					format = HDMI_VFRMT_1920x1080p50_16_9;
				else if (mfd->var_frame_rate == 24000)
					format = HDMI_VFRMT_1920x1080p24_16_9;
				else if (mfd->var_frame_rate == 25000)
					format = HDMI_VFRMT_1920x1080p25_16_9;
				else if (mfd->var_frame_rate == 30000)
					format = HDMI_VFRMT_1920x1080p30_16_9;
				else
					format = HDMI_VFRMT_1920x1080p60_16_9;
			}
			break;
		}
	}
Loading