drm: Add support_bits parameter to drm_property_create_bitmask()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 8 Jul 2014 05:01:52 +0000 (10:31 +0530)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 11 Jul 2014 21:43:23 +0000 (23:43 +0200)
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: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Sagar Kamble <sagar.a.kamble@intel.com>
Acked-by: Dave Airlie <airlied@linux.ie>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/omapdrm/omap_plane.c
include/drm/drm_crtc.h

index 41c7212081b890e237804453f12f5af2ef456ad4..2fbee61d632de6b60ad951172e984afc5326cecd 100644 (file)
@@ -3395,19 +3395,28 @@ EXPORT_SYMBOL(drm_property_create_enum);
 struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
                                         int flags, const char *name,
                                         const struct drm_prop_enum_list *props,
-                                        int num_values)
+                                        int num_props,
+                                        uint64_t supported_bits)
 {
        struct drm_property *property;
-       int i, ret;
+       int i, ret, index = 0;
+       int num_values = hweight64(supported_bits);
 
        flags |= DRM_MODE_PROP_BITMASK;
 
        property = drm_property_create(dev, flags, name, num_values);
        if (!property)
                return NULL;
+       for (i = 0; i < num_props; i++) {
+               if (!(supported_bits & (1ULL << props[i].type)))
+                       continue;
 
-       for (i = 0; i < num_values; i++) {
-               ret = drm_property_add_enum(property, i,
+               if (WARN_ON(index >= num_values)) {
+                       drm_property_destroy(dev, property);
+                       return NULL;
+               }
+
+               ret = drm_property_add_enum(property, index++,
                                      props[i].type,
                                      props[i].name);
                if (ret) {
index 3cf31ee59aac08de0573bb7c0464c0b0e7a7f0e5..aff06e7a4e5fe29e8d064ffa9eabc0c2a4875ab3 100644 (file)
@@ -317,7 +317,10 @@ void omap_plane_install_properties(struct drm_plane *plane,
                                        { DRM_REFLECT_Y,  "reflect-y" },
                        };
                        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)
                                return;
                        priv->rotation_prop = prop;
index bfc7235a9c0e81513e254dca281c47e00069218a..cb4850a2b0c1baf1eb31760a5e2c306e2442ae4c 100644 (file)
@@ -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,
                                         int flags, const char *name,
                                         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,
                                         const char *name,
                                         uint64_t min, uint64_t max);