Hi Greg, I sent you the final version for this patch a few days ago. Please have a look at http://lkml.org/lkml/2006/6/18/128. Is it still possible to use that version? The driver has a different name, its code is "polished" and doesn't contain the macro anymore...
Thanks, Oliver ----- Originalnachricht ----- Von: Greg KH <[EMAIL PROTECTED]> Datum: Donnerstag, Juni 22, 2006 0:07 am Betreff: [PATCH 85/104] [PATCH] USB: new driver for Cypress CY7C63xxx mirco controllers > From: Oliver Bock <[EMAIL PROTECTED]> > > This is a new driver for the Cypress CY7C63xxx mirco controller > series.It currently supports the pre-programmed CYC63001A-PC by AK > Modul-Bus > GmbH. It's based on a kernel 2.4 driver (cyport) by Marcus Maul > which I > ported to kernel 2.6 using sysfs. I intend to support more controllers > of this family (and more features) as soon as I get hold of the > requiredIDs etc. Please see the source code's header for more > information. > Signed-off-by: Oliver Bock <[EMAIL PROTECTED]> > Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]> > --- > drivers/usb/Makefile | 1 > drivers/usb/misc/Kconfig | 14 +++ > drivers/usb/misc/Makefile | 1 > drivers/usb/misc/cy7c63.c | 244 > +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 260 > insertions(+), 0 deletions(-) > > diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile > index b299965..c7123bf 100644 > --- a/drivers/usb/Makefile > +++ b/drivers/usb/Makefile > @@ -48,6 +48,7 @@ obj-$(CONFIG_USB_MICROTEK) += image/ > obj-$(CONFIG_USB_SERIAL) += serial/ > > obj-$(CONFIG_USB_AUERSWALD) += misc/ > +obj-$(CONFIG_USB_CY7C63) += misc/ > obj-$(CONFIG_USB_CYTHERM) += misc/ > obj-$(CONFIG_USB_EMI26) += misc/ > obj-$(CONFIG_USB_EMI62) += misc/ > diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig > index af79d04..daa486d 100644 > --- a/drivers/usb/misc/Kconfig > +++ b/drivers/usb/misc/Kconfig > @@ -88,6 +88,20 @@ config USB_LED > To compile this driver as a module, choose M here: the > module will be called usbled. > > +config USB_CY7C63 > + tristate "Cypress CY7C63xxx USB driver support" > + depends on USB > + help > + Say Y here if you want to connect a Cypress CY7C63xxx > + micro controller to your computer's USB port. This driver > + supports the pre-programmed devices (incl. firmware) by > + AK Modul-Bus Computer GmbH. > + > + Please see: http://www.ak-modul- > bus.de/stat/mikrocontroller.html+ > + To compile this driver as a module, choose M here: the > + module will be called cy7c63. > + > config USB_CYTHERM > tristate "Cypress USB thermometer driver support" > depends on USB > diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile > index 946537d..f25a972 100644 > --- a/drivers/usb/misc/Makefile > +++ b/drivers/usb/misc/Makefile > @@ -4,6 +4,7 @@ # (the ones that don't fit into any othe > # > > obj-$(CONFIG_USB_AUERSWALD) += auerswald.o > +obj-$(CONFIG_USB_CY7C63) += cy7c63.o > obj-$(CONFIG_USB_CYTHERM) += cytherm.o > obj-$(CONFIG_USB_EMI26) += emi26.o > obj-$(CONFIG_USB_EMI62) += emi62.o > diff --git a/drivers/usb/misc/cy7c63.c b/drivers/usb/misc/cy7c63.c > new file mode 100644 > index 0000000..8a1c10b > --- /dev/null > +++ b/drivers/usb/misc/cy7c63.c > @@ -0,0 +1,244 @@ > +/* > +* cy7c63.c > +* > +* Copyright (c) 2006 Oliver Bock ([EMAIL PROTECTED]) > +* > +* This driver is based on the Cypress Thermometer USB Driver by > +* Marcus Maul and the 2.0 version of Greg Kroah-Hartman's > +* USB Skeleton driver. > +* > +* Is is a generic driver for the Cypress CY7C63000 family. > +* For the time being it enables you to toggle the single I/O ports > +* of the device. > +* > +* Supported vendors: AK Modul-Bus Computer GmbH > +* Supported devices: CY7C63001A-PC (to be continued...) > +* Supported functions: Read/Write Ports (to be continued...) > +* > +* Chipsets families: CY7C63000, CY7C63001, CY7C63100, CY7C63101 > +* > +* > +* 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. > +*/ > + > +#include <linux/init.h> > +#include <linux/module.h> > +#include <linux/kernel.h> > +#include <linux/usb.h> > + > +#define DRIVER_AUTHOR "Oliver Bock ([EMAIL PROTECTED] > wolfenbuettel.de)"+#define DRIVER_DESC "Cypress CY7C63xxx > USB driver" > + > +#define CY7C63_VENDOR_ID 0xa2c > +#define CY7C63_PRODUCT_ID 0x8 > + > +#define CY7C63_READ_PORT 0x4 > +#define CY7C63_WRITE_PORT 0x5 > +#define CY7C63_READ_RAM 0x2 > +#define CY7C63_WRITE_RAM 0x3 > +#define CY7C63_READ_ROM 0x1 > + > +#define CY7C63_READ_PORT_ID0 0 > +#define CY7C63_WRITE_PORT_ID0 0 > +#define CY7C63_READ_PORT_ID1 0x2 > +#define CY7C63_WRITE_PORT_ID1 1 > + > +#define CY7C63_MAX_REQSIZE 8 > + > + > +/* table of devices that work with this driver */ > +static struct usb_device_id cy7c63_table [] = { > + { USB_DEVICE(CY7C63_VENDOR_ID, CY7C63_PRODUCT_ID) }, > + { } > +}; > +MODULE_DEVICE_TABLE(usb, cy7c63_table); > + > +/* structure to hold all of our device specific stuff */ > +struct cy7c63 { > + struct usb_device * udev; > + char port0; > + char port1; > +}; > + > +/* used to send usb control messages to device */ > +int vendor_command(struct cy7c63 *dev, unsigned char request, > + unsigned char address, unsigned char > data) { > + > + int retval = 0; > + unsigned int pipe; > + unsigned char *iobuf; > + > + /* allocate some memory for the i/o buffer*/ > + iobuf = kzalloc(CY7C63_MAX_REQSIZE, GFP_KERNEL); > + if (!iobuf) { > + dev_err(&dev->udev->dev, "Out of memory!\n"); > + retval = -ENOMEM; > + goto error; > + } > + > + dev_dbg(&dev->udev->dev, "Sending usb_control_msg (data: %d)\n", > data);+ > + /* prepare usb control message and send it upstream */ > + pipe = usb_rcvctrlpipe(dev->udev, 0); > + retval = usb_control_msg(dev->udev, pipe, request, > + USB_DIR_IN | USB_TYPE_VENDOR | > USB_RECIP_OTHER,+ address, data, iobuf, > CY7C63_MAX_REQSIZE,+ USB_CTRL_GET_TIMEOUT); > + > + /* store returned data (more READs to be added!) */ > + switch (request) { > + case CY7C63_READ_PORT: > + if (address == CY7C63_READ_PORT_ID0) { > + dev->port0 = iobuf[1]; > + dev_dbg(&dev->udev->dev, > + "READ_PORT0 returned: %d\n",dev- > >port0);+ } > + else if (address == CY7C63_READ_PORT_ID1) { > + dev->port1 = iobuf[1]; > + dev_dbg(&dev->udev->dev, > + "READ_PORT1 returned: %d\n",dev- > >port1);+ } > + break; > + } > + > + kfree(iobuf); > +error: > + return retval; > +} > + > +#define get_set_port(num,read_id,write_id) \ > +static ssize_t set_port##num(struct device *dev, struct > device_attribute *attr, \ > + const char *buf, size_t count) { > \ > + > \ > + int value; > \ > + int result = 0; > \ > + > \ > + struct usb_interface *intf = to_usb_interface(dev); > \ > + struct cy7c63 *cyp = usb_get_intfdata(intf); > \ > + > \ > + dev_dbg(&cyp->udev->dev, "WRITE_PORT%d called\n", num); > \ > + > \ > + /* validate input data */ > \ > + if (sscanf(buf, "%d", &value) < 1) { > \ > + result = -EINVAL; > \ > + goto error; > \ > + } > \ > + if (value>255 || value<0) { > \ > + result = -EINVAL; > \ > + goto error; > \ > + } > \ > + > \ > + result = vendor_command(cyp, CY7C63_WRITE_PORT, write_id, > \ > + (unsigned char)value); > \ > + > \ > + dev_dbg(&cyp->udev->dev, "Result of vendor_command: > %d\n\n",result); \+error: > \ > + return result < 0 ? result : count; > \ > +} > \ > + > \ > +static ssize_t get_port##num(struct device *dev, > \ > + struct device_attribute *attr, > char *buf) { \ > + > \ > + int result = 0; > \ > + > \ > + struct usb_interface *intf = to_usb_interface(dev); > \ > + struct cy7c63 *cyp = usb_get_intfdata(intf); > \ > + > \ > + dev_dbg(&cyp->udev->dev, "READ_PORT%d called\n", num); > \ > + > \ > + result = vendor_command(cyp, CY7C63_READ_PORT, read_id, 0); > \ > + > \ > + dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", > result); \+ > \ > + return sprintf(buf, "%d", cyp->port##num); > \ > +} > \ > +static DEVICE_ATTR(port##num, S_IWUGO | S_IRUGO, get_port##num, > set_port##num);+ > +get_set_port(0, CY7C63_READ_PORT_ID0, CY7C63_WRITE_PORT_ID0); > +get_set_port(1, CY7C63_READ_PORT_ID1, CY7C63_WRITE_PORT_ID1); > + > +static int cy7c63_probe(struct usb_interface *interface, > + const struct usb_device_id *id) { > + > + struct cy7c63 *dev = NULL; > + int retval = -ENOMEM; > + > + /* allocate memory for our device state and initialize it */ > + dev = kzalloc(sizeof(*dev), GFP_KERNEL); > + if (dev == NULL) { > + dev_err(&dev->udev->dev, "Out of memory!\n"); > + goto error; > + } > + > + dev->udev = usb_get_dev(interface_to_usbdev(interface)); > + > + /* save our data pointer in this interface device */ > + usb_set_intfdata(interface, dev); > + > + /* create device attribute files */ > + device_create_file(&interface->dev, &dev_attr_port0); > + device_create_file(&interface->dev, &dev_attr_port1); > + > + /* let the user know what node this device is now attached to */ > + dev_info(&interface->dev, > + "Cypress CY7C63xxx device now attached\n"); > + > + retval = 0; > +error: > + return retval; > +} > + > +static void cy7c63_disconnect(struct usb_interface *interface) { > + > + struct cy7c63 *dev; > + > + dev = usb_get_intfdata(interface); > + usb_set_intfdata(interface, NULL); > + > + /* remove device attribute files */ > + device_remove_file(&interface->dev, &dev_attr_port0); > + device_remove_file(&interface->dev, &dev_attr_port1); > + > + usb_put_dev(dev->udev); > + > + dev_info(&interface->dev, > + "Cypress CY7C63xxx device now disconnected\n"); > + > + kfree(dev); > +} > + > +static struct usb_driver cy7c63_driver = { > + .name = "cy7c63", > + .probe = cy7c63_probe, > + .disconnect = cy7c63_disconnect, > + .id_table = cy7c63_table, > +}; > + > +static int __init cy7c63_init(void) { > + > + int result; > + > + /* register this driver with the USB subsystem */ > + result = usb_register(&cy7c63_driver); > + if (result) { > + err("Function usb_register failed! Error number: %d\n", > result);+ } > + > + return result; > +} > + > +static void __exit cy7c63_exit(void) { > + > + /* deregister this driver with the USB subsystem */ > + usb_deregister(&cy7c63_driver); > +} > + > +module_init(cy7c63_init); > +module_exit(cy7c63_exit); > + > +MODULE_AUTHOR(DRIVER_AUTHOR); > +MODULE_DESCRIPTION(DRIVER_DESC); > + > +MODULE_LICENSE("GPL"); > -- > 1.4.0 > > All the advantages of Linux Managed Hosting--Without the Cost and Risk! Fully trained technicians. The highest number of Red Hat certifications in the hosting industry. Fanatical Support. Click to learn more http://sel.as-us.falkag.net/sel?cmd=lnk&kid=107521&bid=248729&dat=121642 _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel