xref: /rk3399_rockchip-uboot/drivers/video/ld9040.c (revision 9338d8e76bf17823fb1c5860d49c6b3daadb7e85)
1eed29742SPiotr Wilczek /*
2eed29742SPiotr Wilczek  * ld9040 AMOLED LCD panel driver.
3eed29742SPiotr Wilczek  *
4eed29742SPiotr Wilczek  * Copyright (C) 2012 Samsung Electronics
5eed29742SPiotr Wilczek  * Donghwa Lee <dh09.lee@samsung.com>
6eed29742SPiotr Wilczek  *
7*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
8eed29742SPiotr Wilczek  */
9eed29742SPiotr Wilczek 
10eed29742SPiotr Wilczek #include <common.h>
11eed29742SPiotr Wilczek #include <spi.h>
12eed29742SPiotr Wilczek 
13eed29742SPiotr Wilczek static const unsigned char SEQ_USER_SETTING[] = {
14eed29742SPiotr Wilczek 	0xF0, 0x5A, 0x5A
15eed29742SPiotr Wilczek };
16eed29742SPiotr Wilczek 
17eed29742SPiotr Wilczek static const unsigned char SEQ_ELVSS_ON[] = {
18eed29742SPiotr Wilczek 	0xB1, 0x0D, 0x00, 0x16,
19eed29742SPiotr Wilczek };
20eed29742SPiotr Wilczek 
21eed29742SPiotr Wilczek static const unsigned char SEQ_GTCON[] = {
22eed29742SPiotr Wilczek 	0xF7, 0x09, 0x00, 0x00,
23eed29742SPiotr Wilczek };
24eed29742SPiotr Wilczek 
25eed29742SPiotr Wilczek static const unsigned char SEQ_PANEL_CONDITION[] = {
26eed29742SPiotr Wilczek 	0xF8, 0x05, 0x65, 0x96, 0x71, 0x7D, 0x19, 0x3B,
27eed29742SPiotr Wilczek 	0x0D, 0x19, 0x7E, 0x0D, 0xE2, 0x00, 0x00, 0x7E,
28eed29742SPiotr Wilczek 	0x7D, 0x07, 0x07, 0x20, 0x20, 0x20, 0x02, 0x02,
29eed29742SPiotr Wilczek };
30eed29742SPiotr Wilczek 
31eed29742SPiotr Wilczek static const unsigned char SEQ_GAMMA_SET1[] = {
32eed29742SPiotr Wilczek 	0xF9, 0x00, 0xA7, 0xB4, 0xAE, 0xBF, 0x00, 0x91,
33eed29742SPiotr Wilczek 	0x00, 0xB2, 0xB4, 0xAA, 0xBB, 0x00, 0xAC, 0x00,
34eed29742SPiotr Wilczek 	0xB3, 0xB1, 0xAA, 0xBC, 0x00, 0xB3,
35eed29742SPiotr Wilczek };
36eed29742SPiotr Wilczek 
37eed29742SPiotr Wilczek static const unsigned char SEQ_GAMMA_CTRL[] = {
38eed29742SPiotr Wilczek 	0xFB, 0x02, 0x5A,
39eed29742SPiotr Wilczek };
40eed29742SPiotr Wilczek 
41eed29742SPiotr Wilczek static const unsigned char SEQ_DISPCTL[] = {
42eed29742SPiotr Wilczek 	0xF2, 0x02, 0x08, 0x08, 0x10, 0x10,
43eed29742SPiotr Wilczek };
44eed29742SPiotr Wilczek 
45eed29742SPiotr Wilczek static const unsigned char SEQ_MANPWR[] = {
46eed29742SPiotr Wilczek 	0xB0, 0x04,
47eed29742SPiotr Wilczek };
48eed29742SPiotr Wilczek 
49eed29742SPiotr Wilczek static const unsigned char SEQ_PWR_CTRL[] = {
50eed29742SPiotr Wilczek 	0xF4, 0x0A, 0x87, 0x25, 0x6A, 0x44, 0x02, 0x88,
51eed29742SPiotr Wilczek };
52eed29742SPiotr Wilczek 
53eed29742SPiotr Wilczek static const unsigned char SEQ_SLPOUT[] = {
54eed29742SPiotr Wilczek 	0x11,
55eed29742SPiotr Wilczek };
56eed29742SPiotr Wilczek 
57eed29742SPiotr Wilczek static const unsigned char SEQ_DISPON[] = {
58eed29742SPiotr Wilczek 	0x29,
59eed29742SPiotr Wilczek };
60eed29742SPiotr Wilczek 
61eed29742SPiotr Wilczek static const unsigned char SEQ_DISPOFF[] = {
62eed29742SPiotr Wilczek 	0x28,
63eed29742SPiotr Wilczek };
64eed29742SPiotr Wilczek 
ld9040_spi_write(const unsigned char * wbuf,unsigned int size_cmd)65eed29742SPiotr Wilczek static void ld9040_spi_write(const unsigned char *wbuf, unsigned int size_cmd)
66eed29742SPiotr Wilczek {
67eed29742SPiotr Wilczek 	int i = 0;
68eed29742SPiotr Wilczek 
69eed29742SPiotr Wilczek 	/*
70eed29742SPiotr Wilczek 	 * Data are transmitted in 9-bit words:
71eed29742SPiotr Wilczek 	 * the first bit is command/parameter, the other are the value.
72eed29742SPiotr Wilczek 	 * The value's LSB is shifted to MSB position, to be sent as 9th bit
73eed29742SPiotr Wilczek 	 */
74eed29742SPiotr Wilczek 
75eed29742SPiotr Wilczek 	unsigned int data_out = 0, data_in = 0;
76eed29742SPiotr Wilczek 	for (i = 0; i < size_cmd; i++) {
77eed29742SPiotr Wilczek 		data_out = wbuf[i] >> 1;
78eed29742SPiotr Wilczek 		if (i != 0)
79eed29742SPiotr Wilczek 			data_out += 0x0080;
80eed29742SPiotr Wilczek 		if (wbuf[i] & 0x01)
81eed29742SPiotr Wilczek 			data_out += 0x8000;
82eed29742SPiotr Wilczek 		spi_xfer(NULL, 9, &data_out, &data_in, SPI_XFER_BEGIN);
83eed29742SPiotr Wilczek 	}
84eed29742SPiotr Wilczek }
85eed29742SPiotr Wilczek 
ld9040_cfg_ldo(void)86eed29742SPiotr Wilczek void ld9040_cfg_ldo(void)
87eed29742SPiotr Wilczek {
88eed29742SPiotr Wilczek 	udelay(10);
89eed29742SPiotr Wilczek 
90eed29742SPiotr Wilczek 	ld9040_spi_write(SEQ_USER_SETTING,
91eed29742SPiotr Wilczek 					ARRAY_SIZE(SEQ_USER_SETTING));
92eed29742SPiotr Wilczek 	ld9040_spi_write(SEQ_PANEL_CONDITION,
93eed29742SPiotr Wilczek 					ARRAY_SIZE(SEQ_PANEL_CONDITION));
94eed29742SPiotr Wilczek 	ld9040_spi_write(SEQ_DISPCTL, ARRAY_SIZE(SEQ_DISPCTL));
95eed29742SPiotr Wilczek 	ld9040_spi_write(SEQ_MANPWR, ARRAY_SIZE(SEQ_MANPWR));
96eed29742SPiotr Wilczek 	ld9040_spi_write(SEQ_PWR_CTRL, ARRAY_SIZE(SEQ_PWR_CTRL));
97eed29742SPiotr Wilczek 	ld9040_spi_write(SEQ_ELVSS_ON, ARRAY_SIZE(SEQ_ELVSS_ON));
98eed29742SPiotr Wilczek 	ld9040_spi_write(SEQ_GTCON, ARRAY_SIZE(SEQ_GTCON));
99eed29742SPiotr Wilczek 	ld9040_spi_write(SEQ_GAMMA_SET1, ARRAY_SIZE(SEQ_GAMMA_SET1));
100eed29742SPiotr Wilczek 	ld9040_spi_write(SEQ_GAMMA_CTRL, ARRAY_SIZE(SEQ_GAMMA_CTRL));
101eed29742SPiotr Wilczek 	ld9040_spi_write(SEQ_SLPOUT, ARRAY_SIZE(SEQ_SLPOUT));
102eed29742SPiotr Wilczek 
103eed29742SPiotr Wilczek 	udelay(120);
104eed29742SPiotr Wilczek }
105eed29742SPiotr Wilczek 
ld9040_enable_ldo(unsigned int onoff)106eed29742SPiotr Wilczek void ld9040_enable_ldo(unsigned int onoff)
107eed29742SPiotr Wilczek {
108eed29742SPiotr Wilczek 	if (onoff)
109eed29742SPiotr Wilczek 		ld9040_spi_write(SEQ_DISPON, ARRAY_SIZE(SEQ_DISPON));
110eed29742SPiotr Wilczek 	else
111eed29742SPiotr Wilczek 		ld9040_spi_write(SEQ_DISPOFF, ARRAY_SIZE(SEQ_DISPOFF));
112eed29742SPiotr Wilczek }
113