Revert "drm/rockchip: support gamma control on RK3399"
This reverts commit 36a33fc208
.
This commit is contained in:
parent
0652589731
commit
c0cb37d316
1 changed files with 34 additions and 71 deletions
|
@ -9,7 +9,6 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/iopoll.h>
|
#include <linux/iopoll.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/log2.h>
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
|
@ -66,9 +65,6 @@
|
||||||
#define VOP_REG_SET(vop, group, name, v) \
|
#define VOP_REG_SET(vop, group, name, v) \
|
||||||
vop_reg_set(vop, &vop->data->group->name, 0, ~0, v, #name)
|
vop_reg_set(vop, &vop->data->group->name, 0, ~0, v, #name)
|
||||||
|
|
||||||
#define VOP_HAS_REG(vop, group, name) \
|
|
||||||
(!!(vop->data->group->name.mask))
|
|
||||||
|
|
||||||
#define VOP_INTR_SET_TYPE(vop, name, type, v) \
|
#define VOP_INTR_SET_TYPE(vop, name, type, v) \
|
||||||
do { \
|
do { \
|
||||||
int i, reg = 0, mask = 0; \
|
int i, reg = 0, mask = 0; \
|
||||||
|
@ -1204,22 +1200,17 @@ static bool vop_dsp_lut_is_enabled(struct vop *vop)
|
||||||
return vop_read_reg(vop, 0, &vop->data->common->dsp_lut_en);
|
return vop_read_reg(vop, 0, &vop->data->common->dsp_lut_en);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 vop_lut_buffer_index(struct vop *vop)
|
|
||||||
{
|
|
||||||
return vop_read_reg(vop, 0, &vop->data->common->lut_buffer_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vop_crtc_write_gamma_lut(struct vop *vop, struct drm_crtc *crtc)
|
static void vop_crtc_write_gamma_lut(struct vop *vop, struct drm_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct drm_color_lut *lut = crtc->state->gamma_lut->data;
|
struct drm_color_lut *lut = crtc->state->gamma_lut->data;
|
||||||
unsigned int i, bpc = ilog2(vop->data->lut_size);
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < crtc->gamma_size; i++) {
|
for (i = 0; i < crtc->gamma_size; i++) {
|
||||||
u32 word;
|
u32 word;
|
||||||
|
|
||||||
word = (drm_color_lut_extract(lut[i].red, bpc) << (2 * bpc)) |
|
word = (drm_color_lut_extract(lut[i].red, 10) << 20) |
|
||||||
(drm_color_lut_extract(lut[i].green, bpc) << bpc) |
|
(drm_color_lut_extract(lut[i].green, 10) << 10) |
|
||||||
drm_color_lut_extract(lut[i].blue, bpc);
|
drm_color_lut_extract(lut[i].blue, 10);
|
||||||
writel(word, vop->lut_regs + i * 4);
|
writel(word, vop->lut_regs + i * 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1229,66 +1220,38 @@ static void vop_crtc_gamma_set(struct vop *vop, struct drm_crtc *crtc,
|
||||||
{
|
{
|
||||||
struct drm_crtc_state *state = crtc->state;
|
struct drm_crtc_state *state = crtc->state;
|
||||||
unsigned int idle;
|
unsigned int idle;
|
||||||
u32 lut_idx, old_idx;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!vop->lut_regs)
|
if (!vop->lut_regs)
|
||||||
return;
|
return;
|
||||||
|
/*
|
||||||
|
* To disable gamma (gamma_lut is null) or to write
|
||||||
|
* an update to the LUT, clear dsp_lut_en.
|
||||||
|
*/
|
||||||
|
spin_lock(&vop->reg_lock);
|
||||||
|
VOP_REG_SET(vop, common, dsp_lut_en, 0);
|
||||||
|
vop_cfg_done(vop);
|
||||||
|
spin_unlock(&vop->reg_lock);
|
||||||
|
|
||||||
if (!state->gamma_lut || !VOP_HAS_REG(vop, common, update_gamma_lut)) {
|
/*
|
||||||
/*
|
* In order to write the LUT to the internal memory,
|
||||||
* To disable gamma (gamma_lut is null) or to write
|
* we need to first make sure the dsp_lut_en bit is cleared.
|
||||||
* an update to the LUT, clear dsp_lut_en.
|
*/
|
||||||
*/
|
ret = readx_poll_timeout(vop_dsp_lut_is_enabled, vop,
|
||||||
spin_lock(&vop->reg_lock);
|
idle, !idle, 5, 30 * 1000);
|
||||||
VOP_REG_SET(vop, common, dsp_lut_en, 0);
|
if (ret) {
|
||||||
vop_cfg_done(vop);
|
DRM_DEV_ERROR(vop->dev, "display LUT RAM enable timeout!\n");
|
||||||
spin_unlock(&vop->reg_lock);
|
return;
|
||||||
|
|
||||||
/*
|
|
||||||
* In order to write the LUT to the internal memory,
|
|
||||||
* we need to first make sure the dsp_lut_en bit is cleared.
|
|
||||||
*/
|
|
||||||
ret = readx_poll_timeout(vop_dsp_lut_is_enabled, vop,
|
|
||||||
idle, !idle, 5, 30 * 1000);
|
|
||||||
if (ret) {
|
|
||||||
DRM_DEV_ERROR(vop->dev, "display LUT RAM enable timeout!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!state->gamma_lut)
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* On RK3399 the gamma LUT can updated without clearing dsp_lut_en,
|
|
||||||
* by setting update_gamma_lut then waiting for lut_buffer_index change
|
|
||||||
*/
|
|
||||||
old_idx = vop_lut_buffer_index(vop);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!state->gamma_lut)
|
||||||
|
return;
|
||||||
|
|
||||||
spin_lock(&vop->reg_lock);
|
spin_lock(&vop->reg_lock);
|
||||||
vop_crtc_write_gamma_lut(vop, crtc);
|
vop_crtc_write_gamma_lut(vop, crtc);
|
||||||
VOP_REG_SET(vop, common, dsp_lut_en, 1);
|
VOP_REG_SET(vop, common, dsp_lut_en, 1);
|
||||||
VOP_REG_SET(vop, common, update_gamma_lut, 1);
|
|
||||||
vop_cfg_done(vop);
|
vop_cfg_done(vop);
|
||||||
spin_unlock(&vop->reg_lock);
|
spin_unlock(&vop->reg_lock);
|
||||||
|
|
||||||
if (VOP_HAS_REG(vop, common, update_gamma_lut)) {
|
|
||||||
ret = readx_poll_timeout(vop_lut_buffer_index, vop,
|
|
||||||
lut_idx, lut_idx != old_idx, 5, 30 * 1000);
|
|
||||||
if (ret) {
|
|
||||||
DRM_DEV_ERROR(vop->dev, "gamma LUT update timeout!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* update_gamma_lut is auto cleared by HW, but write 0 to clear the bit
|
|
||||||
* in our backup of the regs.
|
|
||||||
*/
|
|
||||||
spin_lock(&vop->reg_lock);
|
|
||||||
VOP_REG_SET(vop, common, update_gamma_lut, 0);
|
|
||||||
spin_unlock(&vop->reg_lock);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vop_crtc_atomic_begin(struct drm_crtc *crtc,
|
static void vop_crtc_atomic_begin(struct drm_crtc *crtc,
|
||||||
|
@ -1332,6 +1295,14 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we have a GAMMA LUT in the state, then let's make sure
|
||||||
|
* it's updated. We might be coming out of suspend,
|
||||||
|
* which means the LUT internal memory needs to be re-written.
|
||||||
|
*/
|
||||||
|
if (crtc->state->gamma_lut)
|
||||||
|
vop_crtc_gamma_set(vop, crtc, old_state);
|
||||||
|
|
||||||
mutex_lock(&vop->vop_lock);
|
mutex_lock(&vop->vop_lock);
|
||||||
|
|
||||||
WARN_ON(vop->event);
|
WARN_ON(vop->event);
|
||||||
|
@ -1422,14 +1393,6 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||||
|
|
||||||
VOP_REG_SET(vop, common, standby, 0);
|
VOP_REG_SET(vop, common, standby, 0);
|
||||||
mutex_unlock(&vop->vop_lock);
|
mutex_unlock(&vop->vop_lock);
|
||||||
|
|
||||||
/*
|
|
||||||
* If we have a GAMMA LUT in the state, then let's make sure
|
|
||||||
* it's updated. We might be coming out of suspend,
|
|
||||||
* which means the LUT internal memory needs to be re-written.
|
|
||||||
*/
|
|
||||||
if (crtc->state->gamma_lut)
|
|
||||||
vop_crtc_gamma_set(vop, crtc, old_state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool vop_fs_irq_is_pending(struct vop *vop)
|
static bool vop_fs_irq_is_pending(struct vop *vop)
|
||||||
|
@ -2156,8 +2119,8 @@ static int vop_bind(struct device *dev, struct device *master, void *data)
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||||
if (res) {
|
if (res) {
|
||||||
if (vop_data->lut_size != 1024 && vop_data->lut_size != 256) {
|
if (!vop_data->lut_size) {
|
||||||
DRM_DEV_ERROR(dev, "unsupported gamma LUT size %d\n", vop_data->lut_size);
|
DRM_DEV_ERROR(dev, "no gamma LUT size defined\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
vop->lut_regs = devm_ioremap_resource(dev, res);
|
vop->lut_regs = devm_ioremap_resource(dev, res);
|
||||||
|
|
Loading…
Add table
Reference in a new issue