From nobody Tue Jun 30 09:15:58 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 BCC41C433EF for ; Thu, 20 Jan 2022 15:22:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376557AbiATPWa (ORCPT ); Thu, 20 Jan 2022 10:22:30 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:35438 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376454AbiATPW3 (ORCPT ); Thu, 20 Jan 2022 10:22:29 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 2F0091F4533C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642692148; bh=80BI0zXGQTgN05p6AlFLM+LNKFXJZZRY/BLdFYtbkxU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UpBA1veDJR3S5J4pN/mWlU/nnCjmtqM/foKJhUEGedmrunYe3kf7znvovLxWhaza2 pJU95qJVx4kGn1pXs21yGTwZQSOf5izwCrxb2ctm20TWoQw69CAv7pvUASr3eH6kEc 5GXu7vLGC5jG4W4OL+F3ILHjDeUP9BLbwIEdUoQjYW9ufmyFZ2mLUCPRn3rB6SHeyg eyGS+PrOSgTM/Qfo6g+xc7CLsrcg0BxVMUXPBLGivZKE4uYmaBjoNEkMyhayFjNbW1 J3gV4hiUQ3w29j3OjSwIpKKckhttH6ZdSKhMrz5QQ04MWKTFrY3N1R5IqgvmlL/Jbv tmJRBLrmGWsXg== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH 1/9] regulator: rpi-panel: Register with a unique backlight name Date: Thu, 20 Jan 2022 10:21:42 -0500 Message-Id: <20220120152150.1952568-2-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220120152150.1952568-1-detlev.casanova@collabora.com> References: <20220120152150.1952568-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 09:15:58 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 BEF23C433F5 for ; Thu, 20 Jan 2022 15:22:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376575AbiATPWd (ORCPT ); Thu, 20 Jan 2022 10:22:33 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:35446 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376554AbiATPWc (ORCPT ); Thu, 20 Jan 2022 10:22:32 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 225941F4533C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642692151; bh=TbuvCyeFhQOeUscmwg0p9HgBI6FntNsxNfpdvpXAuvU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=C2EzBa01Q1gCfOBaUZCcTN/TMmX8vHhXMf3dBf+0c6BL4mkW9mmCSPspRIWAuoOCK 694uSqXVK46bLNY7dknF0OhL/dyzyFaRNmEGeLqu8o52PslSycgmKuYLShIYJ7bwU7 uUVfbHg/kQFfF+OS5UeM8gqFZbMOMpWvUimbTitYVig+KJZ4yxbrEde+2L4F9kArNS ucrseVKRhMdTfXT2ORNd/nkMXMUGGPBIbYEBdtnamUfqbeHd90AHS8UixjJA2nGlS1 uyw/ZCbzonVMEHcZ2OUCdA4ZxjnZEEpHD5gZIlMg9Fvr2MaOCdkemahf0c5/a1XXX3 5aH/zg723sPDw== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH 2/9] regulator: rpi-panel: Handle I2C errors/timing to the Atmel Date: Thu, 20 Jan 2022 10:21:43 -0500 Message-Id: <20220120152150.1952568-3-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220120152150.1952568-1-detlev.casanova@collabora.com> References: <20220120152150.1952568-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 09:15:58 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 CC5B5C433EF for ; Thu, 20 Jan 2022 15:22:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376607AbiATPWn (ORCPT ); Thu, 20 Jan 2022 10:22:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44596 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376574AbiATPWf (ORCPT ); Thu, 20 Jan 2022 10:22:35 -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 96B05C061574 for ; Thu, 20 Jan 2022 07:22:34 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id F18A61F45342 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642692153; bh=bCIz9lIKmGxNsVU4TA/XNq7Ir5i7GiXO8VWDQOzf+eY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gGw6L5wxjvuVIVh/2+jD8cmP3JrWb1Q/aLZ1YAJSAr8PlZOuwBXSftRrvnCCVG1V4 1CvZ6OaWZNLAN9RLUFJsvVISvkurrVMeNADxF/iLwT7riCIyNzrgw9tERRULmZhOmP hn2r/RfcxrRDyy6ym+M2gP8cJmFnD79nY/0a+xgiNpujLzFwp3CZnX5Um33YAIE9Da +w0crlfuxnjDbc70oWsHexjD7MRuI0pg+kIKF3/iLJahAVZLvEgwHHkUyEfbwLMhgs wvT0kRTto6u/GJSSa9qem8T/o1oiQT0a76coFm+fLz0JP0PGThoYI2WOeZzB6kOnPr OVgrgdAyK1e9A== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH 3/9] regulator: rpi-panel: Serialise operations. Date: Thu, 20 Jan 2022 10:21:44 -0500 Message-Id: <20220120152150.1952568-4-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220120152150.1952568-1-detlev.casanova@collabora.com> References: <20220120152150.1952568-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 09:15:58 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 D21B3C433F5 for ; Thu, 20 Jan 2022 15:22:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376626AbiATPWm (ORCPT ); Thu, 20 Jan 2022 10:22:42 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:35468 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376568AbiATPWf (ORCPT ); Thu, 20 Jan 2022 10:22:35 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 474F81F4533C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642692154; bh=r2NUuVpLB3Cn7OcgzQz7XHk2TvhI+FZhqWFg7FO+3BE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TLly7VUzvC4Qg/0krVuij9DtYEETbpDfY2IziS6baQ8u71D17P/BXPaONx9H3qZEM KeKbMX3hsuBh1kYxzFcbAtxqG/iVWepJG9PT4KPmuZrI7s8TYZfSZhxVhe9qPTrd53 rtrMQkG6Hhh7QM9O2sBy/GeC3V71Af0bTcyFMs0tgbVa1PqXVLVnuQymNIFBF3vA3j lZvrc4x4wIbYE6xeZmidJwpYFXWGShXgyAwRPe25uSwmR/u0G+1p+b5kCwUYdUeWBq hc+lmIw9EIF5kbJUxQFbrj3mA86/ohdo/mROqzsoM6CXyfJaLUBPHlB7zNE6V3wpiU tt6NHHI6ogqrw== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH 4/9] regulator: rpi-panel: Ensure the backlight is off during probe. Date: Thu, 20 Jan 2022 10:21:45 -0500 Message-Id: <20220120152150.1952568-5-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220120152150.1952568-1-detlev.casanova@collabora.com> References: <20220120152150.1952568-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 09:15:58 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 1DD48C433EF for ; Thu, 20 Jan 2022 15:22:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376657AbiATPWu (ORCPT ); Thu, 20 Jan 2022 10:22:50 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:35470 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376600AbiATPWi (ORCPT ); Thu, 20 Jan 2022 10:22:38 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 131621F45342 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642692156; bh=rEq0CHRx5+CNyoOg7KVI3Tyiy+Wpy3US/1T49aS9EK4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=D4DqP+9RRgAoZYZJFiFxOA+IuTRDP5kJl6lBVrdJNIMjz9yEWPCTlTB2yP6X2aF1L dev+H7nH7e5imM/DWKcSIvi5NobQOU/tY5J2FIkmavSxFA7yQJXK3Opno81PjSrbQZ PHP48iVziKPFDptrNrQzypz8GN9moEDYNcej9shY3FSc+UFmHiBfN/wv9HAMuqhzvi UVyiT4pb9Z7NlYNY7opTjn3WKyJThFgAigr5wywlGU7AtLqhY0U7WucLN5KkM6N2mT HxjaWdnCw92PYo4WwlzXkuiwfR0FzopIAAx9iREDi7Iiu+JA1XMT19oZ8aixhCRmF7 4tlW0N9KIHikg== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH 5/9] regulator: rpi-panel: Convert to drive lines directly Date: Thu, 20 Jan 2022 10:21:46 -0500 Message-Id: <20220120152150.1952568-6-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220120152150.1952568-1-detlev.casanova@collabora.com> References: <20220120152150.1952568-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 09:15:58 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 B8E62C433EF for ; Thu, 20 Jan 2022 15:23:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376712AbiATPXP (ORCPT ); Thu, 20 Jan 2022 10:23:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44624 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376592AbiATPWl (ORCPT ); Thu, 20 Jan 2022 10:22:41 -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 D8B05C061747 for ; Thu, 20 Jan 2022 07:22:38 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 3FA1E1F45344 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642692157; bh=fRteeuvXlCY4UzbbyjV0hj4DKSOldSNjMQV/0bDII5o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V5kDWp/7oNwWNlRD1Cn1ML3r1KzrUL1S19bqaFfgpebkc4GGO3XCm07G0OtnfO6nc DwwUUgq7KyuLGd6Xce5IRfs6d5qJ7PQRFZIME9bJ7h1ioBU5mkKuuc4HOYfggI9l+t /QjdF0Fh1NDVR0sH6+MEvvJS99gBzmlUGTvpZwPUKIhkHEnBW/fueBJVupf9DmSE0K 7LKkdPimd2mONf2CevWKUHVk6fNgQakksCfaxVi38FmSdMkC53Vh1dSK53Eze7/4qZ ZVC5iq9ZdJFK9CAcK8HyTUvmQAxhQL2wLGUVokpqCR4qMatjH/p2FhT+onQ2gdbkIA yrT32ltURpBwg== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH 6/9] regulator: rpi-panel: Add GPIO control for panel and touch resets Date: Thu, 20 Jan 2022 10:21:47 -0500 Message-Id: <20220120152150.1952568-7-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220120152150.1952568-1-detlev.casanova@collabora.com> References: <20220120152150.1952568-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 --- .../regulator/rpi-panel-attiny-regulator.c | 115 +++++++++++++++--- 1 file changed, 97 insertions(+), 18 deletions(-) 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 09:15:58 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 897CAC433EF for ; Thu, 20 Jan 2022 15:23:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346185AbiATPW5 (ORCPT ); Thu, 20 Jan 2022 10:22:57 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:35492 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376617AbiATPWj (ORCPT ); Thu, 20 Jan 2022 10:22:39 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 756C81F45345 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642692159; bh=toJZplNzOWnhWEhBs7DUXgaZJA8ric2HVhNCIQ2EX3A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ErOZIZkGc0EWd6WWHuaidybGNKG6sbnjaGPSHW67m5eI5/kCGGkhVm7RSgoVWBAUT MmQMuAy4PRL9Gsc9mw6rtOrEzn6mQBdaI2pFpMidSD3PBroHLKxHjmsuF9Aa/90A/o A2NvWcQYuM4HdehjU+TWEGK1vX1Z/OVYbH2MfrQ+4R3fH0FuUnLM8Qr80w1COeiNfW ZXd8VZj0FHFc4QLrA9GIvHtSFIgbCWFuFwCFaZ39grzl3whN1uPiuzYOMAn4VZ5f5s UNGU2acAlRSQZX0BSGe1Xk6R79CDV/gTSEp1bzdp7lbTUFT0kGUiHphivfqIKmsNVW h9tVeuCyID94w== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH 7/9] regulator: rpi-panel: Remove get_brightness hook Date: Thu, 20 Jan 2022 10:21:48 -0500 Message-Id: <20220120152150.1952568-8-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220120152150.1952568-1-detlev.casanova@collabora.com> References: <20220120152150.1952568-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 09:15:58 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 545AEC433EF for ; Thu, 20 Jan 2022 15:23:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346434AbiATPXJ (ORCPT ); Thu, 20 Jan 2022 10:23:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44626 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376589AbiATPWl (ORCPT ); Thu, 20 Jan 2022 10:22:41 -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 2E831C061574 for ; Thu, 20 Jan 2022 07:22:41 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 8A83F1F45346 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642692160; bh=idCRqSfxdKKzhaecaARxomPwbXX0Gq6x7F6Y/PBqvN0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SsIM9kB+e0zc+lGZ/eKc9qU7DgSH3XAtbt9Ok2jYTIwZ539i6jxCvrjUJsS4OD8up tI5LmTwBxKFZMcPgwaD5iTJIHk1atcQXjD5UTv/W/qNDHx+9Tw7/HzM4LMeyJvRyeO g5Xi06joYh6I4kZG+eTxbsnA8OzDypzLrKr5UaO06ZthBhxN1IabmfRP9CKgEUJUgM iKfxA2vfNXG5hx0TFEvQCcfsebuF9l+s0Bur1aJsR61Oy7Zb/g7vda6VqIhk6heItG fM99nKY5lqLJsU6yM+1/eyXPPO8DdHC0Ori1FKQuKKNVphYB6hanXSIa3UWwJrF6Pd ZDq10gnR6w+UQ== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH 8/9] regulator/rpi-panel-attiny: Don't read the LCD power status Date: Thu, 20 Jan 2022 10:21:49 -0500 Message-Id: <20220120152150.1952568-9-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220120152150.1952568-1-detlev.casanova@collabora.com> References: <20220120152150.1952568-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 09:15:58 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 26BEAC433F5 for ; Thu, 20 Jan 2022 15:23:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376745AbiATPXa (ORCPT ); Thu, 20 Jan 2022 10:23:30 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:35502 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376622AbiATPWm (ORCPT ); Thu, 20 Jan 2022 10:22:42 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id A6A8E1F45344 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1642692161; bh=2mB2P4wQOPq9kSLMyvSy9LaY6Q067M0W9yvzSk3DLlM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZMCIyAPkzsbattDVeeURkKSN9tQXId/AoEpzX+AIRWjWMHmrorWgkZRTMqlZHN22A hBxjvD6hOgdKh/CzmAYZaZQcxxt+I9UeiIiVrNp7SzKwS47OkfmojwNqeqWjIi6Yvg bwVCZgNJd5Tw+/bdzaKVldUj693RvMcl9PszlRaWXr0D359OaO9mjDVZZfA6X2y23G omWnbOq4FaQB1yhWhvJ3T+aMMuN5HaOyQzOfh/eqHjcULKX5rjg+dWHPBodLrhyraM /hO0O8X/1RY/tvLR0JHIPm9dBJ8jGFJHKmtjwANuBxrgM82a3CRtpsXDWTV5xxbu0U yDc2ijHAM9gzA== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown Subject: [PATCH 9/9] regulator/rpi-panel-attiny: Use two transactions for I2C read Date: Thu, 20 Jan 2022 10:21:50 -0500 Message-Id: <20220120152150.1952568-10-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220120152150.1952568-1-detlev.casanova@collabora.com> References: <20220120152150.1952568-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