projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
drm/rockchip: Use CRTC vblank event interface
[firefly-linux-kernel-4.4.55.git]
/
drivers
/
gpu
/
drm
/
rockchip
/
rockchip_drm_vop.c
diff --git
a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 5d8ae5e49c440f98afda4c02d6aea8e335c78c82..03c47eeadc812ba649e68ad97270d5c512efea86 100644
(file)
--- a/
drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/
drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@
-374,6
+374,7
@@
static const struct of_device_id vop_driver_dt_match[] = {
.data = &rk3288_vop },
{},
};
.data = &rk3288_vop },
{},
};
+MODULE_DEVICE_TABLE(of, vop_driver_dt_match);
static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v)
{
static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v)
{
@@
-959,8
+960,8
@@
static int vop_update_plane_event(struct drm_plane *plane,
val = (dest.y2 - dest.y1 - 1) << 16;
val |= (dest.x2 - dest.x1 - 1) & 0xffff;
VOP_WIN_SET(vop, win, dsp_info, val);
val = (dest.y2 - dest.y1 - 1) << 16;
val |= (dest.x2 - dest.x1 - 1) & 0xffff;
VOP_WIN_SET(vop, win, dsp_info, val);
- val =
(dsp_sty - 1)
<< 16;
- val |=
(dsp_stx - 1)
& 0xffff;
+ val =
dsp_sty
<< 16;
+ val |=
dsp_stx
& 0xffff;
VOP_WIN_SET(vop, win, dsp_st, val);
VOP_WIN_SET(vop, win, rb_swap, rb_swap);
VOP_WIN_SET(vop, win, dsp_st, val);
VOP_WIN_SET(vop, win, rb_swap, rb_swap);
@@
-1289,7
+1290,7
@@
static void vop_win_state_complete(struct vop_win *vop_win,
if (state->event) {
spin_lock_irqsave(&drm->event_lock, flags);
if (state->event) {
spin_lock_irqsave(&drm->event_lock, flags);
- drm_
send_vblank_event(drm, -1
, state->event);
+ drm_
crtc_send_vblank_event(crtc
, state->event);
spin_unlock_irqrestore(&drm->event_lock, flags);
}
spin_unlock_irqrestore(&drm->event_lock, flags);
}
@@
-1575,32
+1576,25
@@
static int vop_initial(struct vop *vop)
return PTR_ERR(vop->dclk);
}
return PTR_ERR(vop->dclk);
}
- ret = clk_prepare(vop->hclk);
- if (ret < 0) {
- dev_err(vop->dev, "failed to prepare hclk\n");
- return ret;
- }
-
ret = clk_prepare(vop->dclk);
if (ret < 0) {
dev_err(vop->dev, "failed to prepare dclk\n");
ret = clk_prepare(vop->dclk);
if (ret < 0) {
dev_err(vop->dev, "failed to prepare dclk\n");
-
goto err_unprepare_hclk
;
+
return ret
;
}
}
- ret = clk_prepare(vop->aclk);
+ /* Enable both the hclk and aclk to setup the vop */
+ ret = clk_prepare_enable(vop->hclk);
if (ret < 0) {
if (ret < 0) {
- dev_err(vop->dev, "failed to prepare
a
clk\n");
+ dev_err(vop->dev, "failed to prepare
/enable h
clk\n");
goto err_unprepare_dclk;
}
goto err_unprepare_dclk;
}
- /*
- * enable hclk, so that we can config vop register.
- */
- ret = clk_enable(vop->hclk);
+ ret = clk_prepare_enable(vop->aclk);
if (ret < 0) {
if (ret < 0) {
- dev_err(vop->dev, "failed to prepare aclk\n");
- goto err_
unprepare_a
clk;
+ dev_err(vop->dev, "failed to prepare
/enable
aclk\n");
+ goto err_
disable_h
clk;
}
}
+
/*
* do hclk_reset, reset all vop registers.
*/
/*
* do hclk_reset, reset all vop registers.
*/
@@
-1608,7
+1602,7
@@
static int vop_initial(struct vop *vop)
if (IS_ERR(ahb_rst)) {
dev_err(vop->dev, "failed to get ahb reset\n");
ret = PTR_ERR(ahb_rst);
if (IS_ERR(ahb_rst)) {
dev_err(vop->dev, "failed to get ahb reset\n");
ret = PTR_ERR(ahb_rst);
- goto err_disable_
h
clk;
+ goto err_disable_
a
clk;
}
reset_control_assert(ahb_rst);
usleep_range(10, 20);
}
reset_control_assert(ahb_rst);
usleep_range(10, 20);
@@
-1634,26
+1628,25
@@
static int vop_initial(struct vop *vop)
if (IS_ERR(vop->dclk_rst)) {
dev_err(vop->dev, "failed to get dclk reset\n");
ret = PTR_ERR(vop->dclk_rst);
if (IS_ERR(vop->dclk_rst)) {
dev_err(vop->dev, "failed to get dclk reset\n");
ret = PTR_ERR(vop->dclk_rst);
- goto err_
unprepar
e_aclk;
+ goto err_
disabl
e_aclk;
}
reset_control_assert(vop->dclk_rst);
usleep_range(10, 20);
reset_control_deassert(vop->dclk_rst);
clk_disable(vop->hclk);
}
reset_control_assert(vop->dclk_rst);
usleep_range(10, 20);
reset_control_deassert(vop->dclk_rst);
clk_disable(vop->hclk);
+ clk_disable(vop->aclk);
vop->is_enabled = false;
return 0;
vop->is_enabled = false;
return 0;
+err_disable_aclk:
+ clk_disable_unprepare(vop->aclk);
err_disable_hclk:
err_disable_hclk:
- clk_disable(vop->hclk);
-err_unprepare_aclk:
- clk_unprepare(vop->aclk);
+ clk_disable_unprepare(vop->hclk);
err_unprepare_dclk:
clk_unprepare(vop->dclk);
err_unprepare_dclk:
clk_unprepare(vop->dclk);
-err_unprepare_hclk:
- clk_unprepare(vop->hclk);
return ret;
}
return ret;
}