diff options
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 35 | ||||
-rw-r--r-- | include/drm/drm_crtc.h | 8 |
2 files changed, 43 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index caec5c3634bb..df90048de92e 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -762,6 +762,40 @@ static void drm_mode_remove(struct drm_connector *connector, | |||
762 | } | 762 | } |
763 | 763 | ||
764 | /** | 764 | /** |
765 | * drm_display_info_set_bus_formats - set the supported bus formats | ||
766 | * @info: display info to store bus formats in | ||
767 | * @fmts: array containing the supported bus formats | ||
768 | * @nfmts: the number of entries in the fmts array | ||
769 | * | ||
770 | * Store the supported bus formats in display info structure. | ||
771 | * See MEDIA_BUS_FMT_* definitions in include/uapi/linux/media-bus-format.h for | ||
772 | * a full list of available formats. | ||
773 | */ | ||
774 | int drm_display_info_set_bus_formats(struct drm_display_info *info, | ||
775 | const u32 *formats, | ||
776 | unsigned int num_formats) | ||
777 | { | ||
778 | u32 *fmts = NULL; | ||
779 | |||
780 | if (!formats && num_formats) | ||
781 | return -EINVAL; | ||
782 | |||
783 | if (formats && num_formats) { | ||
784 | fmts = kmemdup(formats, sizeof(*formats) * num_formats, | ||
785 | GFP_KERNEL); | ||
786 | if (!formats) | ||
787 | return -ENOMEM; | ||
788 | } | ||
789 | |||
790 | kfree(info->bus_formats); | ||
791 | info->bus_formats = fmts; | ||
792 | info->num_bus_formats = num_formats; | ||
793 | |||
794 | return 0; | ||
795 | } | ||
796 | EXPORT_SYMBOL(drm_display_info_set_bus_formats); | ||
797 | |||
798 | /** | ||
765 | * drm_connector_get_cmdline_mode - reads the user's cmdline mode | 799 | * drm_connector_get_cmdline_mode - reads the user's cmdline mode |
766 | * @connector: connector to quwery | 800 | * @connector: connector to quwery |
767 | * | 801 | * |
@@ -923,6 +957,7 @@ void drm_connector_cleanup(struct drm_connector *connector) | |||
923 | ida_remove(&drm_connector_enum_list[connector->connector_type].ida, | 957 | ida_remove(&drm_connector_enum_list[connector->connector_type].ida, |
924 | connector->connector_type_id); | 958 | connector->connector_type_id); |
925 | 959 | ||
960 | kfree(connector->display_info.bus_formats); | ||
926 | drm_mode_object_put(dev, &connector->base); | 961 | drm_mode_object_put(dev, &connector->base); |
927 | kfree(connector->name); | 962 | kfree(connector->name); |
928 | connector->name = NULL; | 963 | connector->name = NULL; |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index f444263055c5..0ecfb7c80601 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/idr.h> | 31 | #include <linux/idr.h> |
32 | #include <linux/fb.h> | 32 | #include <linux/fb.h> |
33 | #include <linux/hdmi.h> | 33 | #include <linux/hdmi.h> |
34 | #include <linux/media-bus-format.h> | ||
34 | #include <uapi/drm/drm_mode.h> | 35 | #include <uapi/drm/drm_mode.h> |
35 | #include <uapi/drm/drm_fourcc.h> | 36 | #include <uapi/drm/drm_fourcc.h> |
36 | #include <drm/drm_modeset_lock.h> | 37 | #include <drm/drm_modeset_lock.h> |
@@ -139,6 +140,9 @@ struct drm_display_info { | |||
139 | enum subpixel_order subpixel_order; | 140 | enum subpixel_order subpixel_order; |
140 | u32 color_formats; | 141 | u32 color_formats; |
141 | 142 | ||
143 | const u32 *bus_formats; | ||
144 | unsigned int num_bus_formats; | ||
145 | |||
142 | /* Mask of supported hdmi deep color modes */ | 146 | /* Mask of supported hdmi deep color modes */ |
143 | u8 edid_hdmi_dc_modes; | 147 | u8 edid_hdmi_dc_modes; |
144 | 148 | ||
@@ -1282,6 +1286,10 @@ int drm_mode_connector_set_tile_property(struct drm_connector *connector); | |||
1282 | extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, | 1286 | extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, |
1283 | const struct edid *edid); | 1287 | const struct edid *edid); |
1284 | 1288 | ||
1289 | extern int drm_display_info_set_bus_formats(struct drm_display_info *info, | ||
1290 | const u32 *formats, | ||
1291 | unsigned int num_formats); | ||
1292 | |||
1285 | static inline bool drm_property_type_is(struct drm_property *property, | 1293 | static inline bool drm_property_type_is(struct drm_property *property, |
1286 | uint32_t type) | 1294 | uint32_t type) |
1287 | { | 1295 | { |