drm/rcar-du: Add LVDS_LANES quirk
LVDS lanes 1 and 3 are switched in ES1 hardware (R8A7790). The problem has been fixed in newer revisions, add a quirk to make the workaround selectable. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
This commit is contained in:
parent
e8355e0dc4
commit
5cca30ebe0
|
@ -250,7 +250,7 @@ static const struct rcar_du_device_info rcar_du_r8a7779_info = {
|
|||
|
||||
static const struct rcar_du_device_info rcar_du_r8a7790_info = {
|
||||
.features = RCAR_DU_FEATURE_CRTC_IRQ_CLOCK | RCAR_DU_FEATURE_DEFR8,
|
||||
.quirks = RCAR_DU_QUIRK_ALIGN_128B,
|
||||
.quirks = RCAR_DU_QUIRK_ALIGN_128B | RCAR_DU_QUIRK_LVDS_LANES,
|
||||
.num_crtcs = 3,
|
||||
.routes = {
|
||||
/* R8A7790 has one RGB output, two LVDS outputs and one
|
||||
|
|
|
@ -31,6 +31,7 @@ struct rcar_du_lvdsenc;
|
|||
#define RCAR_DU_FEATURE_DEFR8 (1 << 1) /* Has DEFR8 register */
|
||||
|
||||
#define RCAR_DU_QUIRK_ALIGN_128B (1 << 0) /* Align pitches to 128 bytes */
|
||||
#define RCAR_DU_QUIRK_LVDS_LANES (1 << 1) /* LVDS lanes 1 and 3 inverted */
|
||||
|
||||
/*
|
||||
* struct rcar_du_output_routing - Output routing specification
|
||||
|
|
|
@ -44,6 +44,7 @@ static int rcar_du_lvdsenc_start(struct rcar_du_lvdsenc *lvds,
|
|||
const struct drm_display_mode *mode = &rcrtc->crtc.mode;
|
||||
unsigned int freq = mode->clock;
|
||||
u32 lvdcr0;
|
||||
u32 lvdhcr;
|
||||
u32 pllcr;
|
||||
int ret;
|
||||
|
||||
|
@ -72,15 +73,19 @@ static int rcar_du_lvdsenc_start(struct rcar_du_lvdsenc *lvds,
|
|||
* VSYNC -> CTRL1
|
||||
* DISP -> CTRL2
|
||||
* 0 -> CTRL3
|
||||
*
|
||||
* Channels 1 and 3 are switched on ES1.
|
||||
*/
|
||||
rcar_lvds_write(lvds, LVDCTRCR, LVDCTRCR_CTR3SEL_ZERO |
|
||||
LVDCTRCR_CTR2SEL_DISP | LVDCTRCR_CTR1SEL_VSYNC |
|
||||
LVDCTRCR_CTR0SEL_HSYNC);
|
||||
rcar_lvds_write(lvds, LVDCHCR,
|
||||
LVDCHCR_CHSEL_CH(0, 0) | LVDCHCR_CHSEL_CH(1, 3) |
|
||||
LVDCHCR_CHSEL_CH(2, 2) | LVDCHCR_CHSEL_CH(3, 1));
|
||||
|
||||
if (rcar_du_needs(lvds->dev, RCAR_DU_QUIRK_LVDS_LANES))
|
||||
lvdhcr = LVDCHCR_CHSEL_CH(0, 0) | LVDCHCR_CHSEL_CH(1, 3)
|
||||
| LVDCHCR_CHSEL_CH(2, 2) | LVDCHCR_CHSEL_CH(3, 1);
|
||||
else
|
||||
lvdhcr = LVDCHCR_CHSEL_CH(0, 0) | LVDCHCR_CHSEL_CH(1, 1)
|
||||
| LVDCHCR_CHSEL_CH(2, 2) | LVDCHCR_CHSEL_CH(3, 3);
|
||||
|
||||
rcar_lvds_write(lvds, LVDCHCR, lvdhcr);
|
||||
|
||||
/* Select the input, hardcode mode 0, enable LVDS operation and turn
|
||||
* bias circuitry on.
|
||||
|
|
Loading…
Reference in New Issue