diff options
| -rw-r--r-- | drivers/video/omap2/dss/apply.c | 46 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/dsi.c | 26 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/dss.h | 8 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/output.c | 12 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/rfbi.c | 12 |
5 files changed, 82 insertions, 22 deletions
diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c index 70eaa8f70e97..5952f149c91a 100644 --- a/drivers/video/omap2/dss/apply.c +++ b/drivers/video/omap2/dss/apply.c | |||
| @@ -105,6 +105,9 @@ struct mgr_priv_data { | |||
| 105 | 105 | ||
| 106 | struct omap_video_timings timings; | 106 | struct omap_video_timings timings; |
| 107 | struct dss_lcd_mgr_config lcd_config; | 107 | struct dss_lcd_mgr_config lcd_config; |
| 108 | |||
| 109 | void (*framedone_handler)(void *); | ||
| 110 | void *framedone_handler_data; | ||
| 108 | }; | 111 | }; |
| 109 | 112 | ||
| 110 | static struct { | 113 | static struct { |
| @@ -888,6 +891,21 @@ static void dss_apply_irq_handler(void *data, u32 mask) | |||
| 888 | if (!extra_updating) | 891 | if (!extra_updating) |
| 889 | complete_all(&extra_updated_completion); | 892 | complete_all(&extra_updated_completion); |
| 890 | 893 | ||
| 894 | /* call framedone handlers for manual update displays */ | ||
| 895 | for (i = 0; i < num_mgrs; i++) { | ||
| 896 | struct omap_overlay_manager *mgr; | ||
| 897 | struct mgr_priv_data *mp; | ||
| 898 | |||
| 899 | mgr = omap_dss_get_overlay_manager(i); | ||
| 900 | mp = get_mgr_priv(mgr); | ||
| 901 | |||
| 902 | if (!mgr_manual_update(mgr) || !mp->framedone_handler) | ||
| 903 | continue; | ||
| 904 | |||
| 905 | if (mask & dispc_mgr_get_framedone_irq(i)) | ||
| 906 | mp->framedone_handler(mp->framedone_handler_data); | ||
| 907 | } | ||
| 908 | |||
| 891 | if (!need_isr()) | 909 | if (!need_isr()) |
| 892 | dss_unregister_vsync_isr(); | 910 | dss_unregister_vsync_isr(); |
| 893 | 911 | ||
| @@ -1501,12 +1519,40 @@ err: | |||
| 1501 | return r; | 1519 | return r; |
| 1502 | } | 1520 | } |
| 1503 | 1521 | ||
| 1522 | static int dss_mgr_register_framedone_handler_compat(struct omap_overlay_manager *mgr, | ||
| 1523 | void (*handler)(void *), void *data) | ||
| 1524 | { | ||
| 1525 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | ||
| 1526 | |||
| 1527 | if (mp->framedone_handler) | ||
| 1528 | return -EBUSY; | ||
| 1529 | |||
| 1530 | mp->framedone_handler = handler; | ||
| 1531 | mp->framedone_handler_data = data; | ||
| 1532 | |||
| 1533 | return 0; | ||
| 1534 | } | ||
| 1535 | |||
| 1536 | static void dss_mgr_unregister_framedone_handler_compat(struct omap_overlay_manager *mgr, | ||
| 1537 | void (*handler)(void *), void *data) | ||
| 1538 | { | ||
| 1539 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | ||
| 1540 | |||
| 1541 | WARN_ON(mp->framedone_handler != handler || | ||
| 1542 | mp->framedone_handler_data != data); | ||
| 1543 | |||
| 1544 | mp->framedone_handler = NULL; | ||
| 1545 | mp->framedone_handler_data = NULL; | ||
| 1546 | } | ||
| 1547 | |||
| 1504 | static const struct dss_mgr_ops apply_mgr_ops = { | 1548 | static const struct dss_mgr_ops apply_mgr_ops = { |
| 1505 | .start_update = dss_mgr_start_update_compat, | 1549 | .start_update = dss_mgr_start_update_compat, |
| 1506 | .enable = dss_mgr_enable_compat, | 1550 | .enable = dss_mgr_enable_compat, |
| 1507 | .disable = dss_mgr_disable_compat, | 1551 | .disable = dss_mgr_disable_compat, |
| 1508 | .set_timings = dss_mgr_set_timings_compat, | 1552 | .set_timings = dss_mgr_set_timings_compat, |
| 1509 | .set_lcd_config = dss_mgr_set_lcd_config_compat, | 1553 | .set_lcd_config = dss_mgr_set_lcd_config_compat, |
| 1554 | .register_framedone_handler = dss_mgr_register_framedone_handler_compat, | ||
| 1555 | .unregister_framedone_handler = dss_mgr_unregister_framedone_handler_compat, | ||
| 1510 | }; | 1556 | }; |
| 1511 | 1557 | ||
| 1512 | static int compat_refcnt; | 1558 | static int compat_refcnt; |
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c index db9663dcfbd0..28d41d16b7be 100644 --- a/drivers/video/omap2/dss/dsi.c +++ b/drivers/video/omap2/dss/dsi.c | |||
| @@ -4535,7 +4535,7 @@ static void dsi_framedone_timeout_work_callback(struct work_struct *work) | |||
| 4535 | dsi_handle_framedone(dsi->pdev, -ETIMEDOUT); | 4535 | dsi_handle_framedone(dsi->pdev, -ETIMEDOUT); |
| 4536 | } | 4536 | } |
| 4537 | 4537 | ||
| 4538 | static void dsi_framedone_irq_callback(void *data, u32 mask) | 4538 | static void dsi_framedone_irq_callback(void *data) |
| 4539 | { | 4539 | { |
| 4540 | struct platform_device *dsidev = (struct platform_device *) data; | 4540 | struct platform_device *dsidev = (struct platform_device *) data; |
| 4541 | struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); | 4541 | struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); |
| @@ -4609,7 +4609,6 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev) | |||
| 4609 | struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); | 4609 | struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); |
| 4610 | struct omap_overlay_manager *mgr = dssdev->output->manager; | 4610 | struct omap_overlay_manager *mgr = dssdev->output->manager; |
| 4611 | int r; | 4611 | int r; |
| 4612 | u32 irq = 0; | ||
| 4613 | 4612 | ||
| 4614 | if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) { | 4613 | if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) { |
| 4615 | dsi->timings.hsw = 1; | 4614 | dsi->timings.hsw = 1; |
| @@ -4619,12 +4618,10 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev) | |||
| 4619 | dsi->timings.vfp = 0; | 4618 | dsi->timings.vfp = 0; |
| 4620 | dsi->timings.vbp = 0; | 4619 | dsi->timings.vbp = 0; |
| 4621 | 4620 | ||
| 4622 | irq = dispc_mgr_get_framedone_irq(mgr->id); | 4621 | r = dss_mgr_register_framedone_handler(mgr, |
| 4623 | 4622 | dsi_framedone_irq_callback, dsidev); | |
| 4624 | r = omap_dispc_register_isr(dsi_framedone_irq_callback, | ||
| 4625 | (void *) dsidev, irq); | ||
| 4626 | if (r) { | 4623 | if (r) { |
| 4627 | DSSERR("can't get FRAMEDONE irq\n"); | 4624 | DSSERR("can't register FRAMEDONE handler\n"); |
| 4628 | goto err; | 4625 | goto err; |
| 4629 | } | 4626 | } |
| 4630 | 4627 | ||
| @@ -4662,8 +4659,8 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev) | |||
| 4662 | return 0; | 4659 | return 0; |
| 4663 | err1: | 4660 | err1: |
| 4664 | if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) | 4661 | if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) |
| 4665 | omap_dispc_unregister_isr(dsi_framedone_irq_callback, | 4662 | dss_mgr_unregister_framedone_handler(mgr, |
| 4666 | (void *) dsidev, irq); | 4663 | dsi_framedone_irq_callback, dsidev); |
| 4667 | err: | 4664 | err: |
| 4668 | return r; | 4665 | return r; |
| 4669 | } | 4666 | } |
| @@ -4674,14 +4671,9 @@ static void dsi_display_uninit_dispc(struct omap_dss_device *dssdev) | |||
| 4674 | struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); | 4671 | struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); |
| 4675 | struct omap_overlay_manager *mgr = dssdev->output->manager; | 4672 | struct omap_overlay_manager *mgr = dssdev->output->manager; |
| 4676 | 4673 | ||
| 4677 | if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) { | 4674 | if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) |
| 4678 | u32 irq; | 4675 | dss_mgr_unregister_framedone_handler(mgr, |
| 4679 | 4676 | dsi_framedone_irq_callback, dsidev); | |
| 4680 | irq = dispc_mgr_get_framedone_irq(mgr->id); | ||
| 4681 | |||
| 4682 | omap_dispc_unregister_isr(dsi_framedone_irq_callback, | ||
| 4683 | (void *) dsidev, irq); | ||
| 4684 | } | ||
| 4685 | } | 4677 | } |
| 4686 | 4678 | ||
| 4687 | static int dsi_configure_dsi_clocks(struct omap_dss_device *dssdev) | 4679 | static int dsi_configure_dsi_clocks(struct omap_dss_device *dssdev) |
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h index 5cc13ea2b5a7..8ae73670aa37 100644 --- a/drivers/video/omap2/dss/dss.h +++ b/drivers/video/omap2/dss/dss.h | |||
| @@ -185,6 +185,10 @@ void dss_mgr_set_timings(struct omap_overlay_manager *mgr, | |||
| 185 | const struct omap_video_timings *timings); | 185 | const struct omap_video_timings *timings); |
| 186 | void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, | 186 | void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, |
| 187 | const struct dss_lcd_mgr_config *config); | 187 | const struct dss_lcd_mgr_config *config); |
| 188 | int dss_mgr_register_framedone_handler(struct omap_overlay_manager *mgr, | ||
| 189 | void (*handler)(void *), void *data); | ||
| 190 | void dss_mgr_unregister_framedone_handler(struct omap_overlay_manager *mgr, | ||
| 191 | void (*handler)(void *), void *data); | ||
| 188 | 192 | ||
| 189 | /* output */ | 193 | /* output */ |
| 190 | void dss_register_output(struct omap_dss_output *out); | 194 | void dss_register_output(struct omap_dss_output *out); |
| @@ -531,6 +535,10 @@ struct dss_mgr_ops { | |||
| 531 | const struct omap_video_timings *timings); | 535 | const struct omap_video_timings *timings); |
| 532 | void (*set_lcd_config)(struct omap_overlay_manager *mgr, | 536 | void (*set_lcd_config)(struct omap_overlay_manager *mgr, |
| 533 | const struct dss_lcd_mgr_config *config); | 537 | const struct dss_lcd_mgr_config *config); |
| 538 | int (*register_framedone_handler)(struct omap_overlay_manager *mgr, | ||
| 539 | void (*handler)(void *), void *data); | ||
| 540 | void (*unregister_framedone_handler)(struct omap_overlay_manager *mgr, | ||
| 541 | void (*handler)(void *), void *data); | ||
| 534 | }; | 542 | }; |
| 535 | 543 | ||
| 536 | int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops); | 544 | int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops); |
diff --git a/drivers/video/omap2/dss/output.c b/drivers/video/omap2/dss/output.c index 9527ee6a769e..6def0d7bbd05 100644 --- a/drivers/video/omap2/dss/output.c +++ b/drivers/video/omap2/dss/output.c | |||
| @@ -157,3 +157,15 @@ void dss_mgr_start_update(struct omap_overlay_manager *mgr) | |||
| 157 | { | 157 | { |
| 158 | dss_mgr_ops->start_update(mgr); | 158 | dss_mgr_ops->start_update(mgr); |
| 159 | } | 159 | } |
| 160 | |||
| 161 | int dss_mgr_register_framedone_handler(struct omap_overlay_manager *mgr, | ||
| 162 | void (*handler)(void *), void *data) | ||
| 163 | { | ||
| 164 | return dss_mgr_ops->register_framedone_handler(mgr, handler, data); | ||
| 165 | } | ||
| 166 | |||
| 167 | void dss_mgr_unregister_framedone_handler(struct omap_overlay_manager *mgr, | ||
| 168 | void (*handler)(void *), void *data) | ||
| 169 | { | ||
| 170 | dss_mgr_ops->unregister_framedone_handler(mgr, handler, data); | ||
| 171 | } | ||
diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c index ec9fde52716c..e903dd3f54d9 100644 --- a/drivers/video/omap2/dss/rfbi.c +++ b/drivers/video/omap2/dss/rfbi.c | |||
| @@ -342,7 +342,7 @@ static int rfbi_transfer_area(struct omap_dss_device *dssdev, | |||
| 342 | return 0; | 342 | return 0; |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | static void framedone_callback(void *data, u32 mask) | 345 | static void framedone_callback(void *data) |
| 346 | { | 346 | { |
| 347 | void (*callback)(void *data); | 347 | void (*callback)(void *data); |
| 348 | 348 | ||
| @@ -908,8 +908,8 @@ int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev) | |||
| 908 | goto err0; | 908 | goto err0; |
| 909 | } | 909 | } |
| 910 | 910 | ||
| 911 | r = omap_dispc_register_isr(framedone_callback, NULL, | 911 | r = dss_mgr_register_framedone_handler(out->manager, |
| 912 | DISPC_IRQ_FRAMEDONE); | 912 | framedone_callback, NULL); |
| 913 | if (r) { | 913 | if (r) { |
| 914 | DSSERR("can't get FRAMEDONE irq\n"); | 914 | DSSERR("can't get FRAMEDONE irq\n"); |
| 915 | goto err1; | 915 | goto err1; |
| @@ -933,8 +933,10 @@ EXPORT_SYMBOL(omapdss_rfbi_display_enable); | |||
| 933 | 933 | ||
| 934 | void omapdss_rfbi_display_disable(struct omap_dss_device *dssdev) | 934 | void omapdss_rfbi_display_disable(struct omap_dss_device *dssdev) |
| 935 | { | 935 | { |
| 936 | omap_dispc_unregister_isr(framedone_callback, NULL, | 936 | struct omap_dss_output *out = dssdev->output; |
| 937 | DISPC_IRQ_FRAMEDONE); | 937 | |
| 938 | dss_mgr_unregister_framedone_handler(out->manager, | ||
| 939 | framedone_callback, NULL); | ||
| 938 | omap_dss_stop_device(dssdev); | 940 | omap_dss_stop_device(dssdev); |
| 939 | 941 | ||
| 940 | rfbi_runtime_put(); | 942 | rfbi_runtime_put(); |
