From 70c048a238c780c226eb4b115ebaa908cb3b34ec Mon Sep 17 00:00:00 2001 From: Rene Buergel Date: Wed, 26 Sep 2012 22:20:19 +0200 Subject: USB: ezusb: move ezusb.c from drivers/usb/serial to drivers/usb/misc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch - moves drivers/usb/serial/ezusb.c to drivers/usb/misc/ - renamed CONFIG_USB_EZUSB to CONFIG_USB_EZUSB_FX2 to avoid build errors - adapts Makefiles and Kconfigs switching from bool to tristate for CONFIG_USB_EZUSB_FX2 Signed-off-by: René Bürgel Signed-off-by: Greg Kroah-Hartman diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig index 1bfcd02..a8f0523 100644 --- a/drivers/usb/misc/Kconfig +++ b/drivers/usb/misc/Kconfig @@ -244,3 +244,8 @@ config USB_YUREX To compile this driver as a module, choose M here: the module will be called yurex. +config USB_EZUSB_FX2 + tristate "Functions for loading firmware on EZUSB chips" + help + Say Y here if you need EZUSB device support. + (Cypress FX/FX2/FX2LP microcontrollers) diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile index 796ce7e..3e99a64 100644 --- a/drivers/usb/misc/Makefile +++ b/drivers/usb/misc/Makefile @@ -11,6 +11,7 @@ obj-$(CONFIG_USB_CYPRESS_CY7C63) += cypress_cy7c63.o obj-$(CONFIG_USB_CYTHERM) += cytherm.o obj-$(CONFIG_USB_EMI26) += emi26.o obj-$(CONFIG_USB_EMI62) += emi62.o +obj-$(CONFIG_USB_EZUSB_FX2) += ezusb.o obj-$(CONFIG_USB_FTDI_ELAN) += ftdi-elan.o obj-$(CONFIG_USB_IDMOUSE) += idmouse.o obj-$(CONFIG_USB_IOWARRIOR) += iowarrior.o diff --git a/drivers/usb/misc/ezusb.c b/drivers/usb/misc/ezusb.c new file mode 100644 index 0000000..4223d76 --- /dev/null +++ b/drivers/usb/misc/ezusb.c @@ -0,0 +1,160 @@ +/* + * EZ-USB specific functions used by some of the USB to Serial drivers. + * + * Copyright (C) 1999 - 2002 Greg Kroah-Hartman (greg@kroah.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include + +struct ezusb_fx_type { + /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ + unsigned short cpucs_reg; + unsigned short max_internal_adress; +}; + +struct ezusb_fx_type ezusb_fx1 = { + .cpucs_reg = 0x7F92, + .max_internal_adress = 0x1B3F, +}; + +struct ezusb_fx_type ezusb_fx2 = { + .cpucs_reg = 0xE600, + .max_internal_adress = 0x3FFF, +}; + +/* Commands for writing to memory */ +#define WRITE_INT_RAM 0xA0 +#define WRITE_EXT_RAM 0xA3 + +int ezusb_writememory(struct usb_device *dev, int address, + unsigned char *data, int length, __u8 request) +{ + int result; + unsigned char *transfer_buffer; + + if (!dev) + return -ENODEV; + + transfer_buffer = kmemdup(data, length, GFP_KERNEL); + if (!transfer_buffer) { + dev_err(&dev->dev, "%s - kmalloc(%d) failed.\n", + __func__, length); + return -ENOMEM; + } + result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, + address, 0, transfer_buffer, length, 3000); + + kfree(transfer_buffer); + return result; +} +EXPORT_SYMBOL_GPL(ezusb_writememory); + +int ezusb_set_reset(struct usb_device *dev, unsigned short cpucs_reg, + unsigned char reset_bit) +{ + int response = ezusb_writememory(dev, cpucs_reg, &reset_bit, 1, WRITE_INT_RAM); + if (response < 0) + dev_err(&dev->dev, "%s-%d failed: %d\n", + __func__, reset_bit, response); + return response; +} + +int ezusb_fx1_set_reset(struct usb_device *dev, unsigned char reset_bit) +{ + return ezusb_set_reset(dev, ezusb_fx1.cpucs_reg, reset_bit); +} +EXPORT_SYMBOL_GPL(ezusb_fx1_set_reset); + +int ezusb_fx2_set_reset(struct usb_device *dev, unsigned char reset_bit) +{ + return ezusb_set_reset(dev, ezusb_fx2.cpucs_reg, reset_bit); +} +EXPORT_SYMBOL_GPL(ezusb_fx2_set_reset); + +static int ezusb_ihex_firmware_download(struct usb_device *dev, + struct ezusb_fx_type fx, + const char *firmware_path) +{ + int ret = -ENOENT; + const struct firmware *firmware = NULL; + const struct ihex_binrec *record; + + if (request_ihex_firmware(&firmware, firmware_path, + &dev->dev)) { + dev_err(&dev->dev, + "%s - request \"%s\" failed\n", + __func__, firmware_path); + goto out; + } + + ret = ezusb_set_reset(dev, fx.cpucs_reg, 0); + if (ret < 0) + goto out; + + record = (const struct ihex_binrec *)firmware->data; + for (; record; record = ihex_next_binrec(record)) { + if (be32_to_cpu(record->addr) > fx.max_internal_adress) { + ret = ezusb_writememory(dev, be32_to_cpu(record->addr), + (unsigned char *)record->data, + be16_to_cpu(record->len), WRITE_EXT_RAM); + if (ret < 0) { + dev_err(&dev->dev, "%s - ezusb_writememory " + "failed writing internal memory " + "(%d %04X %p %d)\n", __func__, ret, + be32_to_cpu(record->addr), record->data, + be16_to_cpu(record->len)); + goto out; + } + } + } + + ret = ezusb_set_reset(dev, fx.cpucs_reg, 1); + if (ret < 0) + goto out; + record = (const struct ihex_binrec *)firmware->data; + for (; record; record = ihex_next_binrec(record)) { + if (be32_to_cpu(record->addr) <= fx.max_internal_adress) { + ret = ezusb_writememory(dev, be32_to_cpu(record->addr), + (unsigned char *)record->data, + be16_to_cpu(record->len), WRITE_INT_RAM); + if (ret < 0) { + dev_err(&dev->dev, "%s - ezusb_writememory " + "failed writing external memory " + "(%d %04X %p %d)\n", __func__, ret, + be32_to_cpu(record->addr), record->data, + be16_to_cpu(record->len)); + goto out; + } + } + } + ret = ezusb_set_reset(dev, fx.cpucs_reg, 0); +out: + release_firmware(firmware); + return ret; +} + +int ezusb_fx1_ihex_firmware_download(struct usb_device *dev, + const char *firmware_path) +{ + return ezusb_ihex_firmware_download(dev, ezusb_fx1, firmware_path); +} +EXPORT_SYMBOL_GPL(ezusb_fx1_ihex_firmware_download); + +int ezusb_fx2_ihex_firmware_download(struct usb_device *dev, + const char *firmware_path) +{ + return ezusb_ihex_firmware_download(dev, ezusb_fx2, firmware_path); +} +EXPORT_SYMBOL_GPL(ezusb_fx2_ihex_firmware_download); + diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index f604f70..76f4622 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig @@ -42,11 +42,6 @@ config USB_SERIAL_CONSOLE If unsure, say N. -config USB_EZUSB - bool "Functions for loading firmware on EZUSB chips" - help - Say Y here if you need EZUSB device support. - config USB_SERIAL_GENERIC bool "USB Generic Serial Driver" help @@ -94,7 +89,7 @@ config USB_SERIAL_CH341 config USB_SERIAL_WHITEHEAT tristate "USB ConnectTech WhiteHEAT Serial Driver" - select USB_EZUSB + select USB_EZUSB_FX2 help Say Y here if you want to use a ConnectTech WhiteHEAT 4 port USB to serial converter device. @@ -281,7 +276,7 @@ config USB_SERIAL_IUU config USB_SERIAL_KEYSPAN_PDA tristate "USB Keyspan PDA Single Port Serial Driver" - select USB_EZUSB + select USB_EZUSB_FX2 help Say Y here if you want to use a Keyspan PDA single port USB to serial converter device. This driver makes use of firmware @@ -292,7 +287,7 @@ config USB_SERIAL_KEYSPAN_PDA config USB_SERIAL_KEYSPAN tristate "USB Keyspan USA-xxx Serial Driver" - select USB_EZUSB + select USB_EZUSB_FX2 ---help--- Say Y here if you want to use Keyspan USB to serial converter devices. This driver makes use of Keyspan's official firmware @@ -596,7 +591,7 @@ config USB_SERIAL_CYBERJACK config USB_SERIAL_XIRCOM tristate "USB Xircom / Entregra Single Port Serial Driver" - select USB_EZUSB + select USB_EZUSB_FX2 help Say Y here if you want to use a Xircom or Entregra single port USB to serial converter device. This driver makes use of firmware diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index 45871f9..3b3e730 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile @@ -9,7 +9,6 @@ obj-$(CONFIG_USB_SERIAL) += usbserial.o usbserial-y := usb-serial.o generic.o bus.o usbserial-$(CONFIG_USB_SERIAL_CONSOLE) += console.o -usbserial-$(CONFIG_USB_EZUSB) += ezusb.o obj-$(CONFIG_USB_SERIAL_AIRCABLE) += aircable.o obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o diff --git a/drivers/usb/serial/ezusb.c b/drivers/usb/serial/ezusb.c deleted file mode 100644 index 4223d76..0000000 --- a/drivers/usb/serial/ezusb.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * EZ-USB specific functions used by some of the USB to Serial drivers. - * - * Copyright (C) 1999 - 2002 Greg Kroah-Hartman (greg@kroah.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version - * 2 as published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include - -struct ezusb_fx_type { - /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ - unsigned short cpucs_reg; - unsigned short max_internal_adress; -}; - -struct ezusb_fx_type ezusb_fx1 = { - .cpucs_reg = 0x7F92, - .max_internal_adress = 0x1B3F, -}; - -struct ezusb_fx_type ezusb_fx2 = { - .cpucs_reg = 0xE600, - .max_internal_adress = 0x3FFF, -}; - -/* Commands for writing to memory */ -#define WRITE_INT_RAM 0xA0 -#define WRITE_EXT_RAM 0xA3 - -int ezusb_writememory(struct usb_device *dev, int address, - unsigned char *data, int length, __u8 request) -{ - int result; - unsigned char *transfer_buffer; - - if (!dev) - return -ENODEV; - - transfer_buffer = kmemdup(data, length, GFP_KERNEL); - if (!transfer_buffer) { - dev_err(&dev->dev, "%s - kmalloc(%d) failed.\n", - __func__, length); - return -ENOMEM; - } - result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request, - USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, - address, 0, transfer_buffer, length, 3000); - - kfree(transfer_buffer); - return result; -} -EXPORT_SYMBOL_GPL(ezusb_writememory); - -int ezusb_set_reset(struct usb_device *dev, unsigned short cpucs_reg, - unsigned char reset_bit) -{ - int response = ezusb_writememory(dev, cpucs_reg, &reset_bit, 1, WRITE_INT_RAM); - if (response < 0) - dev_err(&dev->dev, "%s-%d failed: %d\n", - __func__, reset_bit, response); - return response; -} - -int ezusb_fx1_set_reset(struct usb_device *dev, unsigned char reset_bit) -{ - return ezusb_set_reset(dev, ezusb_fx1.cpucs_reg, reset_bit); -} -EXPORT_SYMBOL_GPL(ezusb_fx1_set_reset); - -int ezusb_fx2_set_reset(struct usb_device *dev, unsigned char reset_bit) -{ - return ezusb_set_reset(dev, ezusb_fx2.cpucs_reg, reset_bit); -} -EXPORT_SYMBOL_GPL(ezusb_fx2_set_reset); - -static int ezusb_ihex_firmware_download(struct usb_device *dev, - struct ezusb_fx_type fx, - const char *firmware_path) -{ - int ret = -ENOENT; - const struct firmware *firmware = NULL; - const struct ihex_binrec *record; - - if (request_ihex_firmware(&firmware, firmware_path, - &dev->dev)) { - dev_err(&dev->dev, - "%s - request \"%s\" failed\n", - __func__, firmware_path); - goto out; - } - - ret = ezusb_set_reset(dev, fx.cpucs_reg, 0); - if (ret < 0) - goto out; - - record = (const struct ihex_binrec *)firmware->data; - for (; record; record = ihex_next_binrec(record)) { - if (be32_to_cpu(record->addr) > fx.max_internal_adress) { - ret = ezusb_writememory(dev, be32_to_cpu(record->addr), - (unsigned char *)record->data, - be16_to_cpu(record->len), WRITE_EXT_RAM); - if (ret < 0) { - dev_err(&dev->dev, "%s - ezusb_writememory " - "failed writing internal memory " - "(%d %04X %p %d)\n", __func__, ret, - be32_to_cpu(record->addr), record->data, - be16_to_cpu(record->len)); - goto out; - } - } - } - - ret = ezusb_set_reset(dev, fx.cpucs_reg, 1); - if (ret < 0) - goto out; - record = (const struct ihex_binrec *)firmware->data; - for (; record; record = ihex_next_binrec(record)) { - if (be32_to_cpu(record->addr) <= fx.max_internal_adress) { - ret = ezusb_writememory(dev, be32_to_cpu(record->addr), - (unsigned char *)record->data, - be16_to_cpu(record->len), WRITE_INT_RAM); - if (ret < 0) { - dev_err(&dev->dev, "%s - ezusb_writememory " - "failed writing external memory " - "(%d %04X %p %d)\n", __func__, ret, - be32_to_cpu(record->addr), record->data, - be16_to_cpu(record->len)); - goto out; - } - } - } - ret = ezusb_set_reset(dev, fx.cpucs_reg, 0); -out: - release_firmware(firmware); - return ret; -} - -int ezusb_fx1_ihex_firmware_download(struct usb_device *dev, - const char *firmware_path) -{ - return ezusb_ihex_firmware_download(dev, ezusb_fx1, firmware_path); -} -EXPORT_SYMBOL_GPL(ezusb_fx1_ihex_firmware_download); - -int ezusb_fx2_ihex_firmware_download(struct usb_device *dev, - const char *firmware_path) -{ - return ezusb_ihex_firmware_download(dev, ezusb_fx2, firmware_path); -} -EXPORT_SYMBOL_GPL(ezusb_fx2_ihex_firmware_download); - -- cgit v0.10.2