| From foo@baz Thu Mar 22 14:57:32 CET 2018 |
| From: Edgar Cherkasov <echerkasov@dev.rtsoft.ru> |
| Date: Tue, 4 Apr 2017 19:18:27 +0300 |
| Subject: i2c: i2c-scmi: add a MS HID |
| |
| From: Edgar Cherkasov <echerkasov@dev.rtsoft.ru> |
| |
| |
| [ Upstream commit e058e7a4bc89104540a8a303682248614b5df6f1 ] |
| |
| Description of the problem: |
| - i2c-scmi driver contains only two identifiers "SMBUS01" and "SMBUSIBM"; |
| - the fist HID (SMBUS01) is clearly defined in "SMBus Control Method |
| Interface Specification, version 1.0": "Each device must specify |
| 'SMBUS01' as its _HID and use a unique _UID value"; |
| - unfortunately, BIOS vendors (like AMI) seem to ignore this requirement |
| and implement "SMB0001" HID instead of "SMBUS01"; |
| - I speculate that they do this because only "SMB0001" is hard coded in |
| Windows SMBus driver produced by Microsoft. |
| |
| This leads to following situation: |
| - SMBus works out of box in Windows but not in Linux; |
| - board vendors are forced to add correct "SMBUS01" HID to BIOS to make |
| SMBus work in Linux. Moreover the same board vendors complain that |
| tools (3-rd party ASL compiler) do not like the "SMBUS01" identifier |
| and produce errors. So they need to constantly patch the compiler for |
| each new version of BIOS. |
| |
| As it is very unlikely that BIOS vendors implement a correct HID in |
| future, I would propose to consider whether it is possible to work around |
| the problem by adding MS HID to the Linux i2c-scmi driver. |
| |
| v2: move the definition of the new HID to the driver itself. |
| |
| Signed-off-by: Edgar Cherkasov <echerkasov@dev.rtsoft.ru> |
| Signed-off-by: Michael Brunner <Michael.Brunner@kontron.com> |
| Acked-by: Viktor Krasnov <vkrasnov@dev.rtsoft.ru> |
| Reviewed-by: Jean Delvare <jdelvare@suse.de> |
| Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/i2c/busses/i2c-scmi.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/drivers/i2c/busses/i2c-scmi.c |
| +++ b/drivers/i2c/busses/i2c-scmi.c |
| @@ -18,6 +18,9 @@ |
| #define ACPI_SMBUS_HC_CLASS "smbus" |
| #define ACPI_SMBUS_HC_DEVICE_NAME "cmi" |
| |
| +/* SMBUS HID definition as supported by Microsoft Windows */ |
| +#define ACPI_SMBUS_MS_HID "SMB0001" |
| + |
| ACPI_MODULE_NAME("smbus_cmi"); |
| |
| struct smbus_methods_t { |
| @@ -51,6 +54,7 @@ static const struct smbus_methods_t ibm_ |
| static const struct acpi_device_id acpi_smbus_cmi_ids[] = { |
| {"SMBUS01", (kernel_ulong_t)&smbus_methods}, |
| {ACPI_SMBUS_IBM_HID, (kernel_ulong_t)&ibm_smbus_methods}, |
| + {ACPI_SMBUS_MS_HID, (kernel_ulong_t)&smbus_methods}, |
| {"", 0} |
| }; |
| MODULE_DEVICE_TABLE(acpi, acpi_smbus_cmi_ids); |