]> nv-tegra.nvidia Code Review - linux-3.10.git/blobdiff - include/video/omapdss.h
OMAPDSS: DPI: Maintain our own timings field in driver data
[linux-3.10.git] / include / video / omapdss.h
index 6e3e7a716838efcafc74b5b0a75630c8de546202..be2cb6b7fba5bb18c6f1403997a60f10833d01ae 100644 (file)
 #define DISPC_IRQ_FRAMEDONEWB          (1 << 23)
 #define DISPC_IRQ_FRAMEDONETV          (1 << 24)
 #define DISPC_IRQ_WBBUFFEROVERFLOW     (1 << 25)
+#define DISPC_IRQ_FRAMEDONE3           (1 << 26)
+#define DISPC_IRQ_VSYNC3               (1 << 27)
+#define DISPC_IRQ_ACBIAS_COUNT_STAT3   (1 << 28)
+#define DISPC_IRQ_SYNC_LOST3           (1 << 29)
 
 struct omap_dss_device;
 struct omap_overlay_manager;
+struct snd_aes_iec958;
+struct snd_cea_861_aud_if;
 
 enum omap_display_type {
        OMAP_DISPLAY_TYPE_NONE          = 0,
@@ -73,6 +79,7 @@ enum omap_channel {
        OMAP_DSS_CHANNEL_LCD    = 0,
        OMAP_DSS_CHANNEL_DIGIT  = 1,
        OMAP_DSS_CHANNEL_LCD2   = 2,
+       OMAP_DSS_CHANNEL_LCD3   = 3,
 };
 
 enum omap_color_mode {
@@ -97,11 +104,6 @@ enum omap_color_mode {
        OMAP_DSS_COLOR_XRGB16_1555      = 1 << 18, /* xRGB16 - 1555 */
 };
 
-enum omap_lcd_display_type {
-       OMAP_DSS_LCD_DISPLAY_STN,
-       OMAP_DSS_LCD_DISPLAY_TFT,
-};
-
 enum omap_dss_load_mode {
        OMAP_DSS_LOAD_CLUT_AND_FRAME    = 0,
        OMAP_DSS_LOAD_CLUT_ONLY         = 1,
@@ -119,15 +121,15 @@ enum omap_rfbi_te_mode {
        OMAP_DSS_RFBI_TE_MODE_2 = 2,
 };
 
-enum omap_panel_config {
-       OMAP_DSS_LCD_IVS                = 1<<0,
-       OMAP_DSS_LCD_IHS                = 1<<1,
-       OMAP_DSS_LCD_IPC                = 1<<2,
-       OMAP_DSS_LCD_IEO                = 1<<3,
-       OMAP_DSS_LCD_RF                 = 1<<4,
-       OMAP_DSS_LCD_ONOFF              = 1<<5,
+enum omap_dss_signal_level {
+       OMAPDSS_SIG_ACTIVE_HIGH = 0,
+       OMAPDSS_SIG_ACTIVE_LOW  = 1,
+};
 
-       OMAP_DSS_LCD_TFT                = 1<<20,
+enum omap_dss_signal_edge {
+       OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES,
+       OMAPDSS_DRIVE_SIG_RISING_EDGE,
+       OMAPDSS_DRIVE_SIG_FALLING_EDGE,
 };
 
 enum omap_dss_venc_type {
@@ -158,16 +160,17 @@ enum omap_dss_display_state {
        OMAP_DSS_DISPLAY_SUSPENDED,
 };
 
-/* XXX perhaps this should be removed */
-enum omap_dss_overlay_managers {
-       OMAP_DSS_OVL_MGR_LCD,
-       OMAP_DSS_OVL_MGR_TV,
-       OMAP_DSS_OVL_MGR_LCD2,
+enum omap_dss_audio_state {
+       OMAP_DSS_AUDIO_DISABLED = 0,
+       OMAP_DSS_AUDIO_ENABLED,
+       OMAP_DSS_AUDIO_CONFIGURED,
+       OMAP_DSS_AUDIO_PLAYING,
 };
 
 enum omap_dss_rotation_type {
-       OMAP_DSS_ROT_DMA = 0,
-       OMAP_DSS_ROT_VRFB = 1,
+       OMAP_DSS_ROT_DMA        = 1 << 0,
+       OMAP_DSS_ROT_VRFB       = 1 << 1,
+       OMAP_DSS_ROT_TILER      = 1 << 2,
 };
 
 /* clockwise rotation angle */
@@ -200,6 +203,10 @@ enum omap_dss_clk_source {
        OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI,    /* OMAP4: PLL2_CLK2 */
 };
 
+enum omap_hdmi_flags {
+       OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP = 1 << 0,
+};
+
 /* RFBI */
 
 struct rfbi_timings {
@@ -254,9 +261,6 @@ struct omap_dss_dsi_videomode_data {
        int hfp_blanking_mode;
 
        /* Video port sync events */
-       int vp_de_pol;
-       int vp_hsync_pol;
-       int vp_vsync_pol;
        bool vp_vsync_end;
        bool vp_hsync_end;
 
@@ -305,15 +309,13 @@ struct omap_dss_board_info {
        struct omap_dss_device *default_device;
        int (*dsi_enable_pads)(int dsi_id, unsigned lane_mask);
        void (*dsi_disable_pads)(int dsi_id, unsigned lane_mask);
+       int (*set_min_bus_tput)(struct device *dev, unsigned long r);
 };
 
 /* Init with the board info */
 extern int omap_display_init(struct omap_dss_board_info *board_data);
-
-struct omap_display_platform_data {
-       struct omap_dss_board_info *board_data;
-       /* TODO: Additional members to be added when PM is considered */
-};
+/* HDMI mux init*/
+extern int omap_hdmi_init(enum omap_hdmi_flags flags);
 
 struct omap_video_timings {
        /* Unit: pixels */
@@ -334,6 +336,19 @@ struct omap_video_timings {
        u16 vfp;        /* Vertical front porch */
        /* Unit: line clocks */
        u16 vbp;        /* Vertical back porch */
+
+       /* Vsync logic level */
+       enum omap_dss_signal_level vsync_level;
+       /* Hsync logic level */
+       enum omap_dss_signal_level hsync_level;
+       /* Interlaced or Progressive timings */
+       bool interlace;
+       /* Pixel clock edge to drive LCD data */
+       enum omap_dss_signal_edge data_pclk_edge;
+       /* Data enable logic level */
+       enum omap_dss_signal_level de_level;
+       /* Pixel clock edges to drive HSYNC and VSYNC signals */
+       enum omap_dss_signal_edge sync_pclk_edge;
 };
 
 #ifdef CONFIG_OMAP2_DSS_VENC
@@ -352,8 +367,6 @@ struct omap_dss_cpr_coefs {
 };
 
 struct omap_overlay_info {
-       bool enabled;
-
        u32 paddr;
        u32 p_uv_addr;  /* for NV12 format */
        u16 screen_width;
@@ -385,11 +398,21 @@ struct omap_overlay {
 
        /* dynamic fields */
        struct omap_overlay_manager *manager;
-       struct omap_overlay_info info;
 
-       bool manager_changed;
-       /* if true, info has been changed, but not applied() yet */
-       bool info_dirty;
+       /*
+        * The following functions do not block:
+        *
+        * is_enabled
+        * set_overlay_info
+        * get_overlay_info
+        *
+        * The rest of the functions may block and cannot be called from
+        * interrupt context
+        */
+
+       int (*enable)(struct omap_overlay *ovl);
+       int (*disable)(struct omap_overlay *ovl);
+       bool (*is_enabled)(struct omap_overlay *ovl);
 
        int (*set_manager)(struct omap_overlay *ovl,
                struct omap_overlay_manager *mgr);
@@ -428,11 +451,17 @@ struct omap_overlay_manager {
 
        /* dynamic fields */
        struct omap_dss_device *device;
-       struct omap_overlay_manager_info info;
 
-       bool device_changed;
-       /* if true, info has been changed but not applied() yet */
-       bool info_dirty;
+       /*
+        * The following functions do not block:
+        *
+        * set_manager_info
+        * get_manager_info
+        * apply
+        *
+        * The rest of the functions may block and cannot be called from
+        * interrupt context
+        */
 
        int (*set_device)(struct omap_overlay_manager *mgr,
                struct omap_dss_device *dssdev);
@@ -448,6 +477,21 @@ struct omap_overlay_manager {
        int (*wait_for_vsync)(struct omap_overlay_manager *mgr);
 };
 
+/* 22 pins means 1 clk lane and 10 data lanes */
+#define OMAP_DSS_MAX_DSI_PINS 22
+
+struct omap_dsi_pin_config {
+       int num_pins;
+       /*
+        * pin numbers in the following order:
+        * clk+, clk-
+        * data1+, data1-
+        * data2+, data2-
+        * ...
+        */
+       int pins[OMAP_DSS_MAX_DSI_PINS];
+};
+
 struct omap_dss_device {
        struct device dev;
 
@@ -470,17 +514,6 @@ struct omap_dss_device {
                } sdi;
 
                struct {
-                       u8 clk_lane;
-                       u8 clk_pol;
-                       u8 data1_lane;
-                       u8 data1_pol;
-                       u8 data2_lane;
-                       u8 data2_pol;
-                       u8 data3_lane;
-                       u8 data3_pol;
-                       u8 data4_lane;
-                       u8 data4_pol;
-
                        int module;
 
                        bool ext_te;
@@ -529,8 +562,6 @@ struct omap_dss_device {
                /* Unit: line clocks */
                int acb;        /* ac-bias pin frequency */
 
-               enum omap_panel_config config;
-
                enum omap_dss_dsi_pixel_format dsi_pix_fmt;
                enum omap_dss_dsi_mode dsi_mode;
                struct omap_dss_dsi_videomode_data dsi_vm_data;
@@ -563,6 +594,8 @@ struct omap_dss_device {
 
        enum omap_dss_display_state state;
 
+       enum omap_dss_audio_state audio_state;
+
        /* platform specific  */
        int (*platform_enable)(struct omap_dss_device *dssdev);
        void (*platform_disable)(struct omap_dss_device *dssdev);
@@ -570,6 +603,16 @@ struct omap_dss_device {
        int (*get_backlight)(struct omap_dss_device *dssdev);
 };
 
+struct omap_dss_hdmi_data
+{
+       int hpd_gpio;
+};
+
+struct omap_dss_audio {
+       struct snd_aes_iec958 *iec;
+       struct snd_cea_861_aud_if *cea;
+};
+
 struct omap_dss_driver {
        struct device_driver driver;
 
@@ -617,6 +660,24 @@ struct omap_dss_driver {
 
        int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
        bool (*detect)(struct omap_dss_device *dssdev);
+
+       /*
+        * For display drivers that support audio. This encompasses
+        * HDMI and DisplayPort at the moment.
+        */
+       /*
+        * Note: These functions might sleep. Do not call while
+        * holding a spinlock/readlock.
+        */
+       int (*audio_enable)(struct omap_dss_device *dssdev);
+       void (*audio_disable)(struct omap_dss_device *dssdev);
+       bool (*audio_supported)(struct omap_dss_device *dssdev);
+       int (*audio_config)(struct omap_dss_device *dssdev,
+               struct omap_dss_audio *audio);
+       /* Note: These functions may not sleep */
+       int (*audio_start)(struct omap_dss_device *dssdev);
+       void (*audio_stop)(struct omap_dss_device *dssdev);
+
 };
 
 int omap_dss_register_driver(struct omap_dss_driver *);
@@ -641,6 +702,8 @@ struct omap_overlay *omap_dss_get_overlay(int num);
 void omapdss_default_get_resolution(struct omap_dss_device *dssdev,
                u16 *xres, u16 *yres);
 int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev);
+void omapdss_default_get_timings(struct omap_dss_device *dssdev,
+               struct omap_video_timings *timings);
 
 typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
 int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
@@ -662,6 +725,8 @@ int omap_dsi_update(struct omap_dss_device *dssdev, int channel,
 int omap_dsi_request_vc(struct omap_dss_device *dssdev, int *channel);
 int omap_dsi_set_vc_id(struct omap_dss_device *dssdev, int channel, int vc_id);
 void omap_dsi_release_vc(struct omap_dss_device *dssdev, int channel);
+int omapdss_dsi_configure_pins(struct omap_dss_device *dssdev,
+               const struct omap_dsi_pin_config *pin_cfg);
 
 int omapdss_dsi_display_enable(struct omap_dss_device *dssdev);
 void omapdss_dsi_display_disable(struct omap_dss_device *dssdev,
@@ -669,8 +734,8 @@ void omapdss_dsi_display_disable(struct omap_dss_device *dssdev,
 
 int omapdss_dpi_display_enable(struct omap_dss_device *dssdev);
 void omapdss_dpi_display_disable(struct omap_dss_device *dssdev);
-void dpi_set_timings(struct omap_dss_device *dssdev,
-                       struct omap_video_timings *timings);
+void omapdss_dpi_set_timings(struct omap_dss_device *dssdev,
+               struct omap_video_timings *timings);
 int dpi_check_timings(struct omap_dss_device *dssdev,
                        struct omap_video_timings *timings);