Loading drivers/gpu/drm/msm/msm_drv.c +6 −8 Original line number Diff line number Diff line Loading @@ -1271,22 +1271,20 @@ static int msm_ioctl_deregister_event(struct drm_device *dev, void *data, return ret; } void msm_send_crtc_notification(struct drm_crtc *crtc, struct drm_event *event, u8 *payload) void msm_mode_object_event_nofity(struct drm_mode_object *obj, struct drm_device *dev, struct drm_event *event, u8 *payload) { struct drm_device *dev = NULL; struct msm_drm_private *priv = NULL; unsigned long flags; struct msm_drm_event *notify, *node; int len = 0, ret; if (!crtc || !event || !event->length || !payload) { DRM_ERROR("err param crtc %pK event %pK len %d payload %pK\n", crtc, event, ((event) ? (event->length) : -1), if (!obj || !event || !event->length || !payload) { DRM_ERROR("err param obj %pK event %pK len %d payload %pK\n", obj, event, ((event) ? (event->length) : -1), payload); return; } dev = crtc->dev; priv = (dev) ? dev->dev_private : NULL; if (!dev || !priv) { DRM_ERROR("invalid dev %pK priv %pK\n", dev, priv); Loading @@ -1296,7 +1294,7 @@ void msm_send_crtc_notification(struct drm_crtc *crtc, spin_lock_irqsave(&dev->event_lock, flags); list_for_each_entry(node, &priv->client_event_list, base.link) { if (node->event.type != event->type || crtc->base.id != node->info.object_id) obj->id != node->info.object_id) continue; len = event->length + sizeof(struct drm_msm_event_resp); if (node->base.file_priv->event_space < len) { Loading drivers/gpu/drm/msm/msm_drv.h +5 −4 Original line number Diff line number Diff line Loading @@ -710,13 +710,14 @@ enum msm_dsi_encoder_id { }; /* * * msm_send_crtc_notification - notify user-space clients of crtc events. * @crtc: crtc that is generating the event. * msm_mode_object_event_notify - notify user-space clients of drm object * events. * @obj: mode object (crtc/connector) that is generating the event. * @event: event that needs to be notified. * @payload: payload for the event. */ void msm_send_crtc_notification(struct drm_crtc *crtc, struct drm_event *event, u8 *payload); void msm_mode_object_event_nofity(struct drm_mode_object *obj, struct drm_device *dev, struct drm_event *event, u8 *payload); #ifdef CONFIG_DRM_MSM_DSI void __init msm_dsi_register(void); void __exit msm_dsi_unregister(void); Loading drivers/gpu/drm/msm/sde/sde_color_processing.c +2 −1 Original line number Diff line number Diff line Loading @@ -1357,7 +1357,8 @@ static void sde_cp_notify_ad_event(struct drm_crtc *crtc_drm, void *arg) hw_dspp->ops.ad_read_intr_resp(hw_dspp, AD4_BACKLIGHT, &bl); event.length = sizeof(u32); event.type = DRM_EVENT_AD_BACKLIGHT; msm_send_crtc_notification(&crtc->base, &event, (u8 *)&bl); msm_mode_object_event_nofity(&crtc_drm->base, crtc_drm->dev, &event, (u8 *)&bl); } int sde_cp_ad_interrupt(struct drm_crtc *crtc_drm, bool en, Loading drivers/gpu/drm/msm/sde/sde_connector.c +17 −2 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ static int sde_backlight_device_update_status(struct backlight_device *bd) struct dsi_display *display; struct sde_connector *c_conn; int bl_lvl; struct drm_event event; brightness = bd->props.brightness; Loading @@ -79,8 +80,13 @@ static int sde_backlight_device_update_status(struct backlight_device *bd) if (!bl_lvl && brightness) bl_lvl = 1; if (c_conn->ops.set_backlight) if (c_conn->ops.set_backlight) { event.type = DRM_EVENT_SYS_BACKLIGHT; event.length = sizeof(u32); msm_mode_object_event_nofity(&c_conn->base.base, c_conn->base.dev, &event, (u8 *)&brightness); c_conn->ops.set_backlight(c_conn->display, bl_lvl); } return 0; } Loading Loading @@ -1165,5 +1171,14 @@ struct drm_connector *sde_connector_init(struct drm_device *dev, int sde_connector_register_custom_event(struct sde_kms *kms, struct drm_connector *conn_drm, u32 event, bool val) { return -EINVAL; int ret = -EINVAL; switch (event) { case DRM_EVENT_SYS_BACKLIGHT: ret = 0; break; default: break; } return ret; } drivers/gpu/drm/msm/sde/sde_crtc.c +22 −4 Original line number Diff line number Diff line Loading @@ -51,8 +51,12 @@ struct sde_crtc_custom_events { struct sde_irq_callback *irq); }; static int sde_crtc_power_interrupt_handler(struct drm_crtc *crtc_drm, bool en, struct sde_irq_callback *ad_irq); static struct sde_crtc_custom_events custom_events[] = { {DRM_EVENT_AD_BACKLIGHT, sde_cp_ad_interrupt} {DRM_EVENT_AD_BACKLIGHT, sde_cp_ad_interrupt}, {DRM_EVENT_CRTC_POWER, sde_crtc_power_interrupt_handler} }; /* default input fence timeout, in ms */ Loading Loading @@ -2022,6 +2026,8 @@ static void _sde_crtc_set_suspend(struct drm_crtc *crtc, bool enable) struct sde_crtc *sde_crtc; struct msm_drm_private *priv; struct sde_kms *sde_kms; struct drm_event event; u32 power_on; if (!crtc || !crtc->dev || !crtc->dev->dev_private) { SDE_ERROR("invalid crtc\n"); Loading @@ -2040,13 +2046,18 @@ static void _sde_crtc_set_suspend(struct drm_crtc *crtc, bool enable) mutex_lock(&sde_crtc->crtc_lock); event.type = DRM_EVENT_CRTC_POWER; event.length = sizeof(u32); /* * Update CP on suspend/resume transitions */ if (enable && !sde_crtc->suspend) if (enable && !sde_crtc->suspend) { sde_cp_crtc_suspend(crtc); else if (!enable && sde_crtc->suspend) power_on = 0; } else if (!enable && sde_crtc->suspend) { sde_cp_crtc_resume(crtc); power_on = 1; } /* * If the vblank refcount != 0, release a power reference on suspend Loading @@ -2059,7 +2070,8 @@ static void _sde_crtc_set_suspend(struct drm_crtc *crtc, bool enable) _sde_crtc_vblank_enable_nolock(sde_crtc, !enable); sde_crtc->suspend = enable; msm_mode_object_event_nofity(&crtc->base, crtc->dev, &event, (u8 *)&power_on); mutex_unlock(&sde_crtc->crtc_lock); } Loading Loading @@ -3620,3 +3632,9 @@ int sde_crtc_register_custom_event(struct sde_kms *kms, return ret; } static int sde_crtc_power_interrupt_handler(struct drm_crtc *crtc_drm, bool en, struct sde_irq_callback *irq) { return 0; } Loading
drivers/gpu/drm/msm/msm_drv.c +6 −8 Original line number Diff line number Diff line Loading @@ -1271,22 +1271,20 @@ static int msm_ioctl_deregister_event(struct drm_device *dev, void *data, return ret; } void msm_send_crtc_notification(struct drm_crtc *crtc, struct drm_event *event, u8 *payload) void msm_mode_object_event_nofity(struct drm_mode_object *obj, struct drm_device *dev, struct drm_event *event, u8 *payload) { struct drm_device *dev = NULL; struct msm_drm_private *priv = NULL; unsigned long flags; struct msm_drm_event *notify, *node; int len = 0, ret; if (!crtc || !event || !event->length || !payload) { DRM_ERROR("err param crtc %pK event %pK len %d payload %pK\n", crtc, event, ((event) ? (event->length) : -1), if (!obj || !event || !event->length || !payload) { DRM_ERROR("err param obj %pK event %pK len %d payload %pK\n", obj, event, ((event) ? (event->length) : -1), payload); return; } dev = crtc->dev; priv = (dev) ? dev->dev_private : NULL; if (!dev || !priv) { DRM_ERROR("invalid dev %pK priv %pK\n", dev, priv); Loading @@ -1296,7 +1294,7 @@ void msm_send_crtc_notification(struct drm_crtc *crtc, spin_lock_irqsave(&dev->event_lock, flags); list_for_each_entry(node, &priv->client_event_list, base.link) { if (node->event.type != event->type || crtc->base.id != node->info.object_id) obj->id != node->info.object_id) continue; len = event->length + sizeof(struct drm_msm_event_resp); if (node->base.file_priv->event_space < len) { Loading
drivers/gpu/drm/msm/msm_drv.h +5 −4 Original line number Diff line number Diff line Loading @@ -710,13 +710,14 @@ enum msm_dsi_encoder_id { }; /* * * msm_send_crtc_notification - notify user-space clients of crtc events. * @crtc: crtc that is generating the event. * msm_mode_object_event_notify - notify user-space clients of drm object * events. * @obj: mode object (crtc/connector) that is generating the event. * @event: event that needs to be notified. * @payload: payload for the event. */ void msm_send_crtc_notification(struct drm_crtc *crtc, struct drm_event *event, u8 *payload); void msm_mode_object_event_nofity(struct drm_mode_object *obj, struct drm_device *dev, struct drm_event *event, u8 *payload); #ifdef CONFIG_DRM_MSM_DSI void __init msm_dsi_register(void); void __exit msm_dsi_unregister(void); Loading
drivers/gpu/drm/msm/sde/sde_color_processing.c +2 −1 Original line number Diff line number Diff line Loading @@ -1357,7 +1357,8 @@ static void sde_cp_notify_ad_event(struct drm_crtc *crtc_drm, void *arg) hw_dspp->ops.ad_read_intr_resp(hw_dspp, AD4_BACKLIGHT, &bl); event.length = sizeof(u32); event.type = DRM_EVENT_AD_BACKLIGHT; msm_send_crtc_notification(&crtc->base, &event, (u8 *)&bl); msm_mode_object_event_nofity(&crtc_drm->base, crtc_drm->dev, &event, (u8 *)&bl); } int sde_cp_ad_interrupt(struct drm_crtc *crtc_drm, bool en, Loading
drivers/gpu/drm/msm/sde/sde_connector.c +17 −2 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ static int sde_backlight_device_update_status(struct backlight_device *bd) struct dsi_display *display; struct sde_connector *c_conn; int bl_lvl; struct drm_event event; brightness = bd->props.brightness; Loading @@ -79,8 +80,13 @@ static int sde_backlight_device_update_status(struct backlight_device *bd) if (!bl_lvl && brightness) bl_lvl = 1; if (c_conn->ops.set_backlight) if (c_conn->ops.set_backlight) { event.type = DRM_EVENT_SYS_BACKLIGHT; event.length = sizeof(u32); msm_mode_object_event_nofity(&c_conn->base.base, c_conn->base.dev, &event, (u8 *)&brightness); c_conn->ops.set_backlight(c_conn->display, bl_lvl); } return 0; } Loading Loading @@ -1165,5 +1171,14 @@ struct drm_connector *sde_connector_init(struct drm_device *dev, int sde_connector_register_custom_event(struct sde_kms *kms, struct drm_connector *conn_drm, u32 event, bool val) { return -EINVAL; int ret = -EINVAL; switch (event) { case DRM_EVENT_SYS_BACKLIGHT: ret = 0; break; default: break; } return ret; }
drivers/gpu/drm/msm/sde/sde_crtc.c +22 −4 Original line number Diff line number Diff line Loading @@ -51,8 +51,12 @@ struct sde_crtc_custom_events { struct sde_irq_callback *irq); }; static int sde_crtc_power_interrupt_handler(struct drm_crtc *crtc_drm, bool en, struct sde_irq_callback *ad_irq); static struct sde_crtc_custom_events custom_events[] = { {DRM_EVENT_AD_BACKLIGHT, sde_cp_ad_interrupt} {DRM_EVENT_AD_BACKLIGHT, sde_cp_ad_interrupt}, {DRM_EVENT_CRTC_POWER, sde_crtc_power_interrupt_handler} }; /* default input fence timeout, in ms */ Loading Loading @@ -2022,6 +2026,8 @@ static void _sde_crtc_set_suspend(struct drm_crtc *crtc, bool enable) struct sde_crtc *sde_crtc; struct msm_drm_private *priv; struct sde_kms *sde_kms; struct drm_event event; u32 power_on; if (!crtc || !crtc->dev || !crtc->dev->dev_private) { SDE_ERROR("invalid crtc\n"); Loading @@ -2040,13 +2046,18 @@ static void _sde_crtc_set_suspend(struct drm_crtc *crtc, bool enable) mutex_lock(&sde_crtc->crtc_lock); event.type = DRM_EVENT_CRTC_POWER; event.length = sizeof(u32); /* * Update CP on suspend/resume transitions */ if (enable && !sde_crtc->suspend) if (enable && !sde_crtc->suspend) { sde_cp_crtc_suspend(crtc); else if (!enable && sde_crtc->suspend) power_on = 0; } else if (!enable && sde_crtc->suspend) { sde_cp_crtc_resume(crtc); power_on = 1; } /* * If the vblank refcount != 0, release a power reference on suspend Loading @@ -2059,7 +2070,8 @@ static void _sde_crtc_set_suspend(struct drm_crtc *crtc, bool enable) _sde_crtc_vblank_enable_nolock(sde_crtc, !enable); sde_crtc->suspend = enable; msm_mode_object_event_nofity(&crtc->base, crtc->dev, &event, (u8 *)&power_on); mutex_unlock(&sde_crtc->crtc_lock); } Loading Loading @@ -3620,3 +3632,9 @@ int sde_crtc_register_custom_event(struct sde_kms *kms, return ret; } static int sde_crtc_power_interrupt_handler(struct drm_crtc *crtc_drm, bool en, struct sde_irq_callback *irq) { return 0; }