Skip to content

Commit e3cb0ac

Browse files
lentinjJiri Kosina
authored andcommitted
HID: lenovo: Add sensitivity control to compact keyboards
The trackpoint sensitivity can also be controlled, expose this via sysfs. Signed-off-by: Jamie Lentin <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent 0349678 commit e3cb0ac

File tree

1 file changed

+41
-1
lines changed

1 file changed

+41
-1
lines changed

drivers/hid/hid-lenovo.c

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct lenovo_drvdata_tpkbd {
3838

3939
struct lenovo_drvdata_cptkbd {
4040
bool fn_lock;
41+
int sensitivity;
4142
};
4243

4344
#define map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
@@ -145,6 +146,7 @@ static void lenovo_features_set_cptkbd(struct hid_device *hdev)
145146
struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
146147

147148
ret = lenovo_send_cmd_cptkbd(hdev, 0x05, cptkbd_data->fn_lock);
149+
ret = lenovo_send_cmd_cptkbd(hdev, 0x02, cptkbd_data->sensitivity);
148150
if (ret)
149151
hid_err(hdev, "Fn-lock setting failed: %d\n", ret);
150152
}
@@ -179,13 +181,50 @@ static ssize_t attr_fn_lock_store_cptkbd(struct device *dev,
179181
return count;
180182
}
181183

184+
static ssize_t attr_sensitivity_show_cptkbd(struct device *dev,
185+
struct device_attribute *attr,
186+
char *buf)
187+
{
188+
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
189+
struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
190+
191+
return snprintf(buf, PAGE_SIZE, "%u\n",
192+
cptkbd_data->sensitivity);
193+
}
194+
195+
static ssize_t attr_sensitivity_store_cptkbd(struct device *dev,
196+
struct device_attribute *attr,
197+
const char *buf,
198+
size_t count)
199+
{
200+
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
201+
struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
202+
int value;
203+
204+
if (kstrtoint(buf, 10, &value) || value < 1 || value > 255)
205+
return -EINVAL;
206+
207+
cptkbd_data->sensitivity = value;
208+
lenovo_features_set_cptkbd(hdev);
209+
210+
return count;
211+
}
212+
213+
182214
static struct device_attribute dev_attr_fn_lock_cptkbd =
183215
__ATTR(fn_lock, S_IWUSR | S_IRUGO,
184216
attr_fn_lock_show_cptkbd,
185217
attr_fn_lock_store_cptkbd);
186218

219+
static struct device_attribute dev_attr_sensitivity_cptkbd =
220+
__ATTR(sensitivity, S_IWUSR | S_IRUGO,
221+
attr_sensitivity_show_cptkbd,
222+
attr_sensitivity_store_cptkbd);
223+
224+
187225
static struct attribute *lenovo_attributes_cptkbd[] = {
188226
&dev_attr_fn_lock_cptkbd.attr,
227+
&dev_attr_sensitivity_cptkbd.attr,
189228
NULL
190229
};
191230

@@ -594,8 +633,9 @@ static int lenovo_probe_cptkbd(struct hid_device *hdev)
594633
if (ret)
595634
hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret);
596635

597-
/* Turn Fn-Lock on by default */
636+
/* Set keyboard settings to known state */
598637
cptkbd_data->fn_lock = true;
638+
cptkbd_data->sensitivity = 0x05;
599639
lenovo_features_set_cptkbd(hdev);
600640

601641
ret = sysfs_create_group(&hdev->dev.kobj, &lenovo_attr_group_cptkbd);

0 commit comments

Comments
 (0)