tangled
alpha
login
or
join now
tjh.dev
/
kernel
1
fork
atom
Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1
fork
atom
overview
issues
pulls
pipelines
Merge omapdss componentization work
Tomi Valkeinen
10 years ago
a8998202
9f5ddefd
+410
-212
11 changed files
expand all
collapse all
unified
split
drivers
video
fbdev
omap2
dss
core.c
dispc.c
dpi.c
dsi.c
dss.c
dss.h
hdmi4.c
hdmi5.c
rfbi.c
sdi.c
venc.c
+31
-57
drivers/video/fbdev/omap2/dss/core.c
reviewed
···
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
53
-
static bool dss_initialized;
54
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
65
-
66
66
-
bool omapdss_is_initialized(void)
67
67
-
{
68
68
-
return dss_initialized;
69
69
-
}
70
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
256
+
dss_init_platform_driver,
257
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
273
-
static void (*dss_output_drv_unreg_funcs[])(void) __exitdata = {
274
274
-
#ifdef CONFIG_OMAP2_DSS_DSI
275
275
-
dsi_uninit_platform_driver,
276
276
-
#endif
277
277
-
#ifdef CONFIG_OMAP2_DSS_DPI
278
278
-
dpi_uninit_platform_driver,
279
279
-
#endif
280
280
-
#ifdef CONFIG_OMAP2_DSS_SDI
281
281
-
sdi_uninit_platform_driver,
282
282
-
#endif
283
283
-
#ifdef CONFIG_OMAP2_DSS_RFBI
284
284
-
rfbi_uninit_platform_driver,
285
285
-
#endif
286
286
-
#ifdef CONFIG_OMAP2_DSS_VENC
287
287
-
venc_uninit_platform_driver,
279
279
+
static void (*dss_output_drv_unreg_funcs[])(void) = {
280
280
+
#ifdef CONFIG_OMAP5_DSS_HDMI
281
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
292
-
#ifdef CONFIG_OMAP5_DSS_HDMI
293
293
-
hdmi5_uninit_platform_driver,
286
286
+
#ifdef CONFIG_OMAP2_DSS_VENC
287
287
+
venc_uninit_platform_driver,
294
288
#endif
289
289
+
#ifdef CONFIG_OMAP2_DSS_RFBI
290
290
+
rfbi_uninit_platform_driver,
291
291
+
#endif
292
292
+
#ifdef CONFIG_OMAP2_DSS_SDI
293
293
+
sdi_uninit_platform_driver,
294
294
+
#endif
295
295
+
#ifdef CONFIG_OMAP2_DSS_DPI
296
296
+
dpi_uninit_platform_driver,
297
297
+
#endif
298
298
+
#ifdef CONFIG_OMAP2_DSS_DSI
299
299
+
dsi_uninit_platform_driver,
300
300
+
#endif
301
301
+
dispc_uninit_platform_driver,
302
302
+
dss_uninit_platform_driver,
295
303
};
296
296
-
297
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
308
-
r = dss_init_platform_driver();
309
309
-
if (r) {
310
310
-
DSSERR("Failed to initialize DSS platform driver\n");
311
311
-
goto err_dss;
312
312
-
}
313
313
-
314
314
-
r = dispc_init_platform_driver();
315
315
-
if (r) {
316
316
-
DSSERR("Failed to initialize dispc platform driver\n");
317
317
-
goto err_dispc;
318
318
-
}
319
319
-
320
320
-
/*
321
321
-
* It's ok if the output-driver register fails. It happens, for example,
322
322
-
* when there is no output-device (e.g. SDI for OMAP4).
323
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
326
-
if (r == 0)
327
327
-
dss_output_drv_loaded[i] = true;
316
316
+
if (r)
317
317
+
goto err_reg;
328
318
}
329
329
-
330
330
-
dss_initialized = true;
331
319
332
320
return 0;
333
321
334
334
-
err_dispc:
335
335
-
dss_uninit_platform_driver();
336
336
-
err_dss:
322
322
+
err_reg:
323
323
+
for (i = ARRAY_SIZE(dss_output_drv_reg_funcs) - i;
324
324
+
i < ARRAY_SIZE(dss_output_drv_reg_funcs);
325
325
+
++i)
326
326
+
dss_output_drv_unreg_funcs[i]();
327
327
+
337
328
platform_driver_unregister(&omap_dss_driver);
338
329
339
330
return r;
···
328
349
{
329
350
int i;
330
351
331
331
-
for (i = 0; i < ARRAY_SIZE(dss_output_drv_unreg_funcs); ++i) {
332
332
-
if (dss_output_drv_loaded[i])
333
333
-
dss_output_drv_unreg_funcs[i]();
334
334
-
}
335
335
-
336
336
-
dispc_uninit_platform_driver();
337
337
-
dss_uninit_platform_driver();
352
352
+
for (i = 0; i < ARRAY_SIZE(dss_output_drv_unreg_funcs); ++i)
353
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
reviewed
···
39
39
#include <linux/mfd/syscon.h>
40
40
#include <linux/regmap.h>
41
41
#include <linux/of.h>
42
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
3696
-
static const struct dispc_features omap24xx_dispc_feats __initconst = {
3695
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
3715
-
static const struct dispc_features omap34xx_rev1_0_dispc_feats __initconst = {
3714
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
3735
-
static const struct dispc_features omap34xx_rev3_0_dispc_feats __initconst = {
3734
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
3755
-
static const struct dispc_features omap44xx_dispc_feats __initconst = {
3754
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
3775
-
static const struct dispc_features omap54xx_dispc_feats __initconst = {
3774
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
3796
-
static int __init dispc_init_features(struct platform_device *pdev)
3795
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
3886
-
static int __init omap_dispchw_probe(struct platform_device *pdev)
3885
3885
+
static int dispc_bind(struct device *dev, struct device *master, void *data)
3887
3886
{
3887
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
3960
-
static int __exit omap_dispchw_remove(struct platform_device *pdev)
3958
3958
+
static void dispc_unbind(struct device *dev, struct device *master,
3959
3959
+
void *data)
3961
3960
{
3962
3962
-
pm_runtime_disable(&pdev->dev);
3961
3961
+
pm_runtime_disable(dev);
3963
3962
3964
3963
dss_uninit_overlay_managers();
3964
3964
+
}
3965
3965
3966
3966
+
static const struct component_ops dispc_component_ops = {
3967
3967
+
.bind = dispc_bind,
3968
3968
+
.unbind = dispc_unbind,
3969
3969
+
};
3970
3970
+
3971
3971
+
static int dispc_probe(struct platform_device *pdev)
3972
3972
+
{
3973
3973
+
return component_add(&pdev->dev, &dispc_component_ops);
3974
3974
+
}
3975
3975
+
3976
3976
+
static int dispc_remove(struct platform_device *pdev)
3977
3977
+
{
3978
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
4033
-
.remove = __exit_p(omap_dispchw_remove),
4016
4016
+
.probe = dispc_probe,
4017
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
4045
-
return platform_driver_probe(&omap_dispchw_driver, omap_dispchw_probe);
4027
4027
+
return platform_driver_register(&omap_dispchw_driver);
4046
4028
}
4047
4029
4048
4048
-
void __exit dispc_uninit_platform_driver(void)
4030
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
reviewed
···
32
32
#include <linux/string.h>
33
33
#include <linux/of.h>
34
34
#include <linux/clk.h>
35
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
735
-
static void __exit dpi_uninit_output(struct platform_device *pdev)
734
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
779
-
static void __exit dpi_uninit_output_port(struct device_node *port)
778
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
787
-
static int omap_dpi_probe(struct platform_device *pdev)
786
786
+
static int dpi_bind(struct device *dev, struct device *master, void *data)
788
787
{
788
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
807
-
static int __exit omap_dpi_remove(struct platform_device *pdev)
805
805
+
static void dpi_unbind(struct device *dev, struct device *master, void *data)
808
806
{
809
809
-
dpi_uninit_output(pdev);
807
807
+
struct platform_device *pdev = to_platform_device(dev);
810
808
809
809
+
dpi_uninit_output(pdev);
810
810
+
}
811
811
+
812
812
+
static const struct component_ops dpi_component_ops = {
813
813
+
.bind = dpi_bind,
814
814
+
.unbind = dpi_unbind,
815
815
+
};
816
816
+
817
817
+
static int dpi_probe(struct platform_device *pdev)
818
818
+
{
819
819
+
return component_add(&pdev->dev, &dpi_component_ops);
820
820
+
}
821
821
+
822
822
+
static int dpi_remove(struct platform_device *pdev)
823
823
+
{
824
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
815
-
.probe = omap_dpi_probe,
816
816
-
.remove = __exit_p(omap_dpi_remove),
829
829
+
.probe = dpi_probe,
830
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
844
-
void __exit dpi_uninit_platform_driver(void)
826
826
+
void dpi_uninit_platform_driver(void)
845
827
{
846
828
platform_driver_unregister(&omap_dpi_driver);
847
829
}
848
830
849
849
-
int __init dpi_init_port(struct platform_device *pdev, struct device_node *port)
831
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
891
-
void __exit dpi_uninit_port(struct device_node *port)
873
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
reviewed
···
40
40
#include <linux/pm_runtime.h>
41
41
#include <linux/of.h>
42
42
#include <linux/of_platform.h>
43
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
5278
-
static int omap_dsihw_probe(struct platform_device *dsidev)
5277
5277
+
static int dsi_bind(struct device *dev, struct device *master, void *data)
5279
5278
{
5279
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
5489
-
static int __exit omap_dsihw_remove(struct platform_device *dsidev)
5487
5487
+
static void dsi_unbind(struct device *dev, struct device *master, void *data)
5490
5488
{
5489
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
5505
+
}
5508
5506
5507
5507
+
static const struct component_ops dsi_component_ops = {
5508
5508
+
.bind = dsi_bind,
5509
5509
+
.unbind = dsi_unbind,
5510
5510
+
};
5511
5511
+
5512
5512
+
static int dsi_probe(struct platform_device *pdev)
5513
5513
+
{
5514
5514
+
return component_add(&pdev->dev, &dsi_component_ops);
5515
5515
+
}
5516
5516
+
5517
5517
+
static int dsi_remove(struct platform_device *pdev)
5518
5518
+
{
5519
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
5589
-
.probe = omap_dsihw_probe,
5590
5590
-
.remove = __exit_p(omap_dsihw_remove),
5572
5572
+
.probe = dsi_probe,
5573
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
5604
-
void __exit dsi_uninit_platform_driver(void)
5587
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
reviewed
···
39
39
#include <linux/of.h>
40
40
#include <linux/regulator/consumer.h>
41
41
#include <linux/suspend.h>
42
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
113
+
114
114
+
static bool dss_initialized;
115
115
+
116
116
+
bool omapdss_is_initialized(void)
117
117
+
{
118
118
+
return dss_initialized;
119
119
+
}
120
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
823
-
static const struct dss_features omap24xx_dss_feats __initconst = {
814
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
836
-
static const struct dss_features omap34xx_dss_feats __initconst = {
827
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
845
-
static const struct dss_features omap3630_dss_feats __initconst = {
836
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
854
-
static const struct dss_features omap44xx_dss_feats __initconst = {
845
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
863
-
static const struct dss_features omap54xx_dss_feats __initconst = {
854
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
872
-
static const struct dss_features am43xx_dss_feats __initconst = {
863
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
881
-
static const struct dss_features dra7xx_dss_feats __initconst = {
872
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
890
-
static int __init dss_init_features(struct platform_device *pdev)
881
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
944
-
static int __init dss_init_ports(struct platform_device *pdev)
935
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
988
-
static void __exit dss_uninit_ports(struct platform_device *pdev)
979
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
1030
-
/* DSS HW IP initialisation */
1031
1031
-
static int __init omap_dsshw_probe(struct platform_device *pdev)
1021
1021
+
static int dss_video_pll_probe(struct platform_device *pdev)
1032
1022
{
1033
1033
-
struct resource *dss_mem;
1034
1023
struct device_node *np = pdev->dev.of_node;
1035
1035
-
u32 rev;
1036
1036
-
int r;
1037
1024
struct regulator *pll_regulator;
1025
1025
+
int r;
1038
1026
1039
1039
-
dss.pdev = pdev;
1027
1027
+
if (!np)
1028
1028
+
return 0;
1040
1029
1041
1041
-
r = dss_init_features(dss.pdev);
1042
1042
-
if (r)
1043
1043
-
return r;
1044
1044
-
1045
1045
-
dss_mem = platform_get_resource(dss.pdev, IORESOURCE_MEM, 0);
1046
1046
-
if (!dss_mem) {
1047
1047
-
DSSERR("can't get IORESOURCE_MEM DSS\n");
1048
1048
-
return -EINVAL;
1049
1049
-
}
1050
1050
-
1051
1051
-
dss.base = devm_ioremap(&pdev->dev, dss_mem->start,
1052
1052
-
resource_size(dss_mem));
1053
1053
-
if (!dss.base) {
1054
1054
-
DSSERR("can't ioremap DSS\n");
1055
1055
-
return -ENOMEM;
1056
1056
-
}
1057
1057
-
1058
1058
-
r = dss_get_clocks();
1059
1059
-
if (r)
1060
1060
-
return r;
1061
1061
-
1062
1062
-
r = dss_setup_default_clock();
1063
1063
-
if (r)
1064
1064
-
goto err_setup_clocks;
1065
1065
-
1066
1066
-
pm_runtime_enable(&pdev->dev);
1067
1067
-
1068
1068
-
r = dss_runtime_get();
1069
1069
-
if (r)
1070
1070
-
goto err_runtime_get;
1071
1071
-
1072
1072
-
dss.dss_clk_rate = clk_get_rate(dss.dss_clk);
1073
1073
-
1074
1074
-
/* Select DPLL */
1075
1075
-
REG_FLD_MOD(DSS_CONTROL, 0, 0, 0);
1076
1076
-
1077
1077
-
dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
1078
1078
-
1079
1079
-
#ifdef CONFIG_OMAP2_DSS_VENC
1080
1080
-
REG_FLD_MOD(DSS_CONTROL, 1, 4, 4); /* venc dac demen */
1081
1081
-
REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */
1082
1082
-
REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */
1083
1083
-
#endif
1084
1084
-
dss.dsi_clk_source[0] = OMAP_DSS_CLK_SRC_FCK;
1085
1085
-
dss.dsi_clk_source[1] = OMAP_DSS_CLK_SRC_FCK;
1086
1086
-
dss.dispc_clk_source = OMAP_DSS_CLK_SRC_FCK;
1087
1087
-
dss.lcd_clk_source[0] = OMAP_DSS_CLK_SRC_FCK;
1088
1088
-
dss.lcd_clk_source[1] = OMAP_DSS_CLK_SRC_FCK;
1089
1089
-
1090
1090
-
dss_init_ports(pdev);
1091
1091
-
1092
1092
-
if (np && of_property_read_bool(np, "syscon-pll-ctrl")) {
1030
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
1076
-
if (IS_ERR(dss.video1_pll)) {
1077
1077
-
r = PTR_ERR(dss.video1_pll);
1078
1078
-
goto err_pll_init;
1079
1079
-
}
1120
1120
+
if (IS_ERR(dss.video1_pll))
1121
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
1085
-
r = PTR_ERR(dss.video2_pll);
1086
1086
-
goto err_pll_init;
1127
1127
+
dss_video_pll_uninit(dss.video1_pll);
1128
1128
+
return PTR_ERR(dss.video2_pll);
1087
1129
}
1088
1130
}
1131
1131
+
1132
1132
+
return 0;
1133
1133
+
}
1134
1134
+
1135
1135
+
/* DSS HW IP initialisation */
1136
1136
+
static int dss_bind(struct device *dev)
1137
1137
+
{
1138
1138
+
struct platform_device *pdev = to_platform_device(dev);
1139
1139
+
struct resource *dss_mem;
1140
1140
+
u32 rev;
1141
1141
+
int r;
1142
1142
+
1143
1143
+
dss.pdev = pdev;
1144
1144
+
1145
1145
+
r = dss_init_features(dss.pdev);
1146
1146
+
if (r)
1147
1147
+
return r;
1148
1148
+
1149
1149
+
dss_mem = platform_get_resource(dss.pdev, IORESOURCE_MEM, 0);
1150
1150
+
if (!dss_mem) {
1151
1151
+
DSSERR("can't get IORESOURCE_MEM DSS\n");
1152
1152
+
return -EINVAL;
1153
1153
+
}
1154
1154
+
1155
1155
+
dss.base = devm_ioremap(&pdev->dev, dss_mem->start,
1156
1156
+
resource_size(dss_mem));
1157
1157
+
if (!dss.base) {
1158
1158
+
DSSERR("can't ioremap DSS\n");
1159
1159
+
return -ENOMEM;
1160
1160
+
}
1161
1161
+
1162
1162
+
r = dss_get_clocks();
1163
1163
+
if (r)
1164
1164
+
return r;
1165
1165
+
1166
1166
+
r = dss_setup_default_clock();
1167
1167
+
if (r)
1168
1168
+
goto err_setup_clocks;
1169
1169
+
1170
1170
+
r = dss_video_pll_probe(pdev);
1171
1171
+
if (r)
1172
1172
+
goto err_pll_init;
1173
1173
+
1174
1174
+
r = dss_init_ports(pdev);
1175
1175
+
if (r)
1176
1176
+
goto err_init_ports;
1177
1177
+
1178
1178
+
pm_runtime_enable(&pdev->dev);
1179
1179
+
1180
1180
+
r = dss_runtime_get();
1181
1181
+
if (r)
1182
1182
+
goto err_runtime_get;
1183
1183
+
1184
1184
+
dss.dss_clk_rate = clk_get_rate(dss.dss_clk);
1185
1185
+
1186
1186
+
/* Select DPLL */
1187
1187
+
REG_FLD_MOD(DSS_CONTROL, 0, 0, 0);
1188
1188
+
1189
1189
+
dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
1190
1190
+
1191
1191
+
#ifdef CONFIG_OMAP2_DSS_VENC
1192
1192
+
REG_FLD_MOD(DSS_CONTROL, 1, 4, 4); /* venc dac demen */
1193
1193
+
REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */
1194
1194
+
REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */
1195
1195
+
#endif
1196
1196
+
dss.dsi_clk_source[0] = OMAP_DSS_CLK_SRC_FCK;
1197
1197
+
dss.dsi_clk_source[1] = OMAP_DSS_CLK_SRC_FCK;
1198
1198
+
dss.dispc_clk_source = OMAP_DSS_CLK_SRC_FCK;
1199
1199
+
dss.lcd_clk_source[0] = OMAP_DSS_CLK_SRC_FCK;
1200
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
1140
+
r = component_bind_all(&pdev->dev, NULL);
1141
1141
+
if (r)
1142
1142
+
goto err_component;
1143
1143
+
1164
1144
dss_debugfs_create_file("dss", dss_dump_regs);
1165
1145
1166
1146
pm_set_vt_switch(0);
1167
1147
1148
1148
+
dss_initialized = true;
1149
1149
+
1168
1150
return 0;
1169
1151
1170
1170
-
err_pll_init:
1152
1152
+
err_component:
1153
1153
+
err_runtime_get:
1154
1154
+
pm_runtime_disable(&pdev->dev);
1155
1155
+
dss_uninit_ports(pdev);
1156
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
1176
-
err_runtime_get:
1177
1177
-
pm_runtime_disable(&pdev->dev);
1162
1162
+
err_pll_init:
1178
1163
err_setup_clocks:
1179
1164
dss_put_clocks();
1180
1165
return r;
1181
1166
}
1182
1167
1183
1183
-
static int __exit omap_dsshw_remove(struct platform_device *pdev)
1168
1168
+
static void dss_unbind(struct device *dev)
1184
1169
{
1170
1170
+
struct platform_device *pdev = to_platform_device(dev);
1171
1171
+
1172
1172
+
dss_initialized = false;
1173
1173
+
1174
1174
+
component_unbind_all(&pdev->dev, NULL);
1175
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
1172
+
}
1211
1173
1174
1174
+
static const struct component_master_ops dss_component_ops = {
1175
1175
+
.bind = dss_bind,
1176
1176
+
.unbind = dss_unbind,
1177
1177
+
};
1178
1178
+
1179
1179
+
static int dss_component_compare(struct device *dev, void *data)
1180
1180
+
{
1181
1181
+
struct device *child = data;
1182
1182
+
return dev == child;
1183
1183
+
}
1184
1184
+
1185
1185
+
static int dss_add_child_component(struct device *dev, void *data)
1186
1186
+
{
1187
1187
+
struct component_match **match = data;
1188
1188
+
1189
1189
+
component_match_add(dev->parent, match, dss_component_compare, dev);
1190
1190
+
1191
1191
+
return 0;
1192
1192
+
}
1193
1193
+
1194
1194
+
static int dss_probe(struct platform_device *pdev)
1195
1195
+
{
1196
1196
+
struct component_match *match = NULL;
1197
1197
+
int r;
1198
1198
+
1199
1199
+
/* add all the child devices as components */
1200
1200
+
device_for_each_child(&pdev->dev, &match, dss_add_child_component);
1201
1201
+
1202
1202
+
r = component_master_add_with_match(&pdev->dev, &dss_component_ops, match);
1203
1203
+
if (r)
1204
1204
+
return r;
1205
1205
+
1206
1206
+
return 0;
1207
1207
+
}
1208
1208
+
1209
1209
+
static int dss_remove(struct platform_device *pdev)
1210
1210
+
{
1211
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
1296
-
.remove = __exit_p(omap_dsshw_remove),
1218
1218
+
.probe = dss_probe,
1219
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
1308
-
return platform_driver_probe(&omap_dsshw_driver, omap_dsshw_probe);
1229
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
reviewed
···
309
309
310
310
/* SDI */
311
311
int sdi_init_platform_driver(void) __init;
312
312
-
void sdi_uninit_platform_driver(void) __exit;
312
312
+
void sdi_uninit_platform_driver(void);
313
313
314
314
#ifdef CONFIG_OMAP2_DSS_SDI
315
315
-
int sdi_init_port(struct platform_device *pdev, struct device_node *port) __init;
316
316
-
void sdi_uninit_port(struct device_node *port) __exit;
315
315
+
int sdi_init_port(struct platform_device *pdev, struct device_node *port);
316
316
+
void sdi_uninit_port(struct device_node *port);
317
317
#else
318
318
-
static inline int __init sdi_init_port(struct platform_device *pdev,
318
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
323
-
static inline void __exit sdi_uninit_port(struct device_node *port)
323
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
336
-
void dsi_uninit_platform_driver(void) __exit;
336
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
353
-
void dpi_uninit_platform_driver(void) __exit;
353
353
+
void dpi_uninit_platform_driver(void);
354
354
355
355
#ifdef CONFIG_OMAP2_DSS_DPI
356
356
-
int dpi_init_port(struct platform_device *pdev, struct device_node *port) __init;
357
357
-
void dpi_uninit_port(struct device_node *port) __exit;
356
356
+
int dpi_init_port(struct platform_device *pdev, struct device_node *port);
357
357
+
void dpi_uninit_port(struct device_node *port);
358
358
#else
359
359
-
static inline int __init dpi_init_port(struct platform_device *pdev,
359
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
364
-
static inline void __exit dpi_uninit_port(struct device_node *port)
364
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
371
-
void dispc_uninit_platform_driver(void) __exit;
371
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
421
-
void venc_uninit_platform_driver(void) __exit;
421
421
+
void venc_uninit_platform_driver(void);
422
422
423
423
/* HDMI */
424
424
int hdmi4_init_platform_driver(void) __init;
425
425
-
void hdmi4_uninit_platform_driver(void) __exit;
425
425
+
void hdmi4_uninit_platform_driver(void);
426
426
427
427
int hdmi5_init_platform_driver(void) __init;
428
428
-
void hdmi5_uninit_platform_driver(void) __exit;
428
428
+
void hdmi5_uninit_platform_driver(void);
429
429
430
430
/* RFBI */
431
431
int rfbi_init_platform_driver(void) __init;
432
432
-
void rfbi_uninit_platform_driver(void) __exit;
432
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
reviewed
···
32
32
#include <linux/clk.h>
33
33
#include <linux/gpio.h>
34
34
#include <linux/regulator/consumer.h>
35
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
650
-
static int omapdss_hdmihw_probe(struct platform_device *pdev)
649
649
+
static int hdmi4_bind(struct device *dev, struct device *master, void *data)
651
650
{
651
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
718
-
static int __exit omapdss_hdmihw_remove(struct platform_device *pdev)
716
716
+
static void hdmi4_unbind(struct device *dev, struct device *master, void *data)
719
717
{
718
718
+
struct platform_device *pdev = to_platform_device(dev);
719
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
726
+
}
730
727
728
728
+
static const struct component_ops hdmi4_component_ops = {
729
729
+
.bind = hdmi4_bind,
730
730
+
.unbind = hdmi4_unbind,
731
731
+
};
732
732
+
733
733
+
static int hdmi4_probe(struct platform_device *pdev)
734
734
+
{
735
735
+
return component_add(&pdev->dev, &hdmi4_component_ops);
736
736
+
}
737
737
+
738
738
+
static int hdmi4_remove(struct platform_device *pdev)
739
739
+
{
740
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
777
-
.probe = omapdss_hdmihw_probe,
778
778
-
.remove = __exit_p(omapdss_hdmihw_remove),
759
759
+
.probe = hdmi4_probe,
760
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
792
-
void __exit hdmi4_uninit_platform_driver(void)
774
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
reviewed
···
37
37
#include <linux/clk.h>
38
38
#include <linux/gpio.h>
39
39
#include <linux/regulator/consumer.h>
40
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
685
-
static int omapdss_hdmihw_probe(struct platform_device *pdev)
684
684
+
static int hdmi5_bind(struct device *dev, struct device *master, void *data)
686
685
{
686
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
753
-
static int __exit omapdss_hdmihw_remove(struct platform_device *pdev)
751
751
+
static void hdmi5_unbind(struct device *dev, struct device *master, void *data)
754
752
{
753
753
+
struct platform_device *pdev = to_platform_device(dev);
754
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
761
+
}
765
762
763
763
+
static const struct component_ops hdmi5_component_ops = {
764
764
+
.bind = hdmi5_bind,
765
765
+
.unbind = hdmi5_unbind,
766
766
+
};
767
767
+
768
768
+
static int hdmi5_probe(struct platform_device *pdev)
769
769
+
{
770
770
+
return component_add(&pdev->dev, &hdmi5_component_ops);
771
771
+
}
772
772
+
773
773
+
static int hdmi5_remove(struct platform_device *pdev)
774
774
+
{
775
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
813
-
.probe = omapdss_hdmihw_probe,
814
814
-
.remove = __exit_p(omapdss_hdmihw_remove),
795
795
+
.probe = hdmi5_probe,
796
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
828
-
void __exit hdmi5_uninit_platform_driver(void)
810
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
reviewed
···
36
36
#include <linux/semaphore.h>
37
37
#include <linux/platform_device.h>
38
38
#include <linux/pm_runtime.h>
39
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
942
-
static void __exit rfbi_uninit_output(struct platform_device *pdev)
941
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
950
-
static int omap_rfbihw_probe(struct platform_device *pdev)
949
949
+
static int rfbi_bind(struct device *dev, struct device *master, void *data)
951
950
{
951
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
1010
-
static int __exit omap_rfbihw_remove(struct platform_device *pdev)
1008
1008
+
static void rfbi_unbind(struct device *dev, struct device *master, void *data)
1011
1009
{
1010
1010
+
struct platform_device *pdev = to_platform_device(dev);
1011
1011
+
1012
1012
rfbi_uninit_output(pdev);
1013
1013
1014
1014
pm_runtime_disable(&pdev->dev);
1015
1015
1016
1016
+
return 0;
1017
1017
+
}
1018
1018
+
1019
1019
+
static const struct component_ops rfbi_component_ops = {
1020
1020
+
.bind = rfbi_bind,
1021
1021
+
.unbind = rfbi_unbind,
1022
1022
+
};
1023
1023
+
1024
1024
+
static int rfbi_probe(struct platform_device *pdev)
1025
1025
+
{
1026
1026
+
return component_add(&pdev->dev, &rfbi_component_ops);
1027
1027
+
}
1028
1028
+
1029
1029
+
static int rfbi_remove(struct platform_device *pdev)
1030
1030
+
{
1031
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
1061
-
.probe = omap_rfbihw_probe,
1062
1062
-
.remove = __exit_p(omap_rfbihw_remove),
1041
1041
+
.probe = rfbi_probe,
1042
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
1075
-
void __exit rfbi_uninit_platform_driver(void)
1055
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
reviewed
···
27
27
#include <linux/platform_device.h>
28
28
#include <linux/string.h>
29
29
#include <linux/of.h>
30
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
354
-
static void __exit sdi_uninit_output(struct platform_device *pdev)
353
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
361
-
static int omap_sdi_probe(struct platform_device *pdev)
360
360
+
static int sdi_bind(struct device *dev, struct device *master, void *data)
362
361
{
362
362
+
struct platform_device *pdev = to_platform_device(dev);
363
363
+
363
364
sdi.pdev = pdev;
364
365
365
366
sdi_init_output(pdev);
···
369
366
return 0;
370
367
}
371
368
372
372
-
static int __exit omap_sdi_remove(struct platform_device *pdev)
369
369
+
static void sdi_unbind(struct device *dev, struct device *master, void *data)
373
370
{
374
374
-
sdi_uninit_output(pdev);
371
371
+
struct platform_device *pdev = to_platform_device(dev);
375
372
373
373
+
sdi_uninit_output(pdev);
374
374
+
}
375
375
+
376
376
+
static const struct component_ops sdi_component_ops = {
377
377
+
.bind = sdi_bind,
378
378
+
.unbind = sdi_unbind,
379
379
+
};
380
380
+
381
381
+
static int sdi_probe(struct platform_device *pdev)
382
382
+
{
383
383
+
return component_add(&pdev->dev, &sdi_component_ops);
384
384
+
}
385
385
+
386
386
+
static int sdi_remove(struct platform_device *pdev)
387
387
+
{
388
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
380
-
.probe = omap_sdi_probe,
381
381
-
.remove = __exit_p(omap_sdi_remove),
393
393
+
.probe = sdi_probe,
394
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
409
-
void __exit sdi_uninit_platform_driver(void)
390
390
+
void sdi_uninit_platform_driver(void)
410
391
{
411
392
platform_driver_unregister(&omap_sdi_driver);
412
393
}
413
394
414
414
-
int __init sdi_init_port(struct platform_device *pdev, struct device_node *port)
395
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
448
-
void __exit sdi_uninit_port(struct device_node *port)
429
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
reviewed
···
35
35
#include <linux/regulator/consumer.h>
36
36
#include <linux/pm_runtime.h>
37
37
#include <linux/of.h>
38
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
806
-
static void __exit venc_uninit_output(struct platform_device *pdev)
805
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
856
-
static int omap_venchw_probe(struct platform_device *pdev)
855
855
+
static int venc_bind(struct device *dev, struct device *master, void *data)
857
856
{
857
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
917
-
static int __exit omap_venchw_remove(struct platform_device *pdev)
915
915
+
static void venc_unbind(struct device *dev, struct device *master, void *data)
918
916
{
917
917
+
struct platform_device *pdev = to_platform_device(dev);
918
918
+
919
919
venc_uninit_output(pdev);
920
920
921
921
pm_runtime_disable(&pdev->dev);
922
922
+
}
922
923
924
924
+
static const struct component_ops venc_component_ops = {
925
925
+
.bind = venc_bind,
926
926
+
.unbind = venc_unbind,
927
927
+
};
928
928
+
929
929
+
static int venc_probe(struct platform_device *pdev)
930
930
+
{
931
931
+
return component_add(&pdev->dev, &venc_component_ops);
932
932
+
}
933
933
+
934
934
+
static int venc_remove(struct platform_device *pdev)
935
935
+
{
936
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
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
979
-
.probe = omap_venchw_probe,
980
980
-
.remove = __exit_p(omap_venchw_remove),
962
962
+
.probe = venc_probe,
963
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
994
-
void __exit venc_uninit_platform_driver(void)
977
977
+
void venc_uninit_platform_driver(void)
995
978
{
996
979
platform_driver_unregister(&omap_venchw_driver);
997
980
}