mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-15 04:42:02 +00:00
137 lines
3.5 KiB
Diff
137 lines
3.5 KiB
Diff
|
From 181abe23b615d7629365d94a2e956ca7e0e1fdc8 Mon Sep 17 00:00:00 2001
|
||
|
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||
|
Date: Wed, 8 Sep 2021 14:56:03 +0100
|
||
|
Subject: [PATCH 514/634] regulator: rpi-panel: Handle I2C errors/timing to the
|
||
|
Atmel
|
||
|
|
||
|
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 <dave.stevenson@raspberrypi.com>
|
||
|
---
|
||
|
.../regulator/rpi-panel-attiny-regulator.c | 56 +++++++++++++++----
|
||
|
1 file changed, 46 insertions(+), 10 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regulator/rpi-panel-attiny-regulator.c
|
||
|
index 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 = {
|
||
|
static int attiny_lcd_power_enable(struct regulator_dev *rdev)
|
||
|
{
|
||
|
unsigned int data;
|
||
|
+ int ret, i;
|
||
|
|
||
|
regmap_write(rdev->regmap, REG_POWERON, 1);
|
||
|
+ msleep(80);
|
||
|
+
|
||
|
/* Wait for nPWRDWN to go low to indicate poweron is done. */
|
||
|
- regmap_read_poll_timeout(rdev->regmap, REG_PORTB, data,
|
||
|
- data & BIT(0), 10, 1000000);
|
||
|
+ for (i = 0; i < 20; i++) {
|
||
|
+ ret = regmap_read(rdev->regmap, REG_PORTB, &data);
|
||
|
+ if (!ret) {
|
||
|
+ if (data & BIT(0))
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ usleep_range(10000, 12000);
|
||
|
+ }
|
||
|
+ usleep_range(10000, 12000);
|
||
|
+
|
||
|
+ if (ret)
|
||
|
+ pr_err("%s: regmap_read_poll_timeout failed %d\n", __func__, ret);
|
||
|
|
||
|
/* Default to the same orientation as the closed source
|
||
|
* firmware used for the panel. Runtime rotation
|
||
|
@@ -57,23 +70,34 @@ static int attiny_lcd_power_disable(struct regulator_dev *rdev)
|
||
|
{
|
||
|
regmap_write(rdev->regmap, REG_PWM, 0);
|
||
|
regmap_write(rdev->regmap, REG_POWERON, 0);
|
||
|
- udelay(1);
|
||
|
+ msleep(30);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int attiny_lcd_power_is_enabled(struct regulator_dev *rdev)
|
||
|
{
|
||
|
unsigned int data;
|
||
|
- int ret;
|
||
|
+ int ret, i;
|
||
|
|
||
|
- ret = regmap_read(rdev->regmap, REG_POWERON, &data);
|
||
|
+ for (i = 0; i < 10; i++) {
|
||
|
+ ret = regmap_read(rdev->regmap, REG_POWERON, &data);
|
||
|
+ if (!ret)
|
||
|
+ break;
|
||
|
+ usleep_range(10000, 12000);
|
||
|
+ }
|
||
|
if (ret < 0)
|
||
|
return ret;
|
||
|
|
||
|
if (!(data & BIT(0)))
|
||
|
return 0;
|
||
|
|
||
|
- ret = regmap_read(rdev->regmap, REG_PORTB, &data);
|
||
|
+ for (i = 0; i < 10; i++) {
|
||
|
+ ret = regmap_read(rdev->regmap, REG_PORTB, &data);
|
||
|
+ if (!ret)
|
||
|
+ break;
|
||
|
+ usleep_range(10000, 12000);
|
||
|
+ }
|
||
|
+
|
||
|
if (ret < 0)
|
||
|
return ret;
|
||
|
|
||
|
@@ -103,20 +127,32 @@ static int attiny_update_status(struct backlight_device *bl)
|
||
|
{
|
||
|
struct regmap *regmap = bl_get_data(bl);
|
||
|
int brightness = bl->props.brightness;
|
||
|
+ int ret, i;
|
||
|
|
||
|
if (bl->props.power != FB_BLANK_UNBLANK ||
|
||
|
bl->props.fb_blank != FB_BLANK_UNBLANK)
|
||
|
brightness = 0;
|
||
|
|
||
|
- return regmap_write(regmap, REG_PWM, brightness);
|
||
|
+ for (i = 0; i < 10; i++) {
|
||
|
+ ret = regmap_write(regmap, REG_PWM, brightness);
|
||
|
+ if (!ret)
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
static int attiny_get_brightness(struct backlight_device *bl)
|
||
|
{
|
||
|
struct regmap *regmap = bl_get_data(bl);
|
||
|
- int ret, brightness;
|
||
|
+ int ret, brightness, i;
|
||
|
+
|
||
|
+ for (i = 0; i < 10; i++) {
|
||
|
+ ret = regmap_read(regmap, REG_PWM, &brightness);
|
||
|
+ if (!ret)
|
||
|
+ break;
|
||
|
+ }
|
||
|
|
||
|
- ret = regmap_read(regmap, REG_PWM, &brightness);
|
||
|
if (ret)
|
||
|
return ret;
|
||
|
|
||
|
@@ -166,7 +202,7 @@ static int attiny_i2c_probe(struct i2c_client *i2c,
|
||
|
}
|
||
|
|
||
|
regmap_write(regmap, REG_POWERON, 0);
|
||
|
- mdelay(1);
|
||
|
+ msleep(30);
|
||
|
|
||
|
config.dev = &i2c->dev;
|
||
|
config.regmap = regmap;
|
||
|
--
|
||
|
2.33.1
|
||
|
|