diff options
author | Andrew Duggan <aduggan@synaptics.com> | 2015-02-24 17:36:48 -0800 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2015-02-25 15:26:43 +0100 |
commit | dd8df28459dcad4da5dec94d12801b149a895c36 (patch) | |
tree | d224df49510eb6500bdc6c675c64c5a446f0767d /drivers/hid/hid-rmi.c | |
parent | 70e003f75fab6c1496147838acf59be85d2520c0 (diff) | |
download | lwn-dd8df28459dcad4da5dec94d12801b149a895c36.tar.gz lwn-dd8df28459dcad4da5dec94d12801b149a895c36.zip |
HID: rmi: Add functions for writing to registers
Writing to registers is needed for setting configuration parameters.
Signed-off-by: Andrew Duggan <aduggan@synaptics.com>
Tested-by: Gabriele Mazzotta <gabriele.mzt@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-rmi.c')
-rw-r--r-- | drivers/hid/hid-rmi.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c index 28579d783155..e2a43a1d3aa3 100644 --- a/drivers/hid/hid-rmi.c +++ b/drivers/hid/hid-rmi.c @@ -274,6 +274,46 @@ static inline int rmi_read(struct hid_device *hdev, u16 addr, void *buf) return rmi_read_block(hdev, addr, buf, 1); } +static int rmi_write_block(struct hid_device *hdev, u16 addr, void *buf, + const int len) +{ + struct rmi_data *data = hid_get_drvdata(hdev); + int ret; + + mutex_lock(&data->page_mutex); + + if (RMI_PAGE(addr) != data->page) { + ret = rmi_set_page(hdev, RMI_PAGE(addr)); + if (ret < 0) + goto exit; + } + + data->writeReport[0] = RMI_WRITE_REPORT_ID; + data->writeReport[1] = len; + data->writeReport[2] = addr & 0xFF; + data->writeReport[3] = (addr >> 8) & 0xFF; + memcpy(&data->writeReport[4], buf, len); + + ret = rmi_write_report(hdev, data->writeReport, + data->output_report_size); + if (ret < 0) { + dev_err(&hdev->dev, + "failed to write request output report (%d)\n", + ret); + goto exit; + } + ret = 0; + +exit: + mutex_unlock(&data->page_mutex); + return ret; +} + +static inline int rmi_write(struct hid_device *hdev, u16 addr, void *buf) +{ + return rmi_write_block(hdev, addr, buf, 1); +} + static void rmi_f11_process_touch(struct rmi_data *hdata, int slot, u8 finger_state, u8 *touch_data) { |