Commit 0d0833e0 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'platform-drivers-x86-v6.2-2' of...

Merge tag 'platform-drivers-x86-v6.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86

Pull x86 platform driver fixes from Hans de Goede:
 "A set of assorted fixes and hardware-id additions"

* tag 'platform-drivers-x86-v6.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86:
  platform/x86: thinkpad_acpi: Fix profile mode display in AMT mode
  platform/x86: int3472/discrete: Ensure the clk/power enable pins are in output mode
  platform/x86/amd: Fix refcount leak in amd_pmc_probe
  platform/x86: intel/pmc/core: Add Meteor Lake mobile support
  platform/x86: simatic-ipc: add another model
  platform/x86: simatic-ipc: correct name of a model
  platform/x86: dell-privacy: Only register SW_CAMERA_LENS_COVER if present
  platform/x86: dell-privacy: Fix SW_CAMERA_LENS_COVER reporting
  platform/x86: asus-wmi: Don't load fan curves without fan
  platform/x86: asus-wmi: Ignore fan on E410MA
  platform/x86: asus-wmi: Add quirk wmi_ignore_fan
  platform/x86: asus-nb-wmi: Add alternate mapping for KEY_SCREENLOCK
  platform/x86: asus-nb-wmi: Add alternate mapping for KEY_CAMERA
  platform/surface: aggregator: Add missing call to ssam_request_sync_free()
  platform/surface: aggregator: Ignore command messages not intended for us
  platform/x86: touchscreen_dmi: Add info for the CSL Panther Tab HD
  platform/x86: ideapad-laptop: Add Legion 5 15ARH05 DMI id to set_fn_lock_led_list[]
  platform/x86: sony-laptop: Don't turn off 0x153 keyboard backlight during probe
