From: Vicki Pfau <vi@endrift.com>
To: linux-input@vger.kernel.org
Cc: Roderick Colenbrander <roderick.colenbrander@sony.com>,
Jiri Kosina <jikos@kernel.org>,
Benjamin Tissoires <benjamin.tissoires@redhat.com>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Vicki Pfau <vi@endrift.com>
Subject: [PATCH 1/6] HID: hid-playstation: Allow removal of touchpad
Date: Wed, 27 Apr 2022 15:45:21 -0700 [thread overview]
Message-ID: <20220427224526.35657-1-vi@endrift.com> (raw)
This allows the touchpad input_dev to be removed and have the driver remain
functional without its presence. This will be used to allow the touchpad to
be disabled, e.g. by a module parameter.
Signed-off-by: Vicki Pfau <vi@endrift.com>
---
drivers/hid/hid-playstation.c | 60 +++++++++++++++++++++++++----------
1 file changed, 43 insertions(+), 17 deletions(-)
diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
index ab7c82c2e886..f859a8dd8a2e 100644
--- a/drivers/hid/hid-playstation.c
+++ b/drivers/hid/hid-playstation.c
@@ -29,6 +29,7 @@ static DEFINE_IDA(ps_player_id_allocator);
struct ps_device {
struct list_head list;
struct hid_device *hdev;
+ struct mutex mutex;
spinlock_t lock;
uint32_t player_id;
@@ -130,7 +131,7 @@ struct dualsense {
struct ps_device base;
struct input_dev *gamepad;
struct input_dev *sensors;
- struct input_dev *touchpad;
+ struct input_dev __rcu *touchpad;
/* Calibration data for accelerometer and gyroscope. */
struct ps_calibration_data accel_calib_data[3];
@@ -590,6 +591,22 @@ static struct input_dev *ps_touchpad_create(struct hid_device *hdev, int width,
return touchpad;
}
+static void dualsense_unregister_touchpad(struct dualsense *ds)
+{
+ struct input_dev *touchpad;
+
+ rcu_read_lock();
+ touchpad = rcu_dereference(ds->touchpad);
+ rcu_read_unlock();
+
+ if (!touchpad)
+ return;
+
+ RCU_INIT_POINTER(ds->touchpad, NULL);
+ synchronize_rcu();
+ input_unregister_device(touchpad);
+}
+
static ssize_t firmware_version_show(struct device *dev,
struct device_attribute
*attr, char *buf)
@@ -888,6 +905,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r
struct hid_device *hdev = ps_dev->hdev;
struct dualsense *ds = container_of(ps_dev, struct dualsense, base);
struct dualsense_input_report *ds_report;
+ struct input_dev *touchpad = NULL;
uint8_t battery_data, battery_capacity, charging_status, value;
int battery_status;
uint32_t sensor_timestamp;
@@ -1002,24 +1020,29 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r
input_event(ds->sensors, EV_MSC, MSC_TIMESTAMP, ds->sensor_timestamp_us);
input_sync(ds->sensors);
- for (i = 0; i < ARRAY_SIZE(ds_report->points); i++) {
- struct dualsense_touch_point *point = &ds_report->points[i];
- bool active = (point->contact & DS_TOUCH_POINT_INACTIVE) ? false : true;
+ rcu_read_lock();
+ touchpad = rcu_dereference(ds->touchpad);
+ rcu_read_unlock();
+ if (touchpad) {
+ for (i = 0; i < ARRAY_SIZE(ds_report->points); i++) {
+ struct dualsense_touch_point *point = &ds_report->points[i];
+ bool active = (point->contact & DS_TOUCH_POINT_INACTIVE) ? false : true;
- input_mt_slot(ds->touchpad, i);
- input_mt_report_slot_state(ds->touchpad, MT_TOOL_FINGER, active);
+ input_mt_slot(ds->touchpad, i);
+ input_mt_report_slot_state(ds->touchpad, MT_TOOL_FINGER, active);
- if (active) {
- int x = (point->x_hi << 8) | point->x_lo;
- int y = (point->y_hi << 4) | point->y_lo;
+ if (active) {
+ int x = (point->x_hi << 8) | point->x_lo;
+ int y = (point->y_hi << 4) | point->y_lo;
- input_report_abs(ds->touchpad, ABS_MT_POSITION_X, x);
- input_report_abs(ds->touchpad, ABS_MT_POSITION_Y, y);
+ input_report_abs(ds->touchpad, ABS_MT_POSITION_X, x);
+ input_report_abs(ds->touchpad, ABS_MT_POSITION_Y, y);
+ }
}
+ input_mt_sync_frame(ds->touchpad);
+ input_report_key(ds->touchpad, BTN_LEFT, ds_report->buttons[2] & DS_BUTTONS2_TOUCHPAD);
+ input_sync(ds->touchpad);
}
- input_mt_sync_frame(ds->touchpad);
- input_report_key(ds->touchpad, BTN_LEFT, ds_report->buttons[2] & DS_BUTTONS2_TOUCHPAD);
- input_sync(ds->touchpad);
battery_data = ds_report->status & DS_STATUS_BATTERY_CAPACITY;
charging_status = (ds_report->status & DS_STATUS_CHARGING) >> DS_STATUS_CHARGING_SHIFT;
@@ -1141,6 +1164,7 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
{
struct dualsense *ds;
struct ps_device *ps_dev;
+ struct input_dev *touchpad;
uint8_t max_output_report_size;
int ret;
@@ -1157,6 +1181,7 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
ps_dev = &ds->base;
ps_dev->hdev = hdev;
spin_lock_init(&ps_dev->lock);
+ mutex_init(&ps_dev->mutex);
ps_dev->battery_capacity = 100; /* initial value until parse_report. */
ps_dev->battery_status = POWER_SUPPLY_STATUS_UNKNOWN;
ps_dev->parse_report = dualsense_parse_report;
@@ -1204,11 +1229,12 @@ static struct ps_device *dualsense_create(struct hid_device *hdev)
goto err;
}
- ds->touchpad = ps_touchpad_create(hdev, DS_TOUCHPAD_WIDTH, DS_TOUCHPAD_HEIGHT, 2);
- if (IS_ERR(ds->touchpad)) {
- ret = PTR_ERR(ds->touchpad);
+ touchpad = ps_touchpad_create(hdev, DS_TOUCHPAD_WIDTH, DS_TOUCHPAD_HEIGHT, 2);
+ if (IS_ERR(touchpad)) {
+ ret = PTR_ERR(touchpad);
goto err;
}
+ rcu_assign_pointer(ds->touchpad, touchpad);
ret = ps_device_register_battery(ps_dev);
if (ret)
--
2.36.0
next reply other threads:[~2022-04-27 22:46 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-27 22:45 Vicki Pfau [this message]
2022-04-27 22:45 ` [PATCH 2/6] HID: hid-playstation: Add touchpad_mouse param Vicki Pfau
2022-05-05 8:52 ` Benjamin Tissoires
2022-05-05 22:00 ` Vicki Pfau
2022-04-27 22:45 ` [PATCH 3/6] HID: hid-playstation: Disable touchpad reporting when hidraw open Vicki Pfau
2022-05-05 8:57 ` Benjamin Tissoires
2022-05-05 22:03 ` Vicki Pfau
2022-05-06 6:00 ` Roderick Colenbrander
2022-05-06 6:54 ` Benjamin Tissoires
2022-05-06 6:57 ` Benjamin Tissoires
2022-04-27 22:45 ` [PATCH 4/6] HID: hid-sony: Allow removal of touchpad Vicki Pfau
2022-04-27 22:45 ` [PATCH 5/6] HID: hid-sony: Add touchpad_mouse param Vicki Pfau
2022-04-27 22:45 ` [PATCH 6/6] HID: hid-sony: Disable touchpad reporting when hidraw open Vicki Pfau
2022-05-05 8:50 ` [PATCH 1/6] HID: hid-playstation: Allow removal of touchpad Benjamin Tissoires
2022-05-05 16:55 ` Dmitry Torokhov
2022-05-06 5:21 ` Roderick Colenbrander
2022-05-06 6:46 ` Vicki Pfau
2022-05-06 6:59 ` Roderick Colenbrander
2022-05-06 8:23 ` Benjamin Tissoires
2022-05-05 21:57 ` Vicki Pfau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220427224526.35657-1-vi@endrift.com \
--to=vi@endrift.com \
--cc=benjamin.tissoires@redhat.com \
--cc=dmitry.torokhov@gmail.com \
--cc=jikos@kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=roderick.colenbrander@sony.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).