From patchwork Mon Jun 10 23:37:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthias Kaehlcke X-Patchwork-Id: 10985649 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id EC9D5924 for ; Mon, 10 Jun 2019 23:37:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DE39E28174 for ; Mon, 10 Jun 2019 23:37:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D192428694; Mon, 10 Jun 2019 23:37:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C5D1428174 for ; Mon, 10 Jun 2019 23:37:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390726AbfFJXhp (ORCPT ); Mon, 10 Jun 2019 19:37:45 -0400 Received: from mail-pl1-f196.google.com ([209.85.214.196]:46948 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390671AbfFJXho (ORCPT ); Mon, 10 Jun 2019 19:37:44 -0400 Received: by mail-pl1-f196.google.com with SMTP id e5so4251611pls.13 for ; Mon, 10 Jun 2019 16:37:44 -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:mime-version :content-transfer-encoding; bh=PwvhwkI8F4zvLVsJwAGnKk3UZTvA+WVT+qCBY1uqWqg=; b=hijO8nHj6AanoC+to/aLESdGAjYajAq/Wwo6ROP8Jh065ysj+O/VWUY+CjGk1QGNLO Nzjj4CGR7IV5n0DZhEvJ8T9VttRm3HNbJ8f655p8CVolKCbEHYeRHF0Q7pT55hBt7oMM UA5ufOa5wv1gkQHsFvqsinxJo7kP1Tysa/l1g= 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:mime-version :content-transfer-encoding; bh=PwvhwkI8F4zvLVsJwAGnKk3UZTvA+WVT+qCBY1uqWqg=; b=LxqyecS61kvkArSWYT4qt2ZW15jQ5vaOokI5UF/ETZrnOWYTuL5hQvPj8CLyzcUifw 6ANszLtlURrDWfoKkfmqC6ucofW36IJVvgQZyo4kWXqkNPRn3ANy2khzfEd1VzaG4VsS HfPM5DX/XIaqmR12OUEKl/iXIGvFaKDc6XsdKQJ5Jt2Hgv5u6l2nbKnHER2xEVmG3SLd wVAKhoAUpUmFZAcZu0DxOT2SiD3bTCnSTVDqECB0LjSWAuEoKxeOfTapa1Cgn5VZBF2M /2jSiGNe4hvLCLpCVV9DDe5hrBqlD+3SJeTkXd2Np+OqFiwRhB5qJ+nZSIVWkflvhw/x x0VQ== X-Gm-Message-State: APjAAAW8MZKHOqLKipNrk/rWnTVd1zuzXqMKP8Cqratnxgtfa3AeRjsx zMcI3yBy+CS5nXGCSMJy5tLAcQ== X-Google-Smtp-Source: APXvYqxzuWk+HHUFs0uzAZUj3UB9CiltN6z/LVO8neBboHeE9VutR2V17/0JmmVYiipinsqCD9j37w== X-Received: by 2002:a17:902:7581:: with SMTP id j1mr72670630pll.23.1560209864163; Mon, 10 Jun 2019 16:37:44 -0700 (PDT) Received: from localhost ([2620:15c:202:1:75a:3f6e:21d:9374]) by smtp.gmail.com with ESMTPSA id q144sm8898518pfc.103.2019.06.10.16.37.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 10 Jun 2019 16:37:43 -0700 (PDT) From: Matthias Kaehlcke To: Lee Jones , Daniel Thompson , Jingoo Han , Jacek Anaszewski , Pavel Machek , Rob Herring , Mark Rutland , Thierry Reding , Bartlomiej Zolnierkiewicz , Enric Balletbo i Serra Cc: dri-devel@lists.freedesktop.org, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org, linux-fbdev@vger.kernel.org, Douglas Anderson , Brian Norris , Matthias Kaehlcke Subject: [PATCH 1/2] dt-bindings: pwm-backlight: Add 'max-brightness' property Date: Mon, 10 Jun 2019 16:37:38 -0700 Message-Id: <20190610233739.29477-1-mka@chromium.org> X-Mailer: git-send-email 2.22.0.rc2.383.gf4fbbf30c2-goog MIME-Version: 1.0 Sender: linux-fbdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add an optional 'max-brightness' property, which is used to specify the number of brightness levels (max-brightness + 1) when the node has no 'brightness-levels' table. Signed-off-by: Matthias Kaehlcke Acked-by: Pavel Machek --- .../devicetree/bindings/leds/backlight/pwm-backlight.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt b/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt index 64fa2fbd98c9..98f4ba626054 100644 --- a/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt +++ b/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt @@ -27,6 +27,9 @@ Optional properties: resolution pwm duty cycle can be used without having to list out every possible value in the brightness-level array. + - max-brightness: Maximum brightness value. Used to specify the number of + brightness levels (max-brightness + 1) when the node + has no 'brightness-levels' table. [0]: Documentation/devicetree/bindings/pwm/pwm.txt [1]: Documentation/devicetree/bindings/gpio/gpio.txt From patchwork Mon Jun 10 23:37:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthias Kaehlcke X-Patchwork-Id: 10985643 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 47BBA924 for ; Mon, 10 Jun 2019 23:37:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 35A4728689 for ; Mon, 10 Jun 2019 23:37:49 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2980A286A2; Mon, 10 Jun 2019 23:37:49 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6DE6028689 for ; Mon, 10 Jun 2019 23:37:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390752AbfFJXhr (ORCPT ); Mon, 10 Jun 2019 19:37:47 -0400 Received: from mail-pl1-f194.google.com ([209.85.214.194]:38748 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390656AbfFJXhq (ORCPT ); Mon, 10 Jun 2019 19:37:46 -0400 Received: by mail-pl1-f194.google.com with SMTP id f97so4261813plb.5 for ; Mon, 10 Jun 2019 16:37:46 -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=lwYUN/KUyzUQQmKgro+g5eqK3FeGewhxwiwrsgABWdM=; b=JNH8X5fVDnaksMRrJIPAhSlbONYaT+Qzmac4p+4aIJ9MyL8CBR4CbOBSaLfJ/lVSWz pvy14bPyQRVfCaYdY6N70JiL3c1/7002idQAVcssXH4SBW+0u1+C1Vpj0J8C56+lsuaW rD6bAgc+3gw9fyJeWeljeJYPPMzpJKROpovfA= 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=lwYUN/KUyzUQQmKgro+g5eqK3FeGewhxwiwrsgABWdM=; b=gY/dbQO6XwHeRxXqoOqUmbKk03UlWwIc2atpZWVU3MsMNEHOkMdpc4A2gVzUim5T0o oVdm5c4lz2UjBjVLziCbypbD0hkT5v82A/ntcqumdhg2L0fslXehVXi1GudlXfa2ngdS iZWdv/khjd5SdyWCm+gFbv6wkUghQHFuXheQkGfhBMTuOYZUIj6+pOjFoq6uIaHvqeEM YnS7DehtQK3nrQE333eRJN02GzDS+VoLrREyxRgOBdJUznWm1T6+QS9m9Xd1l8oTOk+2 s9ghOkR1PmZt6I0kmiboFGr9wLGO1EoUPfDUaAit+GLx1YrcQfmQCvfFofIN/MrG/IHa L3TA== X-Gm-Message-State: APjAAAUpPx/fHfYf2jcU/jLd6spPQPn57HdNK6HBBerCdlyRd9ZMdX5W judYx9fvy4CyILxIJ3ATtvVIfw== X-Google-Smtp-Source: APXvYqzXs66MLOw7Ug1WtaUrdzJynS7SOfkyQfCnYQ3Tk82lp8vcxCASVc5yQ0uIfTU53qcM/aLF/Q== X-Received: by 2002:a17:902:9f93:: with SMTP id g19mr57526892plq.223.1560209865771; Mon, 10 Jun 2019 16:37:45 -0700 (PDT) Received: from localhost ([2620:15c:202:1:75a:3f6e:21d:9374]) by smtp.gmail.com with ESMTPSA id p27sm7658412pfq.136.2019.06.10.16.37.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 10 Jun 2019 16:37:45 -0700 (PDT) From: Matthias Kaehlcke To: Lee Jones , Daniel Thompson , Jingoo Han , Jacek Anaszewski , Pavel Machek , Rob Herring , Mark Rutland , Thierry Reding , Bartlomiej Zolnierkiewicz , Enric Balletbo i Serra Cc: dri-devel@lists.freedesktop.org, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org, linux-fbdev@vger.kernel.org, Douglas Anderson , Brian Norris , Matthias Kaehlcke Subject: [PATCH 2/2] backlight: pwm_bl: Get number of brightness levels for CIE 1931 from the device tree Date: Mon, 10 Jun 2019 16:37:39 -0700 Message-Id: <20190610233739.29477-2-mka@chromium.org> X-Mailer: git-send-email 2.22.0.rc2.383.gf4fbbf30c2-goog In-Reply-To: <20190610233739.29477-1-mka@chromium.org> References: <20190610233739.29477-1-mka@chromium.org> MIME-Version: 1.0 Sender: linux-fbdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Commit 88ba95bedb79 ("backlight: pwm_bl: Compute brightness of LED linearly to human eye") uses pwm_period / hweight32(pwm_period) as as heuristic to determine the number of brightness levels when the DT doesn't provide a brightness level table. This heuristic is broken and can result in excessively large brightness tables. Instead of using the heuristic try to retrieve the number of brightness levels from the device tree (property 'max-brightness' + 1). If the value is not specified use a default of 256 levels. Fixes: 88ba95bedb79 ("backlight: pwm_bl: Compute brightness of LED linearly to human eye") Signed-off-by: Matthias Kaehlcke Acked-by: Pavel Machek --- drivers/video/backlight/pwm_bl.c | 59 ++++++++++++-------------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c index fb45f866b923..2913cbe9cfcb 100644 --- a/drivers/video/backlight/pwm_bl.c +++ b/drivers/video/backlight/pwm_bl.c @@ -194,38 +194,19 @@ int pwm_backlight_brightness_default(struct device *dev, struct platform_pwm_backlight_data *data, unsigned int period) { - unsigned int counter = 0; - unsigned int i, n; + unsigned int i; + unsigned int nlevels = data->max_brightness + 1; u64 retval; - /* - * Count the number of bits needed to represent the period number. The - * number of bits is used to calculate the number of levels used for the - * brightness-levels table, the purpose of this calculation is have a - * pre-computed table with enough levels to get linear brightness - * perception. The period is divided by the number of bits so for a - * 8-bit PWM we have 255 / 8 = 32 brightness levels or for a 16-bit PWM - * we have 65535 / 16 = 4096 brightness levels. - * - * Note that this method is based on empirical testing on different - * devices with PWM of 8 and 16 bits of resolution. - */ - n = period; - while (n) { - counter += n % 2; - n >>= 1; - } - - data->max_brightness = DIV_ROUND_UP(period, counter); - data->levels = devm_kcalloc(dev, data->max_brightness, + data->levels = devm_kcalloc(dev, nlevels, sizeof(*data->levels), GFP_KERNEL); if (!data->levels) return -ENOMEM; /* Fill the table using the cie1931 algorithm */ - for (i = 0; i < data->max_brightness; i++) { + for (i = 0; i < nlevels; i++) { retval = cie1931((i * PWM_LUMINANCE_SCALE) / - data->max_brightness, PWM_LUMINANCE_SCALE) * + nlevels, PWM_LUMINANCE_SCALE) * period; retval = DIV_ROUND_CLOSEST_ULL(retval, PWM_LUMINANCE_SCALE); if (retval > UINT_MAX) @@ -233,8 +214,7 @@ int pwm_backlight_brightness_default(struct device *dev, data->levels[i] = (unsigned int)retval; } - data->dft_brightness = data->max_brightness / 2; - data->max_brightness--; + data->dft_brightness = nlevels / 2; return 0; } @@ -272,8 +252,13 @@ static int pwm_backlight_parse_dt(struct device *dev, * set a default table of brightness levels will be used. */ prop = of_find_property(node, "brightness-levels", &length); - if (!prop) + if (!prop) { + if (of_property_read_u32(node, "max-brightness", + &data->max_brightness)) + data->max_brightness = 255; + return 0; + } data->max_brightness = length / sizeof(u32); @@ -565,13 +550,10 @@ static int pwm_backlight_probe(struct platform_device *pdev) pb->levels = data->levels; } - } else if (!data->max_brightness) { + } else if (node) { /* - * If no brightness levels are provided and max_brightness is - * not set, use the default brightness table. For the DT case, - * max_brightness is set to 0 when brightness levels is not - * specified. For the non-DT case, max_brightness is usually - * set to some value. + * If no brightness levels are provided use the default + * brightness table. */ /* Get the PWM period (in nanoseconds) */ @@ -591,12 +573,13 @@ static int pwm_backlight_probe(struct platform_device *pdev) pb->levels = data->levels; } - } else { - /* - * That only happens for the non-DT case, where platform data - * sets the max_brightness value. - */ + } else if (data->max_brightness) { + /* non-DT case, max_brightness value set in platform data. */ pb->scale = data->max_brightness; + } else { + dev_err(&pdev->dev, "max brightness is not specified\n"); + ret = -EINVAL; + goto err_alloc; } pb->lth_brightness = data->lth_brightness * (state.period / pb->scale);