mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 07:01:32 +00:00
Merge branch 'fixes-for-v4.9-rc2' of http://git.agner.ch/git/linux-drm-fsl-dcu into drm-fixes
This are some fixes which I hoped to still get into v4.9. I used to test them here since about 2 weeks and Meng came around to test it on the second platform making use of this IP too, so they are well tested now. * 'fixes-for-v4.9-rc2' of http://git.agner.ch/git/linux-drm-fsl-dcu: drm/fsl-dcu: enable pixel clock when enabling CRTC drm/fsl-dcu: do not transfer registers in mode_set_nofb drm/fsl-dcu: do not transfer registers on plane init drm/fsl-dcu: enable TCON bypass mode by default
This commit is contained in:
commit
961050d728
@ -51,6 +51,7 @@ static void fsl_dcu_drm_disable_crtc(struct drm_crtc *crtc)
|
||||
DCU_MODE_DCU_MODE(DCU_MODE_OFF));
|
||||
regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,
|
||||
DCU_UPDATE_MODE_READREG);
|
||||
clk_disable_unprepare(fsl_dev->pix_clk);
|
||||
}
|
||||
|
||||
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 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,
|
||||
DCU_MODE_DCU_MODE_MASK,
|
||||
DCU_MODE_DCU_MODE(DCU_MODE_NORMAL));
|
||||
@ -116,8 +118,6 @@ static void fsl_dcu_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
|
||||
DCU_THRESHOLD_LS_BF_VS(BF_VS_VAL) |
|
||||
DCU_THRESHOLD_OUT_BUF_HIGH(BUF_MAX_VAL) |
|
||||
DCU_THRESHOLD_OUT_BUF_LOW(BUF_MIN_VAL));
|
||||
regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,
|
||||
DCU_UPDATE_MODE_READREG);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -267,12 +267,8 @@ static int fsl_dcu_drm_pm_resume(struct device *dev)
|
||||
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)
|
||||
fsl_tcon_bypass_enable(fsl_dev->tcon);
|
||||
fsl_dcu_drm_init_planes(fsl_dev->drm);
|
||||
drm_atomic_helper_resume(fsl_dev->drm, fsl_dev->state);
|
||||
|
||||
@ -284,10 +280,6 @@ static int fsl_dcu_drm_pm_resume(struct device *dev)
|
||||
enable_irq(fsl_dev->irq);
|
||||
|
||||
return 0;
|
||||
|
||||
disable_dcu_clk:
|
||||
clk_disable_unprepare(fsl_dev->clk);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -401,18 +393,12 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
|
||||
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);
|
||||
|
||||
drm = drm_dev_alloc(driver, dev);
|
||||
if (IS_ERR(drm)) {
|
||||
ret = PTR_ERR(drm);
|
||||
goto disable_pix_clk;
|
||||
goto unregister_pix_clk;
|
||||
}
|
||||
|
||||
fsl_dev->dev = dev;
|
||||
@ -433,8 +419,6 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
|
||||
|
||||
unref:
|
||||
drm_dev_unref(drm);
|
||||
disable_pix_clk:
|
||||
clk_disable_unprepare(fsl_dev->pix_clk);
|
||||
unregister_pix_clk:
|
||||
clk_unregister(fsl_dev->pix_clk);
|
||||
disable_clk:
|
||||
@ -447,7 +431,6 @@ static int fsl_dcu_drm_remove(struct platform_device *pdev)
|
||||
struct fsl_dcu_drm_device *fsl_dev = platform_get_drvdata(pdev);
|
||||
|
||||
clk_disable_unprepare(fsl_dev->clk);
|
||||
clk_disable_unprepare(fsl_dev->pix_clk);
|
||||
clk_unregister(fsl_dev->pix_clk);
|
||||
drm_put_dev(fsl_dev->drm);
|
||||
|
||||
|
@ -211,11 +211,6 @@ void fsl_dcu_drm_init_planes(struct drm_device *dev)
|
||||
for (j = 1; j <= fsl_dev->soc->layer_regs; j++)
|
||||
regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN(i, j), 0);
|
||||
}
|
||||
regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE,
|
||||
DCU_MODE_DCU_MODE_MASK,
|
||||
DCU_MODE_DCU_MODE(DCU_MODE_OFF));
|
||||
regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,
|
||||
DCU_UPDATE_MODE_READREG);
|
||||
}
|
||||
|
||||
struct drm_plane *fsl_dcu_drm_primary_create_plane(struct drm_device *dev)
|
||||
|
@ -20,38 +20,6 @@
|
||||
#include "fsl_dcu_drm_drv.h"
|
||||
#include "fsl_tcon.h"
|
||||
|
||||
static int
|
||||
fsl_dcu_drm_encoder_atomic_check(struct drm_encoder *encoder,
|
||||
struct drm_crtc_state *crtc_state,
|
||||
struct drm_connector_state *conn_state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void fsl_dcu_drm_encoder_disable(struct drm_encoder *encoder)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
|
||||
|
||||
if (fsl_dev->tcon)
|
||||
fsl_tcon_bypass_disable(fsl_dev->tcon);
|
||||
}
|
||||
|
||||
static void fsl_dcu_drm_encoder_enable(struct drm_encoder *encoder)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
|
||||
|
||||
if (fsl_dev->tcon)
|
||||
fsl_tcon_bypass_enable(fsl_dev->tcon);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_helper_funcs encoder_helper_funcs = {
|
||||
.atomic_check = fsl_dcu_drm_encoder_atomic_check,
|
||||
.disable = fsl_dcu_drm_encoder_disable,
|
||||
.enable = fsl_dcu_drm_encoder_enable,
|
||||
};
|
||||
|
||||
static void fsl_dcu_drm_encoder_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
drm_encoder_cleanup(encoder);
|
||||
@ -68,13 +36,16 @@ int fsl_dcu_drm_encoder_create(struct fsl_dcu_drm_device *fsl_dev,
|
||||
int ret;
|
||||
|
||||
encoder->possible_crtcs = 1;
|
||||
|
||||
/* Use bypass mode for parallel RGB/LVDS encoder */
|
||||
if (fsl_dev->tcon)
|
||||
fsl_tcon_bypass_enable(fsl_dev->tcon);
|
||||
|
||||
ret = drm_encoder_init(fsl_dev->drm, encoder, &encoder_funcs,
|
||||
DRM_MODE_ENCODER_LVDS, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
drm_encoder_helper_add(encoder, &encoder_helper_funcs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user