Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge omapdss componentization work

+410 -212
+31 -57
drivers/video/fbdev/omap2/dss/core.c
··· 50 50 module_param_named(def_disp, def_disp_name, charp, 0); 51 51 MODULE_PARM_DESC(def_disp, "default display name"); 52 52 53 - static bool dss_initialized; 54 - 55 53 const char *omapdss_get_default_display_name(void) 56 54 { 57 55 return core.default_display_name; ··· 62 64 return pdata->version; 63 65 } 64 66 EXPORT_SYMBOL(omapdss_get_version); 65 - 66 - bool omapdss_is_initialized(void) 67 - { 68 - return dss_initialized; 69 - } 70 - EXPORT_SYMBOL(omapdss_is_initialized); 71 67 72 68 struct platform_device *dss_get_core_pdev(void) 73 69 { ··· 245 253 246 254 /* INIT */ 247 255 static int (*dss_output_drv_reg_funcs[])(void) __initdata = { 256 + dss_init_platform_driver, 257 + dispc_init_platform_driver, 248 258 #ifdef CONFIG_OMAP2_DSS_DSI 249 259 dsi_init_platform_driver, 250 260 #endif ··· 270 276 #endif 271 277 }; 272 278 273 - static void (*dss_output_drv_unreg_funcs[])(void) __exitdata = { 274 - #ifdef CONFIG_OMAP2_DSS_DSI 275 - dsi_uninit_platform_driver, 276 - #endif 277 - #ifdef CONFIG_OMAP2_DSS_DPI 278 - dpi_uninit_platform_driver, 279 - #endif 280 - #ifdef CONFIG_OMAP2_DSS_SDI 281 - sdi_uninit_platform_driver, 282 - #endif 283 - #ifdef CONFIG_OMAP2_DSS_RFBI 284 - rfbi_uninit_platform_driver, 285 - #endif 286 - #ifdef CONFIG_OMAP2_DSS_VENC 287 - venc_uninit_platform_driver, 279 + static void (*dss_output_drv_unreg_funcs[])(void) = { 280 + #ifdef CONFIG_OMAP5_DSS_HDMI 281 + hdmi5_uninit_platform_driver, 288 282 #endif 289 283 #ifdef CONFIG_OMAP4_DSS_HDMI 290 284 hdmi4_uninit_platform_driver, 291 285 #endif 292 - #ifdef CONFIG_OMAP5_DSS_HDMI 293 - hdmi5_uninit_platform_driver, 286 + #ifdef CONFIG_OMAP2_DSS_VENC 287 + venc_uninit_platform_driver, 294 288 #endif 289 + #ifdef CONFIG_OMAP2_DSS_RFBI 290 + rfbi_uninit_platform_driver, 291 + #endif 292 + #ifdef CONFIG_OMAP2_DSS_SDI 293 + sdi_uninit_platform_driver, 294 + #endif 295 + #ifdef CONFIG_OMAP2_DSS_DPI 296 + dpi_uninit_platform_driver, 297 + #endif 298 + #ifdef CONFIG_OMAP2_DSS_DSI 299 + dsi_uninit_platform_driver, 300 + #endif 301 + dispc_uninit_platform_driver, 302 + dss_uninit_platform_driver, 295 303 }; 296 - 297 - static bool dss_output_drv_loaded[ARRAY_SIZE(dss_output_drv_reg_funcs)]; 298 304 299 305 static int __init omap_dss_init(void) 300 306 { ··· 305 311 if (r) 306 312 return r; 307 313 308 - r = dss_init_platform_driver(); 309 - if (r) { 310 - DSSERR("Failed to initialize DSS platform driver\n"); 311 - goto err_dss; 312 - } 313 - 314 - r = dispc_init_platform_driver(); 315 - if (r) { 316 - DSSERR("Failed to initialize dispc platform driver\n"); 317 - goto err_dispc; 318 - } 319 - 320 - /* 321 - * It's ok if the output-driver register fails. It happens, for example, 322 - * when there is no output-device (e.g. SDI for OMAP4). 323 - */ 324 314 for (i = 0; i < ARRAY_SIZE(dss_output_drv_reg_funcs); ++i) { 325 315 r = dss_output_drv_reg_funcs[i](); 326 - if (r == 0) 327 - dss_output_drv_loaded[i] = true; 316 + if (r) 317 + goto err_reg; 328 318 } 329 - 330 - dss_initialized = true; 331 319 332 320 return 0; 333 321 334 - err_dispc: 335 - dss_uninit_platform_driver(); 336 - err_dss: 322 + err_reg: 323 + for (i = ARRAY_SIZE(dss_output_drv_reg_funcs) - i; 324 + i < ARRAY_SIZE(dss_output_drv_reg_funcs); 325 + ++i) 326 + dss_output_drv_unreg_funcs[i](); 327 + 337 328 platform_driver_unregister(&omap_dss_driver); 338 329 339 330 return r; ··· 328 349 { 329 350 int i; 330 351 331 - for (i = 0; i < ARRAY_SIZE(dss_output_drv_unreg_funcs); ++i) { 332 - if (dss_output_drv_loaded[i]) 333 - dss_output_drv_unreg_funcs[i](); 334 - } 335 - 336 - dispc_uninit_platform_driver(); 337 - dss_uninit_platform_driver(); 352 + for (i = 0; i < ARRAY_SIZE(dss_output_drv_unreg_funcs); ++i) 353 + dss_output_drv_unreg_funcs[i](); 338 354 339 355 platform_driver_unregister(&omap_dss_driver); 340 356 }
+30 -12
drivers/video/fbdev/omap2/dss/dispc.c
··· 39 39 #include <linux/mfd/syscon.h> 40 40 #include <linux/regmap.h> 41 41 #include <linux/of.h> 42 + #include <linux/component.h> 42 43 43 44 #include <video/omapdss.h> 44 45 ··· 3693 3692 dispc_init_mflag(); 3694 3693 } 3695 3694 3696 - static const struct dispc_features omap24xx_dispc_feats __initconst = { 3695 + static const struct dispc_features omap24xx_dispc_feats = { 3697 3696 .sw_start = 5, 3698 3697 .fp_start = 15, 3699 3698 .bp_start = 27, ··· 3712 3711 .set_max_preload = false, 3713 3712 }; 3714 3713 3715 - static const struct dispc_features omap34xx_rev1_0_dispc_feats __initconst = { 3714 + static const struct dispc_features omap34xx_rev1_0_dispc_feats = { 3716 3715 .sw_start = 5, 3717 3716 .fp_start = 15, 3718 3717 .bp_start = 27, ··· 3732 3731 .set_max_preload = false, 3733 3732 }; 3734 3733 3735 - static const struct dispc_features omap34xx_rev3_0_dispc_feats __initconst = { 3734 + static const struct dispc_features omap34xx_rev3_0_dispc_feats = { 3736 3735 .sw_start = 7, 3737 3736 .fp_start = 19, 3738 3737 .bp_start = 31, ··· 3752 3751 .set_max_preload = false, 3753 3752 }; 3754 3753 3755 - static const struct dispc_features omap44xx_dispc_feats __initconst = { 3754 + static const struct dispc_features omap44xx_dispc_feats = { 3756 3755 .sw_start = 7, 3757 3756 .fp_start = 19, 3758 3757 .bp_start = 31, ··· 3772 3771 .set_max_preload = true, 3773 3772 }; 3774 3773 3775 - static const struct dispc_features omap54xx_dispc_feats __initconst = { 3774 + static const struct dispc_features omap54xx_dispc_feats = { 3776 3775 .sw_start = 7, 3777 3776 .fp_start = 19, 3778 3777 .bp_start = 31, ··· 3793 3792 .set_max_preload = true, 3794 3793 }; 3795 3794 3796 - static int __init dispc_init_features(struct platform_device *pdev) 3795 + static int dispc_init_features(struct platform_device *pdev) 3797 3796 { 3798 3797 const struct dispc_features *src; 3799 3798 struct dispc_features *dst; ··· 3883 3882 EXPORT_SYMBOL(dispc_free_irq); 3884 3883 3885 3884 /* DISPC HW IP initialisation */ 3886 - static int __init omap_dispchw_probe(struct platform_device *pdev) 3885 + static int dispc_bind(struct device *dev, struct device *master, void *data) 3887 3886 { 3887 + struct platform_device *pdev = to_platform_device(dev); 3888 3888 u32 rev; 3889 3889 int r = 0; 3890 3890 struct resource *dispc_mem; ··· 3957 3955 return r; 3958 3956 } 3959 3957 3960 - static int __exit omap_dispchw_remove(struct platform_device *pdev) 3958 + static void dispc_unbind(struct device *dev, struct device *master, 3959 + void *data) 3961 3960 { 3962 - pm_runtime_disable(&pdev->dev); 3961 + pm_runtime_disable(dev); 3963 3962 3964 3963 dss_uninit_overlay_managers(); 3964 + } 3965 3965 3966 + static const struct component_ops dispc_component_ops = { 3967 + .bind = dispc_bind, 3968 + .unbind = dispc_unbind, 3969 + }; 3970 + 3971 + static int dispc_probe(struct platform_device *pdev) 3972 + { 3973 + return component_add(&pdev->dev, &dispc_component_ops); 3974 + } 3975 + 3976 + static int dispc_remove(struct platform_device *pdev) 3977 + { 3978 + component_del(&pdev->dev, &dispc_component_ops); 3966 3979 return 0; 3967 3980 } 3968 3981 ··· 4030 4013 }; 4031 4014 4032 4015 static struct platform_driver omap_dispchw_driver = { 4033 - .remove = __exit_p(omap_dispchw_remove), 4016 + .probe = dispc_probe, 4017 + .remove = dispc_remove, 4034 4018 .driver = { 4035 4019 .name = "omapdss_dispc", 4036 4020 .pm = &dispc_pm_ops, ··· 4042 4024 4043 4025 int __init dispc_init_platform_driver(void) 4044 4026 { 4045 - return platform_driver_probe(&omap_dispchw_driver, omap_dispchw_probe); 4027 + return platform_driver_register(&omap_dispchw_driver); 4046 4028 } 4047 4029 4048 - void __exit dispc_uninit_platform_driver(void) 4030 + void dispc_uninit_platform_driver(void) 4049 4031 { 4050 4032 platform_driver_unregister(&omap_dispchw_driver); 4051 4033 }
+28 -10
drivers/video/fbdev/omap2/dss/dpi.c
··· 32 32 #include <linux/string.h> 33 33 #include <linux/of.h> 34 34 #include <linux/clk.h> 35 + #include <linux/component.h> 35 36 36 37 #include <video/omapdss.h> 37 38 ··· 732 731 omapdss_register_output(out); 733 732 } 734 733 735 - static void __exit dpi_uninit_output(struct platform_device *pdev) 734 + static void dpi_uninit_output(struct platform_device *pdev) 736 735 { 737 736 struct dpi_data *dpi = dpi_get_data_from_pdev(pdev); 738 737 struct omap_dss_device *out = &dpi->output; ··· 776 775 omapdss_register_output(out); 777 776 } 778 777 779 - static void __exit dpi_uninit_output_port(struct device_node *port) 778 + static void dpi_uninit_output_port(struct device_node *port) 780 779 { 781 780 struct dpi_data *dpi = port->data; 782 781 struct omap_dss_device *out = &dpi->output; ··· 784 783 omapdss_unregister_output(out); 785 784 } 786 785 787 - static int omap_dpi_probe(struct platform_device *pdev) 786 + static int dpi_bind(struct device *dev, struct device *master, void *data) 788 787 { 788 + struct platform_device *pdev = to_platform_device(dev); 789 789 struct dpi_data *dpi; 790 790 791 791 dpi = devm_kzalloc(&pdev->dev, sizeof(*dpi), GFP_KERNEL); ··· 804 802 return 0; 805 803 } 806 804 807 - static int __exit omap_dpi_remove(struct platform_device *pdev) 805 + static void dpi_unbind(struct device *dev, struct device *master, void *data) 808 806 { 809 - dpi_uninit_output(pdev); 807 + struct platform_device *pdev = to_platform_device(dev); 810 808 809 + dpi_uninit_output(pdev); 810 + } 811 + 812 + static const struct component_ops dpi_component_ops = { 813 + .bind = dpi_bind, 814 + .unbind = dpi_unbind, 815 + }; 816 + 817 + static int dpi_probe(struct platform_device *pdev) 818 + { 819 + return component_add(&pdev->dev, &dpi_component_ops); 820 + } 821 + 822 + static int dpi_remove(struct platform_device *pdev) 823 + { 824 + component_del(&pdev->dev, &dpi_component_ops); 811 825 return 0; 812 826 } 813 827 814 828 static struct platform_driver omap_dpi_driver = { 815 - .probe = omap_dpi_probe, 816 - .remove = __exit_p(omap_dpi_remove), 829 + .probe = dpi_probe, 830 + .remove = dpi_remove, 817 831 .driver = { 818 832 .name = "omapdss_dpi", 819 833 .suppress_bind_attrs = true, ··· 841 823 return platform_driver_register(&omap_dpi_driver); 842 824 } 843 825 844 - void __exit dpi_uninit_platform_driver(void) 826 + void dpi_uninit_platform_driver(void) 845 827 { 846 828 platform_driver_unregister(&omap_dpi_driver); 847 829 } 848 830 849 - int __init dpi_init_port(struct platform_device *pdev, struct device_node *port) 831 + int dpi_init_port(struct platform_device *pdev, struct device_node *port) 850 832 { 851 833 struct dpi_data *dpi; 852 834 struct device_node *ep; ··· 888 870 return r; 889 871 } 890 872 891 - void __exit dpi_uninit_port(struct device_node *port) 873 + void dpi_uninit_port(struct device_node *port) 892 874 { 893 875 struct dpi_data *dpi = port->data; 894 876
+22 -5
drivers/video/fbdev/omap2/dss/dsi.c
··· 40 40 #include <linux/pm_runtime.h> 41 41 #include <linux/of.h> 42 42 #include <linux/of_platform.h> 43 + #include <linux/component.h> 43 44 44 45 #include <video/omapdss.h> 45 46 #include <video/mipi_display.h> ··· 5275 5274 } 5276 5275 5277 5276 /* DSI1 HW IP initialisation */ 5278 - static int omap_dsihw_probe(struct platform_device *dsidev) 5277 + static int dsi_bind(struct device *dev, struct device *master, void *data) 5279 5278 { 5279 + struct platform_device *dsidev = to_platform_device(dev); 5280 5280 u32 rev; 5281 5281 int r, i; 5282 5282 struct dsi_data *dsi; ··· 5486 5484 return r; 5487 5485 } 5488 5486 5489 - static int __exit omap_dsihw_remove(struct platform_device *dsidev) 5487 + static void dsi_unbind(struct device *dev, struct device *master, void *data) 5490 5488 { 5489 + struct platform_device *dsidev = to_platform_device(dev); 5491 5490 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 5492 5491 5493 5492 of_platform_depopulate(&dsidev->dev); ··· 5505 5502 regulator_disable(dsi->vdds_dsi_reg); 5506 5503 dsi->vdds_dsi_enabled = false; 5507 5504 } 5505 + } 5508 5506 5507 + static const struct component_ops dsi_component_ops = { 5508 + .bind = dsi_bind, 5509 + .unbind = dsi_unbind, 5510 + }; 5511 + 5512 + static int dsi_probe(struct platform_device *pdev) 5513 + { 5514 + return component_add(&pdev->dev, &dsi_component_ops); 5515 + } 5516 + 5517 + static int dsi_remove(struct platform_device *pdev) 5518 + { 5519 + component_del(&pdev->dev, &dsi_component_ops); 5509 5520 return 0; 5510 5521 } 5511 5522 ··· 5586 5569 }; 5587 5570 5588 5571 static struct platform_driver omap_dsihw_driver = { 5589 - .probe = omap_dsihw_probe, 5590 - .remove = __exit_p(omap_dsihw_remove), 5572 + .probe = dsi_probe, 5573 + .remove = dsi_remove, 5591 5574 .driver = { 5592 5575 .name = "omapdss_dsi", 5593 5576 .pm = &dsi_pm_ops, ··· 5601 5584 return platform_driver_register(&omap_dsihw_driver); 5602 5585 } 5603 5586 5604 - void __exit dsi_uninit_platform_driver(void) 5587 + void dsi_uninit_platform_driver(void) 5605 5588 { 5606 5589 platform_driver_unregister(&omap_dsihw_driver); 5607 5590 }
+159 -80
drivers/video/fbdev/omap2/dss/dss.c
··· 39 39 #include <linux/of.h> 40 40 #include <linux/regulator/consumer.h> 41 41 #include <linux/suspend.h> 42 + #include <linux/component.h> 42 43 43 44 #include <video/omapdss.h> 44 45 ··· 111 110 [OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC] = "DSI_PLL2_HSDIV_DISPC", 112 111 [OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI] = "DSI_PLL2_HSDIV_DSI", 113 112 }; 113 + 114 + static bool dss_initialized; 115 + 116 + bool omapdss_is_initialized(void) 117 + { 118 + return dss_initialized; 119 + } 120 + EXPORT_SYMBOL(omapdss_is_initialized); 114 121 115 122 static inline void dss_write_reg(const struct dss_reg idx, u32 val) 116 123 { ··· 820 811 OMAP_DISPLAY_TYPE_DPI, 821 812 }; 822 813 823 - static const struct dss_features omap24xx_dss_feats __initconst = { 814 + static const struct dss_features omap24xx_dss_feats = { 824 815 /* 825 816 * fck div max is really 16, but the divider range has gaps. The range 826 817 * from 1 to 6 has no gaps, so let's use that as a max. ··· 833 824 .num_ports = ARRAY_SIZE(omap2plus_ports), 834 825 }; 835 826 836 - static const struct dss_features omap34xx_dss_feats __initconst = { 827 + static const struct dss_features omap34xx_dss_feats = { 837 828 .fck_div_max = 16, 838 829 .dss_fck_multiplier = 2, 839 830 .parent_clk_name = "dpll4_ck", ··· 842 833 .num_ports = ARRAY_SIZE(omap34xx_ports), 843 834 }; 844 835 845 - static const struct dss_features omap3630_dss_feats __initconst = { 836 + static const struct dss_features omap3630_dss_feats = { 846 837 .fck_div_max = 32, 847 838 .dss_fck_multiplier = 1, 848 839 .parent_clk_name = "dpll4_ck", ··· 851 842 .num_ports = ARRAY_SIZE(omap2plus_ports), 852 843 }; 853 844 854 - static const struct dss_features omap44xx_dss_feats __initconst = { 845 + static const struct dss_features omap44xx_dss_feats = { 855 846 .fck_div_max = 32, 856 847 .dss_fck_multiplier = 1, 857 848 .parent_clk_name = "dpll_per_x2_ck", ··· 860 851 .num_ports = ARRAY_SIZE(omap2plus_ports), 861 852 }; 862 853 863 - static const struct dss_features omap54xx_dss_feats __initconst = { 854 + static const struct dss_features omap54xx_dss_feats = { 864 855 .fck_div_max = 64, 865 856 .dss_fck_multiplier = 1, 866 857 .parent_clk_name = "dpll_per_x2_ck", ··· 869 860 .num_ports = ARRAY_SIZE(omap2plus_ports), 870 861 }; 871 862 872 - static const struct dss_features am43xx_dss_feats __initconst = { 863 + static const struct dss_features am43xx_dss_feats = { 873 864 .fck_div_max = 0, 874 865 .dss_fck_multiplier = 0, 875 866 .parent_clk_name = NULL, ··· 878 869 .num_ports = ARRAY_SIZE(omap2plus_ports), 879 870 }; 880 871 881 - static const struct dss_features dra7xx_dss_feats __initconst = { 872 + static const struct dss_features dra7xx_dss_feats = { 882 873 .fck_div_max = 64, 883 874 .dss_fck_multiplier = 1, 884 875 .parent_clk_name = "dpll_per_x2_ck", ··· 887 878 .num_ports = ARRAY_SIZE(dra7xx_ports), 888 879 }; 889 880 890 - static int __init dss_init_features(struct platform_device *pdev) 881 + static int dss_init_features(struct platform_device *pdev) 891 882 { 892 883 const struct dss_features *src; 893 884 struct dss_features *dst; ··· 941 932 return 0; 942 933 } 943 934 944 - static int __init dss_init_ports(struct platform_device *pdev) 935 + static int dss_init_ports(struct platform_device *pdev) 945 936 { 946 937 struct device_node *parent = pdev->dev.of_node; 947 938 struct device_node *port; ··· 985 976 return 0; 986 977 } 987 978 988 - static void __exit dss_uninit_ports(struct platform_device *pdev) 979 + static void dss_uninit_ports(struct platform_device *pdev) 989 980 { 990 981 struct device_node *parent = pdev->dev.of_node; 991 982 struct device_node *port; ··· 1027 1018 } while ((port = omapdss_of_get_next_port(parent, port)) != NULL); 1028 1019 } 1029 1020 1030 - /* DSS HW IP initialisation */ 1031 - static int __init omap_dsshw_probe(struct platform_device *pdev) 1021 + static int dss_video_pll_probe(struct platform_device *pdev) 1032 1022 { 1033 - struct resource *dss_mem; 1034 1023 struct device_node *np = pdev->dev.of_node; 1035 - u32 rev; 1036 - int r; 1037 1024 struct regulator *pll_regulator; 1025 + int r; 1038 1026 1039 - dss.pdev = pdev; 1027 + if (!np) 1028 + return 0; 1040 1029 1041 - r = dss_init_features(dss.pdev); 1042 - if (r) 1043 - return r; 1044 - 1045 - dss_mem = platform_get_resource(dss.pdev, IORESOURCE_MEM, 0); 1046 - if (!dss_mem) { 1047 - DSSERR("can't get IORESOURCE_MEM DSS\n"); 1048 - return -EINVAL; 1049 - } 1050 - 1051 - dss.base = devm_ioremap(&pdev->dev, dss_mem->start, 1052 - resource_size(dss_mem)); 1053 - if (!dss.base) { 1054 - DSSERR("can't ioremap DSS\n"); 1055 - return -ENOMEM; 1056 - } 1057 - 1058 - r = dss_get_clocks(); 1059 - if (r) 1060 - return r; 1061 - 1062 - r = dss_setup_default_clock(); 1063 - if (r) 1064 - goto err_setup_clocks; 1065 - 1066 - pm_runtime_enable(&pdev->dev); 1067 - 1068 - r = dss_runtime_get(); 1069 - if (r) 1070 - goto err_runtime_get; 1071 - 1072 - dss.dss_clk_rate = clk_get_rate(dss.dss_clk); 1073 - 1074 - /* Select DPLL */ 1075 - REG_FLD_MOD(DSS_CONTROL, 0, 0, 0); 1076 - 1077 - dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); 1078 - 1079 - #ifdef CONFIG_OMAP2_DSS_VENC 1080 - REG_FLD_MOD(DSS_CONTROL, 1, 4, 4); /* venc dac demen */ 1081 - REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */ 1082 - REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */ 1083 - #endif 1084 - dss.dsi_clk_source[0] = OMAP_DSS_CLK_SRC_FCK; 1085 - dss.dsi_clk_source[1] = OMAP_DSS_CLK_SRC_FCK; 1086 - dss.dispc_clk_source = OMAP_DSS_CLK_SRC_FCK; 1087 - dss.lcd_clk_source[0] = OMAP_DSS_CLK_SRC_FCK; 1088 - dss.lcd_clk_source[1] = OMAP_DSS_CLK_SRC_FCK; 1089 - 1090 - dss_init_ports(pdev); 1091 - 1092 - if (np && of_property_read_bool(np, "syscon-pll-ctrl")) { 1030 + if (of_property_read_bool(np, "syscon-pll-ctrl")) { 1093 1031 dss.syscon_pll_ctrl = syscon_regmap_lookup_by_phandle(np, 1094 1032 "syscon-pll-ctrl"); 1095 1033 if (IS_ERR(dss.syscon_pll_ctrl)) { ··· 1073 1117 1074 1118 if (of_property_match_string(np, "reg-names", "pll1") >= 0) { 1075 1119 dss.video1_pll = dss_video_pll_init(pdev, 0, pll_regulator); 1076 - if (IS_ERR(dss.video1_pll)) { 1077 - r = PTR_ERR(dss.video1_pll); 1078 - goto err_pll_init; 1079 - } 1120 + if (IS_ERR(dss.video1_pll)) 1121 + return PTR_ERR(dss.video1_pll); 1080 1122 } 1081 1123 1082 1124 if (of_property_match_string(np, "reg-names", "pll2") >= 0) { 1083 1125 dss.video2_pll = dss_video_pll_init(pdev, 1, pll_regulator); 1084 1126 if (IS_ERR(dss.video2_pll)) { 1085 - r = PTR_ERR(dss.video2_pll); 1086 - goto err_pll_init; 1127 + dss_video_pll_uninit(dss.video1_pll); 1128 + return PTR_ERR(dss.video2_pll); 1087 1129 } 1088 1130 } 1131 + 1132 + return 0; 1133 + } 1134 + 1135 + /* DSS HW IP initialisation */ 1136 + static int dss_bind(struct device *dev) 1137 + { 1138 + struct platform_device *pdev = to_platform_device(dev); 1139 + struct resource *dss_mem; 1140 + u32 rev; 1141 + int r; 1142 + 1143 + dss.pdev = pdev; 1144 + 1145 + r = dss_init_features(dss.pdev); 1146 + if (r) 1147 + return r; 1148 + 1149 + dss_mem = platform_get_resource(dss.pdev, IORESOURCE_MEM, 0); 1150 + if (!dss_mem) { 1151 + DSSERR("can't get IORESOURCE_MEM DSS\n"); 1152 + return -EINVAL; 1153 + } 1154 + 1155 + dss.base = devm_ioremap(&pdev->dev, dss_mem->start, 1156 + resource_size(dss_mem)); 1157 + if (!dss.base) { 1158 + DSSERR("can't ioremap DSS\n"); 1159 + return -ENOMEM; 1160 + } 1161 + 1162 + r = dss_get_clocks(); 1163 + if (r) 1164 + return r; 1165 + 1166 + r = dss_setup_default_clock(); 1167 + if (r) 1168 + goto err_setup_clocks; 1169 + 1170 + r = dss_video_pll_probe(pdev); 1171 + if (r) 1172 + goto err_pll_init; 1173 + 1174 + r = dss_init_ports(pdev); 1175 + if (r) 1176 + goto err_init_ports; 1177 + 1178 + pm_runtime_enable(&pdev->dev); 1179 + 1180 + r = dss_runtime_get(); 1181 + if (r) 1182 + goto err_runtime_get; 1183 + 1184 + dss.dss_clk_rate = clk_get_rate(dss.dss_clk); 1185 + 1186 + /* Select DPLL */ 1187 + REG_FLD_MOD(DSS_CONTROL, 0, 0, 0); 1188 + 1189 + dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); 1190 + 1191 + #ifdef CONFIG_OMAP2_DSS_VENC 1192 + REG_FLD_MOD(DSS_CONTROL, 1, 4, 4); /* venc dac demen */ 1193 + REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */ 1194 + REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */ 1195 + #endif 1196 + dss.dsi_clk_source[0] = OMAP_DSS_CLK_SRC_FCK; 1197 + dss.dsi_clk_source[1] = OMAP_DSS_CLK_SRC_FCK; 1198 + dss.dispc_clk_source = OMAP_DSS_CLK_SRC_FCK; 1199 + dss.lcd_clk_source[0] = OMAP_DSS_CLK_SRC_FCK; 1200 + dss.lcd_clk_source[1] = OMAP_DSS_CLK_SRC_FCK; 1089 1201 1090 1202 rev = dss_read_reg(DSS_REVISION); 1091 1203 printk(KERN_INFO "OMAP DSS rev %d.%d\n", ··· 1161 1137 1162 1138 dss_runtime_put(); 1163 1139 1140 + r = component_bind_all(&pdev->dev, NULL); 1141 + if (r) 1142 + goto err_component; 1143 + 1164 1144 dss_debugfs_create_file("dss", dss_dump_regs); 1165 1145 1166 1146 pm_set_vt_switch(0); 1167 1147 1148 + dss_initialized = true; 1149 + 1168 1150 return 0; 1169 1151 1170 - err_pll_init: 1152 + err_component: 1153 + err_runtime_get: 1154 + pm_runtime_disable(&pdev->dev); 1155 + dss_uninit_ports(pdev); 1156 + err_init_ports: 1171 1157 if (dss.video1_pll) 1172 1158 dss_video_pll_uninit(dss.video1_pll); 1173 1159 1174 1160 if (dss.video2_pll) 1175 1161 dss_video_pll_uninit(dss.video2_pll); 1176 - err_runtime_get: 1177 - pm_runtime_disable(&pdev->dev); 1162 + err_pll_init: 1178 1163 err_setup_clocks: 1179 1164 dss_put_clocks(); 1180 1165 return r; 1181 1166 } 1182 1167 1183 - static int __exit omap_dsshw_remove(struct platform_device *pdev) 1168 + static void dss_unbind(struct device *dev) 1184 1169 { 1170 + struct platform_device *pdev = to_platform_device(dev); 1171 + 1172 + dss_initialized = false; 1173 + 1174 + component_unbind_all(&pdev->dev, NULL); 1175 + 1185 1176 if (dss.video1_pll) 1186 1177 dss_video_pll_uninit(dss.video1_pll); 1187 1178 ··· 1208 1169 pm_runtime_disable(&pdev->dev); 1209 1170 1210 1171 dss_put_clocks(); 1172 + } 1211 1173 1174 + static const struct component_master_ops dss_component_ops = { 1175 + .bind = dss_bind, 1176 + .unbind = dss_unbind, 1177 + }; 1178 + 1179 + static int dss_component_compare(struct device *dev, void *data) 1180 + { 1181 + struct device *child = data; 1182 + return dev == child; 1183 + } 1184 + 1185 + static int dss_add_child_component(struct device *dev, void *data) 1186 + { 1187 + struct component_match **match = data; 1188 + 1189 + component_match_add(dev->parent, match, dss_component_compare, dev); 1190 + 1191 + return 0; 1192 + } 1193 + 1194 + static int dss_probe(struct platform_device *pdev) 1195 + { 1196 + struct component_match *match = NULL; 1197 + int r; 1198 + 1199 + /* add all the child devices as components */ 1200 + device_for_each_child(&pdev->dev, &match, dss_add_child_component); 1201 + 1202 + r = component_master_add_with_match(&pdev->dev, &dss_component_ops, match); 1203 + if (r) 1204 + return r; 1205 + 1206 + return 0; 1207 + } 1208 + 1209 + static int dss_remove(struct platform_device *pdev) 1210 + { 1211 + component_master_del(&pdev->dev, &dss_component_ops); 1212 1212 return 0; 1213 1213 } 1214 1214 ··· 1293 1215 MODULE_DEVICE_TABLE(of, dss_of_match); 1294 1216 1295 1217 static struct platform_driver omap_dsshw_driver = { 1296 - .remove = __exit_p(omap_dsshw_remove), 1218 + .probe = dss_probe, 1219 + .remove = dss_remove, 1297 1220 .driver = { 1298 1221 .name = "omapdss_dss", 1299 1222 .pm = &dss_pm_ops, ··· 1305 1226 1306 1227 int __init dss_init_platform_driver(void) 1307 1228 { 1308 - return platform_driver_probe(&omap_dsshw_driver, omap_dsshw_probe); 1229 + return platform_driver_register(&omap_dsshw_driver); 1309 1230 } 1310 1231 1311 1232 void dss_uninit_platform_driver(void)
+16 -16
drivers/video/fbdev/omap2/dss/dss.h
··· 309 309 310 310 /* SDI */ 311 311 int sdi_init_platform_driver(void) __init; 312 - void sdi_uninit_platform_driver(void) __exit; 312 + void sdi_uninit_platform_driver(void); 313 313 314 314 #ifdef CONFIG_OMAP2_DSS_SDI 315 - int sdi_init_port(struct platform_device *pdev, struct device_node *port) __init; 316 - void sdi_uninit_port(struct device_node *port) __exit; 315 + int sdi_init_port(struct platform_device *pdev, struct device_node *port); 316 + void sdi_uninit_port(struct device_node *port); 317 317 #else 318 - static inline int __init sdi_init_port(struct platform_device *pdev, 318 + static inline int sdi_init_port(struct platform_device *pdev, 319 319 struct device_node *port) 320 320 { 321 321 return 0; 322 322 } 323 - static inline void __exit sdi_uninit_port(struct device_node *port) 323 + static inline void sdi_uninit_port(struct device_node *port) 324 324 { 325 325 } 326 326 #endif ··· 333 333 struct file_operations; 334 334 335 335 int dsi_init_platform_driver(void) __init; 336 - void dsi_uninit_platform_driver(void) __exit; 336 + void dsi_uninit_platform_driver(void); 337 337 338 338 void dsi_dump_clocks(struct seq_file *s); 339 339 ··· 350 350 351 351 /* DPI */ 352 352 int dpi_init_platform_driver(void) __init; 353 - void dpi_uninit_platform_driver(void) __exit; 353 + void dpi_uninit_platform_driver(void); 354 354 355 355 #ifdef CONFIG_OMAP2_DSS_DPI 356 - int dpi_init_port(struct platform_device *pdev, struct device_node *port) __init; 357 - void dpi_uninit_port(struct device_node *port) __exit; 356 + int dpi_init_port(struct platform_device *pdev, struct device_node *port); 357 + void dpi_uninit_port(struct device_node *port); 358 358 #else 359 - static inline int __init dpi_init_port(struct platform_device *pdev, 359 + static inline int dpi_init_port(struct platform_device *pdev, 360 360 struct device_node *port) 361 361 { 362 362 return 0; 363 363 } 364 - static inline void __exit dpi_uninit_port(struct device_node *port) 364 + static inline void dpi_uninit_port(struct device_node *port) 365 365 { 366 366 } 367 367 #endif 368 368 369 369 /* DISPC */ 370 370 int dispc_init_platform_driver(void) __init; 371 - void dispc_uninit_platform_driver(void) __exit; 371 + void dispc_uninit_platform_driver(void); 372 372 void dispc_dump_clocks(struct seq_file *s); 373 373 374 374 void dispc_enable_sidle(void); ··· 418 418 419 419 /* VENC */ 420 420 int venc_init_platform_driver(void) __init; 421 - void venc_uninit_platform_driver(void) __exit; 421 + void venc_uninit_platform_driver(void); 422 422 423 423 /* HDMI */ 424 424 int hdmi4_init_platform_driver(void) __init; 425 - void hdmi4_uninit_platform_driver(void) __exit; 425 + void hdmi4_uninit_platform_driver(void); 426 426 427 427 int hdmi5_init_platform_driver(void) __init; 428 - void hdmi5_uninit_platform_driver(void) __exit; 428 + void hdmi5_uninit_platform_driver(void); 429 429 430 430 /* RFBI */ 431 431 int rfbi_init_platform_driver(void) __init; 432 - void rfbi_uninit_platform_driver(void) __exit; 432 + void rfbi_uninit_platform_driver(void); 433 433 434 434 435 435 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
+23 -5
drivers/video/fbdev/omap2/dss/hdmi4.c
··· 32 32 #include <linux/clk.h> 33 33 #include <linux/gpio.h> 34 34 #include <linux/regulator/consumer.h> 35 + #include <linux/component.h> 35 36 #include <video/omapdss.h> 36 37 #include <sound/omap-hdmi-audio.h> 37 38 ··· 647 646 } 648 647 649 648 /* HDMI HW IP initialisation */ 650 - static int omapdss_hdmihw_probe(struct platform_device *pdev) 649 + static int hdmi4_bind(struct device *dev, struct device *master, void *data) 651 650 { 651 + struct platform_device *pdev = to_platform_device(dev); 652 652 int r; 653 653 int irq; 654 654 ··· 715 713 return r; 716 714 } 717 715 718 - static int __exit omapdss_hdmihw_remove(struct platform_device *pdev) 716 + static void hdmi4_unbind(struct device *dev, struct device *master, void *data) 719 717 { 718 + struct platform_device *pdev = to_platform_device(dev); 719 + 720 720 if (hdmi.audio_pdev) 721 721 platform_device_unregister(hdmi.audio_pdev); 722 722 ··· 727 723 hdmi_pll_uninit(&hdmi.pll); 728 724 729 725 pm_runtime_disable(&pdev->dev); 726 + } 730 727 728 + static const struct component_ops hdmi4_component_ops = { 729 + .bind = hdmi4_bind, 730 + .unbind = hdmi4_unbind, 731 + }; 732 + 733 + static int hdmi4_probe(struct platform_device *pdev) 734 + { 735 + return component_add(&pdev->dev, &hdmi4_component_ops); 736 + } 737 + 738 + static int hdmi4_remove(struct platform_device *pdev) 739 + { 740 + component_del(&pdev->dev, &hdmi4_component_ops); 731 741 return 0; 732 742 } 733 743 ··· 774 756 }; 775 757 776 758 static struct platform_driver omapdss_hdmihw_driver = { 777 - .probe = omapdss_hdmihw_probe, 778 - .remove = __exit_p(omapdss_hdmihw_remove), 759 + .probe = hdmi4_probe, 760 + .remove = hdmi4_remove, 779 761 .driver = { 780 762 .name = "omapdss_hdmi", 781 763 .pm = &hdmi_pm_ops, ··· 789 771 return platform_driver_register(&omapdss_hdmihw_driver); 790 772 } 791 773 792 - void __exit hdmi4_uninit_platform_driver(void) 774 + void hdmi4_uninit_platform_driver(void) 793 775 { 794 776 platform_driver_unregister(&omapdss_hdmihw_driver); 795 777 }
+23 -5
drivers/video/fbdev/omap2/dss/hdmi5.c
··· 37 37 #include <linux/clk.h> 38 38 #include <linux/gpio.h> 39 39 #include <linux/regulator/consumer.h> 40 + #include <linux/component.h> 40 41 #include <video/omapdss.h> 41 42 #include <sound/omap-hdmi-audio.h> 42 43 ··· 682 681 } 683 682 684 683 /* HDMI HW IP initialisation */ 685 - static int omapdss_hdmihw_probe(struct platform_device *pdev) 684 + static int hdmi5_bind(struct device *dev, struct device *master, void *data) 686 685 { 686 + struct platform_device *pdev = to_platform_device(dev); 687 687 int r; 688 688 int irq; 689 689 ··· 750 748 return r; 751 749 } 752 750 753 - static int __exit omapdss_hdmihw_remove(struct platform_device *pdev) 751 + static void hdmi5_unbind(struct device *dev, struct device *master, void *data) 754 752 { 753 + struct platform_device *pdev = to_platform_device(dev); 754 + 755 755 if (hdmi.audio_pdev) 756 756 platform_device_unregister(hdmi.audio_pdev); 757 757 ··· 762 758 hdmi_pll_uninit(&hdmi.pll); 763 759 764 760 pm_runtime_disable(&pdev->dev); 761 + } 765 762 763 + static const struct component_ops hdmi5_component_ops = { 764 + .bind = hdmi5_bind, 765 + .unbind = hdmi5_unbind, 766 + }; 767 + 768 + static int hdmi5_probe(struct platform_device *pdev) 769 + { 770 + return component_add(&pdev->dev, &hdmi5_component_ops); 771 + } 772 + 773 + static int hdmi5_remove(struct platform_device *pdev) 774 + { 775 + component_del(&pdev->dev, &hdmi5_component_ops); 766 776 return 0; 767 777 } 768 778 ··· 810 792 }; 811 793 812 794 static struct platform_driver omapdss_hdmihw_driver = { 813 - .probe = omapdss_hdmihw_probe, 814 - .remove = __exit_p(omapdss_hdmihw_remove), 795 + .probe = hdmi5_probe, 796 + .remove = hdmi5_remove, 815 797 .driver = { 816 798 .name = "omapdss_hdmi5", 817 799 .pm = &hdmi_pm_ops, ··· 825 807 return platform_driver_register(&omapdss_hdmihw_driver); 826 808 } 827 809 828 - void __exit hdmi5_uninit_platform_driver(void) 810 + void hdmi5_uninit_platform_driver(void) 829 811 { 830 812 platform_driver_unregister(&omapdss_hdmihw_driver); 831 813 }
+26 -6
drivers/video/fbdev/omap2/dss/rfbi.c
··· 36 36 #include <linux/semaphore.h> 37 37 #include <linux/platform_device.h> 38 38 #include <linux/pm_runtime.h> 39 + #include <linux/component.h> 39 40 40 41 #include <video/omapdss.h> 41 42 #include "dss.h" ··· 939 938 omapdss_register_output(out); 940 939 } 941 940 942 - static void __exit rfbi_uninit_output(struct platform_device *pdev) 941 + static void rfbi_uninit_output(struct platform_device *pdev) 943 942 { 944 943 struct omap_dss_device *out = &rfbi.output; 945 944 ··· 947 946 } 948 947 949 948 /* RFBI HW IP initialisation */ 950 - static int omap_rfbihw_probe(struct platform_device *pdev) 949 + static int rfbi_bind(struct device *dev, struct device *master, void *data) 951 950 { 951 + struct platform_device *pdev = to_platform_device(dev); 952 952 u32 rev; 953 953 struct resource *rfbi_mem; 954 954 struct clk *clk; ··· 1007 1005 return r; 1008 1006 } 1009 1007 1010 - static int __exit omap_rfbihw_remove(struct platform_device *pdev) 1008 + static void rfbi_unbind(struct device *dev, struct device *master, void *data) 1011 1009 { 1010 + struct platform_device *pdev = to_platform_device(dev); 1011 + 1012 1012 rfbi_uninit_output(pdev); 1013 1013 1014 1014 pm_runtime_disable(&pdev->dev); 1015 1015 1016 + return 0; 1017 + } 1018 + 1019 + static const struct component_ops rfbi_component_ops = { 1020 + .bind = rfbi_bind, 1021 + .unbind = rfbi_unbind, 1022 + }; 1023 + 1024 + static int rfbi_probe(struct platform_device *pdev) 1025 + { 1026 + return component_add(&pdev->dev, &rfbi_component_ops); 1027 + } 1028 + 1029 + static int rfbi_remove(struct platform_device *pdev) 1030 + { 1031 + component_del(&pdev->dev, &rfbi_component_ops); 1016 1032 return 0; 1017 1033 } 1018 1034 ··· 1058 1038 }; 1059 1039 1060 1040 static struct platform_driver omap_rfbihw_driver = { 1061 - .probe = omap_rfbihw_probe, 1062 - .remove = __exit_p(omap_rfbihw_remove), 1041 + .probe = rfbi_probe, 1042 + .remove = rfbi_remove, 1063 1043 .driver = { 1064 1044 .name = "omapdss_rfbi", 1065 1045 .pm = &rfbi_pm_ops, ··· 1072 1052 return platform_driver_register(&omap_rfbihw_driver); 1073 1053 } 1074 1054 1075 - void __exit rfbi_uninit_platform_driver(void) 1055 + void rfbi_uninit_platform_driver(void) 1076 1056 { 1077 1057 platform_driver_unregister(&omap_rfbihw_driver); 1078 1058 }
+28 -9
drivers/video/fbdev/omap2/dss/sdi.c
··· 27 27 #include <linux/platform_device.h> 28 28 #include <linux/string.h> 29 29 #include <linux/of.h> 30 + #include <linux/component.h> 30 31 31 32 #include <video/omapdss.h> 32 33 #include "dss.h" ··· 351 350 omapdss_register_output(out); 352 351 } 353 352 354 - static void __exit sdi_uninit_output(struct platform_device *pdev) 353 + static void sdi_uninit_output(struct platform_device *pdev) 355 354 { 356 355 struct omap_dss_device *out = &sdi.output; 357 356 358 357 omapdss_unregister_output(out); 359 358 } 360 359 361 - static int omap_sdi_probe(struct platform_device *pdev) 360 + static int sdi_bind(struct device *dev, struct device *master, void *data) 362 361 { 362 + struct platform_device *pdev = to_platform_device(dev); 363 + 363 364 sdi.pdev = pdev; 364 365 365 366 sdi_init_output(pdev); ··· 369 366 return 0; 370 367 } 371 368 372 - static int __exit omap_sdi_remove(struct platform_device *pdev) 369 + static void sdi_unbind(struct device *dev, struct device *master, void *data) 373 370 { 374 - sdi_uninit_output(pdev); 371 + struct platform_device *pdev = to_platform_device(dev); 375 372 373 + sdi_uninit_output(pdev); 374 + } 375 + 376 + static const struct component_ops sdi_component_ops = { 377 + .bind = sdi_bind, 378 + .unbind = sdi_unbind, 379 + }; 380 + 381 + static int sdi_probe(struct platform_device *pdev) 382 + { 383 + return component_add(&pdev->dev, &sdi_component_ops); 384 + } 385 + 386 + static int sdi_remove(struct platform_device *pdev) 387 + { 388 + component_del(&pdev->dev, &sdi_component_ops); 376 389 return 0; 377 390 } 378 391 379 392 static struct platform_driver omap_sdi_driver = { 380 - .probe = omap_sdi_probe, 381 - .remove = __exit_p(omap_sdi_remove), 393 + .probe = sdi_probe, 394 + .remove = sdi_remove, 382 395 .driver = { 383 396 .name = "omapdss_sdi", 384 397 .suppress_bind_attrs = true, ··· 406 387 return platform_driver_register(&omap_sdi_driver); 407 388 } 408 389 409 - void __exit sdi_uninit_platform_driver(void) 390 + void sdi_uninit_platform_driver(void) 410 391 { 411 392 platform_driver_unregister(&omap_sdi_driver); 412 393 } 413 394 414 - int __init sdi_init_port(struct platform_device *pdev, struct device_node *port) 395 + int sdi_init_port(struct platform_device *pdev, struct device_node *port) 415 396 { 416 397 struct device_node *ep; 417 398 u32 datapairs; ··· 445 426 return r; 446 427 } 447 428 448 - void __exit sdi_uninit_port(struct device_node *port) 429 + void sdi_uninit_port(struct device_node *port) 449 430 { 450 431 if (!sdi.port_initialized) 451 432 return;
+24 -7
drivers/video/fbdev/omap2/dss/venc.c
··· 35 35 #include <linux/regulator/consumer.h> 36 36 #include <linux/pm_runtime.h> 37 37 #include <linux/of.h> 38 + #include <linux/component.h> 38 39 39 40 #include <video/omapdss.h> 40 41 ··· 803 802 omapdss_register_output(out); 804 803 } 805 804 806 - static void __exit venc_uninit_output(struct platform_device *pdev) 805 + static void venc_uninit_output(struct platform_device *pdev) 807 806 { 808 807 struct omap_dss_device *out = &venc.output; 809 808 ··· 853 852 } 854 853 855 854 /* VENC HW IP initialisation */ 856 - static int omap_venchw_probe(struct platform_device *pdev) 855 + static int venc_bind(struct device *dev, struct device *master, void *data) 857 856 { 857 + struct platform_device *pdev = to_platform_device(dev); 858 858 u8 rev_id; 859 859 struct resource *venc_mem; 860 860 int r; ··· 914 912 return r; 915 913 } 916 914 917 - static int __exit omap_venchw_remove(struct platform_device *pdev) 915 + static void venc_unbind(struct device *dev, struct device *master, void *data) 918 916 { 917 + struct platform_device *pdev = to_platform_device(dev); 918 + 919 919 venc_uninit_output(pdev); 920 920 921 921 pm_runtime_disable(&pdev->dev); 922 + } 922 923 924 + static const struct component_ops venc_component_ops = { 925 + .bind = venc_bind, 926 + .unbind = venc_unbind, 927 + }; 928 + 929 + static int venc_probe(struct platform_device *pdev) 930 + { 931 + return component_add(&pdev->dev, &venc_component_ops); 932 + } 933 + 934 + static int venc_remove(struct platform_device *pdev) 935 + { 936 + component_del(&pdev->dev, &venc_component_ops); 923 937 return 0; 924 938 } 925 939 ··· 968 950 .runtime_resume = venc_runtime_resume, 969 951 }; 970 952 971 - 972 953 static const struct of_device_id venc_of_match[] = { 973 954 { .compatible = "ti,omap2-venc", }, 974 955 { .compatible = "ti,omap3-venc", }, ··· 976 959 }; 977 960 978 961 static struct platform_driver omap_venchw_driver = { 979 - .probe = omap_venchw_probe, 980 - .remove = __exit_p(omap_venchw_remove), 962 + .probe = venc_probe, 963 + .remove = venc_remove, 981 964 .driver = { 982 965 .name = "omapdss_venc", 983 966 .pm = &venc_pm_ops, ··· 991 974 return platform_driver_register(&omap_venchw_driver); 992 975 } 993 976 994 - void __exit venc_uninit_platform_driver(void) 977 + void venc_uninit_platform_driver(void) 995 978 { 996 979 platform_driver_unregister(&omap_venchw_driver); 997 980 }