diff options
author | Archit Taneja <archit@ti.com> | 2011-09-05 07:18:27 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2011-09-30 09:16:30 -0400 |
commit | 8af6ff0107f0720b8fbf4feca7031d3e36c2fa11 (patch) | |
tree | 7051173d9638281697aaa695fb9e51e0b898f7c5 /drivers/video | |
parent | 18b7d09908fdef8755d934a0c37d709e94e8461a (diff) |
OMAP: DSS2: DSI Video mode support
Add initial support for DSI video mode panels:
- Add a new structure omap_dss_dsi_videomode_data in the member "panel" in
omap_dss_device struct. This allows panel driver to configure dsi video_mode
specific parameters.
- Configure basic DSI video mode timing parameters: HBP, HFP, HSA, VBP, VFP, VSA,
TL and VACT.
- Configure DSI protocol engine registers for video_mode support.
- Introduce functions dsi_video_mode_enable() and dsi_video_mode_disable() which
enable/disable video mode for a given virtual channel and a given pixel format
type.
Things left for later
- Add functions to check for errors in video mode timings provided by panel.
- Configure timing registers required for command mode interleaving.
Signed-off-by: Archit Taneja <archit@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/omap2/dss/dsi.c | 260 |
1 files changed, 231 insertions, 29 deletions
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c index 77aca3e9a058..43c04a9889c4 100644 --- a/drivers/video/omap2/dss/dsi.c +++ b/drivers/video/omap2/dss/dsi.c | |||
@@ -132,7 +132,7 @@ struct dsi_reg { u16 idx; }; | |||
132 | #define DSI_IRQ_TA_TIMEOUT (1 << 20) | 132 | #define DSI_IRQ_TA_TIMEOUT (1 << 20) |
133 | #define DSI_IRQ_ERROR_MASK \ | 133 | #define DSI_IRQ_ERROR_MASK \ |
134 | (DSI_IRQ_HS_TX_TIMEOUT | DSI_IRQ_LP_RX_TIMEOUT | DSI_IRQ_SYNC_LOST | \ | 134 | (DSI_IRQ_HS_TX_TIMEOUT | DSI_IRQ_LP_RX_TIMEOUT | DSI_IRQ_SYNC_LOST | \ |
135 | DSI_IRQ_TA_TIMEOUT) | 135 | DSI_IRQ_TA_TIMEOUT | DSI_IRQ_SYNC_LOST) |
136 | #define DSI_IRQ_CHANNEL_MASK 0xf | 136 | #define DSI_IRQ_CHANNEL_MASK 0xf |
137 | 137 | ||
138 | /* Virtual channel interrupts */ | 138 | /* Virtual channel interrupts */ |
@@ -2472,6 +2472,12 @@ static int dsi_cio_init(struct omap_dss_device *dssdev) | |||
2472 | 2472 | ||
2473 | dsi_cio_timings(dsidev); | 2473 | dsi_cio_timings(dsidev); |
2474 | 2474 | ||
2475 | if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { | ||
2476 | /* DDR_CLK_ALWAYS_ON */ | ||
2477 | REG_FLD_MOD(dsidev, DSI_CLK_CTRL, | ||
2478 | dssdev->panel.dsi_vm_data.ddr_clk_always_on, 13, 13); | ||
2479 | } | ||
2480 | |||
2475 | dsi->ulps_enabled = false; | 2481 | dsi->ulps_enabled = false; |
2476 | 2482 | ||
2477 | DSSDBG("CIO init done\n"); | 2483 | DSSDBG("CIO init done\n"); |
@@ -2496,6 +2502,9 @@ static void dsi_cio_uninit(struct omap_dss_device *dssdev) | |||
2496 | struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); | 2502 | struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); |
2497 | struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); | 2503 | struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); |
2498 | 2504 | ||
2505 | /* DDR_CLK_ALWAYS_ON */ | ||
2506 | REG_FLD_MOD(dsidev, DSI_CLK_CTRL, 0, 13, 13); | ||
2507 | |||
2499 | dsi_cio_power(dsidev, DSI_COMPLEXIO_POWER_OFF); | 2508 | dsi_cio_power(dsidev, DSI_COMPLEXIO_POWER_OFF); |
2500 | dsi_disable_scp_clk(dsidev); | 2509 | dsi_disable_scp_clk(dsidev); |
2501 | dsi->disable_pads(dsidev->id, dsi_get_lane_mask(dssdev)); | 2510 | dsi->disable_pads(dsidev->id, dsi_get_lane_mask(dssdev)); |
@@ -2799,6 +2808,10 @@ void omapdss_dsi_vc_enable_hs(struct omap_dss_device *dssdev, int channel, | |||
2799 | dsi_if_enable(dsidev, 1); | 2808 | dsi_if_enable(dsidev, 1); |
2800 | 2809 | ||
2801 | dsi_force_tx_stop_mode_io(dsidev); | 2810 | dsi_force_tx_stop_mode_io(dsidev); |
2811 | |||
2812 | /* start the DDR clock by sending a NULL packet */ | ||
2813 | if (dssdev->panel.dsi_vm_data.ddr_clk_always_on && enable) | ||
2814 | dsi_vc_send_null(dssdev, channel); | ||
2802 | } | 2815 | } |
2803 | EXPORT_SYMBOL(omapdss_dsi_vc_enable_hs); | 2816 | EXPORT_SYMBOL(omapdss_dsi_vc_enable_hs); |
2804 | 2817 | ||
@@ -3682,6 +3695,75 @@ static void dsi_set_hs_tx_timeout(struct platform_device *dsidev, | |||
3682 | ticks, x4 ? " x4" : "", x16 ? " x16" : "", | 3695 | ticks, x4 ? " x4" : "", x16 ? " x16" : "", |
3683 | (total_ticks * 1000) / (fck / 1000 / 1000)); | 3696 | (total_ticks * 1000) / (fck / 1000 / 1000)); |
3684 | } | 3697 | } |
3698 | |||
3699 | static void dsi_config_vp_num_line_buffers(struct omap_dss_device *dssdev) | ||
3700 | { | ||
3701 | struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); | ||
3702 | int num_line_buffers; | ||
3703 | |||
3704 | if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { | ||
3705 | int bpp = dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt); | ||
3706 | unsigned line_buf_size = dsi_get_line_buf_size(dsidev); | ||
3707 | struct omap_video_timings *timings = &dssdev->panel.timings; | ||
3708 | /* | ||
3709 | * Don't use line buffers if width is greater than the video | ||
3710 | * port's line buffer size | ||
3711 | */ | ||
3712 | if (line_buf_size <= timings->x_res * bpp / 8) | ||
3713 | num_line_buffers = 0; | ||
3714 | else | ||
3715 | num_line_buffers = 2; | ||
3716 | } else { | ||
3717 | /* Use maximum number of line buffers in command mode */ | ||
3718 | num_line_buffers = 2; | ||
3719 | } | ||
3720 | |||
3721 | /* LINE_BUFFER */ | ||
3722 | REG_FLD_MOD(dsidev, DSI_CTRL, num_line_buffers, 13, 12); | ||
3723 | } | ||
3724 | |||
3725 | static void dsi_config_vp_sync_events(struct omap_dss_device *dssdev) | ||
3726 | { | ||
3727 | struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); | ||
3728 | int de_pol = dssdev->panel.dsi_vm_data.vp_de_pol; | ||
3729 | int hsync_pol = dssdev->panel.dsi_vm_data.vp_hsync_pol; | ||
3730 | int vsync_pol = dssdev->panel.dsi_vm_data.vp_vsync_pol; | ||
3731 | bool vsync_end = dssdev->panel.dsi_vm_data.vp_vsync_end; | ||
3732 | bool hsync_end = dssdev->panel.dsi_vm_data.vp_hsync_end; | ||
3733 | u32 r; | ||
3734 | |||
3735 | r = dsi_read_reg(dsidev, DSI_CTRL); | ||
3736 | r = FLD_MOD(r, de_pol, 9, 9); /* VP_DE_POL */ | ||
3737 | r = FLD_MOD(r, hsync_pol, 10, 10); /* VP_HSYNC_POL */ | ||
3738 | r = FLD_MOD(r, vsync_pol, 11, 11); /* VP_VSYNC_POL */ | ||
3739 | r = FLD_MOD(r, 1, 15, 15); /* VP_VSYNC_START */ | ||
3740 | r = FLD_MOD(r, vsync_end, 16, 16); /* VP_VSYNC_END */ | ||
3741 | r = FLD_MOD(r, 1, 17, 17); /* VP_HSYNC_START */ | ||
3742 | r = FLD_MOD(r, hsync_end, 18, 18); /* VP_HSYNC_END */ | ||
3743 | dsi_write_reg(dsidev, DSI_CTRL, r); | ||
3744 | } | ||
3745 | |||
3746 | static void dsi_config_blanking_modes(struct omap_dss_device *dssdev) | ||
3747 | { | ||
3748 | struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); | ||
3749 | int blanking_mode = dssdev->panel.dsi_vm_data.blanking_mode; | ||
3750 | int hfp_blanking_mode = dssdev->panel.dsi_vm_data.hfp_blanking_mode; | ||
3751 | int hbp_blanking_mode = dssdev->panel.dsi_vm_data.hbp_blanking_mode; | ||
3752 | int hsa_blanking_mode = dssdev->panel.dsi_vm_data.hsa_blanking_mode; | ||
3753 | u32 r; | ||
3754 | |||
3755 | /* | ||
3756 | * 0 = TX FIFO packets sent or LPS in corresponding blanking periods | ||
3757 | * 1 = Long blanking packets are sent in corresponding blanking periods | ||
3758 | */ | ||
3759 | r = dsi_read_reg(dsidev, DSI_CTRL); | ||
3760 | r = FLD_MOD(r, blanking_mode, 20, 20); /* BLANKING_MODE */ | ||
3761 | r = FLD_MOD(r, hfp_blanking_mode, 21, 21); /* HFP_BLANKING */ | ||
3762 | r = FLD_MOD(r, hbp_blanking_mode, 22, 22); /* HBP_BLANKING */ | ||
3763 | r = FLD_MOD(r, hsa_blanking_mode, 23, 23); /* HSA_BLANKING */ | ||
3764 | dsi_write_reg(dsidev, DSI_CTRL, r); | ||
3765 | } | ||
3766 | |||
3685 | static int dsi_proto_config(struct omap_dss_device *dssdev) | 3767 | static int dsi_proto_config(struct omap_dss_device *dssdev) |
3686 | { | 3768 | { |
3687 | struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); | 3769 | struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); |
@@ -3725,7 +3807,6 @@ static int dsi_proto_config(struct omap_dss_device *dssdev) | |||
3725 | r = FLD_MOD(r, 1, 4, 4); /* VP_CLK_RATIO, always 1, see errata*/ | 3807 | r = FLD_MOD(r, 1, 4, 4); /* VP_CLK_RATIO, always 1, see errata*/ |
3726 | r = FLD_MOD(r, buswidth, 7, 6); /* VP_DATA_BUS_WIDTH */ | 3808 | r = FLD_MOD(r, buswidth, 7, 6); /* VP_DATA_BUS_WIDTH */ |
3727 | r = FLD_MOD(r, 0, 8, 8); /* VP_CLK_POL */ | 3809 | r = FLD_MOD(r, 0, 8, 8); /* VP_CLK_POL */ |
3728 | r = FLD_MOD(r, 2, 13, 12); /* LINE_BUFFER, 2 lines */ | ||
3729 | r = FLD_MOD(r, 1, 14, 14); /* TRIGGER_RESET_MODE */ | 3810 | r = FLD_MOD(r, 1, 14, 14); /* TRIGGER_RESET_MODE */ |
3730 | r = FLD_MOD(r, 1, 19, 19); /* EOT_ENABLE */ | 3811 | r = FLD_MOD(r, 1, 19, 19); /* EOT_ENABLE */ |
3731 | if (!dss_has_feature(FEAT_DSI_DCS_CMD_CONFIG_VC)) { | 3812 | if (!dss_has_feature(FEAT_DSI_DCS_CMD_CONFIG_VC)) { |
@@ -3736,6 +3817,13 @@ static int dsi_proto_config(struct omap_dss_device *dssdev) | |||
3736 | 3817 | ||
3737 | dsi_write_reg(dsidev, DSI_CTRL, r); | 3818 | dsi_write_reg(dsidev, DSI_CTRL, r); |
3738 | 3819 | ||
3820 | dsi_config_vp_num_line_buffers(dssdev); | ||
3821 | |||
3822 | if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { | ||
3823 | dsi_config_vp_sync_events(dssdev); | ||
3824 | dsi_config_blanking_modes(dssdev); | ||
3825 | } | ||
3826 | |||
3739 | dsi_vc_initial_config(dsidev, 0); | 3827 | dsi_vc_initial_config(dsidev, 0); |
3740 | dsi_vc_initial_config(dsidev, 1); | 3828 | dsi_vc_initial_config(dsidev, 1); |
3741 | dsi_vc_initial_config(dsidev, 2); | 3829 | dsi_vc_initial_config(dsidev, 2); |
@@ -3754,6 +3842,7 @@ static void dsi_proto_timings(struct omap_dss_device *dssdev) | |||
3754 | unsigned ddr_clk_pre, ddr_clk_post; | 3842 | unsigned ddr_clk_pre, ddr_clk_post; |
3755 | unsigned enter_hs_mode_lat, exit_hs_mode_lat; | 3843 | unsigned enter_hs_mode_lat, exit_hs_mode_lat; |
3756 | unsigned ths_eot; | 3844 | unsigned ths_eot; |
3845 | int ndl = dsi_get_num_data_lanes_dssdev(dssdev); | ||
3757 | u32 r; | 3846 | u32 r; |
3758 | 3847 | ||
3759 | r = dsi_read_reg(dsidev, DSI_DSIPHY_CFG0); | 3848 | r = dsi_read_reg(dsidev, DSI_DSIPHY_CFG0); |
@@ -3776,7 +3865,7 @@ static void dsi_proto_timings(struct omap_dss_device *dssdev) | |||
3776 | /* min 60ns + 52*UI */ | 3865 | /* min 60ns + 52*UI */ |
3777 | tclk_post = ns2ddr(dsidev, 60) + 26; | 3866 | tclk_post = ns2ddr(dsidev, 60) + 26; |
3778 | 3867 | ||
3779 | ths_eot = DIV_ROUND_UP(4, dsi_get_num_data_lanes_dssdev(dssdev)); | 3868 | ths_eot = DIV_ROUND_UP(4, ndl); |
3780 | 3869 | ||
3781 | ddr_clk_pre = DIV_ROUND_UP(tclk_pre + tlpx + tclk_zero + tclk_prepare, | 3870 | ddr_clk_pre = DIV_ROUND_UP(tclk_pre + tlpx + tclk_zero + tclk_prepare, |
3782 | 4); | 3871 | 4); |
@@ -3806,7 +3895,114 @@ static void dsi_proto_timings(struct omap_dss_device *dssdev) | |||
3806 | 3895 | ||
3807 | DSSDBG("enter_hs_mode_lat %u, exit_hs_mode_lat %u\n", | 3896 | DSSDBG("enter_hs_mode_lat %u, exit_hs_mode_lat %u\n", |
3808 | enter_hs_mode_lat, exit_hs_mode_lat); | 3897 | enter_hs_mode_lat, exit_hs_mode_lat); |
3898 | |||
3899 | if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { | ||
3900 | /* TODO: Implement a video mode check_timings function */ | ||
3901 | int hsa = dssdev->panel.dsi_vm_data.hsa; | ||
3902 | int hfp = dssdev->panel.dsi_vm_data.hfp; | ||
3903 | int hbp = dssdev->panel.dsi_vm_data.hbp; | ||
3904 | int vsa = dssdev->panel.dsi_vm_data.vsa; | ||
3905 | int vfp = dssdev->panel.dsi_vm_data.vfp; | ||
3906 | int vbp = dssdev->panel.dsi_vm_data.vbp; | ||
3907 | int window_sync = dssdev->panel.dsi_vm_data.window_sync; | ||
3908 | bool hsync_end = dssdev->panel.dsi_vm_data.vp_hsync_end; | ||
3909 | struct omap_video_timings *timings = &dssdev->panel.timings; | ||
3910 | int bpp = dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt); | ||
3911 | int tl, t_he, width_bytes; | ||
3912 | |||
3913 | t_he = hsync_end ? | ||
3914 | ((hsa == 0 && ndl == 3) ? 1 : DIV_ROUND_UP(4, ndl)) : 0; | ||
3915 | |||
3916 | width_bytes = DIV_ROUND_UP(timings->x_res * bpp, 8); | ||
3917 | |||
3918 | /* TL = t_HS + HSA + t_HE + HFP + ceil((WC + 6) / NDL) + HBP */ | ||
3919 | tl = DIV_ROUND_UP(4, ndl) + (hsync_end ? hsa : 0) + t_he + hfp + | ||
3920 | DIV_ROUND_UP(width_bytes + 6, ndl) + hbp; | ||
3921 | |||
3922 | DSSDBG("HBP: %d, HFP: %d, HSA: %d, TL: %d TXBYTECLKHS\n", hbp, | ||
3923 | hfp, hsync_end ? hsa : 0, tl); | ||
3924 | DSSDBG("VBP: %d, VFP: %d, VSA: %d, VACT: %d lines\n", vbp, vfp, | ||
3925 | vsa, timings->y_res); | ||
3926 | |||
3927 | r = dsi_read_reg(dsidev, DSI_VM_TIMING1); | ||
3928 | r = FLD_MOD(r, hbp, 11, 0); /* HBP */ | ||
3929 | r = FLD_MOD(r, hfp, 23, 12); /* HFP */ | ||
3930 | r = FLD_MOD(r, hsync_end ? hsa : 0, 31, 24); /* HSA */ | ||
3931 | dsi_write_reg(dsidev, DSI_VM_TIMING1, r); | ||
3932 | |||
3933 | r = dsi_read_reg(dsidev, DSI_VM_TIMING2); | ||
3934 | r = FLD_MOD(r, vbp, 7, 0); /* VBP */ | ||
3935 | r = FLD_MOD(r, vfp, 15, 8); /* VFP */ | ||
3936 | r = FLD_MOD(r, vsa, 23, 16); /* VSA */ | ||
3937 | r = FLD_MOD(r, window_sync, 27, 24); /* WINDOW_SYNC */ | ||
3938 | dsi_write_reg(dsidev, DSI_VM_TIMING2, r); | ||
3939 | |||
3940 | r = dsi_read_reg(dsidev, DSI_VM_TIMING3); | ||
3941 | r = FLD_MOD(r, timings->y_res, 14, 0); /* VACT */ | ||
3942 | r = FLD_MOD(r, tl, 31, 16); /* TL */ | ||
3943 | dsi_write_reg(dsidev, DSI_VM_TIMING3, r); | ||
3944 | } | ||
3945 | } | ||
3946 | |||
3947 | int dsi_video_mode_enable(struct omap_dss_device *dssdev, int channel) | ||
3948 | { | ||
3949 | struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); | ||
3950 | int bpp = dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt); | ||
3951 | u8 data_type; | ||
3952 | u16 word_count; | ||
3953 | |||
3954 | switch (dssdev->panel.dsi_pix_fmt) { | ||
3955 | case OMAP_DSS_DSI_FMT_RGB888: | ||
3956 | data_type = MIPI_DSI_PACKED_PIXEL_STREAM_24; | ||
3957 | break; | ||
3958 | case OMAP_DSS_DSI_FMT_RGB666: | ||
3959 | data_type = MIPI_DSI_PIXEL_STREAM_3BYTE_18; | ||
3960 | break; | ||
3961 | case OMAP_DSS_DSI_FMT_RGB666_PACKED: | ||
3962 | data_type = MIPI_DSI_PACKED_PIXEL_STREAM_18; | ||
3963 | break; | ||
3964 | case OMAP_DSS_DSI_FMT_RGB565: | ||
3965 | data_type = MIPI_DSI_PACKED_PIXEL_STREAM_16; | ||
3966 | break; | ||
3967 | default: | ||
3968 | BUG(); | ||
3969 | }; | ||
3970 | |||
3971 | dsi_if_enable(dsidev, false); | ||
3972 | dsi_vc_enable(dsidev, channel, false); | ||
3973 | |||
3974 | /* MODE, 1 = video mode */ | ||
3975 | REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), 1, 4, 4); | ||
3976 | |||
3977 | word_count = DIV_ROUND_UP(dssdev->panel.timings.x_res * bpp, 8); | ||
3978 | |||
3979 | dsi_vc_write_long_header(dsidev, channel, data_type, word_count, 0); | ||
3980 | |||
3981 | dsi_vc_enable(dsidev, channel, true); | ||
3982 | dsi_if_enable(dsidev, true); | ||
3983 | |||
3984 | dssdev->manager->enable(dssdev->manager); | ||
3985 | |||
3986 | return 0; | ||
3809 | } | 3987 | } |
3988 | EXPORT_SYMBOL(dsi_video_mode_enable); | ||
3989 | |||
3990 | void dsi_video_mode_disable(struct omap_dss_device *dssdev, int channel) | ||
3991 | { | ||
3992 | struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); | ||
3993 | |||
3994 | dsi_if_enable(dsidev, false); | ||
3995 | dsi_vc_enable(dsidev, channel, false); | ||
3996 | |||
3997 | /* MODE, 0 = command mode */ | ||
3998 | REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), 0, 4, 4); | ||
3999 | |||
4000 | dsi_vc_enable(dsidev, channel, true); | ||
4001 | dsi_if_enable(dsidev, true); | ||
4002 | |||
4003 | dssdev->manager->disable(dssdev->manager); | ||
4004 | } | ||
4005 | EXPORT_SYMBOL(dsi_video_mode_disable); | ||
3810 | 4006 | ||
3811 | static void dsi_update_screen_dispc(struct omap_dss_device *dssdev, | 4007 | static void dsi_update_screen_dispc(struct omap_dss_device *dssdev, |
3812 | u16 x, u16 y, u16 w, u16 h) | 4008 | u16 x, u16 y, u16 w, u16 h) |
@@ -4019,28 +4215,9 @@ EXPORT_SYMBOL(omap_dsi_update); | |||
4019 | static int dsi_display_init_dispc(struct omap_dss_device *dssdev) | 4215 | static int dsi_display_init_dispc(struct omap_dss_device *dssdev) |
4020 | { | 4216 | { |
4021 | int r; | 4217 | int r; |
4022 | u32 irq; | ||
4023 | |||
4024 | irq = dssdev->manager->id == OMAP_DSS_CHANNEL_LCD ? | ||
4025 | DISPC_IRQ_FRAMEDONE : DISPC_IRQ_FRAMEDONE2; | ||
4026 | |||
4027 | r = omap_dispc_register_isr(dsi_framedone_irq_callback, (void *) dssdev, | ||
4028 | irq); | ||
4029 | if (r) { | ||
4030 | DSSERR("can't get FRAMEDONE irq\n"); | ||
4031 | return r; | ||
4032 | } | ||
4033 | |||
4034 | dispc_mgr_set_lcd_display_type(dssdev->manager->id, | ||
4035 | OMAP_DSS_LCD_DISPLAY_TFT); | ||
4036 | |||
4037 | dispc_mgr_enable_stallmode(dssdev->manager->id, true); | ||
4038 | dispc_mgr_enable_fifohandcheck(dssdev->manager->id, 1); | ||
4039 | |||
4040 | dispc_mgr_set_tft_data_lines(dssdev->manager->id, | ||
4041 | dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt)); | ||
4042 | 4218 | ||
4043 | { | 4219 | if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_CMD_MODE) { |
4220 | u32 irq; | ||
4044 | struct omap_video_timings timings = { | 4221 | struct omap_video_timings timings = { |
4045 | .hsw = 1, | 4222 | .hsw = 1, |
4046 | .hfp = 1, | 4223 | .hfp = 1, |
@@ -4050,21 +4227,46 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev) | |||
4050 | .vbp = 0, | 4227 | .vbp = 0, |
4051 | }; | 4228 | }; |
4052 | 4229 | ||
4230 | irq = dssdev->manager->id == OMAP_DSS_CHANNEL_LCD ? | ||
4231 | DISPC_IRQ_FRAMEDONE : DISPC_IRQ_FRAMEDONE2; | ||
4232 | |||
4233 | r = omap_dispc_register_isr(dsi_framedone_irq_callback, | ||
4234 | (void *) dssdev, irq); | ||
4235 | if (r) { | ||
4236 | DSSERR("can't get FRAMEDONE irq\n"); | ||
4237 | return r; | ||
4238 | } | ||
4239 | |||
4240 | dispc_mgr_enable_stallmode(dssdev->manager->id, true); | ||
4241 | dispc_mgr_enable_fifohandcheck(dssdev->manager->id, 1); | ||
4242 | |||
4053 | dispc_mgr_set_lcd_timings(dssdev->manager->id, &timings); | 4243 | dispc_mgr_set_lcd_timings(dssdev->manager->id, &timings); |
4244 | } else { | ||
4245 | dispc_mgr_enable_stallmode(dssdev->manager->id, false); | ||
4246 | dispc_mgr_enable_fifohandcheck(dssdev->manager->id, 0); | ||
4247 | |||
4248 | dispc_mgr_set_lcd_timings(dssdev->manager->id, | ||
4249 | &dssdev->panel.timings); | ||
4054 | } | 4250 | } |
4055 | 4251 | ||
4252 | dispc_mgr_set_lcd_display_type(dssdev->manager->id, | ||
4253 | OMAP_DSS_LCD_DISPLAY_TFT); | ||
4254 | dispc_mgr_set_tft_data_lines(dssdev->manager->id, | ||
4255 | dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt)); | ||
4056 | return 0; | 4256 | return 0; |
4057 | } | 4257 | } |
4058 | 4258 | ||
4059 | static void dsi_display_uninit_dispc(struct omap_dss_device *dssdev) | 4259 | static void dsi_display_uninit_dispc(struct omap_dss_device *dssdev) |
4060 | { | 4260 | { |
4061 | u32 irq; | 4261 | if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_CMD_MODE) { |
4262 | u32 irq; | ||
4062 | 4263 | ||
4063 | irq = dssdev->manager->id == OMAP_DSS_CHANNEL_LCD ? | 4264 | irq = dssdev->manager->id == OMAP_DSS_CHANNEL_LCD ? |
4064 | DISPC_IRQ_FRAMEDONE : DISPC_IRQ_FRAMEDONE2; | 4265 | DISPC_IRQ_FRAMEDONE : DISPC_IRQ_FRAMEDONE2; |
4065 | 4266 | ||
4066 | omap_dispc_unregister_isr(dsi_framedone_irq_callback, (void *) dssdev, | 4267 | omap_dispc_unregister_isr(dsi_framedone_irq_callback, |
4067 | irq); | 4268 | (void *) dssdev, irq); |
4269 | } | ||
4068 | } | 4270 | } |
4069 | 4271 | ||
4070 | static int dsi_configure_dsi_clocks(struct omap_dss_device *dssdev) | 4272 | static int dsi_configure_dsi_clocks(struct omap_dss_device *dssdev) |