diff options
-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); |