summaryrefslogtreecommitdiff
path: root/drivers/mfd
diff options
context:
space:
mode:
authorWyon Bi <bivvy.bi@rock-chips.com>2018-12-18 16:11:10 +0800
committerTao Huang <huangtao@rock-chips.com>2018-12-18 17:59:44 +0800
commit74f866a9cca7c6b5ca16f8c673ceb36f340181a9 (patch)
tree3a1522298a00720eac6b2cac6e5411ca9208fa4c /drivers/mfd
parent4b2e9b94ed38b1988a714854921c583051fc078b (diff)
mfd: rk618: bypass reset sequence if I2C communication is ok
Change-Id: I7f70c142e55679d34d80917ea6cde7e4aec77901 Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/rk618.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/drivers/mfd/rk618.c b/drivers/mfd/rk618.c
index 3d7081048a0f..716c6202f870 100644
--- a/drivers/mfd/rk618.c
+++ b/drivers/mfd/rk618.c
@@ -50,6 +50,7 @@ static const struct mfd_cell rk618_devs[] = {
static int rk618_power_on(struct rk618 *rk618)
{
+ u32 reg;
int ret;
ret = regulator_enable(rk618->supply);
@@ -62,11 +63,15 @@ static int rk618_power_on(struct rk618 *rk618)
gpiod_direction_output(rk618->enable_gpio, 1);
usleep_range(1000, 2000);
- gpiod_direction_output(rk618->reset_gpio, 0);
- usleep_range(2000, 4000);
- gpiod_direction_output(rk618->reset_gpio, 1);
- usleep_range(50000, 60000);
- gpiod_direction_output(rk618->reset_gpio, 0);
+
+ ret = regmap_read(rk618->regmap, 0x0000, &reg);
+ if (ret) {
+ gpiod_direction_output(rk618->reset_gpio, 0);
+ usleep_range(2000, 4000);
+ gpiod_direction_output(rk618->reset_gpio, 1);
+ usleep_range(50000, 60000);
+ gpiod_direction_output(rk618->reset_gpio, 0);
+ }
return 0;
}
@@ -136,10 +141,6 @@ rk618_probe(struct i2c_client *client, const struct i2c_device_id *id)
return ret;
}
- ret = rk618_power_on(rk618);
- if (ret)
- goto err_clk_disable;
-
rk618->regmap = devm_regmap_init_i2c(client, &rk618_regmap_config);
if (IS_ERR(rk618->regmap)) {
ret = PTR_ERR(rk618->regmap);
@@ -147,6 +148,10 @@ rk618_probe(struct i2c_client *client, const struct i2c_device_id *id)
goto err_clk_disable;
}
+ ret = rk618_power_on(rk618);
+ if (ret)
+ goto err_clk_disable;
+
ret = mfd_add_devices(dev, -1, rk618_devs, ARRAY_SIZE(rk618_devs),
NULL, 0, NULL);
if (ret) {