From patchwork Mon Jun 22 13:06:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Kochetkov X-Patchwork-Id: 242748 List-Id: U-Boot discussion From: al.kochet at gmail.com (Alexander Kochetkov) Date: Mon, 22 Jun 2020 16:06:00 +0300 Subject: [PATCH] rockchip: i2c: fix switch to new implementation for rk3188 Message-ID: <20200622130600.30925-1-al.kochet@gmail.com> The commit e7ae4cf27a6d 'pinctrl: rockchip: Add common rockchip pinctrl driver' dropped rk3188_pinctrl_request operation, that did switching to new implementation. This commit implement switching to new implementation using writing bits to GRF. I don't have rk3060 board to test, so switching implemented as a stub returning -ENOSYS. Signed-off-by: Alexander Kochetkov Reviewed-by: David Wu Reviewed-by: Heiko Schocher --- drivers/i2c/rk_i2c.c | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/drivers/i2c/rk_i2c.c b/drivers/i2c/rk_i2c.c index 32b2ee8578..ad3c66843b 100644 --- a/drivers/i2c/rk_i2c.c +++ b/drivers/i2c/rk_i2c.c @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include @@ -41,6 +43,7 @@ enum { */ struct rk_i2c_soc_data { int controller_type; + int (*switch_to_new_type)(int bus_nr); }; static inline void rk_i2c_get_div(int div, int *divh, int *divl) @@ -388,11 +391,33 @@ static int rockchip_i2c_ofdata_to_platdata(struct udevice *bus) return 0; } +static int rockchip_i2c_switch_to_new_type_rk3066(int bus_nr) +{ + return -ENOSYS; +} + +static int rockchip_i2c_switch_to_new_type_rk3188(int bus_nr) +{ + struct rk3188_grf *grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + + if (grf == NULL) + return -ENOSYS; + + if (bus_nr < 0 || bus_nr > (RKI2C4_SEL_SHIFT - RKI2C0_SEL_SHIFT)) + return -EINVAL; + + /* enable new i2c controller */ + rk_clrsetreg(&grf->soc_con1, + 1 << (RKI2C0_SEL_SHIFT + bus_nr), + 1 << (RKI2C0_SEL_SHIFT + bus_nr)); + + return 0; +} + static int rockchip_i2c_probe(struct udevice *bus) { struct rk_i2c *priv = dev_get_priv(bus); struct rk_i2c_soc_data *soc_data; - struct udevice *pinctrl; int bus_nr; int ret; @@ -408,17 +433,10 @@ static int rockchip_i2c_probe(struct udevice *bus) return ret; } - ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl); - if (ret) { - debug("%s: Cannot find pinctrl device\n", __func__); - return ret; - } - - /* pinctrl will switch I2C to new type */ - ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_I2C0 + bus_nr); - if (ret) { + ret = soc_data->switch_to_new_type(bus_nr); + if (ret < 0) { debug("%s: Failed to switch I2C to new type %s: %d\n", - __func__, bus->name, ret); + __func__, bus->name, ret); return ret; } } @@ -433,10 +451,12 @@ static const struct dm_i2c_ops rockchip_i2c_ops = { static const struct rk_i2c_soc_data rk3066_soc_data = { .controller_type = RK_I2C_LEGACY, + .switch_to_new_type = rockchip_i2c_switch_to_new_type_rk3066, }; static const struct rk_i2c_soc_data rk3188_soc_data = { .controller_type = RK_I2C_LEGACY, + .switch_to_new_type = rockchip_i2c_switch_to_new_type_rk3188, }; static const struct rk_i2c_soc_data rk3228_soc_data = {