Commit 7ef64ed1 authored by Daniel Vetter's avatar Daniel Vetter

drm/gm12u320: Use helpers for shutdown/suspend/resume

Also there's a race in the disconnect implemenation. First shut
down, then unplug, leaves a window where userspace could sneak
in and restart the entire machinery.

With this we can also delete the very un-atomic global pipe_enabled
tracking.
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: "Noralf Trønnes" <noralf@tronnes.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20200323144950.3018436-45-daniel.vetter@ffwll.ch
parent 993f5b19
...@@ -88,7 +88,6 @@ struct gm12u320_device { ...@@ -88,7 +88,6 @@ struct gm12u320_device {
struct usb_device *udev; struct usb_device *udev;
unsigned char *cmd_buf; unsigned char *cmd_buf;
unsigned char *data_buf[GM12U320_BLOCK_COUNT]; unsigned char *data_buf[GM12U320_BLOCK_COUNT];
bool pipe_enabled;
struct { struct {
bool run; bool run;
struct workqueue_struct *workq; struct workqueue_struct *workq;
...@@ -589,7 +588,6 @@ static void gm12u320_pipe_enable(struct drm_simple_display_pipe *pipe, ...@@ -589,7 +588,6 @@ static void gm12u320_pipe_enable(struct drm_simple_display_pipe *pipe,
gm12u320_fb_mark_dirty(plane_state->fb, &rect); gm12u320_fb_mark_dirty(plane_state->fb, &rect);
gm12u320_start_fb_update(gm12u320); gm12u320_start_fb_update(gm12u320);
gm12u320->pipe_enabled = true;
} }
static void gm12u320_pipe_disable(struct drm_simple_display_pipe *pipe) static void gm12u320_pipe_disable(struct drm_simple_display_pipe *pipe)
...@@ -597,7 +595,6 @@ static void gm12u320_pipe_disable(struct drm_simple_display_pipe *pipe) ...@@ -597,7 +595,6 @@ static void gm12u320_pipe_disable(struct drm_simple_display_pipe *pipe)
struct gm12u320_device *gm12u320 = pipe->crtc.dev->dev_private; struct gm12u320_device *gm12u320 = pipe->crtc.dev->dev_private;
gm12u320_stop_fb_update(gm12u320); gm12u320_stop_fb_update(gm12u320);
gm12u320->pipe_enabled = false;
} }
static void gm12u320_pipe_update(struct drm_simple_display_pipe *pipe, static void gm12u320_pipe_update(struct drm_simple_display_pipe *pipe,
...@@ -733,22 +730,17 @@ static int gm12u320_usb_probe(struct usb_interface *interface, ...@@ -733,22 +730,17 @@ static int gm12u320_usb_probe(struct usb_interface *interface,
static void gm12u320_usb_disconnect(struct usb_interface *interface) static void gm12u320_usb_disconnect(struct usb_interface *interface)
{ {
struct drm_device *dev = usb_get_intfdata(interface); struct drm_device *dev = usb_get_intfdata(interface);
struct gm12u320_device *gm12u320 = dev->dev_private;
gm12u320_stop_fb_update(gm12u320);
drm_dev_unplug(dev); drm_dev_unplug(dev);
drm_atomic_helper_shutdown(dev);
} }
static __maybe_unused int gm12u320_suspend(struct usb_interface *interface, static __maybe_unused int gm12u320_suspend(struct usb_interface *interface,
pm_message_t message) pm_message_t message)
{ {
struct drm_device *dev = usb_get_intfdata(interface); struct drm_device *dev = usb_get_intfdata(interface);
struct gm12u320_device *gm12u320 = dev->dev_private;
if (gm12u320->pipe_enabled) return drm_mode_config_helper_suspend(dev);
gm12u320_stop_fb_update(gm12u320);
return 0;
} }
static __maybe_unused int gm12u320_resume(struct usb_interface *interface) static __maybe_unused int gm12u320_resume(struct usb_interface *interface)
...@@ -757,10 +749,8 @@ static __maybe_unused int gm12u320_resume(struct usb_interface *interface) ...@@ -757,10 +749,8 @@ static __maybe_unused int gm12u320_resume(struct usb_interface *interface)
struct gm12u320_device *gm12u320 = dev->dev_private; struct gm12u320_device *gm12u320 = dev->dev_private;
gm12u320_set_ecomode(gm12u320); gm12u320_set_ecomode(gm12u320);
if (gm12u320->pipe_enabled)
gm12u320_start_fb_update(gm12u320);
return 0; return drm_mode_config_helper_resume(dev);
} }
static const struct usb_device_id id_table[] = { static const struct usb_device_id id_table[] = {
......
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