diff options
author | Andrew Duggan <aduggan@synaptics.com> | 2015-02-24 20:36:48 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2015-02-25 09:26:43 -0500 |
commit | dd8df28459dcad4da5dec94d12801b149a895c36 (patch) | |
tree | d224df49510eb6500bdc6c675c64c5a446f0767d | |
parent | 70e003f75fab6c1496147838acf59be85d2520c0 (diff) |
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>
-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) | |||
274 | return rmi_read_block(hdev, addr, buf, 1); | 274 | return rmi_read_block(hdev, addr, buf, 1); |
275 | } | 275 | } |
276 | 276 | ||
277 | static int rmi_write_block(struct hid_device *hdev, u16 addr, void *buf, | ||
278 | const int len) | ||
279 | { | ||
280 | struct rmi_data *data = hid_get_drvdata(hdev); | ||
281 | int ret; | ||
282 | |||
283 | mutex_lock(&data->page_mutex); | ||
284 | |||
285 | if (RMI_PAGE(addr) != data->page) { | ||
286 | ret = rmi_set_page(hdev, RMI_PAGE(addr)); | ||
287 | if (ret < 0) | ||
288 | goto exit; | ||
289 | } | ||
290 | |||
291 | data->writeReport[0] = RMI_WRITE_REPORT_ID; | ||
292 | data->writeReport[1] = len; | ||
293 | data->writeReport[2] = addr & 0xFF; | ||
294 | data->writeReport[3] = (addr >> 8) & 0xFF; | ||
295 | memcpy(&data->writeReport[4], buf, len); | ||
296 | |||
297 | ret = rmi_write_report(hdev, data->writeReport, | ||
298 | data->output_report_size); | ||
299 | if (ret < 0) { | ||
300 | dev_err(&hdev->dev, | ||
301 | "failed to write request output report (%d)\n", | ||
302 | ret); | ||
303 | goto exit; | ||
304 | } | ||
305 | ret = 0; | ||
306 | |||
307 | exit: | ||
308 | mutex_unlock(&data->page_mutex); | ||
309 | return ret; | ||
310 | } | ||
311 | |||
312 | static inline int rmi_write(struct hid_device *hdev, u16 addr, void *buf) | ||
313 | { | ||
314 | return rmi_write_block(hdev, addr, buf, 1); | ||
315 | } | ||
316 | |||
277 | static void rmi_f11_process_touch(struct rmi_data *hdata, int slot, | 317 | static void rmi_f11_process_touch(struct rmi_data *hdata, int slot, |
278 | u8 finger_state, u8 *touch_data) | 318 | u8 finger_state, u8 *touch_data) |
279 | { | 319 | { |