diff options
Diffstat (limited to 'drivers/video/omap2/dss/venc.c')
-rw-r--r-- | drivers/video/omap2/dss/venc.c | 128 |
1 files changed, 85 insertions, 43 deletions
diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c index eff35050e28a..8e35a5bae429 100644 --- a/drivers/video/omap2/dss/venc.c +++ b/drivers/video/omap2/dss/venc.c | |||
@@ -39,8 +39,6 @@ | |||
39 | 39 | ||
40 | #include "dss.h" | 40 | #include "dss.h" |
41 | 41 | ||
42 | #define VENC_BASE 0x48050C00 | ||
43 | |||
44 | /* Venc registers */ | 42 | /* Venc registers */ |
45 | #define VENC_REV_ID 0x00 | 43 | #define VENC_REV_ID 0x00 |
46 | #define VENC_STATUS 0x04 | 44 | #define VENC_STATUS 0x04 |
@@ -289,6 +287,7 @@ const struct omap_video_timings omap_dss_ntsc_timings = { | |||
289 | EXPORT_SYMBOL(omap_dss_ntsc_timings); | 287 | EXPORT_SYMBOL(omap_dss_ntsc_timings); |
290 | 288 | ||
291 | static struct { | 289 | static struct { |
290 | struct platform_device *pdev; | ||
292 | void __iomem *base; | 291 | void __iomem *base; |
293 | struct mutex venc_lock; | 292 | struct mutex venc_lock; |
294 | u32 wss_data; | 293 | u32 wss_data; |
@@ -381,11 +380,11 @@ static void venc_reset(void) | |||
381 | static void venc_enable_clocks(int enable) | 380 | static void venc_enable_clocks(int enable) |
382 | { | 381 | { |
383 | if (enable) | 382 | if (enable) |
384 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_54M | | 383 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK | DSS_CLK_TVFCK | |
385 | DSS_CLK_96M); | 384 | DSS_CLK_VIDFCK); |
386 | else | 385 | else |
387 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_54M | | 386 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK | DSS_CLK_TVFCK | |
388 | DSS_CLK_96M); | 387 | DSS_CLK_VIDFCK); |
389 | } | 388 | } |
390 | 389 | ||
391 | static const struct venc_config *venc_timings_to_config( | 390 | static const struct venc_config *venc_timings_to_config( |
@@ -641,50 +640,23 @@ static struct omap_dss_driver venc_driver = { | |||
641 | }; | 640 | }; |
642 | /* driver end */ | 641 | /* driver end */ |
643 | 642 | ||
644 | 643 | int venc_init_display(struct omap_dss_device *dssdev) | |
645 | |||
646 | int venc_init(struct platform_device *pdev) | ||
647 | { | 644 | { |
648 | u8 rev_id; | 645 | DSSDBG("init_display\n"); |
649 | 646 | ||
650 | mutex_init(&venc.venc_lock); | 647 | if (venc.vdda_dac_reg == NULL) { |
648 | struct regulator *vdda_dac; | ||
651 | 649 | ||
652 | venc.wss_data = 0; | 650 | vdda_dac = regulator_get(&venc.pdev->dev, "vdda_dac"); |
653 | 651 | ||
654 | venc.base = ioremap(VENC_BASE, SZ_1K); | 652 | if (IS_ERR(vdda_dac)) { |
655 | if (!venc.base) { | 653 | DSSERR("can't get VDDA_DAC regulator\n"); |
656 | DSSERR("can't ioremap VENC\n"); | 654 | return PTR_ERR(vdda_dac); |
657 | return -ENOMEM; | 655 | } |
658 | } | ||
659 | 656 | ||
660 | venc.vdda_dac_reg = dss_get_vdda_dac(); | 657 | venc.vdda_dac_reg = vdda_dac; |
661 | if (IS_ERR(venc.vdda_dac_reg)) { | ||
662 | iounmap(venc.base); | ||
663 | DSSERR("can't get VDDA_DAC regulator\n"); | ||
664 | return PTR_ERR(venc.vdda_dac_reg); | ||
665 | } | 658 | } |
666 | 659 | ||
667 | venc_enable_clocks(1); | ||
668 | |||
669 | rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff); | ||
670 | printk(KERN_INFO "OMAP VENC rev %d\n", rev_id); | ||
671 | |||
672 | venc_enable_clocks(0); | ||
673 | |||
674 | return omap_dss_register_driver(&venc_driver); | ||
675 | } | ||
676 | |||
677 | void venc_exit(void) | ||
678 | { | ||
679 | omap_dss_unregister_driver(&venc_driver); | ||
680 | |||
681 | iounmap(venc.base); | ||
682 | } | ||
683 | |||
684 | int venc_init_display(struct omap_dss_device *dssdev) | ||
685 | { | ||
686 | DSSDBG("init_display\n"); | ||
687 | |||
688 | return 0; | 660 | return 0; |
689 | } | 661 | } |
690 | 662 | ||
@@ -740,3 +712,73 @@ void venc_dump_regs(struct seq_file *s) | |||
740 | 712 | ||
741 | #undef DUMPREG | 713 | #undef DUMPREG |
742 | } | 714 | } |
715 | |||
716 | /* VENC HW IP initialisation */ | ||
717 | static int omap_venchw_probe(struct platform_device *pdev) | ||
718 | { | ||
719 | u8 rev_id; | ||
720 | struct resource *venc_mem; | ||
721 | |||
722 | venc.pdev = pdev; | ||
723 | |||
724 | mutex_init(&venc.venc_lock); | ||
725 | |||
726 | venc.wss_data = 0; | ||
727 | |||
728 | venc_mem = platform_get_resource(venc.pdev, IORESOURCE_MEM, 0); | ||
729 | if (!venc_mem) { | ||
730 | DSSERR("can't get IORESOURCE_MEM VENC\n"); | ||
731 | return -EINVAL; | ||
732 | } | ||
733 | venc.base = ioremap(venc_mem->start, resource_size(venc_mem)); | ||
734 | if (!venc.base) { | ||
735 | DSSERR("can't ioremap VENC\n"); | ||
736 | return -ENOMEM; | ||
737 | } | ||
738 | |||
739 | venc_enable_clocks(1); | ||
740 | |||
741 | rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff); | ||
742 | dev_dbg(&pdev->dev, "OMAP VENC rev %d\n", rev_id); | ||
743 | |||
744 | venc_enable_clocks(0); | ||
745 | |||
746 | return omap_dss_register_driver(&venc_driver); | ||
747 | } | ||
748 | |||
749 | static int omap_venchw_remove(struct platform_device *pdev) | ||
750 | { | ||
751 | if (venc.vdda_dac_reg != NULL) { | ||
752 | regulator_put(venc.vdda_dac_reg); | ||
753 | venc.vdda_dac_reg = NULL; | ||
754 | } | ||
755 | omap_dss_unregister_driver(&venc_driver); | ||
756 | |||
757 | iounmap(venc.base); | ||
758 | return 0; | ||
759 | } | ||
760 | |||
761 | static struct platform_driver omap_venchw_driver = { | ||
762 | .probe = omap_venchw_probe, | ||
763 | .remove = omap_venchw_remove, | ||
764 | .driver = { | ||
765 | .name = "omapdss_venc", | ||
766 | .owner = THIS_MODULE, | ||
767 | }, | ||
768 | }; | ||
769 | |||
770 | int venc_init_platform_driver(void) | ||
771 | { | ||
772 | if (cpu_is_omap44xx()) | ||
773 | return 0; | ||
774 | |||
775 | return platform_driver_register(&omap_venchw_driver); | ||
776 | } | ||
777 | |||
778 | void venc_uninit_platform_driver(void) | ||
779 | { | ||
780 | if (cpu_is_omap44xx()) | ||
781 | return; | ||
782 | |||
783 | return platform_driver_unregister(&omap_venchw_driver); | ||
784 | } | ||