Skip to content

Commit

Permalink
regulator/rpi-panel-attiny: Don't read the LCD power status
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
6by9 authored and popcornmix committed Nov 18, 2024
1 parent 60833dd commit 5a1bbd8
Showing 1 changed file with 10 additions and 67 deletions.
77 changes: 10 additions & 67 deletions drivers/regulator/rpi-panel-attiny-regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,24 +143,8 @@ static int attiny_lcd_power_disable(struct regulator_dev *rdev)
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 = {
Expand Down Expand Up @@ -245,39 +229,6 @@ static void attiny_gpio_set(struct gpio_chip *gc, unsigned int off, int val)
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
*/
Expand All @@ -289,7 +240,6 @@ static int attiny_i2c_probe(struct i2c_client *i2c)
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);
Expand All @@ -307,22 +257,6 @@ static int attiny_i2c_probe(struct i2c_client *i2c)
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);
Expand Down Expand Up @@ -386,6 +320,14 @@ static void attiny_i2c_remove(struct i2c_client *client)
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" },
{},
Expand All @@ -400,6 +342,7 @@ static struct i2c_driver attiny_regulator_driver = {
},
.probe = attiny_i2c_probe,
.remove = attiny_i2c_remove,
.shutdown = attiny_i2c_shutdown,
};

module_i2c_driver(attiny_regulator_driver);
Expand Down

0 comments on commit 5a1bbd8

Please sign in to comment.