Message ID | 20171030153951.56269-7-noralf@tronnes.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Oct 30, 2017 at 04:39:42PM +0100, Noralf Trønnes wrote: > This driver can use drm_fb_helper_lastclose() as its .lastclose callback. > It can also use drm_fb_helper_output_poll_changed() as its > .output_poll_changed callback. > > Cc: Inki Dae <inki.dae@samsung.com> > Cc: Joonyoung Shim <jy0922.shim@samsung.com> > Cc: Seung-Woo Kim <sw0312.kim@samsung.com> > Cc: Kyungmin Park <kyungmin.park@samsung.com> > Signed-off-by: Noralf Trønnes <noralf@tronnes.org> > --- > drivers/gpu/drm/exynos/exynos_drm_drv.c | 8 ++------ > drivers/gpu/drm/exynos/exynos_drm_fb.c | 2 +- > drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 18 ------------------ > drivers/gpu/drm/exynos/exynos_drm_fbdev.h | 2 -- > 4 files changed, 3 insertions(+), 27 deletions(-) > > diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c > index e651a58c18cf..70f4895ac49c 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c > @@ -16,6 +16,7 @@ > #include <drm/drm_atomic.h> > #include <drm/drm_atomic_helper.h> > #include <drm/drm_crtc_helper.h> > +#include <drm/drm_fb_helper.h> > > #include <linux/component.h> > > @@ -89,11 +90,6 @@ static void exynos_drm_postclose(struct drm_device *dev, struct drm_file *file) > file->driver_priv = NULL; > } > > -static void exynos_drm_lastclose(struct drm_device *dev) > -{ > - exynos_drm_fbdev_restore_mode(dev); > -} > - > static const struct vm_operations_struct exynos_drm_gem_vm_ops = { > .fault = exynos_drm_gem_fault, > .open = drm_gem_vm_open, > @@ -140,7 +136,7 @@ static struct drm_driver exynos_drm_driver = { > .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME > | DRIVER_ATOMIC | DRIVER_RENDER, > .open = exynos_drm_open, > - .lastclose = exynos_drm_lastclose, > + .lastclose = drm_fb_helper_lastclose, > .postclose = exynos_drm_postclose, > .gem_free_object_unlocked = exynos_drm_gem_free_object, > .gem_vm_ops = &exynos_drm_gem_vm_ops, > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c > index 8208df56a88f..0faaf829f5bf 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c > @@ -205,7 +205,7 @@ static struct drm_mode_config_helper_funcs exynos_drm_mode_config_helpers = { > > static const struct drm_mode_config_funcs exynos_drm_mode_config_funcs = { > .fb_create = exynos_user_fb_create, > - .output_poll_changed = exynos_drm_output_poll_changed, > + .output_poll_changed = drm_fb_helper_output_poll_changed, > .atomic_check = exynos_atomic_check, > .atomic_commit = drm_atomic_helper_commit, > }; > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > index dfb66ecf417b..132dd52d0ac7 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > @@ -270,24 +270,6 @@ void exynos_drm_fbdev_fini(struct drm_device *dev) > private->fb_helper = NULL; > } > > -void exynos_drm_fbdev_restore_mode(struct drm_device *dev) > -{ > - struct exynos_drm_private *private = dev->dev_private; > - > - if (!private || !private->fb_helper) Not sure this isn't risky, exynos has a strange load sequence ... Probably best if we get an ack from Inki. -Daniel > - return; > - > - drm_fb_helper_restore_fbdev_mode_unlocked(private->fb_helper); > -} > - > -void exynos_drm_output_poll_changed(struct drm_device *dev) > -{ > - struct exynos_drm_private *private = dev->dev_private; > - struct drm_fb_helper *fb_helper = private->fb_helper; > - > - drm_fb_helper_hotplug_event(fb_helper); > -} > - > void exynos_drm_fbdev_suspend(struct drm_device *dev) > { > struct exynos_drm_private *private = dev->dev_private; > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h > index 645d1bb7f665..b33847223a85 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h > +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h > @@ -19,8 +19,6 @@ > > int exynos_drm_fbdev_init(struct drm_device *dev); > void exynos_drm_fbdev_fini(struct drm_device *dev); > -void exynos_drm_fbdev_restore_mode(struct drm_device *dev); > -void exynos_drm_output_poll_changed(struct drm_device *dev); > void exynos_drm_fbdev_suspend(struct drm_device *drm); > void exynos_drm_fbdev_resume(struct drm_device *drm); > > -- > 2.14.2 >
2017년 10월 31일 19:28에 Daniel Vetter 이(가) 쓴 글: > On Mon, Oct 30, 2017 at 04:39:42PM +0100, Noralf Trønnes wrote: >> This driver can use drm_fb_helper_lastclose() as its .lastclose callback. >> It can also use drm_fb_helper_output_poll_changed() as its >> .output_poll_changed callback. >> >> Cc: Inki Dae <inki.dae@samsung.com> >> Cc: Joonyoung Shim <jy0922.shim@samsung.com> >> Cc: Seung-Woo Kim <sw0312.kim@samsung.com> >> Cc: Kyungmin Park <kyungmin.park@samsung.com> >> Signed-off-by: Noralf Trønnes <noralf@tronnes.org> >> --- >> drivers/gpu/drm/exynos/exynos_drm_drv.c | 8 ++------ >> drivers/gpu/drm/exynos/exynos_drm_fb.c | 2 +- >> drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 18 ------------------ >> drivers/gpu/drm/exynos/exynos_drm_fbdev.h | 2 -- >> 4 files changed, 3 insertions(+), 27 deletions(-) >> >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c >> index e651a58c18cf..70f4895ac49c 100644 >> --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c >> +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c >> @@ -16,6 +16,7 @@ >> #include <drm/drm_atomic.h> >> #include <drm/drm_atomic_helper.h> >> #include <drm/drm_crtc_helper.h> >> +#include <drm/drm_fb_helper.h> >> >> #include <linux/component.h> >> >> @@ -89,11 +90,6 @@ static void exynos_drm_postclose(struct drm_device *dev, struct drm_file *file) >> file->driver_priv = NULL; >> } >> >> -static void exynos_drm_lastclose(struct drm_device *dev) >> -{ >> - exynos_drm_fbdev_restore_mode(dev); >> -} >> - >> static const struct vm_operations_struct exynos_drm_gem_vm_ops = { >> .fault = exynos_drm_gem_fault, >> .open = drm_gem_vm_open, >> @@ -140,7 +136,7 @@ static struct drm_driver exynos_drm_driver = { >> .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME >> | DRIVER_ATOMIC | DRIVER_RENDER, >> .open = exynos_drm_open, >> - .lastclose = exynos_drm_lastclose, >> + .lastclose = drm_fb_helper_lastclose, >> .postclose = exynos_drm_postclose, >> .gem_free_object_unlocked = exynos_drm_gem_free_object, >> .gem_vm_ops = &exynos_drm_gem_vm_ops, >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c >> index 8208df56a88f..0faaf829f5bf 100644 >> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c >> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c >> @@ -205,7 +205,7 @@ static struct drm_mode_config_helper_funcs exynos_drm_mode_config_helpers = { >> >> static const struct drm_mode_config_funcs exynos_drm_mode_config_funcs = { >> .fb_create = exynos_user_fb_create, >> - .output_poll_changed = exynos_drm_output_poll_changed, >> + .output_poll_changed = drm_fb_helper_output_poll_changed, >> .atomic_check = exynos_atomic_check, >> .atomic_commit = drm_atomic_helper_commit, >> }; >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> index dfb66ecf417b..132dd52d0ac7 100644 >> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> @@ -270,24 +270,6 @@ void exynos_drm_fbdev_fini(struct drm_device *dev) >> private->fb_helper = NULL; >> } >> >> -void exynos_drm_fbdev_restore_mode(struct drm_device *dev) >> -{ >> - struct exynos_drm_private *private = dev->dev_private; >> - >> - if (!private || !private->fb_helper) > > Not sure this isn't risky, exynos has a strange load sequence ... Probably > best if we get an ack from Inki. I didn't test this patch on real hardware due to below two issues, 1. many warning messages printed out at vblank period. - to finalize atomic flush drm_crtc_arm_vblank_event function is called but Exynos drm driver has no implementation of get_vblank_timestamp and get_scanout_position callbacks. 2. tranferring Panel commands to Panel device - s6e3ha2 Panel device - timed out when exynos_drm_fbdev_restore_mode is called. So I just looked into this patch and looks good to me. Only a difference between old and new helper functions is above condition - checking if private and private->fb_helper are null or not. And dev->dev_private and private->fb_helper are cleared after calling drm_dev_unregister function which calls drm_fb_helpaer_lastclose function so it must be no problem. Acked-by: Inki Dae <inki.dae@samsung.com> Thanks, Inki Dae > -Daniel >> - return; >> - >> - drm_fb_helper_restore_fbdev_mode_unlocked(private->fb_helper); >> -} >> - >> -void exynos_drm_output_poll_changed(struct drm_device *dev) >> -{ >> - struct exynos_drm_private *private = dev->dev_private; >> - struct drm_fb_helper *fb_helper = private->fb_helper; >> - >> - drm_fb_helper_hotplug_event(fb_helper); >> -} >> - >> void exynos_drm_fbdev_suspend(struct drm_device *dev) >> { >> struct exynos_drm_private *private = dev->dev_private; >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h >> index 645d1bb7f665..b33847223a85 100644 >> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h >> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h >> @@ -19,8 +19,6 @@ >> >> int exynos_drm_fbdev_init(struct drm_device *dev); >> void exynos_drm_fbdev_fini(struct drm_device *dev); >> -void exynos_drm_fbdev_restore_mode(struct drm_device *dev); >> -void exynos_drm_output_poll_changed(struct drm_device *dev); >> void exynos_drm_fbdev_suspend(struct drm_device *drm); >> void exynos_drm_fbdev_resume(struct drm_device *drm); >> >> -- >> 2.14.2 >> >
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index e651a58c18cf..70f4895ac49c 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -16,6 +16,7 @@ #include <drm/drm_atomic.h> #include <drm/drm_atomic_helper.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_fb_helper.h> #include <linux/component.h> @@ -89,11 +90,6 @@ static void exynos_drm_postclose(struct drm_device *dev, struct drm_file *file) file->driver_priv = NULL; } -static void exynos_drm_lastclose(struct drm_device *dev) -{ - exynos_drm_fbdev_restore_mode(dev); -} - static const struct vm_operations_struct exynos_drm_gem_vm_ops = { .fault = exynos_drm_gem_fault, .open = drm_gem_vm_open, @@ -140,7 +136,7 @@ static struct drm_driver exynos_drm_driver = { .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_ATOMIC | DRIVER_RENDER, .open = exynos_drm_open, - .lastclose = exynos_drm_lastclose, + .lastclose = drm_fb_helper_lastclose, .postclose = exynos_drm_postclose, .gem_free_object_unlocked = exynos_drm_gem_free_object, .gem_vm_ops = &exynos_drm_gem_vm_ops, diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c index 8208df56a88f..0faaf829f5bf 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c @@ -205,7 +205,7 @@ static struct drm_mode_config_helper_funcs exynos_drm_mode_config_helpers = { static const struct drm_mode_config_funcs exynos_drm_mode_config_funcs = { .fb_create = exynos_user_fb_create, - .output_poll_changed = exynos_drm_output_poll_changed, + .output_poll_changed = drm_fb_helper_output_poll_changed, .atomic_check = exynos_atomic_check, .atomic_commit = drm_atomic_helper_commit, }; diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index dfb66ecf417b..132dd52d0ac7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c @@ -270,24 +270,6 @@ void exynos_drm_fbdev_fini(struct drm_device *dev) private->fb_helper = NULL; } -void exynos_drm_fbdev_restore_mode(struct drm_device *dev) -{ - struct exynos_drm_private *private = dev->dev_private; - - if (!private || !private->fb_helper) - return; - - drm_fb_helper_restore_fbdev_mode_unlocked(private->fb_helper); -} - -void exynos_drm_output_poll_changed(struct drm_device *dev) -{ - struct exynos_drm_private *private = dev->dev_private; - struct drm_fb_helper *fb_helper = private->fb_helper; - - drm_fb_helper_hotplug_event(fb_helper); -} - void exynos_drm_fbdev_suspend(struct drm_device *dev) { struct exynos_drm_private *private = dev->dev_private; diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h index 645d1bb7f665..b33847223a85 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h @@ -19,8 +19,6 @@ int exynos_drm_fbdev_init(struct drm_device *dev); void exynos_drm_fbdev_fini(struct drm_device *dev); -void exynos_drm_fbdev_restore_mode(struct drm_device *dev); -void exynos_drm_output_poll_changed(struct drm_device *dev); void exynos_drm_fbdev_suspend(struct drm_device *drm); void exynos_drm_fbdev_resume(struct drm_device *drm);
This driver can use drm_fb_helper_lastclose() as its .lastclose callback. It can also use drm_fb_helper_output_poll_changed() as its .output_poll_changed callback. Cc: Inki Dae <inki.dae@samsung.com> Cc: Joonyoung Shim <jy0922.shim@samsung.com> Cc: Seung-Woo Kim <sw0312.kim@samsung.com> Cc: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Noralf Trønnes <noralf@tronnes.org> --- drivers/gpu/drm/exynos/exynos_drm_drv.c | 8 ++------ drivers/gpu/drm/exynos/exynos_drm_fb.c | 2 +- drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 18 ------------------ drivers/gpu/drm/exynos/exynos_drm_fbdev.h | 2 -- 4 files changed, 3 insertions(+), 27 deletions(-)