@@ -772,11 +772,39 @@ static ssize_t expensive_show(struct device *dev,
772
772
}
773
773
static DEVICE_ATTR_RO (expensive );
774
774
775
+ static ssize_t driver_override_show (struct device * dev , struct device_attribute * attr ,
776
+ char * buf )
777
+ {
778
+ struct wmi_device * wdev = to_wmi_device (dev );
779
+ ssize_t ret ;
780
+
781
+ device_lock (dev );
782
+ ret = sysfs_emit (buf , "%s\n" , wdev -> driver_override );
783
+ device_unlock (dev );
784
+
785
+ return ret ;
786
+ }
787
+
788
+ static ssize_t driver_override_store (struct device * dev , struct device_attribute * attr ,
789
+ const char * buf , size_t count )
790
+ {
791
+ struct wmi_device * wdev = to_wmi_device (dev );
792
+ int ret ;
793
+
794
+ ret = driver_set_override (dev , & wdev -> driver_override , buf , count );
795
+ if (ret < 0 )
796
+ return ret ;
797
+
798
+ return count ;
799
+ }
800
+ static DEVICE_ATTR_RW (driver_override );
801
+
775
802
static struct attribute * wmi_attrs [] = {
776
803
& dev_attr_modalias .attr ,
777
804
& dev_attr_guid .attr ,
778
805
& dev_attr_instance_count .attr ,
779
806
& dev_attr_expensive .attr ,
807
+ & dev_attr_driver_override .attr ,
780
808
NULL
781
809
};
782
810
ATTRIBUTE_GROUPS (wmi );
@@ -845,6 +873,7 @@ static void wmi_dev_release(struct device *dev)
845
873
{
846
874
struct wmi_block * wblock = dev_to_wblock (dev );
847
875
876
+ kfree (wblock -> dev .driver_override );
848
877
kfree (wblock );
849
878
}
850
879
@@ -854,6 +883,10 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver)
854
883
struct wmi_block * wblock = dev_to_wblock (dev );
855
884
const struct wmi_device_id * id = wmi_driver -> id_table ;
856
885
886
+ /* When driver_override is set, only bind to the matching driver */
887
+ if (wblock -> dev .driver_override )
888
+ return !strcmp (wblock -> dev .driver_override , driver -> name );
889
+
857
890
if (id == NULL )
858
891
return 0 ;
859
892
0 commit comments