diff options
Diffstat (limited to 'drivers/gpu/drm/shmobile')
| -rw-r--r-- | drivers/gpu/drm/shmobile/Kconfig | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/shmobile/shmob_drm_crtc.c | 43 | ||||
| -rw-r--r-- | drivers/gpu/drm/shmobile/shmob_drm_drv.c | 6 | 
3 files changed, 31 insertions, 23 deletions
diff --git a/drivers/gpu/drm/shmobile/Kconfig b/drivers/gpu/drm/shmobile/Kconfig index ca498d151a7..a50fe0eeaa0 100644 --- a/drivers/gpu/drm/shmobile/Kconfig +++ b/drivers/gpu/drm/shmobile/Kconfig @@ -1,7 +1,10 @@  config DRM_SHMOBILE  	tristate "DRM Support for SH Mobile" -	depends on DRM && (ARM || SUPERH) +	depends on DRM && ARM +	depends on ARCH_SHMOBILE || COMPILE_TEST +	select BACKLIGHT_CLASS_DEVICE  	select DRM_KMS_HELPER +	select DRM_KMS_FB_HELPER  	select DRM_KMS_CMA_HELPER  	select DRM_GEM_CMA_HELPER  	help diff --git a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c index 54bad98e947..faf176b2daf 100644 --- a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c +++ b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c @@ -37,14 +37,21 @@   * Clock management   */ -static void shmob_drm_clk_on(struct shmob_drm_device *sdev) +static int shmob_drm_clk_on(struct shmob_drm_device *sdev)  { -	if (sdev->clock) -		clk_enable(sdev->clock); +	int ret; + +	if (sdev->clock) { +		ret = clk_prepare_enable(sdev->clock); +		if (ret < 0) +			return ret; +	}  #if 0  	if (sdev->meram_dev && sdev->meram_dev->pdev)  		pm_runtime_get_sync(&sdev->meram_dev->pdev->dev);  #endif + +	return 0;  }  static void shmob_drm_clk_off(struct shmob_drm_device *sdev) @@ -54,7 +61,7 @@ static void shmob_drm_clk_off(struct shmob_drm_device *sdev)  		pm_runtime_put_sync(&sdev->meram_dev->pdev->dev);  #endif  	if (sdev->clock) -		clk_disable(sdev->clock); +		clk_disable_unprepare(sdev->clock);  }  /* ----------------------------------------------------------------------------- @@ -161,16 +168,19 @@ static void shmob_drm_crtc_start(struct shmob_drm_crtc *scrtc)  	struct drm_device *dev = sdev->ddev;  	struct drm_plane *plane;  	u32 value; +	int ret;  	if (scrtc->started)  		return; -	format = shmob_drm_format_info(crtc->fb->pixel_format); +	format = shmob_drm_format_info(crtc->primary->fb->pixel_format);  	if (WARN_ON(format == NULL))  		return;  	/* Enable clocks before accessing the hardware. */ -	shmob_drm_clk_on(sdev); +	ret = shmob_drm_clk_on(sdev); +	if (ret < 0) +		return;  	/* Reset and enable the LCDC. */  	lcdc_write(sdev, LDCNT2R, lcdc_read(sdev, LDCNT2R) | LDCNT2R_BR); @@ -237,7 +247,7 @@ static void shmob_drm_crtc_start(struct shmob_drm_crtc *scrtc)  	lcdc_write(sdev, LDDDSR, value);  	/* Setup planes. */ -	list_for_each_entry(plane, &dev->mode_config.plane_list, head) { +	drm_for_each_legacy_plane(plane, &dev->mode_config.plane_list) {  		if (plane->crtc == crtc)  			shmob_drm_plane_setup(plane);  	} @@ -293,7 +303,7 @@ static void shmob_drm_crtc_compute_base(struct shmob_drm_crtc *scrtc,  					int x, int y)  {  	struct drm_crtc *crtc = &scrtc->crtc; -	struct drm_framebuffer *fb = crtc->fb; +	struct drm_framebuffer *fb = crtc->primary->fb;  	struct shmob_drm_device *sdev = crtc->dev->dev_private;  	struct drm_gem_cma_object *gem;  	unsigned int bpp; @@ -372,15 +382,15 @@ static int shmob_drm_crtc_mode_set(struct drm_crtc *crtc,  	const struct shmob_drm_format_info *format;  	void *cache; -	format = shmob_drm_format_info(crtc->fb->pixel_format); +	format = shmob_drm_format_info(crtc->primary->fb->pixel_format);  	if (format == NULL) {  		dev_dbg(sdev->dev, "mode_set: unsupported format %08x\n", -			crtc->fb->pixel_format); +			crtc->primary->fb->pixel_format);  		return -EINVAL;  	}  	scrtc->format = format; -	scrtc->line_size = crtc->fb->pitches[0]; +	scrtc->line_size = crtc->primary->fb->pitches[0];  	if (sdev->meram) {  		/* Enable MERAM cache if configured. We need to de-init @@ -392,7 +402,7 @@ static int shmob_drm_crtc_mode_set(struct drm_crtc *crtc,  		}  		cache = sh_mobile_meram_cache_alloc(sdev->meram, mdata, -						    crtc->fb->pitches[0], +						    crtc->primary->fb->pitches[0],  						    adjusted_mode->vdisplay,  						    format->meram,  						    &scrtc->line_size); @@ -479,7 +489,7 @@ static int shmob_drm_crtc_page_flip(struct drm_crtc *crtc,  	}  	spin_unlock_irqrestore(&dev->event_lock, flags); -	crtc->fb = fb; +	crtc->primary->fb = fb;  	shmob_drm_crtc_update_base(scrtc);  	if (event) { @@ -664,12 +674,6 @@ static int shmob_drm_connector_get_modes(struct drm_connector *connector)  	return 1;  } -static int shmob_drm_connector_mode_valid(struct drm_connector *connector, -					  struct drm_display_mode *mode) -{ -	return MODE_OK; -} -  static struct drm_encoder *  shmob_drm_connector_best_encoder(struct drm_connector *connector)  { @@ -680,7 +684,6 @@ shmob_drm_connector_best_encoder(struct drm_connector *connector)  static const struct drm_connector_helper_funcs connector_helper_funcs = {  	.get_modes = shmob_drm_connector_get_modes, -	.mode_valid = shmob_drm_connector_mode_valid,  	.best_encoder = shmob_drm_connector_best_encoder,  }; diff --git a/drivers/gpu/drm/shmobile/shmob_drm_drv.c b/drivers/gpu/drm/shmobile/shmob_drm_drv.c index 015551866b4..82c84c7fd4f 100644 --- a/drivers/gpu/drm/shmobile/shmob_drm_drv.c +++ b/drivers/gpu/drm/shmobile/shmob_drm_drv.c @@ -185,7 +185,7 @@ static int shmob_drm_load(struct drm_device *dev, unsigned long flags)  		goto done;  	} -	ret = drm_irq_install(dev); +	ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));  	if (ret < 0) {  		dev_err(&pdev->dev, "failed to install IRQ handler\n");  		goto done; @@ -336,7 +336,9 @@ static int shmob_drm_probe(struct platform_device *pdev)  static int shmob_drm_remove(struct platform_device *pdev)  { -	drm_platform_exit(&shmob_drm_driver, pdev); +	struct shmob_drm_device *sdev = platform_get_drvdata(pdev); + +	drm_put_dev(sdev->ddev);  	return 0;  }  | 
