aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_crtc.c35
-rw-r--r--include/drm/drm_crtc.h8
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 */
774int 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}
796EXPORT_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);
1282extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, 1286extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
1283 const struct edid *edid); 1287 const struct edid *edid);
1284 1288
1289extern int drm_display_info_set_bus_formats(struct drm_display_info *info,
1290 const u32 *formats,
1291 unsigned int num_formats);
1292
1285static inline bool drm_property_type_is(struct drm_property *property, 1293static inline bool drm_property_type_is(struct drm_property *property,
1286 uint32_t type) 1294 uint32_t type)
1287{ 1295{