diff options
| author | Subbaraman Narayanamurthy <subbaram@codeaurora.org> | 2017-03-07 19:26:14 -0800 |
|---|---|---|
| committer | Subbaraman Narayanamurthy <subbaram@codeaurora.org> | 2017-03-09 20:03:05 -0800 |
| commit | 0ed3b2e19dc9d3d7067cd3af67bc51b061ed8049 (patch) | |
| tree | 53bd084699d811813901fb43a53ab3f0bca31606 /drivers/misc | |
| parent | b8b4bc2271ff9e72eeac7f113b0ffc823e83e120 (diff) | |
misc: qpnp-misc: add support for clients to read register from misc device
On certain PMICs, PMIC peripheral drivers like haptics need to
read MISC peripheral register. Add support for clients to read
it by using qpnp_misc_read_reg().
Change-Id: Id5dfd9e440a8861b56572dab50839d1583535882
Signed-off-by: Subbaraman Narayanamurthy <subbaram@codeaurora.org>
Diffstat (limited to 'drivers/misc')
| -rw-r--r-- | drivers/misc/qpnp-misc.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/misc/qpnp-misc.c b/drivers/misc/qpnp-misc.c index adf9eccda736..8f244811f740 100644 --- a/drivers/misc/qpnp-misc.c +++ b/drivers/misc/qpnp-misc.c @@ -130,6 +130,47 @@ static bool __misc_irqs_available(struct qpnp_misc_dev *dev) return 1; } +int qpnp_misc_read_reg(struct device_node *node, u16 addr, u8 *val) +{ + struct qpnp_misc_dev *mdev = NULL; + struct qpnp_misc_dev *mdev_found = NULL; + int rc; + u8 temp; + + if (IS_ERR_OR_NULL(node)) { + pr_err("Invalid device node pointer\n"); + return -EINVAL; + } + + mutex_lock(&qpnp_misc_dev_list_mutex); + list_for_each_entry(mdev, &qpnp_misc_dev_list, list) { + if (mdev->dev->of_node == node) { + mdev_found = mdev; + break; + } + } + mutex_unlock(&qpnp_misc_dev_list_mutex); + + if (!mdev_found) { + /* + * No MISC device was found. This API should only + * be called by drivers which have specified the + * misc phandle in their device tree node. + */ + pr_err("no probed misc device found\n"); + return -EPROBE_DEFER; + } + + rc = qpnp_read_byte(mdev, addr, &temp); + if (rc < 0) { + dev_err(mdev->dev, "Failed to read addr %x, rc=%d\n", addr, rc); + return rc; + } + + *val = temp; + return 0; +} + int qpnp_misc_irqs_available(struct device *consumer_dev) { struct device_node *misc_node = NULL; |
