Commit bf9167a8 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Jiri Kosina
Browse files

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: f155dfea ("platform/x86: isthp_eclite: only load for matching devices")
Fixes: facfe0a4 ("platform/chrome: chros_ec_ishtp: only load for matching devices")
Fixes: 0d0cccc0 ("HID: intel-ish-hid: hid-client: only load for matching devices")
Fixes: 44e2a58c ("HID: intel-ish-hid: fw-loader: only load for matching devices")
Fixes: cb1a2c68 ("HID: intel-ish-hid: use constants for modaliases")
Fixes: fa443bc3 ("HID: intel-ish-hid: add support for MODULE_DEVICE_TABLE()")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Reviewed-by: default avatarHans 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: default avatarJiri Kosina <jkosina@suse.cz>
parent 64355db3
Loading
Loading
Loading
Loading
+8 −11
Original line number Diff line number Diff line
@@ -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,18 +1060,12 @@ 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,
};

static const struct ishtp_device_id loader_ishtp_id_table[] = {
	{ loader_ishtp_guid },
	{ }
};
MODULE_DEVICE_TABLE(ishtp, loader_ishtp_id_table);

static int __init ish_loader_init(void)
{
	return ishtp_cl_driver_register(&loader_ishtp_cl_driver, THIS_MODULE);
+8 −11
Original line number Diff line number Diff line
@@ -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,19 +948,13 @@ 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,
	.driver.pm = &hid_ishtp_pm_ops,
};

static const struct ishtp_device_id hid_ishtp_id_table[] = {
	{ hid_ishtp_guid },
	{ }
};
MODULE_DEVICE_TABLE(ishtp, hid_ishtp_id_table);

static int __init ish_hid_init(void)
{
	int	rv;
+1 −1
Original line number Diff line number Diff line
@@ -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);
}

+8 −11
Original line number Diff line number Diff line
@@ -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,
@@ -774,12 +777,6 @@ static struct ishtp_cl_driver cros_ec_ishtp_driver = {
	},
};

static const struct ishtp_device_id cros_ec_ishtp_id_table[] = {
	{ cros_ish_guid },
	{ }
};
MODULE_DEVICE_TABLE(ishtp, cros_ec_ishtp_id_table);

static int __init cros_ec_ishtp_mod_init(void)
{
	return ishtp_cl_driver_register(&cros_ec_ishtp_driver, THIS_MODULE);
+8 −11
Original line number Diff line number Diff line
@@ -93,9 +93,12 @@ struct ishtp_opregion_dev {
};

/* eclite ishtp client UUID: 6a19cc4b-d760-4de3-b14d-f25ebd0fbcd9 */
static const guid_t ecl_ishtp_guid =
	GUID_INIT(0x6a19cc4b, 0xd760, 0x4de3,
		  0xb1, 0x4d, 0xf2, 0x5e, 0xbd, 0xf, 0xbc, 0xd9);
static const struct ishtp_device_id ecl_ishtp_id_table[] = {
	{ .guid = GUID_INIT(0x6a19cc4b, 0xd760, 0x4de3,
		  0xb1, 0x4d, 0xf2, 0x5e, 0xbd, 0xf, 0xbc, 0xd9), },
	{ }
};
MODULE_DEVICE_TABLE(ishtp, ecl_ishtp_id_table);

/* ACPI DSM UUID: 91d936a7-1f01-49c6-a6b4-72f00ad8d8a5 */
static const guid_t ecl_acpi_guid =
@@ -462,7 +465,7 @@ static int ecl_ishtp_cl_init(struct ishtp_cl *ecl_ishtp_cl)
	ishtp_set_tx_ring_size(ecl_ishtp_cl, ECL_CL_TX_RING_SIZE);
	ishtp_set_rx_ring_size(ecl_ishtp_cl, ECL_CL_RX_RING_SIZE);

	fw_client = ishtp_fw_cl_get_client(dev, &ecl_ishtp_guid);
	fw_client = ishtp_fw_cl_get_client(dev, &ecl_ishtp_id_table[0].guid);
	if (!fw_client) {
		dev_err(cl_data_to_dev(opr_dev), "fw client not found\n");
		return -ENOENT;
@@ -674,19 +677,13 @@ static const struct dev_pm_ops ecl_ishtp_pm_ops = {

static struct ishtp_cl_driver ecl_ishtp_cl_driver = {
	.name = "ishtp-eclite",
	.guid = &ecl_ishtp_guid,
	.id = ecl_ishtp_id_table,
	.probe = ecl_ishtp_cl_probe,
	.remove = ecl_ishtp_cl_remove,
	.reset = ecl_ishtp_cl_reset,
	.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);
Loading