Commit 946c8432 authored by Bjorn Andersson's avatar Bjorn Andersson Committed by 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: default avatarBjorn Andersson <bjorn.andersson@sonymobile.com>
Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Acked-by: default avatarRob Herring <robh@kernel.org>
Reviewed-by: default avatarAndrew Duggan <aduggan@synaptics.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 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%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment