Commit 4fec8a5a authored by Sebastian Reichel's avatar Sebastian Reichel Committed by Lee Jones

mfd: rk808: Convert to device managed resources

Fully convert the driver to device managed resources.

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: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
Link: https://lore.kernel.org/r/20230504173618.142075-3-sebastian.reichel@collabora.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
parent 2dc51ca8
...@@ -548,13 +548,11 @@ static const struct regmap_irq_chip rk818_irq_chip = { ...@@ -548,13 +548,11 @@ static const struct regmap_irq_chip rk818_irq_chip = {
.init_ack_masked = true, .init_ack_masked = true,
}; };
static struct i2c_client *rk808_i2c_client; static int rk808_power_off(struct sys_off_data *data)
static void rk808_pm_power_off(void)
{ {
struct rk808 *rk808 = data->cb_data;
int ret; int ret;
unsigned int reg, bit; unsigned int reg, bit;
struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
switch (rk808->variant) { switch (rk808->variant) {
case RK805_ID: case RK805_ID:
...@@ -575,16 +573,18 @@ static void rk808_pm_power_off(void) ...@@ -575,16 +573,18 @@ static void rk808_pm_power_off(void)
bit = DEV_OFF; bit = DEV_OFF;
break; break;
default: default:
return; return NOTIFY_DONE;
} }
ret = regmap_update_bits(rk808->regmap, reg, bit, bit); ret = regmap_update_bits(rk808->regmap, reg, bit, bit);
if (ret) if (ret)
dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n"); dev_err(&rk808->i2c->dev, "Failed to shutdown device!\n");
return NOTIFY_DONE;
} }
static int rk808_restart_notify(struct notifier_block *this, unsigned long mode, void *cmd) static int rk808_restart(struct sys_off_data *data)
{ {
struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client); struct rk808 *rk808 = data->cb_data;
unsigned int reg, bit; unsigned int reg, bit;
int ret; int ret;
...@@ -600,16 +600,11 @@ static int rk808_restart_notify(struct notifier_block *this, unsigned long mode, ...@@ -600,16 +600,11 @@ static int rk808_restart_notify(struct notifier_block *this, unsigned long mode,
} }
ret = regmap_update_bits(rk808->regmap, reg, bit, bit); ret = regmap_update_bits(rk808->regmap, reg, bit, bit);
if (ret) if (ret)
dev_err(&rk808_i2c_client->dev, "Failed to restart device!\n"); dev_err(&rk808->i2c->dev, "Failed to restart device!\n");
return NOTIFY_DONE; return NOTIFY_DONE;
} }
static struct notifier_block rk808_restart_handler = {
.notifier_call = rk808_restart_notify,
.priority = 192,
};
static void rk8xx_shutdown(struct i2c_client *client) static void rk8xx_shutdown(struct i2c_client *client)
{ {
struct rk808 *rk808 = i2c_get_clientdata(client); struct rk808 *rk808 = i2c_get_clientdata(client);
...@@ -745,9 +740,9 @@ static int rk808_probe(struct i2c_client *client) ...@@ -745,9 +740,9 @@ static int rk808_probe(struct i2c_client *client)
return -EINVAL; return -EINVAL;
} }
ret = regmap_add_irq_chip(rk808->regmap, client->irq, ret = devm_regmap_add_irq_chip(&client->dev, rk808->regmap, client->irq,
IRQF_ONESHOT, -1, IRQF_ONESHOT, -1,
rk808->regmap_irq_chip, &rk808->irq_data); rk808->regmap_irq_chip, &rk808->irq_data);
if (ret) { if (ret) {
dev_err(&client->dev, "Failed to add irq_chip %d\n", ret); dev_err(&client->dev, "Failed to add irq_chip %d\n", ret);
return ret; return ret;
...@@ -771,17 +766,23 @@ static int rk808_probe(struct i2c_client *client) ...@@ -771,17 +766,23 @@ static int rk808_probe(struct i2c_client *client)
regmap_irq_get_domain(rk808->irq_data)); regmap_irq_get_domain(rk808->irq_data));
if (ret) { if (ret) {
dev_err(&client->dev, "failed to add MFD devices %d\n", ret); dev_err(&client->dev, "failed to add MFD devices %d\n", ret);
goto err_irq; return ret;
} }
if (of_property_read_bool(np, "rockchip,system-power-controller")) { if (of_property_read_bool(np, "rockchip,system-power-controller")) {
rk808_i2c_client = client; ret = devm_register_sys_off_handler(&client->dev,
pm_power_off = rk808_pm_power_off; SYS_OFF_MODE_POWER_OFF_PREPARE, SYS_OFF_PRIO_HIGH,
&rk808_power_off, rk808);
if (ret)
return dev_err_probe(&client->dev, ret,
"failed to register poweroff handler\n");
switch (rk808->variant) { switch (rk808->variant) {
case RK809_ID: case RK809_ID:
case RK817_ID: case RK817_ID:
ret = register_restart_handler(&rk808_restart_handler); ret = devm_register_sys_off_handler(&client->dev,
SYS_OFF_MODE_RESTART, SYS_OFF_PRIO_HIGH,
&rk808_restart, rk808);
if (ret) if (ret)
dev_warn(&client->dev, "failed to register rst handler, %d\n", ret); dev_warn(&client->dev, "failed to register rst handler, %d\n", ret);
break; break;
...@@ -792,26 +793,6 @@ static int rk808_probe(struct i2c_client *client) ...@@ -792,26 +793,6 @@ static int rk808_probe(struct i2c_client *client)
} }
return 0; return 0;
err_irq:
regmap_del_irq_chip(client->irq, rk808->irq_data);
return ret;
}
static void rk808_remove(struct i2c_client *client)
{
struct rk808 *rk808 = i2c_get_clientdata(client);
regmap_del_irq_chip(client->irq, rk808->irq_data);
/**
* pm_power_off may points to a function from another module.
* Check if the pointer is set by us and only then overwrite it.
*/
if (pm_power_off == rk808_pm_power_off)
pm_power_off = NULL;
unregister_restart_handler(&rk808_restart_handler);
} }
static int __maybe_unused rk8xx_suspend(struct device *dev) static int __maybe_unused rk8xx_suspend(struct device *dev)
...@@ -868,7 +849,6 @@ static struct i2c_driver rk808_i2c_driver = { ...@@ -868,7 +849,6 @@ static struct i2c_driver rk808_i2c_driver = {
.pm = &rk8xx_pm_ops, .pm = &rk8xx_pm_ops,
}, },
.probe_new = rk808_probe, .probe_new = rk808_probe,
.remove = rk808_remove,
.shutdown = rk8xx_shutdown, .shutdown = rk8xx_shutdown,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment