These patches were generated from: https://github.com/raspberrypi/linux/commits/rpi-6.12.y With the following command: git format-patch -N v6.12.27..HEAD (HEAD -> 8d3206ee456a5ecdf9ddbfd8e5e231e4f0cd716e) Exceptions: - (def)configs patches - github workflows patches - applied & reverted patches - readme patches - wireless patches Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
157 lines
4.2 KiB
Diff
157 lines
4.2 KiB
Diff
From 676d4a016c05d3a1e1b6fa68090bf37350ca2a97 Mon Sep 17 00:00:00 2001
|
|
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
Date: Mon, 29 Nov 2021 18:31:37 +0000
|
|
Subject: [PATCH] regulator/rpi-panel-attiny: Don't read the LCD power status
|
|
|
|
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 <dave.stevenson@raspberrypi.com>
|
|
|
|
regulator/rpi-panel: Power off display on shutdown
|
|
|
|
Adds a shutdown function to turn off the backlight, bridge, and
|
|
touch controller on shutdown.
|
|
|
|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
|
|
regulator/rpi-panel: Remove the ID read
|
|
|
|
Reading from the Atmel has always been troublesome due to
|
|
clock stretching, and the driver does nothing with it anyway.
|
|
|
|
Remove the read and assume that if the overlay has been
|
|
configured (most likely through the firmware autodetection)
|
|
that the hardware is present.
|
|
|
|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
---
|
|
.../regulator/rpi-panel-attiny-regulator.c | 77 +++----------------
|
|
1 file changed, 10 insertions(+), 67 deletions(-)
|
|
|
|
--- a/drivers/regulator/rpi-panel-attiny-regulator.c
|
|
+++ b/drivers/regulator/rpi-panel-attiny-regulator.c
|
|
@@ -143,24 +143,8 @@ static int attiny_lcd_power_disable(stru
|
|
static int attiny_lcd_power_is_enabled(struct regulator_dev *rdev)
|
|
{
|
|
struct attiny_lcd *state = rdev_get_drvdata(rdev);
|
|
- unsigned int data;
|
|
- int ret, i;
|
|
-
|
|
- mutex_lock(&state->lock);
|
|
-
|
|
- for (i = 0; i < 10; i++) {
|
|
- ret = regmap_read(rdev->regmap, REG_PORTC, &data);
|
|
- if (!ret)
|
|
- break;
|
|
- usleep_range(10000, 12000);
|
|
- }
|
|
|
|
- mutex_unlock(&state->lock);
|
|
-
|
|
- if (ret < 0)
|
|
- return ret;
|
|
-
|
|
- return data & PC_RST_BRIDGE_N;
|
|
+ return state->port_states[REG_PORTC - REG_PORTA] & PC_RST_BRIDGE_N;
|
|
}
|
|
|
|
static const struct regulator_init_data attiny_regulator_default = {
|
|
@@ -245,39 +229,6 @@ static void attiny_gpio_set(struct gpio_
|
|
mutex_unlock(&state->lock);
|
|
}
|
|
|
|
-static int attiny_i2c_read(struct i2c_client *client, u8 reg, unsigned int *buf)
|
|
-{
|
|
- struct i2c_msg msgs[1];
|
|
- u8 addr_buf[1] = { reg };
|
|
- u8 data_buf[1] = { 0, };
|
|
- int ret;
|
|
-
|
|
- /* Write register address */
|
|
- msgs[0].addr = client->addr;
|
|
- msgs[0].flags = 0;
|
|
- msgs[0].len = ARRAY_SIZE(addr_buf);
|
|
- msgs[0].buf = addr_buf;
|
|
-
|
|
- ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
|
|
- if (ret != ARRAY_SIZE(msgs))
|
|
- return -EIO;
|
|
-
|
|
- usleep_range(5000, 10000);
|
|
-
|
|
- /* Read data from register */
|
|
- msgs[0].addr = client->addr;
|
|
- msgs[0].flags = I2C_M_RD;
|
|
- msgs[0].len = 1;
|
|
- msgs[0].buf = data_buf;
|
|
-
|
|
- ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
|
|
- if (ret != ARRAY_SIZE(msgs))
|
|
- return -EIO;
|
|
-
|
|
- *buf = data_buf[0];
|
|
- return 0;
|
|
-}
|
|
-
|
|
/*
|
|
* I2C driver interface functions
|
|
*/
|
|
@@ -289,7 +240,6 @@ static int attiny_i2c_probe(struct i2c_c
|
|
struct regulator_dev *rdev;
|
|
struct attiny_lcd *state;
|
|
struct regmap *regmap;
|
|
- unsigned int data;
|
|
int ret;
|
|
|
|
state = devm_kzalloc(&i2c->dev, sizeof(*state), GFP_KERNEL);
|
|
@@ -307,22 +257,6 @@ static int attiny_i2c_probe(struct i2c_c
|
|
goto error;
|
|
}
|
|
|
|
- ret = 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;
|
|
- }
|
|
-
|
|
- switch (data) {
|
|
- case 0xde: /* ver 1 */
|
|
- case 0xc3: /* ver 2 */
|
|
- break;
|
|
- default:
|
|
- dev_err(&i2c->dev, "Unknown Atmel firmware revision: 0x%02x\n", data);
|
|
- ret = -ENODEV;
|
|
- goto error;
|
|
- }
|
|
-
|
|
regmap_write(regmap, REG_POWERON, 0);
|
|
msleep(30);
|
|
regmap_write(regmap, REG_PWM, 0);
|
|
@@ -386,6 +320,14 @@ static void attiny_i2c_remove(struct i2c
|
|
mutex_destroy(&state->lock);
|
|
}
|
|
|
|
+static void attiny_i2c_shutdown(struct i2c_client *client)
|
|
+{
|
|
+ struct attiny_lcd *state = i2c_get_clientdata(client);
|
|
+
|
|
+ regmap_write(state->regmap, REG_PWM, 0);
|
|
+ regmap_write(state->regmap, REG_POWERON, 0);
|
|
+}
|
|
+
|
|
static const struct of_device_id attiny_dt_ids[] = {
|
|
{ .compatible = "raspberrypi,7inch-touchscreen-panel-regulator" },
|
|
{},
|
|
@@ -400,6 +342,7 @@ static struct i2c_driver attiny_regulato
|
|
},
|
|
.probe = attiny_i2c_probe,
|
|
.remove = attiny_i2c_remove,
|
|
+ .shutdown = attiny_i2c_shutdown,
|
|
};
|
|
|
|
module_i2c_driver(attiny_regulator_driver);
|