2 * This file is part of the coreboot project.
4 * Copyright 2015 Google Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 #include <console/console.h>
21 #include <soc/addressmap.h>
22 #include <soc/clock.h>
23 #include <device/device.h>
24 #include <soc/nvidia/tegra/types.h>
26 #include <soc/display.h>
27 #include <soc/mipi_dsi.h>
28 #include <soc/tegra_dsi.h>
29 #include "panel-jdi-lpm102a188a.h"
31 struct panel_jdi jdi_data
[NUM_DSI
];
33 int panel_jdi_prepare(struct panel_jdi
*jdi
)
41 ret
= mipi_dsi_dcs_set_column_address(jdi
->dsi
, 0,
42 jdi
->mode
->xres
/ 2 - 1); // 2560/2
44 printk(BIOS_ERR
, "failed to set column address: %d\n", ret
);
46 ret
= mipi_dsi_dcs_set_column_address(jdi
->dsi
->slave
, 0,
47 jdi
->mode
->xres
/ 2 - 1);
49 printk(BIOS_ERR
, "failed to set column address: %d\n", ret
);
51 ret
= mipi_dsi_dcs_set_page_address(jdi
->dsi
, 0,
54 printk(BIOS_ERR
, "failed to set page address: %d\n", ret
);
56 ret
= mipi_dsi_dcs_set_page_address(jdi
->dsi
->slave
, 0,
59 printk(BIOS_ERR
, "failed to set page address: %d\n", ret
);
61 ret
= mipi_dsi_dcs_set_tear_on(jdi
->dsi
, MIPI_DSI_DCS_TEAR_MODE_VBLANK
);
63 printk(BIOS_ERR
, "failed to set tear on: %d\n", ret
);
65 ret
= mipi_dsi_dcs_set_tear_on(jdi
->dsi
->slave
,
66 MIPI_DSI_DCS_TEAR_MODE_VBLANK
);
68 printk(BIOS_ERR
, "failed to set tear on: %d\n", ret
);
70 ret
= mipi_dsi_dcs_set_address_mode(jdi
->dsi
, false, false, false,
71 false, false, false, false, false);
73 printk(BIOS_ERR
, "failed to set address mode: %d\n", ret
);
75 ret
= mipi_dsi_dcs_set_address_mode(jdi
->dsi
->slave
, false, false,
76 false, false, false, false, false, false);
78 printk(BIOS_ERR
, "failed to set address mode: %d\n", ret
);
80 ret
= mipi_dsi_dcs_set_pixel_format(jdi
->dsi
, 0x77);
82 printk(BIOS_ERR
, "failed to set pixel format: %d\n", ret
);
84 ret
= mipi_dsi_dcs_set_pixel_format(jdi
->dsi
->slave
, 0x77);
86 printk(BIOS_ERR
, "failed to set pixel format: %d\n", ret
);
89 ret
= mipi_dsi_dcs_write(jdi
->dsi
, 0x51, &data
, 1);
91 printk(BIOS_ERR
, "failed to set 0x51: %d\n", ret
);
94 ret
= mipi_dsi_dcs_write(jdi
->dsi
->slave
, 0x51, &data
, 1);
96 printk(BIOS_ERR
, "failed to set 0x51: %d\n", ret
);
99 ret
= mipi_dsi_dcs_write(jdi
->dsi
, 0x53, &data
, 1);
101 printk(BIOS_ERR
, "failed to set 0x53: %d\n", ret
);
104 ret
= mipi_dsi_dcs_write(jdi
->dsi
->slave
, 0x53, &data
, 1);
106 printk(BIOS_ERR
, "failed to set 0x53: %d\n", ret
);
109 ret
= mipi_dsi_dcs_write(jdi
->dsi
, 0x55, &data
, 1);
111 printk(BIOS_ERR
, "failed to set 0x55: %d\n", ret
);
114 ret
= mipi_dsi_dcs_write(jdi
->dsi
->slave
, 0x55, &data
, 1);
116 printk(BIOS_ERR
, "failed to set 0x55: %d\n", ret
);
118 ret
= mipi_dsi_dcs_exit_sleep_mode(jdi
->dsi
);
120 printk(BIOS_ERR
, "failed to exit sleep mode: %d\n", ret
);
122 ret
= mipi_dsi_dcs_exit_sleep_mode(jdi
->dsi
->slave
);
124 printk(BIOS_ERR
, "failed to exit sleep mode: %d\n", ret
);
127 ret
= mipi_dsi_dcs_set_display_on(jdi
->dsi
);
129 printk(BIOS_ERR
, "failed to set display on: %d\n", ret
);
131 ret
= mipi_dsi_dcs_set_display_on(jdi
->dsi
->slave
);
133 printk(BIOS_ERR
, "failed to set display on: %d\n", ret
);
141 static int panel_jdi_enslave(struct mipi_dsi_device
*master
,
142 struct mipi_dsi_device
*slave
)
146 ret
= mipi_dsi_attach(master
);
153 static int panel_jdi_liberate(struct mipi_dsi_device
*master
,
154 struct mipi_dsi_device
*slave
)
158 ret
= mipi_dsi_detach(master
);
165 static const struct mipi_dsi_master_ops panel_jdi_master_ops
= {
166 .enslave
= panel_jdi_enslave
,
167 .liberate
= panel_jdi_liberate
,
170 struct panel_jdi
*panel_jdi_dsi_probe(struct mipi_dsi_device
*dsi
)
172 static int index
= 0;
173 struct panel_jdi
*jdi
;
176 if (index
>= NUM_DSI
)
177 return (void *)-EPTR
;
179 jdi
= &jdi_data
[index
++];
184 dsi
->format
= MIPI_DSI_FMT_RGB888
;
188 ret
= mipi_dsi_attach(dsi
);
190 printk(BIOS_ERR
, "mipi_dsi_attach() failed: %d\n", ret
);
191 return (void *)-EPTR
;
194 ret
= mipi_dsi_enslave(dsi
->master
, dsi
);
196 printk(BIOS_ERR
, "mipi_dsi_enslave() failed: %d\n",
198 return (void *)-EPTR
;
204 dsi
->ops
= &panel_jdi_master_ops
;
208 jdi
->height_mm
= 148;