diff options
author | Maximilian Luz <luzmaximilian@gmail.com> | 2023-03-04 20:46:10 +0100 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2023-03-16 14:43:30 +0100 |
commit | 37ff64cd81ff0abbe901fd4cf401998d534c1cd7 (patch) | |
tree | afed3492e7e026945ec1235b9ecd59c7536695a3 /drivers/platform/surface/surface_aggregator_tabletsw.c | |
parent | platform/surface: aggregator_tabletsw: Properly handle different posture sour... (diff) | |
download | linux-37ff64cd81ff0abbe901fd4cf401998d534c1cd7.tar.xz linux-37ff64cd81ff0abbe901fd4cf401998d534c1cd7.zip |
platform/surface: aggregator_tabletsw: Add support for Type-Cover posture source
Implement support for the Type-Cover posture source (ID 0x00), found on
the Surface Pro 9.
Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
Link: https://lore.kernel.org/r/20230304194611.87770-3-luzmaximilian@gmail.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'drivers/platform/surface/surface_aggregator_tabletsw.c')
-rw-r--r-- | drivers/platform/surface/surface_aggregator_tabletsw.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/drivers/platform/surface/surface_aggregator_tabletsw.c b/drivers/platform/surface/surface_aggregator_tabletsw.c index e8682f52558f..8f52b62d1c19 100644 --- a/drivers/platform/surface/surface_aggregator_tabletsw.c +++ b/drivers/platform/surface/surface_aggregator_tabletsw.c @@ -325,9 +325,18 @@ MODULE_PARM_DESC(tablet_mode_in_slate_state, "Enable tablet mode in slate device #define SSAM_POS_MAX_SOURCES 4 enum ssam_pos_source_id { + SSAM_POS_SOURCE_COVER = 0x00, SSAM_POS_SOURCE_SLS = 0x03, }; +enum ssam_pos_state_cover { + SSAM_POS_COVER_DISCONNECTED = 0x01, + SSAM_POS_COVER_CLOSED = 0x02, + SSAM_POS_COVER_LAPTOP = 0x03, + SSAM_POS_COVER_FOLDED_CANVAS = 0x04, + SSAM_POS_COVER_FOLDED_BACK = 0x05, +}; + enum ssam_pos_state_sls { SSAM_POS_SLS_LID_CLOSED = 0x00, SSAM_POS_SLS_LAPTOP = 0x01, @@ -340,6 +349,30 @@ struct ssam_sources_list { __le32 id[SSAM_POS_MAX_SOURCES]; } __packed; +static const char *ssam_pos_state_name_cover(struct ssam_tablet_sw *sw, u32 state) +{ + switch (state) { + case SSAM_POS_COVER_DISCONNECTED: + return "disconnected"; + + case SSAM_POS_COVER_CLOSED: + return "closed"; + + case SSAM_POS_COVER_LAPTOP: + return "laptop"; + + case SSAM_POS_COVER_FOLDED_CANVAS: + return "folded-canvas"; + + case SSAM_POS_COVER_FOLDED_BACK: + return "folded-back"; + + default: + dev_warn(&sw->sdev->dev, "unknown device posture for type-cover: %u\n", state); + return "<unknown>"; + } +} + static const char *ssam_pos_state_name_sls(struct ssam_tablet_sw *sw, u32 state) { switch (state) { @@ -365,6 +398,9 @@ static const char *ssam_pos_state_name(struct ssam_tablet_sw *sw, const struct ssam_tablet_sw_state *state) { switch (state->source) { + case SSAM_POS_SOURCE_COVER: + return ssam_pos_state_name_cover(sw, state->state); + case SSAM_POS_SOURCE_SLS: return ssam_pos_state_name_sls(sw, state->state); @@ -374,6 +410,24 @@ static const char *ssam_pos_state_name(struct ssam_tablet_sw *sw, } } +static bool ssam_pos_state_is_tablet_mode_cover(struct ssam_tablet_sw *sw, u32 state) +{ + switch (state) { + case SSAM_POS_COVER_DISCONNECTED: + case SSAM_POS_COVER_FOLDED_CANVAS: + case SSAM_POS_COVER_FOLDED_BACK: + return true; + + case SSAM_POS_COVER_CLOSED: + case SSAM_POS_COVER_LAPTOP: + return false; + + default: + dev_warn(&sw->sdev->dev, "unknown device posture for type-cover: %u\n", state); + return true; + } +} + static bool ssam_pos_state_is_tablet_mode_sls(struct ssam_tablet_sw *sw, u32 state) { switch (state) { @@ -397,6 +451,9 @@ static bool ssam_pos_state_is_tablet_mode(struct ssam_tablet_sw *sw, const struct ssam_tablet_sw_state *state) { switch (state->source) { + case SSAM_POS_SOURCE_COVER: + return ssam_pos_state_is_tablet_mode_cover(sw, state->state); + case SSAM_POS_SOURCE_SLS: return ssam_pos_state_is_tablet_mode_sls(sw, state->state); |