Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1226383 > unrolled thread
| Started by | Eric Anholt <eric@anholt.net> |
|---|---|
| First post | 2015-09-16 20:20 +0200 |
| Last post | 2015-09-16 21:30 +0200 |
| Articles | 3 — 2 participants |
Back to article view | Back to linux.kernel
drm: Platform helpers for exynos-style component registration. Eric Anholt <eric@anholt.net> - 2015-09-16 20:20 +0200
[PATCH 1/4] drm: Put platform driver registration/unregistration loops in core. Eric Anholt <eric@anholt.net> - 2015-09-16 20:30 +0200
Re: [PATCH 1/4] drm: Put platform driver registration/unregistration loops in core. Daniel Vetter <daniel@ffwll.ch> - 2015-09-16 21:30 +0200
| From | Eric Anholt <eric@anholt.net> |
|---|---|
| Date | 2015-09-16 20:20 +0200 |
| Subject | drm: Platform helpers for exynos-style component registration. |
| Message-ID | <q9ptg-3Ot-21@gated-at.bofh.it> |
I had previously modeled vc4 off of msm's component driver registration, but on further investigation exynos has an even cleaner way of doing it. Here's a series to turn exynos's style into core helpers, and use it from msm. The patches are build tested, but I don't have either of the platforms to test on. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Eric Anholt <eric@anholt.net> |
|---|---|
| Date | 2015-09-16 20:30 +0200 |
| Subject | [PATCH 1/4] drm: Put platform driver registration/unregistration loops in core. |
| Message-ID | <q9pCW-3ZU-45@gated-at.bofh.it> |
| In reply to | #1226383 |
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 \
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)
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Daniel Vetter <daniel@ffwll.ch> |
|---|---|
| Date | 2015-09-16 21:30 +0200 |
| Subject | Re: [PATCH 1/4] drm: Put platform driver registration/unregistration loops in core. |
| Message-ID | <q9qz1-5ll-33@gated-at.bofh.it> |
| In reply to | #1226386 |
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
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web