Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp927921pxb; Wed, 6 Apr 2022 04:32:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyp4FFxv/rNHqDXm0BUBU9sTNNu9xsNNUUi/BFdtEXXSIA+EMsfSNqke/ICPKk3bq8h27mP X-Received: by 2002:a17:902:7205:b0:156:1a0a:2c39 with SMTP id ba5-20020a170902720500b001561a0a2c39mr8121537plb.88.1649244757224; Wed, 06 Apr 2022 04:32:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649244757; cv=none; d=google.com; s=arc-20160816; b=fJHgEN2LbjJxcWhSbnnakw8nzqL31TEr7o7F++I+Jstx8jBYGsVpI268fyxwD3o3nu GWqfEH5uFynQYwIDptVgYVGVwLuXh71wLgTNyN7/l1UnlPuABWgHOjfa10kU8gGbm8E6 L58xc9cQ5GdTb3ghmVDq0ehuyuhrrci6Aj1sAiviRLXvRDNa9innEwtavXNjbPvCsI0H 4gVh5ZR58TGNuHnT231ZoM68FH1KBPK/sJQLXa39w7bO8NyjjLCsyQbbmVnixg4ZH8B5 dvXSkIJwNEkDqB9MT0tA1miO59MQxDPuP1JY2HUv6tUW/wwWtV7bpqJucSST1P7O3TfM 9YOA== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=q8P03D/8wmL4dTaKoJ5N+irMkgerJM81/owtScPGR90=; b=qVleWIYJ7Chte2PFBZCfhFdGLgBbuhFDGIVsyLoXEUz2DPapSBJJ5D72kZ6QTkdUcN WoUFk6Lm/tsOrklWUZ8yHa4AMY+JyW4ZSmho88SHdI/dLv2oDuCpgZajx8GiW8kk/0dS JcPBrxVIouKxeQelXqmFogdyoOyIPX1Zc3ZdseFXicka8zKUl59SLbzM5YzdlOv6IW8A 7VIdlRTaCNe6wogNdyBffsmk6MHcBW1OGSShI/YXX7Ti3SZYFGlI3U2btzwJFzeIHvK2 NK2heOrITo4jnMTHIowKU7+LzscyJq8KHZ5TN/0Ea1tyKeiS6BwuFDHEgE0Rb7wQq3j9 cHfQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=KmcR9mIS; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id k13-20020a6568cd000000b0039856908cc6si2473656pgt.220.2022.04.06.04.32.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Apr 2022 04:32:37 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=KmcR9mIS; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 2DED060D709; Wed, 6 Apr 2022 02:55:00 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236384AbiDEVeU (ORCPT + 99 others); Tue, 5 Apr 2022 17:34:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33784 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243759AbiDEKhl (ORCPT ); Tue, 5 Apr 2022 06:37:41 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A40C55BD2; Tue, 5 Apr 2022 03:23:05 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id E32A461676; Tue, 5 Apr 2022 10:23:04 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id F18B4C385A0; Tue, 5 Apr 2022 10:23:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1649154184; bh=PaGBNH3IO+vHhfj5CQrJJiXJVdx0NKXBLXt6WjCBSr8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KmcR9mISZEUP5/Rr6f5/Ped9KCET5PtQNUPUMwqIwQrnjR7IkNOPIMvPvH7IHCMaI ppbbMOezC7DwwIX7wu6W+QSEy5t7h225Y80VNl46YoBEC2fwHJ1/hqqwkoWE/eTvNS 2wqv8tDJV/fvFfmMOrGaViqHJxhV96aP/7SjfMpY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Dave Stevenson , Detlev Casanova , Mark Brown , Sasha Levin Subject: [PATCH 5.10 450/599] regulator: rpi-panel: Handle I2C errors/timing to the Atmel Date: Tue, 5 Apr 2022 09:32:24 +0200 Message-Id: <20220405070312.221260685@linuxfoundation.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220405070258.802373272@linuxfoundation.org> References: <20220405070258.802373272@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dave Stevenson [ Upstream commit 5665eee7a3800430e7dc3ef6f25722476b603186 ] The Atmel is doing some things in the I2C ISR, during which period it will not respond to further commands. This is particularly true of the POWERON command. Increase delays appropriately, and retry should I2C errors be reported. Signed-off-by: Dave Stevenson Signed-off-by: Detlev Casanova Link: https://lore.kernel.org/r/20220124220129.158891-3-detlev.casanova@collabora.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- .../regulator/rpi-panel-attiny-regulator.c | 56 +++++++++++++++---- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regulator/rpi-panel-attiny-regulator.c index ee46bfbf5eee..991b4730d768 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -37,11 +37,24 @@ static const struct regmap_config attiny_regmap_config = { static int attiny_lcd_power_enable(struct regulator_dev *rdev) { unsigned int data; + int ret, i; regmap_write(rdev->regmap, REG_POWERON, 1); + msleep(80); + /* Wait for nPWRDWN to go low to indicate poweron is done. */ - regmap_read_poll_timeout(rdev->regmap, REG_PORTB, data, - data & BIT(0), 10, 1000000); + for (i = 0; i < 20; i++) { + ret = regmap_read(rdev->regmap, REG_PORTB, &data); + if (!ret) { + if (data & BIT(0)) + break; + } + usleep_range(10000, 12000); + } + usleep_range(10000, 12000); + + if (ret) + pr_err("%s: regmap_read_poll_timeout failed %d\n", __func__, ret); /* Default to the same orientation as the closed source * firmware used for the panel. Runtime rotation @@ -57,23 +70,34 @@ static int attiny_lcd_power_disable(struct regulator_dev *rdev) { regmap_write(rdev->regmap, REG_PWM, 0); regmap_write(rdev->regmap, REG_POWERON, 0); - udelay(1); + msleep(30); return 0; } static int attiny_lcd_power_is_enabled(struct regulator_dev *rdev) { unsigned int data; - int ret; + int ret, i; - ret = regmap_read(rdev->regmap, REG_POWERON, &data); + for (i = 0; i < 10; i++) { + ret = regmap_read(rdev->regmap, REG_POWERON, &data); + if (!ret) + break; + usleep_range(10000, 12000); + } if (ret < 0) return ret; if (!(data & BIT(0))) return 0; - ret = regmap_read(rdev->regmap, REG_PORTB, &data); + for (i = 0; i < 10; i++) { + ret = regmap_read(rdev->regmap, REG_PORTB, &data); + if (!ret) + break; + usleep_range(10000, 12000); + } + if (ret < 0) return ret; @@ -103,20 +127,32 @@ static int attiny_update_status(struct backlight_device *bl) { struct regmap *regmap = bl_get_data(bl); int brightness = bl->props.brightness; + int ret, i; if (bl->props.power != FB_BLANK_UNBLANK || bl->props.fb_blank != FB_BLANK_UNBLANK) brightness = 0; - return regmap_write(regmap, REG_PWM, brightness); + for (i = 0; i < 10; i++) { + ret = regmap_write(regmap, REG_PWM, brightness); + if (!ret) + break; + } + + return ret; } static int attiny_get_brightness(struct backlight_device *bl) { struct regmap *regmap = bl_get_data(bl); - int ret, brightness; + int ret, brightness, i; + + for (i = 0; i < 10; i++) { + ret = regmap_read(regmap, REG_PWM, &brightness); + if (!ret) + break; + } - ret = regmap_read(regmap, REG_PWM, &brightness); if (ret) return ret; @@ -166,7 +202,7 @@ static int attiny_i2c_probe(struct i2c_client *i2c, } regmap_write(regmap, REG_POWERON, 0); - mdelay(1); + msleep(30); config.dev = &i2c->dev; config.regmap = regmap; -- 2.34.1