mirror of https://github.com/OpenIPC/firmware.git
108 lines
2.7 KiB
Diff
108 lines
2.7 KiB
Diff
diff -drupN a/drivers/w1/masters/ds2482.c b/drivers/w1/masters/ds2482.c
|
|
--- a/drivers/w1/masters/ds2482.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/drivers/w1/masters/ds2482.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -18,6 +18,8 @@
|
|
#include <linux/slab.h>
|
|
#include <linux/i2c.h>
|
|
#include <linux/delay.h>
|
|
+#include <linux/gpio.h>
|
|
+#include <linux/platform_data/ds2482.h>
|
|
#include <asm/delay.h>
|
|
|
|
#include "../w1.h"
|
|
@@ -97,7 +99,8 @@ static const u8 ds2482_chan_rd[8] =
|
|
static int ds2482_probe(struct i2c_client *client,
|
|
const struct i2c_device_id *id);
|
|
static int ds2482_remove(struct i2c_client *client);
|
|
-
|
|
+static int ds2482_suspend(struct device *dev);
|
|
+static int ds2482_resume(struct device *dev);
|
|
|
|
/**
|
|
* Driver data (common to all clients)
|
|
@@ -108,9 +111,15 @@ static const struct i2c_device_id ds2482
|
|
};
|
|
MODULE_DEVICE_TABLE(i2c, ds2482_id);
|
|
|
|
+static const struct dev_pm_ops ds2482_pm_ops = {
|
|
+ .suspend = ds2482_suspend,
|
|
+ .resume = ds2482_resume,
|
|
+};
|
|
+
|
|
static struct i2c_driver ds2482_driver = {
|
|
.driver = {
|
|
.name = "ds2482",
|
|
+ .pm = &ds2482_pm_ops,
|
|
},
|
|
.probe = ds2482_probe,
|
|
.remove = ds2482_remove,
|
|
@@ -132,6 +141,7 @@ struct ds2482_w1_chan {
|
|
struct ds2482_data {
|
|
struct i2c_client *client;
|
|
struct mutex access_lock;
|
|
+ int slpz_gpio;
|
|
|
|
/* 1-wire interface(s) */
|
|
int w1_count; /* 1 or 8 */
|
|
@@ -460,11 +470,31 @@ static u8 ds2482_w1_set_pullup(void *dat
|
|
return retval;
|
|
}
|
|
|
|
+static int ds2482_suspend(struct device *dev)
|
|
+{
|
|
+ struct i2c_client *client = to_i2c_client(dev);
|
|
+ struct ds2482_data *data = i2c_get_clientdata(client);
|
|
+
|
|
+ if (data->slpz_gpio >= 0)
|
|
+ gpio_set_value(data->slpz_gpio, 0);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int ds2482_resume(struct device *dev)
|
|
+{
|
|
+ struct i2c_client *client = to_i2c_client(dev);
|
|
+ struct ds2482_data *data = i2c_get_clientdata(client);
|
|
+
|
|
+ if (data->slpz_gpio >= 0)
|
|
+ gpio_set_value(data->slpz_gpio, 1);
|
|
+ return 0;
|
|
+}
|
|
|
|
static int ds2482_probe(struct i2c_client *client,
|
|
const struct i2c_device_id *id)
|
|
{
|
|
struct ds2482_data *data;
|
|
+ struct ds2482_platform_data *pdata;
|
|
int err = -ENODEV;
|
|
int temp1;
|
|
int idx;
|
|
@@ -531,6 +561,16 @@ static int ds2482_probe(struct i2c_clien
|
|
}
|
|
}
|
|
|
|
+ pdata = client->dev.platform_data;
|
|
+ data->slpz_gpio = pdata ? pdata->slpz_gpio : -1;
|
|
+
|
|
+ if (data->slpz_gpio >= 0) {
|
|
+ err = gpio_request_one(data->slpz_gpio, GPIOF_OUT_INIT_HIGH,
|
|
+ "ds2482.slpz");
|
|
+ if (err < 0)
|
|
+ goto exit_w1_remove;
|
|
+ }
|
|
+
|
|
return 0;
|
|
|
|
exit_w1_remove:
|
|
@@ -555,6 +595,11 @@ static int ds2482_remove(struct i2c_clie
|
|
w1_remove_master_device(&data->w1_ch[idx].w1_bm);
|
|
}
|
|
|
|
+ if (data->slpz_gpio >= 0) {
|
|
+ gpio_set_value(data->slpz_gpio, 0);
|
|
+ gpio_free(data->slpz_gpio);
|
|
+ }
|
|
+
|
|
/* Free the memory */
|
|
kfree(data);
|
|
return 0;
|