[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: Eric Miao <eric.miao@marvell.com>
This commit is contained in:
parent
c1f99c215c
commit
69bdea7047
2 changed files with 17 additions and 3 deletions
|
@ -177,4 +177,11 @@
|
||||||
|
|
||||||
#define SMART_CMD(x) (SMART_CMD_WRITE_COMMAND | ((x) & 0xff))
|
#define SMART_CMD(x) (SMART_CMD_WRITE_COMMAND | ((x) & 0xff))
|
||||||
#define SMART_DAT(x) (SMART_CMD_WRITE_DATA | ((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 */
|
#endif /* __ASM_ARCH_REGS_LCD_H */
|
||||||
|
|
|
@ -723,12 +723,19 @@ int pxafb_smart_queue(struct fb_info *info, uint16_t *cmds, int n_cmds)
|
||||||
int i;
|
int i;
|
||||||
struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb);
|
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 */
|
/* 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)
|
if (fbi->n_smart_cmds == CMD_BUFF_SIZE - 8)
|
||||||
pxafb_smart_flush(info);
|
pxafb_smart_flush(info);
|
||||||
|
|
||||||
fbi->smart_cmds[fbi->n_smart_cmds++] = *cmds++;
|
fbi->smart_cmds[fbi->n_smart_cmds++] = *cmds;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Reference in a new issue