1b8329acfSSiarhei Siamashka /* 2b8329acfSSiarhei Siamashka * (C) 2015 Siarhei Siamashka <siarhei.siamashka@gmail.com> 3b8329acfSSiarhei Siamashka * 4b8329acfSSiarhei Siamashka * SPDX-License-Identifier: GPL-2.0+ 5b8329acfSSiarhei Siamashka */ 6b8329acfSSiarhei Siamashka 7b8329acfSSiarhei Siamashka /* 8b8329acfSSiarhei Siamashka * Support for the SSD2828 bridge chip, which can take pixel data coming 9b8329acfSSiarhei Siamashka * from a parallel LCD interface and translate it on the flight into MIPI DSI 10b8329acfSSiarhei Siamashka * interface for driving a MIPI compatible TFT display. 11b8329acfSSiarhei Siamashka * 12b8329acfSSiarhei Siamashka * Implemented as a utility function. To be used from display drivers, which are 13b8329acfSSiarhei Siamashka * responsible for driving parallel LCD hardware in front of the video pipeline. 14b8329acfSSiarhei Siamashka */ 15b8329acfSSiarhei Siamashka 16b8329acfSSiarhei Siamashka #ifndef _SSD2828_H 17b8329acfSSiarhei Siamashka #define _SSD2828_H 18b8329acfSSiarhei Siamashka 19b8329acfSSiarhei Siamashka struct ctfb_res_modes; 20b8329acfSSiarhei Siamashka 21b8329acfSSiarhei Siamashka struct ssd2828_config { 22b8329acfSSiarhei Siamashka /*********************************************************************/ 23b8329acfSSiarhei Siamashka /* SSD2828 configuration */ 24b8329acfSSiarhei Siamashka /*********************************************************************/ 25b8329acfSSiarhei Siamashka 26b8329acfSSiarhei Siamashka /* 27b8329acfSSiarhei Siamashka * The pins, which are used for SPI communication. This is only used 28b8329acfSSiarhei Siamashka * for configuring SSD2828, so the performance is irrelevant (only 29b8329acfSSiarhei Siamashka * around a hundred of bytes is moved). Also these can be any arbitrary 30b8329acfSSiarhei Siamashka * GPIO pins (not necessarily the pins having hardware SPI function). 31b8329acfSSiarhei Siamashka * Moreover, the 'sdo' pin may be even not wired up in some devices. 32b8329acfSSiarhei Siamashka * 33b8329acfSSiarhei Siamashka * These configuration variables need to be set as pin numbers for 34b8329acfSSiarhei Siamashka * the standard u-boot GPIO interface (gpio_get_value/gpio_set_value 35b8329acfSSiarhei Siamashka * functions). Note that -1 value can be used for the pins, which are 36b8329acfSSiarhei Siamashka * not really wired up. 37b8329acfSSiarhei Siamashka */ 38b8329acfSSiarhei Siamashka int csx_pin; 39b8329acfSSiarhei Siamashka int sck_pin; 40b8329acfSSiarhei Siamashka int sdi_pin; 41b8329acfSSiarhei Siamashka int sdo_pin; 42b8329acfSSiarhei Siamashka /* SSD2828 reset pin (shared with LCD panel reset) */ 43b8329acfSSiarhei Siamashka int reset_pin; 44b8329acfSSiarhei Siamashka 45b8329acfSSiarhei Siamashka /* 46b8329acfSSiarhei Siamashka * The SSD2828 has its own dedicated clock source 'tx_clk' (connected 47b8329acfSSiarhei Siamashka * to TX_CLK_XIO/TX_CLK_XIN pins), which is necessary at least for 48b8329acfSSiarhei Siamashka * clocking SPI after reset. The exact clock speed is not strictly, 49b8329acfSSiarhei Siamashka * defined, but the datasheet says that it must be somewhere in the 50*dddccd69SSiarhei Siamashka * 8MHz - 30MHz range (see "TX_CLK Timing" section). It can be also 51*dddccd69SSiarhei Siamashka * used as a reference clock for PLL. If the exact clock frequency 52*dddccd69SSiarhei Siamashka * is known, then it can be specified here. If it is unknown, or the 53*dddccd69SSiarhei Siamashka * information is not trustworthy, then it can be set to 0. 54*dddccd69SSiarhei Siamashka * 55*dddccd69SSiarhei Siamashka * If unsure, set to 0. 56b8329acfSSiarhei Siamashka */ 57b8329acfSSiarhei Siamashka int ssd2828_tx_clk_khz; 58b8329acfSSiarhei Siamashka 59b8329acfSSiarhei Siamashka /* 60b8329acfSSiarhei Siamashka * This is not a property of the used LCD panel, but more like a 61b8329acfSSiarhei Siamashka * property of the SSD2828 wiring. See the "SSD2828QN4 RGB data 62b8329acfSSiarhei Siamashka * arrangement" table in the datasheet. The SSD2828 pins are arranged 63b8329acfSSiarhei Siamashka * in such a way that 18bpp and 24bpp configurations are completely 64b8329acfSSiarhei Siamashka * incompatible with each other. 65b8329acfSSiarhei Siamashka * 66b8329acfSSiarhei Siamashka * Depending on the color depth, this must be set to 16, 18 or 24. 67b8329acfSSiarhei Siamashka */ 68b8329acfSSiarhei Siamashka int ssd2828_color_depth; 69b8329acfSSiarhei Siamashka 70b8329acfSSiarhei Siamashka /*********************************************************************/ 71b8329acfSSiarhei Siamashka /* LCD panel configuration */ 72b8329acfSSiarhei Siamashka /*********************************************************************/ 73b8329acfSSiarhei Siamashka 74b8329acfSSiarhei Siamashka /* 75b8329acfSSiarhei Siamashka * The number of lanes in the MIPI DSI interface. May vary from 1 to 4. 76b8329acfSSiarhei Siamashka * 77b8329acfSSiarhei Siamashka * This information can be found in the LCD panel datasheet. 78b8329acfSSiarhei Siamashka */ 79b8329acfSSiarhei Siamashka int mipi_dsi_number_of_data_lanes; 80b8329acfSSiarhei Siamashka 81b8329acfSSiarhei Siamashka /* 82b8329acfSSiarhei Siamashka * Data transfer bit rate per lane. Please note that it is expected 83b8329acfSSiarhei Siamashka * to be higher than the pixel clock rate of the used video mode when 84b8329acfSSiarhei Siamashka * multiplied by the number of lanes. This is perfectly normal because 85b8329acfSSiarhei Siamashka * MIPI DSI handles data transfers in periodic bursts, and uses the 86b8329acfSSiarhei Siamashka * idle time between bursts for sending configuration information and 87b8329acfSSiarhei Siamashka * commands. Or just for saving power. 88b8329acfSSiarhei Siamashka * 89b8329acfSSiarhei Siamashka * The necessary Mbps/lane information can be found in the LCD panel 90b8329acfSSiarhei Siamashka * datasheet. Note that the transfer rate can't be always set precisely 91b8329acfSSiarhei Siamashka * and it may be rounded *up* (introducing no more than 10Mbps error). 92b8329acfSSiarhei Siamashka */ 93b8329acfSSiarhei Siamashka int mipi_dsi_bitrate_per_data_lane_mbps; 94b8329acfSSiarhei Siamashka 95b8329acfSSiarhei Siamashka /* 96b8329acfSSiarhei Siamashka * Setting this to 1 enforces packing of 18bpp pixel data in 24bpp 97b8329acfSSiarhei Siamashka * envelope when sending it over the MIPI DSI link. 98b8329acfSSiarhei Siamashka * 99b8329acfSSiarhei Siamashka * If unsure, set to 0. 100b8329acfSSiarhei Siamashka */ 101b8329acfSSiarhei Siamashka int mipi_dsi_loosely_packed_pixel_format; 102b8329acfSSiarhei Siamashka 103b8329acfSSiarhei Siamashka /* 104b8329acfSSiarhei Siamashka * According to the "Example for system sleep in and out" section in 105b8329acfSSiarhei Siamashka * the SSD2828 datasheet, some LCD panel specific delays are necessary 106b8329acfSSiarhei Siamashka * after MIPI DCS commands EXIT_SLEEP_MODE and SET_DISPLAY_ON. 107b8329acfSSiarhei Siamashka * 108b8329acfSSiarhei Siamashka * For example, Allwinner uses 100 milliseconds delay after 109b8329acfSSiarhei Siamashka * EXIT_SLEEP_MODE and 200 milliseconds delay after SET_DISPLAY_ON. 110b8329acfSSiarhei Siamashka */ 111b8329acfSSiarhei Siamashka int mipi_dsi_delay_after_exit_sleep_mode_ms; 112b8329acfSSiarhei Siamashka int mipi_dsi_delay_after_set_display_on_ms; 113b8329acfSSiarhei Siamashka }; 114b8329acfSSiarhei Siamashka 115b8329acfSSiarhei Siamashka /* 116b8329acfSSiarhei Siamashka * Initialize the SSD2828 chip. It needs the 'ssd2828_config' structure 117b8329acfSSiarhei Siamashka * and also the video mode timings. 118b8329acfSSiarhei Siamashka * 119b8329acfSSiarhei Siamashka * The right place to insert this function call is after the parallel LCD 120b8329acfSSiarhei Siamashka * interface is initialized and before turning on the backlight. This is 121b8329acfSSiarhei Siamashka * advised in the "Example for system sleep in and out" section of the 122*dddccd69SSiarhei Siamashka * SSD2828 datasheet. And also SS2828 may use 'pclk' as the clock source 123*dddccd69SSiarhei Siamashka * for PLL, which means that the input signal must be already there. 124b8329acfSSiarhei Siamashka */ 125b8329acfSSiarhei Siamashka int ssd2828_init(const struct ssd2828_config *cfg, 126b8329acfSSiarhei Siamashka const struct ctfb_res_modes *mode); 127b8329acfSSiarhei Siamashka 128b8329acfSSiarhei Siamashka #endif 129