Message ID | 1464330929-10910-1-git-send-email-kishon@ti.com |
---|---|
State | New |
Headers | show |
On Fri, May 27, 2016 at 8:35 AM, Kishon Vijay Abraham I <kishon@ti.com> wrote: > The reset values for all the PCF lines are high and hence on > shutdown we should drive all the lines high in order to > bring it to the reset state. > > This is actually required since PCF doesn't have a reset > line and even after warm reset (by invoking "reboot" in > prompt) the PCF lines maintains it's previous programmed > state. This becomes a problem if the boards are designed to > work with the default initial state. > > DRA7XX_evm uses PCF8575 and one of the PCF output lines > feeds to MMC/SD VDD and this line should be driven high in order > for the MMC/SD to be detected. This line is modelled as > regulator and the hsmmc driver takes care of enabling and > disabling it. In the case of 'reboot', during shutdown path > as part of it's cleanup process the hsmmc driver disables > this regulator. This makes MMC *boot* not functional. > > Fix it by driving all the pcf lines high. > > Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> > Signed-off-by: Sekhar Nori <nsekhar@ti.com> Patch applied. Yours, Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/gpio/gpio-pcf857x.c b/drivers/gpio/gpio-pcf857x.c index 169c09a..d168410 100644 --- a/drivers/gpio/gpio-pcf857x.c +++ b/drivers/gpio/gpio-pcf857x.c @@ -440,6 +440,14 @@ static int pcf857x_remove(struct i2c_client *client) return status; } +static void pcf857x_shutdown(struct i2c_client *client) +{ + struct pcf857x *gpio = i2c_get_clientdata(client); + + /* Drive all the I/O lines high */ + gpio->write(gpio->client, BIT(gpio->chip.ngpio) - 1); +} + static struct i2c_driver pcf857x_driver = { .driver = { .name = "pcf857x", @@ -447,6 +455,7 @@ static struct i2c_driver pcf857x_driver = { }, .probe = pcf857x_probe, .remove = pcf857x_remove, + .shutdown = pcf857x_shutdown, .id_table = pcf857x_id, };