blob: c8709590c75841330846bd33cf7cd07e1cac09d7 [file] [log] [blame]
Wei Ni6555e692012-10-17 13:24:50 +00001/*
2 * (C) Copyright 2010
3 * NVIDIA Corporation <www.nvidia.com>
4 *
5 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 */
23
24#ifndef __ASM_ARCH_TEGRA_DISPLAY_H
25#define __ASM_ARCH_TEGRA_DISPLAY_H
26
27#include <asm/arch/dc.h>
28#include <fdtdec.h>
29
30/* This holds information about a window which can be displayed */
31struct disp_ctl_win {
32 enum win_color_depth_id fmt; /* Color depth/format */
33 unsigned bpp; /* Bits per pixel */
34 phys_addr_t phys_addr; /* Physical address in memory */
35 unsigned x; /* Horizontal address offset (bytes) */
36 unsigned y; /* Veritical address offset (bytes) */
37 unsigned w; /* Width of source window */
38 unsigned h; /* Height of source window */
39 unsigned stride; /* Number of bytes per line */
40 unsigned out_x; /* Left edge of output window (col) */
41 unsigned out_y; /* Top edge of output window (row) */
42 unsigned out_w; /* Width of output window in pixels */
43 unsigned out_h; /* Height of output window in pixels */
44};
45
46#define FDT_LCD_TIMINGS 4
47
48enum {
49 FDT_LCD_TIMING_REF_TO_SYNC,
50 FDT_LCD_TIMING_SYNC_WIDTH,
51 FDT_LCD_TIMING_BACK_PORCH,
52 FDT_LCD_TIMING_FRONT_PORCH,
53
54 FDT_LCD_TIMING_COUNT,
55};
56
57enum lcd_cache_t {
58 FDT_LCD_CACHE_OFF = 0,
59 FDT_LCD_CACHE_WRITE_THROUGH = 1 << 0,
60 FDT_LCD_CACHE_WRITE_BACK = 1 << 1,
61 FDT_LCD_CACHE_FLUSH = 1 << 2,
62 FDT_LCD_CACHE_WRITE_BACK_FLUSH = FDT_LCD_CACHE_WRITE_BACK |
63 FDT_LCD_CACHE_FLUSH,
64};
65
66/* Information about the display controller */
67struct fdt_disp_config {
68 int valid; /* config is valid */
69 int width; /* width in pixels */
70 int height; /* height in pixels */
71 int bpp; /* number of bits per pixel */
72
73 /*
74 * log2 of number of bpp, in general, unless it bpp is 24 in which
75 * case this field holds 24 also! This is a U-Boot thing.
76 */
77 int log2_bpp;
78 struct disp_ctlr *disp; /* Display controller to use */
79 fdt_addr_t frame_buffer; /* Address of frame buffer */
80 unsigned pixel_clock; /* Pixel clock in Hz */
81 uint horiz_timing[FDT_LCD_TIMING_COUNT]; /* Horizontal timing */
82 uint vert_timing[FDT_LCD_TIMING_COUNT]; /* Vertical timing */
83 int panel_node; /* node offset of panel information */
84};
85
86/* Information about the LCD panel */
87struct fdt_panel_config {
88 int pwm_channel; /* PWM channel to use for backlight */
89 enum lcd_cache_t cache_type;
90
91 struct fdt_gpio_state backlight_en; /* GPIO for backlight enable */
92 struct fdt_gpio_state lvds_shutdown; /* GPIO for lvds shutdown */
93 struct fdt_gpio_state backlight_vdd; /* GPIO for backlight vdd */
94 struct fdt_gpio_state panel_vdd; /* GPIO for panel vdd */
95 /*
96 * Panel required timings
97 * Timing 1: delay between panel_vdd-rise and data-rise
98 * Timing 2: delay between data-rise and backlight_vdd-rise
99 * Timing 3: delay between backlight_vdd and pwm-rise
100 * Timing 4: delay between pwm-rise and backlight_en-rise
101 */
102 uint panel_timings[FDT_LCD_TIMINGS];
103};
104
105/**
106 * Register a new display based on device tree configuration.
107 *
108 * The frame buffer can be positioned by U-Boot or overriden by the fdt.
109 * You should pass in the U-Boot address here, and check the contents of
110 * struct fdt_disp_config to see what was actually chosen.
111 *
112 * @param blob Device tree blob
113 * @param default_lcd_base Default address of LCD frame buffer
114 * @return 0 if ok, -1 on error (unsupported bits per pixel)
115 */
116int tegra_display_probe(const void *blob, void *default_lcd_base);
117
118/**
119 * Return the current display configuration
120 *
121 * @return pointer to display configuration, or NULL if there is no valid
122 * config
123 */
124struct fdt_disp_config *tegra_display_get_config(void);
125
126/**
127 * Perform the next stage of the LCD init if it is time to do so.
128 *
129 * LCD init can be time-consuming because of the number of delays we need
130 * while waiting for the backlight power supply, etc. This function can
131 * be called at various times during U-Boot operation to advance the
132 * initialization of the LCD to the next stage if sufficient time has
133 * passed since the last stage. It keeps track of what stage it is up to
134 * and the time that it is permitted to move to the next stage.
135 *
136 * The final call should have wait=1 to complete the init.
137 *
138 * @param blob fdt blob containing LCD information
139 * @param wait 1 to wait until all init is complete, and then return
140 * 0 to return immediately, potentially doing nothing if it is
141 * not yet time for the next init.
142 */
143int tegra_lcd_check_next_stage(const void *blob, int wait);
144
145/**
146 * Set up the maximum LCD size so we can size the frame buffer.
147 *
148 * @param blob fdt blob containing LCD information
149 */
150void tegra_lcd_early_init(const void *blob);
151
152#endif /*__ASM_ARCH_TEGRA_DISPLAY_H*/