USB: ftdi-elan: client driver for ELAN Uxxx adapters
This "ftdi-elan" module is one half of the "driver" for ELAN's Uxxx series adapters which are USB to PCMCIA CardBus adapters. Currently only the U132 adapter is available and it's module is called "u132-hcd". When the USB hot plug subsystem detects a Uxxx series adapter it should load this module. Upon a successful device probe() the jtag device file interface is created and the status workqueue started up. The jtag device file interface exists for the purpose of updating the firmware in the Uxxx series adapter, but as yet it had never been used. The status workqueue initializes the Uxxx and then sits there polling the Uxxx until a supported PCMCIA CardBus device is detected it will start the command and respond workqueues and then load the module that handles the device. This will initially be only the u132-hcd module. The status workqueue then just polls the Uxxx looking for card ejects. The command and respond workqueues implement a command sequencer for communicating with the firmware on the other side of the FTDI chip in the Uxxx. This "ftdi-elan" module exports some functions to interface with the sequencer. Note that this module is a USB client driver. Note that the "u132-hcd" module is a (cut-down OHCI) host controller. Thus we have a topology with the parent of a host controller being a USB client! This really stresses the USB subsystem semaphore/mutex handling in the module removal. Signed-off-by: Tony Olech <tony.olech@elandigitalsystems.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
8fd8013393
commit
a5c66e4b24
5 changed files with 2936 additions and 5 deletions
|
@ -48,23 +48,24 @@ obj-$(CONFIG_USB_MICROTEK) += image/
|
|||
|
||||
obj-$(CONFIG_USB_SERIAL) += serial/
|
||||
|
||||
obj-$(CONFIG_USB_ADUTUX) += misc/
|
||||
obj-$(CONFIG_USB_APPLEDISPLAY) += misc/
|
||||
obj-$(CONFIG_USB_AUERSWALD) += misc/
|
||||
obj-$(CONFIG_USB_CYPRESS_CY7C63)+= misc/
|
||||
obj-$(CONFIG_USB_CYTHERM) += misc/
|
||||
obj-$(CONFIG_USB_EMI26) += misc/
|
||||
obj-$(CONFIG_USB_EMI62) += misc/
|
||||
obj-$(CONFIG_USB_FTDI_ELAN) += misc/
|
||||
obj-$(CONFIG_USB_IDMOUSE) += misc/
|
||||
obj-$(CONFIG_USB_LCD) += misc/
|
||||
obj-$(CONFIG_USB_LD) += misc/
|
||||
obj-$(CONFIG_USB_LED) += misc/
|
||||
obj-$(CONFIG_USB_LEGOTOWER) += misc/
|
||||
obj-$(CONFIG_USB_PHIDGETSERVO) += misc/
|
||||
obj-$(CONFIG_USB_RIO500) += misc/
|
||||
obj-$(CONFIG_USB_SISUSBVGA) += misc/
|
||||
obj-$(CONFIG_USB_TEST) += misc/
|
||||
obj-$(CONFIG_USB_USS720) += misc/
|
||||
obj-$(CONFIG_USB_PHIDGETSERVO) += misc/
|
||||
obj-$(CONFIG_USB_SISUSBVGA) += misc/
|
||||
obj-$(CONFIG_USB_APPLEDISPLAY) += misc/
|
||||
obj-$(CONFIG_USB_ADUTUX) += misc/
|
||||
|
||||
obj-$(CONFIG_USB_ATM) += atm/
|
||||
obj-$(CONFIG_USB_SPEEDTOUCH) += atm/
|
||||
|
|
|
@ -178,6 +178,30 @@ config USB_IDMOUSE
|
|||
|
||||
See also <http://www.fs.tum.de/~echtler/idmouse/>.
|
||||
|
||||
config USB_FTDI_ELAN
|
||||
tristate "Elan PCMCIA CardBus Adapter USB Client"
|
||||
depends on USB
|
||||
default M
|
||||
help
|
||||
ELAN's Uxxx series of adapters are USB to PCMCIA CardBus adapters.
|
||||
Currently only the U132 adapter is available.
|
||||
|
||||
The U132 is specifically designed for CardBus PC cards that contain
|
||||
an OHCI host controller. Typical PC cards are the Orange Mobile 3G
|
||||
Option GlobeTrotter Fusion card. The U132 adapter will *NOT* work
|
||||
with PC cards that do not contain an OHCI controller. To use a U132
|
||||
adapter you will need this "ftdi-elan" module as well as the "u132-hcd"
|
||||
module which is a USB host controller driver that talks to the OHCI
|
||||
controller within CardBus card that are inserted in the U132 adapter.
|
||||
|
||||
This driver has been tested with a CardBus OHCI USB adapter, and
|
||||
worked with a USB PEN Drive inserted into the first USB port of
|
||||
the PCCARD. A rather pointless thing to do, but useful for testing.
|
||||
|
||||
See also the USB_U132_HCD entry "Elan U132 Adapter Host Controller"
|
||||
|
||||
It is safe to say M here.
|
||||
|
||||
config USB_APPLEDISPLAY
|
||||
tristate "Apple Cinema Display support"
|
||||
depends on USB
|
||||
|
|
|
@ -9,6 +9,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_FTDI_ELAN) += ftdi-elan.o
|
||||
obj-$(CONFIG_USB_IDMOUSE) += idmouse.o
|
||||
obj-$(CONFIG_USB_LCD) += usblcd.o
|
||||
obj-$(CONFIG_USB_LD) += ldusb.o
|
||||
|
@ -21,7 +22,6 @@ obj-$(CONFIG_USB_PHIDGETSERVO) += phidgetservo.o
|
|||
obj-$(CONFIG_USB_RIO500) += rio500.o
|
||||
obj-$(CONFIG_USB_TEST) += usbtest.o
|
||||
obj-$(CONFIG_USB_USS720) += uss720.o
|
||||
obj-$(CONFIG_USB_APPLEDISPLAY) += appledisplay.o
|
||||
|
||||
obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/
|
||||
|
||||
|
|
2809
drivers/usb/misc/ftdi-elan.c
Normal file
2809
drivers/usb/misc/ftdi-elan.c
Normal file
File diff suppressed because it is too large
Load diff
97
drivers/usb/misc/usb_u132.h
Normal file
97
drivers/usb/misc/usb_u132.h
Normal file
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* Common Header File for the Elan Digital Systems U132 adapter
|
||||
* this file should be included by both the "ftdi-u132" and
|
||||
* the "u132-hcd" modules.
|
||||
*
|
||||
* Copyright(C) 2006 Elan Digital Systems Limited
|
||||
*(http://www.elandigitalsystems.com)
|
||||
*
|
||||
* Author and Maintainer - Tony Olech - Elan Digital Systems
|
||||
*(tony.olech@elandigitalsystems.com)
|
||||
*
|
||||
* This program is free software;you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation, version 2.
|
||||
*
|
||||
*
|
||||
* The driver was written by Tony Olech(tony.olech@elandigitalsystems.com)
|
||||
* based on various USB client drivers in the 2.6.15 linux kernel
|
||||
* with constant reference to the 3rd Edition of Linux Device Drivers
|
||||
* published by O'Reilly
|
||||
*
|
||||
* The U132 adapter is a USB to CardBus adapter specifically designed
|
||||
* for PC cards that contain an OHCI host controller. Typical PC cards
|
||||
* are the Orange Mobile 3G Option GlobeTrotter Fusion card.
|
||||
*
|
||||
* The U132 adapter will *NOT *work with PC cards that do not contain
|
||||
* an OHCI controller. A simple way to test whether a PC card has an
|
||||
* OHCI controller as an interface is to insert the PC card directly
|
||||
* into a laptop(or desktop) with a CardBus slot and if "lspci" shows
|
||||
* a new USB controller and "lsusb -v" shows a new OHCI Host Controller
|
||||
* then there is a good chance that the U132 adapter will support the
|
||||
* PC card.(you also need the specific client driver for the PC card)
|
||||
*
|
||||
* Please inform the Author and Maintainer about any PC cards that
|
||||
* contain OHCI Host Controller and work when directly connected to
|
||||
* an embedded CardBus slot but do not work when they are connected
|
||||
* via an ELAN U132 adapter.
|
||||
*
|
||||
* The driver consists of two modules, the "ftdi-u132" module is
|
||||
* a USB client driver that interfaces to the FTDI chip within
|
||||
* the U132 adapter manufactured by Elan Digital Systems, and the
|
||||
* "u132-hcd" module is a USB host controller driver that talks
|
||||
* to the OHCI controller within CardBus card that are inserted
|
||||
* in the U132 adapter.
|
||||
*
|
||||
* The "ftdi-u132" module should be loaded automatically by the
|
||||
* hot plug system when the U132 adapter is plugged in. The module
|
||||
* initialises the adapter which mostly consists of synchronising
|
||||
* the FTDI chip, before continuously polling the adapter to detect
|
||||
* PC card insertions. As soon as a PC card containing a recognised
|
||||
* OHCI controller is seen the "ftdi-u132" module explicitly requests
|
||||
* the kernel to load the "u132-hcd" module.
|
||||
*
|
||||
* The "ftdi-u132" module provides the interface to the inserted
|
||||
* PC card and the "u132-hcd" module uses the API to send and recieve
|
||||
* data. The API features call-backs, so that part of the "u132-hcd"
|
||||
* module code will run in the context of one of the kernel threads
|
||||
* of the "ftdi-u132" module.
|
||||
*
|
||||
*/
|
||||
int ftdi_elan_switch_on_diagnostics(int number);
|
||||
void ftdi_elan_gone_away(struct platform_device *pdev);
|
||||
void start_usb_lock_device_tracing(void);
|
||||
struct u132_platform_data {
|
||||
u16 vendor;
|
||||
u16 device;
|
||||
u8 potpg;
|
||||
void (*port_power) (struct device *dev, int is_on);
|
||||
void (*reset) (struct device *dev);
|
||||
};
|
||||
int usb_ftdi_elan_edset_single(struct platform_device *pdev, u8 ed_number,
|
||||
void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
|
||||
void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
|
||||
int toggle_bits, int error_count, int condition_code, int repeat_number,
|
||||
int halted, int skipped, int actual, int non_null));
|
||||
int usb_ftdi_elan_edset_output(struct platform_device *pdev, u8 ed_number,
|
||||
void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
|
||||
void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
|
||||
int toggle_bits, int error_count, int condition_code, int repeat_number,
|
||||
int halted, int skipped, int actual, int non_null));
|
||||
int usb_ftdi_elan_edset_empty(struct platform_device *pdev, u8 ed_number,
|
||||
void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
|
||||
void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
|
||||
int toggle_bits, int error_count, int condition_code, int repeat_number,
|
||||
int halted, int skipped, int actual, int non_null));
|
||||
int usb_ftdi_elan_edset_input(struct platform_device *pdev, u8 ed_number,
|
||||
void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
|
||||
void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
|
||||
int toggle_bits, int error_count, int condition_code, int repeat_number,
|
||||
int halted, int skipped, int actual, int non_null));
|
||||
int usb_ftdi_elan_edset_setup(struct platform_device *pdev, u8 ed_number,
|
||||
void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
|
||||
void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
|
||||
int toggle_bits, int error_count, int condition_code, int repeat_number,
|
||||
int halted, int skipped, int actual, int non_null));
|
||||
int usb_ftdi_elan_edset_flush(struct platform_device *pdev, u8 ed_number,
|
||||
void *endp);
|
Loading…
Reference in a new issue