Hi, On 12/21/22 23:07, Hans de Goede wrote: > Use KE_VSW instead of KE_SW for the SW_CAMERA_LENS_COVER key_entry > and get the value of the switch from the status field when handling > SW_CAMERA_LENS_COVER events, instead of always reporting 0. > > Also correctly set the initial SW_CAMERA_LENS_COVER value. > > Fixes: 8af9fa37b8a3 ("platform/x86: dell-privacy: Add support for Dell hardware privacy") > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> I've added this series to my review-hans (soon to be fixes) branch now. Regards, Hans > --- > drivers/platform/x86/dell/dell-wmi-privacy.c | 22 ++++++++++++++------ > 1 file changed, 16 insertions(+), 6 deletions(-) > > diff --git a/drivers/platform/x86/dell/dell-wmi-privacy.c b/drivers/platform/x86/dell/dell-wmi-privacy.c > index c82b3d6867c5..915d5deeb971 100644 > --- a/drivers/platform/x86/dell/dell-wmi-privacy.c > +++ b/drivers/platform/x86/dell/dell-wmi-privacy.c > @@ -61,7 +61,7 @@ static const struct key_entry dell_wmi_keymap_type_0012[] = { > /* privacy mic mute */ > { KE_KEY, 0x0001, { KEY_MICMUTE } }, > /* privacy camera mute */ > - { KE_SW, 0x0002, { SW_CAMERA_LENS_COVER } }, > + { KE_VSW, 0x0002, { SW_CAMERA_LENS_COVER } }, > { KE_END, 0}, > }; > > @@ -115,11 +115,15 @@ bool dell_privacy_process_event(int type, int code, int status) > > switch (code) { > case DELL_PRIVACY_AUDIO_EVENT: /* Mic mute */ > - case DELL_PRIVACY_CAMERA_EVENT: /* Camera mute */ > priv->last_status = status; > sparse_keymap_report_entry(priv->input_dev, key, 1, true); > ret = true; > break; > + case DELL_PRIVACY_CAMERA_EVENT: /* Camera mute */ > + priv->last_status = status; > + sparse_keymap_report_entry(priv->input_dev, key, !(status & CAMERA_STATUS), false); > + ret = true; > + break; > default: > dev_dbg(&priv->wdev->dev, "unknown event type 0x%04x 0x%04x\n", type, code); > } > @@ -304,6 +308,11 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context) > > dev_set_drvdata(&wdev->dev, priv); > priv->wdev = wdev; > + > + ret = get_current_status(priv->wdev); > + if (ret) > + return ret; > + > /* create evdev passing interface */ > priv->input_dev = devm_input_allocate_device(&wdev->dev); > if (!priv->input_dev) > @@ -331,11 +340,12 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context) > priv->input_dev->name = "Dell Privacy Driver"; > priv->input_dev->id.bustype = BUS_HOST; > > - ret = input_register_device(priv->input_dev); > - if (ret) > - return ret; > + /* Report initial camera-cover status */ > + if (priv->features_present & BIT(DELL_PRIVACY_TYPE_CAMERA)) > + input_report_switch(priv->input_dev, SW_CAMERA_LENS_COVER, > + !(priv->last_status & CAMERA_STATUS)); > > - ret = get_current_status(priv->wdev); > + ret = input_register_device(priv->input_dev); > if (ret) > return ret; >