pinctrl: cy8c95x0: Add reset support
This patch adds support for an optional "reset" GPIO pin in the cy8c95x0 pinctrl driver. On probe, the reset pin is pulled low to bring chip out of reset. The reset pin has an internal pull-down and can be left floating if not required. The datasheet doesn't mention any timing related to the reset pin. Based on empirical tests, it was found that the chip requires a delay of 250 milliseconds before accepting I2C transfers after driving the reset pin low. Therefore, a delay of 250ms is added before proceeding with I2C transfers. Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Signed-off-by: Naresh Solanki <Naresh.Solanki@9elements.com> Link: https://lore.kernel.org/r/20230714081902.2621771-2-Naresh.Solanki@9elements.com Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
a4f1d0dd9b
commit
99084881de
|
@ -164,6 +164,7 @@ struct cy8c95x0_pinctrl {
|
|||
struct pinctrl_desc pinctrl_desc;
|
||||
char name[32];
|
||||
unsigned int tpin;
|
||||
struct gpio_desc *gpio_reset;
|
||||
};
|
||||
|
||||
static const struct pinctrl_pin_desc cy8c9560_pins[] = {
|
||||
|
@ -1383,6 +1384,20 @@ static int cy8c95x0_probe(struct i2c_client *client)
|
|||
chip->regulator = reg;
|
||||
}
|
||||
|
||||
/* bring the chip out of reset if reset pin is provided */
|
||||
chip->gpio_reset = devm_gpiod_get_optional(&client->dev, "reset", GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(chip->gpio_reset)) {
|
||||
ret = dev_err_probe(chip->dev, PTR_ERR(chip->gpio_reset),
|
||||
"Failed to get GPIO 'reset'\n");
|
||||
goto err_exit;
|
||||
} else if (chip->gpio_reset) {
|
||||
usleep_range(1000, 2000);
|
||||
gpiod_set_value_cansleep(chip->gpio_reset, 0);
|
||||
usleep_range(250000, 300000);
|
||||
|
||||
gpiod_set_consumer_name(chip->gpio_reset, "CY8C95X0 RESET");
|
||||
}
|
||||
|
||||
chip->regmap = devm_regmap_init_i2c(client, &cy8c95x0_i2c_regmap);
|
||||
if (IS_ERR(chip->regmap)) {
|
||||
ret = PTR_ERR(chip->regmap);
|
||||
|
|
Loading…
Reference in New Issue