[Nouveau] [PATCH 1/2] nouveau/bl: Assign different names to interfaces
Ilia Mirkin
imirkin at alum.mit.edu
Fri Apr 15 15:06:47 UTC 2016
On Fri, Apr 15, 2016 at 10:57 AM, Pierre Moreau <pierre.morrow at free.fr> wrote:
> Currently, every backlight interface created by Nouveau uses the same name,
> nv_backlight. This leads to a sysfs warning as it tries to create an already
> existing folder. This patch adds a incremented number to the name, but keeps
> the initial name as nv_backlight, to avoid possibly breaking userspace; the
> second interface will be named nv_backlight1, and so on.
>
> Fixes: fdo#86539
> Signed-off-by: Pierre Moreau <pierre.morrow at free.fr>
> ---
> drm/nouveau/nouveau_backlight.c | 35 +++++++++++++++++++++++++++++++++--
> 1 file changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/drm/nouveau/nouveau_backlight.c b/drm/nouveau/nouveau_backlight.c
> index 89eb460..914e2cb 100644
> --- a/drm/nouveau/nouveau_backlight.c
> +++ b/drm/nouveau/nouveau_backlight.c
> @@ -36,6 +36,10 @@
> #include "nouveau_reg.h"
> #include "nouveau_encoder.h"
>
> +static atomic_t bl_interfaces_nb = { 0 };
static data is initialized to 0, this should be unnecessary.
I'd also call it "backlights" or something like that. No need for
multiple words...
> +
> +static char* nouveau_get_backlight_name(void);
Please organize the code to avoid forward declarations.
> +
> static int
> nv40_get_intensity(struct backlight_device *bd)
> {
> @@ -74,6 +78,7 @@ nv40_backlight_init(struct drm_connector *connector)
> struct nvif_object *device = &drm->device.object;
> struct backlight_properties props;
> struct backlight_device *bd;
> + char* backlight_name = NULL;
>
> if (!(nvif_rd32(device, NV40_PMC_BACKLIGHT) & NV40_PMC_BACKLIGHT_MASK))
> return 0;
> @@ -81,8 +86,14 @@ nv40_backlight_init(struct drm_connector *connector)
> memset(&props, 0, sizeof(struct backlight_properties));
> props.type = BACKLIGHT_RAW;
> props.max_brightness = 31;
> - bd = backlight_device_register("nv_backlight", connector->kdev, drm,
> + backlight_name = nouveau_get_backlight_name();
> + bd = backlight_device_register(backlight_name , connector->kdev, drm,
> &nv40_bl_ops, &props);
> +
> + // backlight_device_register() makes a copy
> + kfree(backlight_name);
> + backlight_name = NULL;
> +
> if (IS_ERR(bd))
> return PTR_ERR(bd);
> drm->backlight = bd;
> @@ -182,6 +193,7 @@ nv50_backlight_init(struct drm_connector *connector)
> struct backlight_properties props;
> struct backlight_device *bd;
> const struct backlight_ops *ops;
> + char* backlight_name = NULL;
>
> nv_encoder = find_encoder(connector, DCB_OUTPUT_LVDS);
> if (!nv_encoder) {
> @@ -203,8 +215,14 @@ nv50_backlight_init(struct drm_connector *connector)
> memset(&props, 0, sizeof(struct backlight_properties));
> props.type = BACKLIGHT_RAW;
> props.max_brightness = 100;
> - bd = backlight_device_register("nv_backlight", connector->kdev,
> + backlight_name = nouveau_get_backlight_name();
> + bd = backlight_device_register(backlight_name, connector->kdev,
> nv_encoder, ops, &props);
> +
> + // backlight_device_register() makes a copy
> + kfree(backlight_name);
> + backlight_name = NULL;
> +
> if (IS_ERR(bd))
> return PTR_ERR(bd);
>
> @@ -252,3 +270,16 @@ nouveau_backlight_exit(struct drm_device *dev)
> drm->backlight = NULL;
> }
> }
> +
> +static char*
> +nouveau_get_backlight_name(void)
> +{
> + // 12 chars for "nv_backlight" + 2 for two digits number + 1 for '\0'
> + char* backlight_name = (char*)kmalloc(sizeof(char[15]), GFP_KERNEL);
Making this stack-allocated in the caller would be so much simpler...
> + const int nb = atomic_inc_return(&bl_interfaces_nb) - 1;
This kinda sucks if you reload nouveau a bunch. How about using an
"ida". Have a look in drivers/gpu/drm/drm_crtc.c for how I use that
one.
> + if (nb > 0 && nb < 100)
> + sprintf(backlight_name, "nv_backlight%d", nb);
> + else
> + sprintf(backlight_name, "nv_backlight");
> + return backlight_name;
> +}
> --
> 2.8.0
>
> _______________________________________________
> Nouveau mailing list
> Nouveau at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/nouveau
More information about the Nouveau
mailing list