Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
omapdss.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008 Nokia Corporation
3  * Author: Tomi Valkeinen <[email protected]>
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 as published by
7  * the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef __OMAP_OMAPDSS_H
19 #define __OMAP_OMAPDSS_H
20 
21 #include <linux/list.h>
22 #include <linux/kobject.h>
23 #include <linux/device.h>
24 
25 #define DISPC_IRQ_FRAMEDONE (1 << 0)
26 #define DISPC_IRQ_VSYNC (1 << 1)
27 #define DISPC_IRQ_EVSYNC_EVEN (1 << 2)
28 #define DISPC_IRQ_EVSYNC_ODD (1 << 3)
29 #define DISPC_IRQ_ACBIAS_COUNT_STAT (1 << 4)
30 #define DISPC_IRQ_PROG_LINE_NUM (1 << 5)
31 #define DISPC_IRQ_GFX_FIFO_UNDERFLOW (1 << 6)
32 #define DISPC_IRQ_GFX_END_WIN (1 << 7)
33 #define DISPC_IRQ_PAL_GAMMA_MASK (1 << 8)
34 #define DISPC_IRQ_OCP_ERR (1 << 9)
35 #define DISPC_IRQ_VID1_FIFO_UNDERFLOW (1 << 10)
36 #define DISPC_IRQ_VID1_END_WIN (1 << 11)
37 #define DISPC_IRQ_VID2_FIFO_UNDERFLOW (1 << 12)
38 #define DISPC_IRQ_VID2_END_WIN (1 << 13)
39 #define DISPC_IRQ_SYNC_LOST (1 << 14)
40 #define DISPC_IRQ_SYNC_LOST_DIGIT (1 << 15)
41 #define DISPC_IRQ_WAKEUP (1 << 16)
42 #define DISPC_IRQ_SYNC_LOST2 (1 << 17)
43 #define DISPC_IRQ_VSYNC2 (1 << 18)
44 #define DISPC_IRQ_VID3_END_WIN (1 << 19)
45 #define DISPC_IRQ_VID3_FIFO_UNDERFLOW (1 << 20)
46 #define DISPC_IRQ_ACBIAS_COUNT_STAT2 (1 << 21)
47 #define DISPC_IRQ_FRAMEDONE2 (1 << 22)
48 #define DISPC_IRQ_FRAMEDONEWB (1 << 23)
49 #define DISPC_IRQ_FRAMEDONETV (1 << 24)
50 #define DISPC_IRQ_WBBUFFEROVERFLOW (1 << 25)
51 #define DISPC_IRQ_SYNC_LOST3 (1 << 27)
52 #define DISPC_IRQ_VSYNC3 (1 << 28)
53 #define DISPC_IRQ_ACBIAS_COUNT_STAT3 (1 << 29)
54 #define DISPC_IRQ_FRAMEDONE3 (1 << 30)
55 
56 struct omap_dss_device;
58 struct snd_aes_iec958;
59 struct snd_cea_861_aud_if;
60 
69 };
70 
71 enum omap_plane {
77 };
78 
84 };
85 
87  OMAP_DSS_COLOR_CLUT1 = 1 << 0, /* BITMAP 1 */
88  OMAP_DSS_COLOR_CLUT2 = 1 << 1, /* BITMAP 2 */
89  OMAP_DSS_COLOR_CLUT4 = 1 << 2, /* BITMAP 4 */
90  OMAP_DSS_COLOR_CLUT8 = 1 << 3, /* BITMAP 8 */
91  OMAP_DSS_COLOR_RGB12U = 1 << 4, /* RGB12, 16-bit container */
92  OMAP_DSS_COLOR_ARGB16 = 1 << 5, /* ARGB16 */
93  OMAP_DSS_COLOR_RGB16 = 1 << 6, /* RGB16 */
94  OMAP_DSS_COLOR_RGB24U = 1 << 7, /* RGB24, 32-bit container */
95  OMAP_DSS_COLOR_RGB24P = 1 << 8, /* RGB24, 24-bit container */
96  OMAP_DSS_COLOR_YUV2 = 1 << 9, /* YUV2 4:2:2 co-sited */
97  OMAP_DSS_COLOR_UYVY = 1 << 10, /* UYVY 4:2:2 co-sited */
98  OMAP_DSS_COLOR_ARGB32 = 1 << 11, /* ARGB32 */
99  OMAP_DSS_COLOR_RGBA32 = 1 << 12, /* RGBA32 */
100  OMAP_DSS_COLOR_RGBX32 = 1 << 13, /* RGBx32 */
101  OMAP_DSS_COLOR_NV12 = 1 << 14, /* NV12 format: YUV 4:2:0 */
102  OMAP_DSS_COLOR_RGBA16 = 1 << 15, /* RGBA16 - 4444 */
103  OMAP_DSS_COLOR_RGBX16 = 1 << 16, /* RGBx16 - 4444 */
104  OMAP_DSS_COLOR_ARGB16_1555 = 1 << 17, /* ARGB16 - 1555 */
105  OMAP_DSS_COLOR_XRGB16_1555 = 1 << 18, /* xRGB16 - 1555 */
106 };
107 
113 };
114 
118 };
119 
123 };
124 
128 };
129 
134 };
135 
139 };
140 
146 };
147 
151 };
152 
156 };
157 
162 };
163 
169 };
170 
175 };
176 
177 /* clockwise rotation angle */
183 };
184 
192 };
193 
195  OMAP_DSS_DUMMY_VALUE, /* add a dummy value to prevent compiler error */
196 };
197 
199  OMAP_DSS_CLK_SRC_FCK = 0, /* OMAP2/3: DSS1_ALWON_FCLK
200  * OMAP4: DSS_FCLK */
201  OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC, /* OMAP3: DSI1_PLL_FCLK
202  * OMAP4: PLL1_CLK1 */
203  OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI, /* OMAP3: DSI2_PLL_FCLK
204  * OMAP4: PLL1_CLK2 */
206  OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI, /* OMAP4: PLL2_CLK2 */
207 };
208 
211 };
212 
221 };
222 
223 /* RFBI */
224 
225 struct rfbi_timings {
236 
237  int clk_div;
238 
239  u32 tim[5]; /* set by rfbi_convert_timings() */
240 
242 };
243 
244 void omap_rfbi_write_command(const void *buf, u32 len);
245 void omap_rfbi_read_data(void *buf, u32 len);
246 void omap_rfbi_write_data(const void *buf, u32 len);
247 void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width,
248  u16 x, u16 y,
249  u16 w, u16 h);
250 int omap_rfbi_enable_te(bool enable, unsigned line);
252  unsigned hs_pulse_time, unsigned vs_pulse_time,
253  int hs_pol_inv, int vs_pol_inv, int extif_div);
254 void rfbi_bus_lock(void);
255 void rfbi_bus_unlock(void);
256 
257 /* DSI */
258 
260  /* DSI video mode blanking data */
261  /* Unit: byte clock cycles */
265  /* Unit: line clocks */
269 
270  /* DSI blanking modes */
275 
276  /* Video port sync events */
279 
282 };
283 
284 void dsi_bus_lock(struct omap_dss_device *dssdev);
287  int len);
289  int len);
290 int dsi_vc_dcs_write_0(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd);
292 int dsi_vc_dcs_write_1(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
293  u8 param);
295  u8 param);
297  u8 param1, u8 param2);
299  u8 *data, int len);
301  u8 *data, int len);
302 int dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
303  u8 *buf, int buflen);
305  int buflen);
307  u8 *buf, int buflen);
309  u8 param1, u8 param2, u8 *buf, int buflen);
311  u16 len);
316 
317 /* Board specific data */
323  int (*dsi_enable_pads)(int dsi_id, unsigned lane_mask);
324  void (*dsi_disable_pads)(int dsi_id, unsigned lane_mask);
325  int (*set_min_bus_tput)(struct device *dev, unsigned long r);
326 };
327 
328 /* Init with the board info */
329 extern int omap_display_init(struct omap_dss_board_info *board_data);
330 /* HDMI mux init*/
331 extern int omap_hdmi_init(enum omap_hdmi_flags flags);
332 
334  /* Unit: pixels */
336  /* Unit: pixels */
338  /* Unit: KHz */
340  /* Unit: pixel clocks */
341  u16 hsw; /* Horizontal synchronization pulse width */
342  /* Unit: pixel clocks */
343  u16 hfp; /* Horizontal front porch */
344  /* Unit: pixel clocks */
345  u16 hbp; /* Horizontal back porch */
346  /* Unit: line clocks */
347  u16 vsw; /* Vertical synchronization pulse width */
348  /* Unit: line clocks */
349  u16 vfp; /* Vertical front porch */
350  /* Unit: line clocks */
351  u16 vbp; /* Vertical back porch */
352 
353  /* Vsync logic level */
355  /* Hsync logic level */
357  /* Interlaced or Progressive timings */
358  bool interlace;
359  /* Pixel clock edge to drive LCD data */
361  /* Data enable logic level */
363  /* Pixel clock edges to drive HSYNC and VSYNC signals */
365 };
366 
367 #ifdef CONFIG_OMAP2_DSS_VENC
368 /* Hardcoded timings for tv modes. Venc only uses these to
369  * identify the mode, and does not actually use the configs
370  * itself. However, the configs should be something that
371  * a normal monitor can also show */
372 extern const struct omap_video_timings omap_dss_pal_timings;
373 extern const struct omap_video_timings omap_dss_ntsc_timings;
374 #endif
375 
377  s16 rr, rg, rb;
378  s16 gr, gg, gb;
379  s16 br, bg, bb;
380 };
381 
384  u32 p_uv_addr; /* for NV12 format */
391  bool mirror;
392 
395  u16 out_width; /* if 0, out_width == width */
396  u16 out_height; /* if 0, out_height == height */
400 };
401 
402 struct omap_overlay {
403  struct kobject kobj;
404  struct list_head list;
405 
406  /* static fields */
407  const char *name;
411 
412  /* dynamic fields */
414 
415  /*
416  * The following functions do not block:
417  *
418  * is_enabled
419  * set_overlay_info
420  * get_overlay_info
421  *
422  * The rest of the functions may block and cannot be called from
423  * interrupt context
424  */
425 
426  int (*enable)(struct omap_overlay *ovl);
427  int (*disable)(struct omap_overlay *ovl);
428  bool (*is_enabled)(struct omap_overlay *ovl);
429 
430  int (*set_manager)(struct omap_overlay *ovl,
431  struct omap_overlay_manager *mgr);
432  int (*unset_manager)(struct omap_overlay *ovl);
433 
435  struct omap_overlay_info *info);
437  struct omap_overlay_info *info);
438 
439  int (*wait_for_go)(struct omap_overlay *ovl);
440 
441  struct omap_dss_device *(*get_device)(struct omap_overlay *ovl);
442 };
443 
446 
450 
452 
455 };
456 
458  struct kobject kobj;
459 
460  /* static fields */
461  const char *name;
467 
468  /* dynamic fields */
470 
471  /*
472  * The following functions do not block:
473  *
474  * set_manager_info
475  * get_manager_info
476  * apply
477  *
478  * The rest of the functions may block and cannot be called from
479  * interrupt context
480  */
481 
483  struct omap_dss_output *output);
485 
490 
491  int (*apply)(struct omap_overlay_manager *mgr);
494 
495  struct omap_dss_device *(*get_device)(struct omap_overlay_manager *mgr);
496 };
497 
498 /* 22 pins means 1 clk lane and 10 data lanes */
499 #define OMAP_DSS_MAX_DSI_PINS 22
500 
502  int num_pins;
503  /*
504  * pin numbers in the following order:
505  * clk+, clk-
506  * data1+, data1-
507  * data2+, data2-
508  * ...
509  */
511 };
512 
522  bool mirror;
524 };
525 
527  struct list_head list;
528 
529  /* display type supported by the output */
531 
532  /* output instance */
534 
535  /* output's platform device pointer */
537 
538  /* dynamic fields */
540 
542 };
543 
545  struct device dev;
546 
548 
550 
551  union {
552  struct {
554  } dpi;
555 
556  struct {
558  u8 data_lines;
559  } rfbi;
560 
561  struct {
563  } sdi;
564 
565  struct {
566  int module;
567 
568  bool ext_te;
570  } dsi;
571 
572  struct {
575  } venc;
576  } phy;
577 
578  struct {
579  struct {
580  struct {
584  } channel;
585 
587  } dispc;
588 
589  struct {
590  /* regn is one greater than TRM's REGN value */
595 
598  } dsi;
599 
600  struct {
601  /* regn is one greater than TRM's REGN value */
602  u16 regn;
604  } hdmi;
605  } clocks;
606 
607  struct {
609 
610  int acbi; /* ac-bias pin transitions per interrupt */
611  /* Unit: line clocks */
612  int acb; /* ac-bias pin frequency */
613 
617  } panel;
618 
619  struct {
622  } ctrl;
623 
625 
627 
628  const char *name;
629 
630  /* used to match device to driver */
631  const char *driver_name;
632 
633  void *data;
634 
636 
637  /* helper variable for driver suspend/resume */
639 
641 
643 
645 
647 
648  /* platform specific */
653 };
654 
656 {
659  int hpd_gpio;
660 };
661 
665 };
666 
669 
670  int (*probe)(struct omap_dss_device *);
671  void (*remove)(struct omap_dss_device *);
672 
678 
680  u16 x, u16 y, u16 w, u16 h);
682 
685 
687  int (*set_rotate)(struct omap_dss_device *dssdev, u8 rotate);
688 
691 
693  void *buf, size_t size,
694  u16 x, u16 y, u16 w, u16 h);
695 
697  u16 *xres, u16 *yres);
699  u32 *width, u32 *height);
701 
703  struct omap_video_timings *timings);
705  struct omap_video_timings *timings);
707  struct omap_video_timings *timings);
708 
711 
714 
715  /*
716  * For display drivers that support audio. This encompasses
717  * HDMI and DisplayPort at the moment.
718  */
719  /*
720  * Note: These functions might sleep. Do not call while
721  * holding a spinlock/readlock.
722  */
727  struct omap_dss_audio *audio);
728  /* Note: These functions may not sleep */
731 
732 };
733 
736 
739 #define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL)
742  int (*match)(struct omap_dss_device *dssdev, void *data));
743 
746 
749 
750 int omap_dss_get_num_overlays(void);
751 struct omap_overlay *omap_dss_get_overlay(int num);
752 
755  struct omap_dss_device *dssdev);
757 
759  u16 *xres, u16 *yres);
762  struct omap_video_timings *timings);
763 
764 typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
767 
768 int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout);
770  unsigned long timeout);
771 
772 #define to_dss_driver(x) container_of((x), struct omap_dss_driver, driver)
773 #define to_dss_device(x) container_of((x), struct omap_dss_device, dev)
774 
776  bool enable);
779  struct omap_video_timings *timings);
784  enum omap_dss_dsi_mode mode);
786  struct omap_dss_dsi_videomode_timings *timings);
787 
789  void (*callback)(int, void *), void *data);
790 int omap_dsi_request_vc(struct omap_dss_device *dssdev, int *channel);
791 int omap_dsi_set_vc_id(struct omap_dss_device *dssdev, int channel, int vc_id);
792 void omap_dsi_release_vc(struct omap_dss_device *dssdev, int channel);
794  const struct omap_dsi_pin_config *pin_cfg);
795 int omapdss_dsi_set_clocks(struct omap_dss_device *dssdev,
796  unsigned long ddr_clk, unsigned long lp_clk);
797 
798 int omapdss_dsi_display_enable(struct omap_dss_device *dssdev);
799 void omapdss_dsi_display_disable(struct omap_dss_device *dssdev,
800  bool disconnect_lanes, bool enter_ulps);
801 
802 int omapdss_dpi_display_enable(struct omap_dss_device *dssdev);
803 void omapdss_dpi_display_disable(struct omap_dss_device *dssdev);
804 void omapdss_dpi_set_timings(struct omap_dss_device *dssdev,
805  struct omap_video_timings *timings);
806 int dpi_check_timings(struct omap_dss_device *dssdev,
807  struct omap_video_timings *timings);
808 void omapdss_dpi_set_data_lines(struct omap_dss_device *dssdev, int data_lines);
809 
810 int omapdss_sdi_display_enable(struct omap_dss_device *dssdev);
811 void omapdss_sdi_display_disable(struct omap_dss_device *dssdev);
812 void omapdss_sdi_set_timings(struct omap_dss_device *dssdev,
813  struct omap_video_timings *timings);
814 void omapdss_sdi_set_datapairs(struct omap_dss_device *dssdev, int datapairs);
815 
816 int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev);
817 void omapdss_rfbi_display_disable(struct omap_dss_device *dssdev);
818 int omap_rfbi_update(struct omap_dss_device *dssdev, void (*callback)(void *),
819  void *data);
820 int omap_rfbi_configure(struct omap_dss_device *dssdev);
821 void omapdss_rfbi_set_size(struct omap_dss_device *dssdev, u16 w, u16 h);
822 void omapdss_rfbi_set_pixel_size(struct omap_dss_device *dssdev,
823  int pixel_size);
824 void omapdss_rfbi_set_data_lines(struct omap_dss_device *dssdev,
825  int data_lines);
827  struct rfbi_timings *timings);
828 
829 #endif