summaryrefslogtreecommitdiff
path: root/drivers/usb/misc/usb-ljca.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/misc/usb-ljca.c')
-rw-r--r--drivers/usb/misc/usb-ljca.c62
1 files changed, 34 insertions, 28 deletions
diff --git a/drivers/usb/misc/usb-ljca.c b/drivers/usb/misc/usb-ljca.c
index c562630d862c..c60121faa3da 100644
--- a/drivers/usb/misc/usb-ljca.c
+++ b/drivers/usb/misc/usb-ljca.c
@@ -164,28 +164,39 @@ struct ljca_match_ids_walk_data {
struct acpi_device *adev;
};
+/*
+ * ACPI hardware IDs for LJCA client devices.
+ *
+ * [1] Some BIOS implementations use these IDs for denoting LJCA client devices
+ * even though the IDs have been allocated for USBIO. This isn't a problem
+ * as the usb-ljca driver is probed based on the USB device's vendor and
+ * product IDs and its client drivers are probed based on auxiliary device
+ * names, not these ACPI _HIDs. List of such systems:
+ *
+ * Dell Precision 5490
+ */
static const struct acpi_device_id ljca_gpio_hids[] = {
- { "INTC1074" },
- { "INTC1096" },
- { "INTC100B" },
- { "INTC10D1" },
- { "INTC10B5" },
+ { "INTC100B" }, /* RPL LJCA GPIO */
+ { "INTC1074" }, /* CVF LJCA GPIO */
+ { "INTC1096" }, /* ADL LJCA GPIO */
+ { "INTC10B5" }, /* LNL LJCA GPIO */
+ { "INTC10D1" }, /* MTL (CVF VSC) USBIO GPIO [1] */
{},
};
static const struct acpi_device_id ljca_i2c_hids[] = {
- { "INTC1075" },
- { "INTC1097" },
- { "INTC100C" },
- { "INTC10D2" },
+ { "INTC100C" }, /* RPL LJCA I2C */
+ { "INTC1075" }, /* CVF LJCA I2C */
+ { "INTC1097" }, /* ADL LJCA I2C */
+ { "INTC10D2" }, /* MTL (CVF VSC) USBIO I2C [1] */
{},
};
static const struct acpi_device_id ljca_spi_hids[] = {
- { "INTC1091" },
- { "INTC1098" },
- { "INTC100D" },
- { "INTC10D3" },
+ { "INTC100D" }, /* RPL LJCA SPI */
+ { "INTC1091" }, /* TGL/ADL LJCA SPI */
+ { "INTC1098" }, /* ADL LJCA SPI */
+ { "INTC10D3" }, /* MTL (CVF VSC) USBIO SPI [1] */
{},
};
@@ -518,7 +529,7 @@ static int ljca_new_client_device(struct ljca_adapter *adap, u8 type, u8 id,
struct ljca_client *client;
int ret;
- client = kzalloc(sizeof *client, GFP_KERNEL);
+ client = kzalloc_obj(*client);
if (!client) {
kfree(data);
return -ENOMEM;
@@ -586,7 +597,7 @@ static int ljca_enumerate_gpio(struct ljca_adapter *adap)
return -EINVAL;
/* construct platform data */
- gpio_info = kzalloc(sizeof *gpio_info, GFP_KERNEL);
+ gpio_info = kzalloc_obj(*gpio_info);
if (!gpio_info)
return -ENOMEM;
gpio_info->num = gpio_num;
@@ -619,7 +630,7 @@ static int ljca_enumerate_i2c(struct ljca_adapter *adap)
for (i = 0; i < desc->num; i++) {
/* construct platform data */
- i2c_info = kzalloc(sizeof *i2c_info, GFP_KERNEL);
+ i2c_info = kzalloc_obj(*i2c_info);
if (!i2c_info)
return -ENOMEM;
@@ -658,7 +669,7 @@ static int ljca_enumerate_spi(struct ljca_adapter *adap)
for (i = 0; i < desc->num; i++) {
/* construct platform data */
- spi_info = kzalloc(sizeof *spi_info, GFP_KERNEL);
+ spi_info = kzalloc_obj(*spi_info);
if (!spi_info)
return -ENOMEM;
@@ -765,7 +776,7 @@ static int ljca_probe(struct usb_interface *interface,
init_completion(&adap->cmd_completion);
INIT_LIST_HEAD(&adap->client_list);
- adap->intf = usb_get_intf(interface);
+ adap->intf = interface;
adap->usb_dev = usb_dev;
adap->dev = dev;
@@ -776,7 +787,7 @@ static int ljca_probe(struct usb_interface *interface,
ret = usb_find_common_endpoints(alt, &ep_in, &ep_out, NULL, NULL);
if (ret) {
dev_err(dev, "bulk endpoints not found\n");
- goto err_put;
+ goto err_destroy_mutex;
}
adap->rx_pipe = usb_rcvbulkpipe(usb_dev, usb_endpoint_num(ep_in));
adap->tx_pipe = usb_sndbulkpipe(usb_dev, usb_endpoint_num(ep_out));
@@ -786,14 +797,14 @@ static int ljca_probe(struct usb_interface *interface,
adap->rx_buf = devm_kzalloc(dev, adap->rx_len, GFP_KERNEL);
if (!adap->rx_buf) {
ret = -ENOMEM;
- goto err_put;
+ goto err_destroy_mutex;
}
/* alloc rx urb */
adap->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
if (!adap->rx_urb) {
ret = -ENOMEM;
- goto err_put;
+ goto err_destroy_mutex;
}
usb_fill_bulk_urb(adap->rx_urb, usb_dev, adap->rx_pipe,
adap->rx_buf, adap->rx_len, ljca_recv, adap);
@@ -825,10 +836,7 @@ static int ljca_probe(struct usb_interface *interface,
err_free:
usb_free_urb(adap->rx_urb);
-
-err_put:
- usb_put_intf(adap->intf);
-
+err_destroy_mutex:
mutex_destroy(&adap->mutex);
return ret;
@@ -853,8 +861,6 @@ static void ljca_disconnect(struct usb_interface *interface)
usb_free_urb(adap->rx_urb);
- usb_put_intf(adap->intf);
-
mutex_destroy(&adap->mutex);
}
@@ -891,7 +897,7 @@ static struct usb_driver ljca_driver = {
};
module_usb_driver(ljca_driver);
-MODULE_AUTHOR("Wentong Wu <wentong.wu@intel.com>");
+MODULE_AUTHOR("Wentong Wu");
MODULE_AUTHOR("Zhifeng Wang <zhifeng.wang@intel.com>");
MODULE_AUTHOR("Lixu Zhang <lixu.zhang@intel.com>");
MODULE_DESCRIPTION("Intel La Jolla Cove Adapter USB driver");