Commit 74bf2ad508efa93db4254c9da9c7238da44e2c58
1 parent
210bed8f82
Exists in
master
and in
7 other branches
drm/kms: make fb helper work for all drivers.
This initialises the fb helper with the connector helper, so that the fb cmdline code works for intel as well. Signed-off-by: Dave Airlie <airlied@redhat.com>
Showing 3 changed files with 43 additions and 26 deletions Side-by-side Diff
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/radeon/radeon_connectors.c
... | ... | @@ -808,7 +808,9 @@ |
808 | 808 | switch (connector_type) { |
809 | 809 | case DRM_MODE_CONNECTOR_VGA: |
810 | 810 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
811 | - drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | |
811 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | |
812 | + if (ret) | |
813 | + goto failed; | |
812 | 814 | if (i2c_bus->valid) { |
813 | 815 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "VGA"); |
814 | 816 | if (!radeon_connector->ddc_bus) |
... | ... | @@ -821,7 +823,9 @@ |
821 | 823 | break; |
822 | 824 | case DRM_MODE_CONNECTOR_DVIA: |
823 | 825 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
824 | - drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | |
826 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | |
827 | + if (ret) | |
828 | + goto failed; | |
825 | 829 | if (i2c_bus->valid) { |
826 | 830 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); |
827 | 831 | if (!radeon_connector->ddc_bus) |
... | ... | @@ -841,7 +845,9 @@ |
841 | 845 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
842 | 846 | radeon_connector->con_priv = radeon_dig_connector; |
843 | 847 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
844 | - drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | |
848 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | |
849 | + if (ret) | |
850 | + goto failed; | |
845 | 851 | if (i2c_bus->valid) { |
846 | 852 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); |
847 | 853 | if (!radeon_connector->ddc_bus) |
... | ... | @@ -865,7 +871,9 @@ |
865 | 871 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
866 | 872 | radeon_connector->con_priv = radeon_dig_connector; |
867 | 873 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
868 | - drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | |
874 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | |
875 | + if (ret) | |
876 | + goto failed; | |
869 | 877 | if (i2c_bus->valid) { |
870 | 878 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "HDMI"); |
871 | 879 | if (!radeon_connector->ddc_bus) |
... | ... | @@ -884,7 +892,9 @@ |
884 | 892 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
885 | 893 | radeon_connector->con_priv = radeon_dig_connector; |
886 | 894 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
887 | - drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | |
895 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | |
896 | + if (ret) | |
897 | + goto failed; | |
888 | 898 | if (i2c_bus->valid) { |
889 | 899 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP"); |
890 | 900 | if (!radeon_connector->ddc_bus) |
891 | 901 | |
... | ... | @@ -897,12 +907,14 @@ |
897 | 907 | case DRM_MODE_CONNECTOR_9PinDIN: |
898 | 908 | if (radeon_tv == 1) { |
899 | 909 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); |
900 | - drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); | |
910 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); | |
911 | + if (ret) | |
912 | + goto failed; | |
913 | + radeon_connector->dac_load_detect = true; | |
914 | + drm_connector_attach_property(&radeon_connector->base, | |
915 | + rdev->mode_info.load_detect_property, | |
916 | + 1); | |
901 | 917 | } |
902 | - radeon_connector->dac_load_detect = true; | |
903 | - drm_connector_attach_property(&radeon_connector->base, | |
904 | - rdev->mode_info.load_detect_property, | |
905 | - 1); | |
906 | 918 | break; |
907 | 919 | case DRM_MODE_CONNECTOR_LVDS: |
908 | 920 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
... | ... | @@ -912,7 +924,9 @@ |
912 | 924 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
913 | 925 | radeon_connector->con_priv = radeon_dig_connector; |
914 | 926 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); |
915 | - drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); | |
927 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); | |
928 | + if (ret) | |
929 | + goto failed; | |
916 | 930 | if (i2c_bus->valid) { |
917 | 931 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "LVDS"); |
918 | 932 | if (!radeon_connector->ddc_bus) |
... | ... | @@ -926,10 +940,6 @@ |
926 | 940 | break; |
927 | 941 | } |
928 | 942 | |
929 | - ret = drm_fb_helper_add_connector(connector); | |
930 | - if (ret) | |
931 | - goto failed; | |
932 | - | |
933 | 943 | connector->display_info.subpixel_order = subpixel_order; |
934 | 944 | drm_sysfs_connector_add(connector); |
935 | 945 | return; |
... | ... | @@ -978,7 +988,9 @@ |
978 | 988 | switch (connector_type) { |
979 | 989 | case DRM_MODE_CONNECTOR_VGA: |
980 | 990 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
981 | - drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | |
991 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | |
992 | + if (ret) | |
993 | + goto failed; | |
982 | 994 | if (i2c_bus->valid) { |
983 | 995 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "VGA"); |
984 | 996 | if (!radeon_connector->ddc_bus) |
... | ... | @@ -991,7 +1003,9 @@ |
991 | 1003 | break; |
992 | 1004 | case DRM_MODE_CONNECTOR_DVIA: |
993 | 1005 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
994 | - drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | |
1006 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | |
1007 | + if (ret) | |
1008 | + goto failed; | |
995 | 1009 | if (i2c_bus->valid) { |
996 | 1010 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); |
997 | 1011 | if (!radeon_connector->ddc_bus) |
... | ... | @@ -1005,7 +1019,9 @@ |
1005 | 1019 | case DRM_MODE_CONNECTOR_DVII: |
1006 | 1020 | case DRM_MODE_CONNECTOR_DVID: |
1007 | 1021 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
1008 | - drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | |
1022 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | |
1023 | + if (ret) | |
1024 | + goto failed; | |
1009 | 1025 | if (i2c_bus->valid) { |
1010 | 1026 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); |
1011 | 1027 | if (!radeon_connector->ddc_bus) |
... | ... | @@ -1022,7 +1038,9 @@ |
1022 | 1038 | case DRM_MODE_CONNECTOR_9PinDIN: |
1023 | 1039 | if (radeon_tv == 1) { |
1024 | 1040 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); |
1025 | - drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); | |
1041 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); | |
1042 | + if (ret) | |
1043 | + goto failed; | |
1026 | 1044 | radeon_connector->dac_load_detect = true; |
1027 | 1045 | drm_connector_attach_property(&radeon_connector->base, |
1028 | 1046 | rdev->mode_info.load_detect_property, |
... | ... | @@ -1031,7 +1049,9 @@ |
1031 | 1049 | break; |
1032 | 1050 | case DRM_MODE_CONNECTOR_LVDS: |
1033 | 1051 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); |
1034 | - drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); | |
1052 | + ret = drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); | |
1053 | + if (ret) | |
1054 | + goto failed; | |
1035 | 1055 | if (i2c_bus->valid) { |
1036 | 1056 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "LVDS"); |
1037 | 1057 | if (!radeon_connector->ddc_bus) |
... | ... | @@ -1043,10 +1063,6 @@ |
1043 | 1063 | subpixel_order = SubPixelHorizontalRGB; |
1044 | 1064 | break; |
1045 | 1065 | } |
1046 | - | |
1047 | - ret = drm_fb_helper_add_connector(connector); | |
1048 | - if (ret) | |
1049 | - goto failed; | |
1050 | 1066 | |
1051 | 1067 | connector->display_info.subpixel_order = subpixel_order; |
1052 | 1068 | drm_sysfs_connector_add(connector); |
include/drm/drm_crtc_helper.h
... | ... | @@ -39,6 +39,7 @@ |
39 | 39 | |
40 | 40 | #include <linux/fb.h> |
41 | 41 | |
42 | +#include "drm_fb_helper.h" | |
42 | 43 | struct drm_crtc_helper_funcs { |
43 | 44 | /* |
44 | 45 | * Control power levels on the CRTC. If the mode passed in is |
45 | 46 | |
... | ... | @@ -119,10 +120,11 @@ |
119 | 120 | encoder->helper_private = (void *)funcs; |
120 | 121 | } |
121 | 122 | |
122 | -static inline void drm_connector_helper_add(struct drm_connector *connector, | |
123 | +static inline int drm_connector_helper_add(struct drm_connector *connector, | |
123 | 124 | const struct drm_connector_helper_funcs *funcs) |
124 | 125 | { |
125 | 126 | connector->helper_private = (void *)funcs; |
127 | + return drm_fb_helper_add_connector(connector); | |
126 | 128 | } |
127 | 129 | |
128 | 130 | extern int drm_helper_resume_force_mode(struct drm_device *dev); |