提交 946c8432 编写于 作者: B Bjorn Andersson 提交者: Dmitry Torokhov

Input: synaptics-rmi4 - support regulator supplies

Support the two supplies - vdd and vio - to make it possible to control
power to the Synaptics chip.
Signed-off-by: NBjorn Andersson <bjorn.andersson@sonymobile.com>
Signed-off-by: NBjorn Andersson <bjorn.andersson@linaro.org>
Acked-by: NRob Herring <robh@kernel.org>
Reviewed-by: NAndrew Duggan <aduggan@synaptics.com>
Signed-off-by: NDmitry Torokhov <dmitry.torokhov@gmail.com>
上级 e66475eb
...@@ -22,6 +22,15 @@ See Documentation/devicetree/bindings/interrupt-controller/interrupts.txt ...@@ -22,6 +22,15 @@ See Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
- syna,reset-delay-ms: The number of milliseconds to wait after resetting the - syna,reset-delay-ms: The number of milliseconds to wait after resetting the
device. device.
- syna,startup-delay-ms: The number of milliseconds to wait after powering on
the device.
- vdd-supply: VDD power supply.
See ../regulator/regulator.txt
- vio-supply: VIO power supply
See ../regulator/regulator.txt
Function Parameters: Function Parameters:
Parameters specific to RMI functions are contained in child nodes of the rmi device Parameters specific to RMI functions are contained in child nodes of the rmi device
node. Documentation for the parameters of each function can be found in: node. Documentation for the parameters of each function can be found in:
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include <linux/rmi.h> #include <linux/rmi.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/delay.h>
#include <linux/regulator/consumer.h>
#include "rmi_driver.h" #include "rmi_driver.h"
#define BUFFER_SIZE_INCREMENT 32 #define BUFFER_SIZE_INCREMENT 32
...@@ -37,6 +39,9 @@ struct rmi_i2c_xport { ...@@ -37,6 +39,9 @@ struct rmi_i2c_xport {
u8 *tx_buf; u8 *tx_buf;
size_t tx_buf_size; size_t tx_buf_size;
struct regulator_bulk_data supplies[2];
u32 startup_delay;
}; };
#define RMI_PAGE_SELECT_REGISTER 0xff #define RMI_PAGE_SELECT_REGISTER 0xff
...@@ -246,6 +251,24 @@ static int rmi_i2c_probe(struct i2c_client *client, ...@@ -246,6 +251,24 @@ static int rmi_i2c_probe(struct i2c_client *client,
return -ENODEV; return -ENODEV;
} }
rmi_i2c->supplies[0].supply = "vdd";
rmi_i2c->supplies[1].supply = "vio";
retval = devm_regulator_bulk_get(&client->dev,
ARRAY_SIZE(rmi_i2c->supplies),
rmi_i2c->supplies);
if (retval < 0)
return retval;
retval = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies),
rmi_i2c->supplies);
if (retval < 0)
return retval;
of_property_read_u32(client->dev.of_node, "syna,startup-delay-ms",
&rmi_i2c->startup_delay);
msleep(rmi_i2c->startup_delay);
rmi_i2c->client = client; rmi_i2c->client = client;
mutex_init(&rmi_i2c->page_mutex); mutex_init(&rmi_i2c->page_mutex);
...@@ -286,6 +309,8 @@ static int rmi_i2c_remove(struct i2c_client *client) ...@@ -286,6 +309,8 @@ static int rmi_i2c_remove(struct i2c_client *client)
struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client);
rmi_unregister_transport_device(&rmi_i2c->xport); rmi_unregister_transport_device(&rmi_i2c->xport);
regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies),
rmi_i2c->supplies);
return 0; return 0;
} }
...@@ -308,6 +333,10 @@ static int rmi_i2c_suspend(struct device *dev) ...@@ -308,6 +333,10 @@ static int rmi_i2c_suspend(struct device *dev)
dev_warn(dev, "Failed to enable irq for wake: %d\n", dev_warn(dev, "Failed to enable irq for wake: %d\n",
ret); ret);
} }
regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies),
rmi_i2c->supplies);
return ret; return ret;
} }
...@@ -317,6 +346,13 @@ static int rmi_i2c_resume(struct device *dev) ...@@ -317,6 +346,13 @@ static int rmi_i2c_resume(struct device *dev)
struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client);
int ret; int ret;
ret = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies),
rmi_i2c->supplies);
if (ret)
return ret;
msleep(rmi_i2c->startup_delay);
enable_irq(rmi_i2c->irq); enable_irq(rmi_i2c->irq);
if (device_may_wakeup(&client->dev)) { if (device_may_wakeup(&client->dev)) {
ret = disable_irq_wake(rmi_i2c->irq); ret = disable_irq_wake(rmi_i2c->irq);
...@@ -346,6 +382,9 @@ static int rmi_i2c_runtime_suspend(struct device *dev) ...@@ -346,6 +382,9 @@ static int rmi_i2c_runtime_suspend(struct device *dev)
disable_irq(rmi_i2c->irq); disable_irq(rmi_i2c->irq);
regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies),
rmi_i2c->supplies);
return 0; return 0;
} }
...@@ -355,6 +394,13 @@ static int rmi_i2c_runtime_resume(struct device *dev) ...@@ -355,6 +394,13 @@ static int rmi_i2c_runtime_resume(struct device *dev)
struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client);
int ret; int ret;
ret = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies),
rmi_i2c->supplies);
if (ret)
return ret;
msleep(rmi_i2c->startup_delay);
enable_irq(rmi_i2c->irq); enable_irq(rmi_i2c->irq);
ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev); ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册