• Home
  • Raw
  • Download

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>
40 * on a static 1-wire bus. Memory is not allocated based on this number, just
66 return -ENODEV; in w1_master_probe()
73 dev_dbg(dev, "%s: Releasing %s.\n", __func__, md->name); in w1_master_release()
82 dev_dbg(dev, "%s: Releasing %s [%p]\n", __func__, sl->name, sl); in w1_slave_release()
84 w1_family_put(sl->family); in w1_slave_release()
85 sl->master->slave_count--; in w1_slave_release()
92 return sprintf(buf, "%s\n", sl->name); in name_show()
94 static DEVICE_ATTR_RO(name);
100 ssize_t count = sizeof(sl->reg_num); in id_show()
102 memcpy(buf, (u8 *)&sl->reg_num, count); in id_show()
114 /* Default family */
122 mutex_lock(&sl->master->mutex); in rw_write()
128 w1_write_block(sl->master, buf, count); in rw_write()
131 mutex_unlock(&sl->master->mutex); in rw_write()
141 mutex_lock(&sl->master->mutex); in rw_read()
142 w1_read_block(sl->master, buf, count); in rw_read()
143 mutex_unlock(&sl->master->mutex); in rw_read()
174 .name = "w1",
180 .name = "w1_master_driver",
194 .name = "w1_slave_driver",
213 mutex_lock(&md->mutex); in w1_master_attribute_show_name()
214 count = sprintf(buf, "%s\n", md->name); in w1_master_attribute_show_name()
215 mutex_unlock(&md->mutex); in w1_master_attribute_show_name()
232 mutex_lock(&md->mutex); in w1_master_attribute_store_search()
233 md->search_count = tmp; in w1_master_attribute_store_search()
234 mutex_unlock(&md->mutex); in w1_master_attribute_store_search()
237 wake_up_process(md->thread); in w1_master_attribute_store_search()
249 mutex_lock(&md->mutex); in w1_master_attribute_show_search()
250 count = sprintf(buf, "%d\n", md->search_count); in w1_master_attribute_show_search()
251 mutex_unlock(&md->mutex); in w1_master_attribute_show_search()
268 mutex_lock(&md->mutex); in w1_master_attribute_store_pullup()
269 md->enable_pullup = tmp; in w1_master_attribute_store_pullup()
270 mutex_unlock(&md->mutex); in w1_master_attribute_store_pullup()
282 mutex_lock(&md->mutex); in w1_master_attribute_show_pullup()
283 count = sprintf(buf, "%d\n", md->enable_pullup); in w1_master_attribute_show_pullup()
284 mutex_unlock(&md->mutex); in w1_master_attribute_show_pullup()
294 mutex_lock(&md->mutex); in w1_master_attribute_show_pointer()
295 count = sprintf(buf, "0x%p\n", md->bus_master); in w1_master_attribute_show_pointer()
296 mutex_unlock(&md->mutex); in w1_master_attribute_show_pointer()
322 return -EINVAL; in w1_master_attribute_store_max_slave_count()
324 mutex_lock(&md->mutex); in w1_master_attribute_store_max_slave_count()
325 md->max_slave_count = tmp; in w1_master_attribute_store_max_slave_count()
327 clear_bit(W1_WARN_MAX_COUNT, &md->flags); in w1_master_attribute_store_max_slave_count()
328 mutex_unlock(&md->mutex); in w1_master_attribute_store_max_slave_count()
338 mutex_lock(&md->mutex); in w1_master_attribute_show_max_slave_count()
339 count = sprintf(buf, "%d\n", md->max_slave_count); in w1_master_attribute_show_max_slave_count()
340 mutex_unlock(&md->mutex); in w1_master_attribute_show_max_slave_count()
349 mutex_lock(&md->mutex); in w1_master_attribute_show_attempts()
350 count = sprintf(buf, "%lu\n", md->attempts); in w1_master_attribute_show_attempts()
351 mutex_unlock(&md->mutex); in w1_master_attribute_show_attempts()
360 mutex_lock(&md->mutex); in w1_master_attribute_show_slave_count()
361 count = sprintf(buf, "%d\n", md->slave_count); in w1_master_attribute_show_slave_count()
362 mutex_unlock(&md->mutex); in w1_master_attribute_show_slave_count()
370 int c = PAGE_SIZE; in w1_master_attribute_show_slaves() local
374 mutex_lock(&md->list_mutex); in w1_master_attribute_show_slaves()
376 list_for_each_safe(ent, n, &md->slist) { in w1_master_attribute_show_slaves()
379 c -= snprintf(buf + PAGE_SIZE - c, c, "%s\n", sl->name); in w1_master_attribute_show_slaves()
382 c -= snprintf(buf + PAGE_SIZE - c, c, "not found.\n"); in w1_master_attribute_show_slaves()
384 mutex_unlock(&md->list_mutex); in w1_master_attribute_show_slaves()
386 return PAGE_SIZE - c; in w1_master_attribute_show_slaves()
392 int c = PAGE_SIZE; in w1_master_attribute_show_add() local
393 c -= snprintf(buf+PAGE_SIZE - c, c, in w1_master_attribute_show_add()
394 "write device id xx-xxxxxxxxxxxx to add slave\n"); in w1_master_attribute_show_add()
395 return PAGE_SIZE - c; in w1_master_attribute_show_add()
401 unsigned int family; in w1_atoreg_num() local
412 "ff-dddddddddddd\n"; in w1_atoreg_num()
414 if (buf[2] != '-') { in w1_atoreg_num()
416 return -EINVAL; in w1_atoreg_num()
418 i = sscanf(buf, "%02x-%012llx", &family, &id); in w1_atoreg_num()
421 return -EINVAL; in w1_atoreg_num()
423 rn->family = family; in w1_atoreg_num()
424 rn->id = id; in w1_atoreg_num()
427 rn->crc = w1_calc_crc8((u8 *)&rn64_le, 7); in w1_atoreg_num()
431 rn->family, (unsigned long long)rn->id, rn->crc); in w1_atoreg_num()
444 mutex_lock(&dev->list_mutex); in w1_slave_search_device()
445 list_for_each_entry(sl, &dev->slist, w1_slave_entry) { in w1_slave_search_device()
446 if (sl->reg_num.family == rn->family && in w1_slave_search_device()
447 sl->reg_num.id == rn->id && in w1_slave_search_device()
448 sl->reg_num.crc == rn->crc) { in w1_slave_search_device()
449 mutex_unlock(&dev->list_mutex); in w1_slave_search_device()
453 mutex_unlock(&dev->list_mutex); in w1_slave_search_device()
467 return -EINVAL; in w1_master_attribute_store_add()
469 mutex_lock(&md->mutex); in w1_master_attribute_store_add()
471 /* It would be nice to do a targeted search one the one-wire bus in w1_master_attribute_store_add()
476 dev_info(dev, "Device %s already exists\n", sl->name); in w1_master_attribute_store_add()
477 result = -EINVAL; in w1_master_attribute_store_add()
481 mutex_unlock(&md->mutex); in w1_master_attribute_store_add()
489 int c = PAGE_SIZE; in w1_master_attribute_show_remove() local
490 c -= snprintf(buf+PAGE_SIZE - c, c, in w1_master_attribute_show_remove()
491 "write device id xx-xxxxxxxxxxxx to remove slave\n"); in w1_master_attribute_show_remove()
492 return PAGE_SIZE - c; in w1_master_attribute_show_remove()
505 return -EINVAL; in w1_master_attribute_store_remove()
507 mutex_lock(&md->mutex); in w1_master_attribute_store_remove()
515 dev_info(dev, "Device %02x-%012llx doesn't exists\n", rn.family, in w1_master_attribute_store_remove()
517 result = -EINVAL; in w1_master_attribute_store_remove()
519 mutex_unlock(&md->mutex); in w1_master_attribute_store_remove()
535 static W1_MASTER_ATTR_RO(name, S_IRUGO);
570 return sysfs_create_group(&master->dev.kobj, &w1_master_defattr_group); in w1_create_master_attributes()
575 sysfs_remove_group(&master->dev.kobj, &w1_master_defattr_group); in w1_destroy_master_attributes()
582 char *event_owner, *name; in w1_uevent() local
585 if (dev->driver == &w1_master_driver) { in w1_uevent()
588 name = md->name; in w1_uevent()
589 } else if (dev->driver == &w1_slave_driver) { in w1_uevent()
592 name = sl->name; in w1_uevent()
595 return -EINVAL; in w1_uevent()
599 event_owner, name, dev_name(dev)); in w1_uevent()
601 if (dev->driver != &w1_slave_driver || !sl) in w1_uevent()
604 err = add_uevent_var(env, "W1_FID=%02X", sl->reg_num.family); in w1_uevent()
609 (unsigned long long)sl->reg_num.id); in w1_uevent()
619 fops = sl->family->fops; in w1_family_notify()
626 /* if the family driver needs to initialize something... */ in w1_family_notify()
627 if (fops->add_slave) { in w1_family_notify()
628 err = fops->add_slave(sl); in w1_family_notify()
630 dev_err(&sl->dev, in w1_family_notify()
636 if (fops->groups) { in w1_family_notify()
637 err = sysfs_create_groups(&sl->dev.kobj, fops->groups); in w1_family_notify()
639 dev_err(&sl->dev, in w1_family_notify()
645 if (IS_REACHABLE(CONFIG_HWMON) && fops->chip_info) { in w1_family_notify()
647 = hwmon_device_register_with_info(&sl->dev, in w1_family_notify()
649 fops->chip_info, in w1_family_notify()
652 dev_warn(&sl->dev, in w1_family_notify()
655 sl->hwmon = hwmon; in w1_family_notify()
660 if (IS_REACHABLE(CONFIG_HWMON) && fops->chip_info && in w1_family_notify()
661 sl->hwmon) in w1_family_notify()
662 hwmon_device_unregister(sl->hwmon); in w1_family_notify()
663 if (fops->remove_slave) in w1_family_notify()
664 sl->family->fops->remove_slave(sl); in w1_family_notify()
665 if (fops->groups) in w1_family_notify()
666 sysfs_remove_groups(&sl->dev.kobj, fops->groups); in w1_family_notify()
676 sl->dev.parent = &sl->master->dev; in __w1_attach_slave_device()
677 sl->dev.driver = &w1_slave_driver; in __w1_attach_slave_device()
678 sl->dev.bus = &w1_bus_type; in __w1_attach_slave_device()
679 sl->dev.release = &w1_slave_release; in __w1_attach_slave_device()
680 sl->dev.groups = w1_slave_groups; in __w1_attach_slave_device()
681 sl->dev.of_node = of_find_matching_node(sl->master->dev.of_node, in __w1_attach_slave_device()
682 sl->family->of_match_table); in __w1_attach_slave_device()
684 dev_set_name(&sl->dev, "%02x-%012llx", in __w1_attach_slave_device()
685 (unsigned int) sl->reg_num.family, in __w1_attach_slave_device()
686 (unsigned long long) sl->reg_num.id); in __w1_attach_slave_device()
687 snprintf(&sl->name[0], sizeof(sl->name), in __w1_attach_slave_device()
688 "%02x-%012llx", in __w1_attach_slave_device()
689 (unsigned int) sl->reg_num.family, in __w1_attach_slave_device()
690 (unsigned long long) sl->reg_num.id); in __w1_attach_slave_device()
692 dev_dbg(&sl->dev, "%s: registering %s as %p.\n", __func__, in __w1_attach_slave_device()
693 dev_name(&sl->dev), sl); in __w1_attach_slave_device()
696 dev_set_uevent_suppress(&sl->dev, true); in __w1_attach_slave_device()
698 err = device_register(&sl->dev); in __w1_attach_slave_device()
700 dev_err(&sl->dev, in __w1_attach_slave_device()
702 dev_name(&sl->dev), err); in __w1_attach_slave_device()
703 put_device(&sl->dev); in __w1_attach_slave_device()
708 dev_set_uevent_suppress(&sl->dev, false); in __w1_attach_slave_device()
709 kobject_uevent(&sl->dev.kobj, KOBJ_ADD); in __w1_attach_slave_device()
711 mutex_lock(&sl->master->list_mutex); in __w1_attach_slave_device()
712 list_add_tail(&sl->w1_slave_entry, &sl->master->slist); in __w1_attach_slave_device()
713 mutex_unlock(&sl->master->list_mutex); in __w1_attach_slave_device()
727 dev_err(&dev->dev, in w1_attach_slave_device()
730 return -ENOMEM; in w1_attach_slave_device()
734 sl->owner = THIS_MODULE; in w1_attach_slave_device()
735 sl->master = dev; in w1_attach_slave_device()
736 set_bit(W1_SLAVE_ACTIVE, &sl->flags); in w1_attach_slave_device()
739 memcpy(&sl->reg_num, rn, sizeof(sl->reg_num)); in w1_attach_slave_device()
740 atomic_set(&sl->refcnt, 1); in w1_attach_slave_device()
741 atomic_inc(&sl->master->refcnt); in w1_attach_slave_device()
742 dev->slave_count++; in w1_attach_slave_device()
743 dev_info(&dev->dev, "Attaching one wire slave %02x.%012llx crc %02x\n", in w1_attach_slave_device()
744 rn->family, (unsigned long long)rn->id, rn->crc); in w1_attach_slave_device()
747 mutex_unlock(&dev->mutex); in w1_attach_slave_device()
748 request_module("w1-family-0x%02X", rn->family); in w1_attach_slave_device()
749 mutex_lock(&dev->mutex); in w1_attach_slave_device()
752 f = w1_family_registered(rn->family); in w1_attach_slave_device()
755 dev_info(&dev->dev, "Family %x for %02x.%012llx.%02x is not registered.\n", in w1_attach_slave_device()
756 rn->family, rn->family, in w1_attach_slave_device()
757 (unsigned long long)rn->id, rn->crc); in w1_attach_slave_device()
762 sl->family = f; in w1_attach_slave_device()
766 dev_err(&dev->dev, "%s: Attaching %s failed.\n", __func__, in w1_attach_slave_device()
767 sl->name); in w1_attach_slave_device()
768 dev->slave_count--; in w1_attach_slave_device()
769 w1_family_put(sl->family); in w1_attach_slave_device()
770 atomic_dec(&sl->master->refcnt); in w1_attach_slave_device()
775 sl->ttl = dev->slave_ttl; in w1_attach_slave_device()
786 struct w1_master *dev = sl->master; in w1_unref_slave()
788 mutex_lock(&dev->list_mutex); in w1_unref_slave()
789 refcnt = atomic_sub_return(1, &sl->refcnt); in w1_unref_slave()
793 dev_dbg(&sl->dev, "%s: detaching %s [%p].\n", __func__, in w1_unref_slave()
794 sl->name, sl); in w1_unref_slave()
796 list_del(&sl->w1_slave_entry); in w1_unref_slave()
799 memcpy(msg.id.id, &sl->reg_num, sizeof(msg.id)); in w1_unref_slave()
801 w1_netlink_send(sl->master, &msg); in w1_unref_slave()
804 device_unregister(&sl->dev); in w1_unref_slave()
810 atomic_dec(&dev->refcnt); in w1_unref_slave()
811 mutex_unlock(&dev->list_mutex); in w1_unref_slave()
819 mutex_lock(&sl->master->list_mutex); in w1_slave_detach()
820 destroy_now = !test_bit(W1_SLAVE_DETACH, &sl->flags); in w1_slave_detach()
821 set_bit(W1_SLAVE_DETACH, &sl->flags); in w1_slave_detach()
822 mutex_unlock(&sl->master->list_mutex); in w1_slave_detach()
826 return destroy_now ? 0 : -EBUSY; in w1_slave_detach()
836 if (dev->id == id) { in w1_search_master_id()
838 atomic_inc(&dev->refcnt); in w1_search_master_id()
855 mutex_lock(&dev->list_mutex); in w1_search_slave()
856 list_for_each_entry(sl, &dev->slist, w1_slave_entry) { in w1_search_slave()
857 if (sl->reg_num.family == id->family && in w1_search_slave()
858 sl->reg_num.id == id->id && in w1_search_slave()
859 sl->reg_num.crc == id->crc) { in w1_search_slave()
861 atomic_inc(&dev->refcnt); in w1_search_slave()
862 atomic_inc(&sl->refcnt); in w1_search_slave()
866 mutex_unlock(&dev->list_mutex); in w1_search_slave()
883 dev_dbg(&dev->dev, "Reconnecting slaves in device %s " in w1_reconnect_slaves()
884 "for family %02x.\n", dev->name, f->fid); in w1_reconnect_slaves()
885 mutex_lock(&dev->mutex); in w1_reconnect_slaves()
886 mutex_lock(&dev->list_mutex); in w1_reconnect_slaves()
887 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { in w1_reconnect_slaves()
888 /* If it is a new family, slaves with the default in w1_reconnect_slaves()
889 * family driver and are that family will be in w1_reconnect_slaves()
890 * connected. If the family is going away, devices in w1_reconnect_slaves()
891 * matching that family are reconneced. in w1_reconnect_slaves()
893 if ((attach && sl->family->fid == W1_FAMILY_DEFAULT in w1_reconnect_slaves()
894 && sl->reg_num.family == f->fid) || in w1_reconnect_slaves()
895 (!attach && sl->family->fid == f->fid)) { in w1_reconnect_slaves()
898 mutex_unlock(&dev->list_mutex); in w1_reconnect_slaves()
899 memcpy(&rn, &sl->reg_num, sizeof(rn)); in w1_reconnect_slaves()
905 mutex_lock(&dev->list_mutex); in w1_reconnect_slaves()
908 dev_dbg(&dev->dev, "Reconnecting slaves in device %s " in w1_reconnect_slaves()
909 "has been finished.\n", dev->name); in w1_reconnect_slaves()
910 mutex_unlock(&dev->list_mutex); in w1_reconnect_slaves()
911 mutex_unlock(&dev->mutex); in w1_reconnect_slaves()
922 atomic_inc(&dev->refcnt); in w1_slave_found()
928 set_bit(W1_SLAVE_ACTIVE, &sl->flags); in w1_slave_found()
930 if (rn && tmp->crc == w1_calc_crc8((u8 *)&rn_le, 7)) in w1_slave_found()
934 atomic_dec(&dev->refcnt); in w1_slave_found()
938 * w1_search() - Performs a ROM Search & registers any devices found.
944 * The 1-wire search is a simple binary tree search.
951 * See "Application note 187 1-wire search algorithm" at www.maxim-ic.com
963 rn = dev->search_id; in w1_search()
966 last_zero = -1; in w1_search()
970 while ( !last_device && (slave_count++ < dev->max_slave_count) ) { in w1_search()
975 * Reset bus and all 1-wire device state machines in w1_search()
978 * Return 0 - device(s) present, 1 - no devices present. in w1_search()
980 mutex_lock(&dev->bus_mutex); in w1_search()
982 mutex_unlock(&dev->bus_mutex); in w1_search()
983 dev_dbg(&dev->dev, "No devices present on the wire.\n"); in w1_search()
988 if (dev->max_slave_count == 1) { in w1_search()
992 mutex_unlock(&dev->bus_mutex); in w1_search()
1026 if (test_bit(W1_ABORT_SEARCH, &dev->flags)) { in w1_search()
1027 mutex_unlock(&dev->bus_mutex); in w1_search()
1028 dev_dbg(&dev->dev, "Abort w1_search\n"); in w1_search()
1032 mutex_unlock(&dev->bus_mutex); in w1_search()
1037 dev->search_id = 0; in w1_search()
1039 dev->search_id = rn; in w1_search()
1045 if (!last_device && slave_count == dev->max_slave_count && in w1_search()
1046 !test_bit(W1_WARN_MAX_COUNT, &dev->flags)) { in w1_search()
1054 dev_info(&dev->dev, "%s: max_slave_count %d reached, " in w1_search()
1056 dev->max_slave_count); in w1_search()
1057 set_bit(W1_WARN_MAX_COUNT, &dev->flags); in w1_search()
1067 mutex_lock(&dev->list_mutex); in w1_search_process_cb()
1068 list_for_each_entry(sl, &dev->slist, w1_slave_entry) in w1_search_process_cb()
1069 clear_bit(W1_SLAVE_ACTIVE, &sl->flags); in w1_search_process_cb()
1070 mutex_unlock(&dev->list_mutex); in w1_search_process_cb()
1074 mutex_lock(&dev->list_mutex); in w1_search_process_cb()
1075 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { in w1_search_process_cb()
1076 if (!test_bit(W1_SLAVE_ACTIVE, &sl->flags) && !--sl->ttl) { in w1_search_process_cb()
1077 mutex_unlock(&dev->list_mutex); in w1_search_process_cb()
1079 mutex_lock(&dev->list_mutex); in w1_search_process_cb()
1081 else if (test_bit(W1_SLAVE_ACTIVE, &sl->flags)) in w1_search_process_cb()
1082 sl->ttl = dev->slave_ttl; in w1_search_process_cb()
1084 mutex_unlock(&dev->list_mutex); in w1_search_process_cb()
1086 if (dev->search_count > 0) in w1_search_process_cb()
1087 dev->search_count--; in w1_search_process_cb()
1096 * w1_process_callbacks() - execute each dev->async_list callback entry
1109 while (!list_empty(&dev->async_list)) { in w1_process_callbacks()
1110 list_for_each_entry_safe(async_cmd, async_n, &dev->async_list, in w1_process_callbacks()
1114 mutex_unlock(&dev->list_mutex); in w1_process_callbacks()
1115 async_cmd->cb(dev, async_cmd); in w1_process_callbacks()
1117 mutex_lock(&dev->list_mutex); in w1_process_callbacks()
1134 atomic_inc(&dev->refcnt); in w1_process()
1138 if (!jremain && dev->search_count) { in w1_process()
1139 mutex_lock(&dev->mutex); in w1_process()
1141 mutex_unlock(&dev->mutex); in w1_process()
1144 mutex_lock(&dev->list_mutex); in w1_process()
1161 mutex_unlock(&dev->list_mutex); in w1_process()
1169 if (dev->search_count) { in w1_process()
1178 atomic_dec(&dev->refcnt); in w1_process()
1187 pr_info("Driver for 1-wire Dallas network protocol.\n"); in w1_init()
1248 MODULE_DESCRIPTION("Driver for 1-wire Dallas network protocol.");