parents ff5ebafd fde5f74c
...@@ -1700,8 +1700,10 @@ int ssam_request_sync(struct ssam_controller *ctrl, ...@@ -1700,8 +1700,10 @@ int ssam_request_sync(struct ssam_controller *ctrl,
return status; return status;
status = ssam_request_sync_init(rqst, spec->flags); status = ssam_request_sync_init(rqst, spec->flags);
if (status) if (status) {
ssam_request_sync_free(rqst);
return status; return status;
}
ssam_request_sync_set_resp(rqst, rsp); ssam_request_sync_set_resp(rqst, rsp);
......
...@@ -916,6 +916,20 @@ static void ssh_rtl_rx_command(struct ssh_ptl *p, const struct ssam_span *data) ...@@ -916,6 +916,20 @@ static void ssh_rtl_rx_command(struct ssh_ptl *p, const struct ssam_span *data)
if (sshp_parse_command(dev, data, &command, &command_data)) if (sshp_parse_command(dev, data, &command, &command_data))
return; return;
/*
* Check if the message was intended for us. If not, drop it.
*
* Note: We will need to change this to handle debug messages. On newer
* generation devices, these seem to be sent to tid_out=0x03. We as
* host can still receive them as they can be forwarded via an override
* option on SAM, but doing so does not change tid_out=0x00.
*/
if (command->tid_out != 0x00) {
rtl_warn(rtl, "rtl: dropping message not intended for us (tid = %#04x)\n",
command->tid_out);
return;
}
if (ssh_rqid_is_event(get_unaligned_le16(&command->rqid))) if (ssh_rqid_is_event(get_unaligned_le16(&command->rqid)))
ssh_rtl_rx_event(rtl, command, &command_data); ssh_rtl_rx_event(rtl, command, &command_data);
else else
......
...@@ -932,7 +932,7 @@ static int amd_pmc_probe(struct platform_device *pdev) ...@@ -932,7 +932,7 @@ static int amd_pmc_probe(struct platform_device *pdev)
if (enable_stb && (dev->cpu_id == AMD_CPU_ID_YC || dev->cpu_id == AMD_CPU_ID_CB)) { if (enable_stb && (dev->cpu_id == AMD_CPU_ID_YC || dev->cpu_id == AMD_CPU_ID_CB)) {
err = amd_pmc_s2d_init(dev); err = amd_pmc_s2d_init(dev);
if (err) if (err)
return err; goto err_pci_dev_put;
} }
platform_set_drvdata(pdev, dev); platform_set_drvdata(pdev, dev);
......
...@@ -121,6 +121,10 @@ static struct quirk_entry quirk_asus_tablet_mode = { ...@@ -121,6 +121,10 @@ static struct quirk_entry quirk_asus_tablet_mode = {
.tablet_switch_mode = asus_wmi_lid_flip_rog_devid, .tablet_switch_mode = asus_wmi_lid_flip_rog_devid,
}; };
static struct quirk_entry quirk_asus_ignore_fan = {
.wmi_ignore_fan = true,
};
static int dmi_matched(const struct dmi_system_id *dmi) static int dmi_matched(const struct dmi_system_id *dmi)
{ {
pr_info("Identified laptop model '%s'\n", dmi->ident); pr_info("Identified laptop model '%s'\n", dmi->ident);
...@@ -473,6 +477,15 @@ static const struct dmi_system_id asus_quirks[] = { ...@@ -473,6 +477,15 @@ static const struct dmi_system_id asus_quirks[] = {
}, },
.driver_data = &quirk_asus_tablet_mode, .driver_data = &quirk_asus_tablet_mode,
}, },
{
.callback = dmi_matched,
.ident = "ASUS VivoBook E410MA",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_PRODUCT_NAME, "E410MA"),
},
.driver_data = &quirk_asus_ignore_fan,
},
{}, {},
}; };
...@@ -511,6 +524,7 @@ static const struct key_entry asus_nb_wmi_keymap[] = { ...@@ -511,6 +524,7 @@ static const struct key_entry asus_nb_wmi_keymap[] = {
{ KE_KEY, 0x30, { KEY_VOLUMEUP } }, { KE_KEY, 0x30, { KEY_VOLUMEUP } },
{ KE_KEY, 0x31, { KEY_VOLUMEDOWN } }, { KE_KEY, 0x31, { KEY_VOLUMEDOWN } },
{ KE_KEY, 0x32, { KEY_MUTE } }, { KE_KEY, 0x32, { KEY_MUTE } },
{ KE_KEY, 0x33, { KEY_SCREENLOCK } },
{ KE_KEY, 0x35, { KEY_SCREENLOCK } }, { KE_KEY, 0x35, { KEY_SCREENLOCK } },
{ KE_KEY, 0x38, { KEY_PROG3 } }, /* Armoury Crate */ { KE_KEY, 0x38, { KEY_PROG3 } }, /* Armoury Crate */
{ KE_KEY, 0x40, { KEY_PREVIOUSSONG } }, { KE_KEY, 0x40, { KEY_PREVIOUSSONG } },
...@@ -544,6 +558,7 @@ static const struct key_entry asus_nb_wmi_keymap[] = { ...@@ -544,6 +558,7 @@ static const struct key_entry asus_nb_wmi_keymap[] = {
{ KE_KEY, 0x7D, { KEY_BLUETOOTH } }, /* Bluetooth Enable */ { KE_KEY, 0x7D, { KEY_BLUETOOTH } }, /* Bluetooth Enable */
{ KE_KEY, 0x7E, { KEY_BLUETOOTH } }, /* Bluetooth Disable */ { KE_KEY, 0x7E, { KEY_BLUETOOTH } }, /* Bluetooth Disable */
{ KE_KEY, 0x82, { KEY_CAMERA } }, { KE_KEY, 0x82, { KEY_CAMERA } },
{ KE_KEY, 0x85, { KEY_CAMERA } },
{ KE_KEY, 0x86, { KEY_PROG1 } }, /* MyASUS Key */ { KE_KEY, 0x86, { KEY_PROG1 } }, /* MyASUS Key */
{ KE_KEY, 0x88, { KEY_RFKILL } }, /* Radio Toggle Key */ { KE_KEY, 0x88, { KEY_RFKILL } }, /* Radio Toggle Key */
{ KE_KEY, 0x8A, { KEY_PROG1 } }, /* Color enhancement mode */ { KE_KEY, 0x8A, { KEY_PROG1 } }, /* Color enhancement mode */
......
...@@ -2243,7 +2243,9 @@ static int asus_wmi_fan_init(struct asus_wmi *asus) ...@@ -2243,7 +2243,9 @@ static int asus_wmi_fan_init(struct asus_wmi *asus)
asus->fan_type = FAN_TYPE_NONE; asus->fan_type = FAN_TYPE_NONE;
asus->agfn_pwm = -1; asus->agfn_pwm = -1;
if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL)) if (asus->driver->quirks->wmi_ignore_fan)
asus->fan_type = FAN_TYPE_NONE;
else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL))
asus->fan_type = FAN_TYPE_SPEC83; asus->fan_type = FAN_TYPE_SPEC83;
else if (asus_wmi_has_agfn_fan(asus)) else if (asus_wmi_has_agfn_fan(asus))
asus->fan_type = FAN_TYPE_AGFN; asus->fan_type = FAN_TYPE_AGFN;
...@@ -2436,6 +2438,9 @@ static int fan_curve_check_present(struct asus_wmi *asus, bool *available, ...@@ -2436,6 +2438,9 @@ static int fan_curve_check_present(struct asus_wmi *asus, bool *available,
*available = false; *available = false;
if (asus->fan_type == FAN_TYPE_NONE)
return 0;
err = fan_curve_get_factory_default(asus, fan_dev); err = fan_curve_get_factory_default(asus, fan_dev);
if (err) { if (err) {
return 0; return 0;
......
...@@ -38,6 +38,7 @@ struct quirk_entry { ...@@ -38,6 +38,7 @@ struct quirk_entry {
bool store_backlight_power; bool store_backlight_power;
bool wmi_backlight_set_devstate; bool wmi_backlight_set_devstate;
bool wmi_force_als_set; bool wmi_force_als_set;
bool wmi_ignore_fan;
enum asus_wmi_tablet_switch_mode tablet_switch_mode; enum asus_wmi_tablet_switch_mode tablet_switch_mode;
int wapf; int wapf;
/* /*
......
...@@ -61,7 +61,7 @@ static const struct key_entry dell_wmi_keymap_type_0012[] = { ...@@ -61,7 +61,7 @@ static const struct key_entry dell_wmi_keymap_type_0012[] = {
/* privacy mic mute */ /* privacy mic mute */
{ KE_KEY, 0x0001, { KEY_MICMUTE } }, { KE_KEY, 0x0001, { KEY_MICMUTE } },
/* privacy camera mute */ /* privacy camera mute */
{ KE_SW, 0x0002, { SW_CAMERA_LENS_COVER } }, { KE_VSW, 0x0002, { SW_CAMERA_LENS_COVER } },
{ KE_END, 0}, { KE_END, 0},
}; };
...@@ -115,11 +115,15 @@ bool dell_privacy_process_event(int type, int code, int status) ...@@ -115,11 +115,15 @@ bool dell_privacy_process_event(int type, int code, int status)
switch (code) { switch (code) {
case DELL_PRIVACY_AUDIO_EVENT: /* Mic mute */ case DELL_PRIVACY_AUDIO_EVENT: /* Mic mute */
case DELL_PRIVACY_CAMERA_EVENT: /* Camera mute */
priv->last_status = status; priv->last_status = status;
sparse_keymap_report_entry(priv->input_dev, key, 1, true); sparse_keymap_report_entry(priv->input_dev, key, 1, true);
ret = true; ret = true;
break; 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: default:
dev_dbg(&priv->wdev->dev, "unknown event type 0x%04x 0x%04x\n", type, code); dev_dbg(&priv->wdev->dev, "unknown event type 0x%04x 0x%04x\n", type, code);
} }
...@@ -292,7 +296,7 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context) ...@@ -292,7 +296,7 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context)
{ {
struct privacy_wmi_data *priv; struct privacy_wmi_data *priv;
struct key_entry *keymap; struct key_entry *keymap;
int ret, i; int ret, i, j;
ret = wmi_has_guid(DELL_PRIVACY_GUID); ret = wmi_has_guid(DELL_PRIVACY_GUID);
if (!ret) if (!ret)
...@@ -304,6 +308,11 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context) ...@@ -304,6 +308,11 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context)
dev_set_drvdata(&wdev->dev, priv); dev_set_drvdata(&wdev->dev, priv);
priv->wdev = wdev; priv->wdev = wdev;
ret = get_current_status(priv->wdev);
if (ret)
return ret;
/* create evdev passing interface */ /* create evdev passing interface */
priv->input_dev = devm_input_allocate_device(&wdev->dev); priv->input_dev = devm_input_allocate_device(&wdev->dev);
if (!priv->input_dev) if (!priv->input_dev)
...@@ -318,9 +327,20 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context) ...@@ -318,9 +327,20 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context)
/* remap the keymap code with Dell privacy key type 0x12 as prefix /* remap the keymap code with Dell privacy key type 0x12 as prefix
* KEY_MICMUTE scancode will be reported as 0x120001 * KEY_MICMUTE scancode will be reported as 0x120001
*/ */
for (i = 0; i < ARRAY_SIZE(dell_wmi_keymap_type_0012); i++) { for (i = 0, j = 0; i < ARRAY_SIZE(dell_wmi_keymap_type_0012); i++) {
keymap[i] = dell_wmi_keymap_type_0012[i]; /*
keymap[i].code |= (0x0012 << 16); * Unlike keys where only presses matter, userspace may act
* on switches in both of their positions. Only register
* SW_CAMERA_LENS_COVER if it is actually there.
*/
if (dell_wmi_keymap_type_0012[i].type == KE_VSW &&
dell_wmi_keymap_type_0012[i].sw.code == SW_CAMERA_LENS_COVER &&
!(priv->features_present & BIT(DELL_PRIVACY_TYPE_CAMERA)))
continue;
keymap[j] = dell_wmi_keymap_type_0012[i];
keymap[j].code |= (0x0012 << 16);
j++;
} }
ret = sparse_keymap_setup(priv->input_dev, keymap, NULL); ret = sparse_keymap_setup(priv->input_dev, keymap, NULL);
kfree(keymap); kfree(keymap);
...@@ -331,11 +351,12 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context) ...@@ -331,11 +351,12 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context)
priv->input_dev->name = "Dell Privacy Driver"; priv->input_dev->name = "Dell Privacy Driver";
priv->input_dev->id.bustype = BUS_HOST; priv->input_dev->id.bustype = BUS_HOST;
ret = input_register_device(priv->input_dev); /* Report initial camera-cover status */
if (ret) if (priv->features_present & BIT(DELL_PRIVACY_TYPE_CAMERA))
return ret; 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) if (ret)
return ret; return ret;
......
...@@ -1621,6 +1621,12 @@ static const struct dmi_system_id set_fn_lock_led_list[] = { ...@@ -1621,6 +1621,12 @@ static const struct dmi_system_id set_fn_lock_led_list[] = {
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion R7000P2020H"), DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion R7000P2020H"),
} }
}, },
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion 5 15ARH05"),
}
},
{} {}
}; };
......
...@@ -181,6 +181,9 @@ int skl_int3472_register_regulator(struct int3472_discrete_device *int3472, ...@@ -181,6 +181,9 @@ int skl_int3472_register_regulator(struct int3472_discrete_device *int3472,
return PTR_ERR(int3472->regulator.gpio); return PTR_ERR(int3472->regulator.gpio);
} }
/* Ensure the pin is in output mode and non-active state */
gpiod_direction_output(int3472->regulator.gpio, 0);
cfg.dev = &int3472->adev->dev; cfg.dev = &int3472->adev->dev;
cfg.init_data = &init_data; cfg.init_data = &init_data;
cfg.ena_gpiod = int3472->regulator.gpio; cfg.ena_gpiod = int3472->regulator.gpio;
......
...@@ -168,6 +168,8 @@ static int skl_int3472_map_gpio_to_clk(struct int3472_discrete_device *int3472, ...@@ -168,6 +168,8 @@ static int skl_int3472_map_gpio_to_clk(struct int3472_discrete_device *int3472,
return (PTR_ERR(gpio)); return (PTR_ERR(gpio));
int3472->clock.ena_gpio = gpio; int3472->clock.ena_gpio = gpio;
/* Ensure the pin is in output mode and non-active state */
gpiod_direction_output(int3472->clock.ena_gpio, 0);
break; break;
case INT3472_GPIO_TYPE_PRIVACY_LED: case INT3472_GPIO_TYPE_PRIVACY_LED:
gpio = acpi_get_and_request_gpiod(path, pin, "int3472,privacy-led"); gpio = acpi_get_and_request_gpiod(path, pin, "int3472,privacy-led");
...@@ -175,6 +177,8 @@ static int skl_int3472_map_gpio_to_clk(struct int3472_discrete_device *int3472, ...@@ -175,6 +177,8 @@ static int skl_int3472_map_gpio_to_clk(struct int3472_discrete_device *int3472,
return (PTR_ERR(gpio)); return (PTR_ERR(gpio));
int3472->clock.led_gpio = gpio; int3472->clock.led_gpio = gpio;
/* Ensure the pin is in output mode and non-active state */
gpiod_direction_output(int3472->clock.led_gpio, 0);
break; break;
default: default:
dev_err(int3472->dev, "Invalid GPIO type 0x%02x for clock\n", type); dev_err(int3472->dev, "Invalid GPIO type 0x%02x for clock\n", type);
......
...@@ -1029,6 +1029,7 @@ static const struct x86_cpu_id intel_pmc_core_ids[] = { ...@@ -1029,6 +1029,7 @@ static const struct x86_cpu_id intel_pmc_core_ids[] = {
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE, adl_core_init), X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE, adl_core_init),
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE_S, adl_core_init), X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE_S, adl_core_init),
X86_MATCH_INTEL_FAM6_MODEL(METEORLAKE, mtl_core_init), X86_MATCH_INTEL_FAM6_MODEL(METEORLAKE, mtl_core_init),
X86_MATCH_INTEL_FAM6_MODEL(METEORLAKE_L, mtl_core_init),
{} {}
}; };
......
...@@ -46,7 +46,8 @@ static struct { ...@@ -46,7 +46,8 @@ static struct {
{SIMATIC_IPC_IPC427D, SIMATIC_IPC_DEVICE_427E, SIMATIC_IPC_DEVICE_NONE}, {SIMATIC_IPC_IPC427D, SIMATIC_IPC_DEVICE_427E, SIMATIC_IPC_DEVICE_NONE},
{SIMATIC_IPC_IPC427E, SIMATIC_IPC_DEVICE_427E, SIMATIC_IPC_DEVICE_427E}, {SIMATIC_IPC_IPC427E, SIMATIC_IPC_DEVICE_427E, SIMATIC_IPC_DEVICE_427E},
{SIMATIC_IPC_IPC477E, SIMATIC_IPC_DEVICE_NONE, SIMATIC_IPC_DEVICE_427E}, {SIMATIC_IPC_IPC477E, SIMATIC_IPC_DEVICE_NONE, SIMATIC_IPC_DEVICE_427E},
{SIMATIC_IPC_IPC427G, SIMATIC_IPC_DEVICE_227G, SIMATIC_IPC_DEVICE_227G}, {SIMATIC_IPC_IPCBX_39A, SIMATIC_IPC_DEVICE_227G, SIMATIC_IPC_DEVICE_227G},
{SIMATIC_IPC_IPCPX_39A, SIMATIC_IPC_DEVICE_NONE, SIMATIC_IPC_DEVICE_227G},
}; };
static int register_platform_devices(u32 station_id) static int register_platform_devices(u32 station_id)
......
...@@ -1887,14 +1887,21 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd, ...@@ -1887,14 +1887,21 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd,
break; break;
} }
ret = sony_call_snc_handle(handle, probe_base, &result); /*
if (ret) * Only probe if there is a separate probe_base, otherwise the probe call
return ret; * is equivalent to __sony_nc_kbd_backlight_mode_set(0), resulting in
* the keyboard backlight being turned off.
*/
if (probe_base) {
ret = sony_call_snc_handle(handle, probe_base, &result);
if (ret)
return ret;
if ((handle == 0x0137 && !(result & 0x02)) || if ((handle == 0x0137 && !(result & 0x02)) ||
!(result & 0x01)) { !(result & 0x01)) {
dprintk("no backlight keyboard found\n"); dprintk("no backlight keyboard found\n");
return 0; return 0;
}
} }
kbdbl_ctl = kzalloc(sizeof(*kbdbl_ctl), GFP_KERNEL); kbdbl_ctl = kzalloc(sizeof(*kbdbl_ctl), GFP_KERNEL);
......
...@@ -10311,9 +10311,11 @@ static DEFINE_MUTEX(dytc_mutex); ...@@ -10311,9 +10311,11 @@ static DEFINE_MUTEX(dytc_mutex);
static int dytc_capabilities; static int dytc_capabilities;
static bool dytc_mmc_get_available; static bool dytc_mmc_get_available;
static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *profile) static int convert_dytc_to_profile(int funcmode, int dytcmode,
enum platform_profile_option *profile)
{ {
if (dytc_capabilities & BIT(DYTC_FC_MMC)) { switch (funcmode) {
case DYTC_FUNCTION_MMC:
switch (dytcmode) { switch (dytcmode) {
case DYTC_MODE_MMC_LOWPOWER: case DYTC_MODE_MMC_LOWPOWER:
*profile = PLATFORM_PROFILE_LOW_POWER; *profile = PLATFORM_PROFILE_LOW_POWER;
...@@ -10329,8 +10331,7 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p ...@@ -10329,8 +10331,7 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p
return -EINVAL; return -EINVAL;
} }
return 0; return 0;
} case DYTC_FUNCTION_PSC:
if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
switch (dytcmode) { switch (dytcmode) {
case DYTC_MODE_PSC_LOWPOWER: case DYTC_MODE_PSC_LOWPOWER:
*profile = PLATFORM_PROFILE_LOW_POWER; *profile = PLATFORM_PROFILE_LOW_POWER;
...@@ -10344,6 +10345,14 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p ...@@ -10344,6 +10345,14 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p
default: /* Unknown mode */ default: /* Unknown mode */
return -EINVAL; return -EINVAL;
} }
return 0;
case DYTC_FUNCTION_AMT:
/* For now return balanced. It's the closest we have to 'auto' */
*profile = PLATFORM_PROFILE_BALANCED;
return 0;
default:
/* Unknown function */
return -EOPNOTSUPP;
} }
return 0; return 0;
} }
...@@ -10492,6 +10501,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof, ...@@ -10492,6 +10501,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof,
err = dytc_command(DYTC_SET_COMMAND(DYTC_FUNCTION_PSC, perfmode, 1), &output); err = dytc_command(DYTC_SET_COMMAND(DYTC_FUNCTION_PSC, perfmode, 1), &output);
if (err) if (err)
goto unlock; goto unlock;
/* system supports AMT, activate it when on balanced */ /* system supports AMT, activate it when on balanced */
if (dytc_capabilities & BIT(DYTC_FC_AMT)) if (dytc_capabilities & BIT(DYTC_FC_AMT))
dytc_control_amt(profile == PLATFORM_PROFILE_BALANCED); dytc_control_amt(profile == PLATFORM_PROFILE_BALANCED);
...@@ -10507,7 +10517,7 @@ static void dytc_profile_refresh(void) ...@@ -10507,7 +10517,7 @@ static void dytc_profile_refresh(void)
{ {
enum platform_profile_option profile; enum platform_profile_option profile;
int output, err = 0; int output, err = 0;
int perfmode; int perfmode, funcmode;
mutex_lock(&dytc_mutex); mutex_lock(&dytc_mutex);
if (dytc_capabilities & BIT(DYTC_FC_MMC)) { if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
...@@ -10522,8 +10532,9 @@ static void dytc_profile_refresh(void) ...@@ -10522,8 +10532,9 @@ static void dytc_profile_refresh(void)
if (err) if (err)
return; return;
funcmode = (output >> DYTC_GET_FUNCTION_BIT) & 0xF;
perfmode = (output >> DYTC_GET_MODE_BIT) & 0xF; perfmode = (output >> DYTC_GET_MODE_BIT) & 0xF;
convert_dytc_to_profile(perfmode, &profile); convert_dytc_to_profile(funcmode, perfmode, &profile);
if (profile != dytc_current_profile) { if (profile != dytc_current_profile) {
dytc_current_profile = profile; dytc_current_profile = profile;
platform_profile_notify(); platform_profile_notify();
......
...@@ -264,6 +264,23 @@ static const struct ts_dmi_data connect_tablet9_data = { ...@@ -264,6 +264,23 @@ static const struct ts_dmi_data connect_tablet9_data = {
.properties = connect_tablet9_props, .properties = connect_tablet9_props,
}; };
static const struct property_entry csl_panther_tab_hd_props[] = {
PROPERTY_ENTRY_U32("touchscreen-min-x", 1),
PROPERTY_ENTRY_U32("touchscreen-min-y", 20),
PROPERTY_ENTRY_U32("touchscreen-size-x", 1980),
PROPERTY_ENTRY_U32("touchscreen-size-y", 1526),
PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"),
PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"),
PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-csl-panther-tab-hd.fw"),
PROPERTY_ENTRY_U32("silead,max-fingers", 10),
{ }
};
static const struct ts_dmi_data csl_panther_tab_hd_data = {
.acpi_name = "MSSL1680:00",
.properties = csl_panther_tab_hd_props,
};
static const struct property_entry cube_iwork8_air_props[] = { static const struct property_entry cube_iwork8_air_props[] = {
PROPERTY_ENTRY_U32("touchscreen-min-x", 1), PROPERTY_ENTRY_U32("touchscreen-min-x", 1),
PROPERTY_ENTRY_U32("touchscreen-min-y", 3), PROPERTY_ENTRY_U32("touchscreen-min-y", 3),
...@@ -1124,6 +1141,14 @@ const struct dmi_system_id touchscreen_dmi_table[] = { ...@@ -1124,6 +1141,14 @@ const struct dmi_system_id touchscreen_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Tablet 9"), DMI_MATCH(DMI_PRODUCT_NAME, "Tablet 9"),
}, },
}, },
{
/* CSL Panther Tab HD */
.driver_data = (void *)&csl_panther_tab_hd_data,
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "CSL Computer GmbH & Co. KG"),
DMI_MATCH(DMI_PRODUCT_NAME, "CSL Panther Tab HD"),
},
},
{ {
/* CUBE iwork8 Air */ /* CUBE iwork8 Air */
.driver_data = (void *)&cube_iwork8_air_data, .driver_data = (void *)&cube_iwork8_air_data,
......
...@@ -32,7 +32,8 @@ enum simatic_ipc_station_ids { ...@@ -32,7 +32,8 @@ enum simatic_ipc_station_ids {
SIMATIC_IPC_IPC477E = 0x00000A02, SIMATIC_IPC_IPC477E = 0x00000A02,
SIMATIC_IPC_IPC127E = 0x00000D01, SIMATIC_IPC_IPC127E = 0x00000D01,
SIMATIC_IPC_IPC227G = 0x00000F01, SIMATIC_IPC_IPC227G = 0x00000F01,
SIMATIC_IPC_IPC427G = 0x00001001, SIMATIC_IPC_IPCBX_39A = 0x00001001,
SIMATIC_IPC_IPCPX_39A = 0x00001002,
}; };
static inline u32 simatic_ipc_get_station_id(u8 *data, int max_len) static inline u32 simatic_ipc_get_station_id(u8 *data, int max_len)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment