@@ -638,7 +638,18 @@ static const struct attribute_group lenovo_attr_group_tpkbd = {
638
638
.attrs = lenovo_attributes_tpkbd ,
639
639
};
640
640
641
- static enum led_brightness lenovo_led_brightness_get_tpkbd (
641
+ static void lenovo_led_set_tpkbd (struct hid_device * hdev )
642
+ {
643
+ struct lenovo_drvdata * data_pointer = hid_get_drvdata (hdev );
644
+ struct hid_report * report ;
645
+
646
+ report = hdev -> report_enum [HID_OUTPUT_REPORT ].report_id_hash [3 ];
647
+ report -> field [0 ]-> value [0 ] = (data_pointer -> led_state >> 0 ) & 1 ;
648
+ report -> field [0 ]-> value [1 ] = (data_pointer -> led_state >> 1 ) & 1 ;
649
+ hid_hw_request (hdev , report , HID_REQ_SET_REPORT );
650
+ }
651
+
652
+ static enum led_brightness lenovo_led_brightness_get (
642
653
struct led_classdev * led_cdev )
643
654
{
644
655
struct device * dev = led_cdev -> dev -> parent ;
@@ -654,13 +665,12 @@ static enum led_brightness lenovo_led_brightness_get_tpkbd(
654
665
: LED_OFF ;
655
666
}
656
667
657
- static void lenovo_led_brightness_set_tpkbd (struct led_classdev * led_cdev ,
668
+ static void lenovo_led_brightness_set (struct led_classdev * led_cdev ,
658
669
enum led_brightness value )
659
670
{
660
671
struct device * dev = led_cdev -> dev -> parent ;
661
672
struct hid_device * hdev = to_hid_device (dev );
662
673
struct lenovo_drvdata * data_pointer = hid_get_drvdata (hdev );
663
- struct hid_report * report ;
664
674
int led_nr = 0 ;
665
675
666
676
if (led_cdev == & data_pointer -> led_micmute )
@@ -671,20 +681,54 @@ static void lenovo_led_brightness_set_tpkbd(struct led_classdev *led_cdev,
671
681
else
672
682
data_pointer -> led_state |= 1 << led_nr ;
673
683
674
- report = hdev -> report_enum [HID_OUTPUT_REPORT ].report_id_hash [3 ];
675
- report -> field [0 ]-> value [0 ] = (data_pointer -> led_state >> 0 ) & 1 ;
676
- report -> field [0 ]-> value [1 ] = (data_pointer -> led_state >> 1 ) & 1 ;
677
- hid_hw_request (hdev , report , HID_REQ_SET_REPORT );
684
+ switch (hdev -> product ) {
685
+ case USB_DEVICE_ID_LENOVO_TPKBD :
686
+ lenovo_led_set_tpkbd (hdev );
687
+ break ;
688
+ }
689
+ }
690
+
691
+ static int lenovo_register_leds (struct hid_device * hdev )
692
+ {
693
+ struct lenovo_drvdata * data = hid_get_drvdata (hdev );
694
+ size_t name_sz = strlen (dev_name (& hdev -> dev )) + 16 ;
695
+ char * name_mute , * name_micm ;
696
+ int ret ;
697
+
698
+ name_mute = devm_kzalloc (& hdev -> dev , name_sz , GFP_KERNEL );
699
+ name_micm = devm_kzalloc (& hdev -> dev , name_sz , GFP_KERNEL );
700
+ if (name_mute == NULL || name_micm == NULL ) {
701
+ hid_err (hdev , "Could not allocate memory for led data\n" );
702
+ return - ENOMEM ;
703
+ }
704
+ snprintf (name_mute , name_sz , "%s:amber:mute" , dev_name (& hdev -> dev ));
705
+ snprintf (name_micm , name_sz , "%s:amber:micmute" , dev_name (& hdev -> dev ));
706
+
707
+ data -> led_mute .name = name_mute ;
708
+ data -> led_mute .brightness_get = lenovo_led_brightness_get ;
709
+ data -> led_mute .brightness_set = lenovo_led_brightness_set ;
710
+ data -> led_mute .dev = & hdev -> dev ;
711
+ ret = led_classdev_register (& hdev -> dev , & data -> led_mute );
712
+ if (ret < 0 )
713
+ return ret ;
714
+
715
+ data -> led_micmute .name = name_micm ;
716
+ data -> led_micmute .brightness_get = lenovo_led_brightness_get ;
717
+ data -> led_micmute .brightness_set = lenovo_led_brightness_set ;
718
+ data -> led_micmute .dev = & hdev -> dev ;
719
+ ret = led_classdev_register (& hdev -> dev , & data -> led_micmute );
720
+ if (ret < 0 ) {
721
+ led_classdev_unregister (& data -> led_mute );
722
+ return ret ;
723
+ }
724
+
725
+ return 0 ;
678
726
}
679
727
680
728
static int lenovo_probe_tpkbd (struct hid_device * hdev )
681
729
{
682
- struct device * dev = & hdev -> dev ;
683
730
struct lenovo_drvdata * data_pointer ;
684
- size_t name_sz = strlen (dev_name (dev )) + 16 ;
685
- char * name_mute , * name_micmute ;
686
- int i ;
687
- int ret ;
731
+ int i , ret ;
688
732
689
733
/*
690
734
* Only register extra settings against subdevice where input_mapping
@@ -720,37 +764,11 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
720
764
data_pointer -> sensitivity = 0xa0 ;
721
765
data_pointer -> press_speed = 0x38 ;
722
766
723
- name_mute = devm_kzalloc (& hdev -> dev , name_sz , GFP_KERNEL );
724
- name_micmute = devm_kzalloc (& hdev -> dev , name_sz , GFP_KERNEL );
725
- if (name_mute == NULL || name_micmute == NULL ) {
726
- hid_err (hdev , "Could not allocate memory for led data\n" );
727
- ret = - ENOMEM ;
728
- goto err ;
729
- }
730
- snprintf (name_mute , name_sz , "%s:amber:mute" , dev_name (dev ));
731
- snprintf (name_micmute , name_sz , "%s:amber:micmute" , dev_name (dev ));
732
-
733
767
hid_set_drvdata (hdev , data_pointer );
734
768
735
- data_pointer -> led_mute .name = name_mute ;
736
- data_pointer -> led_mute .brightness_get = lenovo_led_brightness_get_tpkbd ;
737
- data_pointer -> led_mute .brightness_set = lenovo_led_brightness_set_tpkbd ;
738
- data_pointer -> led_mute .dev = dev ;
739
- ret = led_classdev_register (dev , & data_pointer -> led_mute );
740
- if (ret < 0 )
741
- goto err ;
742
-
743
- data_pointer -> led_micmute .name = name_micmute ;
744
- data_pointer -> led_micmute .brightness_get =
745
- lenovo_led_brightness_get_tpkbd ;
746
- data_pointer -> led_micmute .brightness_set =
747
- lenovo_led_brightness_set_tpkbd ;
748
- data_pointer -> led_micmute .dev = dev ;
749
- ret = led_classdev_register (dev , & data_pointer -> led_micmute );
750
- if (ret < 0 ) {
751
- led_classdev_unregister (& data_pointer -> led_mute );
769
+ ret = lenovo_register_leds (hdev );
770
+ if (ret )
752
771
goto err ;
753
- }
754
772
755
773
lenovo_features_set_tpkbd (hdev );
756
774
0 commit comments