coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
panel-jdi-lpm102a188a.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <stdint.h>
5 #include <delay.h>
6 #include <soc/addressmap.h>
7 #include <soc/clock.h>
8 #include <device/device.h>
10 #include <soc/display.h>
11 #include <soc/mipi_dsi.h>
12 #include <soc/tegra_dsi.h>
13 
14 #include "../chip.h"
15 #include "panel-jdi-lpm102a188a.h"
16 
17 struct panel_jdi jdi_data[NUM_DSI];
18 
19 int panel_jdi_prepare(struct panel_jdi *jdi)
20 {
21  int ret;
22  u8 data;
23 
24  if (jdi->enabled)
25  return 0;
26 
28  jdi->mode->xres / 2 - 1); // 2560/2
29  if (ret < 0)
30  printk(BIOS_ERR, "failed to set column address: %d\n", ret);
31 
33  jdi->mode->xres / 2 - 1);
34  if (ret < 0)
35  printk(BIOS_ERR, "failed to set column address: %d\n", ret);
36 
37  ret = mipi_dsi_dcs_set_page_address(jdi->dsi, 0,
38  jdi->mode->yres - 1);
39  if (ret < 0)
40  printk(BIOS_ERR, "failed to set page address: %d\n", ret);
41 
43  jdi->mode->yres - 1);
44  if (ret < 0)
45  printk(BIOS_ERR, "failed to set page address: %d\n", ret);
46 
48  if (ret < 0)
49  printk(BIOS_ERR, "failed to set tear on: %d\n", ret);
50 
53  if (ret < 0)
54  printk(BIOS_ERR, "failed to set tear on: %d\n", ret);
55 
56  ret = mipi_dsi_dcs_set_address_mode(jdi->dsi, false, false, false,
57  false, false, false, false, false);
58  if (ret < 0)
59  printk(BIOS_ERR, "failed to set address mode: %d\n", ret);
60 
61  ret = mipi_dsi_dcs_set_address_mode(jdi->dsi->slave, false, false,
62  false, false, false, false, false, false);
63  if (ret < 0)
64  printk(BIOS_ERR, "failed to set address mode: %d\n", ret);
65 
66  ret = mipi_dsi_dcs_set_pixel_format(jdi->dsi, 0x77);
67  if (ret < 0)
68  printk(BIOS_ERR, "failed to set pixel format: %d\n", ret);
69 
70  ret = mipi_dsi_dcs_set_pixel_format(jdi->dsi->slave, 0x77);
71  if (ret < 0)
72  printk(BIOS_ERR, "failed to set pixel format: %d\n", ret);
73 
74  data = 0xFF;
75  ret = mipi_dsi_dcs_write(jdi->dsi, 0x51, &data, 1);
76  if (ret < 0)
77  printk(BIOS_ERR, "failed to set 0x51: %d\n", ret);
78 
79  data = 0xFF;
80  ret = mipi_dsi_dcs_write(jdi->dsi->slave, 0x51, &data, 1);
81  if (ret < 0)
82  printk(BIOS_ERR, "failed to set 0x51: %d\n", ret);
83 
84  data = 0x24;
85  ret = mipi_dsi_dcs_write(jdi->dsi, 0x53, &data, 1);
86  if (ret < 0)
87  printk(BIOS_ERR, "failed to set 0x53: %d\n", ret);
88 
89  data = 0x24;
90  ret = mipi_dsi_dcs_write(jdi->dsi->slave, 0x53, &data, 1);
91  if (ret < 0)
92  printk(BIOS_ERR, "failed to set 0x53: %d\n", ret);
93 
94  data = 0x00;
95  ret = mipi_dsi_dcs_write(jdi->dsi, 0x55, &data, 1);
96  if (ret < 0)
97  printk(BIOS_ERR, "failed to set 0x55: %d\n", ret);
98 
99  data = 0x00;
100  ret = mipi_dsi_dcs_write(jdi->dsi->slave, 0x55, &data, 1);
101  if (ret < 0)
102  printk(BIOS_ERR, "failed to set 0x55: %d\n", ret);
103 
104  ret = mipi_dsi_dcs_exit_sleep_mode(jdi->dsi);
105  if (ret < 0)
106  printk(BIOS_ERR, "failed to exit sleep mode: %d\n", ret);
107 
109  if (ret < 0)
110  printk(BIOS_ERR, "failed to exit sleep mode: %d\n", ret);
111  mdelay(150);
112 
113  ret = mipi_dsi_dcs_set_display_on(jdi->dsi);
114  if (ret < 0)
115  printk(BIOS_ERR, "failed to set display on: %d\n", ret);
116 
118  if (ret < 0)
119  printk(BIOS_ERR, "failed to set display on: %d\n", ret);
120  mdelay(50);
121 
122  jdi->enabled = true;
123 
124  return 0;
125 }
126 
127 static int panel_jdi_enslave(struct mipi_dsi_device *master,
128  struct mipi_dsi_device *slave)
129 {
130  int ret;
131 
132  ret = mipi_dsi_attach(master);
133  if (ret < 0)
134  return ret;
135 
136  return ret;
137 }
138 
139 static int panel_jdi_liberate(struct mipi_dsi_device *master,
140  struct mipi_dsi_device *slave)
141 {
142  int ret;
143 
144  ret = mipi_dsi_detach(master);
145  if (ret < 0)
146  return ret;
147 
148  return 0;
149 }
150 
151 static const struct mipi_dsi_master_ops panel_jdi_master_ops = {
153  .liberate = panel_jdi_liberate,
154 };
155 
157 {
158  static int index = 0;
159  struct panel_jdi *jdi;
160  int ret;
161 
162  if (index >= NUM_DSI)
163  return (void *)-EPTR;
164 
165  jdi = &jdi_data[index++];
166 
167  jdi->dsi = dsi;
168 
169  dsi->lanes = 4;
171  dsi->mode_flags = 0;
172 
173  if (dsi->master) {
174  ret = mipi_dsi_attach(dsi);
175  if (ret < 0) {
176  printk(BIOS_ERR, "mipi_dsi_attach() failed: %d\n", ret);
177  return (void *)-EPTR;
178  }
179 
180  ret = mipi_dsi_enslave(dsi->master, dsi);
181  if (ret < 0) {
182  printk(BIOS_ERR, "mipi_dsi_enslave() failed: %d\n",
183  ret);
184  return (void *)-EPTR;
185  }
186 
187  return jdi;
188  }
189 
191 
192  jdi->enabled = 0;
193  jdi->width_mm = 211;
194  jdi->height_mm = 148;
195 
196  return jdi;
197 }
#define printk(level,...)
Definition: stdlib.h:16
void mdelay(unsigned int msecs)
Definition: delay.c:2
@ MIPI_DSI_FMT_RGB888
Definition: dsi_common.h:13
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
int mipi_dsi_enslave(struct mipi_dsi_device *master, struct mipi_dsi_device *slave)
mipi_dsi_enslave() - use a MIPI DSI peripheral as slave for dual-channel operation
Definition: mipi_dsi.c:125
int mipi_dsi_dcs_set_tear_on(struct mipi_dsi_device *dsi, enum mipi_dsi_dcs_tear_mode mode)
mipi_dsi_dcs_set_tear_on() - turn on the display module's Tearing Effect output signal on the TE sign...
Definition: mipi_dsi.c:333
int mipi_dsi_dcs_exit_sleep_mode(struct mipi_dsi_device *dsi)
mipi_dsi_dcs_exit_sleep_mode() - enable all blocks inside the display module
Definition: mipi_dsi.c:250
int mipi_dsi_dcs_set_display_on(struct mipi_dsi_device *dsi)
mipi_dsi_dcs_set_display_on() - start displaying the image data on the display device
Definition: mipi_dsi.c:268
int mipi_dsi_dcs_set_page_address(struct mipi_dsi_device *dsi, u16 start, u16 end)
mipi_dsi_dcs_set_page_address() - define the page extent of the frame memory accessed by the host pro...
Definition: mipi_dsi.c:311
int mipi_dsi_detach(struct mipi_dsi_device *dsi)
mipi_dsi_detach - detach a DSI device from its DSI host
Definition: mipi_dsi.c:107
int mipi_dsi_dcs_set_pixel_format(struct mipi_dsi_device *dsi, u8 format)
mipi_dsi_dcs_set_pixel_format() - sets the pixel format for the RGB image data used by the interface
Definition: mipi_dsi.c:355
int mipi_dsi_dcs_set_address_mode(struct mipi_dsi_device *dsi, bool reverse_page_address, bool reverse_col_address, bool reverse_page_col_address, bool refresh_from_bottom, bool reverse_rgb, bool latch_right_to_left, bool flip_horizontal, bool flip_vertical)
mipi_dsi_dcs_set_address_mode() - sets the data order for forward transfers from the host to the peri...
Definition: mipi_dsi.c:382
int mipi_dsi_attach(struct mipi_dsi_device *dsi)
mipi_dsi_attach - attach a DSI device to its DSI host
Definition: mipi_dsi.c:93
@ MIPI_DSI_DCS_TEAR_MODE_VBLANK
mipi_dsi_dcs_tear_mode - Tearing Effect Output Line modeThe TE output line consists of V-Blanking inf...
Definition: mipi_dsi.h:152
int mipi_dsi_dcs_set_column_address(struct mipi_dsi_device *dsi, u16 start, u16 end)
mipi_dsi_dcs_set_column_address() - define the column extent of the frame memory accessed by the host...
Definition: mipi_dsi.c:288
ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd, const void *data, size_t len)
mipi_dsi_dcs_write() - send DCS write command
Definition: mipi_dsi.c:173
struct panel_jdi jdi_data[NUM_DSI]
struct panel_jdi * panel_jdi_dsi_probe(struct mipi_dsi_device *dsi)
static int panel_jdi_liberate(struct mipi_dsi_device *master, struct mipi_dsi_device *slave)
static const struct mipi_dsi_master_ops panel_jdi_master_ops
static int panel_jdi_enslave(struct mipi_dsi_device *master, struct mipi_dsi_device *slave)
int panel_jdi_prepare(struct panel_jdi *jdi)
#define EPTR
Definition: types.h:11
static struct spi_slave slave
Definition: spiconsole.c:7
uint8_t u8
Definition: stdint.h:45
mipi_dsi_device - DSI peripheral device
Definition: mipi_dsi.h:123
struct mipi_dsi_device * slave
slave interface for dual-channel peripherals
Definition: mipi_dsi.h:133
enum mipi_dsi_pixel_format format
pixel format for video mode
Definition: mipi_dsi.h:128
const struct mipi_dsi_master_ops * ops
callbacks for master/slave setup
Definition: mipi_dsi.h:131
unsigned long mode_flags
DSI operation mode related flags.
Definition: mipi_dsi.h:129
struct mipi_dsi_device * master
master interface for dual-channel peripherals
Definition: mipi_dsi.h:132
unsigned int lanes
number of active data lanes
Definition: mipi_dsi.h:127
int(* enslave)(struct mipi_dsi_device *master, struct mipi_dsi_device *slave)
Definition: mipi_dsi.h:110
struct mipi_dsi_device * dsi
unsigned int width_mm
unsigned int height_mm
const struct soc_nvidia_tegra210_config * mode
@ NUM_DSI
Definition: tegra_dsi.h:159