diff options
author | Jiri Slaby <jirislaby@gmail.com> | 2008-05-16 05:49:16 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2008-10-14 17:50:48 -0400 |
commit | c500c9714011edab021591340042787722db9cf0 (patch) | |
tree | d6bb0fe483c9f1c71c3d757e9c13d261ca01cd5f /include | |
parent | 85cdaf524b7ddab627e7d15405693f2511ef7505 (diff) |
HID: hid, make parsing event driven
Next step for complete hid bus, this patch includes:
- call parser either from probe or from hid-core if there is no probe.
- add ll_driver structure and centralize some stuff there (open, close...)
- split and merge usb_hid_configure and hid_probe into several functions
to allow hooks/fixes between them
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/hid.h | 104 |
1 files changed, 99 insertions, 5 deletions
diff --git a/include/linux/hid.h b/include/linux/hid.h index c4bea0eda85b..ac2584fe65c5 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
@@ -419,6 +419,7 @@ struct hid_control_fifo { | |||
419 | #define HID_CLAIMED_HIDRAW 4 | 419 | #define HID_CLAIMED_HIDRAW 4 |
420 | 420 | ||
421 | #define HID_STAT_ADDED 1 | 421 | #define HID_STAT_ADDED 1 |
422 | #define HID_STAT_PARSED 2 | ||
422 | 423 | ||
423 | #define HID_CTRL_RUNNING 1 | 424 | #define HID_CTRL_RUNNING 1 |
424 | #define HID_OUT_RUNNING 2 | 425 | #define HID_OUT_RUNNING 2 |
@@ -435,6 +436,7 @@ struct hid_input { | |||
435 | }; | 436 | }; |
436 | 437 | ||
437 | struct hid_driver; | 438 | struct hid_driver; |
439 | struct hid_ll_driver; | ||
438 | 440 | ||
439 | struct hid_device { /* device report descriptor */ | 441 | struct hid_device { /* device report descriptor */ |
440 | __u8 *rdesc; | 442 | __u8 *rdesc; |
@@ -452,6 +454,7 @@ struct hid_device { /* device report descriptor */ | |||
452 | 454 | ||
453 | struct device dev; /* device */ | 455 | struct device dev; /* device */ |
454 | struct hid_driver *driver; | 456 | struct hid_driver *driver; |
457 | struct hid_ll_driver *ll_driver; | ||
455 | 458 | ||
456 | unsigned int status; /* see STAT flags above */ | 459 | unsigned int status; /* see STAT flags above */ |
457 | unsigned claimed; /* Claimed by hidinput, hiddev? */ | 460 | unsigned claimed; /* Claimed by hidinput, hiddev? */ |
@@ -471,11 +474,6 @@ struct hid_device { /* device report descriptor */ | |||
471 | 474 | ||
472 | __s32 delayed_value; /* For A4 Tech mice hwheel quirk */ | 475 | __s32 delayed_value; /* For A4 Tech mice hwheel quirk */ |
473 | 476 | ||
474 | /* device-specific function pointers */ | ||
475 | int (*hidinput_input_event) (struct input_dev *, unsigned int, unsigned int, int); | ||
476 | int (*hid_open) (struct hid_device *); | ||
477 | void (*hid_close) (struct hid_device *); | ||
478 | |||
479 | /* hiddev event handler */ | 477 | /* hiddev event handler */ |
480 | void (*hiddev_hid_event) (struct hid_device *, struct hid_field *field, | 478 | void (*hiddev_hid_event) (struct hid_device *, struct hid_field *field, |
481 | struct hid_usage *, __s32); | 479 | struct hid_usage *, __s32); |
@@ -561,9 +559,22 @@ struct hid_usage_id { | |||
561 | * @raw_event: if report in report_table, this hook is called (NULL means nop) | 559 | * @raw_event: if report in report_table, this hook is called (NULL means nop) |
562 | * @usage_table: on which events to call event (NULL means all) | 560 | * @usage_table: on which events to call event (NULL means all) |
563 | * @event: if usage in usage_table, this hook is called (NULL means nop) | 561 | * @event: if usage in usage_table, this hook is called (NULL means nop) |
562 | * @report_fixup: called before report descriptor parsing (NULL means nop) | ||
563 | * @input_mapping: invoked on input registering before mapping an usage | ||
564 | * @input_mapped: invoked on input registering after mapping an usage | ||
564 | * | 565 | * |
565 | * raw_event and event should return 0 on no action performed, 1 when no | 566 | * raw_event and event should return 0 on no action performed, 1 when no |
566 | * further processing should be done and negative on error | 567 | * further processing should be done and negative on error |
568 | * | ||
569 | * input_mapping shall return a negative value to completely ignore this usage | ||
570 | * (e.g. doubled or invalid usage), zero to continue with parsing of this | ||
571 | * usage by generic code (no special handling needed) or positive to skip | ||
572 | * generic parsing (needed special handling which was done in the hook already) | ||
573 | * input_mapped shall return negative to inform the layer that this usage | ||
574 | * should not be considered for further processing or zero to notify that | ||
575 | * no processing was performed and should be done in a generic manner | ||
576 | * Both these functions may be NULL which means the same behavior as returning | ||
577 | * zero from them. | ||
567 | */ | 578 | */ |
568 | struct hid_driver { | 579 | struct hid_driver { |
569 | char *name; | 580 | char *name; |
@@ -578,10 +589,43 @@ struct hid_driver { | |||
578 | const struct hid_usage_id *usage_table; | 589 | const struct hid_usage_id *usage_table; |
579 | int (*event)(struct hid_device *hdev, struct hid_field *field, | 590 | int (*event)(struct hid_device *hdev, struct hid_field *field, |
580 | struct hid_usage *usage, __s32 value); | 591 | struct hid_usage *usage, __s32 value); |
592 | |||
593 | void (*report_fixup)(struct hid_device *hdev, __u8 *buf, | ||
594 | unsigned int size); | ||
595 | |||
596 | int (*input_mapping)(struct hid_device *hdev, | ||
597 | struct hid_input *hidinput, struct hid_field *field, | ||
598 | struct hid_usage *usage, unsigned long **bit, int *max); | ||
599 | int (*input_mapped)(struct hid_device *hdev, | ||
600 | struct hid_input *hidinput, struct hid_field *field, | ||
601 | struct hid_usage *usage, unsigned long **bit, int *max); | ||
581 | /* private: */ | 602 | /* private: */ |
582 | struct device_driver driver; | 603 | struct device_driver driver; |
583 | }; | 604 | }; |
584 | 605 | ||
606 | /** | ||
607 | * hid_ll_driver - low level driver callbacks | ||
608 | * @start: called on probe to start the device | ||
609 | * @stop: called on remove | ||
610 | * @open: called by input layer on open | ||
611 | * @close: called by input layer on close | ||
612 | * @hidinput_input_event: event input event (e.g. ff or leds) | ||
613 | * @parse: this method is called only once to parse the device data, | ||
614 | * shouldn't allocate anything to not leak memory | ||
615 | */ | ||
616 | struct hid_ll_driver { | ||
617 | int (*start)(struct hid_device *hdev); | ||
618 | void (*stop)(struct hid_device *hdev); | ||
619 | |||
620 | int (*open)(struct hid_device *hdev); | ||
621 | void (*close)(struct hid_device *hdev); | ||
622 | |||
623 | int (*hidinput_input_event) (struct input_dev *idev, unsigned int type, | ||
624 | unsigned int code, int value); | ||
625 | |||
626 | int (*parse)(struct hid_device *hdev); | ||
627 | }; | ||
628 | |||
585 | /* Applications from HID Usage Tables 4/8/99 Version 1.1 */ | 629 | /* Applications from HID Usage Tables 4/8/99 Version 1.1 */ |
586 | /* We ignore a few input applications that are not widely used */ | 630 | /* We ignore a few input applications that are not widely used */ |
587 | #define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001) || (a == 0x000d0002)) | 631 | #define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001) || (a == 0x000d0002)) |
@@ -618,6 +662,56 @@ void hid_output_report(struct hid_report *report, __u8 *data); | |||
618 | struct hid_device *hid_allocate_device(void); | 662 | struct hid_device *hid_allocate_device(void); |
619 | int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size); | 663 | int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size); |
620 | 664 | ||
665 | /** | ||
666 | * hid_parse - parse HW reports | ||
667 | * | ||
668 | * @hdev: hid device | ||
669 | * | ||
670 | * Call this from probe after you set up the device (if needed). Your | ||
671 | * report_fixup will be called (if non-NULL) after reading raw report from | ||
672 | * device before passing it to hid layer for real parsing. | ||
673 | */ | ||
674 | static inline int __must_check hid_parse(struct hid_device *hdev) | ||
675 | { | ||
676 | int ret; | ||
677 | |||
678 | if (hdev->status & HID_STAT_PARSED) | ||
679 | return 0; | ||
680 | |||
681 | ret = hdev->ll_driver->parse(hdev); | ||
682 | if (!ret) | ||
683 | hdev->status |= HID_STAT_PARSED; | ||
684 | |||
685 | return ret; | ||
686 | } | ||
687 | |||
688 | /** | ||
689 | * hid_hw_start - start underlaying HW | ||
690 | * | ||
691 | * @hdev: hid device | ||
692 | * | ||
693 | * Call this in probe function *after* hid_parse. This will setup HW buffers | ||
694 | * and start the device (if not deffered to device open). hid_hw_stop must be | ||
695 | * called if this was successfull. | ||
696 | */ | ||
697 | static inline int __must_check hid_hw_start(struct hid_device *hdev) | ||
698 | { | ||
699 | return hdev->ll_driver->start(hdev); | ||
700 | } | ||
701 | |||
702 | /** | ||
703 | * hid_hw_stop - stop underlaying HW | ||
704 | * | ||
705 | * @hdev: hid device | ||
706 | * | ||
707 | * This is usually called from remove function or from probe when something | ||
708 | * failed and hid_hw_start was called already. | ||
709 | */ | ||
710 | static inline void hid_hw_stop(struct hid_device *hdev) | ||
711 | { | ||
712 | hdev->ll_driver->stop(hdev); | ||
713 | } | ||
714 | |||
621 | void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, | 715 | void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, |
622 | int interrupt); | 716 | int interrupt); |
623 | 717 | ||