Commit a7726f6b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'platform-drivers-x86-v4.17-1' of git://git.infradead.org/linux-platform-drivers-x86

Pull x86 platform driver updates from Andy Shevchenko:

 - Dell SMBIOS driver fixed against memory leaks.

 - The fujitsu-laptop driver is cleaned up and now supports hotkeys for
   Lifebook U7x7 models. Besides that the typo introduced by one of
   previous clean up series has been fixed.

 - Specific to x86-based laptops HID device now supports
   KEY_ROTATE_LOCK_TOGGLE event which is emitted, for example, by Wacom
   MobileStudio Pro 13.

 - Turbo MAX 3 technology is enabled for the rest of platforms that
   support Hardware-P-States feature which have core priority described
   by ACPI CPPC table.

 - Mellanox on x86 gets better support of I2C bus in use including
   support of hotpluggable ones.

 - Silead touchscreen is enabled on two tablet models, i.e Yours Y8W81
   and I.T.Works TW701.

 - From now on the second fan on Thinkpad P50 is supported.

 - The topstar-laptop driver is reworked to support new models, in
   particular Topstar U931.

* tag 'platform-drivers-x86-v4.17-1' of git://git.infradead.org/linux-platform-drivers-x86: (41 commits)
  platform/x86: thinkpad_acpi: Add 2nd Fan Support for Thinkpad P50
  platform/x86: dell-smbios: Fix memory leaks in build_tokens_sysfs()
  intel-hid: support KEY_ROTATE_LOCK_TOGGLE
  intel-hid: clean up and sort header files
  platform/x86: silead_dmi: Add entry for the Yours Y8W81 tablet
  platform/x86: fujitsu-laptop: Support Lifebook U7x7 hotkeys
  platform/x86: mlx-platform: Add physical bus number auto detection
  platform/mellanox: mlxreg-hotplug: Change input for device create routine
  platform/x86: mlx-platform: Add deffered bus functionality
  platform/x86: mlx-platform: Use define for the channel numbers
  platform/x86: fujitsu-laptop: Revert UNSUPPORTED_CMD back to an int
  platform/x86: Fix dell driver init order
  platform/x86: dell-smbios: Resolve dependency error on ACPI_WMI
  platform/x86: dell-smbios: Resolve dependency error on DCDBAS
  platform/x86: Allow for SMBIOS backend defaults
  platform/x86: dell-smbios: Link all dell-smbios-* modules together
  platform/x86: dell-smbios: Rename dell-smbios source to dell-smbios-base
  platform/x86: dell-smbios: Correct some style warnings
  platform/x86: wmi: Fix misuse of vsprintf extension %pULL
  platform/x86: intel-hid: Reset wakeup capable flag on removal
  ...
