165 lines
5.2 KiB
Diff
165 lines
5.2 KiB
Diff
|
From fcff0879520b91a04d405b2288144e77aae1eede Mon Sep 17 00:00:00 2001
|
||
|
From: Sebastian Reichel <sebastian.reichel@collabora.com>
|
||
|
Date: Tue, 24 Jan 2023 14:25:32 +0100
|
||
|
Subject: [PATCH 304/469] mfd: rk8xx-i2c: use device_get_match_data
|
||
|
|
||
|
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@kernel.org>
|
||
|
Tested-by: Diederik de Haas <didi.debian@cknow.org> # Rock64, Quartz64 Model A + B
|
||
|
Tested-by: Vincent Legoll <vincent.legoll@gmail.com> # Pine64 QuartzPro64
|
||
|
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
|
||
|
---
|
||
|
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.34.1
|
||
|
|