Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp601619pxv; Thu, 22 Jul 2021 07:55:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwGZd7Nc6aj3MZdpvCQgIYKa1gDANZHKz3royCMiek1FsA+2ud6odXzcTxC+Mn/RSUX6g95 X-Received: by 2002:a6b:f41a:: with SMTP id i26mr136187iog.162.1626965752317; Thu, 22 Jul 2021 07:55:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626965752; cv=none; d=google.com; s=arc-20160816; b=Ltr5vIQt1/PEgbYIQ8U39LzDjwL4UiCQoxx4OVzIgVT2d/GVE2cIXzRZKtDS5hIsZW b/aCYeuftViS74nD9bNScp5s/cZmbpd/9/j9pUmoP5aWg60vbOIfmMUAYF4LPJMk+Yxo M5c2YjeUq+eKppMYd2HmOOL04Ekz2eQMwRmYVsqLs1rG92GsJle2ZEDXd87xrkYHK57s sJhuI8rGiCBcjF6DcozxX7c6hUeBqDKPp1ydIO0DWYWKUOdnzbz3iR94N3HiRIfJpDhe sP+R7oA5/CEAXIo1en/5myh3BUCNFkgAJSitdufuQgMG7OUwiCcFfqrlh5HrE7odY5F6 oNgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=NP0Nk6TpvGXmi3EQspzqhmeGXtJTWbb2t8lR/ui8TD4=; b=Qse9sDhAhagnv20vjKh7/jQSs+mAwv1LPS/W+p70oKOBlaUfJxCfHfnKvkVfXlfcJX egGdl55eTbwXOe2JAKbRSoU0j9icyyC4zqtoLBBitPlfyClNzawHH7z7mw0WA9UGIEE/ jhjcYyvMPGX0H5MU3XzI8u+EeQPvp45x+axcUTK26kFw/b98eISAL1MdCLN40GxIzy5r n0QQfGUVdQ8xLc+E4IuwfepH2yilIW42qO8rcCp1+PCS8IvRuLzjg4EOaJe5ZqQwNSRD D9m/aqucXGYnNw2yOE/7qW/5iiIE+PqucxrVSGBK1l9tAq5BNlIXxA/lfWzvpNaxFX6c gu5g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=izUC5Qvf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f6si26507628jav.23.2021.07.22.07.55.39; Thu, 22 Jul 2021 07:55:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=izUC5Qvf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232568AbhGVONl (ORCPT + 99 others); Thu, 22 Jul 2021 10:13:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51574 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232566AbhGVONH (ORCPT ); Thu, 22 Jul 2021 10:13:07 -0400 Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A85CDC0613D5 for ; Thu, 22 Jul 2021 07:52:40 -0700 (PDT) Received: by mail-wm1-x331.google.com with SMTP id f190so3493234wmf.4 for ; Thu, 22 Jul 2021 07:52:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=NP0Nk6TpvGXmi3EQspzqhmeGXtJTWbb2t8lR/ui8TD4=; b=izUC5Qvf/tubSNdCEliUDdjaUor/iX8CATtMD/ErOTgRdDxMAKIFt3zG53ZHHOZogA xpLQ++qh4wvdPwv+BS2h+ZSz2nvLI+dJLauYxNCgRHa7dzFSLC7Du1yuHucHCt5Gnb4V ddRFrp71Lnb7AUlyWZ7QxMsJhrQTgPQGQO7NTG1h7M79yfis3wwcP2Hy0SraUA9F83lP M1Qv6MG5/oCL863uBERgRSzRsBaUPn2sqYNF7gw6CWT7f3uSr/sUOBtNU0H7REb5PqQT wtEbXtVjfTjbPDyvDi5uYllGTU1HAYEryx1rrTECSAXWMj0+0BWTbgPD6JvmCWqBEh7A UXJQ== 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=NP0Nk6TpvGXmi3EQspzqhmeGXtJTWbb2t8lR/ui8TD4=; b=XHcYi972/qXfjiA2Y16UxaTq9X6HERcG2LMLw9zDGmk3fzSVWUL/Jb4/KiDRnGOt3j hLt31Bp4grUdK5EQWR6tCX0m8ZCp1+QwwVb8jD7nuTQnnDN1aFm6rGCJ0yzz/NL9trET xI6mtbUbwNuvdruno6oAIB6m/3peR7JmGnqc1mB5ptOHJlLaZ1nLX2Tehmy2kdDWjJ9O 6CFcNqpQ0scJ91iipx2a1tNOsdVIMRYMgtL3ZoBkkqfr2VEAwvdZrjLExJYZyAoaZvv2 Unc4o2UVfNNLyd75imy+e4LDp3mnmdT5dqZZMr213R40LNKPrSNOCVANWPrBpZ/bU6II /Vbw== X-Gm-Message-State: AOAM531u32eWtAcH71GNwb3zzrhW4LFG/uKfYYaB1l8t5S/BS2FXD+xx N+IC9pf1adMEWl9SAgbnxDcvPg== X-Received: by 2002:a05:600c:1c86:: with SMTP id k6mr43890478wms.147.1626965559165; Thu, 22 Jul 2021 07:52:39 -0700 (PDT) Received: from maple.lan (cpc141216-aztw34-2-0-cust174.18-1.cable.virginm.net. [80.7.220.175]) by smtp.gmail.com with ESMTPSA id t6sm30527687wru.75.2021.07.22.07.52.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jul 2021 07:52:38 -0700 (PDT) From: Daniel Thompson To: Lee Jones , Jingoo Han Cc: Daniel Thompson , Thierry Reding , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-pwm@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org, Marek Vasut , stable@vger.kernel.org Subject: [PATCH v2] backlight: pwm_bl: Improve bootloader/kernel device handover Date: Thu, 22 Jul 2021 15:52:27 +0100 Message-Id: <20210722145227.1573115-1-daniel.thompson@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210722144623.1572816-1-daniel.thompson@linaro.org> References: <20210722144623.1572816-1-daniel.thompson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently there are (at least) two problems in the way pwm_bl starts managing the enable_gpio pin. Both occur when the backlight is initially off and the driver finds the pin not already in output mode and, as a result, unconditionally switches it to output-mode and asserts the signal. Problem 1: This could cause the backlight to flicker since, at this stage in driver initialisation, we have no idea what the PWM and regulator are doing (an unconfigured PWM could easily "rest" at 100% duty cycle). Problem 2: This will cause us not to correctly honour the post_pwm_on_delay (which also risks flickers). Fix this by moving the code to configure the GPIO output mode until after we have examines the handover state. That allows us to initialize enable_gpio to off if the backlight is currently off and on if the backlight is on. Reported-by: Marek Vasut Signed-off-by: Daniel Thompson Cc: stable@vger.kernel.org Fixes: 3698d7e7d221 ("backlight: pwm_bl: Avoid backlight flicker when probed from DT") Acked-by: Marek Vasut Tested-by: Marek Vasut --- Notes: v2: Added Fixes: tag (sorry for the noise) drivers/video/backlight/pwm_bl.c | 54 +++++++++++++++++--------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c index e48fded3e414..8d8959a70e44 100644 --- a/drivers/video/backlight/pwm_bl.c +++ b/drivers/video/backlight/pwm_bl.c @@ -409,6 +409,33 @@ static bool pwm_backlight_is_linear(struct platform_pwm_backlight_data *data) static int pwm_backlight_initial_power_state(const struct pwm_bl_data *pb) { struct device_node *node = pb->dev->of_node; + bool active = true; + + /* + * If the enable GPIO is present, observable (either as input + * or output) and off then the backlight is not currently active. + * */ + if (pb->enable_gpio && gpiod_get_value_cansleep(pb->enable_gpio) == 0) + active = false; + + if (!regulator_is_enabled(pb->power_supply)) + active = false; + + if (!pwm_is_enabled(pb->pwm)) + active = false; + + /* + * Synchronize the enable_gpio with the observed state of the + * hardware. + */ + if (pb->enable_gpio) + gpiod_direction_output(pb->enable_gpio, active); + + /* + * Do not change pb->enabled here! pb->enabled essentially + * tells us if we own one of the regulator's use counts and + * right now we do not. + */ /* Not booted with device tree or no phandle link to the node */ if (!node || !node->phandle) @@ -420,20 +447,7 @@ static int pwm_backlight_initial_power_state(const struct pwm_bl_data *pb) * assume that another driver will enable the backlight at the * appropriate time. Therefore, if it is disabled, keep it so. */ - - /* if the enable GPIO is disabled, do not enable the backlight */ - if (pb->enable_gpio && gpiod_get_value_cansleep(pb->enable_gpio) == 0) - return FB_BLANK_POWERDOWN; - - /* The regulator is disabled, do not enable the backlight */ - if (!regulator_is_enabled(pb->power_supply)) - return FB_BLANK_POWERDOWN; - - /* The PWM is disabled, keep it like this */ - if (!pwm_is_enabled(pb->pwm)) - return FB_BLANK_POWERDOWN; - - return FB_BLANK_UNBLANK; + return active ? FB_BLANK_UNBLANK: FB_BLANK_POWERDOWN; } static int pwm_backlight_probe(struct platform_device *pdev) @@ -486,18 +500,6 @@ static int pwm_backlight_probe(struct platform_device *pdev) goto err_alloc; } - /* - * If the GPIO is not known to be already configured as output, that - * is, if gpiod_get_direction returns either 1 or -EINVAL, change the - * direction to output and set the GPIO as active. - * Do not force the GPIO to active when it was already output as it - * could cause backlight flickering or we would enable the backlight too - * early. Leave the decision of the initial backlight state for later. - */ - if (pb->enable_gpio && - gpiod_get_direction(pb->enable_gpio) != 0) - gpiod_direction_output(pb->enable_gpio, 1); - pb->power_supply = devm_regulator_get(&pdev->dev, "power"); if (IS_ERR(pb->power_supply)) { ret = PTR_ERR(pb->power_supply); base-commit: 2734d6c1b1a089fb593ef6a23d4b70903526fe0c -- 2.30.2