Skip to content

Commit b28da0d

Browse files
rxrblnhdeller
authored andcommitted
fbdev: ffb: fix corrupted video output on Sun FFB1
Fix Sun FFB1 corrupted video out ([1] and [2]) by disabling overlay and initializing window mode to a known state. The issue never appeared on my FFB2+/vertical nor Elite3D/M6. It could also depend on the PROM version. /SUNW,ffb@1e,0: FFB at 000001fc00000000, type 11, DAC pnum[236c] rev[10] manuf_rev[4] X (II) /dev/fb0: Detected FFB1, Z-buffer, Single-buffered. X (II) /dev/fb0: BT9068 (PAC1) ramdac detected (with normal cursor control) X (II) /dev/fb0: Detected Creator/Creator3D [1] https://www.instagram.com/p/DUTcSmSjSem/ [2] https://chaos.social/@ReneRebe/116023241660154102 Signed-off-by: René Rebe <rene@exactco.de> Cc: stable@kernel.org Signed-off-by: Helge Deller <deller@gmx.de>
1 parent c39ee2d commit b28da0d

1 file changed

Lines changed: 13 additions & 1 deletion

File tree

drivers/video/fbdev/ffb.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,9 @@ struct ffb_dac {
335335
};
336336

337337
#define FFB_DAC_UCTRL 0x1001 /* User Control */
338+
#define FFB_DAC_UCTRL_OVENAB 0x00000008 /* Overlay Enable */
339+
#define FFB_DAC_UCTRL_WMODE 0x00000030 /* Window Mode */
340+
#define FFB_DAC_UCTRL_WM_COMB 0x00000000 /* Window Mode = Combined */
338341
#define FFB_DAC_UCTRL_MANREV 0x00000f00 /* 4-bit Manufacturing Revision */
339342
#define FFB_DAC_UCTRL_MANREV_SHIFT 8
340343
#define FFB_DAC_TGEN 0x6000 /* Timing Generator */
@@ -425,7 +428,7 @@ static void ffb_switch_from_graph(struct ffb_par *par)
425428
{
426429
struct ffb_fbc __iomem *fbc = par->fbc;
427430
struct ffb_dac __iomem *dac = par->dac;
428-
unsigned long flags;
431+
unsigned long flags, uctrl;
429432

430433
spin_lock_irqsave(&par->lock, flags);
431434
FFBWait(par);
@@ -450,6 +453,15 @@ static void ffb_switch_from_graph(struct ffb_par *par)
450453
upa_writel((FFB_DAC_CUR_CTRL_P0 |
451454
FFB_DAC_CUR_CTRL_P1), &dac->value2);
452455

456+
/* Disable overlay and window modes. */
457+
upa_writel(FFB_DAC_UCTRL, &dac->type);
458+
uctrl = upa_readl(&dac->value);
459+
uctrl &= ~FFB_DAC_UCTRL_WMODE;
460+
uctrl |= FFB_DAC_UCTRL_WM_COMB;
461+
uctrl &= ~FFB_DAC_UCTRL_OVENAB;
462+
upa_writel(FFB_DAC_UCTRL, &dac->type);
463+
upa_writel(uctrl, &dac->value);
464+
453465
spin_unlock_irqrestore(&par->lock, flags);
454466
}
455467

0 commit comments

Comments
 (0)