[PATCH 1/5]:hidbus prototype 070409:core headers

"Li Yu" <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
Hi, Jiri.

	These are the splited patches of hid bus prototype 070409.  I remember I posted them in attachment form ago ;) 
	Now they are splited in some separable patches.
	I am afraid I can not receive in Labor Day.

	Good luck.

- Li Yu
Signed-off-by: Li Yu <[email protected]>

diff -Naurp linux-2.6.21-rc6-mm1.orig/include/linux/hiddev.h linux-2.6.21-rc6-mm1.new/include/linux/hiddev.h
--- linux-2.6.21-rc6-mm1.orig/include/linux/hiddev.h	2007-02-05 02:44:54.000000000 +0800
+++ linux-2.6.21-rc6-mm1.new/include/linux/hiddev.h	2007-04-11 09:05:29.000000000 +0800
@@ -218,23 +218,5 @@ struct hid_usage;
 struct hid_field;
 struct hid_report;
 
-#ifdef CONFIG_USB_HIDDEV
-int hiddev_connect(struct hid_device *);
-void hiddev_disconnect(struct hid_device *);
-void hiddev_hid_event(struct hid_device *hid, struct hid_field *field,
-		      struct hid_usage *usage, __s32 value);
-void hiddev_report_event(struct hid_device *hid, struct hid_report *report);
-int __init hiddev_init(void);
-void hiddev_exit(void);
-#else
-static inline int hiddev_connect(struct hid_device *hid) { return -1; }
-static inline void hiddev_disconnect(struct hid_device *hid) { }
-static inline void hiddev_hid_event(struct hid_device *hid, struct hid_field *field,
-		      struct hid_usage *usage, __s32 value) { }
-static inline void hiddev_report_event(struct hid_device *hid, struct hid_report *report) { }
-static inline int hiddev_init(void) { return 0; }
-static inline void hiddev_exit(void) { }
-#endif
-
 #endif
 #endif
diff -Naurp linux-2.6.21-rc6-mm1.orig/include/linux/hid.h linux-2.6.21-rc6-mm1.new/include/linux/hid.h
--- linux-2.6.21-rc6-mm1.orig/include/linux/hid.h	2007-04-10 09:16:50.000000000 +0800
+++ linux-2.6.21-rc6-mm1.new/include/linux/hid.h	2007-04-16 13:09:51.000000000 +0800
@@ -35,6 +35,7 @@
 #include <linux/timer.h>
 #include <linux/workqueue.h>
 #include <linux/input.h>
