]>
Commit | Line | Data |
---|---|---|
a5464f2b HG |
1 | /* |
2 | * Hitachi tx18d42vm LVDS LCD panel driver | |
3 | * | |
4 | * (C) Copyright 2015 Hans de Goede <[email protected]> | |
5 | * | |
6 | * SPDX-License-Identifier: GPL-2.0+ | |
7 | */ | |
8 | ||
9 | #include <common.h> | |
10 | ||
11 | #include <asm/gpio.h> | |
12 | #include <errno.h> | |
13 | ||
14 | /* | |
15 | * Very simple write only SPI support, this does not use the generic SPI infra | |
16 | * because that assumes R/W SPI, requiring a MISO pin. Also the necessary glue | |
17 | * code alone would be larger then this minimal version. | |
18 | */ | |
19 | static void lcd_panel_spi_write(int cs, int clk, int mosi, | |
20 | unsigned int data, int bits) | |
21 | { | |
22 | int i, offset; | |
23 | ||
24 | gpio_direction_output(cs, 0); | |
25 | for (i = 0; i < bits; i++) { | |
26 | gpio_direction_output(clk, 0); | |
27 | offset = (bits - 1) - i; | |
28 | gpio_direction_output(mosi, (data >> offset) & 1); | |
29 | udelay(2); | |
30 | gpio_direction_output(clk, 1); | |
31 | udelay(2); | |
32 | } | |
33 | gpio_direction_output(cs, 1); | |
34 | udelay(2); | |
35 | } | |
36 | ||
37 | int hitachi_tx18d42vm_init(void) | |
38 | { | |
39 | const u16 init_data[] = { | |
40 | 0x0029, /* reset */ | |
41 | 0x0025, /* standby */ | |
42 | 0x0840, /* enable normally black */ | |
43 | 0x0430, /* enable FRC/dither */ | |
44 | 0x385f, /* enter test mode(1) */ | |
45 | 0x3ca4, /* enter test mode(2) */ | |
46 | 0x3409, /* enable SDRRS, enlarge OE width */ | |
47 | 0x4041, /* adopt 2 line / 1 dot */ | |
48 | }; | |
49 | int i, cs, clk, mosi, ret = 0; | |
50 | ||
51 | cs = name_to_gpio(CONFIG_VIDEO_LCD_SPI_CS); | |
52 | clk = name_to_gpio(CONFIG_VIDEO_LCD_SPI_SCLK); | |
53 | mosi = name_to_gpio(CONFIG_VIDEO_LCD_SPI_MOSI); | |
54 | ||
55 | if (cs == -1 || clk == -1 || mosi == 1) { | |
56 | printf("Error tx18d42vm spi gpio config is invalid\n"); | |
57 | return -EINVAL; | |
58 | } | |
59 | ||
60 | if (gpio_request(cs, "tx18d42vm-spi-cs") != 0 || | |
61 | gpio_request(clk, "tx18d42vm-spi-clk") != 0 || | |
62 | gpio_request(mosi, "tx18d42vm-spi-mosi") != 0) { | |
63 | printf("Error cannot request tx18d42vm spi gpios\n"); | |
64 | ret = -EBUSY; | |
65 | goto out; | |
66 | } | |
67 | ||
68 | for (i = 0; i < ARRAY_SIZE(init_data); i++) | |
69 | lcd_panel_spi_write(cs, clk, mosi, init_data[i], 16); | |
70 | ||
71 | mdelay(50); /* All the tx18d42vm drivers have a delay here ? */ | |
72 | ||
73 | lcd_panel_spi_write(cs, clk, mosi, 0x00ad, 16); /* display on */ | |
74 | ||
75 | out: | |
76 | gpio_free(mosi); | |
77 | gpio_free(clk); | |
78 | gpio_free(cs); | |
79 | ||
80 | return ret; | |
81 | } |