tree: drop last paragraph of GPL copyright header
[coreboot.git] / src / soc / nvidia / tegra210 / jdi_25x18_display / panel-jdi-lpm102a188a.c
blobfc48aa78498e156b82d6f88ce9d9ea6b3369d941
1 /*
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>
16 #include <arch/io.h>
17 #include <stdint.h>
18 #include <lib.h>
19 #include <stdlib.h>
20 #include <delay.h>
21 #include <soc/addressmap.h>
22 #include <soc/clock.h>
23 #include <device/device.h>
24 #include <soc/nvidia/tegra/types.h>
25 #include "../chip.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)
35 int ret;
36 u8 data;
38 if (jdi->enabled)
39 return 0;
41 ret = mipi_dsi_dcs_set_column_address(jdi->dsi, 0,
42 jdi->mode->xres / 2 - 1); // 2560/2
43 if (ret < 0)
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);
48 if (ret < 0)
49 printk(BIOS_ERR, "failed to set column address: %d\n", ret);
51 ret = mipi_dsi_dcs_set_page_address(jdi->dsi, 0,
52 jdi->mode->yres - 1);
53 if (ret < 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,
57 jdi->mode->yres - 1);
58 if (ret < 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);
62 if (ret < 0)
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);
67 if (ret < 0)
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);
72 if (ret < 0)
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);
77 if (ret < 0)
78 printk(BIOS_ERR, "failed to set address mode: %d\n", ret);
80 ret = mipi_dsi_dcs_set_pixel_format(jdi->dsi, 0x77);
81 if (ret < 0)
82 printk(BIOS_ERR, "failed to set pixel format: %d\n", ret);
84 ret = mipi_dsi_dcs_set_pixel_format(jdi->dsi->slave, 0x77);
85 if (ret < 0)
86 printk(BIOS_ERR, "failed to set pixel format: %d\n", ret);
88 data = 0xFF;
89 ret = mipi_dsi_dcs_write(jdi->dsi, 0x51, &data, 1);
90 if (ret < 0)
91 printk(BIOS_ERR, "failed to set 0x51: %d\n", ret);
93 data = 0xFF;
94 ret = mipi_dsi_dcs_write(jdi->dsi->slave, 0x51, &data, 1);
95 if (ret < 0)
96 printk(BIOS_ERR, "failed to set 0x51: %d\n", ret);
98 data = 0x24;
99 ret = mipi_dsi_dcs_write(jdi->dsi, 0x53, &data, 1);
100 if (ret < 0)
101 printk(BIOS_ERR, "failed to set 0x53: %d\n", ret);
103 data = 0x24;
104 ret = mipi_dsi_dcs_write(jdi->dsi->slave, 0x53, &data, 1);
105 if (ret < 0)
106 printk(BIOS_ERR, "failed to set 0x53: %d\n", ret);
108 data = 0x00;
109 ret = mipi_dsi_dcs_write(jdi->dsi, 0x55, &data, 1);
110 if (ret < 0)
111 printk(BIOS_ERR, "failed to set 0x55: %d\n", ret);
113 data = 0x00;
114 ret = mipi_dsi_dcs_write(jdi->dsi->slave, 0x55, &data, 1);
115 if (ret < 0)
116 printk(BIOS_ERR, "failed to set 0x55: %d\n", ret);
118 ret = mipi_dsi_dcs_exit_sleep_mode(jdi->dsi);
119 if (ret < 0)
120 printk(BIOS_ERR, "failed to exit sleep mode: %d\n", ret);
122 ret = mipi_dsi_dcs_exit_sleep_mode(jdi->dsi->slave);
123 if (ret < 0)
124 printk(BIOS_ERR, "failed to exit sleep mode: %d\n", ret);
125 mdelay(150);
127 ret = mipi_dsi_dcs_set_display_on(jdi->dsi);
128 if (ret < 0)
129 printk(BIOS_ERR, "failed to set display on: %d\n", ret);
131 ret = mipi_dsi_dcs_set_display_on(jdi->dsi->slave);
132 if (ret < 0)
133 printk(BIOS_ERR, "failed to set display on: %d\n", ret);
134 mdelay(50);
136 jdi->enabled = true;
138 return 0;
141 static int panel_jdi_enslave(struct mipi_dsi_device *master,
142 struct mipi_dsi_device *slave)
144 int ret;
146 ret = mipi_dsi_attach(master);
147 if (ret < 0)
148 return ret;
150 return ret;
153 static int panel_jdi_liberate(struct mipi_dsi_device *master,
154 struct mipi_dsi_device *slave)
156 int ret;
158 ret = mipi_dsi_detach(master);
159 if (ret < 0)
160 return ret;
162 return 0;
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;
174 int ret;
176 if (index >= NUM_DSI)
177 return (void *)-EPTR;
179 jdi = &jdi_data[index++];
181 jdi->dsi = dsi;
183 dsi->lanes = 4;
184 dsi->format = MIPI_DSI_FMT_RGB888;
185 dsi->mode_flags = 0;
187 if (dsi->master) {
188 ret = mipi_dsi_attach(dsi);
189 if (ret < 0) {
190 printk(BIOS_ERR, "mipi_dsi_attach() failed: %d\n", ret);
191 return (void *)-EPTR;
194 ret = mipi_dsi_enslave(dsi->master, dsi);
195 if (ret < 0) {
196 printk(BIOS_ERR, "mipi_dsi_enslave() failed: %d\n",
197 ret);
198 return (void *)-EPTR;
201 return jdi;
204 dsi->ops = &panel_jdi_master_ops;
206 jdi->enabled = 0;
207 jdi->width_mm = 211;
208 jdi->height_mm = 148;
210 return jdi;