parents 1b02dcb9 a986c75a
...@@ -93,9 +93,11 @@ struct mlxreg_hotplug_priv_data { ...@@ -93,9 +93,11 @@ struct mlxreg_hotplug_priv_data {
bool after_probe; bool after_probe;
}; };
static int mlxreg_hotplug_device_create(struct device *dev, static int mlxreg_hotplug_device_create(struct mlxreg_hotplug_priv_data *priv,
struct mlxreg_core_data *data) struct mlxreg_core_data *data)
{ {
struct mlxreg_core_hotplug_platform_data *pdata;
/* /*
* Return if adapter number is negative. It could be in case hotplug * Return if adapter number is negative. It could be in case hotplug
* event is not associated with hotplug device. * event is not associated with hotplug device.
...@@ -103,19 +105,21 @@ static int mlxreg_hotplug_device_create(struct device *dev, ...@@ -103,19 +105,21 @@ static int mlxreg_hotplug_device_create(struct device *dev,
if (data->hpdev.nr < 0) if (data->hpdev.nr < 0)
return 0; return 0;
data->hpdev.adapter = i2c_get_adapter(data->hpdev.nr); pdata = dev_get_platdata(&priv->pdev->dev);
data->hpdev.adapter = i2c_get_adapter(data->hpdev.nr +
pdata->shift_nr);
if (!data->hpdev.adapter) { if (!data->hpdev.adapter) {
dev_err(dev, "Failed to get adapter for bus %d\n", dev_err(priv->dev, "Failed to get adapter for bus %d\n",
data->hpdev.nr); data->hpdev.nr + pdata->shift_nr);
return -EFAULT; return -EFAULT;
} }
data->hpdev.client = i2c_new_device(data->hpdev.adapter, data->hpdev.client = i2c_new_device(data->hpdev.adapter,
data->hpdev.brdinfo); data->hpdev.brdinfo);
if (!data->hpdev.client) { if (!data->hpdev.client) {
dev_err(dev, "Failed to create client %s at bus %d at addr 0x%02x\n", dev_err(priv->dev, "Failed to create client %s at bus %d at addr 0x%02x\n",
data->hpdev.brdinfo->type, data->hpdev.nr, data->hpdev.brdinfo->type, data->hpdev.nr +
data->hpdev.brdinfo->addr); pdata->shift_nr, data->hpdev.brdinfo->addr);
i2c_put_adapter(data->hpdev.adapter); i2c_put_adapter(data->hpdev.adapter);
data->hpdev.adapter = NULL; data->hpdev.adapter = NULL;
...@@ -270,10 +274,10 @@ mlxreg_hotplug_work_helper(struct mlxreg_hotplug_priv_data *priv, ...@@ -270,10 +274,10 @@ mlxreg_hotplug_work_helper(struct mlxreg_hotplug_priv_data *priv,
if (item->inversed) if (item->inversed)
mlxreg_hotplug_device_destroy(data); mlxreg_hotplug_device_destroy(data);
else else
mlxreg_hotplug_device_create(priv->dev, data); mlxreg_hotplug_device_create(priv, data);
} else { } else {
if (item->inversed) if (item->inversed)
mlxreg_hotplug_device_create(priv->dev, data); mlxreg_hotplug_device_create(priv, data);
else else
mlxreg_hotplug_device_destroy(data); mlxreg_hotplug_device_destroy(data);
} }
...@@ -319,7 +323,7 @@ mlxreg_hotplug_health_work_helper(struct mlxreg_hotplug_priv_data *priv, ...@@ -319,7 +323,7 @@ mlxreg_hotplug_health_work_helper(struct mlxreg_hotplug_priv_data *priv,
if (regval == MLXREG_HOTPLUG_HEALTH_MASK) { if (regval == MLXREG_HOTPLUG_HEALTH_MASK) {
if ((data->health_cntr++ == MLXREG_HOTPLUG_RST_CNTR) || if ((data->health_cntr++ == MLXREG_HOTPLUG_RST_CNTR) ||
!priv->after_probe) { !priv->after_probe) {
mlxreg_hotplug_device_create(priv->dev, data); mlxreg_hotplug_device_create(priv, data);
data->attached = true; data->attached = true;
} }
} else { } else {
...@@ -550,6 +554,7 @@ static int mlxreg_hotplug_probe(struct platform_device *pdev) ...@@ -550,6 +554,7 @@ static int mlxreg_hotplug_probe(struct platform_device *pdev)
{ {
struct mlxreg_core_hotplug_platform_data *pdata; struct mlxreg_core_hotplug_platform_data *pdata;
struct mlxreg_hotplug_priv_data *priv; struct mlxreg_hotplug_priv_data *priv;
struct i2c_adapter *deferred_adap;
int err; int err;
pdata = dev_get_platdata(&pdev->dev); pdata = dev_get_platdata(&pdev->dev);
...@@ -558,6 +563,12 @@ static int mlxreg_hotplug_probe(struct platform_device *pdev) ...@@ -558,6 +563,12 @@ static int mlxreg_hotplug_probe(struct platform_device *pdev)
return -EINVAL; return -EINVAL;
} }
/* Defer probing if the necessary adapter is not configured yet. */
deferred_adap = i2c_get_adapter(pdata->deferred_nr);
if (!deferred_adap)
return -EPROBE_DEFER;
i2c_put_adapter(deferred_adap);
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
......
...@@ -757,6 +757,8 @@ config TOPSTAR_LAPTOP ...@@ -757,6 +757,8 @@ config TOPSTAR_LAPTOP
depends on ACPI depends on ACPI
depends on INPUT depends on INPUT
select INPUT_SPARSEKMAP select INPUT_SPARSEKMAP
select LEDS_CLASS
select NEW_LEDS
---help--- ---help---
This driver adds support for hotkeys found on Topstar laptops. This driver adds support for hotkeys found on Topstar laptops.
...@@ -1174,6 +1176,7 @@ config INTEL_TELEMETRY ...@@ -1174,6 +1176,7 @@ config INTEL_TELEMETRY
config MLX_PLATFORM config MLX_PLATFORM
tristate "Mellanox Technologies platform support" tristate "Mellanox Technologies platform support"
depends on I2C && REGMAP
---help--- ---help---
This option enables system support for the Mellanox Technologies This option enables system support for the Mellanox Technologies
platform. The Mellanox systems provide data center networking platform. The Mellanox systems provide data center networking
......
...@@ -514,7 +514,7 @@ static int build_tokens_sysfs(struct platform_device *dev) ...@@ -514,7 +514,7 @@ static int build_tokens_sysfs(struct platform_device *dev)
continue; continue;
loop_fail_create_value: loop_fail_create_value:
kfree(value_name); kfree(location_name);
goto out_unwind_strings; goto out_unwind_strings;
} }
smbios_attribute_group.attrs = token_attrs; smbios_attribute_group.attrs = token_attrs;
...@@ -525,7 +525,7 @@ static int build_tokens_sysfs(struct platform_device *dev) ...@@ -525,7 +525,7 @@ static int build_tokens_sysfs(struct platform_device *dev)
return 0; return 0;
out_unwind_strings: out_unwind_strings:
for (i = i-1; i > 0; i--) { while (i--) {
kfree(token_location_attrs[i].attr.name); kfree(token_location_attrs[i].attr.name);
kfree(token_value_attrs[i].attr.name); kfree(token_value_attrs[i].attr.name);
} }
......
This diff is collapsed.
...@@ -19,12 +19,12 @@ ...@@ -19,12 +19,12 @@
static int temp_limits[3] = { 55000, 60000, 65000 }; static int temp_limits[3] = { 55000, 60000, 65000 };
module_param_array(temp_limits, int, NULL, 0444); module_param_array(temp_limits, int, NULL, 0444);
MODULE_PARM_DESC(temp_limits, MODULE_PARM_DESC(temp_limits,
"Milli-celcius values above which the fan speed increases"); "Millicelsius values above which the fan speed increases");
static int hysteresis = 3000; static int hysteresis = 3000;
module_param(hysteresis, int, 0444); module_param(hysteresis, int, 0444);
MODULE_PARM_DESC(hysteresis, MODULE_PARM_DESC(hysteresis,
"Hysteresis in milli-celcius before lowering the fan speed"); "Hysteresis in millicelsius before lowering the fan speed");
static int speed_on_ac = 2; static int speed_on_ac = 2;
module_param(speed_on_ac, int, 0444); module_param(speed_on_ac, int, 0444);
......
...@@ -16,16 +16,14 @@ ...@@ -16,16 +16,14 @@
* *
*/ */
#include <linux/acpi.h>
#include <linux/dmi.h>
#include <linux/input.h>
#include <linux/input/sparse-keymap.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h>
#include <linux/input.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/input/sparse-keymap.h>
#include <linux/acpi.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <acpi/acpi_bus.h>
#include <linux/dmi.h>
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Alex Hung"); MODULE_AUTHOR("Alex Hung");
...@@ -67,8 +65,8 @@ static const struct key_entry intel_array_keymap[] = { ...@@ -67,8 +65,8 @@ static const struct key_entry intel_array_keymap[] = {
{ KE_IGNORE, 0xC5, { KEY_VOLUMEUP } }, /* Release */ { KE_IGNORE, 0xC5, { KEY_VOLUMEUP } }, /* Release */
{ KE_KEY, 0xC6, { KEY_VOLUMEDOWN } }, /* Press */ { KE_KEY, 0xC6, { KEY_VOLUMEDOWN } }, /* Press */
{ KE_IGNORE, 0xC7, { KEY_VOLUMEDOWN } }, /* Release */ { KE_IGNORE, 0xC7, { KEY_VOLUMEDOWN } }, /* Release */
{ KE_SW, 0xC8, { .sw = { SW_ROTATE_LOCK, 1 } } }, /* Press */ { KE_KEY, 0xC8, { KEY_ROTATE_LOCK_TOGGLE } }, /* Press */
{ KE_SW, 0xC9, { .sw = { SW_ROTATE_LOCK, 0 } } }, /* Release */ { KE_IGNORE, 0xC9, { KEY_ROTATE_LOCK_TOGGLE } }, /* Release */
{ KE_KEY, 0xCE, { KEY_POWER } }, /* Press */ { KE_KEY, 0xCE, { KEY_POWER } }, /* Press */
{ KE_IGNORE, 0xCF, { KEY_POWER } }, /* Release */ { KE_IGNORE, 0xCF, { KEY_POWER } }, /* Release */
{ KE_END }, { KE_END },
......
...@@ -138,9 +138,6 @@ static int __init itmt_legacy_init(void) ...@@ -138,9 +138,6 @@ static int __init itmt_legacy_init(void)
if (!id) if (!id)
return -ENODEV; return -ENODEV;
if (boot_cpu_has(X86_FEATURE_HWP))
return -ENODEV;
ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
"platform/x86/turbo_max_3:online", "platform/x86/turbo_max_3:online",
itmt_legacy_cpu_online, NULL); itmt_legacy_cpu_online, NULL);
......
...@@ -85,6 +85,15 @@ ...@@ -85,6 +85,15 @@
#define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0) #define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0)
#define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(5, 0) #define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(5, 0)
/* Default I2C parent bus number */
#define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
/* Maximum number of possible physical buses equipped on system */
#define MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM 16
/* Number of channels in group */
#define MLXPLAT_CPLD_GRP_CHNL_NUM 8
/* Start channel numbers */ /* Start channel numbers */
#define MLXPLAT_CPLD_CH1 2 #define MLXPLAT_CPLD_CH1 2
#define MLXPLAT_CPLD_CH2 10 #define MLXPLAT_CPLD_CH2 10
...@@ -124,7 +133,7 @@ static const struct resource mlxplat_lpc_resources[] = { ...@@ -124,7 +133,7 @@ static const struct resource mlxplat_lpc_resources[] = {
}; };
/* Platform default channels */ /* Platform default channels */
static const int mlxplat_default_channels[][8] = { static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
{ {
MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2, MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2,
MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 + MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 +
...@@ -694,6 +703,8 @@ static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi) ...@@ -694,6 +703,8 @@ static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
ARRAY_SIZE(mlxplat_default_channels[i]); ARRAY_SIZE(mlxplat_default_channels[i]);
} }
mlxplat_hotplug = &mlxplat_mlxcpld_default_data; mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
mlxplat_hotplug->deferred_nr =
mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
return 1; return 1;
}; };
...@@ -708,6 +719,8 @@ static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi) ...@@ -708,6 +719,8 @@ static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
ARRAY_SIZE(mlxplat_msn21xx_channels); ARRAY_SIZE(mlxplat_msn21xx_channels);
} }
mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data; mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
mlxplat_hotplug->deferred_nr =
mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
return 1; return 1;
}; };
...@@ -722,6 +735,8 @@ static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi) ...@@ -722,6 +735,8 @@ static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
ARRAY_SIZE(mlxplat_msn21xx_channels); ARRAY_SIZE(mlxplat_msn21xx_channels);
} }
mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data; mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
mlxplat_hotplug->deferred_nr =
mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
return 1; return 1;
}; };
...@@ -736,6 +751,8 @@ static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi) ...@@ -736,6 +751,8 @@ static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
ARRAY_SIZE(mlxplat_msn21xx_channels); ARRAY_SIZE(mlxplat_msn21xx_channels);
} }
mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data; mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
mlxplat_hotplug->deferred_nr =
mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
return 1; return 1;
}; };
...@@ -750,6 +767,8 @@ static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi) ...@@ -750,6 +767,8 @@ static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
ARRAY_SIZE(mlxplat_msn21xx_channels); ARRAY_SIZE(mlxplat_msn21xx_channels);
} }
mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data; mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
mlxplat_hotplug->deferred_nr =
mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
return 1; return 1;
}; };
...@@ -830,10 +849,48 @@ static const struct dmi_system_id mlxplat_dmi_table[] __initconst = { ...@@ -830,10 +849,48 @@ static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table); MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table);
static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
{
struct i2c_adapter *search_adap;
int shift, i;
/* Scan adapters from expected id to verify it is free. */
*nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <
MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM; i++) {
search_adap = i2c_get_adapter(i);
if (search_adap) {
i2c_put_adapter(search_adap);
continue;
}
/* Return if expected parent adapter is free. */
if (i == MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR)
return 0;
break;
}
/* Return with error if free id for adapter is not found. */
if (i == MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM)
return -ENODEV;
/* Shift adapter ids, since expected parent adapter is not free. */
*nr = i;
for (i = 0; i < ARRAY_SIZE(mlxplat_mux_data); i++) {
shift = *nr - mlxplat_mux_data[i].parent;
mlxplat_mux_data[i].parent = *nr;
mlxplat_mux_data[i].base_nr += shift;
if (shift > 0)
mlxplat_hotplug->shift_nr = shift;
}
return 0;
}
static int __init mlxplat_init(void) static int __init mlxplat_init(void)
{ {
struct mlxplat_priv *priv; struct mlxplat_priv *priv;
int i, err; int i, nr, err;
if (!dmi_check_system(mlxplat_dmi_table)) if (!dmi_check_system(mlxplat_dmi_table))
return -ENODEV; return -ENODEV;
...@@ -853,7 +910,12 @@ static int __init mlxplat_init(void) ...@@ -853,7 +910,12 @@ static int __init mlxplat_init(void)
} }
platform_set_drvdata(mlxplat_dev, priv); platform_set_drvdata(mlxplat_dev, priv);
priv->pdev_i2c = platform_device_register_simple("i2c_mlxcpld", -1, err = mlxplat_mlxcpld_verify_bus_topology(&nr);
if (nr < 0)
goto fail_alloc;
nr = (nr == MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM) ? -1 : nr;
priv->pdev_i2c = platform_device_register_simple("i2c_mlxcpld", nr,
NULL, 0); NULL, 0);
if (IS_ERR(priv->pdev_i2c)) { if (IS_ERR(priv->pdev_i2c)) {
err = PTR_ERR(priv->pdev_i2c); err = PTR_ERR(priv->pdev_i2c);
......
...@@ -446,6 +446,23 @@ static const struct dmi_system_id silead_ts_dmi_table[] = { ...@@ -446,6 +446,23 @@ static const struct dmi_system_id silead_ts_dmi_table[] = {
DMI_MATCH(DMI_BOARD_NAME, "X3 Plus"), DMI_MATCH(DMI_BOARD_NAME, "X3 Plus"),
}, },
}, },
{
/* I.T.Works TW701 */
.driver_data = (void *)&surftab_wintron70_st70416_6_data,
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
DMI_MATCH(DMI_PRODUCT_NAME, "i71c"),
DMI_MATCH(DMI_BIOS_VERSION, "itWORKS.G.WI71C.JGBMRB"),
},
},
{
/* Yours Y8W81, same case and touchscreen as Chuwi Vi8 */
.driver_data = (void *)&chuwi_vi8_data,
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "YOURS"),
DMI_MATCH(DMI_PRODUCT_NAME, "Y8W81"),
},
},
{ }, { },
}; };
......
...@@ -8703,16 +8703,24 @@ static const struct attribute_group fan_attr_group = { ...@@ -8703,16 +8703,24 @@ static const struct attribute_group fan_attr_group = {
.ec = TPID(__id1, __id2), \ .ec = TPID(__id1, __id2), \
.quirks = __quirks } .quirks = __quirks }
#define TPACPI_FAN_QB(__id1, __id2, __quirks) \
{ .vendor = PCI_VENDOR_ID_LENOVO, \
.bios = TPID(__id1, __id2), \
.ec = TPACPI_MATCH_ANY, \
.quirks = __quirks }
static const struct tpacpi_quirk fan_quirk_table[] __initconst = { static const struct tpacpi_quirk fan_quirk_table[] __initconst = {
TPACPI_FAN_QI('1', 'Y', TPACPI_FAN_Q1), TPACPI_FAN_QI('1', 'Y', TPACPI_FAN_Q1),
TPACPI_FAN_QI('7', '8', TPACPI_FAN_Q1), TPACPI_FAN_QI('7', '8', TPACPI_FAN_Q1),
TPACPI_FAN_QI('7', '6', TPACPI_FAN_Q1), TPACPI_FAN_QI('7', '6', TPACPI_FAN_Q1),
TPACPI_FAN_QI('7', '0', TPACPI_FAN_Q1), TPACPI_FAN_QI('7', '0', TPACPI_FAN_Q1),
TPACPI_FAN_QL('7', 'M', TPACPI_FAN_2FAN), TPACPI_FAN_QL('7', 'M', TPACPI_FAN_2FAN),
TPACPI_FAN_QB('N', '1', TPACPI_FAN_2FAN),
}; };
#undef TPACPI_FAN_QL #undef TPACPI_FAN_QL
#undef TPACPI_FAN_QI #undef TPACPI_FAN_QI
#undef TPACPI_FAN_QB
static int __init fan_init(struct ibm_init_struct *iibm) static int __init fan_init(struct ibm_init_struct *iibm)
{ {
......
This diff is collapsed.
...@@ -130,13 +130,11 @@ static bool find_guid(const char *guid_string, struct wmi_block **out) ...@@ -130,13 +130,11 @@ static bool find_guid(const char *guid_string, struct wmi_block **out)
uuid_le guid_input; uuid_le guid_input;
struct wmi_block *wblock; struct wmi_block *wblock;
struct guid_block *block; struct guid_block *block;
struct list_head *p;
if (uuid_le_to_bin(guid_string, &guid_input)) if (uuid_le_to_bin(guid_string, &guid_input))
return false; return false;
list_for_each(p, &wmi_block_list) { list_for_each_entry(wblock, &wmi_block_list, list) {
wblock = list_entry(p, struct wmi_block, list);
block = &wblock->gblock; block = &wblock->gblock;
if (memcmp(block->guid, &guid_input, 16) == 0) { if (memcmp(block->guid, &guid_input, 16) == 0) {
...@@ -519,7 +517,6 @@ wmi_notify_handler handler, void *data) ...@@ -519,7 +517,6 @@ wmi_notify_handler handler, void *data)
struct wmi_block *block; struct wmi_block *block;
acpi_status status = AE_NOT_EXIST; acpi_status status = AE_NOT_EXIST;
uuid_le guid_input; uuid_le guid_input;
struct list_head *p;
if (!guid || !handler) if (!guid || !handler)
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
...@@ -527,9 +524,8 @@ wmi_notify_handler handler, void *data) ...@@ -527,9 +524,8 @@ wmi_notify_handler handler, void *data)
if (uuid_le_to_bin(guid, &guid_input)) if (uuid_le_to_bin(guid, &guid_input))
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
list_for_each(p, &wmi_block_list) { list_for_each_entry(block, &wmi_block_list, list) {
acpi_status wmi_status; acpi_status wmi_status;
block = list_entry(p, struct wmi_block, list);
if (memcmp(block->gblock.guid, &guid_input, 16) == 0) { if (memcmp(block->gblock.guid, &guid_input, 16) == 0) {
if (block->handler && if (block->handler &&
...@@ -560,7 +556,6 @@ acpi_status wmi_remove_notify_handler(const char *guid) ...@@ -560,7 +556,6 @@ acpi_status wmi_remove_notify_handler(const char *guid)
struct wmi_block *block; struct wmi_block *block;
acpi_status status = AE_NOT_EXIST; acpi_status status = AE_NOT_EXIST;
uuid_le guid_input; uuid_le guid_input;
struct list_head *p;
if (!guid) if (!guid)
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
...@@ -568,9 +563,8 @@ acpi_status wmi_remove_notify_handler(const char *guid) ...@@ -568,9 +563,8 @@ acpi_status wmi_remove_notify_handler(const char *guid)
if (uuid_le_to_bin(guid, &guid_input)) if (uuid_le_to_bin(guid, &guid_input))
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
list_for_each(p, &wmi_block_list) { list_for_each_entry(block, &wmi_block_list, list) {
acpi_status wmi_status; acpi_status wmi_status;
block = list_entry(p, struct wmi_block, list);
if (memcmp(block->gblock.guid, &guid_input, 16) == 0) { if (memcmp(block->gblock.guid, &guid_input, 16) == 0) {
if (!block->handler || if (!block->handler ||
...@@ -610,15 +604,13 @@ acpi_status wmi_get_event_data(u32 event, struct acpi_buffer *out) ...@@ -610,15 +604,13 @@ acpi_status wmi_get_event_data(u32 event, struct acpi_buffer *out)
union acpi_object params[1]; union acpi_object params[1];
struct guid_block *gblock; struct guid_block *gblock;
struct wmi_block *wblock; struct wmi_block *wblock;
struct list_head *p;
input.count = 1; input.count = 1;
input.pointer = params; input.pointer = params;
params[0].type = ACPI_TYPE_INTEGER; params[0].type = ACPI_TYPE_INTEGER;
params[0].integer.value = event; params[0].integer.value = event;
list_for_each(p, &wmi_block_list) { list_for_each_entry(wblock, &wmi_block_list, list) {
wblock = list_entry(p, struct wmi_block, list);
gblock = &wblock->gblock; gblock = &wblock->gblock;
if ((gblock->flags & ACPI_WMI_EVENT) && if ((gblock->flags & ACPI_WMI_EVENT) &&
...@@ -933,12 +925,11 @@ static int wmi_dev_probe(struct device *dev) ...@@ -933,12 +925,11 @@ static int wmi_dev_probe(struct device *dev)
goto probe_failure; goto probe_failure;
} }
buf = kmalloc(strlen(wdriver->driver.name) + 5, GFP_KERNEL); buf = kasprintf(GFP_KERNEL, "wmi/%s", wdriver->driver.name);
if (!buf) { if (!buf) {
ret = -ENOMEM; ret = -ENOMEM;
goto probe_string_failure; goto probe_string_failure;
} }
sprintf(buf, "wmi/%s", wdriver->driver.name);
wblock->char_dev.minor = MISC_DYNAMIC_MINOR; wblock->char_dev.minor = MISC_DYNAMIC_MINOR;
wblock->char_dev.name = buf; wblock->char_dev.name = buf;
wblock->char_dev.fops = &wmi_fops; wblock->char_dev.fops = &wmi_fops;
...@@ -1261,11 +1252,9 @@ static void acpi_wmi_notify_handler(acpi_handle handle, u32 event, ...@@ -1261,11 +1252,9 @@ static void acpi_wmi_notify_handler(acpi_handle handle, u32 event,
{ {
struct guid_block *block; struct guid_block *block;
struct wmi_block *wblock; struct wmi_block *wblock;
struct list_head *p;
bool found_it = false; bool found_it = false;
list_for_each(p, &wmi_block_list) { list_for_each_entry(wblock, &wmi_block_list, list) {
wblock = list_entry(p, struct wmi_block, list);
block = &wblock->gblock; block = &wblock->gblock;
if (wblock->acpi_device->handle == handle && if (wblock->acpi_device->handle == handle &&
......
...@@ -129,6 +129,8 @@ struct mlxreg_core_platform_data { ...@@ -129,6 +129,8 @@ struct mlxreg_core_platform_data {
* @mask: top aggregation interrupt common mask; * @mask: top aggregation interrupt common mask;
* @cell_low: location of low aggregation interrupt register; * @cell_low: location of low aggregation interrupt register;
* @mask_low: low aggregation interrupt common mask; * @mask_low: low aggregation interrupt common mask;
* @deferred_nr: I2C adapter number must be exist prior probing execution;
* @shift_nr: I2C adapter numbers must be incremented by this value;
*/ */
struct mlxreg_core_hotplug_platform_data { struct mlxreg_core_hotplug_platform_data {
struct mlxreg_core_item *items; struct mlxreg_core_item *items;
...@@ -139,6 +141,8 @@ struct mlxreg_core_hotplug_platform_data { ...@@ -139,6 +141,8 @@ struct mlxreg_core_hotplug_platform_data {
u32 mask; u32 mask;
u32 cell_low; u32 cell_low;
u32 mask_low; u32 mask_low;
int deferred_nr;
int shift_nr;
}; };
#endif /* __LINUX_PLATFORM_DATA_MLXREG_H */ #endif /* __LINUX_PLATFORM_DATA_MLXREG_H */
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