From nobody Tue Jun 30 05:29:30 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 1953EC433FE for ; Tue, 25 Jan 2022 03:03:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1315556AbiAYCxs (ORCPT ); Mon, 24 Jan 2022 21:53:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36194 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2374225AbiAYAQc (ORCPT ); Mon, 24 Jan 2022 19:16: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 8F6CBC038AF0 for ; Mon, 24 Jan 2022 14:01:41 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 146A11F438ED DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1643061699; bh=GeHZOsyvGGJJ4aGx3Jf1/eW+jsfWROA8xn3TnY8RKX0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DdwqpN7nWmbIhZNt7LG8gdB3dXWkqNEve/hW6ievQwGCSFHaHJGemTR9BV68DA4Nk OQ9P+Xsv1wLqKt+bcL/PL+B3NX5paiQVv84W0/JRMQYhGFt/CTZmgxr9NEzjMNfDq7 uh4II7JZRHw0fNv+7aACJPeV8wSyIwFd6wtDdS6Ibr5XBnRUc1KOTqU3NKx6CN1YmB umJaea3GGGKbCyt+EOW3w+H+lG+Tso+3p/gqySmi7ID6DU0pdTJCrzemrhGfewstUa 0WpIoEVONDcUuC1I0iLHPYsv9zmZnQgxwSgtr6qQ4GYdlF2VG522bEyPiZ6kzORny4 yfBeVR+p5ZMLg== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown , Detlev Casanova Subject: [PATCH v3 1/9] regulator: rpi-panel: Register with a unique backlight name Date: Mon, 24 Jan 2022 17:01:21 -0500 Message-Id: <20220124220129.158891-2-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124220129.158891-1-detlev.casanova@collabora.com> References: <20220124220129.158891-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 Signed-off-by: Detlev Casanova --- 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 05:29:30 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 C1DC5C433F5 for ; Tue, 25 Jan 2022 03:03:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1315574AbiAYCxt (ORCPT ); Mon, 24 Jan 2022 21:53:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2374224AbiAYAQc (ORCPT ); Mon, 24 Jan 2022 19:16: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 C0DFDC038AF1 for ; Mon, 24 Jan 2022 14:01:41 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id E1DB41F438F5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1643061700; bh=Aho1tR4hmf+9rCfrJot4fBHsOTXqSf7FX4Duswh2g2E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=c0sPGnx59UbDM0j9YK830cyRBXWpZpelPvzc/PkIkz0U9CLcoLwmedLjofkTecKRC nzDyqZ3CONtZEveFqKq3F22m5OC0TJctHgC2T7JBmHtzv4NA2aDwGU3GmWAWKjY6uh KBDk0hTeN8l0sac1F0Wk8KX+TP5Hoi1epLwDiBrGdu0kSNk0BIsjnYAgPUamfBuTmI g1bQ6PMM+0pKnqiyBiqXAKmk0okbn7cNyfsQtkRNS+THApXH+Qa+qnZD+wfLAbaOR+ DhibbQ8yelG8n8j8P9jaSnf5Ye/6yDgxFA45R3viE+yPPPODP2nrdR6HPoN0CGHiNK THTRQ8w1KdCQQ== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown , Detlev Casanova Subject: [PATCH v3 2/9] regulator: rpi-panel: Handle I2C errors/timing to the Atmel Date: Mon, 24 Jan 2022 17:01:22 -0500 Message-Id: <20220124220129.158891-3-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124220129.158891-1-detlev.casanova@collabora.com> References: <20220124220129.158891-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 Signed-off-by: Detlev Casanova --- .../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 05:29:30 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 87004C433F5 for ; Tue, 25 Jan 2022 03:00:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1315624AbiAYCxy (ORCPT ); Mon, 24 Jan 2022 21:53:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35750 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2374229AbiAYAQe (ORCPT ); Mon, 24 Jan 2022 19:16: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 777ECC038AF2 for ; Mon, 24 Jan 2022 14:01:42 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id BBDCF1F438FC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1643061701; bh=+7cPrbiU8TJpfXjaGc/vh7CRwWbkf2jwRVocsTyTrPQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QhvfcdEVjoT+8k17zEvFWcCpUXqCH4XWJSZ7GhafQigYzyLamdM9RYfoqp5LldIe1 NSiXpPVshDmf3CLjjfNSoz+R+dicjX6mzlpPlWcU3fy5/AeC8xBt35JyjrL2nnyI0F AD0Llsnkq8S8LPJw02j1xB5hHPRmxEBy/fMl6nCyoD3+1WF8IVm6VHEbtO4jx3Scu8 lxW9A7CCdl9HTOne1xz4Nxax44s0SGbCy38jvi/b/d8pXhk0CIS8eh0rdk5FthKteI jqD4KRdSsOQ2BUP3isqgMi+Ge03BO90eleLazsdkjT4gy7LdqOepWY6/axmwK0+Qvc rsmcUpqXWbh4Q== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown , Detlev Casanova Subject: [PATCH v3 3/9] regulator: rpi-panel: Serialise operations. Date: Mon, 24 Jan 2022 17:01:23 -0500 Message-Id: <20220124220129.158891-4-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124220129.158891-1-detlev.casanova@collabora.com> References: <20220124220129.158891-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 Signed-off-by: Detlev Casanova --- .../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 05:29:30 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 796FAC433EF for ; Tue, 25 Jan 2022 03:03:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1315595AbiAYCxv (ORCPT ); Mon, 24 Jan 2022 21:53:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36222 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2374234AbiAYAQe (ORCPT ); Mon, 24 Jan 2022 19:16: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 50023C038AF3 for ; Mon, 24 Jan 2022 14:01:43 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 954E11F438FE DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1643061702; bh=mp0tkZLX7tw26KY5Skjy5PePDYT8EZn9ewhzvxDKrbU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gCT33eWqw4pxs+yhUVMZLtqSf/8GYh0J4Wkp6nTh5xxs+5b9p+y2hWcBpd/AqYSmA oRI7XkvYLCPHIDnhAwuKXr1rRWTEoFc9da7YMdS1R0wxXHSdHIZJdI3JwxHwnwoVfa MYeExtx3CPjl1zMpFS8KQ1pNrM8XGpbMgGLEb8jL1d9TlLMMAZVxU6zuk1gE5N/CYL oHnImIqjs4aiwOpm/NgNkaM/wJU4+F4a70TbpUPualPksdjdBp4FEA7BLtoL0Z3zCh SCSBcjAp4UffpzkRIyjI7ZFzmGQMntQ3orHxi0r8oxLqVvBxixgXsxlGTPTHfAs6rL acZNeeFUCsdSg== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown , Detlev Casanova Subject: [PATCH v3 4/9] regulator: rpi-panel: Ensure the backlight is off during probe. Date: Mon, 24 Jan 2022 17:01:24 -0500 Message-Id: <20220124220129.158891-5-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124220129.158891-1-detlev.casanova@collabora.com> References: <20220124220129.158891-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 Signed-off-by: Detlev Casanova --- 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 05:29:30 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 476C7C4332F for ; Mon, 24 Jan 2022 23:06:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1842811AbiAXXCi (ORCPT ); Mon, 24 Jan 2022 18:02:38 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:46590 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1578113AbiAXWBo (ORCPT ); Mon, 24 Jan 2022 17:01:44 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 734D91F43900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1643061703; bh=E7KQciq+gZwcuyzcIcpVaVqUOalWdKPMLnu7+2ncJzU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XPl9UZaaAU4D43NQ9GOQd1MRPMJ6BZ8kk9kKvQ+Ga7QgeP9DP8LNHnMmbqxhiu3J2 pfmCLPWPLbBgPOzRhjWyuopYIBV+vDnIq0XDZBXue0fFVVUaiwlmiHbsOIWisQYq// teYhljnzSpWL7lU4QKhrkyqEd/5ZF7j1V3xdVfGX4yo/ac2v/JMAmz5J9iI7VSF9g3 b3PwyxmxBrLzRKOlnp+eLR1frSNelx20db/X0feuByI3D/v4/V1/jsGndi7+NpvKCB tCgK6C9SBTNw/wZC/H7vRlGSnX25JfURAxqDZgEHzyjZZQDnE8JWVM8NBAy+yEt4PR y6ioYCMYsl0Aw== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown , Detlev Casanova Subject: [PATCH v3 5/9] regulator: rpi-panel: Convert to drive lines directly Date: Mon, 24 Jan 2022 17:01:25 -0500 Message-Id: <20220124220129.158891-6-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124220129.158891-1-detlev.casanova@collabora.com> References: <20220124220129.158891-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 Signed-off-by: Detlev Casanova --- .../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 05:29:30 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 D6A3DC43219 for ; Tue, 25 Jan 2022 00:31:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S3410438AbiAYA3N (ORCPT ); Mon, 24 Jan 2022 19:29:13 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:46598 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1578124AbiAXWBp (ORCPT ); Mon, 24 Jan 2022 17:01:45 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 4C5771F438ED DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1643061703; bh=iK4Vk+E5mvUAnxE6Jr5IGm+xLJMyJoTeSBj/0jLq41o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MKMVmFomo5BfRGn7AZGdgPojM1ocODr6LRdskcbQhYbUmdQqXB80402Re56M0xBo+ kDF1nlTWGhAVTTDsG2NtVASUw3jd3e7Ij8tkg8QFSV+y3d4+Z5eWkSI+n6CyDMT5PS xc105EqRGEifVGCpdTTlymEzWLeSUoCDSkMgbEk7JIpOrGLqjhG3Sm1FFtuLNBYepj k4xnw8oIz6Y2aZSFKGAinwrwXaAMIe2oE6Vvs8wrh6ISLf7XNJ45WVVJEneHj6P9i8 k0+DEKTfmtnNGgY+CXc45gD5oYKwi0nSV5gl4YHtXoVb+FAuBC8OXKXQ+n9AiEawCS Pk7gQkkaYe9VA== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown , Detlev Casanova Subject: [PATCH v3 6/9] regulator: rpi-panel: Add GPIO control for panel and touch resets Date: Mon, 24 Jan 2022 17:01:26 -0500 Message-Id: <20220124220129.158891-7-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124220129.158891-1-detlev.casanova@collabora.com> References: <20220124220129.158891-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 05:29:30 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 2A733C3526E for ; Mon, 24 Jan 2022 23:07:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1843468AbiAXXEC (ORCPT ); Mon, 24 Jan 2022 18:04:02 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:46606 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1578129AbiAXWBp (ORCPT ); Mon, 24 Jan 2022 17:01:45 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 2623B1F438F5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1643061704; bh=uSJHLoKhBOSZViMqnrdcTgo72DKBbNURHymWklur8XE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=a2yCkKBHr2uUjSxIMcYN3dmciK6j6fWs///x9K1LcFfD814QT9O0L+p8ARn6+V+z2 n13j7E9skyrNQh6nr8JVnoPjEIZLk6kx8GsfIf8yJyWnkmnX87IKDHVYd0iuIfpSDy JCLlYsZNM/AtjdeNd8aKLoqVTVCJO1jhhpGavRKEhYE/Z97xy3IpfDanNBolcZgGBH 22VP5z7PslPyWbqUHl+hTlpMsq+XLePs7Trfr+MIy8GiW9lsyBJHNwfcrMB3g3jDq7 7zQszH3Hc8tk52wlUIg+yOyZofcxlUzFDZw3H0vqqlU7+Cwqktp53GG17PuyzY7l7U kEXw5y0r9zLSA== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown , Detlev Casanova Subject: [PATCH v3 7/9] regulator: rpi-panel: Remove get_brightness hook Date: Mon, 24 Jan 2022 17:01:27 -0500 Message-Id: <20220124220129.158891-8-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124220129.158891-1-detlev.casanova@collabora.com> References: <20220124220129.158891-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 Signed-off-by: Detlev Casanova --- .../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 05:29:30 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 9DAEBC43217 for ; Mon, 24 Jan 2022 23:07:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1843430AbiAXXD7 (ORCPT ); Mon, 24 Jan 2022 18:03:59 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:46620 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1578136AbiAXWBq (ORCPT ); Mon, 24 Jan 2022 17:01:46 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id 00A691F438FC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1643061705; bh=NKf8TvwzU0j7IGKB6x0vL0tnEezd/yNb8Y6+kHqjC5k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jnObaf8yIubXRT8EWRCozHf1frnWUj1CvdgrSl+UVhQ0Fws4oJAJlz9/U24/v2C8z UElVzD64if7lhfUNI4TnEQcimOoyvR7h3qLEWEqbgfmdrLIczdPbkgrBN9zP6Pv/K3 1av1cZdI+NN/bjs3ZUbovXOly5dU5eUbWrdXZWuGKobufO0CZLG3/Y/qBAmkugBNyp hfFQG3EDqVrKiASVd/YplS2IHkNYUEO/6BIqRxyKcd+gjXr3DfWLzq1Pvl8uYIRqf9 SYPF1gafP9FCfSAnAMAU7bcYNkg93vPSPpxlVF1I+O3BNK8zPqiUAaFJV+G0GB+65C 3XjM8TU6ZlWoQ== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown , Detlev Casanova Subject: [PATCH v3 8/9] regulator/rpi-panel-attiny: Use the regmap cache Date: Mon, 24 Jan 2022 17:01:28 -0500 Message-Id: <20220124220129.158891-9-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124220129.158891-1-detlev.casanova@collabora.com> References: <20220124220129.158891-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 regmap cache to avoid reading values. Signed-off-by: Dave Stevenson Signed-off-by: Detlev Casanova --- drivers/regulator/rpi-panel-attiny-regulator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regul= ator/rpi-panel-attiny-regulator.c index 8090b9a485b5..6e408a4b2c21 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -76,7 +76,7 @@ static const struct regmap_config attiny_regmap_config = =3D { .val_bits =3D 8, .disable_locking =3D 1, .max_register =3D REG_WRITE_DATA_L, - .cache_type =3D REGCACHE_NONE, + .cache_type =3D REGCACHE_RBTREE, }; =20 static int attiny_set_port_state(struct attiny_lcd *state, int reg, u8 val) --=20 2.34.1 From nobody Tue Jun 30 05:29:30 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 051CBC4321E for ; Mon, 24 Jan 2022 23:07:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1843447AbiAXXEB (ORCPT ); Mon, 24 Jan 2022 18:04:01 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:46628 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1578140AbiAXWBr (ORCPT ); Mon, 24 Jan 2022 17:01:47 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: detlev) with ESMTPSA id D03241F438FE DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1643061706; bh=28pjA3TtOFpceop/6s/pNsL6d9pwbuD0HO8KJv71GIE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eSqzyzkdoc82C6HZaCdDI33cyQT7WKyToNjN9K6U0268Ly1GpLmhlpNArzFXLvjLA RNpLpM2UgQQCiOJVAqRdTMXxhjn+7qT2XhZnLnGYvcP1rA42FhXc/jUX2w4Y9nnSAK paVUhUkfWuzHqLr8cCaaKvPnaB+e6DAAzfwFYvx1WaqSGSIZwTFgPgqSeFzFr8D8FD AiQd04hIaY2yv4pQOc6I4KkCdyFBkniLx8wvLGX8mMrQaZ0gNhvyQIQrKdQoMOPiqE 3vbJvv5STlHAffTUF4r9aIwuXg4s7PxAfzAYJfChQOvY2b1ZYVdpatfACVFmbcrF2M SHaeN04Wls7VQ== From: Detlev Casanova To: linux-kernel@vger.kernel.org Cc: Dave Stevenson , Liam Girdwood , Mark Brown , Detlev Casanova Subject: [PATCH v3 9/9] regulator/rpi-panel-attiny: Use two transactions for I2C read Date: Mon, 24 Jan 2022 17:01:29 -0500 Message-Id: <20220124220129.158891-10-detlev.casanova@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124220129.158891-1-detlev.casanova@collabora.com> References: <20220124220129.158891-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 Signed-off-by: Detlev Casanova --- .../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 6e408a4b2c21..f7df0f4b2f87 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -250,6 +250,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 */ @@ -280,7 +313,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