| From 399870f6fae9864ccc6a72db51b05cbdddfe5af5 Mon Sep 17 00:00:00 2001 |
| From: John Stultz <john.stultz@linaro.org> |
| Date: Mon, 16 Jan 2017 16:52:48 -0800 |
| Subject: [PATCH 003/255] drm/bridge: adv7511: Switch to using |
| drm_kms_helper_hotplug_event() |
| |
| In chasing down a previous issue with EDID probing from calling |
| drm_helper_hpd_irq_event() from irq context, Laurent noticed |
| that the DRM documentation suggests that |
| drm_kms_helper_hotplug_event() should be used instead. |
| |
| Thus this patch replaces drm_helper_hpd_irq_event() with |
| drm_kms_helper_hotplug_event(), which requires we update the |
| connector.status entry and only call _hotplug_event() when the |
| status changes. |
| |
| Cc: David Airlie <airlied@linux.ie> |
| Cc: Archit Taneja <architt@codeaurora.org> |
| Cc: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Cc: Lars-Peter Clausen <lars@metafoo.de> |
| Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Cc: dri-devel@lists.freedesktop.org |
| Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Tested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Signed-off-by: John Stultz <john.stultz@linaro.org> |
| Signed-off-by: Archit Taneja <architt@codeaurora.org> |
| Link: http://patchwork.freedesktop.org/patch/msgid/1484614372-15342-3-git-send-email-john.stultz@linaro.org |
| (cherry picked from commit 6d5104c5a6b56385426e15047050584794bb6254) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 16 +++++++++++++++- |
| 1 file changed, 15 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c |
| +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c |
| @@ -405,8 +405,22 @@ static bool adv7511_hpd(struct adv7511 * |
| static void adv7511_hpd_work(struct work_struct *work) |
| { |
| struct adv7511 *adv7511 = container_of(work, struct adv7511, hpd_work); |
| + enum drm_connector_status status; |
| + unsigned int val; |
| + int ret; |
| |
| - drm_helper_hpd_irq_event(adv7511->connector.dev); |
| + ret = regmap_read(adv7511->regmap, ADV7511_REG_STATUS, &val); |
| + if (ret < 0) |
| + status = connector_status_disconnected; |
| + else if (val & ADV7511_STATUS_HPD) |
| + status = connector_status_connected; |
| + else |
| + status = connector_status_disconnected; |
| + |
| + if (adv7511->connector.status != status) { |
| + adv7511->connector.status = status; |
| + drm_kms_helper_hotplug_event(adv7511->connector.dev); |
| + } |
| } |
| |
| static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd) |