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: Bjorn Andersson <bjorn.andersson@sonymobile.com>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Acked-by: Rob Herring <robh@kernel.org>
Reviewed-by: Andrew Duggan <aduggan@synaptics.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
Bjorn Andersson 2016-07-13 17:15:38 -07:00 коммит произвёл Dmitry Torokhov
Родитель e66475eb97
Коммит 946c8432aa
2 изменённых файлов: 55 добавлений и 0 удалений

Просмотреть файл

@ -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 @@
#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 {
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,
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)
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)
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)
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)
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)
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);