HID: intel-ish-hid: fix module device-id handling
``` Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1921376 Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45226519 Upstream status: v5.18-rc6 Conflicts: Fast-forwarded past minor changes in upstream 44e2a58cb880. commit bf9167a8b40c9cf463521da05342db81808c1b6e Author: Arnd Bergmann <arnd@arndb.de> Date: Thu Nov 11 09:56:33 2021 +0100 HID: intel-ish-hid: fix module device-id handling A late addititon to the intel-ish-hid framework caused a build failure with clang, and introduced an ABI to the module loader that stops working if any driver ever needs to bind to more than one UUID: drivers/hid/intel-ish-hid/ishtp-fw-loader.c:1067:4: error: initializer element is not a compile-time constant Change the ishtp_device_id to have correct documentation and a driver_data field like all the other ones, and change the drivers to use the ID table as the primary identification in a way that works with all compilers and avoids duplciating the identifiers. Fixes: f155dfeaa4ee ("platform/x86: isthp_eclite: only load for matching devices") Fixes: facfe0a4fdce ("platform/chrome: chros_ec_ishtp: only load for matching devices") Fixes: 0d0cccc0fd83 ("HID: intel-ish-hid: hid-client: only load for matching devices") Fixes: 44e2a58cb880 ("HID: intel-ish-hid: fw-loader: only load for matching devices") Fixes: cb1a2c6847f7 ("HID: intel-ish-hid: use constants for modaliases") Fixes: fa443bc3c1e4 ("HID: intel-ish-hid: add support for MODULE_DEVICE_TABLE()") Signed-off-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Hans de Goede <hdegoede@redhat.com> [jkosina@suse.cz: fix ecl_ishtp_cl_driver.id initialization] [jkosina@suse.cz: fix conflict with already fixed kerneldoc] Signed-off-by: Jiri Kosina <jkosina@suse.cz> Signed-off-by: Tony Camuso <tcamuso@redhat.com>
This commit is contained in:
parent
6de6c426d2
commit
2dbebbcd24
|
@ -76,9 +76,12 @@ enum ish_loader_commands {
|
|||
#define LOADER_XFER_MODE_ISHTP BIT(1)
|
||||
|
||||
/* ISH Transport Loader client unique GUID */
|
||||
static const guid_t loader_ishtp_guid =
|
||||
GUID_INIT(0xc804d06a, 0x55bd, 0x4ea7,
|
||||
0xad, 0xed, 0x1e, 0x31, 0x22, 0x8c, 0x76, 0xdc);
|
||||
static const struct ishtp_device_id loader_ishtp_id_table[] = {
|
||||
{ .guid = GUID_INIT(0xc804d06a, 0x55bd, 0x4ea7,
|
||||
0xad, 0xed, 0x1e, 0x31, 0x22, 0x8c, 0x76, 0xdc) },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(ishtp, loader_ishtp_id_table);
|
||||
|
||||
#define FILENAME_SIZE 256
|
||||
|
||||
|
@ -880,7 +883,7 @@ static int loader_init(struct ishtp_cl *loader_ishtp_cl, int reset)
|
|||
|
||||
fw_client =
|
||||
ishtp_fw_cl_get_client(ishtp_get_ishtp_device(loader_ishtp_cl),
|
||||
&loader_ishtp_guid);
|
||||
&loader_ishtp_id_table[0].guid);
|
||||
if (!fw_client) {
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"ISH client uuid not found\n");
|
||||
|
@ -1057,7 +1060,7 @@ static int loader_ishtp_cl_reset(struct ishtp_cl_device *cl_device)
|
|||
|
||||
static struct ishtp_cl_driver loader_ishtp_cl_driver = {
|
||||
.name = "ish-loader",
|
||||
.guid = &loader_ishtp_guid,
|
||||
.id = loader_ishtp_id_table,
|
||||
.probe = loader_ishtp_cl_probe,
|
||||
.remove = loader_ishtp_cl_remove,
|
||||
.reset = loader_ishtp_cl_reset,
|
||||
|
|
|
@ -12,9 +12,12 @@
|
|||
#include "ishtp-hid.h"
|
||||
|
||||
/* ISH Transport protocol (ISHTP in short) GUID */
|
||||
static const guid_t hid_ishtp_guid =
|
||||
GUID_INIT(0x33AECD58, 0xB679, 0x4E54,
|
||||
0x9B, 0xD9, 0xA0, 0x4D, 0x34, 0xF0, 0xC2, 0x26);
|
||||
static const struct ishtp_device_id hid_ishtp_id_table[] = {
|
||||
{ .guid = GUID_INIT(0x33AECD58, 0xB679, 0x4E54,
|
||||
0x9B, 0xD9, 0xA0, 0x4D, 0x34, 0xF0, 0xC2, 0x26), },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(ishtp, hid_ishtp_id_table);
|
||||
|
||||
/* Rx ring buffer pool size */
|
||||
#define HID_CL_RX_RING_SIZE 32
|
||||
|
@ -662,7 +665,7 @@ static int hid_ishtp_cl_init(struct ishtp_cl *hid_ishtp_cl, int reset)
|
|||
ishtp_set_tx_ring_size(hid_ishtp_cl, HID_CL_TX_RING_SIZE);
|
||||
ishtp_set_rx_ring_size(hid_ishtp_cl, HID_CL_RX_RING_SIZE);
|
||||
|
||||
fw_client = ishtp_fw_cl_get_client(dev, &hid_ishtp_guid);
|
||||
fw_client = ishtp_fw_cl_get_client(dev, &hid_ishtp_id_table[0].guid);
|
||||
if (!fw_client) {
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"ish client uuid not found\n");
|
||||
|
@ -945,7 +948,7 @@ static const struct dev_pm_ops hid_ishtp_pm_ops = {
|
|||
|
||||
static struct ishtp_cl_driver hid_ishtp_cl_driver = {
|
||||
.name = "ish-hid",
|
||||
.guid = &hid_ishtp_guid,
|
||||
.id = hid_ishtp_id_table,
|
||||
.probe = hid_ishtp_cl_probe,
|
||||
.remove = hid_ishtp_cl_remove,
|
||||
.reset = hid_ishtp_cl_reset,
|
||||
|
|
|
@ -241,7 +241,7 @@ static int ishtp_cl_bus_match(struct device *dev, struct device_driver *drv)
|
|||
struct ishtp_cl_device *device = to_ishtp_cl_device(dev);
|
||||
struct ishtp_cl_driver *driver = to_ishtp_cl_driver(drv);
|
||||
|
||||
return guid_equal(driver->guid,
|
||||
return guid_equal(&driver->id[0].guid,
|
||||
&device->fw_client->props.protocol_name);
|
||||
}
|
||||
|
||||
|
|
|
@ -41,9 +41,12 @@ enum cros_ec_ish_channel {
|
|||
#define ISHTP_SEND_TIMEOUT (3 * HZ)
|
||||
|
||||
/* ISH Transport CrOS EC ISH client unique GUID */
|
||||
static const guid_t cros_ish_guid =
|
||||
GUID_INIT(0x7b7154d0, 0x56f4, 0x4bdc,
|
||||
0xb0, 0xd8, 0x9e, 0x7c, 0xda, 0xe0, 0xd6, 0xa0);
|
||||
static const struct ishtp_device_id cros_ec_ishtp_id_table[] = {
|
||||
{ .guid = GUID_INIT(0x7b7154d0, 0x56f4, 0x4bdc,
|
||||
0xb0, 0xd8, 0x9e, 0x7c, 0xda, 0xe0, 0xd6, 0xa0), },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(ishtp, cros_ec_ishtp_id_table);
|
||||
|
||||
struct header {
|
||||
u8 channel;
|
||||
|
@ -389,7 +392,7 @@ static int cros_ish_init(struct ishtp_cl *cros_ish_cl)
|
|||
ishtp_set_tx_ring_size(cros_ish_cl, CROS_ISH_CL_TX_RING_SIZE);
|
||||
ishtp_set_rx_ring_size(cros_ish_cl, CROS_ISH_CL_RX_RING_SIZE);
|
||||
|
||||
fw_client = ishtp_fw_cl_get_client(dev, &cros_ish_guid);
|
||||
fw_client = ishtp_fw_cl_get_client(dev, &cros_ec_ishtp_id_table[0].guid);
|
||||
if (!fw_client) {
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"ish client uuid not found\n");
|
||||
|
@ -765,7 +768,7 @@ static SIMPLE_DEV_PM_OPS(cros_ec_ishtp_pm_ops, cros_ec_ishtp_suspend,
|
|||
|
||||
static struct ishtp_cl_driver cros_ec_ishtp_driver = {
|
||||
.name = "cros_ec_ishtp",
|
||||
.guid = &cros_ish_guid,
|
||||
.id = cros_ec_ishtp_id_table,
|
||||
.probe = cros_ec_ishtp_probe,
|
||||
.remove = cros_ec_ishtp_remove,
|
||||
.reset = cros_ec_ishtp_reset,
|
||||
|
|
|
@ -684,12 +684,6 @@ static struct ishtp_cl_driver ecl_ishtp_cl_driver = {
|
|||
.driver.pm = &ecl_ishtp_pm_ops,
|
||||
};
|
||||
|
||||
static const struct ishtp_device_id ecl_ishtp_id_table[] = {
|
||||
{ ecl_ishtp_guid },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(ishtp, ecl_ishtp_id_table);
|
||||
|
||||
static int __init ecl_ishtp_init(void)
|
||||
{
|
||||
return ishtp_cl_driver_register(&ecl_ishtp_cl_driver, THIS_MODULE);
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#define _INTEL_ISH_CLIENT_IF_H_
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/uuid.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
|
||||
struct ishtp_cl_device;
|
||||
struct ishtp_device;
|
||||
|
@ -40,7 +40,7 @@ enum cl_state {
|
|||
struct ishtp_cl_driver {
|
||||
struct device_driver driver;
|
||||
const char *name;
|
||||
const guid_t *guid;
|
||||
const struct ishtp_device_id *id;
|
||||
int (*probe)(struct ishtp_cl_device *dev);
|
||||
void (*remove)(struct ishtp_cl_device *dev);
|
||||
int (*reset)(struct ishtp_cl_device *dev);
|
||||
|
|
|
@ -896,9 +896,11 @@ struct dfl_device_id {
|
|||
/**
|
||||
* struct ishtp_device_id - ISHTP device identifier
|
||||
* @guid: GUID of the device.
|
||||
* @driver_data: pointer to driver specific data
|
||||
*/
|
||||
struct ishtp_device_id {
|
||||
guid_t guid;
|
||||
kernel_ulong_t driver_data;
|
||||
};
|
||||
|
||||
#endif /* LINUX_MOD_DEVICETABLE_H */
|
||||
|
|
Loading…
Reference in New Issue