Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp5587812pxb; Mon, 28 Mar 2022 14:36:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzPE7GAy37tpJ0hGCZbmzDLCvWIg5hrhJaFiSGshz/qDBO0jkAKKizGqf+ZzdHK3BnFnoIO X-Received: by 2002:a05:6808:ec3:b0:2ef:895e:752a with SMTP id q3-20020a0568080ec300b002ef895e752amr662921oiv.12.1648503417556; Mon, 28 Mar 2022 14:36:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648503417; cv=none; d=google.com; s=arc-20160816; b=Mzz4xLDewcjgJv3YW73DoBcW9IFE5iS0csGVMelOK8gpCnd5R48H8ZEYctCdFolBtY COBQvNWnAaqS6Q8ZNnAz/qzEaXJIV4Lxw3TVJ409Rm8l/SNBXMd1SHS6SaO87FrwDD/g EFa2rP8Klbe0GjkeMZ8Z+hL0ZEbTZ70CEkqc9aJmovHmhcNbr8QWJNkid1m7fzvn7gc8 A8nYiIydByReXmlqhCgXEfdCC6TkrBhP70ffuo/cakLwqJ3rPSDcVs5IbKuQK7aL5Ejg 0fzY/Z5N+izaVD7niEIejuuAeDywMFyyyRTzJK4RECAGL5wxFJgj2YlA8gpim39Pj6dy ABCA== 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=q8P03D/8wmL4dTaKoJ5N+irMkgerJM81/owtScPGR90=; b=02GjKK+xEK0IAXcS21HStEg0dWirZGK/RrPzCIlO3pVlNxf4peWXK0OKVreOYpAhc7 P31smmEkPBR3pZfPCkRyttVgEHkGGr037Nn5sT0mZIVEinzLqOoQV7U7NYs3FExm4zjv Ldn6Et3OfTnbzGywwOpjOZ8P83/AtDQsQjmrZRvuV5CSbctHqYV1Tc+h+Eob28RASwGC 2kQh9X1vid6Qwpw7Hws1EnF85MHKgYUUN0GAhGvFKKjpgILKk8xne1QQxuX77KytLUpG hjYuZlu2jWeJVVKJJyeEq1J2DFQq/khOjvf0/TBZPq+s0kUMgar1sYsu3vP8azmLKFiN 3UJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="oz/gj6NM"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id be24-20020a056808219800b002efa009982bsi15201511oib.53.2022.03.28.14.36.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Mar 2022 14:36:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="oz/gj6NM"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id AF6FE8B6F7; Mon, 28 Mar 2022 14:14:41 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240564AbiC1LUZ (ORCPT + 99 others); Mon, 28 Mar 2022 07:20:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53916 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230475AbiC1LUR (ORCPT ); Mon, 28 Mar 2022 07:20:17 -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 AA6DF5548F; Mon, 28 Mar 2022 04:18:33 -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 822F06114A; Mon, 28 Mar 2022 11:18:33 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 27C4AC340F3; Mon, 28 Mar 2022 11:18:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1648466312; bh=PaGBNH3IO+vHhfj5CQrJJiXJVdx0NKXBLXt6WjCBSr8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oz/gj6NMs9h/r5C77B9vRRNH+hKUBXqDVJBrAZizW8fq1IMxo1qex42AwBgcxs0pD Ny/Z1ngJv1XRWw02/Z+LFVQTLmU2tDMHojbLniUnOSEY6Qj3ZHXwPsmx+K4534N/fW 3aKkXC4WrehmDO1vfGkq5+ToOZ9Tyc10J3lLHKGD2xpKjPk5sFUuoJnIVpKPuewmj5 7/IRwxNajlmB/oambdEkXLcV0ePjoMek3BRHrbcKt/Urc5o0aIMgpoagvDoMulCIDn AbRQwnGuo/NV8ncePf9TAb+fGlCySD82NVyJRW5DSbtHdPczqOk+ahIi2uwpiTYVob O3tL/tIFzJdUw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Dave Stevenson , Detlev Casanova , Mark Brown , Sasha Levin , lgirdwood@gmail.com Subject: [PATCH AUTOSEL 5.17 02/43] regulator: rpi-panel: Handle I2C errors/timing to the Atmel Date: Mon, 28 Mar 2022 07:17:46 -0400 Message-Id: <20220328111828.1554086-2-sashal@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220328111828.1554086-1-sashal@kernel.org> References: <20220328111828.1554086-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable 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