From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.9 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A44E0C73C53 for ; Tue, 9 Jul 2019 19:00:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 762E12082A for ; Tue, 9 Jul 2019 19:00:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="SI2rCAS7" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728999AbfGITAT (ORCPT ); Tue, 9 Jul 2019 15:00:19 -0400 Received: from mail-pg1-f196.google.com ([209.85.215.196]:43392 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727451AbfGITAQ (ORCPT ); Tue, 9 Jul 2019 15:00:16 -0400 Received: by mail-pg1-f196.google.com with SMTP id f25so9910160pgv.10 for ; Tue, 09 Jul 2019 12:00:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=T12A56st4U6xMjv9tNrkzq8tQL5jOdbBhnZMauX8Bws=; b=SI2rCAS72N9CLesCndW5GOG2uj6BrMPw1IuIl2eGt1duNnrycvb0HSTo7g2HFa1dw6 jre8ouKqMScn+GMJN2aW8u5WpdLg/vvwtRO68eGyrvh+hIhbuIR2XNab2JOlmMjR9svO NzG03XiTXHzv8UWz60/01C2e7bjXzIlH5mj70= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=T12A56st4U6xMjv9tNrkzq8tQL5jOdbBhnZMauX8Bws=; b=fgOi1Py9ZzOfsCVuafzghjw4gxAGOj9lB3tj8DkL242c9JE8/3DZ2IZwb8IwGOPeh/ XhoaR1SGwZvGnQ/5NWa/EKP/ggS+UFDcZ29yJvu1Mddzn1eaWhN/ukvo3lyAmBoSXADS qFHOIn++MnqF5KhX7NORAbKLreGmc42Lva2GbLEWPobqlD5ccJVRDcMFr+24sOFerjog P9fDRvwHMkOrc9NpuEK1N5yL2nk1qTt2w2h7zqDDX2BubZxGT4CNYcwIwqO7Ahs7QuOi vQyehZ7rJAesgbXAdaWskBwL2Z29xafn9imURk7rX8hCRrGFSxI3V36HbM1zupOzBfrE G+DA== X-Gm-Message-State: APjAAAV9TSBhfUUeOiHbFjGy9hh90o2eW1yWidbTtKK86Ye48Vpg/xV8 qNiTSYDjRAsFNLCac8/GYHngVg== X-Google-Smtp-Source: APXvYqyEa4ryD7UuELRziTCBGlJ9o4biH2jBafr0m0ioDSkfIt9v3ZzlZ12RUj4fyPMeD5pAkrk6Hw== X-Received: by 2002:a63:7519:: with SMTP id q25mr439220pgc.13.1562698815766; Tue, 09 Jul 2019 12:00:15 -0700 (PDT) Received: from localhost ([2620:15c:202:1:75a:3f6e:21d:9374]) by smtp.gmail.com with ESMTPSA id b15sm20363265pfi.141.2019.07.09.12.00.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 09 Jul 2019 12:00:15 -0700 (PDT) From: Matthias Kaehlcke To: Thierry Reding , Lee Jones , Daniel Thompson , Jingoo Han , Bartlomiej Zolnierkiewicz Cc: linux-pwm@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org, Enric Balletbo i Serra , Douglas Anderson , Brian Norris , Pavel Machek , Jacek Anaszewski , Matthias Kaehlcke Subject: [PATCH v3 2/4] backlight: Expose brightness curve type through sysfs Date: Tue, 9 Jul 2019 12:00:05 -0700 Message-Id: <20190709190007.91260-3-mka@chromium.org> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog In-Reply-To: <20190709190007.91260-1-mka@chromium.org> References: <20190709190007.91260-1-mka@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Backlight brightness curves can have different shapes. The two main types are linear and non-linear curves. The human eye doesn't perceive linearly increasing/decreasing brightness as linear (see also 88ba95bedb79 "backlight: pwm_bl: Compute brightness of LED linearly to human eye"), hence many backlights use non-linear (often logarithmic) brightness curves. The type of curve currently is opaque to userspace, so userspace often uses more or less reliable heuristics (like the number of brightness levels) to decide whether to treat a backlight device as linear or non-linear. Export the type of the brightness curve via the new sysfs attribute 'scale'. The value of the attribute can be 'linear', 'non-linear' or 'unknown'. For devices that don't provide information about the scale of their brightness curve the value of the 'scale' attribute is 'unknown'. Signed-off-by: Matthias Kaehlcke --- Feel free to suggest improvements in the documentation :) Changes in v3: - removed composite strings, only keep 'linear', 'non-linear' and 'unknown' - updated sysfs attribute documentation - updated commit message Changes in v2: - changed order of brightness scale enums, explicitly make 'unknown' zero - minor update of commit message - deleted excess blank line after 'backlight_scale_types' - s/curves/curve/ in sysfs doc --- .../ABI/testing/sysfs-class-backlight | 26 +++++++++++++++++++ MAINTAINERS | 1 + drivers/video/backlight/backlight.c | 19 ++++++++++++++ include/linux/backlight.h | 8 ++++++ 4 files changed, 54 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-class-backlight diff --git a/Documentation/ABI/testing/sysfs-class-backlight b/Documentation/ABI/testing/sysfs-class-backlight new file mode 100644 index 000000000000..3ab175a3f5cb --- /dev/null +++ b/Documentation/ABI/testing/sysfs-class-backlight @@ -0,0 +1,26 @@ +What: /sys/class/backlight//scale +Date: July 2019 +KernelVersion: 5.4 +Contact: Daniel Thompson +Description: + Description of the scale of the brightness curve. + + The human eye senses brightness approximately logarithmically, + hence linear changes in brightness are perceived as being + non-linear. To achieve a linear perception of brightness changes + controls like sliders need to apply a logarithmic mapping for + backlights with a linear brightness curve. + + Possible values of the attribute are: + + unknown + The scale of the brightness curve is unknown. + + linear + The brightness changes linearly with each step. Brightness + controls should apply a logarithmic mapping for a linear + perception. + + non-linear + The brightness changes non-linearly with each step. Brightness + controls should use a linear mapping for a linear perception. diff --git a/MAINTAINERS b/MAINTAINERS index d51e74340870..c46812510ba5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2858,6 +2858,7 @@ F: include/linux/backlight.h F: include/linux/pwm_backlight.h F: Documentation/devicetree/bindings/leds/backlight F: Documentation/ABI/stable/sysfs-class-backlight +F: Documentation/ABI/testing/sysfs-class-backlight BATMAN ADVANCED M: Marek Lindner diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c index 1ef8b6fd62ac..277abc76c83a 100644 --- a/drivers/video/backlight/backlight.c +++ b/drivers/video/backlight/backlight.c @@ -32,6 +32,12 @@ static const char *const backlight_types[] = { [BACKLIGHT_FIRMWARE] = "firmware", }; +static const char *const backlight_scale_types[] = { + [BACKLIGHT_SCALE_UNKNOWN] = "unknown", + [BACKLIGHT_SCALE_LINEAR] = "linear", + [BACKLIGHT_SCALE_NON_LINEAR] = "non-linear", +}; + #if defined(CONFIG_FB) || (defined(CONFIG_FB_MODULE) && \ defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)) /* This callback gets called when something important happens inside a @@ -246,6 +252,18 @@ static ssize_t actual_brightness_show(struct device *dev, } static DEVICE_ATTR_RO(actual_brightness); +static ssize_t scale_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct backlight_device *bd = to_backlight_device(dev); + + if (WARN_ON(bd->props.scale > BACKLIGHT_SCALE_NON_LINEAR)) + return sprintf(buf, "unknown\n"); + + return sprintf(buf, "%s\n", backlight_scale_types[bd->props.scale]); +} +static DEVICE_ATTR_RO(scale); + static struct class *backlight_class; #ifdef CONFIG_PM_SLEEP @@ -292,6 +310,7 @@ static struct attribute *bl_device_attrs[] = { &dev_attr_brightness.attr, &dev_attr_actual_brightness.attr, &dev_attr_max_brightness.attr, + &dev_attr_scale.attr, &dev_attr_type.attr, NULL, }; diff --git a/include/linux/backlight.h b/include/linux/backlight.h index 0b5897446dca..c7d6b2e8c3b5 100644 --- a/include/linux/backlight.h +++ b/include/linux/backlight.h @@ -46,6 +46,12 @@ enum backlight_notification { BACKLIGHT_UNREGISTERED, }; +enum backlight_scale { + BACKLIGHT_SCALE_UNKNOWN = 0, + BACKLIGHT_SCALE_LINEAR, + BACKLIGHT_SCALE_NON_LINEAR, +}; + struct backlight_device; struct fb_info; @@ -80,6 +86,8 @@ struct backlight_properties { enum backlight_type type; /* Flags used to signal drivers of state changes */ unsigned int state; + /* Type of the brightness scale (linear, non-linear, ...) */ + enum backlight_scale scale; #define BL_CORE_SUSPENDED (1 << 0) /* backlight is suspended */ #define BL_CORE_FBBLANK (1 << 1) /* backlight is under an fb blank event */ -- 2.22.0.410.gd8fdbe21b5-goog From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthias Kaehlcke Subject: [PATCH v3 2/4] backlight: Expose brightness curve type through sysfs Date: Tue, 9 Jul 2019 12:00:05 -0700 Message-ID: <20190709190007.91260-3-mka@chromium.org> References: <20190709190007.91260-1-mka@chromium.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190709190007.91260-1-mka@chromium.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Thierry Reding , Lee Jones , Daniel Thompson , Jingoo Han , Bartlomiej Zolnierkiewicz Cc: linux-pwm@vger.kernel.org, linux-fbdev@vger.kernel.org, Brian Norris , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Douglas Anderson , Matthias Kaehlcke , Jacek Anaszewski , Pavel Machek , Enric Balletbo i Serra List-Id: linux-pwm@vger.kernel.org QmFja2xpZ2h0IGJyaWdodG5lc3MgY3VydmVzIGNhbiBoYXZlIGRpZmZlcmVudCBzaGFwZXMuIFRo ZSB0d28gbWFpbgp0eXBlcyBhcmUgbGluZWFyIGFuZCBub24tbGluZWFyIGN1cnZlcy4gVGhlIGh1 bWFuIGV5ZSBkb2Vzbid0CnBlcmNlaXZlIGxpbmVhcmx5IGluY3JlYXNpbmcvZGVjcmVhc2luZyBi cmlnaHRuZXNzIGFzIGxpbmVhciAoc2VlCmFsc28gODhiYTk1YmVkYjc5ICJiYWNrbGlnaHQ6IHB3 bV9ibDogQ29tcHV0ZSBicmlnaHRuZXNzIG9mIExFRApsaW5lYXJseSB0byBodW1hbiBleWUiKSwg aGVuY2UgbWFueSBiYWNrbGlnaHRzIHVzZSBub24tbGluZWFyIChvZnRlbgpsb2dhcml0aG1pYykg YnJpZ2h0bmVzcyBjdXJ2ZXMuIFRoZSB0eXBlIG9mIGN1cnZlIGN1cnJlbnRseSBpcyBvcGFxdWUK dG8gdXNlcnNwYWNlLCBzbyB1c2Vyc3BhY2Ugb2Z0ZW4gdXNlcyBtb3JlIG9yIGxlc3MgcmVsaWFi bGUgaGV1cmlzdGljcwoobGlrZSB0aGUgbnVtYmVyIG9mIGJyaWdodG5lc3MgbGV2ZWxzKSB0byBk ZWNpZGUgd2hldGhlciB0byB0cmVhdCBhCmJhY2tsaWdodCBkZXZpY2UgYXMgbGluZWFyIG9yIG5v bi1saW5lYXIuCgpFeHBvcnQgdGhlIHR5cGUgb2YgdGhlIGJyaWdodG5lc3MgY3VydmUgdmlhIHRo ZSBuZXcgc3lzZnMgYXR0cmlidXRlCidzY2FsZScuIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRl IGNhbiBiZSAnbGluZWFyJywgJ25vbi1saW5lYXInIG9yCid1bmtub3duJy4gRm9yIGRldmljZXMg dGhhdCBkb24ndCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzY2FsZQpvZiB0aGVpciBi cmlnaHRuZXNzIGN1cnZlIHRoZSB2YWx1ZSBvZiB0aGUgJ3NjYWxlJyBhdHRyaWJ1dGUgaXMgJ3Vu a25vd24nLgoKU2lnbmVkLW9mZi1ieTogTWF0dGhpYXMgS2FlaGxja2UgPG1rYUBjaHJvbWl1bS5v cmc+Ci0tLQpGZWVsIGZyZWUgdG8gc3VnZ2VzdCBpbXByb3ZlbWVudHMgaW4gdGhlIGRvY3VtZW50 YXRpb24gOikKCkNoYW5nZXMgaW4gdjM6Ci0gcmVtb3ZlZCBjb21wb3NpdGUgc3RyaW5ncywgb25s eSBrZWVwICdsaW5lYXInLCAnbm9uLWxpbmVhcicgYW5kCiAgJ3Vua25vd24nCi0gdXBkYXRlZCBz eXNmcyBhdHRyaWJ1dGUgZG9jdW1lbnRhdGlvbgotIHVwZGF0ZWQgY29tbWl0IG1lc3NhZ2UKCkNo YW5nZXMgaW4gdjI6Ci0gY2hhbmdlZCBvcmRlciBvZiBicmlnaHRuZXNzIHNjYWxlIGVudW1zLCBl eHBsaWNpdGx5IG1ha2UgJ3Vua25vd24nIHplcm8KLSBtaW5vciB1cGRhdGUgb2YgY29tbWl0IG1l c3NhZ2UKLSBkZWxldGVkIGV4Y2VzcyBibGFuayBsaW5lIGFmdGVyICdiYWNrbGlnaHRfc2NhbGVf dHlwZXMnCi0gcy9jdXJ2ZXMvY3VydmUvIGluIHN5c2ZzIGRvYwotLS0KIC4uLi9BQkkvdGVzdGlu Zy9zeXNmcy1jbGFzcy1iYWNrbGlnaHQgICAgICAgICB8IDI2ICsrKysrKysrKysrKysrKysrKysK IE1BSU5UQUlORVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxICsKIGRy aXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jICAgICAgICAgICB8IDE5ICsrKysrKysr KysrKysrCiBpbmNsdWRlL2xpbnV4L2JhY2tsaWdodC5oICAgICAgICAgICAgICAgICAgICAgfCAg OCArKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgNTQgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUg MTAwNjQ0IERvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtYmFja2xpZ2h0Cgpk aWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1iYWNrbGln aHQgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWJhY2tsaWdodApuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjNhYjE3NWEzZjVjYgotLS0gL2Rl di9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtYmFja2xp Z2h0CkBAIC0wLDAgKzEsMjYgQEAKK1doYXQ6CQkvc3lzL2NsYXNzL2JhY2tsaWdodC88YmFja2xp Z2h0Pi9zY2FsZQorRGF0ZToJCUp1bHkgMjAxOQorS2VybmVsVmVyc2lvbjoJNS40CitDb250YWN0 OglEYW5pZWwgVGhvbXBzb24gPGRhbmllbC50aG9tcHNvbkBsaW5hcm8ub3JnPgorRGVzY3JpcHRp b246CisJCURlc2NyaXB0aW9uIG9mIHRoZSBzY2FsZSBvZiB0aGUgYnJpZ2h0bmVzcyBjdXJ2ZS4K KworCQlUaGUgaHVtYW4gZXllIHNlbnNlcyBicmlnaHRuZXNzIGFwcHJveGltYXRlbHkgbG9nYXJp dGhtaWNhbGx5LAorCQloZW5jZSBsaW5lYXIgY2hhbmdlcyBpbiBicmlnaHRuZXNzIGFyZSBwZXJj ZWl2ZWQgYXMgYmVpbmcKKwkJbm9uLWxpbmVhci4gVG8gYWNoaWV2ZSBhIGxpbmVhciBwZXJjZXB0 aW9uIG9mIGJyaWdodG5lc3MgY2hhbmdlcworCQljb250cm9scyBsaWtlIHNsaWRlcnMgbmVlZCB0 byBhcHBseSBhIGxvZ2FyaXRobWljIG1hcHBpbmcgZm9yCisJCWJhY2tsaWdodHMgd2l0aCBhIGxp bmVhciBicmlnaHRuZXNzIGN1cnZlLgorCisJCVBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgYXR0cmli dXRlIGFyZToKKworCQl1bmtub3duCisJCSAgVGhlIHNjYWxlIG9mIHRoZSBicmlnaHRuZXNzIGN1 cnZlIGlzIHVua25vd24uCisKKwkJbGluZWFyCisJCSAgVGhlIGJyaWdodG5lc3MgY2hhbmdlcyBs aW5lYXJseSB3aXRoIGVhY2ggc3RlcC4gQnJpZ2h0bmVzcworCQkgIGNvbnRyb2xzIHNob3VsZCBh cHBseSBhIGxvZ2FyaXRobWljIG1hcHBpbmcgZm9yIGEgbGluZWFyCisJCSAgcGVyY2VwdGlvbi4K KworCQlub24tbGluZWFyCisJCSAgVGhlIGJyaWdodG5lc3MgY2hhbmdlcyBub24tbGluZWFybHkg d2l0aCBlYWNoIHN0ZXAuIEJyaWdodG5lc3MKKwkJICBjb250cm9scyBzaG91bGQgdXNlIGEgbGlu ZWFyIG1hcHBpbmcgZm9yIGEgbGluZWFyIHBlcmNlcHRpb24uCmRpZmYgLS1naXQgYS9NQUlOVEFJ TkVSUyBiL01BSU5UQUlORVJTCmluZGV4IGQ1MWU3NDM0MDg3MC4uYzQ2ODEyNTEwYmE1IDEwMDY0 NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMjg1OCw2ICsyODU4LDcg QEAgRjoJaW5jbHVkZS9saW51eC9iYWNrbGlnaHQuaAogRjoJaW5jbHVkZS9saW51eC9wd21fYmFj a2xpZ2h0LmgKIEY6CURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2JhY2ts aWdodAogRjoJRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWNsYXNzLWJhY2tsaWdodAor RjoJRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1iYWNrbGlnaHQKIAogQkFU TUFOIEFEVkFOQ0VECiBNOglNYXJlayBMaW5kbmVyIDxtYXJla2xpbmRuZXJAbmVvbWFpbGJveC5j aD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jIGIvZHJp dmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMKaW5kZXggMWVmOGI2ZmQ2MmFjLi4yNzdh YmM3NmM4M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5j CisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jCkBAIC0zMiw2ICszMiwx MiBAQCBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYmFja2xpZ2h0X3R5cGVzW10gPSB7CiAJW0JB Q0tMSUdIVF9GSVJNV0FSRV0gPSAiZmlybXdhcmUiLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIg KmNvbnN0IGJhY2tsaWdodF9zY2FsZV90eXBlc1tdID0geworCVtCQUNLTElHSFRfU0NBTEVfVU5L Tk9XTl0JPSAidW5rbm93biIsCisJW0JBQ0tMSUdIVF9TQ0FMRV9MSU5FQVJdCT0gImxpbmVhciIs CisJW0JBQ0tMSUdIVF9TQ0FMRV9OT05fTElORUFSXQk9ICJub24tbGluZWFyIiwKK307CisKICNp ZiBkZWZpbmVkKENPTkZJR19GQikgfHwgKGRlZmluZWQoQ09ORklHX0ZCX01PRFVMRSkgJiYgXAog CQkJICAgZGVmaW5lZChDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRV9NT0RVTEUpKQogLyog VGhpcyBjYWxsYmFjayBnZXRzIGNhbGxlZCB3aGVuIHNvbWV0aGluZyBpbXBvcnRhbnQgaGFwcGVu cyBpbnNpZGUgYQpAQCAtMjQ2LDYgKzI1MiwxOCBAQCBzdGF0aWMgc3NpemVfdCBhY3R1YWxfYnJp Z2h0bmVzc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUl9S TyhhY3R1YWxfYnJpZ2h0bmVzcyk7CiAKK3N0YXRpYyBzc2l6ZV90IHNjYWxlX3Nob3coc3RydWN0 IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVm KQoreworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCA9IHRvX2JhY2tsaWdodF9kZXZpY2Uo ZGV2KTsKKworCWlmIChXQVJOX09OKGJkLT5wcm9wcy5zY2FsZSA+IEJBQ0tMSUdIVF9TQ0FMRV9O T05fTElORUFSKSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93blxuIik7CisKKwlyZXR1 cm4gc3ByaW50ZihidWYsICIlc1xuIiwgYmFja2xpZ2h0X3NjYWxlX3R5cGVzW2JkLT5wcm9wcy5z Y2FsZV0pOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKHNjYWxlKTsKKwogc3RhdGljIHN0cnVj dCBjbGFzcyAqYmFja2xpZ2h0X2NsYXNzOwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCkBAIC0y OTIsNiArMzEwLDcgQEAgc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJsX2RldmljZV9hdHRyc1td ID0gewogCSZkZXZfYXR0cl9icmlnaHRuZXNzLmF0dHIsCiAJJmRldl9hdHRyX2FjdHVhbF9icmln aHRuZXNzLmF0dHIsCiAJJmRldl9hdHRyX21heF9icmlnaHRuZXNzLmF0dHIsCisJJmRldl9hdHRy X3NjYWxlLmF0dHIsCiAJJmRldl9hdHRyX3R5cGUuYXR0ciwKIAlOVUxMLAogfTsKZGlmZiAtLWdp dCBhL2luY2x1ZGUvbGludXgvYmFja2xpZ2h0LmggYi9pbmNsdWRlL2xpbnV4L2JhY2tsaWdodC5o CmluZGV4IDBiNTg5NzQ0NmRjYS4uYzdkNmIyZThjM2I1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xp bnV4L2JhY2tsaWdodC5oCisrKyBiL2luY2x1ZGUvbGludXgvYmFja2xpZ2h0LmgKQEAgLTQ2LDYg KzQ2LDEyIEBAIGVudW0gYmFja2xpZ2h0X25vdGlmaWNhdGlvbiB7CiAJQkFDS0xJR0hUX1VOUkVH SVNURVJFRCwKIH07CiAKK2VudW0gYmFja2xpZ2h0X3NjYWxlIHsKKwlCQUNLTElHSFRfU0NBTEVf VU5LTk9XTiA9IDAsCisJQkFDS0xJR0hUX1NDQUxFX0xJTkVBUiwKKwlCQUNLTElHSFRfU0NBTEVf Tk9OX0xJTkVBUiwKK307CisKIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlOwogc3RydWN0IGZiX2lu Zm87CiAKQEAgLTgwLDYgKzg2LDggQEAgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHsKIAll bnVtIGJhY2tsaWdodF90eXBlIHR5cGU7CiAJLyogRmxhZ3MgdXNlZCB0byBzaWduYWwgZHJpdmVy cyBvZiBzdGF0ZSBjaGFuZ2VzICovCiAJdW5zaWduZWQgaW50IHN0YXRlOworCS8qIFR5cGUgb2Yg dGhlIGJyaWdodG5lc3Mgc2NhbGUgKGxpbmVhciwgbm9uLWxpbmVhciwgLi4uKSAqLworCWVudW0g YmFja2xpZ2h0X3NjYWxlIHNjYWxlOwogCiAjZGVmaW5lIEJMX0NPUkVfU1VTUEVOREVECSgxIDw8 IDApCS8qIGJhY2tsaWdodCBpcyBzdXNwZW5kZWQgKi8KICNkZWZpbmUgQkxfQ09SRV9GQkJMQU5L CQkoMSA8PCAxKQkvKiBiYWNrbGlnaHQgaXMgdW5kZXIgYW4gZmIgYmxhbmsgZXZlbnQgKi8KLS0g CjIuMjIuMC40MTAuZ2Q4ZmRiZTIxYjUtZ29vZwoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4v bGlzdGluZm8vZHJpLWRldmVs From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthias Kaehlcke Date: Tue, 09 Jul 2019 19:00:05 +0000 Subject: [PATCH v3 2/4] backlight: Expose brightness curve type through sysfs Message-Id: <20190709190007.91260-3-mka@chromium.org> List-Id: References: <20190709190007.91260-1-mka@chromium.org> In-Reply-To: <20190709190007.91260-1-mka@chromium.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Thierry Reding , Lee Jones , Daniel Thompson , Jingoo Han , Bartlomiej Zolnierkiewicz Cc: linux-pwm@vger.kernel.org, linux-fbdev@vger.kernel.org, Brian Norris , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Douglas Anderson , Matthias Kaehlcke , Jacek Anaszewski , Pavel Machek , Enric Balletbo i Serra Backlight brightness curves can have different shapes. The two main types are linear and non-linear curves. The human eye doesn't perceive linearly increasing/decreasing brightness as linear (see also 88ba95bedb79 "backlight: pwm_bl: Compute brightness of LED linearly to human eye"), hence many backlights use non-linear (often logarithmic) brightness curves. The type of curve currently is opaque to userspace, so userspace often uses more or less reliable heuristics (like the number of brightness levels) to decide whether to treat a backlight device as linear or non-linear. Export the type of the brightness curve via the new sysfs attribute 'scale'. The value of the attribute can be 'linear', 'non-linear' or 'unknown'. For devices that don't provide information about the scale of their brightness curve the value of the 'scale' attribute is 'unknown'. Signed-off-by: Matthias Kaehlcke --- Feel free to suggest improvements in the documentation :) Changes in v3: - removed composite strings, only keep 'linear', 'non-linear' and 'unknown' - updated sysfs attribute documentation - updated commit message Changes in v2: - changed order of brightness scale enums, explicitly make 'unknown' zero - minor update of commit message - deleted excess blank line after 'backlight_scale_types' - s/curves/curve/ in sysfs doc --- .../ABI/testing/sysfs-class-backlight | 26 +++++++++++++++++++ MAINTAINERS | 1 + drivers/video/backlight/backlight.c | 19 ++++++++++++++ include/linux/backlight.h | 8 ++++++ 4 files changed, 54 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-class-backlight diff --git a/Documentation/ABI/testing/sysfs-class-backlight b/Documentation/ABI/testing/sysfs-class-backlight new file mode 100644 index 000000000000..3ab175a3f5cb --- /dev/null +++ b/Documentation/ABI/testing/sysfs-class-backlight @@ -0,0 +1,26 @@ +What: /sys/class/backlight//scale +Date: July 2019 +KernelVersion: 5.4 +Contact: Daniel Thompson +Description: + Description of the scale of the brightness curve. + + The human eye senses brightness approximately logarithmically, + hence linear changes in brightness are perceived as being + non-linear. To achieve a linear perception of brightness changes + controls like sliders need to apply a logarithmic mapping for + backlights with a linear brightness curve. + + Possible values of the attribute are: + + unknown + The scale of the brightness curve is unknown. + + linear + The brightness changes linearly with each step. Brightness + controls should apply a logarithmic mapping for a linear + perception. + + non-linear + The brightness changes non-linearly with each step. Brightness + controls should use a linear mapping for a linear perception. diff --git a/MAINTAINERS b/MAINTAINERS index d51e74340870..c46812510ba5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2858,6 +2858,7 @@ F: include/linux/backlight.h F: include/linux/pwm_backlight.h F: Documentation/devicetree/bindings/leds/backlight F: Documentation/ABI/stable/sysfs-class-backlight +F: Documentation/ABI/testing/sysfs-class-backlight BATMAN ADVANCED M: Marek Lindner diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c index 1ef8b6fd62ac..277abc76c83a 100644 --- a/drivers/video/backlight/backlight.c +++ b/drivers/video/backlight/backlight.c @@ -32,6 +32,12 @@ static const char *const backlight_types[] = { [BACKLIGHT_FIRMWARE] = "firmware", }; +static const char *const backlight_scale_types[] = { + [BACKLIGHT_SCALE_UNKNOWN] = "unknown", + [BACKLIGHT_SCALE_LINEAR] = "linear", + [BACKLIGHT_SCALE_NON_LINEAR] = "non-linear", +}; + #if defined(CONFIG_FB) || (defined(CONFIG_FB_MODULE) && \ defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)) /* This callback gets called when something important happens inside a @@ -246,6 +252,18 @@ static ssize_t actual_brightness_show(struct device *dev, } static DEVICE_ATTR_RO(actual_brightness); +static ssize_t scale_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct backlight_device *bd = to_backlight_device(dev); + + if (WARN_ON(bd->props.scale > BACKLIGHT_SCALE_NON_LINEAR)) + return sprintf(buf, "unknown\n"); + + return sprintf(buf, "%s\n", backlight_scale_types[bd->props.scale]); +} +static DEVICE_ATTR_RO(scale); + static struct class *backlight_class; #ifdef CONFIG_PM_SLEEP @@ -292,6 +310,7 @@ static struct attribute *bl_device_attrs[] = { &dev_attr_brightness.attr, &dev_attr_actual_brightness.attr, &dev_attr_max_brightness.attr, + &dev_attr_scale.attr, &dev_attr_type.attr, NULL, }; diff --git a/include/linux/backlight.h b/include/linux/backlight.h index 0b5897446dca..c7d6b2e8c3b5 100644 --- a/include/linux/backlight.h +++ b/include/linux/backlight.h @@ -46,6 +46,12 @@ enum backlight_notification { BACKLIGHT_UNREGISTERED, }; +enum backlight_scale { + BACKLIGHT_SCALE_UNKNOWN = 0, + BACKLIGHT_SCALE_LINEAR, + BACKLIGHT_SCALE_NON_LINEAR, +}; + struct backlight_device; struct fb_info; @@ -80,6 +86,8 @@ struct backlight_properties { enum backlight_type type; /* Flags used to signal drivers of state changes */ unsigned int state; + /* Type of the brightness scale (linear, non-linear, ...) */ + enum backlight_scale scale; #define BL_CORE_SUSPENDED (1 << 0) /* backlight is suspended */ #define BL_CORE_FBBLANK (1 << 1) /* backlight is under an fb blank event */ -- 2.22.0.410.gd8fdbe21b5-goog