diff options
author | Dmitry Torokhov <dtor@insightbb.com> | 2007-06-14 23:32:24 -0400 |
---|---|---|
committer | Dmitry Torokhov <dtor@insightbb.com> | 2007-07-10 00:35:17 -0400 |
commit | 9657d75c5f0f7d0a9cb507521d3ad1436aea28c9 (patch) | |
tree | f6f4c357a64c7fed6720c8ebce0b183a6b9b720d /drivers/input/input.c | |
parent | d63219a10126b878abbbffdf4c5bcf29ef756b7f (diff) |
Input: convert from class devices to standard devices
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input/input.c')
-rw-r--r-- | drivers/input/input.c | 136 |
1 files changed, 74 insertions, 62 deletions
diff --git a/drivers/input/input.c b/drivers/input/input.c index ccd8abafcb70..75b4d2a83dd9 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -442,7 +442,7 @@ static int input_attach_handler(struct input_dev *dev, struct input_handler *han | |||
442 | printk(KERN_ERR | 442 | printk(KERN_ERR |
443 | "input: failed to attach handler %s to device %s, " | 443 | "input: failed to attach handler %s to device %s, " |
444 | "error: %d\n", | 444 | "error: %d\n", |
445 | handler->name, kobject_name(&dev->cdev.kobj), error); | 445 | handler->name, kobject_name(&dev->dev.kobj), error); |
446 | 446 | ||
447 | return error; | 447 | return error; |
448 | } | 448 | } |
@@ -527,7 +527,7 @@ static void input_seq_print_bitmap(struct seq_file *seq, const char *name, | |||
527 | static int input_devices_seq_show(struct seq_file *seq, void *v) | 527 | static int input_devices_seq_show(struct seq_file *seq, void *v) |
528 | { | 528 | { |
529 | struct input_dev *dev = container_of(v, struct input_dev, node); | 529 | struct input_dev *dev = container_of(v, struct input_dev, node); |
530 | const char *path = kobject_get_path(&dev->cdev.kobj, GFP_KERNEL); | 530 | const char *path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); |
531 | struct input_handle *handle; | 531 | struct input_handle *handle; |
532 | 532 | ||
533 | seq_printf(seq, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x\n", | 533 | seq_printf(seq, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x\n", |
@@ -682,15 +682,17 @@ static inline int input_proc_init(void) { return 0; } | |||
682 | static inline void input_proc_exit(void) { } | 682 | static inline void input_proc_exit(void) { } |
683 | #endif | 683 | #endif |
684 | 684 | ||
685 | #define INPUT_DEV_STRING_ATTR_SHOW(name) \ | 685 | #define INPUT_DEV_STRING_ATTR_SHOW(name) \ |
686 | static ssize_t input_dev_show_##name(struct class_device *dev, char *buf) \ | 686 | static ssize_t input_dev_show_##name(struct device *dev, \ |
687 | { \ | 687 | struct device_attribute *attr, \ |
688 | struct input_dev *input_dev = to_input_dev(dev); \ | 688 | char *buf) \ |
689 | \ | 689 | { \ |
690 | return scnprintf(buf, PAGE_SIZE, "%s\n", \ | 690 | struct input_dev *input_dev = to_input_dev(dev); \ |
691 | input_dev->name ? input_dev->name : ""); \ | 691 | \ |
692 | } \ | 692 | return scnprintf(buf, PAGE_SIZE, "%s\n", \ |
693 | static CLASS_DEVICE_ATTR(name, S_IRUGO, input_dev_show_##name, NULL); | 693 | input_dev->name ? input_dev->name : ""); \ |
694 | } \ | ||
695 | static DEVICE_ATTR(name, S_IRUGO, input_dev_show_##name, NULL) | ||
694 | 696 | ||
695 | INPUT_DEV_STRING_ATTR_SHOW(name); | 697 | INPUT_DEV_STRING_ATTR_SHOW(name); |
696 | INPUT_DEV_STRING_ATTR_SHOW(phys); | 698 | INPUT_DEV_STRING_ATTR_SHOW(phys); |
@@ -744,7 +746,9 @@ static int input_print_modalias(char *buf, int size, struct input_dev *id, | |||
744 | return len; | 746 | return len; |
745 | } | 747 | } |
746 | 748 | ||
747 | static ssize_t input_dev_show_modalias(struct class_device *dev, char *buf) | 749 | static ssize_t input_dev_show_modalias(struct device *dev, |
750 | struct device_attribute *attr, | ||
751 | char *buf) | ||
748 | { | 752 | { |
749 | struct input_dev *id = to_input_dev(dev); | 753 | struct input_dev *id = to_input_dev(dev); |
750 | ssize_t len; | 754 | ssize_t len; |
@@ -753,13 +757,13 @@ static ssize_t input_dev_show_modalias(struct class_device *dev, char *buf) | |||
753 | 757 | ||
754 | return min_t(int, len, PAGE_SIZE); | 758 | return min_t(int, len, PAGE_SIZE); |
755 | } | 759 | } |
756 | static CLASS_DEVICE_ATTR(modalias, S_IRUGO, input_dev_show_modalias, NULL); | 760 | static DEVICE_ATTR(modalias, S_IRUGO, input_dev_show_modalias, NULL); |
757 | 761 | ||
758 | static struct attribute *input_dev_attrs[] = { | 762 | static struct attribute *input_dev_attrs[] = { |
759 | &class_device_attr_name.attr, | 763 | &dev_attr_name.attr, |
760 | &class_device_attr_phys.attr, | 764 | &dev_attr_phys.attr, |
761 | &class_device_attr_uniq.attr, | 765 | &dev_attr_uniq.attr, |
762 | &class_device_attr_modalias.attr, | 766 | &dev_attr_modalias.attr, |
763 | NULL | 767 | NULL |
764 | }; | 768 | }; |
765 | 769 | ||
@@ -767,13 +771,15 @@ static struct attribute_group input_dev_attr_group = { | |||
767 | .attrs = input_dev_attrs, | 771 | .attrs = input_dev_attrs, |
768 | }; | 772 | }; |
769 | 773 | ||
770 | #define INPUT_DEV_ID_ATTR(name) \ | 774 | #define INPUT_DEV_ID_ATTR(name) \ |
771 | static ssize_t input_dev_show_id_##name(struct class_device *dev, char *buf) \ | 775 | static ssize_t input_dev_show_id_##name(struct device *dev, \ |
772 | { \ | 776 | struct device_attribute *attr, \ |
773 | struct input_dev *input_dev = to_input_dev(dev); \ | 777 | char *buf) \ |
774 | return scnprintf(buf, PAGE_SIZE, "%04x\n", input_dev->id.name); \ | 778 | { \ |
775 | } \ | 779 | struct input_dev *input_dev = to_input_dev(dev); \ |
776 | static CLASS_DEVICE_ATTR(name, S_IRUGO, input_dev_show_id_##name, NULL); | 780 | return scnprintf(buf, PAGE_SIZE, "%04x\n", input_dev->id.name); \ |
781 | } \ | ||
782 | static DEVICE_ATTR(name, S_IRUGO, input_dev_show_id_##name, NULL) | ||
777 | 783 | ||
778 | INPUT_DEV_ID_ATTR(bustype); | 784 | INPUT_DEV_ID_ATTR(bustype); |
779 | INPUT_DEV_ID_ATTR(vendor); | 785 | INPUT_DEV_ID_ATTR(vendor); |
@@ -781,10 +787,10 @@ INPUT_DEV_ID_ATTR(product); | |||
781 | INPUT_DEV_ID_ATTR(version); | 787 | INPUT_DEV_ID_ATTR(version); |
782 | 788 | ||
783 | static struct attribute *input_dev_id_attrs[] = { | 789 | static struct attribute *input_dev_id_attrs[] = { |
784 | &class_device_attr_bustype.attr, | 790 | &dev_attr_bustype.attr, |
785 | &class_device_attr_vendor.attr, | 791 | &dev_attr_vendor.attr, |
786 | &class_device_attr_product.attr, | 792 | &dev_attr_product.attr, |
787 | &class_device_attr_version.attr, | 793 | &dev_attr_version.attr, |
788 | NULL | 794 | NULL |
789 | }; | 795 | }; |
790 | 796 | ||
@@ -813,15 +819,17 @@ static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap, | |||
813 | return len; | 819 | return len; |
814 | } | 820 | } |
815 | 821 | ||
816 | #define INPUT_DEV_CAP_ATTR(ev, bm) \ | 822 | #define INPUT_DEV_CAP_ATTR(ev, bm) \ |
817 | static ssize_t input_dev_show_cap_##bm(struct class_device *dev, char *buf) \ | 823 | static ssize_t input_dev_show_cap_##bm(struct device *dev, \ |
818 | { \ | 824 | struct device_attribute *attr, \ |
819 | struct input_dev *input_dev = to_input_dev(dev); \ | 825 | char *buf) \ |
820 | int len = input_print_bitmap(buf, PAGE_SIZE, \ | 826 | { \ |
821 | input_dev->bm##bit, ev##_MAX, 1); \ | 827 | struct input_dev *input_dev = to_input_dev(dev); \ |
822 | return min_t(int, len, PAGE_SIZE); \ | 828 | int len = input_print_bitmap(buf, PAGE_SIZE, \ |
823 | } \ | 829 | input_dev->bm##bit, ev##_MAX, 1); \ |
824 | static CLASS_DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL); | 830 | return min_t(int, len, PAGE_SIZE); \ |
831 | } \ | ||
832 | static DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL) | ||
825 | 833 | ||
826 | INPUT_DEV_CAP_ATTR(EV, ev); | 834 | INPUT_DEV_CAP_ATTR(EV, ev); |
827 | INPUT_DEV_CAP_ATTR(KEY, key); | 835 | INPUT_DEV_CAP_ATTR(KEY, key); |
@@ -834,15 +842,15 @@ INPUT_DEV_CAP_ATTR(FF, ff); | |||
834 | INPUT_DEV_CAP_ATTR(SW, sw); | 842 | INPUT_DEV_CAP_ATTR(SW, sw); |
835 | 843 | ||
836 | static struct attribute *input_dev_caps_attrs[] = { | 844 | static struct attribute *input_dev_caps_attrs[] = { |
837 | &class_device_attr_ev.attr, | 845 | &dev_attr_ev.attr, |
838 | &class_device_attr_key.attr, | 846 | &dev_attr_key.attr, |
839 | &class_device_attr_rel.attr, | 847 | &dev_attr_rel.attr, |
840 | &class_device_attr_abs.attr, | 848 | &dev_attr_abs.attr, |
841 | &class_device_attr_msc.attr, | 849 | &dev_attr_msc.attr, |
842 | &class_device_attr_led.attr, | 850 | &dev_attr_led.attr, |
843 | &class_device_attr_snd.attr, | 851 | &dev_attr_snd.attr, |
844 | &class_device_attr_ff.attr, | 852 | &dev_attr_ff.attr, |
845 | &class_device_attr_sw.attr, | 853 | &dev_attr_sw.attr, |
846 | NULL | 854 | NULL |
847 | }; | 855 | }; |
848 | 856 | ||
@@ -858,9 +866,9 @@ static struct attribute_group *input_dev_attr_groups[] = { | |||
858 | NULL | 866 | NULL |
859 | }; | 867 | }; |
860 | 868 | ||
861 | static void input_dev_release(struct class_device *class_dev) | 869 | static void input_dev_release(struct device *device) |
862 | { | 870 | { |
863 | struct input_dev *dev = to_input_dev(class_dev); | 871 | struct input_dev *dev = to_input_dev(device); |
864 | 872 | ||
865 | input_ff_destroy(dev); | 873 | input_ff_destroy(dev); |
866 | kfree(dev); | 874 | kfree(dev); |
@@ -947,10 +955,10 @@ static int input_add_uevent_modalias_var(char **envp, int num_envp, int *cur_ind | |||
947 | return err; \ | 955 | return err; \ |
948 | } while (0) | 956 | } while (0) |
949 | 957 | ||
950 | static int input_dev_uevent(struct class_device *cdev, char **envp, | 958 | static int input_dev_uevent(struct device *device, char **envp, |
951 | int num_envp, char *buffer, int buffer_size) | 959 | int num_envp, char *buffer, int buffer_size) |
952 | { | 960 | { |
953 | struct input_dev *dev = to_input_dev(cdev); | 961 | struct input_dev *dev = to_input_dev(device); |
954 | int i = 0; | 962 | int i = 0; |
955 | int len = 0; | 963 | int len = 0; |
956 | 964 | ||
@@ -988,10 +996,14 @@ static int input_dev_uevent(struct class_device *cdev, char **envp, | |||
988 | return 0; | 996 | return 0; |
989 | } | 997 | } |
990 | 998 | ||
999 | static struct device_type input_dev_type = { | ||
1000 | .groups = input_dev_attr_groups, | ||
1001 | .release = input_dev_release, | ||
1002 | .uevent = input_dev_uevent, | ||
1003 | }; | ||
1004 | |||
991 | struct class input_class = { | 1005 | struct class input_class = { |
992 | .name = "input", | 1006 | .name = "input", |
993 | .release = input_dev_release, | ||
994 | .uevent = input_dev_uevent, | ||
995 | }; | 1007 | }; |
996 | EXPORT_SYMBOL_GPL(input_class); | 1008 | EXPORT_SYMBOL_GPL(input_class); |
997 | 1009 | ||
@@ -1010,9 +1022,9 @@ struct input_dev *input_allocate_device(void) | |||
1010 | 1022 | ||
1011 | dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL); | 1023 | dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL); |
1012 | if (dev) { | 1024 | if (dev) { |
1013 | dev->cdev.class = &input_class; | 1025 | dev->dev.type = &input_dev_type; |
1014 | dev->cdev.groups = input_dev_attr_groups; | 1026 | dev->dev.class = &input_class; |
1015 | class_device_initialize(&dev->cdev); | 1027 | device_initialize(&dev->dev); |
1016 | mutex_init(&dev->mutex); | 1028 | mutex_init(&dev->mutex); |
1017 | INIT_LIST_HEAD(&dev->h_list); | 1029 | INIT_LIST_HEAD(&dev->h_list); |
1018 | INIT_LIST_HEAD(&dev->node); | 1030 | INIT_LIST_HEAD(&dev->node); |
@@ -1131,17 +1143,17 @@ int input_register_device(struct input_dev *dev) | |||
1131 | 1143 | ||
1132 | list_add_tail(&dev->node, &input_dev_list); | 1144 | list_add_tail(&dev->node, &input_dev_list); |
1133 | 1145 | ||
1134 | snprintf(dev->cdev.class_id, sizeof(dev->cdev.class_id), | 1146 | snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id), |
1135 | "input%ld", (unsigned long) atomic_inc_return(&input_no) - 1); | 1147 | "input%ld", (unsigned long) atomic_inc_return(&input_no) - 1); |
1136 | 1148 | ||
1137 | if (!dev->cdev.dev) | 1149 | if (dev->cdev.dev) |
1138 | dev->cdev.dev = dev->dev.parent; | 1150 | dev->dev.parent = dev->cdev.dev; |
1139 | 1151 | ||
1140 | error = class_device_add(&dev->cdev); | 1152 | error = device_add(&dev->dev); |
1141 | if (error) | 1153 | if (error) |
1142 | return error; | 1154 | return error; |
1143 | 1155 | ||
1144 | path = kobject_get_path(&dev->cdev.kobj, GFP_KERNEL); | 1156 | path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); |
1145 | printk(KERN_INFO "input: %s as %s\n", | 1157 | printk(KERN_INFO "input: %s as %s\n", |
1146 | dev->name ? dev->name : "Unspecified device", path ? path : "N/A"); | 1158 | dev->name ? dev->name : "Unspecified device", path ? path : "N/A"); |
1147 | kfree(path); | 1159 | kfree(path); |
@@ -1173,7 +1185,7 @@ void input_unregister_device(struct input_dev *dev) | |||
1173 | 1185 | ||
1174 | list_del_init(&dev->node); | 1186 | list_del_init(&dev->node); |
1175 | 1187 | ||
1176 | class_device_unregister(&dev->cdev); | 1188 | device_unregister(&dev->dev); |
1177 | 1189 | ||
1178 | input_wakeup_procfs_readers(); | 1190 | input_wakeup_procfs_readers(); |
1179 | } | 1191 | } |