diff options
author | Wolfgang Grandegger <wg@grandegger.com> | 2008-10-17 11:51:19 -0400 |
---|---|---|
committer | Jean Delvare <khali@mahadeva.delvare> | 2008-10-17 11:51:19 -0400 |
commit | 0217eae3a825d551b99991bc30555c3daeb0a4df (patch) | |
tree | be8ca795bacbb9aba2d8af19ac2211a93e5ff30e /drivers/hwmon | |
parent | 360782dde00a2e6e7d9fd57535f90934707ab8a8 (diff) |
hwmon: (w83781d) Use new style driver binding
This patch modifies the w83781d driver to use new style driver binding.
Substantial code modifications are required to deal with the new
interface, especially legacy device detection.
[JD: largely edited to make the patch smaller and to get the driver
to work again on ISA devices.]
Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r-- | drivers/hwmon/w83781d.c | 309 |
1 files changed, 134 insertions, 175 deletions
diff --git a/drivers/hwmon/w83781d.c b/drivers/hwmon/w83781d.c index 50580c883053..d4d1b859d4f1 100644 --- a/drivers/hwmon/w83781d.c +++ b/drivers/hwmon/w83781d.c | |||
@@ -199,7 +199,7 @@ DIV_TO_REG(long val, enum chips type) | |||
199 | } | 199 | } |
200 | 200 | ||
201 | struct w83781d_data { | 201 | struct w83781d_data { |
202 | struct i2c_client client; | 202 | struct i2c_client *client; |
203 | struct device *hwmon_dev; | 203 | struct device *hwmon_dev; |
204 | struct mutex lock; | 204 | struct mutex lock; |
205 | enum chips type; | 205 | enum chips type; |
@@ -241,23 +241,11 @@ struct w83781d_data { | |||
241 | static struct w83781d_data *w83781d_data_if_isa(void); | 241 | static struct w83781d_data *w83781d_data_if_isa(void); |
242 | static int w83781d_alias_detect(struct i2c_client *client, u8 chipid); | 242 | static int w83781d_alias_detect(struct i2c_client *client, u8 chipid); |
243 | 243 | ||
244 | static int w83781d_attach_adapter(struct i2c_adapter *adapter); | ||
245 | static int w83781d_detect(struct i2c_adapter *adapter, int address, int kind); | ||
246 | static int w83781d_detach_client(struct i2c_client *client); | ||
247 | |||
248 | static int w83781d_read_value(struct w83781d_data *data, u16 reg); | 244 | static int w83781d_read_value(struct w83781d_data *data, u16 reg); |
249 | static int w83781d_write_value(struct w83781d_data *data, u16 reg, u16 value); | 245 | static int w83781d_write_value(struct w83781d_data *data, u16 reg, u16 value); |
250 | static struct w83781d_data *w83781d_update_device(struct device *dev); | 246 | static struct w83781d_data *w83781d_update_device(struct device *dev); |
251 | static void w83781d_init_device(struct device *dev); | 247 | static void w83781d_init_device(struct device *dev); |
252 | 248 | ||
253 | static struct i2c_driver w83781d_driver = { | ||
254 | .driver = { | ||
255 | .name = "w83781d", | ||
256 | }, | ||
257 | .attach_adapter = w83781d_attach_adapter, | ||
258 | .detach_client = w83781d_detach_client, | ||
259 | }; | ||
260 | |||
261 | /* following are the sysfs callback functions */ | 249 | /* following are the sysfs callback functions */ |
262 | #define show_in_reg(reg) \ | 250 | #define show_in_reg(reg) \ |
263 | static ssize_t show_##reg (struct device *dev, struct device_attribute *da, \ | 251 | static ssize_t show_##reg (struct device *dev, struct device_attribute *da, \ |
@@ -819,46 +807,19 @@ static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO | S_IWUSR, | |||
819 | static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR, | 807 | static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR, |
820 | show_sensor, store_sensor, 2); | 808 | show_sensor, store_sensor, 2); |
821 | 809 | ||
822 | /* This function is called when: | ||
823 | * w83781d_driver is inserted (when this module is loaded), for each | ||
824 | available adapter | ||
825 | * when a new adapter is inserted (and w83781d_driver is still present) | ||
826 | We block updates of the ISA device to minimize the risk of concurrent | ||
827 | access to the same W83781D chip through different interfaces. */ | ||
828 | static int | ||
829 | w83781d_attach_adapter(struct i2c_adapter *adapter) | ||
830 | { | ||
831 | struct w83781d_data *data = w83781d_data_if_isa(); | ||
832 | int err; | ||
833 | |||
834 | if (!(adapter->class & I2C_CLASS_HWMON)) | ||
835 | return 0; | ||
836 | |||
837 | if (data) | ||
838 | mutex_lock(&data->update_lock); | ||
839 | err = i2c_probe(adapter, &addr_data, w83781d_detect); | ||
840 | if (data) | ||
841 | mutex_unlock(&data->update_lock); | ||
842 | return err; | ||
843 | } | ||
844 | |||
845 | /* Assumes that adapter is of I2C, not ISA variety. | 810 | /* Assumes that adapter is of I2C, not ISA variety. |
846 | * OTHERWISE DON'T CALL THIS | 811 | * OTHERWISE DON'T CALL THIS |
847 | */ | 812 | */ |
848 | static int | 813 | static int |
849 | w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind, | 814 | w83781d_detect_subclients(struct i2c_client *new_client) |
850 | struct i2c_client *new_client) | ||
851 | { | 815 | { |
852 | int i, val1 = 0, id; | 816 | int i, val1 = 0, id; |
853 | int err; | 817 | int err; |
854 | const char *client_name = ""; | 818 | int address = new_client->addr; |
819 | unsigned short sc_addr[2]; | ||
820 | struct i2c_adapter *adapter = new_client->adapter; | ||
855 | struct w83781d_data *data = i2c_get_clientdata(new_client); | 821 | struct w83781d_data *data = i2c_get_clientdata(new_client); |
856 | 822 | enum chips kind = data->type; | |
857 | data->lm75[0] = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); | ||
858 | if (!(data->lm75[0])) { | ||
859 | err = -ENOMEM; | ||
860 | goto ERROR_SC_0; | ||
861 | } | ||
862 | 823 | ||
863 | id = i2c_adapter_id(adapter); | 824 | id = i2c_adapter_id(adapter); |
864 | 825 | ||
@@ -876,55 +837,35 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind, | |||
876 | w83781d_write_value(data, W83781D_REG_I2C_SUBADDR, | 837 | w83781d_write_value(data, W83781D_REG_I2C_SUBADDR, |
877 | (force_subclients[2] & 0x07) | | 838 | (force_subclients[2] & 0x07) | |
878 | ((force_subclients[3] & 0x07) << 4)); | 839 | ((force_subclients[3] & 0x07) << 4)); |
879 | data->lm75[0]->addr = force_subclients[2]; | 840 | sc_addr[0] = force_subclients[2]; |
880 | } else { | 841 | } else { |
881 | val1 = w83781d_read_value(data, W83781D_REG_I2C_SUBADDR); | 842 | val1 = w83781d_read_value(data, W83781D_REG_I2C_SUBADDR); |
882 | data->lm75[0]->addr = 0x48 + (val1 & 0x07); | 843 | sc_addr[0] = 0x48 + (val1 & 0x07); |
883 | } | 844 | } |
884 | 845 | ||
885 | if (kind != w83783s) { | 846 | if (kind != w83783s) { |
886 | data->lm75[1] = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); | ||
887 | if (!(data->lm75[1])) { | ||
888 | err = -ENOMEM; | ||
889 | goto ERROR_SC_1; | ||
890 | } | ||
891 | |||
892 | if (force_subclients[0] == id && | 847 | if (force_subclients[0] == id && |
893 | force_subclients[1] == address) { | 848 | force_subclients[1] == address) { |
894 | data->lm75[1]->addr = force_subclients[3]; | 849 | sc_addr[1] = force_subclients[3]; |
895 | } else { | 850 | } else { |
896 | data->lm75[1]->addr = 0x48 + ((val1 >> 4) & 0x07); | 851 | sc_addr[1] = 0x48 + ((val1 >> 4) & 0x07); |
897 | } | 852 | } |
898 | if (data->lm75[0]->addr == data->lm75[1]->addr) { | 853 | if (sc_addr[0] == sc_addr[1]) { |
899 | dev_err(&new_client->dev, | 854 | dev_err(&new_client->dev, |
900 | "Duplicate addresses 0x%x for subclients.\n", | 855 | "Duplicate addresses 0x%x for subclients.\n", |
901 | data->lm75[0]->addr); | 856 | sc_addr[0]); |
902 | err = -EBUSY; | 857 | err = -EBUSY; |
903 | goto ERROR_SC_2; | 858 | goto ERROR_SC_2; |
904 | } | 859 | } |
905 | } | 860 | } |
906 | 861 | ||
907 | if (kind == w83781d) | ||
908 | client_name = "w83781d subclient"; | ||
909 | else if (kind == w83782d) | ||
910 | client_name = "w83782d subclient"; | ||
911 | else if (kind == w83783s) | ||
912 | client_name = "w83783s subclient"; | ||
913 | else if (kind == as99127f) | ||
914 | client_name = "as99127f subclient"; | ||
915 | |||
916 | for (i = 0; i <= 1; i++) { | 862 | for (i = 0; i <= 1; i++) { |
917 | /* store all data in w83781d */ | 863 | data->lm75[i] = i2c_new_dummy(adapter, sc_addr[i]); |
918 | i2c_set_clientdata(data->lm75[i], NULL); | 864 | if (!data->lm75[i]) { |
919 | data->lm75[i]->adapter = adapter; | ||
920 | data->lm75[i]->driver = &w83781d_driver; | ||
921 | data->lm75[i]->flags = 0; | ||
922 | strlcpy(data->lm75[i]->name, client_name, | ||
923 | I2C_NAME_SIZE); | ||
924 | if ((err = i2c_attach_client(data->lm75[i]))) { | ||
925 | dev_err(&new_client->dev, "Subclient %d " | 865 | dev_err(&new_client->dev, "Subclient %d " |
926 | "registration at address 0x%x " | 866 | "registration at address 0x%x " |
927 | "failed.\n", i, data->lm75[i]->addr); | 867 | "failed.\n", i, sc_addr[i]); |
868 | err = -ENOMEM; | ||
928 | if (i == 1) | 869 | if (i == 1) |
929 | goto ERROR_SC_3; | 870 | goto ERROR_SC_3; |
930 | goto ERROR_SC_2; | 871 | goto ERROR_SC_2; |
@@ -937,12 +878,9 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind, | |||
937 | 878 | ||
938 | /* Undo inits in case of errors */ | 879 | /* Undo inits in case of errors */ |
939 | ERROR_SC_3: | 880 | ERROR_SC_3: |
940 | i2c_detach_client(data->lm75[0]); | 881 | i2c_unregister_device(data->lm75[0]); |
941 | ERROR_SC_2: | 882 | ERROR_SC_2: |
942 | kfree(data->lm75[1]); | ||
943 | ERROR_SC_1: | 883 | ERROR_SC_1: |
944 | kfree(data->lm75[0]); | ||
945 | ERROR_SC_0: | ||
946 | return err; | 884 | return err; |
947 | } | 885 | } |
948 | 886 | ||
@@ -1108,87 +1046,71 @@ w83781d_create_files(struct device *dev, int kind, int is_isa) | |||
1108 | return 0; | 1046 | return 0; |
1109 | } | 1047 | } |
1110 | 1048 | ||
1049 | /* Return 0 if detection is successful, -ENODEV otherwise */ | ||
1111 | static int | 1050 | static int |
1112 | w83781d_detect(struct i2c_adapter *adapter, int address, int kind) | 1051 | w83781d_detect(struct i2c_client *client, int kind, |
1052 | struct i2c_board_info *info) | ||
1113 | { | 1053 | { |
1114 | int val1 = 0, val2; | 1054 | int val1 = 0, val2; |
1115 | struct i2c_client *client; | 1055 | struct w83781d_data *isa = w83781d_data_if_isa(); |
1116 | struct device *dev; | 1056 | struct i2c_adapter *adapter = client->adapter; |
1117 | struct w83781d_data *data; | 1057 | int address = client->addr; |
1118 | int err; | ||
1119 | const char *client_name = ""; | 1058 | const char *client_name = ""; |
1120 | enum vendor { winbond, asus } vendid; | 1059 | enum vendor { winbond, asus } vendid; |
1121 | 1060 | ||
1122 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { | 1061 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) |
1123 | err = -EINVAL; | 1062 | return -ENODEV; |
1124 | goto ERROR1; | ||
1125 | } | ||
1126 | |||
1127 | /* OK. For now, we presume we have a valid client. We now create the | ||
1128 | client structure, even though we cannot fill it completely yet. | ||
1129 | But it allows us to access w83781d_{read,write}_value. */ | ||
1130 | |||
1131 | if (!(data = kzalloc(sizeof(struct w83781d_data), GFP_KERNEL))) { | ||
1132 | err = -ENOMEM; | ||
1133 | goto ERROR1; | ||
1134 | } | ||
1135 | |||
1136 | client = &data->client; | ||
1137 | i2c_set_clientdata(client, data); | ||
1138 | client->addr = address; | ||
1139 | mutex_init(&data->lock); | ||
1140 | client->adapter = adapter; | ||
1141 | client->driver = &w83781d_driver; | ||
1142 | dev = &client->dev; | ||
1143 | 1063 | ||
1144 | /* Now, we do the remaining detection. */ | 1064 | /* We block updates of the ISA device to minimize the risk of |
1065 | concurrent access to the same W83781D chip through different | ||
1066 | interfaces. */ | ||
1067 | if (isa) | ||
1068 | mutex_lock(&isa->update_lock); | ||
1145 | 1069 | ||
1146 | /* The w8378?d may be stuck in some other bank than bank 0. This may | 1070 | /* The w8378?d may be stuck in some other bank than bank 0. This may |
1147 | make reading other information impossible. Specify a force=... or | 1071 | make reading other information impossible. Specify a force=... or |
1148 | force_*=... parameter, and the Winbond will be reset to the right | 1072 | force_*=... parameter, and the Winbond will be reset to the right |
1149 | bank. */ | 1073 | bank. */ |
1150 | if (kind < 0) { | 1074 | if (kind < 0) { |
1151 | if (w83781d_read_value(data, W83781D_REG_CONFIG) & 0x80) { | 1075 | if (i2c_smbus_read_byte_data |
1076 | (client, W83781D_REG_CONFIG) & 0x80) { | ||
1152 | dev_dbg(&adapter->dev, "Detection of w83781d chip " | 1077 | dev_dbg(&adapter->dev, "Detection of w83781d chip " |
1153 | "failed at step 3\n"); | 1078 | "failed at step 3\n"); |
1154 | err = -ENODEV; | 1079 | goto err_nodev; |
1155 | goto ERROR2; | ||
1156 | } | 1080 | } |
1157 | val1 = w83781d_read_value(data, W83781D_REG_BANK); | 1081 | val1 = i2c_smbus_read_byte_data(client, W83781D_REG_BANK); |
1158 | val2 = w83781d_read_value(data, W83781D_REG_CHIPMAN); | 1082 | val2 = i2c_smbus_read_byte_data(client, W83781D_REG_CHIPMAN); |
1159 | /* Check for Winbond or Asus ID if in bank 0 */ | 1083 | /* Check for Winbond or Asus ID if in bank 0 */ |
1160 | if ((!(val1 & 0x07)) && | 1084 | if ((!(val1 & 0x07)) && |
1161 | (((!(val1 & 0x80)) && (val2 != 0xa3) && (val2 != 0xc3)) | 1085 | (((!(val1 & 0x80)) && (val2 != 0xa3) && (val2 != 0xc3)) |
1162 | || ((val1 & 0x80) && (val2 != 0x5c) && (val2 != 0x12)))) { | 1086 | || ((val1 & 0x80) && (val2 != 0x5c) && (val2 != 0x12)))) { |
1163 | dev_dbg(&adapter->dev, "Detection of w83781d chip " | 1087 | dev_dbg(&adapter->dev, "Detection of w83781d chip " |
1164 | "failed at step 4\n"); | 1088 | "failed at step 4\n"); |
1165 | err = -ENODEV; | 1089 | goto err_nodev; |
1166 | goto ERROR2; | ||
1167 | } | 1090 | } |
1168 | /* If Winbond SMBus, check address at 0x48. | 1091 | /* If Winbond SMBus, check address at 0x48. |
1169 | Asus doesn't support, except for as99127f rev.2 */ | 1092 | Asus doesn't support, except for as99127f rev.2 */ |
1170 | if ((!(val1 & 0x80) && (val2 == 0xa3)) || | 1093 | if ((!(val1 & 0x80) && (val2 == 0xa3)) || |
1171 | ((val1 & 0x80) && (val2 == 0x5c))) { | 1094 | ((val1 & 0x80) && (val2 == 0x5c))) { |
1172 | if (w83781d_read_value | 1095 | if (i2c_smbus_read_byte_data |
1173 | (data, W83781D_REG_I2C_ADDR) != address) { | 1096 | (client, W83781D_REG_I2C_ADDR) != address) { |
1174 | dev_dbg(&adapter->dev, "Detection of w83781d " | 1097 | dev_dbg(&adapter->dev, "Detection of w83781d " |
1175 | "chip failed at step 5\n"); | 1098 | "chip failed at step 5\n"); |
1176 | err = -ENODEV; | 1099 | goto err_nodev; |
1177 | goto ERROR2; | ||
1178 | } | 1100 | } |
1179 | } | 1101 | } |
1180 | } | 1102 | } |
1181 | 1103 | ||
1182 | /* We have either had a force parameter, or we have already detected the | 1104 | /* We have either had a force parameter, or we have already detected the |
1183 | Winbond. Put it now into bank 0 and Vendor ID High Byte */ | 1105 | Winbond. Put it now into bank 0 and Vendor ID High Byte */ |
1184 | w83781d_write_value(data, W83781D_REG_BANK, | 1106 | i2c_smbus_write_byte_data(client, W83781D_REG_BANK, |
1185 | (w83781d_read_value(data, W83781D_REG_BANK) | 1107 | (i2c_smbus_read_byte_data(client, W83781D_REG_BANK) |
1186 | & 0x78) | 0x80); | 1108 | & 0x78) | 0x80); |
1187 | 1109 | ||
1188 | /* Determine the chip type. */ | 1110 | /* Determine the chip type. */ |
1189 | if (kind <= 0) { | 1111 | if (kind <= 0) { |
1190 | /* get vendor ID */ | 1112 | /* get vendor ID */ |
1191 | val2 = w83781d_read_value(data, W83781D_REG_CHIPMAN); | 1113 | val2 = i2c_smbus_read_byte_data(client, W83781D_REG_CHIPMAN); |
1192 | if (val2 == 0x5c) | 1114 | if (val2 == 0x5c) |
1193 | vendid = winbond; | 1115 | vendid = winbond; |
1194 | else if (val2 == 0x12) | 1116 | else if (val2 == 0x12) |
@@ -1196,11 +1118,10 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind) | |||
1196 | else { | 1118 | else { |
1197 | dev_dbg(&adapter->dev, "w83781d chip vendor is " | 1119 | dev_dbg(&adapter->dev, "w83781d chip vendor is " |
1198 | "neither Winbond nor Asus\n"); | 1120 | "neither Winbond nor Asus\n"); |
1199 | err = -ENODEV; | 1121 | goto err_nodev; |
1200 | goto ERROR2; | ||
1201 | } | 1122 | } |
1202 | 1123 | ||
1203 | val1 = w83781d_read_value(data, W83781D_REG_WCHIPID); | 1124 | val1 = i2c_smbus_read_byte_data(client, W83781D_REG_WCHIPID); |
1204 | if ((val1 == 0x10 || val1 == 0x11) && vendid == winbond) | 1125 | if ((val1 == 0x10 || val1 == 0x11) && vendid == winbond) |
1205 | kind = w83781d; | 1126 | kind = w83781d; |
1206 | else if (val1 == 0x30 && vendid == winbond) | 1127 | else if (val1 == 0x30 && vendid == winbond) |
@@ -1214,19 +1135,20 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind) | |||
1214 | dev_warn(&adapter->dev, "Ignoring 'force' " | 1135 | dev_warn(&adapter->dev, "Ignoring 'force' " |
1215 | "parameter for unknown chip at " | 1136 | "parameter for unknown chip at " |
1216 | "address 0x%02x\n", address); | 1137 | "address 0x%02x\n", address); |
1217 | err = -EINVAL; | 1138 | goto err_nodev; |
1218 | goto ERROR2; | ||
1219 | } | 1139 | } |
1220 | 1140 | ||
1221 | if ((kind == w83781d || kind == w83782d) | 1141 | if ((kind == w83781d || kind == w83782d) |
1222 | && w83781d_alias_detect(client, val1)) { | 1142 | && w83781d_alias_detect(client, val1)) { |
1223 | dev_dbg(&adapter->dev, "Device at 0x%02x appears to " | 1143 | dev_dbg(&adapter->dev, "Device at 0x%02x appears to " |
1224 | "be the same as ISA device\n", address); | 1144 | "be the same as ISA device\n", address); |
1225 | err = -ENODEV; | 1145 | goto err_nodev; |
1226 | goto ERROR2; | ||
1227 | } | 1146 | } |
1228 | } | 1147 | } |
1229 | 1148 | ||
1149 | if (isa) | ||
1150 | mutex_unlock(&isa->update_lock); | ||
1151 | |||
1230 | if (kind == w83781d) { | 1152 | if (kind == w83781d) { |
1231 | client_name = "w83781d"; | 1153 | client_name = "w83781d"; |
1232 | } else if (kind == w83782d) { | 1154 | } else if (kind == w83782d) { |
@@ -1237,24 +1159,46 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind) | |||
1237 | client_name = "as99127f"; | 1159 | client_name = "as99127f"; |
1238 | } | 1160 | } |
1239 | 1161 | ||
1240 | /* Fill in the remaining client fields and put into the global list */ | 1162 | strlcpy(info->type, client_name, I2C_NAME_SIZE); |
1241 | strlcpy(client->name, client_name, I2C_NAME_SIZE); | ||
1242 | data->type = kind; | ||
1243 | 1163 | ||
1244 | /* Tell the I2C layer a new client has arrived */ | 1164 | return 0; |
1245 | if ((err = i2c_attach_client(client))) | 1165 | |
1246 | goto ERROR2; | 1166 | err_nodev: |
1167 | if (isa) | ||
1168 | mutex_unlock(&isa->update_lock); | ||
1169 | return -ENODEV; | ||
1170 | } | ||
1171 | |||
1172 | static int | ||
1173 | w83781d_probe(struct i2c_client *client, const struct i2c_device_id *id) | ||
1174 | { | ||
1175 | struct device *dev = &client->dev; | ||
1176 | struct w83781d_data *data; | ||
1177 | int err; | ||
1178 | |||
1179 | data = kzalloc(sizeof(struct w83781d_data), GFP_KERNEL); | ||
1180 | if (!data) { | ||
1181 | err = -ENOMEM; | ||
1182 | goto ERROR1; | ||
1183 | } | ||
1184 | |||
1185 | i2c_set_clientdata(client, data); | ||
1186 | mutex_init(&data->lock); | ||
1187 | mutex_init(&data->update_lock); | ||
1188 | |||
1189 | data->type = id->driver_data; | ||
1190 | data->client = client; | ||
1247 | 1191 | ||
1248 | /* attach secondary i2c lm75-like clients */ | 1192 | /* attach secondary i2c lm75-like clients */ |
1249 | if ((err = w83781d_detect_subclients(adapter, address, | 1193 | err = w83781d_detect_subclients(client); |
1250 | kind, client))) | 1194 | if (err) |
1251 | goto ERROR3; | 1195 | goto ERROR3; |
1252 | 1196 | ||
1253 | /* Initialize the chip */ | 1197 | /* Initialize the chip */ |
1254 | w83781d_init_device(dev); | 1198 | w83781d_init_device(dev); |
1255 | 1199 | ||
1256 | /* Register sysfs hooks */ | 1200 | /* Register sysfs hooks */ |
1257 | err = w83781d_create_files(dev, kind, 0); | 1201 | err = w83781d_create_files(dev, data->type, 0); |
1258 | if (err) | 1202 | if (err) |
1259 | goto ERROR4; | 1203 | goto ERROR4; |
1260 | 1204 | ||
@@ -1270,45 +1214,35 @@ ERROR4: | |||
1270 | sysfs_remove_group(&dev->kobj, &w83781d_group); | 1214 | sysfs_remove_group(&dev->kobj, &w83781d_group); |
1271 | sysfs_remove_group(&dev->kobj, &w83781d_group_opt); | 1215 | sysfs_remove_group(&dev->kobj, &w83781d_group_opt); |
1272 | 1216 | ||
1273 | if (data->lm75[1]) { | 1217 | if (data->lm75[0]) |
1274 | i2c_detach_client(data->lm75[1]); | 1218 | i2c_unregister_device(data->lm75[0]); |
1275 | kfree(data->lm75[1]); | 1219 | if (data->lm75[1]) |
1276 | } | 1220 | i2c_unregister_device(data->lm75[1]); |
1277 | if (data->lm75[0]) { | ||
1278 | i2c_detach_client(data->lm75[0]); | ||
1279 | kfree(data->lm75[0]); | ||
1280 | } | ||
1281 | ERROR3: | 1221 | ERROR3: |
1282 | i2c_detach_client(client); | 1222 | i2c_set_clientdata(client, NULL); |
1283 | ERROR2: | ||
1284 | kfree(data); | 1223 | kfree(data); |
1285 | ERROR1: | 1224 | ERROR1: |
1286 | return err; | 1225 | return err; |
1287 | } | 1226 | } |
1288 | 1227 | ||
1289 | static int | 1228 | static int |
1290 | w83781d_detach_client(struct i2c_client *client) | 1229 | w83781d_remove(struct i2c_client *client) |
1291 | { | 1230 | { |
1292 | struct w83781d_data *data = i2c_get_clientdata(client); | 1231 | struct w83781d_data *data = i2c_get_clientdata(client); |
1293 | int err; | 1232 | struct device *dev = &client->dev; |
1294 | 1233 | ||
1295 | /* main client */ | 1234 | hwmon_device_unregister(data->hwmon_dev); |
1296 | if (data) { | ||
1297 | hwmon_device_unregister(data->hwmon_dev); | ||
1298 | sysfs_remove_group(&client->dev.kobj, &w83781d_group); | ||
1299 | sysfs_remove_group(&client->dev.kobj, &w83781d_group_opt); | ||
1300 | } | ||
1301 | 1235 | ||
1302 | if ((err = i2c_detach_client(client))) | 1236 | sysfs_remove_group(&dev->kobj, &w83781d_group); |
1303 | return err; | 1237 | sysfs_remove_group(&dev->kobj, &w83781d_group_opt); |
1304 | 1238 | ||
1305 | /* main client */ | 1239 | if (data->lm75[0]) |
1306 | if (data) | 1240 | i2c_unregister_device(data->lm75[0]); |
1307 | kfree(data); | 1241 | if (data->lm75[1]) |
1242 | i2c_unregister_device(data->lm75[1]); | ||
1308 | 1243 | ||
1309 | /* subclient */ | 1244 | i2c_set_clientdata(client, NULL); |
1310 | else | 1245 | kfree(data); |
1311 | kfree(client); | ||
1312 | 1246 | ||
1313 | return 0; | 1247 | return 0; |
1314 | } | 1248 | } |
@@ -1316,7 +1250,7 @@ w83781d_detach_client(struct i2c_client *client) | |||
1316 | static int | 1250 | static int |
1317 | w83781d_read_value_i2c(struct w83781d_data *data, u16 reg) | 1251 | w83781d_read_value_i2c(struct w83781d_data *data, u16 reg) |
1318 | { | 1252 | { |
1319 | struct i2c_client *client = &data->client; | 1253 | struct i2c_client *client = data->client; |
1320 | int res, bank; | 1254 | int res, bank; |
1321 | struct i2c_client *cl; | 1255 | struct i2c_client *cl; |
1322 | 1256 | ||
@@ -1356,7 +1290,7 @@ w83781d_read_value_i2c(struct w83781d_data *data, u16 reg) | |||
1356 | static int | 1290 | static int |
1357 | w83781d_write_value_i2c(struct w83781d_data *data, u16 reg, u16 value) | 1291 | w83781d_write_value_i2c(struct w83781d_data *data, u16 reg, u16 value) |
1358 | { | 1292 | { |
1359 | struct i2c_client *client = &data->client; | 1293 | struct i2c_client *client = data->client; |
1360 | int bank; | 1294 | int bank; |
1361 | struct i2c_client *cl; | 1295 | struct i2c_client *cl; |
1362 | 1296 | ||
@@ -1493,7 +1427,7 @@ w83781d_init_device(struct device *dev) | |||
1493 | static struct w83781d_data *w83781d_update_device(struct device *dev) | 1427 | static struct w83781d_data *w83781d_update_device(struct device *dev) |
1494 | { | 1428 | { |
1495 | struct w83781d_data *data = dev_get_drvdata(dev); | 1429 | struct w83781d_data *data = dev_get_drvdata(dev); |
1496 | struct i2c_client *client = &data->client; | 1430 | struct i2c_client *client = data->client; |
1497 | int i; | 1431 | int i; |
1498 | 1432 | ||
1499 | mutex_lock(&data->update_lock); | 1433 | mutex_lock(&data->update_lock); |
@@ -1606,6 +1540,30 @@ static struct w83781d_data *w83781d_update_device(struct device *dev) | |||
1606 | return data; | 1540 | return data; |
1607 | } | 1541 | } |
1608 | 1542 | ||
1543 | static const struct i2c_device_id w83781d_ids[] = { | ||
1544 | { "w83781d", w83781d, }, | ||
1545 | { "w83782d", w83782d, }, | ||
1546 | { "w83783s", w83783s, }, | ||
1547 | { "as99127f", as99127f }, | ||
1548 | { /* LIST END */ } | ||
1549 | }; | ||
1550 | MODULE_DEVICE_TABLE(i2c, w83781d_ids); | ||
1551 | |||
1552 | static struct i2c_driver w83781d_driver = { | ||
1553 | .class = I2C_CLASS_HWMON, | ||
1554 | .driver = { | ||
1555 | .name = "w83781d", | ||
1556 | }, | ||
1557 | .probe = w83781d_probe, | ||
1558 | .remove = w83781d_remove, | ||
1559 | .id_table = w83781d_ids, | ||
1560 | .detect = w83781d_detect, | ||
1561 | .address_data = &addr_data, | ||
1562 | }; | ||
1563 | |||
1564 | /* | ||
1565 | * ISA related code | ||
1566 | */ | ||
1609 | #ifdef CONFIG_ISA | 1567 | #ifdef CONFIG_ISA |
1610 | 1568 | ||
1611 | /* ISA device, if found */ | 1569 | /* ISA device, if found */ |
@@ -1631,13 +1589,12 @@ static struct w83781d_data *w83781d_data_if_isa(void) | |||
1631 | /* Returns 1 if the I2C chip appears to be an alias of the ISA chip */ | 1589 | /* Returns 1 if the I2C chip appears to be an alias of the ISA chip */ |
1632 | static int w83781d_alias_detect(struct i2c_client *client, u8 chipid) | 1590 | static int w83781d_alias_detect(struct i2c_client *client, u8 chipid) |
1633 | { | 1591 | { |
1634 | struct w83781d_data *i2c, *isa; | 1592 | struct w83781d_data *isa; |
1635 | int i; | 1593 | int i; |
1636 | 1594 | ||
1637 | if (!pdev) /* No ISA chip */ | 1595 | if (!pdev) /* No ISA chip */ |
1638 | return 0; | 1596 | return 0; |
1639 | 1597 | ||
1640 | i2c = i2c_get_clientdata(client); | ||
1641 | isa = platform_get_drvdata(pdev); | 1598 | isa = platform_get_drvdata(pdev); |
1642 | 1599 | ||
1643 | if (w83781d_read_value(isa, W83781D_REG_I2C_ADDR) != client->addr) | 1600 | if (w83781d_read_value(isa, W83781D_REG_I2C_ADDR) != client->addr) |
@@ -1648,14 +1605,16 @@ static int w83781d_alias_detect(struct i2c_client *client, u8 chipid) | |||
1648 | /* We compare all the limit registers, the config register and the | 1605 | /* We compare all the limit registers, the config register and the |
1649 | * interrupt mask registers */ | 1606 | * interrupt mask registers */ |
1650 | for (i = 0x2b; i <= 0x3d; i++) { | 1607 | for (i = 0x2b; i <= 0x3d; i++) { |
1651 | if (w83781d_read_value(isa, i) != w83781d_read_value(i2c, i)) | 1608 | if (w83781d_read_value(isa, i) != |
1609 | i2c_smbus_read_byte_data(client, i)) | ||
1652 | return 0; | 1610 | return 0; |
1653 | } | 1611 | } |
1654 | if (w83781d_read_value(isa, W83781D_REG_CONFIG) != | 1612 | if (w83781d_read_value(isa, W83781D_REG_CONFIG) != |
1655 | w83781d_read_value(i2c, W83781D_REG_CONFIG)) | 1613 | i2c_smbus_read_byte_data(client, W83781D_REG_CONFIG)) |
1656 | return 0; | 1614 | return 0; |
1657 | for (i = 0x43; i <= 0x46; i++) { | 1615 | for (i = 0x43; i <= 0x46; i++) { |
1658 | if (w83781d_read_value(isa, i) != w83781d_read_value(i2c, i)) | 1616 | if (w83781d_read_value(isa, i) != |
1617 | i2c_smbus_read_byte_data(client, i)) | ||
1659 | return 0; | 1618 | return 0; |
1660 | } | 1619 | } |
1661 | 1620 | ||
@@ -1734,11 +1693,11 @@ w83781d_write_value_isa(struct w83781d_data *data, u16 reg, u16 value) | |||
1734 | static int | 1693 | static int |
1735 | w83781d_read_value(struct w83781d_data *data, u16 reg) | 1694 | w83781d_read_value(struct w83781d_data *data, u16 reg) |
1736 | { | 1695 | { |
1737 | struct i2c_client *client = &data->client; | 1696 | struct i2c_client *client = data->client; |
1738 | int res; | 1697 | int res; |
1739 | 1698 | ||
1740 | mutex_lock(&data->lock); | 1699 | mutex_lock(&data->lock); |
1741 | if (client->driver) | 1700 | if (client) |
1742 | res = w83781d_read_value_i2c(data, reg); | 1701 | res = w83781d_read_value_i2c(data, reg); |
1743 | else | 1702 | else |
1744 | res = w83781d_read_value_isa(data, reg); | 1703 | res = w83781d_read_value_isa(data, reg); |
@@ -1749,10 +1708,10 @@ w83781d_read_value(struct w83781d_data *data, u16 reg) | |||
1749 | static int | 1708 | static int |
1750 | w83781d_write_value(struct w83781d_data *data, u16 reg, u16 value) | 1709 | w83781d_write_value(struct w83781d_data *data, u16 reg, u16 value) |
1751 | { | 1710 | { |
1752 | struct i2c_client *client = &data->client; | 1711 | struct i2c_client *client = data->client; |
1753 | 1712 | ||
1754 | mutex_lock(&data->lock); | 1713 | mutex_lock(&data->lock); |
1755 | if (client->driver) | 1714 | if (client) |
1756 | w83781d_write_value_i2c(data, reg, value); | 1715 | w83781d_write_value_i2c(data, reg, value); |
1757 | else | 1716 | else |
1758 | w83781d_write_value_isa(data, reg, value); | 1717 | w83781d_write_value_isa(data, reg, value); |