xref: /OK3568_Linux_fs/u-boot/drivers/video/drm/panel-rohm-bu18rl82.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Rohm BU18RL82-based panel driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * (C) Copyright 2022 Rockchip Electronics Co., Ltd
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <config.h>
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <backlight.h>
11*4882a593Smuzhiyun #include <errno.h>
12*4882a593Smuzhiyun #include <malloc.h>
13*4882a593Smuzhiyun #include <video.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <asm/gpio.h>
16*4882a593Smuzhiyun #include <dm/device.h>
17*4882a593Smuzhiyun #include <dm/read.h>
18*4882a593Smuzhiyun #include <dm/pinctrl.h>
19*4882a593Smuzhiyun #include <dm/uclass-id.h>
20*4882a593Smuzhiyun #include <linux/media-bus-format.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #include "rockchip_display.h"
23*4882a593Smuzhiyun #include "rockchip_panel.h"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun struct bu18rl82;
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun struct panel_desc {
28*4882a593Smuzhiyun 	const char *name;
29*4882a593Smuzhiyun 	int (*prepare)(struct bu18rl82 *rl82);
30*4882a593Smuzhiyun 	int (*unprepare)(struct bu18rl82 *rl82);
31*4882a593Smuzhiyun 	int (*enable)(struct bu18rl82 *rl82);
32*4882a593Smuzhiyun 	int (*disable)(struct bu18rl82 *rl82);
33*4882a593Smuzhiyun 	int (*backlight_enable)(struct bu18rl82 *rl82);
34*4882a593Smuzhiyun 	int (*backlight_disable)(struct bu18rl82 *rl82);
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun struct bu18rl82 {
38*4882a593Smuzhiyun 	struct udevice *dev;
39*4882a593Smuzhiyun 	struct udevice *backlight;
40*4882a593Smuzhiyun 	const struct panel_desc *desc;
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
bu18rl82_panel_prepare(struct rockchip_panel * panel)43*4882a593Smuzhiyun static void bu18rl82_panel_prepare(struct rockchip_panel *panel)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun 	struct bu18rl82 *rl82 = dev_get_priv(panel->dev);
46*4882a593Smuzhiyun 	const struct panel_desc *desc = rl82->desc;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	if (desc->prepare)
49*4882a593Smuzhiyun 		desc->prepare(rl82);
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun 
bu18rl82_panel_unprepare(struct rockchip_panel * panel)52*4882a593Smuzhiyun static void bu18rl82_panel_unprepare(struct rockchip_panel *panel)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun 	struct bu18rl82 *rl82 = dev_get_priv(panel->dev);
55*4882a593Smuzhiyun 	const struct panel_desc *desc = rl82->desc;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	if (desc->unprepare)
58*4882a593Smuzhiyun 		desc->unprepare(rl82);
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun 
bu18rl82_panel_enable(struct rockchip_panel * panel)61*4882a593Smuzhiyun static void bu18rl82_panel_enable(struct rockchip_panel *panel)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun 	struct bu18rl82 *rl82 = dev_get_priv(panel->dev);
64*4882a593Smuzhiyun 	const struct panel_desc *desc = rl82->desc;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	if (desc->enable)
67*4882a593Smuzhiyun 		desc->enable(rl82);
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	if (rl82->backlight)
70*4882a593Smuzhiyun 		backlight_enable(rl82->backlight);
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	if (desc->backlight_enable)
73*4882a593Smuzhiyun 		desc->backlight_enable(rl82);
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
bu18rl82_panel_disable(struct rockchip_panel * panel)76*4882a593Smuzhiyun static void bu18rl82_panel_disable(struct rockchip_panel *panel)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun 	struct bu18rl82 *rl82 = dev_get_priv(panel->dev);
79*4882a593Smuzhiyun 	const struct panel_desc *desc = rl82->desc;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	if (desc->backlight_disable)
82*4882a593Smuzhiyun 		desc->backlight_disable(rl82);
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	if (rl82->backlight)
85*4882a593Smuzhiyun 		backlight_disable(rl82->backlight);
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	if (desc->disable)
88*4882a593Smuzhiyun 		desc->disable(rl82);
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun static const struct rockchip_panel_funcs bu18rl82_panel_funcs = {
92*4882a593Smuzhiyun 	.prepare = bu18rl82_panel_prepare,
93*4882a593Smuzhiyun 	.unprepare = bu18rl82_panel_unprepare,
94*4882a593Smuzhiyun 	.enable = bu18rl82_panel_enable,
95*4882a593Smuzhiyun 	.disable = bu18rl82_panel_disable,
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun 
bu18rl82_probe(struct udevice * dev)98*4882a593Smuzhiyun static int bu18rl82_probe(struct udevice *dev)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun 	struct bu18rl82 *rl82 = dev_get_priv(dev);
101*4882a593Smuzhiyun 	struct rockchip_panel *panel;
102*4882a593Smuzhiyun 	int ret;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	ret = i2c_set_chip_offset_len(dev, 2);
105*4882a593Smuzhiyun 	if (ret)
106*4882a593Smuzhiyun 		return ret;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	rl82->dev = dev;
109*4882a593Smuzhiyun 	rl82->desc = (const struct panel_desc *)dev_get_driver_data(dev);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev,
112*4882a593Smuzhiyun 					   "backlight", &rl82->backlight);
113*4882a593Smuzhiyun 	if (ret && ret != -ENOENT) {
114*4882a593Smuzhiyun 		dev_err(dev, "%s: Cannot get backlight: %d\n", __func__, ret);
115*4882a593Smuzhiyun 		return ret;
116*4882a593Smuzhiyun 	}
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	panel = calloc(1, sizeof(*panel));
119*4882a593Smuzhiyun 	if (!panel)
120*4882a593Smuzhiyun 		return -ENOMEM;
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	dev->driver_data = (ulong)panel;
123*4882a593Smuzhiyun 	panel->dev = dev;
124*4882a593Smuzhiyun 	panel->bus_format = MEDIA_BUS_FMT_RGB888_1X24;
125*4882a593Smuzhiyun 	panel->funcs = &bu18rl82_panel_funcs;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	return 0;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #define rohm_deserializer_write(rl82, reg, val) do {			\
131*4882a593Smuzhiyun 		int ret;						\
132*4882a593Smuzhiyun 		ret = dm_i2c_reg_write(rl82->dev, reg, val);		\
133*4882a593Smuzhiyun 		if (ret) {						\
134*4882a593Smuzhiyun 			dev_err(rl82->dev,				\
135*4882a593Smuzhiyun 				"failed to set register 0x%04x\n",	\
136*4882a593Smuzhiyun 				reg);					\
137*4882a593Smuzhiyun 			return ret;					\
138*4882a593Smuzhiyun 		}							\
139*4882a593Smuzhiyun 	} while (0)
140*4882a593Smuzhiyun 
csot_mg1561b01_prepare(struct bu18rl82 * rl82)141*4882a593Smuzhiyun static int csot_mg1561b01_prepare(struct bu18rl82 *rl82)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun 	const struct reg_sequence {
144*4882a593Smuzhiyun 		u16 reg;
145*4882a593Smuzhiyun 		u8 def;
146*4882a593Smuzhiyun 	} regs[] = {
147*4882a593Smuzhiyun 		{ 0x0011, 0x03 }, { 0x0012, 0x03 },
148*4882a593Smuzhiyun 		{ 0x001f, 0x02 }, { 0x0020, 0x02 },
149*4882a593Smuzhiyun 		{ 0x0031, 0x41 }, { 0x0032, 0x41 },
150*4882a593Smuzhiyun 		{ 0x0073, 0x80 }, { 0x0074, 0x07 },
151*4882a593Smuzhiyun 		{ 0x007b, 0x38 }, { 0x007c, 0x04 },
152*4882a593Smuzhiyun 		{ 0x0079, 0x0a },
153*4882a593Smuzhiyun 		{ 0x0429, 0x0a }, { 0x045d, 0x01 },
154*4882a593Smuzhiyun 		{ 0x0529, 0x0a }, { 0x055d, 0x01 },
155*4882a593Smuzhiyun 		{ 0x060a, 0xb0 }, { 0x060b, 0xff }, { 0x060c, 0xff },
156*4882a593Smuzhiyun 		{ 0x0644, 0x18 }, { 0x0645, 0x01 }, { 0x0646, 0x2d },
157*4882a593Smuzhiyun 	};
158*4882a593Smuzhiyun 	int i;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(regs); i++)
161*4882a593Smuzhiyun 		rohm_deserializer_write(rl82, regs[i].reg, regs[i].def);
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	/* BL_PWM - GPIO0 */
164*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0057, 0x00);
165*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0058, 0x02);
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	/* TP_INT - GPIO3 */
168*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0060, 0x08);
169*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x042e, 0x05);
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	/* TP_RST - GPIO4 */
172*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0063, 0x00);
173*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0064, 0x01);
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	return 0;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun 
csot_mg1561b01_unprepare(struct bu18rl82 * rl82)178*4882a593Smuzhiyun static int csot_mg1561b01_unprepare(struct bu18rl82 *rl82)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun 	/* TP_RST - GPIO4 */
181*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0064, 0x00);
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	return 0;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun 
csot_mg1561b01_enable(struct bu18rl82 * rl82)186*4882a593Smuzhiyun static int csot_mg1561b01_enable(struct bu18rl82 *rl82)
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0091, 0x03);
189*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0090, 0x01);
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	return 0;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun 
csot_mg1561b01_disable(struct bu18rl82 * rl82)194*4882a593Smuzhiyun static int csot_mg1561b01_disable(struct bu18rl82 *rl82)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0090, 0x00);
197*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0091, 0x00);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	return 0;
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun 
csot_mg1561b01_backlight_enable(struct bu18rl82 * rl82)202*4882a593Smuzhiyun static int csot_mg1561b01_backlight_enable(struct bu18rl82 *rl82)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun 	/* BL_EN - GPIO1 */
205*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x005a, 0x00);
206*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x005b, 0x01);
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	return 0;
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun 
csot_mg1561b01_backlight_disable(struct bu18rl82 * rl82)211*4882a593Smuzhiyun static int csot_mg1561b01_backlight_disable(struct bu18rl82 *rl82)
212*4882a593Smuzhiyun {
213*4882a593Smuzhiyun 	/* BL_EN - GPIO1 */
214*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x005b, 0x00);
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 	return 0;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun static const struct panel_desc csot_mg1561b01 = {
220*4882a593Smuzhiyun 	.name			= "csot,mg1561b01",
221*4882a593Smuzhiyun 	.prepare		= csot_mg1561b01_prepare,
222*4882a593Smuzhiyun 	.unprepare		= csot_mg1561b01_unprepare,
223*4882a593Smuzhiyun 	.enable			= csot_mg1561b01_enable,
224*4882a593Smuzhiyun 	.disable		= csot_mg1561b01_disable,
225*4882a593Smuzhiyun 	.backlight_enable	= csot_mg1561b01_backlight_enable,
226*4882a593Smuzhiyun 	.backlight_disable	= csot_mg1561b01_backlight_disable,
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun 
touch_china_v123awf3_r1_prepare(struct bu18rl82 * rl82)229*4882a593Smuzhiyun static int touch_china_v123awf3_r1_prepare(struct bu18rl82 *rl82)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun 	const struct reg_sequence {
232*4882a593Smuzhiyun 		u16 reg;
233*4882a593Smuzhiyun 		u8 def;
234*4882a593Smuzhiyun 	} regs[] = {
235*4882a593Smuzhiyun 		{ 0x0011, 0x03 }, { 0x0012, 0x03 },
236*4882a593Smuzhiyun 		{ 0x001f, 0x02 }, { 0x0020, 0x02 },
237*4882a593Smuzhiyun 		{ 0x0031, 0x48 }, { 0x0032, 0x48 },
238*4882a593Smuzhiyun 		{ 0x0073, 0x80 }, { 0x0074, 0x07 },
239*4882a593Smuzhiyun 		{ 0x007b, 0xd0 }, { 0x007c, 0x02 },
240*4882a593Smuzhiyun 		{ 0x0079, 0x0a },
241*4882a593Smuzhiyun 		{ 0x0429, 0x0a }, { 0x045d, 0x01 },
242*4882a593Smuzhiyun 		{ 0x0529, 0x0a }, { 0x055d, 0x01 },
243*4882a593Smuzhiyun 		{ 0x060a, 0xb0 }, { 0x060b, 0xff }, { 0x060c, 0xff },
244*4882a593Smuzhiyun 		{ 0x0644, 0x90 }, { 0x0646, 0xd2 },
245*4882a593Smuzhiyun 	};
246*4882a593Smuzhiyun 	int i;
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(regs); i++)
249*4882a593Smuzhiyun 		rohm_deserializer_write(rl82, regs[i].reg, regs[i].def);
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	/* TP_INT - GPIO4 */
252*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0063, 0x08);
253*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x042f, 0x06);
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	/* TP_RST - GPIO3 */
256*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0060, 0x00);
257*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0061, 0x00);
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	/* LCD_BIAS_EN - GPIO2 */
260*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x005d, 0x00);
261*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x005e, 0x01);
262*4882a593Smuzhiyun 	mdelay(6);
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	return 0;
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun 
touch_china_v123awf3_r1_unprepare(struct bu18rl82 * rl82)267*4882a593Smuzhiyun static int touch_china_v123awf3_r1_unprepare(struct bu18rl82 *rl82)
268*4882a593Smuzhiyun {
269*4882a593Smuzhiyun 	/* LCD_BIAS_EN - GPIO2 */
270*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x005e, 0x00);
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	return 0;
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun 
touch_china_v123awf3_r1_enable(struct bu18rl82 * rl82)275*4882a593Smuzhiyun static int touch_china_v123awf3_r1_enable(struct bu18rl82 *rl82)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0091, 0x03);
278*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0090, 0x01);
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	/* RSEX - GPIO5 */
281*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0066, 0x00);
282*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0067, 0x01);
283*4882a593Smuzhiyun 	/* TP_RST - GPIO3 */
284*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0060, 0x00);
285*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0061, 0x01);
286*4882a593Smuzhiyun 	mdelay(20);
287*4882a593Smuzhiyun 	/* LCD_PON - GPIO1 */
288*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x005a, 0x00);
289*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x005b, 0x01);
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	return 0;
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun 
touch_china_v123awf3_r1_disable(struct bu18rl82 * rl82)294*4882a593Smuzhiyun static int touch_china_v123awf3_r1_disable(struct bu18rl82 *rl82)
295*4882a593Smuzhiyun {
296*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0090, 0x00);
297*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0091, 0x00);
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	/* LCD_PON - GPIO1 */
300*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x005b, 0x00);
301*4882a593Smuzhiyun 	mdelay(100);
302*4882a593Smuzhiyun 	/* TP_RST - GPIO3 */
303*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0061, 0x00);
304*4882a593Smuzhiyun 	/* RSEX - GPIO5 */
305*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0067, 0x00);
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	return 0;
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun 
touch_china_v123awf3_r1_backlight_enable(struct bu18rl82 * rl82)310*4882a593Smuzhiyun static int touch_china_v123awf3_r1_backlight_enable(struct bu18rl82 *rl82)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun 	/* BL_PWM - GPIO0 */
313*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0057, 0x00);
314*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0058, 0x02);
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	return 0;
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun 
touch_china_v123awf3_r1_backlight_disable(struct bu18rl82 * rl82)319*4882a593Smuzhiyun static int touch_china_v123awf3_r1_backlight_disable(struct bu18rl82 *rl82)
320*4882a593Smuzhiyun {
321*4882a593Smuzhiyun 	/* BL_PWM - GPIO0 */
322*4882a593Smuzhiyun 	rohm_deserializer_write(rl82, 0x0058, 0x00);
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	return 0;
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun static const struct panel_desc touch_china_v123awf3_r1 = {
328*4882a593Smuzhiyun 	.name			= "touch-china,v123awf3-r1",
329*4882a593Smuzhiyun 	.prepare		= touch_china_v123awf3_r1_prepare,
330*4882a593Smuzhiyun 	.unprepare		= touch_china_v123awf3_r1_unprepare,
331*4882a593Smuzhiyun 	.enable			= touch_china_v123awf3_r1_enable,
332*4882a593Smuzhiyun 	.disable		= touch_china_v123awf3_r1_disable,
333*4882a593Smuzhiyun 	.backlight_enable	= touch_china_v123awf3_r1_backlight_enable,
334*4882a593Smuzhiyun 	.backlight_disable	= touch_china_v123awf3_r1_backlight_disable,
335*4882a593Smuzhiyun };
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun static const struct udevice_id bu18rl82_of_match[] = {
338*4882a593Smuzhiyun 	{ .compatible = "csot,mg1561b01", .data = (ulong)&csot_mg1561b01 },
339*4882a593Smuzhiyun 	{ .compatible = "touch-china,v123awf3-r1", .data = (ulong)&touch_china_v123awf3_r1 },
340*4882a593Smuzhiyun 	{}
341*4882a593Smuzhiyun };
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun U_BOOT_DRIVER(panel_rohm_bu18rl82) = {
344*4882a593Smuzhiyun 	.name = "panel-rohm-bu18rl82",
345*4882a593Smuzhiyun 	.id = UCLASS_PANEL,
346*4882a593Smuzhiyun 	.of_match = bu18rl82_of_match,
347*4882a593Smuzhiyun 	.probe = bu18rl82_probe,
348*4882a593Smuzhiyun 	.priv_auto_alloc_size = sizeof(struct bu18rl82),
349*4882a593Smuzhiyun };
350