Lines Matching +full:c +full:- +full:family +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2004 Evgeniy Polyakov <zbr@ioremap.net>
42 * on a static 1-wire bus. Memory is not allocated based on this number, just
63 return -ENODEV; in w1_master_probe()
70 dev_dbg(dev, "%s: Releasing %s.\n", __func__, md->name); in w1_master_release()
79 dev_dbg(dev, "%s: Releasing %s [%p]\n", __func__, sl->name, sl); in w1_slave_release()
81 w1_family_put(sl->family); in w1_slave_release()
82 sl->master->slave_count--; in w1_slave_release()
89 return sprintf(buf, "%s\n", sl->name); in name_show()
91 static DEVICE_ATTR_RO(name);
97 ssize_t count = sizeof(sl->reg_num); in id_show()
99 memcpy(buf, (u8 *)&sl->reg_num, count); in id_show()
111 /* Default family */
119 mutex_lock(&sl->master->mutex); in rw_write()
125 w1_write_block(sl->master, buf, count); in rw_write()
128 mutex_unlock(&sl->master->mutex); in rw_write()
138 mutex_lock(&sl->master->mutex); in rw_read()
139 w1_read_block(sl->master, buf, count); in rw_read()
140 mutex_unlock(&sl->master->mutex); in rw_read()
171 .name = "w1",
176 .name = "w1_master_driver",
190 .name = "w1_slave_driver",
209 mutex_lock(&md->mutex); in w1_master_attribute_show_name()
210 count = sprintf(buf, "%s\n", md->name); in w1_master_attribute_show_name()
211 mutex_unlock(&md->mutex); in w1_master_attribute_show_name()
228 mutex_lock(&md->mutex); in w1_master_attribute_store_search()
229 md->search_count = tmp; in w1_master_attribute_store_search()
230 mutex_unlock(&md->mutex); in w1_master_attribute_store_search()
233 wake_up_process(md->thread); in w1_master_attribute_store_search()
245 mutex_lock(&md->mutex); in w1_master_attribute_show_search()
246 count = sprintf(buf, "%d\n", md->search_count); in w1_master_attribute_show_search()
247 mutex_unlock(&md->mutex); in w1_master_attribute_show_search()
264 mutex_lock(&md->mutex); in w1_master_attribute_store_pullup()
265 md->enable_pullup = tmp; in w1_master_attribute_store_pullup()
266 mutex_unlock(&md->mutex); in w1_master_attribute_store_pullup()
278 mutex_lock(&md->mutex); in w1_master_attribute_show_pullup()
279 count = sprintf(buf, "%d\n", md->enable_pullup); in w1_master_attribute_show_pullup()
280 mutex_unlock(&md->mutex); in w1_master_attribute_show_pullup()
290 mutex_lock(&md->mutex); in w1_master_attribute_show_pointer()
291 count = sprintf(buf, "0x%p\n", md->bus_master); in w1_master_attribute_show_pointer()
292 mutex_unlock(&md->mutex); in w1_master_attribute_show_pointer()
314 return -EINVAL; in w1_master_attribute_store_max_slave_count()
316 mutex_lock(&md->mutex); in w1_master_attribute_store_max_slave_count()
317 md->max_slave_count = tmp; in w1_master_attribute_store_max_slave_count()
319 clear_bit(W1_WARN_MAX_COUNT, &md->flags); in w1_master_attribute_store_max_slave_count()
320 mutex_unlock(&md->mutex); in w1_master_attribute_store_max_slave_count()
330 mutex_lock(&md->mutex); in w1_master_attribute_show_max_slave_count()
331 count = sprintf(buf, "%d\n", md->max_slave_count); in w1_master_attribute_show_max_slave_count()
332 mutex_unlock(&md->mutex); in w1_master_attribute_show_max_slave_count()
341 mutex_lock(&md->mutex); in w1_master_attribute_show_attempts()
342 count = sprintf(buf, "%lu\n", md->attempts); in w1_master_attribute_show_attempts()
343 mutex_unlock(&md->mutex); in w1_master_attribute_show_attempts()
352 mutex_lock(&md->mutex); in w1_master_attribute_show_slave_count()
353 count = sprintf(buf, "%d\n", md->slave_count); in w1_master_attribute_show_slave_count()
354 mutex_unlock(&md->mutex); in w1_master_attribute_show_slave_count()
362 int c = PAGE_SIZE; in w1_master_attribute_show_slaves() local
366 mutex_lock(&md->list_mutex); in w1_master_attribute_show_slaves()
368 list_for_each_safe(ent, n, &md->slist) { in w1_master_attribute_show_slaves()
371 c -= snprintf(buf + PAGE_SIZE - c, c, "%s\n", sl->name); in w1_master_attribute_show_slaves()
374 c -= snprintf(buf + PAGE_SIZE - c, c, "not found.\n"); in w1_master_attribute_show_slaves()
376 mutex_unlock(&md->list_mutex); in w1_master_attribute_show_slaves()
378 return PAGE_SIZE - c; in w1_master_attribute_show_slaves()
384 int c = PAGE_SIZE; in w1_master_attribute_show_add() local
385 c -= snprintf(buf+PAGE_SIZE - c, c, in w1_master_attribute_show_add()
386 "write device id xx-xxxxxxxxxxxx to add slave\n"); in w1_master_attribute_show_add()
387 return PAGE_SIZE - c; in w1_master_attribute_show_add()
393 unsigned int family; in w1_atoreg_num() local
404 "ff-dddddddddddd\n"; in w1_atoreg_num()
406 if (buf[2] != '-') { in w1_atoreg_num()
408 return -EINVAL; in w1_atoreg_num()
410 i = sscanf(buf, "%02x-%012llx", &family, &id); in w1_atoreg_num()
413 return -EINVAL; in w1_atoreg_num()
415 rn->family = family; in w1_atoreg_num()
416 rn->id = id; in w1_atoreg_num()
419 rn->crc = w1_calc_crc8((u8 *)&rn64_le, 7); in w1_atoreg_num()
423 rn->family, (unsigned long long)rn->id, rn->crc); in w1_atoreg_num()
436 mutex_lock(&dev->list_mutex); in w1_slave_search_device()
437 list_for_each_entry(sl, &dev->slist, w1_slave_entry) { in w1_slave_search_device()
438 if (sl->reg_num.family == rn->family && in w1_slave_search_device()
439 sl->reg_num.id == rn->id && in w1_slave_search_device()
440 sl->reg_num.crc == rn->crc) { in w1_slave_search_device()
441 mutex_unlock(&dev->list_mutex); in w1_slave_search_device()
445 mutex_unlock(&dev->list_mutex); in w1_slave_search_device()
459 return -EINVAL; in w1_master_attribute_store_add()
461 mutex_lock(&md->mutex); in w1_master_attribute_store_add()
463 /* It would be nice to do a targeted search one the one-wire bus in w1_master_attribute_store_add()
468 dev_info(dev, "Device %s already exists\n", sl->name); in w1_master_attribute_store_add()
469 result = -EINVAL; in w1_master_attribute_store_add()
473 mutex_unlock(&md->mutex); in w1_master_attribute_store_add()
481 int c = PAGE_SIZE; in w1_master_attribute_show_remove() local
482 c -= snprintf(buf+PAGE_SIZE - c, c, in w1_master_attribute_show_remove()
483 "write device id xx-xxxxxxxxxxxx to remove slave\n"); in w1_master_attribute_show_remove()
484 return PAGE_SIZE - c; in w1_master_attribute_show_remove()
497 return -EINVAL; in w1_master_attribute_store_remove()
499 mutex_lock(&md->mutex); in w1_master_attribute_store_remove()
507 dev_info(dev, "Device %02x-%012llx doesn't exist\n", rn.family, in w1_master_attribute_store_remove()
509 result = -EINVAL; in w1_master_attribute_store_remove()
511 mutex_unlock(&md->mutex); in w1_master_attribute_store_remove()
527 static W1_MASTER_ATTR_RO(name, S_IRUGO);
562 return sysfs_create_group(&master->dev.kobj, &w1_master_defattr_group); in w1_create_master_attributes()
567 sysfs_remove_group(&master->dev.kobj, &w1_master_defattr_group); in w1_destroy_master_attributes()
574 const char *event_owner, *name; in w1_uevent() local
577 if (dev->driver == &w1_master_driver) { in w1_uevent()
580 name = md->name; in w1_uevent()
581 } else if (dev->driver == &w1_slave_driver) { in w1_uevent()
584 name = sl->name; in w1_uevent()
587 return -EINVAL; in w1_uevent()
591 event_owner, name, dev_name(dev)); in w1_uevent()
593 if (dev->driver != &w1_slave_driver || !sl) in w1_uevent()
596 err = add_uevent_var(env, "W1_FID=%02X", sl->reg_num.family); in w1_uevent()
601 (unsigned long long)sl->reg_num.id); in w1_uevent()
611 fops = sl->family->fops; in w1_family_notify()
618 /* if the family driver needs to initialize something... */ in w1_family_notify()
619 if (fops->add_slave) { in w1_family_notify()
620 err = fops->add_slave(sl); in w1_family_notify()
622 dev_err(&sl->dev, in w1_family_notify()
628 if (fops->groups) { in w1_family_notify()
629 err = sysfs_create_groups(&sl->dev.kobj, fops->groups); in w1_family_notify()
631 dev_err(&sl->dev, in w1_family_notify()
637 if (IS_REACHABLE(CONFIG_HWMON) && fops->chip_info) { in w1_family_notify()
639 = hwmon_device_register_with_info(&sl->dev, in w1_family_notify()
641 fops->chip_info, in w1_family_notify()
644 dev_warn(&sl->dev, in w1_family_notify()
647 sl->hwmon = hwmon; in w1_family_notify()
652 if (IS_REACHABLE(CONFIG_HWMON) && fops->chip_info && in w1_family_notify()
653 sl->hwmon) in w1_family_notify()
654 hwmon_device_unregister(sl->hwmon); in w1_family_notify()
655 if (fops->remove_slave) in w1_family_notify()
656 sl->family->fops->remove_slave(sl); in w1_family_notify()
657 if (fops->groups) in w1_family_notify()
658 sysfs_remove_groups(&sl->dev.kobj, fops->groups); in w1_family_notify()
668 sl->dev.parent = &sl->master->dev; in __w1_attach_slave_device()
669 sl->dev.driver = &w1_slave_driver; in __w1_attach_slave_device()
670 sl->dev.bus = &w1_bus_type; in __w1_attach_slave_device()
671 sl->dev.release = &w1_slave_release; in __w1_attach_slave_device()
672 sl->dev.groups = w1_slave_groups; in __w1_attach_slave_device()
673 sl->dev.of_node = of_find_matching_node(sl->master->dev.of_node, in __w1_attach_slave_device()
674 sl->family->of_match_table); in __w1_attach_slave_device()
676 dev_set_name(&sl->dev, "%02x-%012llx", in __w1_attach_slave_device()
677 (unsigned int) sl->reg_num.family, in __w1_attach_slave_device()
678 (unsigned long long) sl->reg_num.id); in __w1_attach_slave_device()
679 snprintf(&sl->name[0], sizeof(sl->name), in __w1_attach_slave_device()
680 "%02x-%012llx", in __w1_attach_slave_device()
681 (unsigned int) sl->reg_num.family, in __w1_attach_slave_device()
682 (unsigned long long) sl->reg_num.id); in __w1_attach_slave_device()
684 dev_dbg(&sl->dev, "%s: registering %s as %p.\n", __func__, in __w1_attach_slave_device()
685 dev_name(&sl->dev), sl); in __w1_attach_slave_device()
688 dev_set_uevent_suppress(&sl->dev, true); in __w1_attach_slave_device()
690 err = device_register(&sl->dev); in __w1_attach_slave_device()
692 dev_err(&sl->dev, in __w1_attach_slave_device()
694 dev_name(&sl->dev), err); in __w1_attach_slave_device()
695 of_node_put(sl->dev.of_node); in __w1_attach_slave_device()
696 put_device(&sl->dev); in __w1_attach_slave_device()
701 dev_set_uevent_suppress(&sl->dev, false); in __w1_attach_slave_device()
702 kobject_uevent(&sl->dev.kobj, KOBJ_ADD); in __w1_attach_slave_device()
704 mutex_lock(&sl->master->list_mutex); in __w1_attach_slave_device()
705 list_add_tail(&sl->w1_slave_entry, &sl->master->slist); in __w1_attach_slave_device()
706 mutex_unlock(&sl->master->list_mutex); in __w1_attach_slave_device()
720 dev_err(&dev->dev, in w1_attach_slave_device()
723 return -ENOMEM; in w1_attach_slave_device()
727 sl->owner = THIS_MODULE; in w1_attach_slave_device()
728 sl->master = dev; in w1_attach_slave_device()
729 set_bit(W1_SLAVE_ACTIVE, &sl->flags); in w1_attach_slave_device()
732 memcpy(&sl->reg_num, rn, sizeof(sl->reg_num)); in w1_attach_slave_device()
733 atomic_set(&sl->refcnt, 1); in w1_attach_slave_device()
734 atomic_inc(&sl->master->refcnt); in w1_attach_slave_device()
735 dev->slave_count++; in w1_attach_slave_device()
736 dev_info(&dev->dev, "Attaching one wire slave %02x.%012llx crc %02x\n", in w1_attach_slave_device()
737 rn->family, (unsigned long long)rn->id, rn->crc); in w1_attach_slave_device()
740 mutex_unlock(&dev->mutex); in w1_attach_slave_device()
741 request_module("w1-family-0x%02X", rn->family); in w1_attach_slave_device()
742 mutex_lock(&dev->mutex); in w1_attach_slave_device()
745 f = w1_family_registered(rn->family); in w1_attach_slave_device()
748 dev_info(&dev->dev, "Family %x for %02x.%012llx.%02x is not registered.\n", in w1_attach_slave_device()
749 rn->family, rn->family, in w1_attach_slave_device()
750 (unsigned long long)rn->id, rn->crc); in w1_attach_slave_device()
755 sl->family = f; in w1_attach_slave_device()
759 dev_err(&dev->dev, "%s: Attaching %s failed.\n", __func__, in w1_attach_slave_device()
760 sl->name); in w1_attach_slave_device()
761 dev->slave_count--; in w1_attach_slave_device()
762 w1_family_put(sl->family); in w1_attach_slave_device()
763 atomic_dec(&sl->master->refcnt); in w1_attach_slave_device()
768 sl->ttl = dev->slave_ttl; in w1_attach_slave_device()
779 struct w1_master *dev = sl->master; in w1_unref_slave()
781 mutex_lock(&dev->list_mutex); in w1_unref_slave()
782 refcnt = atomic_sub_return(1, &sl->refcnt); in w1_unref_slave()
786 dev_dbg(&sl->dev, "%s: detaching %s [%p].\n", __func__, in w1_unref_slave()
787 sl->name, sl); in w1_unref_slave()
789 list_del(&sl->w1_slave_entry); in w1_unref_slave()
792 memcpy(msg.id.id, &sl->reg_num, sizeof(msg.id)); in w1_unref_slave()
794 w1_netlink_send(sl->master, &msg); in w1_unref_slave()
797 device_unregister(&sl->dev); in w1_unref_slave()
803 atomic_dec(&dev->refcnt); in w1_unref_slave()
804 mutex_unlock(&dev->list_mutex); in w1_unref_slave()
812 mutex_lock(&sl->master->list_mutex); in w1_slave_detach()
813 destroy_now = !test_bit(W1_SLAVE_DETACH, &sl->flags); in w1_slave_detach()
814 set_bit(W1_SLAVE_DETACH, &sl->flags); in w1_slave_detach()
815 mutex_unlock(&sl->master->list_mutex); in w1_slave_detach()
819 return destroy_now ? 0 : -EBUSY; in w1_slave_detach()
828 if (iter->id == id) { in w1_search_master_id()
830 atomic_inc(&iter->refcnt); in w1_search_master_id()
846 mutex_lock(&dev->list_mutex); in w1_search_slave()
847 list_for_each_entry(iter, &dev->slist, w1_slave_entry) { in w1_search_slave()
848 if (iter->reg_num.family == id->family && in w1_search_slave()
849 iter->reg_num.id == id->id && in w1_search_slave()
850 iter->reg_num.crc == id->crc) { in w1_search_slave()
852 atomic_inc(&dev->refcnt); in w1_search_slave()
853 atomic_inc(&iter->refcnt); in w1_search_slave()
857 mutex_unlock(&dev->list_mutex); in w1_search_slave()
874 dev_dbg(&dev->dev, "Reconnecting slaves in device %s " in w1_reconnect_slaves()
875 "for family %02x.\n", dev->name, f->fid); in w1_reconnect_slaves()
876 mutex_lock(&dev->mutex); in w1_reconnect_slaves()
877 mutex_lock(&dev->list_mutex); in w1_reconnect_slaves()
878 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { in w1_reconnect_slaves()
879 /* If it is a new family, slaves with the default in w1_reconnect_slaves()
880 * family driver and are that family will be in w1_reconnect_slaves()
881 * connected. If the family is going away, devices in w1_reconnect_slaves()
882 * matching that family are reconneced. in w1_reconnect_slaves()
884 if ((attach && sl->family->fid == W1_FAMILY_DEFAULT in w1_reconnect_slaves()
885 && sl->reg_num.family == f->fid) || in w1_reconnect_slaves()
886 (!attach && sl->family->fid == f->fid)) { in w1_reconnect_slaves()
889 mutex_unlock(&dev->list_mutex); in w1_reconnect_slaves()
890 memcpy(&rn, &sl->reg_num, sizeof(rn)); in w1_reconnect_slaves()
896 mutex_lock(&dev->list_mutex); in w1_reconnect_slaves()
899 dev_dbg(&dev->dev, "Reconnecting slaves in device %s " in w1_reconnect_slaves()
900 "has been finished.\n", dev->name); in w1_reconnect_slaves()
901 mutex_unlock(&dev->list_mutex); in w1_reconnect_slaves()
902 mutex_unlock(&dev->mutex); in w1_reconnect_slaves()
921 * (char*)&rn_le = { family, addr_lsb, ..., addr_msb, crc }. in w1_addr_crc_is_valid()
923 if (crc != tmp->crc && tmp->family == W1_FAMILY_DS28E04) { in w1_addr_crc_is_valid()
929 dev_info(&dev->dev, "DS28E04 crc workaround on %02x.%012llx.%02x\n", in w1_addr_crc_is_valid()
930 tmp->family, (unsigned long long)tmp->id, tmp->crc); in w1_addr_crc_is_valid()
933 if (crc != tmp->crc) { in w1_addr_crc_is_valid()
934 dev_dbg(&dev->dev, "w1 addr crc mismatch: %02x.%012llx.%02x != 0x%02x.\n", in w1_addr_crc_is_valid()
935 tmp->family, (unsigned long long)tmp->id, tmp->crc, crc); in w1_addr_crc_is_valid()
946 atomic_inc(&dev->refcnt); in w1_slave_found()
952 set_bit(W1_SLAVE_ACTIVE, &sl->flags); in w1_slave_found()
958 atomic_dec(&dev->refcnt); in w1_slave_found()
962 * w1_search() - Performs a ROM Search & registers any devices found.
968 * The 1-wire search is a simple binary tree search.
975 * See "Application note 187 1-wire search algorithm" at www.maxim-ic.com
987 rn = dev->search_id; in w1_search()
990 last_zero = -1; in w1_search()
994 while ( !last_device && (slave_count++ < dev->max_slave_count) ) { in w1_search()
999 * Reset bus and all 1-wire device state machines in w1_search()
1002 * Return 0 - device(s) present, 1 - no devices present. in w1_search()
1004 mutex_lock(&dev->bus_mutex); in w1_search()
1006 mutex_unlock(&dev->bus_mutex); in w1_search()
1007 dev_dbg(&dev->dev, "No devices present on the wire.\n"); in w1_search()
1012 if (dev->max_slave_count == 1) { in w1_search()
1016 mutex_unlock(&dev->bus_mutex); in w1_search()
1050 if (test_bit(W1_ABORT_SEARCH, &dev->flags)) { in w1_search()
1051 mutex_unlock(&dev->bus_mutex); in w1_search()
1052 dev_dbg(&dev->dev, "Abort w1_search\n"); in w1_search()
1056 mutex_unlock(&dev->bus_mutex); in w1_search()
1061 dev->search_id = 0; in w1_search()
1063 dev->search_id = rn; in w1_search()
1069 if (!last_device && slave_count == dev->max_slave_count && in w1_search()
1070 !test_bit(W1_WARN_MAX_COUNT, &dev->flags)) { in w1_search()
1078 dev_info(&dev->dev, "%s: max_slave_count %d reached, " in w1_search()
1080 dev->max_slave_count); in w1_search()
1081 set_bit(W1_WARN_MAX_COUNT, &dev->flags); in w1_search()
1091 mutex_lock(&dev->list_mutex); in w1_search_process_cb()
1092 list_for_each_entry(sl, &dev->slist, w1_slave_entry) in w1_search_process_cb()
1093 clear_bit(W1_SLAVE_ACTIVE, &sl->flags); in w1_search_process_cb()
1094 mutex_unlock(&dev->list_mutex); in w1_search_process_cb()
1098 mutex_lock(&dev->list_mutex); in w1_search_process_cb()
1099 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { in w1_search_process_cb()
1100 if (!test_bit(W1_SLAVE_ACTIVE, &sl->flags) && !--sl->ttl) { in w1_search_process_cb()
1101 mutex_unlock(&dev->list_mutex); in w1_search_process_cb()
1103 mutex_lock(&dev->list_mutex); in w1_search_process_cb()
1105 else if (test_bit(W1_SLAVE_ACTIVE, &sl->flags)) in w1_search_process_cb()
1106 sl->ttl = dev->slave_ttl; in w1_search_process_cb()
1108 mutex_unlock(&dev->list_mutex); in w1_search_process_cb()
1110 if (dev->search_count > 0) in w1_search_process_cb()
1111 dev->search_count--; in w1_search_process_cb()
1120 * w1_process_callbacks() - execute each dev->async_list callback entry
1133 while (!list_empty(&dev->async_list)) { in w1_process_callbacks()
1134 list_for_each_entry_safe(async_cmd, async_n, &dev->async_list, in w1_process_callbacks()
1138 mutex_unlock(&dev->list_mutex); in w1_process_callbacks()
1139 async_cmd->cb(dev, async_cmd); in w1_process_callbacks()
1141 mutex_lock(&dev->list_mutex); in w1_process_callbacks()
1158 atomic_inc(&dev->refcnt); in w1_process()
1162 if (!jremain && dev->search_count) { in w1_process()
1163 mutex_lock(&dev->mutex); in w1_process()
1165 mutex_unlock(&dev->mutex); in w1_process()
1168 mutex_lock(&dev->list_mutex); in w1_process()
1185 mutex_unlock(&dev->list_mutex); in w1_process()
1193 if (dev->search_count) { in w1_process()
1202 atomic_dec(&dev->refcnt); in w1_process()
1211 pr_info("Driver for 1-wire Dallas network protocol.\n"); in w1_init()
1272 MODULE_DESCRIPTION("Driver for 1-wire Dallas network protocol.");