Commit 7689ffb3 authored by Ville Syrjälä's avatar Ville Syrjälä Committed by Daniel Vetter

drm: Add support_bits parameter to drm_property_create_bitmask()

Make drm_property_create_bitmask() a bit more generic by allowing the
caller to specify which bits are in fact supported. This allows multiple
callers to use the same enum list, but still create different versions
of the same property with different list of supported bits.

v2: Populate values[] array as non-sparse
    Make supported_bits 64bit
    Fix up omapdrm call site (Rob)

Cc: dri-devel@lists.freedesktop.org
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarImre Deak <imre.deak@intel.com>
Reviewed-by: default avatarSagar Kamble <sagar.a.kamble@intel.com>
Acked-by: default avatarDave Airlie <airlied@linux.ie>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 06596961
...@@ -3395,19 +3395,28 @@ EXPORT_SYMBOL(drm_property_create_enum); ...@@ -3395,19 +3395,28 @@ EXPORT_SYMBOL(drm_property_create_enum);
struct drm_property *drm_property_create_bitmask(struct drm_device *dev, struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
int flags, const char *name, int flags, const char *name,
const struct drm_prop_enum_list *props, const struct drm_prop_enum_list *props,
int num_values) int num_props,
uint64_t supported_bits)
{ {
struct drm_property *property; struct drm_property *property;
int i, ret; int i, ret, index = 0;
int num_values = hweight64(supported_bits);
flags |= DRM_MODE_PROP_BITMASK; flags |= DRM_MODE_PROP_BITMASK;
property = drm_property_create(dev, flags, name, num_values); property = drm_property_create(dev, flags, name, num_values);
if (!property) if (!property)
return NULL; return NULL;
for (i = 0; i < num_props; i++) {
if (!(supported_bits & (1ULL << props[i].type)))
continue;
for (i = 0; i < num_values; i++) { if (WARN_ON(index >= num_values)) {
ret = drm_property_add_enum(property, i, drm_property_destroy(dev, property);
return NULL;
}
ret = drm_property_add_enum(property, index++,
props[i].type, props[i].type,
props[i].name); props[i].name);
if (ret) { if (ret) {
......
...@@ -317,7 +317,10 @@ void omap_plane_install_properties(struct drm_plane *plane, ...@@ -317,7 +317,10 @@ void omap_plane_install_properties(struct drm_plane *plane,
{ DRM_REFLECT_Y, "reflect-y" }, { DRM_REFLECT_Y, "reflect-y" },
}; };
prop = drm_property_create_bitmask(dev, 0, "rotation", prop = drm_property_create_bitmask(dev, 0, "rotation",
props, ARRAY_SIZE(props)); props, ARRAY_SIZE(props),
BIT(DRM_ROTATE_0) | BIT(DRM_ROTATE_90) |
BIT(DRM_ROTATE_180) | BIT(DRM_ROTATE_270) |
BIT(DRM_REFLECT_X) | BIT(DRM_REFLECT_Y));
if (prop == NULL) if (prop == NULL)
return; return;
priv->rotation_prop = prop; priv->rotation_prop = prop;
......
...@@ -1006,7 +1006,8 @@ extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int ...@@ -1006,7 +1006,8 @@ extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int
struct drm_property *drm_property_create_bitmask(struct drm_device *dev, struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
int flags, const char *name, int flags, const char *name,
const struct drm_prop_enum_list *props, const struct drm_prop_enum_list *props,
int num_values); int num_props,
uint64_t supported_bits);
struct drm_property *drm_property_create_range(struct drm_device *dev, int flags, struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
const char *name, const char *name,
uint64_t min, uint64_t max); uint64_t min, uint64_t max);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment