Message ID | 1442427250-9833-2-git-send-email-eric@anholt.net (mailing list archive) |
---|---|
State | Not Applicable, archived |
Delegated to: | Andy Gross |
Headers | show |
On Wed, Sep 16, 2015 at 11:14 AM, Eric Anholt <eric@anholt.net> wrote: > This is mostly just a move of the code from exynos, with a slight > reformat. I wanted to do a similar thing for vc4, and msm looks like > a good candidate as well. > > Signed-off-by: Eric Anholt <eric@anholt.net> > --- > drivers/gpu/drm/Makefile | 3 ++- > drivers/gpu/drm/drm_platform_helpers.c | 45 +++++++++++++++++++++++++++++++++ > drivers/gpu/drm/exynos/exynos_drm_drv.c | 38 +++++----------------------- > include/drm/drmP.h | 4 +++ > 4 files changed, 57 insertions(+), 33 deletions(-) > create mode 100644 drivers/gpu/drm/drm_platform_helpers.c > > diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile > index 45e7719..266d199 100644 > --- a/drivers/gpu/drm/Makefile > +++ b/drivers/gpu/drm/Makefile > @@ -7,7 +7,8 @@ drm-y := drm_auth.o drm_bufs.o drm_cache.o \ > drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \ > drm_lock.o drm_memory.o drm_drv.o drm_vm.o \ > drm_agpsupport.o drm_scatter.o drm_pci.o \ > - drm_platform.o drm_sysfs.o drm_hashtab.o drm_mm.o \ > + drm_platform.o drm_platform_helpers.o \ > + drm_sysfs.o drm_hashtab.o drm_mm.o \ Imo it'd would be good to have a separate module for helpers like these (maybe even put them into the kms helpers). At least that explicit split on the modeset side seems to help with a clean split between mandatory core bits and helper code. > drm_crtc.o drm_modes.o drm_edid.o \ > drm_info.o drm_debugfs.o drm_encoder_slave.o \ > drm_trace_points.o drm_global.o drm_prime.o \ > diff --git a/drivers/gpu/drm/drm_platform_helpers.c b/drivers/gpu/drm/drm_platform_helpers.c > new file mode 100644 > index 0000000..a54c3e3 > --- /dev/null > +++ b/drivers/gpu/drm/drm_platform_helpers.c > @@ -0,0 +1,45 @@ > +/* > + * Copyright (c) 2011 Samsung Electronics Co., Ltd. > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms of the GNU General Public License as published by the > + * Free Software Foundation; either version 2 of the License, or (at your > + * option) any later version. > + */ > + > +#include <drm/drmP.h> > + > +/** > + * drm_platform_register_drivers - Helper to register an array of > + * struct platform_drivers. > + */ Please add a new section to Documentation/DocBook/drm.tmpl so that these kerneldoc comments are included. Without that 0day won't catch mismatches in kerneldoc and hopefully including it will also make it a bit more discoverable. And with the new markdown stuff in drm-intel-nightly you could even include an example snippet for how to use it, but that's kinda overkilla ;-) If you do that kerneldoc will complain about the missing parameter helpers. Also I recommend to point at other functions which should be used together with this one (like _unregister), in 4.3 the htmldocs will actually insert hyperlinks for that. Thanks, Daniel > +int drm_platform_register_drivers(struct platform_driver *const *drv, > + int count) > +{ > + int i, ret; > + > + for (i = 0; i < count; ++i) { > + ret = platform_driver_register(drv[i]); > + if (ret) { > + while (--i >= 0) > + platform_driver_unregister(drv[i]); > + return ret; > + } > + } > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(drm_platform_register_drivers); > + > +/** > + * drm_platform_unregister_drivers - Helper to unregister an array of > + * struct platform_drivers (in the opposite order they would have been > + * registered by drm_platform_register_drivers()). > + */ > +void drm_platform_unregister_drivers(struct platform_driver *const *drv, > + int count) > +{ > + while (--count >= 0) > + platform_driver_unregister(drv[count]); > +} > +EXPORT_SYMBOL_GPL(drm_platform_unregister_drivers); > diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c > index fa5194c..83f829b 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c > @@ -520,53 +520,27 @@ static int exynos_drm_register_devices(void) > return 0; > } > > -static void exynos_drm_unregister_drivers(struct platform_driver * const *drv, > - int count) > -{ > - while (--count >= 0) > - platform_driver_unregister(drv[count]); > -} > - > -static int exynos_drm_register_drivers(struct platform_driver * const *drv, > - int count) > -{ > - int i, ret; > - > - for (i = 0; i < count; ++i) { > - ret = platform_driver_register(drv[i]); > - if (!ret) > - continue; > - > - while (--i >= 0) > - platform_driver_unregister(drv[i]); > - > - return ret; > - } > - > - return 0; > -} > - > static inline int exynos_drm_register_kms_drivers(void) > { > - return exynos_drm_register_drivers(exynos_drm_kms_drivers, > - ARRAY_SIZE(exynos_drm_kms_drivers)); > + return drm_platform_register_drivers(exynos_drm_kms_drivers, > + ARRAY_SIZE(exynos_drm_kms_drivers)); > } > > static inline int exynos_drm_register_non_kms_drivers(void) > { > - return exynos_drm_register_drivers(exynos_drm_non_kms_drivers, > - ARRAY_SIZE(exynos_drm_non_kms_drivers)); > + return drm_platform_register_drivers(exynos_drm_non_kms_drivers, > + ARRAY_SIZE(exynos_drm_non_kms_drivers)); > } > > static inline void exynos_drm_unregister_kms_drivers(void) > { > - exynos_drm_unregister_drivers(exynos_drm_kms_drivers, > + drm_platform_unregister_drivers(exynos_drm_kms_drivers, > ARRAY_SIZE(exynos_drm_kms_drivers)); > } > > static inline void exynos_drm_unregister_non_kms_drivers(void) > { > - exynos_drm_unregister_drivers(exynos_drm_non_kms_drivers, > + drm_platform_unregister_drivers(exynos_drm_non_kms_drivers, > ARRAY_SIZE(exynos_drm_non_kms_drivers)); > } > > diff --git a/include/drm/drmP.h b/include/drm/drmP.h > index 8b5ce7c..a774574 100644 > --- a/include/drm/drmP.h > +++ b/include/drm/drmP.h > @@ -1087,6 +1087,10 @@ extern int drm_pcie_get_speed_cap_mask(struct drm_device *dev, u32 *speed_mask); > /* platform section */ > extern int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device); > extern int drm_platform_set_busid(struct drm_device *d, struct drm_master *m); > +int drm_platform_register_drivers(struct platform_driver *const *drv, > + int count); > +void drm_platform_unregister_drivers(struct platform_driver *const *drv, > + int count); > > /* returns true if currently okay to sleep */ > static __inline__ bool drm_can_sleep(void) > -- > 2.1.4 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index 45e7719..266d199 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -7,7 +7,8 @@ drm-y := drm_auth.o drm_bufs.o drm_cache.o \ drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \ drm_lock.o drm_memory.o drm_drv.o drm_vm.o \ drm_agpsupport.o drm_scatter.o drm_pci.o \ - drm_platform.o drm_sysfs.o drm_hashtab.o drm_mm.o \ + drm_platform.o drm_platform_helpers.o \ + drm_sysfs.o drm_hashtab.o drm_mm.o \ drm_crtc.o drm_modes.o drm_edid.o \ drm_info.o drm_debugfs.o drm_encoder_slave.o \ drm_trace_points.o drm_global.o drm_prime.o \ diff --git a/drivers/gpu/drm/drm_platform_helpers.c b/drivers/gpu/drm/drm_platform_helpers.c new file mode 100644 index 0000000..a54c3e3 --- /dev/null +++ b/drivers/gpu/drm/drm_platform_helpers.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include <drm/drmP.h> + +/** + * drm_platform_register_drivers - Helper to register an array of + * struct platform_drivers. + */ +int drm_platform_register_drivers(struct platform_driver *const *drv, + int count) +{ + int i, ret; + + for (i = 0; i < count; ++i) { + ret = platform_driver_register(drv[i]); + if (ret) { + while (--i >= 0) + platform_driver_unregister(drv[i]); + return ret; + } + } + + return 0; +} +EXPORT_SYMBOL_GPL(drm_platform_register_drivers); + +/** + * drm_platform_unregister_drivers - Helper to unregister an array of + * struct platform_drivers (in the opposite order they would have been + * registered by drm_platform_register_drivers()). + */ +void drm_platform_unregister_drivers(struct platform_driver *const *drv, + int count) +{ + while (--count >= 0) + platform_driver_unregister(drv[count]); +} +EXPORT_SYMBOL_GPL(drm_platform_unregister_drivers); diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index fa5194c..83f829b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -520,53 +520,27 @@ static int exynos_drm_register_devices(void) return 0; } -static void exynos_drm_unregister_drivers(struct platform_driver * const *drv, - int count) -{ - while (--count >= 0) - platform_driver_unregister(drv[count]); -} - -static int exynos_drm_register_drivers(struct platform_driver * const *drv, - int count) -{ - int i, ret; - - for (i = 0; i < count; ++i) { - ret = platform_driver_register(drv[i]); - if (!ret) - continue; - - while (--i >= 0) - platform_driver_unregister(drv[i]); - - return ret; - } - - return 0; -} - static inline int exynos_drm_register_kms_drivers(void) { - return exynos_drm_register_drivers(exynos_drm_kms_drivers, - ARRAY_SIZE(exynos_drm_kms_drivers)); + return drm_platform_register_drivers(exynos_drm_kms_drivers, + ARRAY_SIZE(exynos_drm_kms_drivers)); } static inline int exynos_drm_register_non_kms_drivers(void) { - return exynos_drm_register_drivers(exynos_drm_non_kms_drivers, - ARRAY_SIZE(exynos_drm_non_kms_drivers)); + return drm_platform_register_drivers(exynos_drm_non_kms_drivers, + ARRAY_SIZE(exynos_drm_non_kms_drivers)); } static inline void exynos_drm_unregister_kms_drivers(void) { - exynos_drm_unregister_drivers(exynos_drm_kms_drivers, + drm_platform_unregister_drivers(exynos_drm_kms_drivers, ARRAY_SIZE(exynos_drm_kms_drivers)); } static inline void exynos_drm_unregister_non_kms_drivers(void) { - exynos_drm_unregister_drivers(exynos_drm_non_kms_drivers, + drm_platform_unregister_drivers(exynos_drm_non_kms_drivers, ARRAY_SIZE(exynos_drm_non_kms_drivers)); } diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 8b5ce7c..a774574 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -1087,6 +1087,10 @@ extern int drm_pcie_get_speed_cap_mask(struct drm_device *dev, u32 *speed_mask); /* platform section */ extern int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device); extern int drm_platform_set_busid(struct drm_device *d, struct drm_master *m); +int drm_platform_register_drivers(struct platform_driver *const *drv, + int count); +void drm_platform_unregister_drivers(struct platform_driver *const *drv, + int count); /* returns true if currently okay to sleep */ static __inline__ bool drm_can_sleep(void)
This is mostly just a move of the code from exynos, with a slight reformat. I wanted to do a similar thing for vc4, and msm looks like a good candidate as well. Signed-off-by: Eric Anholt <eric@anholt.net> --- drivers/gpu/drm/Makefile | 3 ++- drivers/gpu/drm/drm_platform_helpers.c | 45 +++++++++++++++++++++++++++++++++ drivers/gpu/drm/exynos/exynos_drm_drv.c | 38 +++++----------------------- include/drm/drmP.h | 4 +++ 4 files changed, 57 insertions(+), 33 deletions(-) create mode 100644 drivers/gpu/drm/drm_platform_helpers.c