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_DS1825_convert_time(struct w1_slave *sl) in w1_DS1825_convert_time() argument
581 if (!sl->family_data) in w1_DS1825_convert_time()
584 if (SLAVE_CONV_TIME_OVERRIDE(sl) != CONV_TIME_DEFAULT) in w1_DS1825_convert_time()
585 return SLAVE_CONV_TIME_OVERRIDE(sl); in w1_DS1825_convert_time()
590 switch (SLAVE_RESOLUTION(sl)) { in w1_DS1825_convert_time()
612 static inline int w1_DS18B20_write_data(struct w1_slave *sl, in w1_DS18B20_write_data() argument
615 return write_scratchpad(sl, data, 3); in w1_DS18B20_write_data()
618 static inline int w1_DS18S20_write_data(struct w1_slave *sl, in w1_DS18S20_write_data() argument
622 return write_scratchpad(sl, data, 2); in w1_DS18S20_write_data()
625 static inline int w1_DS18B20_set_resolution(struct w1_slave *sl, int val) in w1_DS18B20_set_resolution() argument
643 ret = read_scratchpad(sl, &info); in w1_DS18B20_set_resolution()
653 ret = w1_DS18B20_write_data(sl, info.rom + 2); in w1_DS18B20_set_resolution()
661 ret = read_scratchpad(sl, &info2); in w1_DS18B20_set_resolution()
673 static inline int w1_DS18B20_get_resolution(struct w1_slave *sl) in w1_DS18B20_get_resolution() argument
679 ret = read_scratchpad(sl, &info); in w1_DS18B20_get_resolution()
844 static struct w1_therm_family_converter *device_family(struct w1_slave *sl) in device_family() argument
850 if (w1_therm_families[i].f->fid == sl->family->fid) { in device_family()
892 static int check_family_data(struct w1_slave *sl) in check_family_data() argument
894 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in check_family_data()
895 dev_info(&sl->dev, in check_family_data()
908 static inline bool bulk_read_support(struct w1_slave *sl) in bulk_read_support() argument
910 if (SLAVE_SPECIFIC_FUNC(sl)) in bulk_read_support()
911 return SLAVE_SPECIFIC_FUNC(sl)->bulk_read; in bulk_read_support()
913 dev_info(&sl->dev, in bulk_read_support()
929 static inline int conversion_time(struct w1_slave *sl) in conversion_time() argument
931 if (SLAVE_SPECIFIC_FUNC(sl)) in conversion_time()
932 return SLAVE_SPECIFIC_FUNC(sl)->get_conversion_time(sl); in conversion_time()
934 dev_info(&sl->dev, in conversion_time()
949 static inline int temperature_from_RAM(struct w1_slave *sl, u8 rom[9]) in temperature_from_RAM() argument
951 if (SLAVE_SPECIFIC_FUNC(sl)) in temperature_from_RAM()
952 return SLAVE_SPECIFIC_FUNC(sl)->convert(rom); in temperature_from_RAM()
954 dev_info(&sl->dev, in temperature_from_RAM()
981 static int w1_therm_add_slave(struct w1_slave *sl) in w1_therm_add_slave() argument
986 sl->family_data = kzalloc(sizeof(struct w1_therm_family_data), in w1_therm_add_slave()
988 if (!sl->family_data) in w1_therm_add_slave()
991 atomic_set(THERM_REFCNT(sl->family_data), 1); in w1_therm_add_slave()
994 sl_family_conv = device_family(sl); in w1_therm_add_slave()
996 kfree(sl->family_data); in w1_therm_add_slave()
1000 SLAVE_SPECIFIC_FUNC(sl) = sl_family_conv; in w1_therm_add_slave()
1002 if (bulk_read_support(sl)) { in w1_therm_add_slave()
1008 int err = device_create_file(&sl->master->dev, in w1_therm_add_slave()
1012 dev_warn(&sl->dev, in w1_therm_add_slave()
1021 SLAVE_POWERMODE(sl) = read_powermode(sl); in w1_therm_add_slave()
1023 if (SLAVE_POWERMODE(sl) < 0) { in w1_therm_add_slave()
1025 dev_warn(&sl->dev, in w1_therm_add_slave()
1027 __func__, SLAVE_POWERMODE(sl)); in w1_therm_add_slave()
1031 if (SLAVE_SPECIFIC_FUNC(sl)->get_resolution) { in w1_therm_add_slave()
1032 SLAVE_RESOLUTION(sl) = in w1_therm_add_slave()
1033 SLAVE_SPECIFIC_FUNC(sl)->get_resolution(sl); in w1_therm_add_slave()
1034 if (SLAVE_RESOLUTION(sl) < 0) { in w1_therm_add_slave()
1036 dev_warn(&sl->dev, in w1_therm_add_slave()
1038 __func__, SLAVE_RESOLUTION(sl)); in w1_therm_add_slave()
1043 SLAVE_CONVERT_TRIGGERED(sl) = 0; in w1_therm_add_slave()
1048 static void w1_therm_remove_slave(struct w1_slave *sl) in w1_therm_remove_slave() argument
1050 int refcnt = atomic_sub_return(1, THERM_REFCNT(sl->family_data)); in w1_therm_remove_slave()
1052 if (bulk_read_support(sl)) { in w1_therm_remove_slave()
1056 device_remove_file(&sl->master->dev, in w1_therm_remove_slave()
1062 refcnt = atomic_read(THERM_REFCNT(sl->family_data)); in w1_therm_remove_slave()
1064 kfree(sl->family_data); in w1_therm_remove_slave()
1065 sl->family_data = NULL; in w1_therm_remove_slave()
1071 static int reset_select_slave(struct w1_slave *sl) in reset_select_slave() argument
1074 u64 rn = le64_to_cpu(*((u64 *)&sl->reg_num)); in reset_select_slave()
1076 if (w1_reset_bus(sl->master)) in reset_select_slave()
1080 w1_write_block(sl->master, match, 9); in reset_select_slave()
1113 static int convert_t(struct w1_slave *sl, struct therm_info *info) in convert_t() argument
1115 struct w1_master *dev_master = sl->master; in convert_t()
1121 if (!sl->family_data) in convert_t()
1125 (!SLAVE_POWERMODE(sl) && in convert_t()
1128 if (strong_pullup && SLAVE_FEATURES(sl) & W1_THERM_POLL_COMPLETION) { in convert_t()
1129 dev_warn(&sl->dev, in convert_t()
1132 SLAVE_FEATURES(sl) &= ~W1_THERM_POLL_COMPLETION; in convert_t()
1136 t_conv = conversion_time(sl); in convert_t()
1141 atomic_inc(THERM_REFCNT(sl->family_data)); in convert_t()
1153 if (!reset_select_slave(sl)) { in convert_t()
1162 if (SLAVE_FEATURES(sl) & W1_THERM_POLL_COMPLETION) { in convert_t()
1165 dev_dbg(&sl->dev, "%s: Timeout\n", __func__); in convert_t()
1184 ret = read_scratchpad(sl, info); in convert_t()
1187 if ((SLAVE_FEATURES(sl) & W1_THERM_CHECK_RESULT) && in convert_t()
1207 atomic_dec(THERM_REFCNT(sl->family_data)); in convert_t()
1212 static int conv_time_measure(struct w1_slave *sl, int *conv_time) in conv_time_measure() argument
1216 struct w1_master *dev_master = sl->master; in conv_time_measure()
1221 if (!sl->family_data) in conv_time_measure()
1225 (!SLAVE_POWERMODE(sl) && in conv_time_measure()
1236 atomic_inc(THERM_REFCNT(sl->family_data)); in conv_time_measure()
1247 if (!reset_select_slave(sl)) { in conv_time_measure()
1256 dev_dbg(&sl->dev, "%s: Timeout\n", __func__); in conv_time_measure()
1269 ret = read_scratchpad(sl, info); in conv_time_measure()
1277 atomic_dec(THERM_REFCNT(sl->family_data)); in conv_time_measure()
1282 static int read_scratchpad(struct w1_slave *sl, struct therm_info *info) in read_scratchpad() argument
1284 struct w1_master *dev_master = sl->master; in read_scratchpad()
1290 if (!sl->family_data) in read_scratchpad()
1296 atomic_inc(THERM_REFCNT(sl->family_data)); in read_scratchpad()
1305 if (!reset_select_slave(sl)) { in read_scratchpad()
1312 dev_warn(&sl->dev, in read_scratchpad()
1331 atomic_dec(THERM_REFCNT(sl->family_data)); in read_scratchpad()
1336 static int write_scratchpad(struct w1_slave *sl, const u8 *data, u8 nb_bytes) in write_scratchpad() argument
1338 struct w1_master *dev_master = sl->master; in write_scratchpad()
1342 if (!sl->family_data) in write_scratchpad()
1346 atomic_inc(THERM_REFCNT(sl->family_data)); in write_scratchpad()
1355 if (!reset_select_slave(sl)) { in write_scratchpad()
1364 atomic_dec(THERM_REFCNT(sl->family_data)); in write_scratchpad()
1369 static int copy_scratchpad(struct w1_slave *sl) in copy_scratchpad() argument
1371 struct w1_master *dev_master = sl->master; in copy_scratchpad()
1376 if (!sl->family_data) in copy_scratchpad()
1381 (!SLAVE_POWERMODE(sl) && in copy_scratchpad()
1385 atomic_inc(THERM_REFCNT(sl->family_data)); in copy_scratchpad()
1394 if (!reset_select_slave(sl)) { in copy_scratchpad()
1418 atomic_dec(THERM_REFCNT(sl->family_data)); in copy_scratchpad()
1423 static int recall_eeprom(struct w1_slave *sl) in recall_eeprom() argument
1425 struct w1_master *dev_master = sl->master; in recall_eeprom()
1429 if (!sl->family_data) in recall_eeprom()
1433 atomic_inc(THERM_REFCNT(sl->family_data)); in recall_eeprom()
1442 if (!reset_select_slave(sl)) { in recall_eeprom()
1453 atomic_dec(THERM_REFCNT(sl->family_data)); in recall_eeprom()
1458 static int read_powermode(struct w1_slave *sl) in read_powermode() argument
1460 struct w1_master *dev_master = sl->master; in read_powermode()
1464 if (!sl->family_data) in read_powermode()
1468 atomic_inc(THERM_REFCNT(sl->family_data)); in read_powermode()
1477 if (!reset_select_slave(sl)) { in read_powermode()
1491 atomic_dec(THERM_REFCNT(sl->family_data)); in read_powermode()
1498 struct w1_slave *sl = NULL; /* used to iterate through slaves */ in trigger_bulk_read() local
1509 list_for_each_entry(sl, &dev_master->slist, w1_slave_entry) { in trigger_bulk_read()
1510 if (!sl->family_data) in trigger_bulk_read()
1512 if (bulk_read_support(sl)) { in trigger_bulk_read()
1513 int t_cur = conversion_time(sl); in trigger_bulk_read()
1518 (!SLAVE_POWERMODE(sl) && in trigger_bulk_read()
1548 list_for_each_entry(sl, in trigger_bulk_read()
1550 if (bulk_read_support(sl)) in trigger_bulk_read()
1551 SLAVE_CONVERT_TRIGGERED(sl) = -1; in trigger_bulk_read()
1578 list_for_each_entry(sl, &dev_master->slist, w1_slave_entry) { in trigger_bulk_read()
1579 if (bulk_read_support(sl)) in trigger_bulk_read()
1580 SLAVE_CONVERT_TRIGGERED(sl) = 1; in trigger_bulk_read()
1591 struct w1_slave *sl = dev_to_w1_slave(device); in w1_slave_show() local
1593 u8 *family_data = sl->family_data; in w1_slave_show()
1597 if (bulk_read_support(sl)) { in w1_slave_show()
1598 if (SLAVE_CONVERT_TRIGGERED(sl) < 0) { in w1_slave_show()
1603 } else if (SLAVE_CONVERT_TRIGGERED(sl) > 0) { in w1_slave_show()
1605 ret = read_scratchpad(sl, &info); in w1_slave_show()
1606 SLAVE_CONVERT_TRIGGERED(sl) = 0; in w1_slave_show()
1608 ret = convert_t(sl, &info); in w1_slave_show()
1610 ret = convert_t(sl, &info); in w1_slave_show()
1634 temperature_from_RAM(sl, info.rom)); in w1_slave_show()
1645 struct w1_slave *sl = dev_to_w1_slave(device); in w1_slave_store() local
1655 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in w1_slave_store()
1662 ret = copy_scratchpad(sl); in w1_slave_store()
1664 if (SLAVE_SPECIFIC_FUNC(sl)->set_resolution) in w1_slave_store()
1665 ret = SLAVE_SPECIFIC_FUNC(sl)->set_resolution(sl, val); in w1_slave_store()
1673 SLAVE_RESOLUTION(sl) = val; in w1_slave_store()
1675 SLAVE_CONV_TIME_OVERRIDE(sl) = CONV_TIME_DEFAULT; in w1_slave_store()
1683 struct w1_slave *sl = dev_to_w1_slave(device); in temperature_show() local
1687 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in temperature_show()
1693 if (bulk_read_support(sl)) { in temperature_show()
1694 if (SLAVE_CONVERT_TRIGGERED(sl) < 0) { in temperature_show()
1699 } else if (SLAVE_CONVERT_TRIGGERED(sl) > 0) { in temperature_show()
1701 ret = read_scratchpad(sl, &info); in temperature_show()
1702 SLAVE_CONVERT_TRIGGERED(sl) = 0; in temperature_show()
1704 ret = convert_t(sl, &info); in temperature_show()
1706 ret = convert_t(sl, &info); in temperature_show()
1715 return sprintf(buf, "%d\n", temperature_from_RAM(sl, info.rom)); in temperature_show()
1721 struct w1_slave *sl = dev_to_w1_slave(device); in ext_power_show() local
1723 if (!sl->family_data) { in ext_power_show()
1730 SLAVE_POWERMODE(sl) = read_powermode(sl); in ext_power_show()
1732 if (SLAVE_POWERMODE(sl) < 0) { in ext_power_show()
1735 __func__, SLAVE_POWERMODE(sl)); in ext_power_show()
1737 return sprintf(buf, "%d\n", SLAVE_POWERMODE(sl)); in ext_power_show()
1743 struct w1_slave *sl = dev_to_w1_slave(device); in resolution_show() local
1745 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in resolution_show()
1752 SLAVE_RESOLUTION(sl) = SLAVE_SPECIFIC_FUNC(sl)->get_resolution(sl); in resolution_show()
1753 if (SLAVE_RESOLUTION(sl) < 0) { in resolution_show()
1756 __func__, SLAVE_RESOLUTION(sl)); in resolution_show()
1759 return sprintf(buf, "%d\n", SLAVE_RESOLUTION(sl)); in resolution_show()
1765 struct w1_slave *sl = dev_to_w1_slave(device); in resolution_store() local
1777 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in resolution_store()
1789 ret = SLAVE_SPECIFIC_FUNC(sl)->set_resolution(sl, val); in resolution_store()
1794 SLAVE_RESOLUTION(sl) = val; in resolution_store()
1796 SLAVE_CONV_TIME_OVERRIDE(sl) = CONV_TIME_DEFAULT; in resolution_store()
1804 struct w1_slave *sl = dev_to_w1_slave(device); in eeprom_cmd_store() local
1809 ret = copy_scratchpad(sl); in eeprom_cmd_store()
1812 ret = recall_eeprom(sl); in eeprom_cmd_store()
1824 struct w1_slave *sl = dev_to_w1_slave(device); in alarms_show() local
1829 ret = read_scratchpad(sl, &scratchpad); in alarms_show()
1846 struct w1_slave *sl = dev_to_w1_slave(device); in alarms_store() local
1909 ret = read_scratchpad(sl, &info); in alarms_store()
1922 if (!SLAVE_SPECIFIC_FUNC(sl)) { in alarms_store()
1929 ret = SLAVE_SPECIFIC_FUNC(sl)->write_data(sl, new_config_register); in alarms_store()
1965 struct w1_slave *sl = NULL; in therm_bulk_read_show() local
1968 list_for_each_entry(sl, &dev_master->slist, w1_slave_entry) { in therm_bulk_read_show()
1969 if (sl->family_data) { in therm_bulk_read_show()
1970 if (bulk_read_support(sl)) { in therm_bulk_read_show()
1971 if (SLAVE_CONVERT_TRIGGERED(sl) == -1) { in therm_bulk_read_show()
1975 if (SLAVE_CONVERT_TRIGGERED(sl) == 1) in therm_bulk_read_show()
1988 struct w1_slave *sl = dev_to_w1_slave(device); in conv_time_show() local
1990 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in conv_time_show()
1995 return sprintf(buf, "%d\n", conversion_time(sl)); in conv_time_show()
2002 struct w1_slave *sl = dev_to_w1_slave(device); in conv_time_store() local
2007 if (check_family_data(sl)) in conv_time_store()
2012 SLAVE_CONV_TIME_OVERRIDE(sl) = val; in conv_time_store()
2019 ret = conv_time_measure(sl, &conv_time); in conv_time_store()
2022 SLAVE_CONV_TIME_OVERRIDE(sl) = conv_time; in conv_time_store()
2030 struct w1_slave *sl = dev_to_w1_slave(device); in features_show() local
2032 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in features_show()
2037 return sprintf(buf, "%u\n", SLAVE_FEATURES(sl)); in features_show()
2045 struct w1_slave *sl = dev_to_w1_slave(device); in features_store() local
2051 if ((!sl->family_data) || (!SLAVE_SPECIFIC_FUNC(sl))) { in features_store()
2059 SLAVE_FEATURES(sl) = val; in features_store()
2062 (!SLAVE_POWERMODE(sl) && in features_store()
2065 if (strong_pullup && SLAVE_FEATURES(sl) & W1_THERM_POLL_COMPLETION) { in features_store()
2066 dev_warn(&sl->dev, in features_store()
2069 SLAVE_FEATURES(sl) &= ~W1_THERM_POLL_COMPLETION; in features_store()
2079 struct w1_slave *sl = dev_get_drvdata(device); in w1_read_temp() local
2085 ret = convert_t(sl, &info); in w1_read_temp()
2094 *val = temperature_from_RAM(sl, info.rom); in w1_read_temp()
2119 struct w1_slave *sl = dev_to_w1_slave(device); in w1_seq_show() local
2127 mutex_lock(&sl->master->bus_mutex); in w1_seq_show()
2129 if (w1_reset_bus(sl->master)) in w1_seq_show()
2131 w1_write_8(sl->master, W1_SKIP_ROM); in w1_seq_show()
2132 w1_write_8(sl->master, W1_42_CHAIN); in w1_seq_show()
2133 w1_write_8(sl->master, W1_42_CHAIN_ON); in w1_seq_show()
2134 w1_write_8(sl->master, W1_42_CHAIN_ON_INV); in w1_seq_show()
2135 msleep(sl->master->pullup_duration); in w1_seq_show()
2138 ack = w1_read_8(sl->master); in w1_seq_show()
2144 if (w1_reset_bus(sl->master)) in w1_seq_show()
2147 w1_write_8(sl->master, W1_42_COND_READ); in w1_seq_show()
2148 w1_read_block(sl->master, (u8 *)&rn, 8); in w1_seq_show()
2152 if (sl->reg_num.id == reg_num->id) in w1_seq_show()
2155 if (w1_reset_bus(sl->master)) in w1_seq_show()
2159 w1_write_8(sl->master, W1_MATCH_ROM); in w1_seq_show()
2160 w1_write_block(sl->master, (u8 *)&rn, 8); in w1_seq_show()
2161 w1_write_8(sl->master, W1_42_CHAIN); in w1_seq_show()
2162 w1_write_8(sl->master, W1_42_CHAIN_DONE); in w1_seq_show()
2163 w1_write_8(sl->master, W1_42_CHAIN_DONE_INV); in w1_seq_show()
2166 ack = w1_read_8(sl->master); in w1_seq_show()
2172 if (w1_reset_bus(sl->master)) in w1_seq_show()
2174 w1_write_8(sl->master, W1_SKIP_ROM); in w1_seq_show()
2175 w1_write_8(sl->master, W1_42_CHAIN); in w1_seq_show()
2176 w1_write_8(sl->master, W1_42_CHAIN_OFF); in w1_seq_show()
2177 w1_write_8(sl->master, W1_42_CHAIN_OFF_INV); in w1_seq_show()
2180 ack = w1_read_8(sl->master); in w1_seq_show()
2183 mutex_unlock(&sl->master->bus_mutex); in w1_seq_show()
2188 mutex_unlock(&sl->master->bus_mutex); in w1_seq_show()