Lines Matching refs:sl
101 #define SLAVE_SPECIFIC_FUNC(sl) \ argument
102 (((struct w1_therm_family_data *)(sl->family_data))->specific_functions)
108 #define SLAVE_POWERMODE(sl) \ argument
109 (((struct w1_therm_family_data *)(sl->family_data))->external_powered)
115 #define SLAVE_RESOLUTION(sl) \ argument
116 (((struct w1_therm_family_data *)(sl->family_data))->resolution)
122 #define SLAVE_CONV_TIME_OVERRIDE(sl) \ argument
123 (((struct w1_therm_family_data *)(sl->family_data))->conv_time_override)
129 #define SLAVE_FEATURES(sl) \ argument
130 (((struct w1_therm_family_data *)(sl->family_data))->features)
138 #define SLAVE_CONVERT_TRIGGERED(sl) \ argument
139 (((struct w1_therm_family_data *)(sl->family_data))->convert_triggered)
164 int (*get_conversion_time)(struct w1_slave *sl);
165 int (*set_resolution)(struct w1_slave *sl, int val);
166 int (*get_resolution)(struct w1_slave *sl);
167 int (*write_data)(struct w1_slave *sl, const u8 *data);
223 static int reset_select_slave(struct w1_slave *sl);
232 static int convert_t(struct w1_slave *sl, struct therm_info *info);
241 static int read_scratchpad(struct w1_slave *sl, struct therm_info *info);
251 static int write_scratchpad(struct w1_slave *sl, const u8 *data, u8 nb_bytes);
259 static int copy_scratchpad(struct w1_slave *sl);
267 static int recall_eeprom(struct w1_slave *sl);
281 static int read_powermode(struct w1_slave *sl);
371 static int w1_therm_add_slave(struct w1_slave *sl);
380 static void w1_therm_remove_slave(struct w1_slave *sl);
528 static inline int w1_DS18B20_convert_time(struct w1_slave *sl) in w1_DS18B20_convert_time() argument
532 if (!sl->family_data) in w1_DS18B20_convert_time()
535 if (SLAVE_CONV_TIME_OVERRIDE(sl) != CONV_TIME_DEFAULT) in w1_DS18B20_convert_time()
536 return SLAVE_CONV_TIME_OVERRIDE(sl); in w1_DS18B20_convert_time()
541 switch (SLAVE_RESOLUTION(sl)) { in w1_DS18B20_convert_time()
566 static inline int w1_DS18S20_convert_time(struct w1_slave *sl) in w1_DS18S20_convert_time() argument
568 if (!sl->family_data) in w1_DS18S20_convert_time()
571 if (SLAVE_CONV_TIME_OVERRIDE(sl) == CONV_TIME_DEFAULT) in w1_DS18S20_convert_time()
574 return SLAVE_CONV_TIME_OVERRIDE(sl); in w1_DS18S20_convert_time()
577 static inline int w1_DS18B20_write_data(struct w1_slave *sl, in w1_DS18B20_write_data() argument
580 return write_scratchpad(sl, data, 3); in w1_DS18B20_write_data()
583 static inline int w1_DS18S20_write_data(struct w1_slave *sl, in w1_DS18S20_write_data() argument
587 return write_scratchpad(sl, data, 2); in w1_DS18S20_write_data()
590 static inline int w1_DS18B20_set_resolution(struct w1_slave *sl, int val) in w1_DS18B20_set_resolution() argument
607 ret = read_scratchpad(sl, &info); in w1_DS18B20_set_resolution()
617 ret = w1_DS18B20_write_data(sl, info.rom + 2); in w1_DS18B20_set_resolution()
625 ret = read_scratchpad(sl, &info2); in w1_DS18B20_set_resolution()
637 static inline int w1_DS18B20_get_resolution(struct w1_slave *sl) in w1_DS18B20_get_resolution() argument
643 ret = read_scratchpad(sl, &info); in w1_DS18B20_get_resolution()
778 static struct w1_therm_family_converter *device_family(struct w1_slave *sl) in device_family() argument
784 if (w1_therm_families[i].f->fid == sl->family->fid) { in device_family()
826 static int check_family_data(struct w1_slave *sl) in check_family_data() argument
828 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in check_family_data()
829 dev_info(&sl->dev, in check_family_data()
842 static inline bool bulk_read_support(struct w1_slave *sl) in bulk_read_support() argument
844 if (SLAVE_SPECIFIC_FUNC(sl)) in bulk_read_support()
845 return SLAVE_SPECIFIC_FUNC(sl)->bulk_read; in bulk_read_support()
847 dev_info(&sl->dev, in bulk_read_support()
863 static inline int conversion_time(struct w1_slave *sl) in conversion_time() argument
865 if (SLAVE_SPECIFIC_FUNC(sl)) in conversion_time()
866 return SLAVE_SPECIFIC_FUNC(sl)->get_conversion_time(sl); in conversion_time()
868 dev_info(&sl->dev, in conversion_time()
883 static inline int temperature_from_RAM(struct w1_slave *sl, u8 rom[9]) in temperature_from_RAM() argument
885 if (SLAVE_SPECIFIC_FUNC(sl)) in temperature_from_RAM()
886 return SLAVE_SPECIFIC_FUNC(sl)->convert(rom); in temperature_from_RAM()
888 dev_info(&sl->dev, in temperature_from_RAM()
916 static int w1_therm_add_slave(struct w1_slave *sl) in w1_therm_add_slave() argument
921 sl->family_data = kzalloc(sizeof(struct w1_therm_family_data), in w1_therm_add_slave()
923 if (!sl->family_data) in w1_therm_add_slave()
926 atomic_set(THERM_REFCNT(sl->family_data), 1); in w1_therm_add_slave()
929 sl_family_conv = device_family(sl); in w1_therm_add_slave()
931 kfree(sl->family_data); in w1_therm_add_slave()
935 SLAVE_SPECIFIC_FUNC(sl) = sl_family_conv; in w1_therm_add_slave()
937 if (bulk_read_support(sl)) { in w1_therm_add_slave()
943 int err = device_create_file(&sl->master->dev, in w1_therm_add_slave()
947 dev_warn(&sl->dev, in w1_therm_add_slave()
956 SLAVE_POWERMODE(sl) = read_powermode(sl); in w1_therm_add_slave()
958 if (SLAVE_POWERMODE(sl) < 0) { in w1_therm_add_slave()
960 dev_warn(&sl->dev, in w1_therm_add_slave()
962 __func__, SLAVE_POWERMODE(sl)); in w1_therm_add_slave()
966 if (SLAVE_SPECIFIC_FUNC(sl)->get_resolution) { in w1_therm_add_slave()
967 SLAVE_RESOLUTION(sl) = in w1_therm_add_slave()
968 SLAVE_SPECIFIC_FUNC(sl)->get_resolution(sl); in w1_therm_add_slave()
969 if (SLAVE_RESOLUTION(sl) < 0) { in w1_therm_add_slave()
971 dev_warn(&sl->dev, in w1_therm_add_slave()
973 __func__, SLAVE_RESOLUTION(sl)); in w1_therm_add_slave()
978 SLAVE_CONVERT_TRIGGERED(sl) = 0; in w1_therm_add_slave()
983 static void w1_therm_remove_slave(struct w1_slave *sl) in w1_therm_remove_slave() argument
985 int refcnt = atomic_sub_return(1, THERM_REFCNT(sl->family_data)); in w1_therm_remove_slave()
987 if (bulk_read_support(sl)) { in w1_therm_remove_slave()
991 device_remove_file(&sl->master->dev, in w1_therm_remove_slave()
997 refcnt = atomic_read(THERM_REFCNT(sl->family_data)); in w1_therm_remove_slave()
999 kfree(sl->family_data); in w1_therm_remove_slave()
1000 sl->family_data = NULL; in w1_therm_remove_slave()
1006 static int reset_select_slave(struct w1_slave *sl) in reset_select_slave() argument
1009 u64 rn = le64_to_cpu(*((u64 *)&sl->reg_num)); in reset_select_slave()
1011 if (w1_reset_bus(sl->master)) in reset_select_slave()
1015 w1_write_block(sl->master, match, 9); in reset_select_slave()
1048 static int convert_t(struct w1_slave *sl, struct therm_info *info) in convert_t() argument
1050 struct w1_master *dev_master = sl->master; in convert_t()
1056 if (!sl->family_data) in convert_t()
1060 (!SLAVE_POWERMODE(sl) && in convert_t()
1063 if (strong_pullup && SLAVE_FEATURES(sl) & W1_THERM_POLL_COMPLETION) { in convert_t()
1064 dev_warn(&sl->dev, in convert_t()
1067 SLAVE_FEATURES(sl) &= ~W1_THERM_POLL_COMPLETION; in convert_t()
1071 t_conv = conversion_time(sl); in convert_t()
1076 atomic_inc(THERM_REFCNT(sl->family_data)); in convert_t()
1088 if (!reset_select_slave(sl)) { in convert_t()
1105 if (SLAVE_FEATURES(sl) & W1_THERM_POLL_COMPLETION) { in convert_t()
1108 dev_dbg(&sl->dev, "%s: Timeout\n", __func__); in convert_t()
1122 ret = read_scratchpad(sl, info); in convert_t()
1125 if ((SLAVE_FEATURES(sl) & W1_THERM_CHECK_RESULT) && in convert_t()
1145 atomic_dec(THERM_REFCNT(sl->family_data)); in convert_t()
1150 static int conv_time_measure(struct w1_slave *sl, int *conv_time) in conv_time_measure() argument
1154 struct w1_master *dev_master = sl->master; in conv_time_measure()
1159 if (!sl->family_data) in conv_time_measure()
1163 (!SLAVE_POWERMODE(sl) && in conv_time_measure()
1174 atomic_inc(THERM_REFCNT(sl->family_data)); in conv_time_measure()
1185 if (!reset_select_slave(sl)) { in conv_time_measure()
1194 dev_dbg(&sl->dev, "%s: Timeout\n", __func__); in conv_time_measure()
1207 ret = read_scratchpad(sl, info); in conv_time_measure()
1215 atomic_dec(THERM_REFCNT(sl->family_data)); in conv_time_measure()
1220 static int read_scratchpad(struct w1_slave *sl, struct therm_info *info) in read_scratchpad() argument
1222 struct w1_master *dev_master = sl->master; in read_scratchpad()
1228 if (!sl->family_data) in read_scratchpad()
1234 atomic_inc(THERM_REFCNT(sl->family_data)); in read_scratchpad()
1243 if (!reset_select_slave(sl)) { in read_scratchpad()
1250 dev_warn(&sl->dev, in read_scratchpad()
1269 atomic_dec(THERM_REFCNT(sl->family_data)); in read_scratchpad()
1274 static int write_scratchpad(struct w1_slave *sl, const u8 *data, u8 nb_bytes) in write_scratchpad() argument
1276 struct w1_master *dev_master = sl->master; in write_scratchpad()
1280 if (!sl->family_data) in write_scratchpad()
1284 atomic_inc(THERM_REFCNT(sl->family_data)); in write_scratchpad()
1293 if (!reset_select_slave(sl)) { in write_scratchpad()
1302 atomic_dec(THERM_REFCNT(sl->family_data)); in write_scratchpad()
1307 static int copy_scratchpad(struct w1_slave *sl) in copy_scratchpad() argument
1309 struct w1_master *dev_master = sl->master; in copy_scratchpad()
1314 if (!sl->family_data) in copy_scratchpad()
1319 (!SLAVE_POWERMODE(sl) && in copy_scratchpad()
1323 atomic_inc(THERM_REFCNT(sl->family_data)); in copy_scratchpad()
1332 if (!reset_select_slave(sl)) { in copy_scratchpad()
1356 atomic_dec(THERM_REFCNT(sl->family_data)); in copy_scratchpad()
1361 static int recall_eeprom(struct w1_slave *sl) in recall_eeprom() argument
1363 struct w1_master *dev_master = sl->master; in recall_eeprom()
1367 if (!sl->family_data) in recall_eeprom()
1371 atomic_inc(THERM_REFCNT(sl->family_data)); in recall_eeprom()
1380 if (!reset_select_slave(sl)) { in recall_eeprom()
1391 atomic_dec(THERM_REFCNT(sl->family_data)); in recall_eeprom()
1396 static int read_powermode(struct w1_slave *sl) in read_powermode() argument
1398 struct w1_master *dev_master = sl->master; in read_powermode()
1402 if (!sl->family_data) in read_powermode()
1406 atomic_inc(THERM_REFCNT(sl->family_data)); in read_powermode()
1415 if (!reset_select_slave(sl)) { in read_powermode()
1429 atomic_dec(THERM_REFCNT(sl->family_data)); in read_powermode()
1436 struct w1_slave *sl = NULL; /* used to iterate through slaves */ in trigger_bulk_read() local
1447 list_for_each_entry(sl, &dev_master->slist, w1_slave_entry) { in trigger_bulk_read()
1448 if (!sl->family_data) in trigger_bulk_read()
1450 if (bulk_read_support(sl)) { in trigger_bulk_read()
1451 int t_cur = conversion_time(sl); in trigger_bulk_read()
1456 (!SLAVE_POWERMODE(sl) && in trigger_bulk_read()
1486 list_for_each_entry(sl, in trigger_bulk_read()
1488 if (bulk_read_support(sl)) in trigger_bulk_read()
1489 SLAVE_CONVERT_TRIGGERED(sl) = -1; in trigger_bulk_read()
1516 list_for_each_entry(sl, &dev_master->slist, w1_slave_entry) { in trigger_bulk_read()
1517 if (bulk_read_support(sl)) in trigger_bulk_read()
1518 SLAVE_CONVERT_TRIGGERED(sl) = 1; in trigger_bulk_read()
1529 struct w1_slave *sl = dev_to_w1_slave(device); in w1_slave_show() local
1531 u8 *family_data = sl->family_data; in w1_slave_show()
1535 if (bulk_read_support(sl)) { in w1_slave_show()
1536 if (SLAVE_CONVERT_TRIGGERED(sl) < 0) { in w1_slave_show()
1541 } else if (SLAVE_CONVERT_TRIGGERED(sl) > 0) { in w1_slave_show()
1543 ret = read_scratchpad(sl, &info); in w1_slave_show()
1544 SLAVE_CONVERT_TRIGGERED(sl) = 0; in w1_slave_show()
1546 ret = convert_t(sl, &info); in w1_slave_show()
1548 ret = convert_t(sl, &info); in w1_slave_show()
1572 temperature_from_RAM(sl, info.rom)); in w1_slave_show()
1583 struct w1_slave *sl = dev_to_w1_slave(device); in w1_slave_store() local
1593 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in w1_slave_store()
1600 ret = copy_scratchpad(sl); in w1_slave_store()
1602 if (SLAVE_SPECIFIC_FUNC(sl)->set_resolution) in w1_slave_store()
1603 ret = SLAVE_SPECIFIC_FUNC(sl)->set_resolution(sl, val); in w1_slave_store()
1611 SLAVE_RESOLUTION(sl) = val; in w1_slave_store()
1613 SLAVE_CONV_TIME_OVERRIDE(sl) = CONV_TIME_DEFAULT; in w1_slave_store()
1621 struct w1_slave *sl = dev_to_w1_slave(device); in temperature_show() local
1625 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in temperature_show()
1631 if (bulk_read_support(sl)) { in temperature_show()
1632 if (SLAVE_CONVERT_TRIGGERED(sl) < 0) { in temperature_show()
1637 } else if (SLAVE_CONVERT_TRIGGERED(sl) > 0) { in temperature_show()
1639 ret = read_scratchpad(sl, &info); in temperature_show()
1640 SLAVE_CONVERT_TRIGGERED(sl) = 0; in temperature_show()
1642 ret = convert_t(sl, &info); in temperature_show()
1644 ret = convert_t(sl, &info); in temperature_show()
1653 return sprintf(buf, "%d\n", temperature_from_RAM(sl, info.rom)); in temperature_show()
1659 struct w1_slave *sl = dev_to_w1_slave(device); in ext_power_show() local
1661 if (!sl->family_data) { in ext_power_show()
1668 SLAVE_POWERMODE(sl) = read_powermode(sl); in ext_power_show()
1670 if (SLAVE_POWERMODE(sl) < 0) { in ext_power_show()
1673 __func__, SLAVE_POWERMODE(sl)); in ext_power_show()
1675 return sprintf(buf, "%d\n", SLAVE_POWERMODE(sl)); in ext_power_show()
1681 struct w1_slave *sl = dev_to_w1_slave(device); in resolution_show() local
1683 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in resolution_show()
1690 SLAVE_RESOLUTION(sl) = SLAVE_SPECIFIC_FUNC(sl)->get_resolution(sl); in resolution_show()
1691 if (SLAVE_RESOLUTION(sl) < 0) { in resolution_show()
1694 __func__, SLAVE_RESOLUTION(sl)); in resolution_show()
1697 return sprintf(buf, "%d\n", SLAVE_RESOLUTION(sl)); in resolution_show()
1703 struct w1_slave *sl = dev_to_w1_slave(device); in resolution_store() local
1715 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in resolution_store()
1727 ret = SLAVE_SPECIFIC_FUNC(sl)->set_resolution(sl, val); in resolution_store()
1732 SLAVE_RESOLUTION(sl) = val; in resolution_store()
1734 SLAVE_CONV_TIME_OVERRIDE(sl) = CONV_TIME_DEFAULT; in resolution_store()
1742 struct w1_slave *sl = dev_to_w1_slave(device); in eeprom_store() local
1747 ret = copy_scratchpad(sl); in eeprom_store()
1750 ret = recall_eeprom(sl); in eeprom_store()
1762 struct w1_slave *sl = dev_to_w1_slave(device); in alarms_show() local
1767 ret = read_scratchpad(sl, &scratchpad); in alarms_show()
1784 struct w1_slave *sl = dev_to_w1_slave(device); in alarms_store() local
1848 ret = read_scratchpad(sl, &info); in alarms_store()
1861 if (!SLAVE_SPECIFIC_FUNC(sl)) { in alarms_store()
1868 ret = SLAVE_SPECIFIC_FUNC(sl)->write_data(sl, new_config_register); in alarms_store()
1904 struct w1_slave *sl = NULL; in therm_bulk_read_show() local
1907 list_for_each_entry(sl, &dev_master->slist, w1_slave_entry) { in therm_bulk_read_show()
1908 if (sl->family_data) { in therm_bulk_read_show()
1909 if (bulk_read_support(sl)) { in therm_bulk_read_show()
1910 if (SLAVE_CONVERT_TRIGGERED(sl) == -1) { in therm_bulk_read_show()
1914 if (SLAVE_CONVERT_TRIGGERED(sl) == 1) in therm_bulk_read_show()
1927 struct w1_slave *sl = dev_to_w1_slave(device); in conv_time_show() local
1929 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in conv_time_show()
1934 return sprintf(buf, "%d\n", conversion_time(sl)); in conv_time_show()
1941 struct w1_slave *sl = dev_to_w1_slave(device); in conv_time_store() local
1946 if (check_family_data(sl)) in conv_time_store()
1951 SLAVE_CONV_TIME_OVERRIDE(sl) = val; in conv_time_store()
1958 ret = conv_time_measure(sl, &conv_time); in conv_time_store()
1961 SLAVE_CONV_TIME_OVERRIDE(sl) = conv_time; in conv_time_store()
1969 struct w1_slave *sl = dev_to_w1_slave(device); in features_show() local
1971 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in features_show()
1976 return sprintf(buf, "%u\n", SLAVE_FEATURES(sl)); in features_show()
1984 struct w1_slave *sl = dev_to_w1_slave(device); in features_store() local
1990 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in features_store()
1998 SLAVE_FEATURES(sl) = val; in features_store()
2001 (!SLAVE_POWERMODE(sl) && in features_store()
2004 if (strong_pullup && SLAVE_FEATURES(sl) & W1_THERM_POLL_COMPLETION) { in features_store()
2005 dev_warn(&sl->dev, in features_store()
2008 SLAVE_FEATURES(sl) &= ~W1_THERM_POLL_COMPLETION; in features_store()
2018 struct w1_slave *sl = dev_get_drvdata(device); in w1_read_temp() local
2024 ret = convert_t(sl, &info); in w1_read_temp()
2033 *val = temperature_from_RAM(sl, info.rom); in w1_read_temp()
2058 struct w1_slave *sl = dev_to_w1_slave(device); in w1_seq_show() local
2067 mutex_lock(&sl->master->bus_mutex); in w1_seq_show()
2069 if (w1_reset_bus(sl->master)) in w1_seq_show()
2071 w1_write_8(sl->master, W1_SKIP_ROM); in w1_seq_show()
2072 w1_write_8(sl->master, W1_42_CHAIN); in w1_seq_show()
2073 w1_write_8(sl->master, W1_42_CHAIN_ON); in w1_seq_show()
2074 w1_write_8(sl->master, W1_42_CHAIN_ON_INV); in w1_seq_show()
2075 msleep(sl->master->pullup_duration); in w1_seq_show()
2078 ack = w1_read_8(sl->master); in w1_seq_show()
2084 if (w1_reset_bus(sl->master)) in w1_seq_show()
2087 w1_write_8(sl->master, W1_42_COND_READ); in w1_seq_show()
2088 rv = w1_read_block(sl->master, (u8 *)&rn, 8); in w1_seq_show()
2092 if (sl->reg_num.id == reg_num->id) in w1_seq_show()
2095 if (w1_reset_bus(sl->master)) in w1_seq_show()
2099 w1_write_8(sl->master, W1_MATCH_ROM); in w1_seq_show()
2100 w1_write_block(sl->master, (u8 *)&rn, 8); in w1_seq_show()
2101 w1_write_8(sl->master, W1_42_CHAIN); in w1_seq_show()
2102 w1_write_8(sl->master, W1_42_CHAIN_DONE); in w1_seq_show()
2103 w1_write_8(sl->master, W1_42_CHAIN_DONE_INV); in w1_seq_show()
2106 ack = w1_read_8(sl->master); in w1_seq_show()
2112 if (w1_reset_bus(sl->master)) in w1_seq_show()
2114 w1_write_8(sl->master, W1_SKIP_ROM); in w1_seq_show()
2115 w1_write_8(sl->master, W1_42_CHAIN); in w1_seq_show()
2116 w1_write_8(sl->master, W1_42_CHAIN_OFF); in w1_seq_show()
2117 w1_write_8(sl->master, W1_42_CHAIN_OFF_INV); in w1_seq_show()
2120 ack = w1_read_8(sl->master); in w1_seq_show()
2123 mutex_unlock(&sl->master->bus_mutex); in w1_seq_show()
2128 mutex_unlock(&sl->master->bus_mutex); in w1_seq_show()