aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/mouse
diff options
context:
space:
mode:
authorDudley Du <dudl@cypress.com>2015-01-18 01:12:32 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2015-01-18 03:10:31 -0500
commitf50efd06e0d156ba7bdb12898c9c1dc75fc4e199 (patch)
treeafc76addd52bb35b9e55f0ca74de4169091e8bcb /drivers/input/mouse
parent87b26d7288cef960a650015ae13771d44d45d202 (diff)
Input: cyapa - add gen3 trackpad read baseline support
Add read baseline function supported for gen3 trackpad device, it can be used through sysfs baseline interface. Signed-off-by: Dudley Du <dudl@cypress.com> Tested-by: Jeremiah Mahler <jmmahler@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/mouse')
-rw-r--r--drivers/input/mouse/cyapa_gen3.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/drivers/input/mouse/cyapa_gen3.c b/drivers/input/mouse/cyapa_gen3.c
index 214d45afc9f2..6e04e4b08e63 100644
--- a/drivers/input/mouse/cyapa_gen3.c
+++ b/drivers/input/mouse/cyapa_gen3.c
@@ -783,6 +783,76 @@ static int cyapa_gen3_do_fw_update(struct cyapa *cyapa,
783 return 0; 783 return 0;
784} 784}
785 785
786static ssize_t cyapa_gen3_show_baseline(struct device *dev,
787 struct device_attribute *attr, char *buf)
788{
789 struct cyapa *cyapa = dev_get_drvdata(dev);
790 int max_baseline, min_baseline;
791 int tries;
792 int ret;
793
794 ret = cyapa_read_byte(cyapa, CYAPA_CMD_DEV_STATUS);
795 if (ret < 0) {
796 dev_err(dev, "Error reading dev status. err = %d\n", ret);
797 goto out;
798 }
799 if ((ret & CYAPA_DEV_NORMAL) != CYAPA_DEV_NORMAL) {
800 dev_warn(dev, "Trackpad device is busy. device state = 0x%x\n",
801 ret);
802 ret = -EAGAIN;
803 goto out;
804 }
805
806 ret = cyapa_write_byte(cyapa, CYAPA_CMD_SOFT_RESET,
807 OP_REPORT_BASELINE_MASK);
808 if (ret < 0) {
809 dev_err(dev, "Failed to send report baseline command. %d\n",
810 ret);
811 goto out;
812 }
813
814 tries = 3; /* Try for 30 to 60 ms */
815 do {
816 usleep_range(10000, 20000);
817
818 ret = cyapa_read_byte(cyapa, CYAPA_CMD_DEV_STATUS);
819 if (ret < 0) {
820 dev_err(dev, "Error reading dev status. err = %d\n",
821 ret);
822 goto out;
823 }
824 if ((ret & CYAPA_DEV_NORMAL) == CYAPA_DEV_NORMAL)
825 break;
826 } while (--tries);
827
828 if (tries == 0) {
829 dev_err(dev, "Device timed out going to Normal state.\n");
830 ret = -ETIMEDOUT;
831 goto out;
832 }
833
834 ret = cyapa_read_byte(cyapa, CYAPA_CMD_MAX_BASELINE);
835 if (ret < 0) {
836 dev_err(dev, "Failed to read max baseline. err = %d\n", ret);
837 goto out;
838 }
839 max_baseline = ret;
840
841 ret = cyapa_read_byte(cyapa, CYAPA_CMD_MIN_BASELINE);
842 if (ret < 0) {
843 dev_err(dev, "Failed to read min baseline. err = %d\n", ret);
844 goto out;
845 }
846 min_baseline = ret;
847
848 dev_dbg(dev, "Baseline report successful. Max: %d Min: %d\n",
849 max_baseline, min_baseline);
850 ret = scnprintf(buf, PAGE_SIZE, "%d %d\n", max_baseline, min_baseline);
851
852out:
853 return ret;
854}
855
786/* 856/*
787 * cyapa_get_wait_time_for_pwr_cmd 857 * cyapa_get_wait_time_for_pwr_cmd
788 * 858 *
@@ -1104,6 +1174,8 @@ const struct cyapa_dev_ops cyapa_gen3_ops = {
1104 .bl_deactivate = cyapa_gen3_bl_deactivate, 1174 .bl_deactivate = cyapa_gen3_bl_deactivate,
1105 .bl_initiate = cyapa_gen3_bl_initiate, 1175 .bl_initiate = cyapa_gen3_bl_initiate,
1106 1176
1177 .show_baseline = cyapa_gen3_show_baseline,
1178
1107 .initialize = cyapa_gen3_initialize, 1179 .initialize = cyapa_gen3_initialize,
1108 1180
1109 .state_parse = cyapa_gen3_state_parse, 1181 .state_parse = cyapa_gen3_state_parse,