platform-drivers-x86 for v6.2-2
A small set of assorted fixes and hardware-id additions for 6.2. The following is an automated git shortlog grouped by driver: asus-nb-wmi: - Add alternate mapping for KEY_SCREENLOCK - Add alternate mapping for KEY_CAMERA asus-wmi: - Don't load fan curves without fan - Ignore fan on E410MA - Add quirk wmi_ignore_fan dell-privacy: - Only register SW_CAMERA_LENS_COVER if present - Fix SW_CAMERA_LENS_COVER reporting ideapad-laptop: - Add Legion 5 15ARH05 DMI id to set_fn_lock_led_list[] int3472/discrete: - Ensure the clk/power enable pins are in output mode intel/pmc/core: - Add Meteor Lake mobile support platform/surface: - aggregator: Add missing call to ssam_request_sync_free() - aggregator: Ignore command messages not intended for us platform/x86/amd: - Fix refcount leak in amd_pmc_probe simatic-ipc: - add another model - correct name of a model sony-laptop: - Don't turn off 0x153 keyboard backlight during probe thinkpad_acpi: - Fix profile mode display in AMT mode touchscreen_dmi: - Add info for the CSL Panther Tab HD -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEEuvA7XScYQRpenhd+kuxHeUQDJ9wFAmPBN78UHGhkZWdvZWRl QHJlZGhhdC5jb20ACgkQkuxHeUQDJ9yQ7AgAuKK+TDlru+rup5PSvUBiRddYX8VI U+cJokT9sp748zau+S7zy+1PDYtAnaXbV6wf6/YwANq6Pw9aI9MCMFyc2iXzIDCW fp6d8xvow5XuWG/cK3rggl3WxzInyE2rcSI5epQPV9ylZSOPSPI8CKug/68I2L7W kohws/18ujOU4J5Y8ATH1jY3t8Zx+uA7sdU/Oo6hiA4Xen1qrABCSgcGgWNqxfqb C6tk1kF5agLmvR5I7Y0bDh1EHeN1CALPjl8MibEyYFldASLxmCYogx4bGDQBf0Qm XFZ5MxLdFbHDFXiyaKh+RNW2uHzbJV3rXYVOyUy2eXahBRGj+yoFwDK8Zw== =tB+M -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
0d0833e039
@ -1700,8 +1700,10 @@ int ssam_request_sync(struct ssam_controller *ctrl,
|
||||
return status;
|
||||
|
||||
status = ssam_request_sync_init(rqst, spec->flags);
|
||||
if (status)
|
||||
if (status) {
|
||||
ssam_request_sync_free(rqst);
|
||||
return status;
|
||||
}
|
||||
|
||||
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)
|
||||
if (sshp_parse_command(dev, data, &command, &command_data))
|
||||
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)))
|
||||
ssh_rtl_rx_event(rtl, command, &command_data);
|
||||
else
|
||||
|
@ -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)) {
|
||||
err = amd_pmc_s2d_init(dev);
|
||||
if (err)
|
||||
return err;
|
||||
goto err_pci_dev_put;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
@ -121,6 +121,10 @@ static struct quirk_entry quirk_asus_tablet_mode = {
|
||||
.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)
|
||||
{
|
||||
pr_info("Identified laptop model '%s'\n", dmi->ident);
|
||||
@ -473,6 +477,15 @@ static const struct dmi_system_id asus_quirks[] = {
|
||||
},
|
||||
.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[] = {
|
||||
{ KE_KEY, 0x30, { KEY_VOLUMEUP } },
|
||||
{ KE_KEY, 0x31, { KEY_VOLUMEDOWN } },
|
||||
{ KE_KEY, 0x32, { KEY_MUTE } },
|
||||
{ KE_KEY, 0x33, { KEY_SCREENLOCK } },
|
||||
{ KE_KEY, 0x35, { KEY_SCREENLOCK } },
|
||||
{ KE_KEY, 0x38, { KEY_PROG3 } }, /* Armoury Crate */
|
||||
{ KE_KEY, 0x40, { KEY_PREVIOUSSONG } },
|
||||
@ -544,6 +558,7 @@ static const struct key_entry asus_nb_wmi_keymap[] = {
|
||||
{ KE_KEY, 0x7D, { KEY_BLUETOOTH } }, /* Bluetooth Enable */
|
||||
{ KE_KEY, 0x7E, { KEY_BLUETOOTH } }, /* Bluetooth Disable */
|
||||
{ KE_KEY, 0x82, { KEY_CAMERA } },
|
||||
{ KE_KEY, 0x85, { KEY_CAMERA } },
|
||||
{ KE_KEY, 0x86, { KEY_PROG1 } }, /* MyASUS Key */
|
||||
{ KE_KEY, 0x88, { KEY_RFKILL } }, /* Radio Toggle Key */
|
||||
{ KE_KEY, 0x8A, { KEY_PROG1 } }, /* Color enhancement mode */
|
||||
|
@ -2243,7 +2243,9 @@ static int asus_wmi_fan_init(struct asus_wmi *asus)
|
||||
asus->fan_type = FAN_TYPE_NONE;
|
||||
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;
|
||||
else if (asus_wmi_has_agfn_fan(asus))
|
||||
asus->fan_type = FAN_TYPE_AGFN;
|
||||
@ -2436,6 +2438,9 @@ static int fan_curve_check_present(struct asus_wmi *asus, bool *available,
|
||||
|
||||
*available = false;
|
||||
|
||||
if (asus->fan_type == FAN_TYPE_NONE)
|
||||
return 0;
|
||||
|
||||
err = fan_curve_get_factory_default(asus, fan_dev);
|
||||
if (err) {
|
||||
return 0;
|
||||
|
@ -38,6 +38,7 @@ struct quirk_entry {
|
||||
bool store_backlight_power;
|
||||
bool wmi_backlight_set_devstate;
|
||||
bool wmi_force_als_set;
|
||||
bool wmi_ignore_fan;
|
||||
enum asus_wmi_tablet_switch_mode tablet_switch_mode;
|
||||
int wapf;
|
||||
/*
|
||||
|
@ -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);
|
||||
}
|
||||
@ -292,7 +296,7 @@ static int dell_privacy_wmi_probe(struct wmi_device *wdev, const void *context)
|
||||
{
|
||||
struct privacy_wmi_data *priv;
|
||||
struct key_entry *keymap;
|
||||
int ret, i;
|
||||
int ret, i, j;
|
||||
|
||||
ret = wmi_has_guid(DELL_PRIVACY_GUID);
|
||||
if (!ret)
|
||||
@ -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)
|
||||
@ -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
|
||||
* KEY_MICMUTE scancode will be reported as 0x120001
|
||||
*/
|
||||
for (i = 0; i < ARRAY_SIZE(dell_wmi_keymap_type_0012); i++) {
|
||||
keymap[i] = dell_wmi_keymap_type_0012[i];
|
||||
keymap[i].code |= (0x0012 << 16);
|
||||
for (i = 0, j = 0; i < ARRAY_SIZE(dell_wmi_keymap_type_0012); i++) {
|
||||
/*
|
||||
* 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);
|
||||
kfree(keymap);
|
||||
@ -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->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;
|
||||
|
||||
|
@ -1621,6 +1621,12 @@ static const struct dmi_system_id set_fn_lock_led_list[] = {
|
||||
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,
|
||||
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.init_data = &init_data;
|
||||
cfg.ena_gpiod = int3472->regulator.gpio;
|
||||
|
@ -168,6 +168,8 @@ static int skl_int3472_map_gpio_to_clk(struct int3472_discrete_device *int3472,
|
||||
return (PTR_ERR(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;
|
||||
case INT3472_GPIO_TYPE_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,
|
||||
return (PTR_ERR(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;
|
||||
default:
|
||||
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[] = {
|
||||
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE, 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_L, mtl_core_init),
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -46,7 +46,8 @@ static struct {
|
||||
{SIMATIC_IPC_IPC427D, SIMATIC_IPC_DEVICE_427E, SIMATIC_IPC_DEVICE_NONE},
|
||||
{SIMATIC_IPC_IPC427E, SIMATIC_IPC_DEVICE_427E, 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)
|
||||
|
@ -1887,14 +1887,21 @@ static int sony_nc_kbd_backlight_setup(struct platform_device *pd,
|
||||
break;
|
||||
}
|
||||
|
||||
ret = sony_call_snc_handle(handle, probe_base, &result);
|
||||
if (ret)
|
||||
return ret;
|
||||
/*
|
||||
* Only probe if there is a separate probe_base, otherwise the probe call
|
||||
* 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)) ||
|
||||
!(result & 0x01)) {
|
||||
dprintk("no backlight keyboard found\n");
|
||||
return 0;
|
||||
if ((handle == 0x0137 && !(result & 0x02)) ||
|
||||
!(result & 0x01)) {
|
||||
dprintk("no backlight keyboard found\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
kbdbl_ctl = kzalloc(sizeof(*kbdbl_ctl), GFP_KERNEL);
|
||||
|
@ -10311,9 +10311,11 @@ static DEFINE_MUTEX(dytc_mutex);
|
||||
static int dytc_capabilities;
|
||||
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) {
|
||||
case DYTC_MODE_MMC_LOWPOWER:
|
||||
*profile = PLATFORM_PROFILE_LOW_POWER;
|
||||
@ -10329,8 +10331,7 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
|
||||
case DYTC_FUNCTION_PSC:
|
||||
switch (dytcmode) {
|
||||
case DYTC_MODE_PSC_LOWPOWER:
|
||||
*profile = PLATFORM_PROFILE_LOW_POWER;
|
||||
@ -10344,6 +10345,14 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p
|
||||
default: /* Unknown mode */
|
||||
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;
|
||||
}
|
||||
@ -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);
|
||||
if (err)
|
||||
goto unlock;
|
||||
|
||||
/* system supports AMT, activate it when on balanced */
|
||||
if (dytc_capabilities & BIT(DYTC_FC_AMT))
|
||||
dytc_control_amt(profile == PLATFORM_PROFILE_BALANCED);
|
||||
@ -10507,7 +10517,7 @@ static void dytc_profile_refresh(void)
|
||||
{
|
||||
enum platform_profile_option profile;
|
||||
int output, err = 0;
|
||||
int perfmode;
|
||||
int perfmode, funcmode;
|
||||
|
||||
mutex_lock(&dytc_mutex);
|
||||
if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
|
||||
@ -10522,8 +10532,9 @@ static void dytc_profile_refresh(void)
|
||||
if (err)
|
||||
return;
|
||||
|
||||
funcmode = (output >> DYTC_GET_FUNCTION_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) {
|
||||
dytc_current_profile = profile;
|
||||
platform_profile_notify();
|
||||
|
@ -264,6 +264,23 @@ static const struct ts_dmi_data connect_tablet9_data = {
|
||||
.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[] = {
|
||||
PROPERTY_ENTRY_U32("touchscreen-min-x", 1),
|
||||
PROPERTY_ENTRY_U32("touchscreen-min-y", 3),
|
||||
@ -1124,6 +1141,14 @@ const struct dmi_system_id touchscreen_dmi_table[] = {
|
||||
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 */
|
||||
.driver_data = (void *)&cube_iwork8_air_data,
|
||||
|
@ -32,7 +32,8 @@ enum simatic_ipc_station_ids {
|
||||
SIMATIC_IPC_IPC477E = 0x00000A02,
|
||||
SIMATIC_IPC_IPC127E = 0x00000D01,
|
||||
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user