Merge tag 'platform-drivers-x86-v4.21-1' of git://git.infradead.org/linux-platform-drivers-x86
Pull x86 platform driver updates from Andy Shevchenko: - The USB Power Delivery discrete components now can be enumerated by i2c-multi-instantiate driver via several resources under single ACPI device node (ACPI ID is INT3515). - Touchscreen support is added for the Mediacom Flexbook Edge 11. - Mellanox driver got fixed due to updates in their firmware. - The power management stub driver for AtomISP v2 is fixed in order to support Intel Baytrail SoCs where same quirk is needed for S0ix to work. - Special key handling has been fixed for Favorites hotkey on Thinkpad, and Screen LOCK on ASUS. - Ideapad Yoga 2 13 has no HW rfkill switch, thus, driver has been updated to support this. - Few cleanups related to debugfs have been made in Intel IPS and Intel PMC drivers. Besides that Intel PMC has been extended to show more detailed information about Latency Tolerance * tag 'platform-drivers-x86-v4.21-1' of git://git.infradead.org/linux-platform-drivers-x86: (41 commits) platform/x86: mlx-platform: Convert to use SPDX identifier Documentation/ABI: Add new attribute for mlxreg-io sysfs interfaces platform/x86: mlx-platform: Allow mlxreg-io driver activation for new systems platform/x86: mlx-platform: Fix LED configuration platform/x86: mlx-platform: Fix tachometer registers platform/x86: mlx-platform: Rename new systems product names platform/x86: mlx-platform: Add definitions for new registers platform/x86: intel_telemetry: convert to DEFINE_SHOW_ATTRIBUTE platform/x86: intel_pmc_core: convert to DEFINE_SHOW_ATTRIBUTE platform/x86: thinkpad_acpi: Cleanup quirks macros platform/x86: touchscreen_dmi: Add info for the Mediacom Flexbook Edge 11 platform/x86: Fix config space access for intel_atomisp2_pm platform/x86: Add the VLV ISP PCI ID to atomisp2_pm platform/x86: intel_ips: Convert to use DEFINE_SHOW_ATTRIBUTE macro platform/x86: intel_ips: Remove never happen condition platform/x86: intel_ips: NULL check before some freeing functions is not needed platform/x86: intel_ips: remove unnecessary checks in ips_debugfs_init iio: inv_mpu6050: Use i2c_acpi_get_i2c_resource() helper ACPI / scan: Create platform device for INT3515 ACPI nodes platform/x86: i2c-multi-instantiate: Allow to have same slaves ...
This commit is contained in:
@@ -45,6 +45,33 @@ struct i2c_acpi_lookup {
|
||||
u32 min_speed;
|
||||
};
|
||||
|
||||
/**
|
||||
* i2c_acpi_get_i2c_resource - Gets I2cSerialBus resource if type matches
|
||||
* @ares: ACPI resource
|
||||
* @i2c: Pointer to I2cSerialBus resource will be returned here
|
||||
*
|
||||
* Checks if the given ACPI resource is of type I2cSerialBus.
|
||||
* In this case, returns a pointer to it to the caller.
|
||||
*
|
||||
* Returns true if resource type is of I2cSerialBus, otherwise false.
|
||||
*/
|
||||
bool i2c_acpi_get_i2c_resource(struct acpi_resource *ares,
|
||||
struct acpi_resource_i2c_serialbus **i2c)
|
||||
{
|
||||
struct acpi_resource_i2c_serialbus *sb;
|
||||
|
||||
if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS)
|
||||
return false;
|
||||
|
||||
sb = &ares->data.i2c_serial_bus;
|
||||
if (sb->type != ACPI_RESOURCE_SERIAL_TYPE_I2C)
|
||||
return false;
|
||||
|
||||
*i2c = sb;
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(i2c_acpi_get_i2c_resource);
|
||||
|
||||
static int i2c_acpi_fill_info(struct acpi_resource *ares, void *data)
|
||||
{
|
||||
struct i2c_acpi_lookup *lookup = data;
|
||||
@@ -52,11 +79,7 @@ static int i2c_acpi_fill_info(struct acpi_resource *ares, void *data)
|
||||
struct acpi_resource_i2c_serialbus *sb;
|
||||
acpi_status status;
|
||||
|
||||
if (info->addr || ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS)
|
||||
return 1;
|
||||
|
||||
sb = &ares->data.i2c_serial_bus;
|
||||
if (sb->type != ACPI_RESOURCE_SERIAL_TYPE_I2C)
|
||||
if (info->addr || !i2c_acpi_get_i2c_resource(ares, &sb))
|
||||
return 1;
|
||||
|
||||
if (lookup->index != -1 && lookup->n++ != lookup->index)
|
||||
@@ -65,7 +88,7 @@ static int i2c_acpi_fill_info(struct acpi_resource *ares, void *data)
|
||||
status = acpi_get_handle(lookup->device_handle,
|
||||
sb->resource_source.string_ptr,
|
||||
&lookup->adapter_handle);
|
||||
if (!ACPI_SUCCESS(status))
|
||||
if (ACPI_FAILURE(status))
|
||||
return 1;
|
||||
|
||||
info->addr = sb->slave_address;
|
||||
@@ -386,20 +409,22 @@ struct notifier_block i2c_acpi_notifier = {
|
||||
*
|
||||
* Also see i2c_new_device, which this function calls to create the i2c-client.
|
||||
*
|
||||
* Returns a pointer to the new i2c-client, or NULL if the adapter is not found.
|
||||
* Returns a pointer to the new i2c-client, or error pointer in case of failure.
|
||||
* Specifically, -EPROBE_DEFER is returned if the adapter is not found.
|
||||
*/
|
||||
struct i2c_client *i2c_acpi_new_device(struct device *dev, int index,
|
||||
struct i2c_board_info *info)
|
||||
{
|
||||
struct i2c_acpi_lookup lookup;
|
||||
struct i2c_adapter *adapter;
|
||||
struct i2c_client *client;
|
||||
struct acpi_device *adev;
|
||||
LIST_HEAD(resource_list);
|
||||
int ret;
|
||||
|
||||
adev = ACPI_COMPANION(dev);
|
||||
if (!adev)
|
||||
return NULL;
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
memset(&lookup, 0, sizeof(lookup));
|
||||
lookup.info = info;
|
||||
@@ -408,16 +433,23 @@ struct i2c_client *i2c_acpi_new_device(struct device *dev, int index,
|
||||
|
||||
ret = acpi_dev_get_resources(adev, &resource_list,
|
||||
i2c_acpi_fill_info, &lookup);
|
||||
if (ret < 0)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
acpi_dev_free_resource_list(&resource_list);
|
||||
|
||||
if (ret < 0 || !info->addr)
|
||||
return NULL;
|
||||
if (!info->addr)
|
||||
return ERR_PTR(-EADDRNOTAVAIL);
|
||||
|
||||
adapter = i2c_acpi_find_adapter_by_handle(lookup.adapter_handle);
|
||||
if (!adapter)
|
||||
return NULL;
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
|
||||
return i2c_new_device(adapter, info);
|
||||
client = i2c_new_device(adapter, info);
|
||||
if (!client)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
return client;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(i2c_acpi_new_device);
|
||||
|
||||
@@ -525,13 +557,7 @@ i2c_acpi_space_handler(u32 function, acpi_physical_address command,
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!value64 || ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS) {
|
||||
ret = AE_BAD_PARAMETER;
|
||||
goto err;
|
||||
}
|
||||
|
||||
sb = &ares->data.i2c_serial_bus;
|
||||
if (sb->type != ACPI_RESOURCE_SERIAL_TYPE_I2C) {
|
||||
if (!value64 || !i2c_acpi_get_i2c_resource(ares, &sb)) {
|
||||
ret = AE_BAD_PARAMETER;
|
||||
goto err;
|
||||
}
|
||||
|
Reference in New Issue
Block a user