mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	drm/fsl-dcu: enable pixel clock when enabling CRTC
The pixel clock should not be on if the CRTC is not in use, hence move clock enable/disable calls into CRTC callbacks. Signed-off-by: Stefan Agner <stefan@agner.ch> Tested-By: Meng Yi <meng.yi@nxp.com>
This commit is contained in:
		
							parent
							
								
									9789037695
								
							
						
					
					
						commit
						0a70c998d0
					
				
					 2 changed files with 3 additions and 20 deletions
				
			
		| 
						 | 
					@ -51,6 +51,7 @@ static void fsl_dcu_drm_disable_crtc(struct drm_crtc *crtc)
 | 
				
			||||||
			   DCU_MODE_DCU_MODE(DCU_MODE_OFF));
 | 
								   DCU_MODE_DCU_MODE(DCU_MODE_OFF));
 | 
				
			||||||
	regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,
 | 
						regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,
 | 
				
			||||||
		     DCU_UPDATE_MODE_READREG);
 | 
							     DCU_UPDATE_MODE_READREG);
 | 
				
			||||||
 | 
						clk_disable_unprepare(fsl_dev->pix_clk);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void fsl_dcu_drm_crtc_enable(struct drm_crtc *crtc)
 | 
					static void fsl_dcu_drm_crtc_enable(struct drm_crtc *crtc)
 | 
				
			||||||
| 
						 | 
					@ -58,6 +59,7 @@ static void fsl_dcu_drm_crtc_enable(struct drm_crtc *crtc)
 | 
				
			||||||
	struct drm_device *dev = crtc->dev;
 | 
						struct drm_device *dev = crtc->dev;
 | 
				
			||||||
	struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
 | 
						struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clk_prepare_enable(fsl_dev->pix_clk);
 | 
				
			||||||
	regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE,
 | 
						regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE,
 | 
				
			||||||
			   DCU_MODE_DCU_MODE_MASK,
 | 
								   DCU_MODE_DCU_MODE_MASK,
 | 
				
			||||||
			   DCU_MODE_DCU_MODE(DCU_MODE_NORMAL));
 | 
								   DCU_MODE_DCU_MODE(DCU_MODE_NORMAL));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -267,12 +267,6 @@ static int fsl_dcu_drm_pm_resume(struct device *dev)
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = clk_prepare_enable(fsl_dev->pix_clk);
 | 
					 | 
				
			||||||
	if (ret < 0) {
 | 
					 | 
				
			||||||
		dev_err(dev, "failed to enable pix clk\n");
 | 
					 | 
				
			||||||
		goto disable_dcu_clk;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (fsl_dev->tcon)
 | 
						if (fsl_dev->tcon)
 | 
				
			||||||
		fsl_tcon_bypass_enable(fsl_dev->tcon);
 | 
							fsl_tcon_bypass_enable(fsl_dev->tcon);
 | 
				
			||||||
	fsl_dcu_drm_init_planes(fsl_dev->drm);
 | 
						fsl_dcu_drm_init_planes(fsl_dev->drm);
 | 
				
			||||||
| 
						 | 
					@ -286,10 +280,6 @@ static int fsl_dcu_drm_pm_resume(struct device *dev)
 | 
				
			||||||
	enable_irq(fsl_dev->irq);
 | 
						enable_irq(fsl_dev->irq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					 | 
				
			||||||
disable_dcu_clk:
 | 
					 | 
				
			||||||
	clk_disable_unprepare(fsl_dev->clk);
 | 
					 | 
				
			||||||
	return ret;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -403,18 +393,12 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
 | 
				
			||||||
		goto disable_clk;
 | 
							goto disable_clk;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = clk_prepare_enable(fsl_dev->pix_clk);
 | 
					 | 
				
			||||||
	if (ret < 0) {
 | 
					 | 
				
			||||||
		dev_err(dev, "failed to enable pix clk\n");
 | 
					 | 
				
			||||||
		goto unregister_pix_clk;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fsl_dev->tcon = fsl_tcon_init(dev);
 | 
						fsl_dev->tcon = fsl_tcon_init(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	drm = drm_dev_alloc(driver, dev);
 | 
						drm = drm_dev_alloc(driver, dev);
 | 
				
			||||||
	if (IS_ERR(drm)) {
 | 
						if (IS_ERR(drm)) {
 | 
				
			||||||
		ret = PTR_ERR(drm);
 | 
							ret = PTR_ERR(drm);
 | 
				
			||||||
		goto disable_pix_clk;
 | 
							goto unregister_pix_clk;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fsl_dev->dev = dev;
 | 
						fsl_dev->dev = dev;
 | 
				
			||||||
| 
						 | 
					@ -435,8 +419,6 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unref:
 | 
					unref:
 | 
				
			||||||
	drm_dev_unref(drm);
 | 
						drm_dev_unref(drm);
 | 
				
			||||||
disable_pix_clk:
 | 
					 | 
				
			||||||
	clk_disable_unprepare(fsl_dev->pix_clk);
 | 
					 | 
				
			||||||
unregister_pix_clk:
 | 
					unregister_pix_clk:
 | 
				
			||||||
	clk_unregister(fsl_dev->pix_clk);
 | 
						clk_unregister(fsl_dev->pix_clk);
 | 
				
			||||||
disable_clk:
 | 
					disable_clk:
 | 
				
			||||||
| 
						 | 
					@ -449,7 +431,6 @@ static int fsl_dcu_drm_remove(struct platform_device *pdev)
 | 
				
			||||||
	struct fsl_dcu_drm_device *fsl_dev = platform_get_drvdata(pdev);
 | 
						struct fsl_dcu_drm_device *fsl_dev = platform_get_drvdata(pdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clk_disable_unprepare(fsl_dev->clk);
 | 
						clk_disable_unprepare(fsl_dev->clk);
 | 
				
			||||||
	clk_disable_unprepare(fsl_dev->pix_clk);
 | 
					 | 
				
			||||||
	clk_unregister(fsl_dev->pix_clk);
 | 
						clk_unregister(fsl_dev->pix_clk);
 | 
				
			||||||
	drm_put_dev(fsl_dev->drm);
 | 
						drm_put_dev(fsl_dev->drm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue