@@ -714,7 +714,7 @@ static int i2c_dev_irq_from_resources(const struct resource *resources,
714
714
}
715
715
716
716
/**
717
- * i2c_new_device - instantiate an i2c device
717
+ * i2c_new_client_device - instantiate an i2c device
718
718
* @adap: the adapter managing the device
719
719
* @info: describes one I2C device; bus_num is ignored
720
720
* Context: can sleep
@@ -727,17 +727,17 @@ static int i2c_dev_irq_from_resources(const struct resource *resources,
727
727
* before any i2c_adapter could exist.
728
728
*
729
729
* This returns the new i2c client, which may be saved for later use with
730
- * i2c_unregister_device(); or NULL to indicate an error.
730
+ * i2c_unregister_device(); or an ERR_PTR to describe the error.
731
731
*/
732
- struct i2c_client *
733
- i2c_new_device (struct i2c_adapter * adap , struct i2c_board_info const * info )
732
+ static struct i2c_client *
733
+ i2c_new_client_device (struct i2c_adapter * adap , struct i2c_board_info const * info )
734
734
{
735
735
struct i2c_client * client ;
736
736
int status ;
737
737
738
738
client = kzalloc (sizeof * client , GFP_KERNEL );
739
739
if (!client )
740
- return NULL ;
740
+ return ERR_PTR ( - ENOMEM ) ;
741
741
742
742
client -> adapter = adap ;
743
743
@@ -803,7 +803,31 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
803
803
client -> name , client -> addr , status );
804
804
out_err_silent :
805
805
kfree (client );
806
- return NULL ;
806
+ return ERR_PTR (status );
807
+ }
808
+ EXPORT_SYMBOL_GPL (i2c_new_client_device );
809
+
810
+ /**
811
+ * i2c_new_device - instantiate an i2c device
812
+ * @adap: the adapter managing the device
813
+ * @info: describes one I2C device; bus_num is ignored
814
+ * Context: can sleep
815
+ *
816
+ * This deprecated function has the same functionality as
817
+ * @i2c_new_client_device, it just returns NULL instead of an ERR_PTR in case of
818
+ * an error for compatibility with current I2C API. It will be removed once all
819
+ * users are converted.
820
+ *
821
+ * This returns the new i2c client, which may be saved for later use with
822
+ * i2c_unregister_device(); or NULL to indicate an error.
823
+ */
824
+ struct i2c_client *
825
+ i2c_new_device (struct i2c_adapter * adap , struct i2c_board_info const * info )
826
+ {
827
+ struct i2c_client * ret ;
828
+
829
+ ret = i2c_new_client_device (adap , info );
830
+ return IS_ERR (ret ) ? NULL : ret ;
807
831
}
808
832
EXPORT_SYMBOL_GPL (i2c_new_device );
809
833
@@ -854,7 +878,7 @@ static struct i2c_driver dummy_driver = {
854
878
};
855
879
856
880
/**
857
- * i2c_new_dummy - return a new i2c device bound to a dummy driver
881
+ * i2c_new_dummy_device - return a new i2c device bound to a dummy driver
858
882
* @adapter: the adapter managing the device
859
883
* @address: seven bit address to be used
860
884
* Context: can sleep
@@ -869,18 +893,86 @@ static struct i2c_driver dummy_driver = {
869
893
* different driver.
870
894
*
871
895
* This returns the new i2c client, which should be saved for later use with
872
- * i2c_unregister_device(); or NULL to indicate an error.
896
+ * i2c_unregister_device(); or an ERR_PTR to describe the error.
873
897
*/
874
- struct i2c_client * i2c_new_dummy (struct i2c_adapter * adapter , u16 address )
898
+ static struct i2c_client *
899
+ i2c_new_dummy_device (struct i2c_adapter * adapter , u16 address )
875
900
{
876
901
struct i2c_board_info info = {
877
902
I2C_BOARD_INFO ("dummy" , address ),
878
903
};
879
904
880
- return i2c_new_device (adapter , & info );
905
+ return i2c_new_client_device (adapter , & info );
906
+ }
907
+ EXPORT_SYMBOL_GPL (i2c_new_dummy_device );
908
+
909
+ /**
910
+ * i2c_new_dummy - return a new i2c device bound to a dummy driver
911
+ * @adapter: the adapter managing the device
912
+ * @address: seven bit address to be used
913
+ * Context: can sleep
914
+ *
915
+ * This deprecated function has the same functionality as @i2c_new_dummy_device,
916
+ * it just returns NULL instead of an ERR_PTR in case of an error for
917
+ * compatibility with current I2C API. It will be removed once all users are
918
+ * converted.
919
+ *
920
+ * This returns the new i2c client, which should be saved for later use with
921
+ * i2c_unregister_device(); or NULL to indicate an error.
922
+ */
923
+ struct i2c_client * i2c_new_dummy (struct i2c_adapter * adapter , u16 address )
924
+ {
925
+ struct i2c_client * ret ;
926
+
927
+ ret = i2c_new_dummy_device (adapter , address );
928
+ return IS_ERR (ret ) ? NULL : ret ;
881
929
}
882
930
EXPORT_SYMBOL_GPL (i2c_new_dummy );
883
931
932
+ struct i2c_dummy_devres {
933
+ struct i2c_client * client ;
934
+ };
935
+
936
+ static void devm_i2c_release_dummy (struct device * dev , void * res )
937
+ {
938
+ struct i2c_dummy_devres * this = res ;
939
+
940
+ i2c_unregister_device (this -> client );
941
+ }
942
+
943
+ /**
944
+ * devm_i2c_new_dummy_device - return a new i2c device bound to a dummy driver
945
+ * @dev: device the managed resource is bound to
946
+ * @adapter: the adapter managing the device
947
+ * @address: seven bit address to be used
948
+ * Context: can sleep
949
+ *
950
+ * This is the device-managed version of @i2c_new_dummy_device. It returns the
951
+ * new i2c client or an ERR_PTR in case of an error.
952
+ */
953
+ struct i2c_client * devm_i2c_new_dummy_device (struct device * dev ,
954
+ struct i2c_adapter * adapter ,
955
+ u16 address )
956
+ {
957
+ struct i2c_dummy_devres * dr ;
958
+ struct i2c_client * client ;
959
+
960
+ dr = devres_alloc (devm_i2c_release_dummy , sizeof (* dr ), GFP_KERNEL );
961
+ if (!dr )
962
+ return ERR_PTR (- ENOMEM );
963
+
964
+ client = i2c_new_dummy_device (adapter , address );
965
+ if (IS_ERR (client )) {
966
+ devres_free (dr );
967
+ } else {
968
+ dr -> client = client ;
969
+ devres_add (dev , dr );
970
+ }
971
+
972
+ return client ;
973
+ }
974
+ EXPORT_SYMBOL_GPL (devm_i2c_new_dummy_device );
975
+
884
976
/**
885
977
* i2c_new_secondary_device - Helper to get the instantiated secondary address
886
978
* and create the associated device
@@ -1000,9 +1092,9 @@ i2c_sysfs_new_device(struct device *dev, struct device_attribute *attr,
1000
1092
info .flags |= I2C_CLIENT_SLAVE ;
1001
1093
}
1002
1094
1003
- client = i2c_new_device (adap , & info );
1004
- if (! client )
1005
- return - EINVAL ;
1095
+ client = i2c_new_client_device (adap , & info );
1096
+ if (IS_ERR ( client ) )
1097
+ return PTR_ERR ( client ) ;
1006
1098
1007
1099
/* Keep track of the added device */
1008
1100
mutex_lock (& adap -> userspace_clients_lock );
0 commit comments