diff options
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_connector.c')
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_connector.c | 92 | 
1 files changed, 23 insertions, 69 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c index e082efb2fec..9a16dbe121d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c @@ -23,27 +23,20 @@  				drm_connector)  struct exynos_drm_connector { -	struct drm_connector	drm_connector; -	uint32_t		encoder_id; -	struct exynos_drm_manager *manager; -	uint32_t		dpms; +	struct drm_connector		drm_connector; +	uint32_t			encoder_id; +	struct exynos_drm_display	*display;  };  static int exynos_drm_connector_get_modes(struct drm_connector *connector)  {  	struct exynos_drm_connector *exynos_connector =  					to_exynos_connector(connector); -	struct exynos_drm_manager *manager = exynos_connector->manager; -	struct exynos_drm_display_ops *display_ops = manager->display_ops; +	struct exynos_drm_display *display = exynos_connector->display;  	struct edid *edid = NULL;  	unsigned int count = 0;  	int ret; -	if (!display_ops) { -		DRM_DEBUG_KMS("display_ops is null.\n"); -		return 0; -	} -  	/*  	 * if get_edid() exists then get_edid() callback of hdmi side  	 * is called to get edid data through i2c interface else @@ -52,8 +45,8 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)  	 * P.S. in case of lcd panel, count is always 1 if success  	 * because lcd panel has only one mode.  	 */ -	if (display_ops->get_edid) { -		edid = display_ops->get_edid(manager->dev, connector); +	if (display->ops->get_edid) { +		edid = display->ops->get_edid(display, connector);  		if (IS_ERR_OR_NULL(edid)) {  			ret = PTR_ERR(edid);  			edid = NULL; @@ -76,8 +69,8 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)  			return 0;  		} -		if (display_ops->get_panel) -			panel = display_ops->get_panel(manager->dev); +		if (display->ops->get_panel) +			panel = display->ops->get_panel(display);  		else {  			drm_mode_destroy(connector->dev, mode);  			return 0; @@ -106,20 +99,20 @@ static int exynos_drm_connector_mode_valid(struct drm_connector *connector,  {  	struct exynos_drm_connector *exynos_connector =  					to_exynos_connector(connector); -	struct exynos_drm_manager *manager = exynos_connector->manager; -	struct exynos_drm_display_ops *display_ops = manager->display_ops; +	struct exynos_drm_display *display = exynos_connector->display;  	int ret = MODE_BAD;  	DRM_DEBUG_KMS("%s\n", __FILE__); -	if (display_ops && display_ops->check_mode) -		if (!display_ops->check_mode(manager->dev, mode)) +	if (display->ops->check_mode) +		if (!display->ops->check_mode(display, mode))  			ret = MODE_OK;  	return ret;  } -struct drm_encoder *exynos_drm_best_encoder(struct drm_connector *connector) +static struct drm_encoder *exynos_drm_best_encoder( +		struct drm_connector *connector)  {  	struct drm_device *dev = connector->dev;  	struct exynos_drm_connector *exynos_connector = @@ -146,48 +139,12 @@ static struct drm_connector_helper_funcs exynos_connector_helper_funcs = {  	.best_encoder	= exynos_drm_best_encoder,  }; -void exynos_drm_display_power(struct drm_connector *connector, int mode) -{ -	struct drm_encoder *encoder = exynos_drm_best_encoder(connector); -	struct exynos_drm_connector *exynos_connector; -	struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder); -	struct exynos_drm_display_ops *display_ops = manager->display_ops; - -	exynos_connector = to_exynos_connector(connector); - -	if (exynos_connector->dpms == mode) { -		DRM_DEBUG_KMS("desired dpms mode is same as previous one.\n"); -		return; -	} - -	if (display_ops && display_ops->power_on) -		display_ops->power_on(manager->dev, mode); - -	exynos_connector->dpms = mode; -} - -static void exynos_drm_connector_dpms(struct drm_connector *connector, -					int mode) -{ -	/* -	 * in case that drm_crtc_helper_set_mode() is called, -	 * encoder/crtc->funcs->dpms() will be just returned -	 * because they already were DRM_MODE_DPMS_ON so only -	 * exynos_drm_display_power() will be called. -	 */ -	drm_helper_connector_dpms(connector, mode); - -	exynos_drm_display_power(connector, mode); - -} -  static int exynos_drm_connector_fill_modes(struct drm_connector *connector,  				unsigned int max_width, unsigned int max_height)  {  	struct exynos_drm_connector *exynos_connector =  					to_exynos_connector(connector); -	struct exynos_drm_manager *manager = exynos_connector->manager; -	struct exynos_drm_manager_ops *ops = manager->ops; +	struct exynos_drm_display *display = exynos_connector->display;  	unsigned int width, height;  	width = max_width; @@ -197,8 +154,8 @@ static int exynos_drm_connector_fill_modes(struct drm_connector *connector,  	 * if specific driver want to find desired_mode using maxmum  	 * resolution then get max width and height from that driver.  	 */ -	if (ops && ops->get_max_resol) -		ops->get_max_resol(manager->dev, &width, &height); +	if (display->ops->get_max_resol) +		display->ops->get_max_resol(display, &width, &height);  	return drm_helper_probe_single_connector_modes(connector, width,  							height); @@ -210,13 +167,11 @@ exynos_drm_connector_detect(struct drm_connector *connector, bool force)  {  	struct exynos_drm_connector *exynos_connector =  					to_exynos_connector(connector); -	struct exynos_drm_manager *manager = exynos_connector->manager; -	struct exynos_drm_display_ops *display_ops = -					manager->display_ops; +	struct exynos_drm_display *display = exynos_connector->display;  	enum drm_connector_status status = connector_status_disconnected; -	if (display_ops && display_ops->is_connected) { -		if (display_ops->is_connected(manager->dev)) +	if (display->ops->is_connected) { +		if (display->ops->is_connected(display))  			status = connector_status_connected;  		else  			status = connector_status_disconnected; @@ -236,7 +191,7 @@ static void exynos_drm_connector_destroy(struct drm_connector *connector)  }  static struct drm_connector_funcs exynos_connector_funcs = { -	.dpms		= exynos_drm_connector_dpms, +	.dpms		= drm_helper_connector_dpms,  	.fill_modes	= exynos_drm_connector_fill_modes,  	.detect		= exynos_drm_connector_detect,  	.destroy	= exynos_drm_connector_destroy, @@ -246,7 +201,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,  						   struct drm_encoder *encoder)  {  	struct exynos_drm_connector *exynos_connector; -	struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder); +	struct exynos_drm_display *display = exynos_drm_get_display(encoder);  	struct drm_connector *connector;  	int type;  	int err; @@ -257,7 +212,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,  	connector = &exynos_connector->drm_connector; -	switch (manager->display_ops->type) { +	switch (display->type) {  	case EXYNOS_DISPLAY_TYPE_HDMI:  		type = DRM_MODE_CONNECTOR_HDMIA;  		connector->interlace_allowed = true; @@ -280,8 +235,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,  		goto err_connector;  	exynos_connector->encoder_id = encoder->base.id; -	exynos_connector->manager = manager; -	exynos_connector->dpms = DRM_MODE_DPMS_OFF; +	exynos_connector->display = display;  	connector->dpms = DRM_MODE_DPMS_OFF;  	connector->encoder = encoder;  | 
