3 #include <linux/module.h>
5 #include <linux/slab.h>
14 #define BLIZZARD_REV_CODE 0x00
15 #define BLIZZARD_CONFIG 0x02
16 #define BLIZZARD_PLL_DIV 0x04
17 #define BLIZZARD_PLL_LOCK_RANGE 0x06
18 #define BLIZZARD_PLL_CLOCK_SYNTH_0 0x08
19 #define BLIZZARD_PLL_CLOCK_SYNTH_1 0x0a
20 #define BLIZZARD_PLL_MODE 0x0c
21 #define BLIZZARD_CLK_SRC 0x0e
22 #define BLIZZARD_MEM_BANK0_ACTIVATE 0x10
23 #define BLIZZARD_MEM_BANK0_STATUS 0x14
24 #define BLIZZARD_PANEL_CONFIGURATION 0x28
25 #define BLIZZARD_HDISP 0x2a
26 #define BLIZZARD_HNDP 0x2c
27 #define BLIZZARD_VDISP0 0x2e
28 #define BLIZZARD_VDISP1 0x30
29 #define BLIZZARD_VNDP 0x32
30 #define BLIZZARD_HSW 0x34
31 #define BLIZZARD_VSW 0x38
32 #define BLIZZARD_DISPLAY_MODE 0x68
33 #define BLIZZARD_INPUT_WIN_X_START_0 0x6c
34 #define BLIZZARD_DATA_SOURCE_SELECT 0x8e
35 #define BLIZZARD_DISP_MEM_DATA_PORT 0x90
36 #define BLIZZARD_DISP_MEM_READ_ADDR0 0x92
37 #define BLIZZARD_POWER_SAVE 0xE6
38 #define BLIZZARD_NDISP_CTRL_STATUS 0xE8
42 #define BLIZZARD_SRC_WRITE_LCD_BACKGROUND 0x00
43 #define BLIZZARD_SRC_WRITE_LCD_DESTRUCTIVE 0x01
44 #define BLIZZARD_SRC_WRITE_OVERLAY_ENABLE 0x04
45 #define BLIZZARD_SRC_DISABLE_OVERLAY 0x05
47 #define BLIZZARD_SRC_WRITE_LCD 0x00
48 #define BLIZZARD_SRC_BLT_LCD 0x06
50 #define BLIZZARD_COLOR_RGB565 0x01
51 #define BLIZZARD_COLOR_YUV420 0x09
53 #define BLIZZARD_VERSION_S1D13745 0x01
54 #define BLIZZARD_VERSION_S1D13744 0x02
56 #define MIPID_CMD_READ_DISP_ID 0x04
57 #define MIPID_CMD_READ_RED 0x06
58 #define MIPID_CMD_READ_GREEN 0x07
59 #define MIPID_CMD_READ_BLUE 0x08
60 #define MIPID_CMD_READ_DISP_STATUS 0x09
61 #define MIPID_CMD_RDDSDR 0x0F
62 #define MIPID_CMD_SLEEP_IN 0x10
63 #define MIPID_CMD_SLEEP_OUT 0x11
64 #define MIPID_CMD_DISP_OFF 0x28
65 #define MIPID_CMD_DISP_ON 0x29
91 static inline void blizzard_cmd(
u8 cmd)
96 static inline void blizzard_write(
u8 cmd,
const u8 *
buf,
int len)
102 static inline void blizzard_read(
u8 cmd,
u8 *
buf,
int len)
108 static u8 blizzard_read_reg(
u8 cmd)
111 blizzard_read(cmd, &data, 1);
116 int x,
int y,
int w,
int h)
140 tmp[13] = x_end >> 8;
142 tmp[15] = y_end >> 8;
167 int wlen,
u8 *rbuf,
int rlen)
174 spi_message_init(&
m);
176 memset(xfer, 0,
sizeof(xfer));
183 spi_message_add_tail(x, &
m);
190 spi_message_add_tail(x, &
m);
197 spi_message_add_tail(x, &
m);
209 spi_message_add_tail(x, &
m);
221 static inline void mipid_cmd(
struct spi_device *spi,
int cmd)
223 mipid_transfer(spi, cmd,
NULL, 0,
NULL, 0);
226 static inline void mipid_write(
struct spi_device *spi,
229 mipid_transfer(spi, reg, buf, len,
NULL, 0);
232 static inline void mipid_read(
struct spi_device *spi,
235 mipid_transfer(spi, reg,
NULL, 0, buf, len);
242 switch (data_lines) {
254 mipid_write(spi, 0x3a, (
u8 *)&par, 2);
257 static void send_init_string(
struct spi_device *spi)
259 u16 initpar[] = { 0x0102, 0x0100, 0x0100 };
260 mipid_write(spi, 0xc2, (
u8 *)initpar,
sizeof(initpar));
263 static void send_display_on(
struct spi_device *spi)
268 static void send_display_off(
struct spi_device *spi)
273 static void send_sleep_out(
struct spi_device *spi)
279 static void send_sleep_in(
struct spi_device *spi)
293 const char *panel_name;
307 dssdev->
panel.timings.y_res);
319 switch (rev & 0xfc) {
322 dev_info(&dssdev->
dev,
"s1d13744 LCD controller rev %d "
323 "initialized (CNF pins %x)\n", rev & 0x03, conf & 0x07);
327 dev_info(&dssdev->
dev,
"s1d13745 LCD controller rev %d "
328 "initialized (CNF pins %x)\n", rev & 0x03, conf & 0x07);
331 dev_err(&dssdev->
dev,
"invalid s1d1374x revision %02x\n", rev);
341 dev_dbg(&spi->
dev,
"MIPI display ID: %02x%02x%02x\n",
342 display_id[0], display_id[1], display_id[2]);
344 switch (display_id[0]) {
346 panel_name =
"lph8923";
349 panel_name =
"ls041y3";
352 dev_err(&dssdev->
dev,
"invalid display ID 0x%x\n",
358 dev_info(&dssdev->
dev,
"%s rev %02x LCD detected\n",
359 panel_name, display_id[1]);
362 send_init_string(spi);
363 set_data_lines(spi, 24);
364 send_display_on(spi);
394 send_display_off(spi);
414 .we_off_time = 18000,
415 .we_cycle_time = 36000,
418 .re_off_time = 27000,
419 .re_cycle_time = 36000,
421 .access_time = 27000,
422 .cs_off_time = 36000,
439 level = dev->
props.brightness;
443 dev_dbg(&dssdev->
dev,
"update brightness to %d\n", level);
459 return dev->
props.brightness;
465 .get_brightness = n8x0_bl_get_intensity,
466 .update_status = n8x0_bl_update_status,
482 s_drv_data.dssdev =
dssdev;
488 dssdev->
panel.timings.x_res = 800;
489 dssdev->
panel.timings.y_res = 480;
490 dssdev->
ctrl.pixel_size = 16;
491 dssdev->
ctrl.rfbi_timings = n8x0_panel_timings;
494 memset(&props, 0,
sizeof(props));
495 props.max_brightness = 127;
498 dssdev, &n8x0_bl_ops, &props);
501 dev_err(&dssdev->
dev,
"register backlight failed\n");
505 ddata->
bldev = bldev;
509 bldev->
props.brightness = 127;
511 n8x0_bl_update_status(bldev);
523 bldev = ddata->
bldev;
525 n8x0_bl_update_status(bldev);
542 r = n8x0_panel_power_on(dssdev);
568 n8x0_panel_power_off(dssdev);
587 n8x0_panel_power_off(dssdev);
609 r = n8x0_panel_power_on(dssdev);
628 *xres = dssdev->
panel.timings.x_res;
629 *yres = dssdev->
panel.timings.y_res;
632 static void update_done(
void *
data)
645 dw = dssdev->
panel.timings.x_res;
646 dh = dssdev->
panel.timings.y_res;
648 if (x != 0 || y != 0 || w != dw || h != dh) {
649 dev_err(&dssdev->
dev,
"invaid update region %d, %d, %d, %d\n",
657 blizzard_ctrl_setup_update(dssdev, x, y, w, h);
681 .probe = n8x0_panel_probe,
682 .remove = n8x0_panel_remove,
684 .enable = n8x0_panel_enable,
685 .disable = n8x0_panel_disable,
686 .suspend = n8x0_panel_suspend,
687 .resume = n8x0_panel_resume,
689 .update = n8x0_panel_update,
690 .sync = n8x0_panel_sync,
692 .get_resolution = n8x0_panel_get_resolution,
696 .name =
"n8x0_panel",
703 static int mipid_spi_probe(
struct spi_device *spi)
709 s_drv_data.spidev =
spi;
714 static int mipid_spi_remove(
struct spi_device *spi)
725 .probe = mipid_spi_probe,
729 static int __init n8x0_panel_drv_init(
void)
735 pr_err(
"n8x0_panel: spi driver registration failed\n");
741 pr_err(
"n8x0_panel: dss driver registration failed\n");
742 spi_unregister_driver(&mipid_spi_driver);
749 static void __exit n8x0_panel_drv_exit(
void)
751 spi_unregister_driver(&mipid_spi_driver);