diff options
Diffstat (limited to 'drivers/gpu/drm/panel/panel-orisetech-otm8009a.c')
| -rw-r--r-- | drivers/gpu/drm/panel/panel-orisetech-otm8009a.c | 85 | 
1 files changed, 56 insertions, 29 deletions
| diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c index f80b44a8a700..dfb43b1374e7 100644 --- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c +++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c @@ -60,6 +60,9 @@  #define MCS_CMD2_ENA1	0xFF00	/* Enable Access Command2 "CMD2" */  #define MCS_CMD2_ENA2	0xFF80	/* Enable Access Orise Command2 */ +#define OTM8009A_HDISPLAY	480 +#define OTM8009A_VDISPLAY	800 +  struct otm8009a {  	struct device *dev;  	struct drm_panel panel; @@ -70,19 +73,35 @@ struct otm8009a {  	bool enabled;  }; -static const struct drm_display_mode default_mode = { -	.clock = 29700, -	.hdisplay = 480, -	.hsync_start = 480 + 98, -	.hsync_end = 480 + 98 + 32, -	.htotal = 480 + 98 + 32 + 98, -	.vdisplay = 800, -	.vsync_start = 800 + 15, -	.vsync_end = 800 + 15 + 10, -	.vtotal = 800 + 15 + 10 + 14, -	.flags = 0, -	.width_mm = 52, -	.height_mm = 86, +static const struct drm_display_mode modes[] = { +	{ /* 50 Hz, preferred */ +		.clock = 29700, +		.hdisplay = 480, +		.hsync_start = 480 + 98, +		.hsync_end = 480 + 98 + 32, +		.htotal = 480 + 98 + 32 + 98, +		.vdisplay = 800, +		.vsync_start = 800 + 15, +		.vsync_end = 800 + 15 + 10, +		.vtotal = 800 + 15 + 10 + 14, +		.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, +		.width_mm = 52, +		.height_mm = 86, +	}, +	{ /* 60 Hz */ +		.clock = 33000, +		.hdisplay = 480, +		.hsync_start = 480 + 70, +		.hsync_end = 480 + 70 + 32, +		.htotal = 480 + 70 + 32 + 72, +		.vdisplay = 800, +		.vsync_start = 800 + 15, +		.vsync_end = 800 + 15 + 10, +		.vtotal = 800 + 15 + 10 + 16, +		.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, +		.width_mm = 52, +		.height_mm = 86, +	},  };  static inline struct otm8009a *panel_to_otm8009a(struct drm_panel *panel) @@ -208,12 +227,11 @@ static int otm8009a_init_sequence(struct otm8009a *ctx)  	/* Default portrait 480x800 rgb24 */  	dcs_write_seq(ctx, MIPI_DCS_SET_ADDRESS_MODE, 0x00); -	ret = mipi_dsi_dcs_set_column_address(dsi, 0, -					      default_mode.hdisplay - 1); +	ret = mipi_dsi_dcs_set_column_address(dsi, 0, OTM8009A_HDISPLAY - 1);  	if (ret)  		return ret; -	ret = mipi_dsi_dcs_set_page_address(dsi, 0, default_mode.vdisplay - 1); +	ret = mipi_dsi_dcs_set_page_address(dsi, 0, OTM8009A_VDISPLAY - 1);  	if (ret)  		return ret; @@ -337,24 +355,33 @@ static int otm8009a_get_modes(struct drm_panel *panel,  			      struct drm_connector *connector)  {  	struct drm_display_mode *mode; - -	mode = drm_mode_duplicate(connector->dev, &default_mode); -	if (!mode) { -		dev_err(panel->dev, "failed to add mode %ux%u@%u\n", -			default_mode.hdisplay, default_mode.vdisplay, -			drm_mode_vrefresh(&default_mode)); -		return -ENOMEM; +	unsigned int num_modes = ARRAY_SIZE(modes); +	unsigned int i; + +	for (i = 0; i < num_modes; i++) { +		mode = drm_mode_duplicate(connector->dev, &modes[i]); +		if (!mode) { +			dev_err(panel->dev, "failed to add mode %ux%u@%u\n", +				modes[i].hdisplay, +				modes[i].vdisplay, +				drm_mode_vrefresh(&modes[i])); +			return -ENOMEM; +		} + +		mode->type = DRM_MODE_TYPE_DRIVER; + +		/* Setting first mode as preferred */ +		if (!i) +			mode->type |=  DRM_MODE_TYPE_PREFERRED; + +		drm_mode_set_name(mode); +		drm_mode_probed_add(connector, mode);  	} -	drm_mode_set_name(mode); - -	mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; -	drm_mode_probed_add(connector, mode); -  	connector->display_info.width_mm = mode->width_mm;  	connector->display_info.height_mm = mode->height_mm; -	return 1; +	return num_modes;  }  static const struct drm_panel_funcs otm8009a_drm_funcs = { |