+#include <asm/bitops.h>
 
 /*
  * USB HID (Human Interface Device) interface class code
@@ -270,6 +271,7 @@ struct hid_item {
 #define HID_QUIRK_LOGITECH_DESCRIPTOR		0x00100000
 #define HID_QUIRK_DUPLICATE_USAGES		0x00200000
 #define HID_QUIRK_RESET_LEDS			0x00400000
+#define HID_QUIRK_SKIP				0x80000000
 
 /*
  * This is the global environment of the parser. This information is
@@ -403,55 +405,112 @@ struct hid_input {
 	struct input_dev *input;
 };
 
-struct hid_device {							/* device report descriptor */
+struct hid_driver;
+struct hid_device {	/* device report descriptor */
+	struct device device;
+	struct module *module;
+	struct hid_driver *driver;
+	unsigned long sticky_driver;
+	unsigned long flags;
+	void *tl_data;	/* Transports layer data. */
+	void *hidraw;	/* It will be remove soon. */
+	int quirks;
+
 	 __u8 *rdesc;
 	unsigned rsize;
-	struct hid_collection *collection;				/* List of HID collections */
-	unsigned collection_size;					/* Number of allocated hid_collections */
-	unsigned maxcollection;						/* Number of parsed collections */
-	unsigned maxapplication;					/* Number of applications */
-	unsigned short bus;                                             /* BUS ID */
-	unsigned short vendor;                                          /* Vendor ID */
-	unsigned short product;                                         /* Product ID */
-	unsigned version;						/* HID version */
-	unsigned country;						/* HID country */
+	struct hid_collection *collection;	/* List of HID collections */
+	unsigned collection_size;	/* Number of allocated hid_collections */
+	unsigned maxcollection;			/* Number of parsed collections */
+	unsigned maxapplication;		/* Number of applications */
+	unsigned short bus;			/* BUS ID */
+	unsigned short vendor;			/* Vendor ID */
+	unsigned short product;			/* Product ID */
+	unsigned version;			/* HID version */
+	unsigned country;			/* HID country */
+	int open;				/* Is the device open by anyone? */
 	struct hid_report_enum report_enum[HID_REPORT_TYPES];
+	void *private;				/* Data for specific driver */
 
-	struct device *dev;						/* device */
-
-	unsigned claimed;						/* Claimed by hidinput, hiddev? */
-	unsigned quirks;						/* Various quirks the device can pull on us */
+	void (*shutdown)(struct hid_device *dev);
 
-	struct list_head inputs;					/* The list of inputs */
-	void *hiddev;							/* The hiddev structure */
-	void *hidraw;
-	int minor;							/* Hiddev minor number */
-
-	wait_queue_head_t wait;						/* For sleeping */
-
-	int open;							/* is the device open by anyone? */
-	char name[128];							/* Device name */
-	char phys[64];							/* Device physical location */
-	char uniq[64];							/* Device unique identifier (serial #) */
-
-	void *driver_data;
-
-	/* device-specific function pointers */
-	int (*hidinput_input_event) (struct input_dev *, unsigned int, unsigned int, int);
-	int (*hid_open) (struct hid_device *);
-	void (*hid_close) (struct hid_device *);
-
-	/* hiddev event handler */
-	void (*hiddev_hid_event) (struct hid_device *, struct hid_field *field,
-				  struct hid_usage *, __s32);
-	void (*hiddev_report_event) (struct hid_device *, struct hid_report *);
-
-	/* handler for raw output data, used by hidraw */
-	int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t);
-#ifdef CONFIG_USB_HIDINPUT_POWERBOOK
-	unsigned long pb_pressed_fn[NBITS(KEY_MAX)];
-	unsigned long pb_pressed_numlock[NBITS(KEY_MAX)];
-#endif
+	struct device *dev;			/* Physical device(USB, Bluetooth, etc.) */
+	char name[128];				/* Device name */
+	char phys[64];				/* Device physical location */
+	char uniq[64];				/* Device unique identifier (serial #) */
+	struct list_head inputs;		/* The list of inputs */
+};
+#define to_hid_device(dev) container_of(dev, struct hid_device, device);
+
+#define HID_IGNORE_VENDOR	1
+#define HID_IGNORE_PRODUCT	2
+#define HID_IGNORE_VERSION	4
+#define HID_IGNORE_COUNTRY	8
+
+struct skip_id {
+	struct list_head node;
+	unsigned int vendor;
+	unsigned int product;
+	unsigned int version;
+	unsigned int country;
+	unsigned int mask;
+};
+
+struct hid_hook;
+struct hid_driver {
+	char name[64];
+	char version[64];
+	struct module *module;
+	struct device_driver driver;
+	unsigned long flags;
+	
+	unsigned short bus;
+	struct hid_hook *hook;
+	struct list_head skip_table;
+
+	void *private;
+
+	int (*match)(struct hid_driver *, struct hid_device *);
+	int (*probe)(struct hid_device *);
+	void (*remove)(struct hid_device *);
+	void (*shutdown)(struct hid_device *);
+	int (*event)(struct input_dev *, unsigned int, unsigned int, int);
+	int (*open)(struct hid_device *);
+	void (*close)(struct hid_device *);
+};
+#define to_hid_driver(drv) container_of(drv, struct hid_driver, driver);
+
+struct hid_transport {
+	struct module *module;
+	unsigned short bus;
+	void (*update_busid)(struct hid_device *);
+	int (*event)(struct input_dev *, unsigned int, unsigned int, int);
+	int (*open)(struct hid_device *);
+	void (*close)(struct hid_device *);
+	int (*raw_report)(struct hid_device *, u8 *, size_t);
+	void *private;
+};
+
+struct usage_page_block;
+struct hid_hook {
+	void (*setup_usage)(struct hid_field*, struct hid_usage*);
+	void (*register_inputdev)(struct input_dev*);
+	int (*hid_event)(struct hid_field*, struct hid_usage*, __s32, int);
+	int (*pre_report_event)(struct hid_report*, int);
+	int (*report_event)(struct hid_report*, int);
+	int (*raw_event)(struct hid_device *, int, u8 *, int, int);
+	int (*raw_report)(struct hid_device *, u8 *, size_t);
+	struct usage_page_block *usage_page_table;
+};
+
+struct usage_block {
+	int usage; /* usage code */
+	int event; /* input event type, e.g. EV_KEY. */
+	int code;  /* input subsystem code, e.g. KEY_F1. */
+};
+
+struct usage_page_block {
+	int page; /* usage page code */
+	struct usage_block *usage_blockes;
 };
 
 #define HID_GLOBAL_STACK_SIZE 4
