1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2008 Sensoray Company Inc.
6 #include <linux/module.h>
7 #include <linux/slab.h>
9 #include <linux/firmware.h>
10 #include <cypress_firmware.h>
15 const char * const fw_name1;
16 const char * const fw_name2;
19 static struct fw_config fw_configs[] = {
20 { 0x1943, 0xa250, "/*(DEBLOBBED)*/", "/*(DEBLOBBED)*/" },
21 { 0x093b, 0xa002, "/*(DEBLOBBED)*/", NULL },
22 { 0x093b, 0xa004, "/*(DEBLOBBED)*/", NULL },
23 { 0x0eb1, 0x6666, "/*(DEBLOBBED)*/", NULL },
24 { 0x0eb1, 0x6668, "/*(DEBLOBBED)*/", NULL },
29 static int go7007_loader_probe(struct usb_interface *interface,
30 const struct usb_device_id *id)
32 struct usb_device *usbdev;
33 const struct firmware *fw;
35 const char *fw1, *fw2;
39 usbdev = usb_get_dev(interface_to_usbdev(interface));
43 if (usbdev->descriptor.bNumConfigurations != 1) {
44 dev_err(&interface->dev, "can't handle multiple config\n");
48 vendor = le16_to_cpu(usbdev->descriptor.idVendor);
49 product = le16_to_cpu(usbdev->descriptor.idProduct);
51 for (i = 0; fw_configs[i].fw_name1; i++)
52 if (fw_configs[i].vendor == vendor &&
53 fw_configs[i].product == product)
56 /* Should never happen */
57 if (fw_configs[i].fw_name1 == NULL)
60 fw1 = fw_configs[i].fw_name1;
61 fw2 = fw_configs[i].fw_name2;
63 dev_info(&interface->dev, "loading firmware %s\n", fw1);
65 if (reject_firmware(&fw, fw1, &usbdev->dev)) {
66 dev_err(&interface->dev,
67 "unable to load firmware from file \"%s\"\n", fw1);
70 ret = cypress_load_firmware(usbdev, fw, CYPRESS_FX2);
73 dev_err(&interface->dev, "loader download failed\n");
80 if (reject_firmware(&fw, fw2, &usbdev->dev)) {
81 dev_err(&interface->dev,
82 "unable to load firmware from file \"%s\"\n", fw2);
85 ret = cypress_load_firmware(usbdev, fw, CYPRESS_FX2);
88 dev_err(&interface->dev, "firmware download failed\n");
95 dev_err(&interface->dev, "probe failed\n");
99 static void go7007_loader_disconnect(struct usb_interface *interface)
101 dev_info(&interface->dev, "disconnect\n");
102 usb_put_dev(interface_to_usbdev(interface));
103 usb_set_intfdata(interface, NULL);
106 static const struct usb_device_id go7007_loader_ids[] = {
107 { USB_DEVICE(0x1943, 0xa250) },
108 { USB_DEVICE(0x093b, 0xa002) },
109 { USB_DEVICE(0x093b, 0xa004) },
110 { USB_DEVICE(0x0eb1, 0x6666) },
111 { USB_DEVICE(0x0eb1, 0x6668) },
112 {} /* Terminating entry */
115 MODULE_DEVICE_TABLE(usb, go7007_loader_ids);
117 static struct usb_driver go7007_loader_driver = {
118 .name = "go7007-loader",
119 .probe = go7007_loader_probe,
120 .disconnect = go7007_loader_disconnect,
121 .id_table = go7007_loader_ids,
124 module_usb_driver(go7007_loader_driver);
127 MODULE_DESCRIPTION("firmware loader for go7007-usb");
128 MODULE_LICENSE("GPL v2");