Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69bdea70 authored by Eric Miao's avatar Eric Miao
Browse files

[ARM] pxafb: allow insertion of delay to the smart panel command sequence



Some smart panel requires a delay between command sequences, while PXA
LCD controller didn't provide such one, let's emulate this by software.

A software delay marker can be inserted into the command sequence, once
pxafb_smart_queue() detects this, it flushes the previous commands and
delay for a specified number of milliseconds.

Signed-off-by: default avatarEric Miao <eric.miao@marvell.com>
parent c1f99c21
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -177,4 +177,11 @@

#define SMART_CMD(x)	(SMART_CMD_WRITE_COMMAND | ((x) & 0xff))
#define SMART_DAT(x)	(SMART_CMD_WRITE_DATA | ((x) & 0xff))

/* SMART_DELAY() is introduced for software controlled delay primitive which
 * can be inserted between command sequences, unused command 0x6 is used here
 * and delay ranges from 0ms ~ 255ms
 */
#define SMART_CMD_DELAY		(0x6 << 9)
#define SMART_DELAY(ms)		(SMART_CMD_DELAY | ((ms) & 0xff))
#endif /* __ASM_ARCH_REGS_LCD_H */
+10 −3
Original line number Diff line number Diff line
@@ -723,12 +723,19 @@ int pxafb_smart_queue(struct fb_info *info, uint16_t *cmds, int n_cmds)
	int i;
	struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb);

	for (i = 0; i < n_cmds; i++, cmds++) {
		/* if it is a software delay, flush and delay */
		if ((*cmds & 0xff00) == SMART_CMD_DELAY) {
			pxafb_smart_flush(info);
			mdelay(*cmds & 0xff);
			continue;
		}

		/* leave 2 commands for INTERRUPT and WAIT_FOR_SYNC */
	for (i = 0; i < n_cmds; i++) {
		if (fbi->n_smart_cmds == CMD_BUFF_SIZE - 8)
			pxafb_smart_flush(info);

		fbi->smart_cmds[fbi->n_smart_cmds++] = *cmds++;
		fbi->smart_cmds[fbi->n_smart_cmds++] = *cmds;
	}

	return 0;