@@ -500,22 +559,38 @@ void hid_output_report(struct hid_report
 void hid_free_device(struct hid_device *device);
 struct hid_device *hid_parse_report(__u8 *start, unsigned size);
 
-#ifdef CONFIG_HID_FF
-int hid_ff_init(struct hid_device *hid);
-
-int hid_lgff_init(struct hid_device *hid);
-int hid_plff_init(struct hid_device *hid);
-int hid_tmff_init(struct hid_device *hid);
-int hid_zpff_init(struct hid_device *hid);
-#ifdef CONFIG_HID_PID
-int hid_pidff_init(struct hid_device *hid);
-#else
-static inline int hid_pidff_init(struct hid_device *hid) { return -ENODEV; }
-#endif
+#define hid_flag_accessor(DD, name, FLAG)	\
+static inline void set_##DD##_##name(struct DD* dd)\
+{\
+	set_bit(FLAG, &dd->flags);\
+}\
+static inline void clear_##DD##_##name(struct DD* dd)\
+{\
+	clear_bit(FLAG, &dd->flags);\
+}\
+static inline int is_##DD##_##name(struct DD* dd)\
+{\
+	return test_bit(FLAG, &dd->flags);\
+}
+
+/* set_hid_driver_sticky()/is_hid_driver_sticky() */
+#define HID_DRV_STICKY	(0x1UL)
+hid_flag_accessor(hid_driver, sticky, HID_DRV_STICKY)
+
+static inline struct hid_device *hid_new_device(int gfp)
+{
+	return kzalloc(sizeof(struct hid_device), gfp);
+}
+
+extern int hid_register_transport(struct hid_transport *);
+extern void hid_unregister_transport(struct hid_transport *);
+extern int hid_register_device(struct hid_device *);
+extern void hid_unregister_device(struct hid_device *);
+extern int hid_register_driver(struct hid_driver *);
+extern void hid_unregister_driver(struct hid_driver *);
+extern int hid_open(struct hid_device *);
+extern void hid_close(struct hid_device *);
 
-#else
-static inline int hid_ff_init(struct hid_device *hid) { return -1; }
-#endif
 #ifdef DEBUG
 #define dbg(format, arg...) printk(KERN_DEBUG "%s: " format "\n" , \
 		__FILE__ , ## arg)
diff -Naurp linux-2.6.21-rc6-mm1.orig/include/linux/hidraw.h linux-2.6.21-rc6-mm1.new/include/linux/hidraw.h
--- linux-2.6.21-rc6-mm1.orig/include/linux/hidraw.h	2007-04-10 09:16:50.000000000 +0800
+++ linux-2.6.21-rc6-mm1.new/include/linux/hidraw.h	2007-04-11 09:05:31.000000000 +0800
@@ -67,20 +67,6 @@ struct hidraw_list {
 	struct mutex read_mutex;
 };
 
-#ifdef CONFIG_HIDRAW
-int hidraw_init(void);
-void hidraw_exit(void);
-void hidraw_report_event(struct hid_device *, u8 *, int);
-int hidraw_connect(struct hid_device *);
-void hidraw_disconnect(struct hid_device *);
-#else
-static inline int hidraw_init(void) { return 0; }
-static inline void hidraw_exit(void) { }
-static inline void hidraw_report_event(struct hid_device *hid, u8 *data, int len) { }
-static inline int hidraw_connect(struct hid_device *hid) { return -1; }
-static inline void hidraw_disconnect(struct hid_device *hid) { }
-#endif
-
 #endif
 
 #endif
diff -Naurp linux-2.6.21-rc6-mm1.orig/include/linux/input.h linux-2.6.21-rc6-mm1.new/include/linux/input.h
--- linux-2.6.21-rc6-mm1.orig/include/linux/input.h	2007-04-10 09:16:50.000000000 +0800
+++ linux-2.6.21-rc6-mm1.new/include/linux/input.h	2007-04-10 10:24:51.000000000 +0800
@@ -679,7 +679,7 @@ struct input_absinfo {
 #define BUS_I2C			0x18
 #define BUS_HOST		0x19
 #define BUS_GSC			0x1A
-
+#define BUS_MAX			(BUS_GSC+1)
 /*
  * Values describing the status of a force-feedback effect
  */

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/

_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.