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

drm: add bus_formats and num_bus_formats fields to drm_display_info

Add bus_formats and num_bus_formats fields and
drm_display_info_set_bus_formats helper function to specify the bus
formats supported by a given display.

This information can be used by display controller drivers to configure
the output interface appropriately (i.e. RGB565, RGB666 or RGB888 on raw
RGB or LVDS busses).

Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
Acked-by: Thierry Reding <treding@nvidia.com>

+43
+35
drivers/gpu/drm/drm_crtc.c
··· 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 799 * drm_connector_get_cmdline_mode - reads the user's cmdline mode 766 800 * @connector: connector to quwery 767 801 * ··· 957 923 ida_remove(&drm_connector_enum_list[connector->connector_type].ida, 958 924 connector->connector_type_id); 959 925 926 + kfree(connector->display_info.bus_formats); 960 927 drm_mode_object_put(dev, &connector->base); 961 928 kfree(connector->name); 962 929 connector->name = NULL;
+8
include/drm/drm_crtc.h
··· 31 31 #include <linux/idr.h> 32 32 #include <linux/fb.h> 33 33 #include <linux/hdmi.h> 34 + #include <linux/media-bus-format.h> 34 35 #include <uapi/drm/drm_mode.h> 35 36 #include <uapi/drm/drm_fourcc.h> 36 37 #include <drm/drm_modeset_lock.h> ··· 139 138 140 139 enum subpixel_order subpixel_order; 141 140 u32 color_formats; 141 + 142 + const u32 *bus_formats; 143 + unsigned int num_bus_formats; 142 144 143 145 /* Mask of supported hdmi deep color modes */ 144 146 u8 edid_hdmi_dc_modes; ··· 1285 1281 int drm_mode_connector_set_tile_property(struct drm_connector *connector); 1286 1282 extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, 1287 1283 const struct edid *edid); 1284 + 1285 + extern int drm_display_info_set_bus_formats(struct drm_display_info *info, 1286 + const u32 *formats, 1287 + unsigned int num_formats); 1288 1288 1289 1289 static inline bool drm_property_type_is(struct drm_property *property, 1290 1290 uint32_t type)