Simplify the device identification logic by supplying the relevant information via of_match_data. This also removes the dev_info() printing the chip version, since that's supplied by the match data now. Due to lack of hardware this change is compile-tested only. Acked-for-MFD-by: Lee Jones <lee@xxxxxxxxxx> Tested-by: Diederik de Haas <didi.debian@xxxxxxxxx> # Rock64, Quartz64 Model A + B Tested-by: Vincent Legoll <vincent.legoll@xxxxxxxxx> # Pine64 QuartzPro64 Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxx> --- drivers/mfd/rk8xx-core.c | 2 - drivers/mfd/rk8xx-i2c.c | 89 +++++++++++++++++----------------------- 2 files changed, 37 insertions(+), 54 deletions(-) diff --git a/drivers/mfd/rk8xx-core.c b/drivers/mfd/rk8xx-core.c index 5c0a5acef34c..ddf2052c5190 100644 --- a/drivers/mfd/rk8xx-core.c +++ b/drivers/mfd/rk8xx-core.c @@ -597,8 +597,6 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap return -EINVAL; } - dev_info(dev, "chip id: 0x%x\n", (unsigned int)rk808->variant); - if (!irq) return dev_err_probe(dev, -EINVAL, "No interrupt support, no core IRQ\n"); diff --git a/drivers/mfd/rk8xx-i2c.c b/drivers/mfd/rk8xx-i2c.c index 6d121b589fec..2822bfa8a04a 100644 --- a/drivers/mfd/rk8xx-i2c.c +++ b/drivers/mfd/rk8xx-i2c.c @@ -16,6 +16,11 @@ #include <linux/of.h> #include <linux/regmap.h> +struct rk8xx_i2c_platform_data { + const struct regmap_config *regmap_cfg; + int variant; +}; + static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg) { /* @@ -103,66 +108,46 @@ static const struct regmap_config rk817_regmap_config = { .volatile_reg = rk817_is_volatile_reg, }; -static int rk8xx_i2c_get_variant(struct i2c_client *client) -{ - u8 pmic_id_msb, pmic_id_lsb; - int msb, lsb; - - if (of_device_is_compatible(client->dev.of_node, "rockchip,rk817") || - of_device_is_compatible(client->dev.of_node, "rockchip,rk809")) { - pmic_id_msb = RK817_ID_MSB; - pmic_id_lsb = RK817_ID_LSB; - } else { - pmic_id_msb = RK808_ID_MSB; - pmic_id_lsb = RK808_ID_LSB; - } +static const struct rk8xx_i2c_platform_data rk805_data = { + .regmap_cfg = &rk805_regmap_config, + .variant = RK805_ID, +}; + +static const struct rk8xx_i2c_platform_data rk808_data = { + .regmap_cfg = &rk808_regmap_config, + .variant = RK808_ID, +}; - /* Read chip variant */ - msb = i2c_smbus_read_byte_data(client, pmic_id_msb); - if (msb < 0) - return dev_err_probe(&client->dev, msb, "failed to read the chip id MSB\n"); +static const struct rk8xx_i2c_platform_data rk809_data = { + .regmap_cfg = &rk817_regmap_config, + .variant = RK809_ID, +}; - lsb = i2c_smbus_read_byte_data(client, pmic_id_lsb); - if (lsb < 0) - return dev_err_probe(&client->dev, lsb, "failed to read the chip id LSB\n"); +static const struct rk8xx_i2c_platform_data rk817_data = { + .regmap_cfg = &rk817_regmap_config, + .variant = RK817_ID, +}; - return ((msb << 8) | lsb) & RK8XX_ID_MSK; -} +static const struct rk8xx_i2c_platform_data rk818_data = { + .regmap_cfg = &rk818_regmap_config, + .variant = RK818_ID, +}; static int rk8xx_i2c_probe(struct i2c_client *client) { - const struct regmap_config *regmap_cfg; + const struct rk8xx_i2c_platform_data *data; struct regmap *regmap; - int variant; - variant = rk8xx_i2c_get_variant(client); - if (variant < 0) - return variant; - - switch (variant) { - case RK805_ID: - regmap_cfg = &rk805_regmap_config; - break; - case RK808_ID: - regmap_cfg = &rk808_regmap_config; - break; - case RK818_ID: - regmap_cfg = &rk818_regmap_config; - break; - case RK809_ID: - case RK817_ID: - regmap_cfg = &rk817_regmap_config; - break; - default: - return dev_err_probe(&client->dev, -EINVAL, "Unsupported RK8XX ID %x\n", variant); - } + data = device_get_match_data(&client->dev); + if (!data) + return -ENODEV; - regmap = devm_regmap_init_i2c(client, regmap_cfg); + regmap = devm_regmap_init_i2c(client, data->regmap_cfg); if (IS_ERR(regmap)) return dev_err_probe(&client->dev, PTR_ERR(regmap), "regmap initialization failed\n"); - return rk8xx_probe(&client->dev, variant, client->irq, regmap); + return rk8xx_probe(&client->dev, data->variant, client->irq, regmap); } static void rk8xx_i2c_shutdown(struct i2c_client *client) @@ -173,11 +158,11 @@ static void rk8xx_i2c_shutdown(struct i2c_client *client) static SIMPLE_DEV_PM_OPS(rk8xx_i2c_pm_ops, rk8xx_suspend, rk8xx_resume); static const struct of_device_id rk8xx_i2c_of_match[] = { - { .compatible = "rockchip,rk805" }, - { .compatible = "rockchip,rk808" }, - { .compatible = "rockchip,rk809" }, - { .compatible = "rockchip,rk817" }, - { .compatible = "rockchip,rk818" }, + { .compatible = "rockchip,rk805", .data = &rk805_data }, + { .compatible = "rockchip,rk808", .data = &rk808_data }, + { .compatible = "rockchip,rk809", .data = &rk809_data }, + { .compatible = "rockchip,rk817", .data = &rk817_data }, + { .compatible = "rockchip,rk818", .data = &rk818_data }, { }, }; MODULE_DEVICE_TABLE(of, rk8xx_i2c_of_match); -- 2.39.2