430,9 → 430,7 |
static void __drm_framebuffer_unregister(struct drm_device *dev, |
struct drm_framebuffer *fb) |
{ |
mutex_lock(&dev->mode_config.idr_mutex); |
idr_remove(&dev->mode_config.crtc_idr, fb->base.id); |
mutex_unlock(&dev->mode_config.idr_mutex); |
drm_mode_object_put(dev, &fb->base); |
|
fb->base.id = 0; |
} |
1150,6 → 1148,29 |
EXPORT_SYMBOL(drm_encoder_init); |
|
/** |
* drm_encoder_index - find the index of a registered encoder |
* @encoder: encoder to find index for |
* |
* Given a registered encoder, return the index of that encoder within a DRM |
* device's list of encoders. |
*/ |
unsigned int drm_encoder_index(struct drm_encoder *encoder) |
{ |
unsigned int index = 0; |
struct drm_encoder *tmp; |
|
drm_for_each_encoder(tmp, encoder->dev) { |
if (tmp == encoder) |
return index; |
|
index++; |
} |
|
BUG(); |
} |
EXPORT_SYMBOL(drm_encoder_index); |
|
/** |
* drm_encoder_cleanup - cleans up an initialised encoder |
* @encoder: encoder to cleanup |
* |
1531,6 → 1552,41 |
return -ENOMEM; |
dev->mode_config.prop_mode_id = prop; |
|
prop = drm_property_create(dev, |
DRM_MODE_PROP_BLOB, |
"DEGAMMA_LUT", 0); |
if (!prop) |
return -ENOMEM; |
dev->mode_config.degamma_lut_property = prop; |
|
prop = drm_property_create_range(dev, |
DRM_MODE_PROP_IMMUTABLE, |
"DEGAMMA_LUT_SIZE", 0, UINT_MAX); |
if (!prop) |
return -ENOMEM; |
dev->mode_config.degamma_lut_size_property = prop; |
|
prop = drm_property_create(dev, |
DRM_MODE_PROP_BLOB, |
"CTM", 0); |
if (!prop) |
return -ENOMEM; |
dev->mode_config.ctm_property = prop; |
|
prop = drm_property_create(dev, |
DRM_MODE_PROP_BLOB, |
"GAMMA_LUT", 0); |
if (!prop) |
return -ENOMEM; |
dev->mode_config.gamma_lut_property = prop; |
|
prop = drm_property_create_range(dev, |
DRM_MODE_PROP_IMMUTABLE, |
"GAMMA_LUT_SIZE", 0, UINT_MAX); |
if (!prop) |
return -ENOMEM; |
dev->mode_config.gamma_lut_size_property = prop; |
|
return 0; |
} |
|
2747,8 → 2803,6 |
goto out; |
} |
|
drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); |
|
/* |
* Check whether the primary plane supports the fb pixel format. |
* Drivers not implementing the universal planes API use a |
3289,6 → 3343,24 |
return 0; |
} |
|
struct drm_mode_rmfb_work { |
struct work_struct work; |
struct list_head fbs; |
}; |
|
static void drm_mode_rmfb_work_fn(struct work_struct *w) |
{ |
struct drm_mode_rmfb_work *arg = container_of(w, typeof(*arg), work); |
|
while (!list_empty(&arg->fbs)) { |
struct drm_framebuffer *fb = |
list_first_entry(&arg->fbs, typeof(*fb), filp_head); |
|
list_del_init(&fb->filp_head); |
drm_framebuffer_remove(fb); |
} |
} |
|
/** |
* drm_mode_rmfb - remove an FB from the configuration |
* @dev: drm device for the ioctl |
3482,7 → 3554,6 |
return ret; |
} |
|
|
/** |
* drm_fb_release - remove and free the FBs on this file |
* @priv: drm file for the ioctl |