From e418b865c486912d04eef7d7306d6ffa7907634f Mon Sep 17 00:00:00 2001 From: xiangfu Date: Wed, 15 Apr 2009 17:06:05 +0000 Subject: [PATCH] try to write the ingenic driver --- ingenic-tools/drivers/ingenic.c | 118 ++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 ingenic-tools/drivers/ingenic.c diff --git a/ingenic-tools/drivers/ingenic.c b/ingenic-tools/drivers/ingenic.c new file mode 100644 index 0000000..9a0950c --- /dev/null +++ b/ingenic-tools/drivers/ingenic.c @@ -0,0 +1,118 @@ +/* + * Ingenic driver + * + * Copyright (C) 2009 Pi, Xiangfu Liu (xiangfu.z@gmail.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; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + + +#include +#ifdef CONFIG_USB_DEBUG + #define DEBUG 1 +#endif +#include +#include +#include +#include +#include +#include + + +#define DRIVER_AUTHOR "xiangfu, xiangfu.z@gmail.com" +#define DRIVER_DESC "Ingenic driver" + +#define VENDOR_ID 0x601a +#define PRODUCT_ID 0x4740 + +/* table of devices that work with this driver */ +static struct usb_device_id ingenic_table [] = { + { USB_DEVICE(VENDOR_ID, PRODUCT_ID) }, + { }, +}; +MODULE_DEVICE_TABLE (usb, ingenic_table); + +struct usb_ingenic { + struct usb_device * udev; +}; + +static int ingenic_probe(struct usb_interface *interface, const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev(interface); + struct usb_ingenic *dev = NULL; + int retval = -ENOMEM; + + dev = kmalloc(sizeof(struct usb_ingenic), GFP_KERNEL); + if (dev == NULL) { + dev_err(&interface->dev, "Out of memory\n"); + goto error; + } + memset (dev, 0x00, sizeof (*dev)); + + dev->udev = usb_get_dev(udev); + + usb_set_intfdata (interface, dev); + + dev_info(&interface->dev, "Ingenic device now attached\n"); + return 0; + +error: + kfree(dev); + return retval; +} + +static void ingenic_disconnect(struct usb_interface *interface) +{ + struct usb_ingenic *dev; + + dev = usb_get_intfdata (interface); + usb_set_intfdata (interface, NULL); + + usb_put_dev(dev->udev); + + kfree(dev); + + dev_info(&interface->dev, "Ingenic device now disconnected\n"); +} + +static struct usb_driver ingenic_driver = { + .owner = THIS_MODULE, + .name = "Ingenic", + .probe = ingenic_probe, + .disconnect = ingenic_disconnect, + .id_table = id_table, +}; + +static int __init usb_ingenic_init(void) +{ + int retval = 0; + + retval = usb_register(&ingenic_driver); + if (retval) + err("usb_register failed. Error number %d", retval); + return retval; +} + +static void __exit usb_ingenic_exit(void) +{ + usb_deregister(&ingenic_driver); +} + +module_init (usb_ingenic_init); +module_exit (usb_ingenic_exit); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL");