From nobody Tue Jun 30 08:10:07 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A1170C4332F for ; Fri, 21 Jan 2022 15:21:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1351305AbiAUPVk (ORCPT ); Fri, 21 Jan 2022 10:21:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56424 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381534AbiAUPV3 (ORCPT ); Fri, 21 Jan 2022 10:21:29 -0500 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D7A43C061401 for ; Fri, 21 Jan 2022 07:21:28 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 3B6371F4620F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642778487; bh=80BI0zXGQTgN05p6AlFLM+LNKFXJZZRY/BLdFYtbkxU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hdCia6B48T1WyJRbqV8VBwL8L2R4Mj6Sw4lTyCXLVSo94MEaVq9cYJvp4oeh9pqra 1zekUD/QHR8DuhwX2Zg2l61JWosNxZt0mRn1E3geN5WYG8seWBlIVemUy4FaawJ+k+ nZdFTEJSgHILOWJDPNnrgSiscwifKIVCTZYSttAJ2Owk1PtttB8ss7FXbKoS1MIVtA YOM8JVI6xmKd/MJLm1dCsXV40UvfKUDbgPqrF1emPZZe7TebDxpJDifjWw2rjLO1B+ bikzjN31KuCgwBSCrgCmT+k/dCERzwt4S5D4XeouWFd95VhoD96g2R1JIVTsD57RK9 l2joZQtTCl12A== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH v2 1/9] regulator: rpi-panel: Register with a unique backlight name Date: Fri, 21 Jan 2022 10:20:48 -0500 Message-Id: <20220121152056.2044551-2-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220121152056.2044551-1-detlev.casanova@collabora.com> References: <20220121152056.2044551-1-detlev.casanova@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Dave Stevenson There's no reason why 2 Raspberry Pi DSI displays can't be attached to a Pi Compute Module, so the backlight names need to be unique. Use the parent dev_name. It's not as readable, but is unique. Signed-off-by: Dave Stevenson --- drivers/regulator/rpi-panel-attiny-regulator.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regul= ator/rpi-panel-attiny-regulator.c index ee46bfbf5eee..370b9ae363dd 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -181,8 +181,7 @@ static int attiny_i2c_probe(struct i2c_client *i2c, =20 props.type =3D BACKLIGHT_RAW; props.max_brightness =3D 0xff; - bl =3D devm_backlight_device_register(&i2c->dev, - "7inch-touchscreen-panel-bl", + bl =3D devm_backlight_device_register(&i2c->dev, dev_name(&i2c->dev), &i2c->dev, regmap, &attiny_bl, &props); if (IS_ERR(bl)) --=20 2.34.1 From nobody Tue Jun 30 08:10:07 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8B598C433F5 for ; Fri, 21 Jan 2022 15:21:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1381532AbiAUPVm (ORCPT ); Fri, 21 Jan 2022 10:21:42 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:47804 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381535AbiAUPV3 (ORCPT ); Fri, 21 Jan 2022 10:21:29 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 063E21F46210 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642778488; bh=TbuvCyeFhQOeUscmwg0p9HgBI6FntNsxNfpdvpXAuvU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Bgriqk+JmX5EK0FhTqFDacVC/CWtrqugH/idVD53731OVDRNTrTAFnsB5oZ7qs7AP QjoPiXZrUehxuMA4BtJ1Hy5huNp2RGli03uu9ZEKzYCKBL9mpMrJCDh+nBtruM2yda ih/b06Bjc8doYCi/9QOFtpxeb3tzrSCtgFr2QavBv+xvIIzrnsa5jU4F9Ot7TxgjYW KLhi5zjeI7zLKk0E2fxIozUiQkCiLBx0MKlzaq2O2LNm98olOarjE4BEq5GasmEZ9z CrXp8tS8C7Rd2ogRdcJoFO7q27Xz/QAUGaZ8DFACw5cKa+BjY9FeUTFlUdqaLEacjt 0jWogHk+CJvUg== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH v2 2/9] regulator: rpi-panel: Handle I2C errors/timing to the Atmel Date: Fri, 21 Jan 2022 10:20:49 -0500 Message-Id: <20220121152056.2044551-3-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220121152056.2044551-1-detlev.casanova@collabora.com> References: <20220121152056.2044551-1-detlev.casanova@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Dave Stevenson 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 --- .../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/regul= ator/rpi-panel-attiny-regulator.c index 370b9ae363dd..00fb69efcfa2 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 = =3D { static int attiny_lcd_power_enable(struct regulator_dev *rdev) { unsigned int data; + int ret, i; =20 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 =3D 0; i < 20; i++) { + ret =3D 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); =20 /* 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_de= v *rdev) { regmap_write(rdev->regmap, REG_PWM, 0); regmap_write(rdev->regmap, REG_POWERON, 0); - udelay(1); + msleep(30); return 0; } =20 static int attiny_lcd_power_is_enabled(struct regulator_dev *rdev) { unsigned int data; - int ret; + int ret, i; =20 - ret =3D regmap_read(rdev->regmap, REG_POWERON, &data); + for (i =3D 0; i < 10; i++) { + ret =3D regmap_read(rdev->regmap, REG_POWERON, &data); + if (!ret) + break; + usleep_range(10000, 12000); + } if (ret < 0) return ret; =20 if (!(data & BIT(0))) return 0; =20 - ret =3D regmap_read(rdev->regmap, REG_PORTB, &data); + for (i =3D 0; i < 10; i++) { + ret =3D regmap_read(rdev->regmap, REG_PORTB, &data); + if (!ret) + break; + usleep_range(10000, 12000); + } + if (ret < 0) return ret; =20 @@ -103,20 +127,32 @@ static int attiny_update_status(struct backlight_devi= ce *bl) { struct regmap *regmap =3D bl_get_data(bl); int brightness =3D bl->props.brightness; + int ret, i; =20 if (bl->props.power !=3D FB_BLANK_UNBLANK || bl->props.fb_blank !=3D FB_BLANK_UNBLANK) brightness =3D 0; =20 - return regmap_write(regmap, REG_PWM, brightness); + for (i =3D 0; i < 10; i++) { + ret =3D regmap_write(regmap, REG_PWM, brightness); + if (!ret) + break; + } + + return ret; } =20 static int attiny_get_brightness(struct backlight_device *bl) { struct regmap *regmap =3D bl_get_data(bl); - int ret, brightness; + int ret, brightness, i; + + for (i =3D 0; i < 10; i++) { + ret =3D regmap_read(regmap, REG_PWM, &brightness); + if (!ret) + break; + } =20 - ret =3D regmap_read(regmap, REG_PWM, &brightness); if (ret) return ret; =20 @@ -166,7 +202,7 @@ static int attiny_i2c_probe(struct i2c_client *i2c, } =20 regmap_write(regmap, REG_POWERON, 0); - mdelay(1); + msleep(30); =20 config.dev =3D &i2c->dev; config.regmap =3D regmap; --=20 2.34.1 From nobody Tue Jun 30 08:10:07 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3D8B9C433F5 for ; Fri, 21 Jan 2022 15:21:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1381561AbiAUPVo (ORCPT ); Fri, 21 Jan 2022 10:21:44 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:47812 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381527AbiAUPVa (ORCPT ); Fri, 21 Jan 2022 10:21:30 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id C46071F46211 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642778489; bh=bCIz9lIKmGxNsVU4TA/XNq7Ir5i7GiXO8VWDQOzf+eY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ii0FG1zha6Ib46oLatCM1En00pYGm/MeAOANcofcs24rTfer5l0gg8s3RexjIB87y Qja5plVupBYOBvcDdDyI6l3IykwYz/rI8d0Ssp0UHu5Bm1Qb93B/C+GIKKmDCrJUJN kGizNNRGuXyMweqFpJmealBRTAs+KMKy6Z2Ku4NFFTfzPPUWeI9Yg2/yLeJJ3kM4mv RRjyTAW5xagp2q/uQxBqyPJ6uzqo6drel/KeWeUvJ4ZfjoOgVfsHncqTeUHe/AClv0 5fso60gAGIpC054EauWh/tbVA15l5Vnn14dptscv7oddx43wJ3GEAhE3w8/R3XjeFu XkqmpcLrAMHpg== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH v2 3/9] regulator: rpi-panel: Serialise operations. Date: Fri, 21 Jan 2022 10:20:50 -0500 Message-Id: <20220121152056.2044551-4-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220121152056.2044551-1-detlev.casanova@collabora.com> References: <20220121152056.2044551-1-detlev.casanova@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Dave Stevenson The driver was using the regmap lock to serialise the individual accesses, but we really need to protect the timings of enabling the regulators, including any communication with the Atmel. Use a mutex within the driver to control overall accesses to the Atmel, instead of the regmap lock. Signed-off-by: Dave Stevenson --- .../regulator/rpi-panel-attiny-regulator.c | 91 ++++++++++++++++--- 1 file changed, 80 insertions(+), 11 deletions(-) diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regul= ator/rpi-panel-attiny-regulator.c index 00fb69efcfa2..a4af7adad2b5 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -27,18 +27,28 @@ #define REG_POWERON 0x85 #define REG_PWM 0x86 =20 +struct attiny_lcd { + /* lock to serialise overall accesses to the Atmel */ + struct mutex lock; + struct regmap *regmap; +}; + static const struct regmap_config attiny_regmap_config =3D { .reg_bits =3D 8, .val_bits =3D 8, + .disable_locking =3D 1, .max_register =3D REG_PWM, .cache_type =3D REGCACHE_NONE, }; =20 static int attiny_lcd_power_enable(struct regulator_dev *rdev) { + struct mutex *lock =3D rdev_get_drvdata(rdev); unsigned int data; int ret, i; =20 + mutex_lock(lock); + regmap_write(rdev->regmap, REG_POWERON, 1); msleep(80); =20 @@ -63,33 +73,49 @@ static int attiny_lcd_power_enable(struct regulator_dev= *rdev) */ regmap_write(rdev->regmap, REG_PORTA, BIT(2)); =20 + mutex_unlock(lock); + return 0; } =20 static int attiny_lcd_power_disable(struct regulator_dev *rdev) { + struct mutex *lock =3D rdev_get_drvdata(rdev); + + mutex_lock(lock); + regmap_write(rdev->regmap, REG_PWM, 0); regmap_write(rdev->regmap, REG_POWERON, 0); msleep(30); + + mutex_unlock(lock); + return 0; } =20 static int attiny_lcd_power_is_enabled(struct regulator_dev *rdev) { + struct mutex *lock =3D rdev_get_drvdata(rdev); unsigned int data; int ret, i; =20 + mutex_lock(lock); + for (i =3D 0; i < 10; i++) { ret =3D regmap_read(rdev->regmap, REG_POWERON, &data); if (!ret) break; usleep_range(10000, 12000); } - if (ret < 0) + if (ret < 0) { + mutex_unlock(lock); return ret; + } =20 - if (!(data & BIT(0))) + if (!(data & BIT(0))) { + mutex_unlock(lock); return 0; + } =20 for (i =3D 0; i < 10; i++) { ret =3D regmap_read(rdev->regmap, REG_PORTB, &data); @@ -98,6 +124,8 @@ static int attiny_lcd_power_is_enabled(struct regulator_= dev *rdev) usleep_range(10000, 12000); } =20 + mutex_unlock(lock); + if (ret < 0) return ret; =20 @@ -125,10 +153,13 @@ static const struct regulator_desc attiny_regulator = =3D { =20 static int attiny_update_status(struct backlight_device *bl) { - struct regmap *regmap =3D bl_get_data(bl); + struct attiny_lcd *state =3D bl_get_data(bl); + struct regmap *regmap =3D state->regmap; int brightness =3D bl->props.brightness; int ret, i; =20 + mutex_lock(&state->lock); + if (bl->props.power !=3D FB_BLANK_UNBLANK || bl->props.fb_blank !=3D FB_BLANK_UNBLANK) brightness =3D 0; @@ -139,20 +170,27 @@ static int attiny_update_status(struct backlight_devi= ce *bl) break; } =20 + mutex_unlock(&state->lock); + return ret; } =20 static int attiny_get_brightness(struct backlight_device *bl) { - struct regmap *regmap =3D bl_get_data(bl); + struct attiny_lcd *state =3D bl_get_data(bl); + struct regmap *regmap =3D state->regmap; int ret, brightness, i; =20 + mutex_lock(&state->lock); + for (i =3D 0; i < 10; i++) { ret =3D regmap_read(regmap, REG_PWM, &brightness); if (!ret) break; } =20 + mutex_unlock(&state->lock); + if (ret) return ret; =20 @@ -174,22 +212,30 @@ static int attiny_i2c_probe(struct i2c_client *i2c, struct regulator_config config =3D { }; struct backlight_device *bl; struct regulator_dev *rdev; + struct attiny_lcd *state; struct regmap *regmap; unsigned int data; int ret; =20 + state =3D devm_kzalloc(&i2c->dev, sizeof(*state), GFP_KERNEL); + if (!state) + return -ENOMEM; + + mutex_init(&state->lock); + i2c_set_clientdata(i2c, state); + regmap =3D devm_regmap_init_i2c(i2c, &attiny_regmap_config); if (IS_ERR(regmap)) { ret =3D PTR_ERR(regmap); dev_err(&i2c->dev, "Failed to allocate register map: %d\n", ret); - return ret; + goto error; } =20 ret =3D regmap_read(regmap, REG_ID, &data); if (ret < 0) { dev_err(&i2c->dev, "Failed to read REG_ID reg: %d\n", ret); - return ret; + goto error; } =20 switch (data) { @@ -198,7 +244,8 @@ static int attiny_i2c_probe(struct i2c_client *i2c, break; default: dev_err(&i2c->dev, "Unknown Atmel firmware revision: 0x%02x\n", data); - return -ENODEV; + ret =3D -ENODEV; + goto error; } =20 regmap_write(regmap, REG_POWERON, 0); @@ -208,23 +255,44 @@ static int attiny_i2c_probe(struct i2c_client *i2c, config.regmap =3D regmap; config.of_node =3D i2c->dev.of_node; config.init_data =3D &attiny_regulator_default; + config.driver_data =3D &state->lock; =20 rdev =3D devm_regulator_register(&i2c->dev, &attiny_regulator, &config); if (IS_ERR(rdev)) { dev_err(&i2c->dev, "Failed to register ATTINY regulator\n"); - return PTR_ERR(rdev); + ret =3D PTR_ERR(rdev); + goto error; } =20 props.type =3D BACKLIGHT_RAW; props.max_brightness =3D 0xff; + + state->regmap =3D regmap; + bl =3D devm_backlight_device_register(&i2c->dev, dev_name(&i2c->dev), - &i2c->dev, regmap, &attiny_bl, + &i2c->dev, state, &attiny_bl, &props); - if (IS_ERR(bl)) - return PTR_ERR(bl); + if (IS_ERR(bl)) { + ret =3D PTR_ERR(bl); + goto error; + } =20 bl->props.brightness =3D 0xff; =20 + return 0; + +error: + mutex_destroy(&state->lock); + + return ret; +} + +static int attiny_i2c_remove(struct i2c_client *client) +{ + struct attiny_lcd *state =3D i2c_get_clientdata(client); + + mutex_destroy(&state->lock); + return 0; } =20 @@ -240,6 +308,7 @@ static struct i2c_driver attiny_regulator_driver =3D { .of_match_table =3D of_match_ptr(attiny_dt_ids), }, .probe =3D attiny_i2c_probe, + .remove =3D attiny_i2c_remove, }; =20 module_i2c_driver(attiny_regulator_driver); --=20 2.34.1 From nobody Tue Jun 30 08:10:07 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4D334C433EF for ; Fri, 21 Jan 2022 15:21:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1381576AbiAUPVr (ORCPT ); Fri, 21 Jan 2022 10:21:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56432 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381536AbiAUPVb (ORCPT ); Fri, 21 Jan 2022 10:21:31 -0500 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 38A8BC061744 for ; Fri, 21 Jan 2022 07:21:31 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 8F1B61F46214 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642778490; bh=r2NUuVpLB3Cn7OcgzQz7XHk2TvhI+FZhqWFg7FO+3BE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EzNQpGdnZS5R/oj54hGdYMdDgIy6KogxpbzxvxykxzNTQTvClZuOE5FTwJe0+BMcG ZG5YR59CGUI6JgJvfx1pEgdo5iSyva3jH+CWEGPoxIz38+xosa0X4cN9MxMJP/4VkX eJ8pYuiD1TSDM4vhYhK6dhd724flyIzpzAMYu6+GmeLFfxfdCyhEXcpLHMrQYvPgRS dHMbmDhrzKw843StpRG52M/BKdwFAB+2JfaI9U5BkEfLPMcH/wd0536BbSSJo1N4ro hZ6yzoCAuIEcsZ9Xf+lHYzl+oElk06p+8jV4m663/gRXt5p6qV38PKAzxptVewnmGM aGvJokb0giCHw== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH v2 4/9] regulator: rpi-panel: Ensure the backlight is off during probe. Date: Fri, 21 Jan 2022 10:20:51 -0500 Message-Id: <20220121152056.2044551-5-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220121152056.2044551-1-detlev.casanova@collabora.com> References: <20220121152056.2044551-1-detlev.casanova@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Dave Stevenson The initial state of the Atmel is not defined, so ensure the backlight PWM is set to 0 by default. Signed-off-by: Dave Stevenson --- drivers/regulator/rpi-panel-attiny-regulator.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regul= ator/rpi-panel-attiny-regulator.c index a4af7adad2b5..b3629a1e0e50 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -250,6 +250,7 @@ static int attiny_i2c_probe(struct i2c_client *i2c, =20 regmap_write(regmap, REG_POWERON, 0); msleep(30); + regmap_write(regmap, REG_PWM, 0); =20 config.dev =3D &i2c->dev; config.regmap =3D regmap; --=20 2.34.1 From nobody Tue Jun 30 08:10:07 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 89190C433EF for ; Fri, 21 Jan 2022 15:21:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1351273AbiAUPVs (ORCPT ); Fri, 21 Jan 2022 10:21:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56436 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381537AbiAUPVc (ORCPT ); Fri, 21 Jan 2022 10:21:32 -0500 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 02848C06173B for ; Fri, 21 Jan 2022 07:21:32 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 58F371F4620F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642778490; bh=rEq0CHRx5+CNyoOg7KVI3Tyiy+Wpy3US/1T49aS9EK4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Kl6VqFW2rFEZEKlRk5+OJ67nsrNMqYO3c0yWkpj/+0ce+haaM1IJ0i4s1hT6iqmoG cJkf4jjSyBJmTLd/cpR3NXEVmjSBipHgzfPTcAkp5fdrjNSbt55ygBP7qolmLkXyLx RBJUNAump/WwOK3F0JJdtIAfvwUWeQe2hag7OMh/583VPT3lpuzUyn8shQ6/3xfXWc t1JCru3CqwO/i/mQOi+p/B8tI6vEa6vWIZmm4e5GXxY4Rfcglyp4L+3+fYKEwE8ABB VFvlZ33S+meKkhNp9cK6QcQ9AQo0me3ogUA+hzI8AWmho+grr/tFJkjpV9yCbieJV1 GfEQMePILxdfg== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH v2 5/9] regulator: rpi-panel: Convert to drive lines directly Date: Fri, 21 Jan 2022 10:20:52 -0500 Message-Id: <20220121152056.2044551-6-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220121152056.2044551-1-detlev.casanova@collabora.com> References: <20220121152056.2044551-1-detlev.casanova@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Dave Stevenson The Atmel was doing a load of automatic sequencing of control lines, however it was combining the touch controller's reset with the bridge/panel control. Change to control the control signals directly rather than through the automatic POWERON control. Signed-off-by: Dave Stevenson --- .../regulator/rpi-panel-attiny-regulator.c | 111 ++++++++++-------- 1 file changed, 60 insertions(+), 51 deletions(-) diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regul= ator/rpi-panel-attiny-regulator.c index b3629a1e0e50..995915ca4a9b 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -21,11 +21,28 @@ /* I2C registers of the Atmel microcontroller. */ #define REG_ID 0x80 #define REG_PORTA 0x81 -#define REG_PORTA_HF BIT(2) -#define REG_PORTA_VF BIT(3) #define REG_PORTB 0x82 +#define REG_PORTC 0x83 #define REG_POWERON 0x85 #define REG_PWM 0x86 +#define REG_ADDR_L 0x8c +#define REG_ADDR_H 0x8d +#define REG_WRITE_DATA_H 0x90 +#define REG_WRITE_DATA_L 0x91 + +#define PA_LCD_DITHB BIT(0) +#define PA_LCD_MODE BIT(1) +#define PA_LCD_LR BIT(2) +#define PA_LCD_UD BIT(3) + +#define PB_BRIDGE_PWRDNX_N BIT(0) +#define PB_LCD_VCC_N BIT(1) +#define PB_LCD_MAIN BIT(7) + +#define PC_LED_EN BIT(0) +#define PC_RST_TP_N BIT(1) +#define PC_RST_LCD_N BIT(2) +#define PC_RST_BRIDGE_N BIT(3) =20 struct attiny_lcd { /* lock to serialise overall accesses to the Atmel */ @@ -37,99 +54,91 @@ static const struct regmap_config attiny_regmap_config = =3D { .reg_bits =3D 8, .val_bits =3D 8, .disable_locking =3D 1, - .max_register =3D REG_PWM, + .max_register =3D REG_WRITE_DATA_L, .cache_type =3D REGCACHE_NONE, }; =20 static int attiny_lcd_power_enable(struct regulator_dev *rdev) { - struct mutex *lock =3D rdev_get_drvdata(rdev); - unsigned int data; - int ret, i; - - mutex_lock(lock); - - regmap_write(rdev->regmap, REG_POWERON, 1); - msleep(80); + struct attiny_lcd *state =3D rdev_get_drvdata(rdev); =20 - /* Wait for nPWRDWN to go low to indicate poweron is done. */ - for (i =3D 0; i < 20; i++) { - ret =3D regmap_read(rdev->regmap, REG_PORTB, &data); - if (!ret) { - if (data & BIT(0)) - break; - } - usleep_range(10000, 12000); - } - usleep_range(10000, 12000); + mutex_lock(&state->lock); =20 - if (ret) - pr_err("%s: regmap_read_poll_timeout failed %d\n", __func__, ret); + /* Ensure bridge, and tp stay in reset */ + regmap_write(rdev->regmap, REG_PORTC, 0); + usleep_range(5000, 10000); =20 /* Default to the same orientation as the closed source * firmware used for the panel. Runtime rotation * configuration will be supported using VC4's plane * orientation bits. */ - regmap_write(rdev->regmap, REG_PORTA, BIT(2)); + regmap_write(rdev->regmap, REG_PORTA, PA_LCD_LR); + usleep_range(5000, 10000); + regmap_write(rdev->regmap, REG_PORTB, PB_LCD_MAIN); + usleep_range(5000, 10000); + /* Bring controllers out of reset */ + regmap_write(rdev->regmap, REG_PORTC, + PC_LED_EN | PC_RST_BRIDGE_N | PC_RST_LCD_N | PC_RST_TP_N); + + msleep(80); + + regmap_write(rdev->regmap, REG_ADDR_H, 0x04); + usleep_range(5000, 8000); + regmap_write(rdev->regmap, REG_ADDR_L, 0x7c); + usleep_range(5000, 8000); + regmap_write(rdev->regmap, REG_WRITE_DATA_H, 0x00); + usleep_range(5000, 8000); + regmap_write(rdev->regmap, REG_WRITE_DATA_L, 0x00); + + msleep(100); =20 - mutex_unlock(lock); + mutex_unlock(&state->lock); =20 return 0; } =20 static int attiny_lcd_power_disable(struct regulator_dev *rdev) { - struct mutex *lock =3D rdev_get_drvdata(rdev); + struct attiny_lcd *state =3D rdev_get_drvdata(rdev); =20 - mutex_lock(lock); + mutex_lock(&state->lock); =20 regmap_write(rdev->regmap, REG_PWM, 0); - regmap_write(rdev->regmap, REG_POWERON, 0); + usleep_range(5000, 10000); + regmap_write(rdev->regmap, REG_PORTA, 0); + usleep_range(5000, 10000); + regmap_write(rdev->regmap, REG_PORTB, PB_LCD_VCC_N); + usleep_range(5000, 10000); + regmap_write(rdev->regmap, REG_PORTC, 0); msleep(30); =20 - mutex_unlock(lock); + mutex_unlock(&state->lock); =20 return 0; } =20 static int attiny_lcd_power_is_enabled(struct regulator_dev *rdev) { - struct mutex *lock =3D rdev_get_drvdata(rdev); + struct attiny_lcd *state =3D rdev_get_drvdata(rdev); unsigned int data; int ret, i; =20 - mutex_lock(lock); - - for (i =3D 0; i < 10; i++) { - ret =3D regmap_read(rdev->regmap, REG_POWERON, &data); - if (!ret) - break; - usleep_range(10000, 12000); - } - if (ret < 0) { - mutex_unlock(lock); - return ret; - } - - if (!(data & BIT(0))) { - mutex_unlock(lock); - return 0; - } + mutex_lock(&state->lock); =20 for (i =3D 0; i < 10; i++) { - ret =3D regmap_read(rdev->regmap, REG_PORTB, &data); + ret =3D regmap_read(rdev->regmap, REG_PORTC, &data); if (!ret) break; usleep_range(10000, 12000); } =20 - mutex_unlock(lock); + mutex_unlock(&state->lock); =20 if (ret < 0) return ret; =20 - return data & BIT(0); + return data & PC_RST_BRIDGE_N; } =20 static const struct regulator_init_data attiny_regulator_default =3D { @@ -256,7 +265,7 @@ static int attiny_i2c_probe(struct i2c_client *i2c, config.regmap =3D regmap; config.of_node =3D i2c->dev.of_node; config.init_data =3D &attiny_regulator_default; - config.driver_data =3D &state->lock; + config.driver_data =3D state; =20 rdev =3D devm_regulator_register(&i2c->dev, &attiny_regulator, &config); if (IS_ERR(rdev)) { --=20 2.34.1 From nobody Tue Jun 30 08:10:07 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5542CC433F5 for ; Fri, 21 Jan 2022 15:21:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1381631AbiAUPVy (ORCPT ); Fri, 21 Jan 2022 10:21:54 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:47836 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381518AbiAUPVc (ORCPT ); Fri, 21 Jan 2022 10:21:32 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 226BB1F46216 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642778491; bh=iK4Vk+E5mvUAnxE6Jr5IGm+xLJMyJoTeSBj/0jLq41o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PM5heMwdvHxU+M+U8X05uX9NvjqWouUKC6yjGRBFaNvIkPfJSr0ksshXPm9CV25wS k6GRxzYBGZzXpciVTajsiwApbBcLex7JI6yLzMpWl4WMn1iEVgAsKYeBmvJy4+4VQM goY/TC8RAJy4+D45e9G1u23040F3zTBDf6BDa5ah+2T/1LMAfK2XzdawFddz2QiVI+ i9eMmf93ZW6B35fhEmr2TcBLHquNq/Imx9nbF4Lc7Wyv+LNNEhcgHjILpWAy17Tqy3 Ts2wZMtnSUEfnmO8nH8FVO1BbJilJm8pTm9VEzSPXPwhtlBqyML/aSYSsO8vzm9q0O 4V14R5UMeQLmA== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown , Detlev Casanova Subject: [PATCH v2 6/9] regulator: rpi-panel: Add GPIO control for panel and touch resets Date: Fri, 21 Jan 2022 10:20:53 -0500 Message-Id: <20220121152056.2044551-7-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220121152056.2044551-1-detlev.casanova@collabora.com> References: <20220121152056.2044551-1-detlev.casanova@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Dave Stevenson We need independent control of the resets for the panel&bridge, vs the touch controller. Expose the reset lines that are on the Atmel's port C via the GPIO API so that they can be controlled appropriately. Signed-off-by: Dave Stevenson Signed-off-by: Detlev Casanova --- drivers/regulator/Kconfig | 1 + .../regulator/rpi-panel-attiny-regulator.c | 115 +++++++++++++++--- 2 files changed, 98 insertions(+), 18 deletions(-) diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index 1c35fed20d34..22503e4f5327 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -984,6 +984,7 @@ config REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY tristate "Raspberry Pi 7-inch touchscreen panel ATTINY regulator" depends on BACKLIGHT_CLASS_DEVICE depends on I2C + depends on OF_GPIO select REGMAP_I2C help This driver supports ATTINY regulator on the Raspberry Pi 7-inch diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regul= ator/rpi-panel-attiny-regulator.c index 995915ca4a9b..998233f14085 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -44,10 +45,30 @@ #define PC_RST_LCD_N BIT(2) #define PC_RST_BRIDGE_N BIT(3) =20 +enum gpio_signals { + RST_BRIDGE_N, /* TC358762 bridge reset */ + RST_TP_N, /* Touch controller reset */ + NUM_GPIO +}; + +struct gpio_signal_mappings { + unsigned int reg; + unsigned int mask; +}; + +static const struct gpio_signal_mappings mappings[NUM_GPIO] =3D { + [RST_BRIDGE_N] =3D { REG_PORTC, PC_RST_BRIDGE_N | PC_RST_LCD_N }, + [RST_TP_N] =3D { REG_PORTC, PC_RST_TP_N }, +}; + struct attiny_lcd { /* lock to serialise overall accesses to the Atmel */ struct mutex lock; struct regmap *regmap; + bool gpio_states[NUM_GPIO]; + u8 port_states[3]; + + struct gpio_chip gc; }; =20 static const struct regmap_config attiny_regmap_config =3D { @@ -58,6 +79,17 @@ static const struct regmap_config attiny_regmap_config = =3D { .cache_type =3D REGCACHE_NONE, }; =20 +static int attiny_set_port_state(struct attiny_lcd *state, int reg, u8 val) +{ + state->port_states[reg - REG_PORTA] =3D val; + return regmap_write(state->regmap, reg, val); +}; + +static u8 attiny_get_port_state(struct attiny_lcd *state, int reg) +{ + return state->port_states[reg - REG_PORTA]; +}; + static int attiny_lcd_power_enable(struct regulator_dev *rdev) { struct attiny_lcd *state =3D rdev_get_drvdata(rdev); @@ -65,7 +97,7 @@ static int attiny_lcd_power_enable(struct regulator_dev *= rdev) mutex_lock(&state->lock); =20 /* Ensure bridge, and tp stay in reset */ - regmap_write(rdev->regmap, REG_PORTC, 0); + attiny_set_port_state(state, REG_PORTC, 0); usleep_range(5000, 10000); =20 /* Default to the same orientation as the closed source @@ -73,26 +105,16 @@ static int attiny_lcd_power_enable(struct regulator_de= v *rdev) * configuration will be supported using VC4's plane * orientation bits. */ - regmap_write(rdev->regmap, REG_PORTA, PA_LCD_LR); + attiny_set_port_state(state, REG_PORTA, PA_LCD_LR); usleep_range(5000, 10000); - regmap_write(rdev->regmap, REG_PORTB, PB_LCD_MAIN); + /* Main regulator on, and power to the panel (LCD_VCC_N) */ + attiny_set_port_state(state, REG_PORTB, PB_LCD_MAIN); usleep_range(5000, 10000); /* Bring controllers out of reset */ - regmap_write(rdev->regmap, REG_PORTC, - PC_LED_EN | PC_RST_BRIDGE_N | PC_RST_LCD_N | PC_RST_TP_N); + attiny_set_port_state(state, REG_PORTC, PC_LED_EN); =20 msleep(80); =20 - regmap_write(rdev->regmap, REG_ADDR_H, 0x04); - usleep_range(5000, 8000); - regmap_write(rdev->regmap, REG_ADDR_L, 0x7c); - usleep_range(5000, 8000); - regmap_write(rdev->regmap, REG_WRITE_DATA_H, 0x00); - usleep_range(5000, 8000); - regmap_write(rdev->regmap, REG_WRITE_DATA_L, 0x00); - - msleep(100); - mutex_unlock(&state->lock); =20 return 0; @@ -106,11 +128,12 @@ static int attiny_lcd_power_disable(struct regulator_= dev *rdev) =20 regmap_write(rdev->regmap, REG_PWM, 0); usleep_range(5000, 10000); - regmap_write(rdev->regmap, REG_PORTA, 0); + + attiny_set_port_state(state, REG_PORTA, 0); usleep_range(5000, 10000); - regmap_write(rdev->regmap, REG_PORTB, PB_LCD_VCC_N); + attiny_set_port_state(state, REG_PORTB, PB_LCD_VCC_N); usleep_range(5000, 10000); - regmap_write(rdev->regmap, REG_PORTC, 0); + attiny_set_port_state(state, REG_PORTC, 0); msleep(30); =20 mutex_unlock(&state->lock); @@ -211,6 +234,45 @@ static const struct backlight_ops attiny_bl =3D { .get_brightness =3D attiny_get_brightness, }; =20 +static int attiny_gpio_get_direction(struct gpio_chip *gc, unsigned int of= f) +{ + return GPIO_LINE_DIRECTION_OUT; +} + +static void attiny_gpio_set(struct gpio_chip *gc, unsigned int off, int va= l) +{ + struct attiny_lcd *state =3D gpiochip_get_data(gc); + u8 last_val; + + if (off >=3D NUM_GPIO) + return; + + mutex_lock(&state->lock); + + last_val =3D attiny_get_port_state(state, mappings[off].reg); + if (val) + last_val |=3D mappings[off].mask; + else + last_val &=3D ~mappings[off].mask; + + attiny_set_port_state(state, mappings[off].reg, last_val); + + if (off =3D=3D RST_BRIDGE_N && val) { + usleep_range(5000, 8000); + regmap_write(state->regmap, REG_ADDR_H, 0x04); + usleep_range(5000, 8000); + regmap_write(state->regmap, REG_ADDR_L, 0x7c); + usleep_range(5000, 8000); + regmap_write(state->regmap, REG_WRITE_DATA_H, 0x00); + usleep_range(5000, 8000); + regmap_write(state->regmap, REG_WRITE_DATA_L, 0x00); + + msleep(100); + } + + mutex_unlock(&state->lock); +} + /* * I2C driver interface functions */ @@ -289,6 +351,23 @@ static int attiny_i2c_probe(struct i2c_client *i2c, =20 bl->props.brightness =3D 0xff; =20 + state->gc.parent =3D &i2c->dev; + state->gc.label =3D i2c->name; + state->gc.owner =3D THIS_MODULE; + state->gc.of_node =3D i2c->dev.of_node; + state->gc.base =3D -1; + state->gc.ngpio =3D NUM_GPIO; + + state->gc.set =3D attiny_gpio_set; + state->gc.get_direction =3D attiny_gpio_get_direction; + state->gc.can_sleep =3D true; + + ret =3D devm_gpiochip_add_data(&i2c->dev, &state->gc, state); + if (ret) { + dev_err(&i2c->dev, "Failed to create gpiochip: %d\n", ret); + goto error; + } + return 0; =20 error: --=20 2.34.1 From nobody Tue Jun 30 08:10:07 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 77522C4332F for ; Fri, 21 Jan 2022 15:21:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1381615AbiAUPVv (ORCPT ); Fri, 21 Jan 2022 10:21:51 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:47838 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381529AbiAUPVd (ORCPT ); Fri, 21 Jan 2022 10:21:33 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 01A921F46217 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642778492; bh=toJZplNzOWnhWEhBs7DUXgaZJA8ric2HVhNCIQ2EX3A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XqgHGYbIUpwONda9BtSBVlb7CfKHzeaWUE/kEYPfCXaGkokHTJFC9x4V1bSYCZlum g+oNqn1rZThILFP8Jm90EwKOynZPZMdSZevmfBLScjOaw/TJg/O6h7HcFySwSPNpbs hNfEFvmaoX+jS97166PT+LEoLZQkAu2kJqf8kFi0A2WT0xbi2BRrqyp7DP9RvMOkR7 qk4o2r95jFf0P5sffZGSVlL8TVCh8d0E70UFwokAT1MwXcez3KjzrVSM2KhooAQdJu RR9oCKq+ozabRHmjLhhtPYArpjGiGHz/dwRLs7zcxbIuLNKfs/nt06dSze99BGGEyL yz5PYx4t/v+pQ== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH v2 7/9] regulator: rpi-panel: Remove get_brightness hook Date: Fri, 21 Jan 2022 10:20:54 -0500 Message-Id: <20220121152056.2044551-8-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220121152056.2044551-1-detlev.casanova@collabora.com> References: <20220121152056.2044551-1-detlev.casanova@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Dave Stevenson The driver was implementing a get_brightness function that tried to read back the PWM setting of the display to report as the current brightness. The controller on the display does not support that, therefore we end up reporting a brightness of 0, and that confuses systemd's backlight service. Remove the hook so that the framework returns the current brightness automatically. Signed-off-by: Dave Stevenson --- .../regulator/rpi-panel-attiny-regulator.c | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regul= ator/rpi-panel-attiny-regulator.c index 998233f14085..8090b9a485b5 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -207,31 +207,8 @@ static int attiny_update_status(struct backlight_devic= e *bl) return ret; } =20 -static int attiny_get_brightness(struct backlight_device *bl) -{ - struct attiny_lcd *state =3D bl_get_data(bl); - struct regmap *regmap =3D state->regmap; - int ret, brightness, i; - - mutex_lock(&state->lock); - - for (i =3D 0; i < 10; i++) { - ret =3D regmap_read(regmap, REG_PWM, &brightness); - if (!ret) - break; - } - - mutex_unlock(&state->lock); - - if (ret) - return ret; - - return brightness; -} - static const struct backlight_ops attiny_bl =3D { .update_status =3D attiny_update_status, - .get_brightness =3D attiny_get_brightness, }; =20 static int attiny_gpio_get_direction(struct gpio_chip *gc, unsigned int of= f) --=20 2.34.1 From nobody Tue Jun 30 08:10:07 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 57D39C433EF for ; Fri, 21 Jan 2022 15:22:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1381554AbiAUPV7 (ORCPT ); Fri, 21 Jan 2022 10:21:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56444 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381538AbiAUPVe (ORCPT ); Fri, 21 Jan 2022 10:21:34 -0500 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 69EB8C061747 for ; Fri, 21 Jan 2022 07:21:34 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id C21511F46214 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642778493; bh=idCRqSfxdKKzhaecaARxomPwbXX0Gq6x7F6Y/PBqvN0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OOO3giZ/gCqIS3Hjro+FfPBGrgmSdZIXGzE/77X1tp+kGba/aj7TGZBtUrMe1Plfl Ibz9GyZ0XPU8YKrTw/p51aXyNplsovxXm4raTrLs8exAIcd9g/rb8QzMYCZaG9eadr w53+sMNNgKUoIm5KCYQmh5xHuPw9WcNjJN2TDL5CIUWo1wYbveAC1KoZIXgJgn/CHq 1jqUMxS5ypdT0PaZATfSL4htEKWOjyoadC3QssrKhsboyhSYBaVS+U2abvcXR3kXdX 5PvNSzaIJ7P0aaYqWyvGthaNh0Hc7ZdP5IMOua+TeaTkxl/K6/ly78bXYi+09x/bd6 hEdV7tkJrQoHw== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH v2 8/9] regulator/rpi-panel-attiny: Don't read the LCD power status Date: Fri, 21 Jan 2022 10:20:55 -0500 Message-Id: <20220121152056.2044551-9-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220121152056.2044551-1-detlev.casanova@collabora.com> References: <20220121152056.2044551-1-detlev.casanova@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Dave Stevenson The I2C to the Atmel is very fussy, and locks up easily on Pi0-3 particularly on reads. The LCD power status is controlled solely by this driver, so rather than reading it back from the Atmel, use the cached status last set. Signed-off-by: Dave Stevenson --- drivers/regulator/rpi-panel-attiny-regulator.c | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regul= ator/rpi-panel-attiny-regulator.c index 8090b9a485b5..8b80c0de1022 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -144,24 +144,8 @@ static int attiny_lcd_power_disable(struct regulator_d= ev *rdev) static int attiny_lcd_power_is_enabled(struct regulator_dev *rdev) { struct attiny_lcd *state =3D rdev_get_drvdata(rdev); - unsigned int data; - int ret, i; - - mutex_lock(&state->lock); - - for (i =3D 0; i < 10; i++) { - ret =3D regmap_read(rdev->regmap, REG_PORTC, &data); - if (!ret) - break; - usleep_range(10000, 12000); - } - - mutex_unlock(&state->lock); - - if (ret < 0) - return ret; =20 - return data & PC_RST_BRIDGE_N; + return state->port_states[REG_PORTC - REG_PORTA] & PC_RST_BRIDGE_N; } =20 static const struct regulator_init_data attiny_regulator_default =3D { --=20 2.34.1 From nobody Tue Jun 30 08:10:07 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 51809C433F5 for ; Fri, 21 Jan 2022 15:21:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1381608AbiAUPV5 (ORCPT ); Fri, 21 Jan 2022 10:21:57 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:47860 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381510AbiAUPVf (ORCPT ); Fri, 21 Jan 2022 10:21:35 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 8BEBD1F4620F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642778494; bh=2mB2P4wQOPq9kSLMyvSy9LaY6Q067M0W9yvzSk3DLlM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kmbb5e3qEsxmWG6cBbBUEN8rAxqpUBtJbUtt8ef1TJ2wriBuLgayzlVYjC8s2qQFs C4IzTdk93dIe4cZJ/48G+doZd1RklQ0Sp/aPkDasJXBM4Nm/tJmwJCR7DDb2tIex3z OBWi4hm2FIYIOoNtZ/o1GBFptDoZBYi4SXySuxqMApGOcdl4n9P6u7Ac6VvEdgyCjn WlLaz7bL9eQ3jbTFYqQRekTkd0DzNzDG9zix7jrfVrxhzNtLI0jKtNz1LmPoWMzHHl k89lS9ySGlUkMiSVFCRbaBhDS5SPGOSF27W5UFxb/DLDI66moh1Ij/dDYFcCMcU0Uj 5mdVO341/5Nlg== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH v2 9/9] regulator/rpi-panel-attiny: Use two transactions for I2C read Date: Fri, 21 Jan 2022 10:20:56 -0500 Message-Id: <20220121152056.2044551-10-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220121152056.2044551-1-detlev.casanova@collabora.com> References: <20220121152056.2044551-1-detlev.casanova@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Dave Stevenson The I2C to the Atmel is very fussy, and locks up easily on Pi0-3 particularly on reads. If running at 100kHz on Pi3, reading the ID register generally locks up the Atmel, but splitting the register select write and read into two transactions is reliable. Signed-off-by: Dave Stevenson --- .../regulator/rpi-panel-attiny-regulator.c | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regul= ator/rpi-panel-attiny-regulator.c index 8b80c0de1022..e3decc419814 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -234,6 +234,39 @@ static void attiny_gpio_set(struct gpio_chip *gc, unsi= gned int off, int val) mutex_unlock(&state->lock); } =20 +static int attiny_i2c_read(struct i2c_client *client, u8 reg, unsigned int= *buf) +{ + struct i2c_msg msgs[1]; + u8 addr_buf[1] =3D { reg }; + u8 data_buf[1] =3D { 0, }; + int ret; + + /* Write register address */ + msgs[0].addr =3D client->addr; + msgs[0].flags =3D 0; + msgs[0].len =3D ARRAY_SIZE(addr_buf); + msgs[0].buf =3D addr_buf; + + ret =3D i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); + if (ret !=3D ARRAY_SIZE(msgs)) + return -EIO; + + usleep_range(5000, 10000); + + /* Read data from register */ + msgs[0].addr =3D client->addr; + msgs[0].flags =3D I2C_M_RD; + msgs[0].len =3D 1; + msgs[0].buf =3D data_buf; + + ret =3D i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); + if (ret !=3D ARRAY_SIZE(msgs)) + return -EIO; + + *buf =3D data_buf[0]; + return 0; +} + /* * I2C driver interface functions */ @@ -264,7 +297,7 @@ static int attiny_i2c_probe(struct i2c_client *i2c, goto error; } =20 - ret =3D regmap_read(regmap, REG_ID, &data); + ret =3D attiny_i2c_read(i2c, REG_ID, &data); if (ret < 0) { dev_err(&i2c->dev, "Failed to read REG_ID reg: %d\n", ret); goto error; --=20 2.34.1