/* * Add entries in sysfs onto the existing network class device * for the bridge. * Adds a attribute group "bridge" containing tuning parameters. * Sub directory to hold links to interfaces. * * Note: the ifobj exists only to be a subdirectory * to hold links. The ifobj exists in the same data structure * as its parent the bridge so reference counting works. */ int ovs_dp_sysfs_add_dp(struct datapath *dp) { struct vport *vport = ovs_vport_rtnl(dp, OVSP_LOCAL); struct kobject *kobj = vport->ops->get_kobj(vport); int err; #ifdef CONFIG_NET_NS /* Due to bug in 2.6.32 kernel, sysfs_create_group() could panic * in other namespace than init_net. Following check is to avoid it. */ if (!kobj->sd) return -ENOENT; #endif /* Create /sys/class/net/<devname>/bridge directory. */ err = sysfs_create_group(kobj, &bridge_group); if (err) { pr_info("%s: can't create group %s/%s\n", __func__, ovs_dp_name(dp), bridge_group.name); goto out1; } /* Create /sys/class/net/<devname>/brif directory. */ err = kobject_add(&dp->ifobj, kobj, SYSFS_BRIDGE_PORT_SUBDIR); if (err) { pr_info("%s: can't add kobject (directory) %s/%s\n", __func__, ovs_dp_name(dp), kobject_name(&dp->ifobj)); goto out2; } kobject_uevent(&dp->ifobj, KOBJ_ADD); return 0; out2: sysfs_remove_group(kobj, &bridge_group); out1: return err; }
/** * ir_register_class() - creates the sysfs for /sys/class/irrcv/irrcv? * @input_dev: the struct input_dev descriptor of the device * * This routine is used to register the syfs code for IR class */ int ir_register_class(struct input_dev *input_dev) { int rc; struct kobject *kobj; struct ir_input_dev *ir_dev = input_get_drvdata(input_dev); int devno = find_first_zero_bit(&ir_core_dev_number, IRRCV_NUM_DEVICES); if (unlikely(devno < 0)) return devno; ir_dev->attr.attrs = ir_dev_attrs; ir_dev->class_dev = device_create(ir_input_class, NULL, input_dev->dev.devt, ir_dev, "irrcv%d", devno); kobj = &ir_dev->class_dev->kobj; printk(KERN_WARNING "Creating IR device %s\n", kobject_name(kobj)); rc = sysfs_create_group(kobj, &ir_dev->attr); if (unlikely(rc < 0)) { device_destroy(ir_input_class, input_dev->dev.devt); return -ENOMEM; } ir_dev->devno = devno; set_bit(devno, &ir_core_dev_number); return 0; };
static void driver_release(struct kobject *kobj) { struct driver_private *drv_priv = to_driver(kobj); pr_debug("driver: '%s': %s\n", kobject_name(kobj), __func__); kfree(drv_priv); }
/* register memory section under specified node if it spans that node */ int register_mem_sect_under_node(struct memory_block *mem_blk, int nid) { unsigned long pfn, sect_start_pfn, sect_end_pfn; if (!mem_blk) return -EFAULT; if (!node_online(nid)) return 0; sect_start_pfn = section_nr_to_pfn(mem_blk->phys_index); sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1; for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) { int page_nid; page_nid = get_nid_for_pfn(pfn); if (page_nid < 0) continue; if (page_nid != nid) continue; return sysfs_create_link_nowarn(&node_devices[nid].sysdev.kobj, &mem_blk->sysdev.kobj, kobject_name(&mem_blk->sysdev.kobj)); } /* mem section does not span the specified node */ return 0; }
int hci_register_sysfs(struct hci_dev *hdev) { struct device *dev = &hdev->dev; unsigned int i; int err; BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type); dev->bus = &bt_bus; dev->parent = hdev->parent; strlcpy(dev->bus_id, hdev->name, BUS_ID_SIZE); dev->release = bt_release; dev_set_drvdata(dev, hdev); err = device_register(dev); if (err < 0) return err; for (i = 0; bt_attrs[i]; i++) if (device_create_file(dev, bt_attrs[i]) < 0) BT_ERR("Failed to create device attribute"); if (sysfs_create_link(&bt_class->subsys.kobj, &dev->kobj, kobject_name(&dev->kobj)) < 0) BT_ERR("Failed to create class symlink"); return 0; }
int sysfs_add_file_mode_ns(struct kernfs_node *parent, const struct attribute *attr, bool is_bin, umode_t mode, const void *ns) { struct lock_class_key *key = NULL; const struct kernfs_ops *ops; struct kernfs_node *kn; loff_t size; if (!is_bin) { struct kobject *kobj = parent->priv; const struct sysfs_ops *sysfs_ops = kobj->ktype->sysfs_ops; /* every kobject with an attribute needs a ktype assigned */ if (WARN(!sysfs_ops, KERN_ERR "missing sysfs attribute operations for kobject: %s\n", kobject_name(kobj))) return -EINVAL; if (sysfs_ops->show && sysfs_ops->store) ops = &sysfs_file_kfops_rw; else if (sysfs_ops->show) ops = &sysfs_file_kfops_ro; else if (sysfs_ops->store) ops = &sysfs_file_kfops_wo; else ops = &sysfs_file_kfops_empty; size = PAGE_SIZE; } else { struct bin_attribute *battr = (void *)attr; if (battr->mmap) ops = &sysfs_bin_kfops_mmap; else if (battr->read && battr->write) ops = &sysfs_bin_kfops_rw; else if (battr->read) ops = &sysfs_bin_kfops_ro; else if (battr->write) ops = &sysfs_bin_kfops_wo; else ops = &sysfs_file_kfops_empty; size = battr->size; } #ifdef CONFIG_DEBUG_LOCK_ALLOC if (!attr->ignore_lockdep) key = attr->key ?: (struct lock_class_key *)&attr->skey; #endif kn = __kernfs_create_file(parent, attr->name, mode, size, ops, (void *)attr, ns, true, key); if (IS_ERR(kn)) { if (PTR_ERR(kn) == -EEXIST) sysfs_warn_dup(parent, attr->name); return PTR_ERR(kn); } return 0; }
void mipi_dsi_panel_create_debugfs(struct msm_fb_data_type *mfd) { struct device *dev; struct dentry *root; struct mdss_panel_data *pdata; struct platform_device *pdev; pdata = dev_get_platdata(&mfd->pdev->dev); if (!pdata) { pr_err("%s: no panel connected\n", __func__); return; } pdev = pdata->panel_pdev; if (!pdev) { pr_err("%s: no device\n", __func__); return; } dev = &pdev->dev; if (!&dev->kobj) { pr_err("%s: no &dev->kobj\n", __func__); return; } mdss_dsi_buf_alloc(&debug_tx_buf, ALIGN(DSI_BUF_SIZE, SZ_4K)); mdss_dsi_buf_alloc(&debug_rx_buf, ALIGN(DSI_BUF_SIZE, SZ_4K)); dev_info(dev, "%s: create folder %s\n", __func__, kobject_name(&dev->kobj)); root = debugfs_create_dir("mdss_dsi_panel", 0); if (!root) { dev_err(dev, "%s: dbgfs create dir failed\n", __func__); } else { if (!debugfs_create_file("read", S_IWUSR, root, mfd, &read_fops)) { dev_err(dev, "%s: failed to create dbgfs read file\n", __func__); return; } if (!debugfs_create_file("write", S_IWUSR, root, mfd, &write_fops)) { dev_err(dev, "%s: failed to create dbgfs write file\n", __func__); return; } if (!debugfs_create_file("result", S_IRUGO, root, mfd, &result_fops)) { dev_err(dev, "%s: failed to create dbgfs result file\n", __func__); return; } } }
void edac_device_unregister_sysfs_main_kobj(struct edac_device_ctl_info *dev) { debugf0("%s()\n", __func__); debugf4("%s() name of kobject is: %s\n", __func__, kobject_name(&dev->kobj)); kobject_put(&dev->kobj); edac_put_sysfs_subsys(); }
int unregister_cpu_under_node(unsigned int cpu, unsigned int nid) { struct device *obj; if (!node_online(nid)) return 0; obj = get_cpu_device(cpu); if (!obj) return 0; sysfs_remove_link(&node_devices[nid]->dev.kobj, kobject_name(&obj->kobj)); sysfs_remove_link(&obj->kobj, kobject_name(&node_devices[nid]->dev.kobj)); return 0; }
void hci_unregister_sysfs(struct hci_dev *hdev) { BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type); sysfs_remove_link(&bt_class->subsys.kobj, kobject_name(&hdev->dev.kobj)); device_del(&hdev->dev); }
static void driver_sysfs_remove(struct device *dev) { struct device_driver *drv = dev->driver; if (drv) { sysfs_remove_link(&drv->p->kobj, kobject_name(&dev->kobj)); sysfs_remove_link(&dev->kobj, "driver"); } }
void obj_release(struct kobject *kobj) { struct my_kobj *obj = container_of(kobj, struct my_kobj, kobj); printk("obj release %s\n",kobject_name(&obj->kobj)); kfree(obj); }
/* register memory section under specified node if it spans that node */ int register_mem_sect_under_node(struct memory_block *mem_blk, int nid) { int ret; unsigned long pfn, sect_start_pfn, sect_end_pfn; if (!mem_blk) return -EFAULT; if (!node_online(nid)) return 0; sect_start_pfn = section_nr_to_pfn(mem_blk->start_section_nr); sect_end_pfn = section_nr_to_pfn(mem_blk->end_section_nr); sect_end_pfn += PAGES_PER_SECTION - 1; for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) { int page_nid; /* * memory block could have several absent sections from start. * skip pfn range from absent section */ if (!pfn_present(pfn)) { pfn = round_down(pfn + PAGES_PER_SECTION, PAGES_PER_SECTION) - 1; continue; } page_nid = get_nid_for_pfn(pfn); if (page_nid < 0) continue; if (page_nid != nid) continue; ret = sysfs_create_link_nowarn(&node_devices[nid]->dev.kobj, &mem_blk->dev.kobj, kobject_name(&mem_blk->dev.kobj)); if (ret) return ret; return sysfs_create_link_nowarn(&mem_blk->dev.kobj, &node_devices[nid]->dev.kobj, kobject_name(&node_devices[nid]->dev.kobj)); } /* mem section does not span the specified node */ return 0; }
int unregister_cpu_under_node(unsigned int cpu, unsigned int nid) { if (node_online(nid)) { struct sys_device *obj = get_cpu_sysdev(cpu); if (obj) sysfs_remove_link(&node_devices[nid].sysdev.kobj, kobject_name(&obj->kobj)); } return 0; }
static int driver_sysfs_add(struct device *dev) { int ret; if (dev->bus) blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_BIND_DRIVER, dev); ret = sysfs_create_link(&dev->driver->p->kobj, &dev->kobj, kobject_name(&dev->kobj)); if (ret == 0) { ret = sysfs_create_link(&dev->kobj, &dev->driver->p->kobj, "driver"); if (ret) sysfs_remove_link(&dev->driver->p->kobj, kobject_name(&dev->kobj)); } return ret; }
static int object_path_length(struct kobject * kobj) { struct kobject * p = kobj; int length = 1; do { length += strlen(kobject_name(p)) + 1; p = p->parent; } while (p); return length; }
/** * device_pm_remove - Remove a device from the PM core's list of active devices. * @dev: Device to be removed from the list. */ void device_pm_remove(struct device *dev) { pr_debug("PM: Removing info for %s:%s\n", dev->bus ? dev->bus->name : "No Bus", kobject_name(&dev->kobj)); complete_all(&dev->power.completion); mutex_lock(&dpm_list_mtx); list_del_init(&dev->power.entry); mutex_unlock(&dpm_list_mtx); pm_runtime_remove(dev); }
void unregister_cpu(struct cpu *cpu, struct node *root) { if (root) sysfs_remove_link(&root->sysdev.kobj, kobject_name(&cpu->sysdev.kobj)); sysdev_remove_file(&cpu->sysdev, &attr_online); sysdev_unregister(&cpu->sysdev); return; }
static void unregister_memory(struct memory_block *memory, struct mem_section *section, struct node *root) { BUG_ON(memory->sysdev.cls != &memory_sysdev_class); BUG_ON(memory->sysdev.id != __section_nr(section)); sysdev_unregister(&memory->sysdev); if (root) sysfs_remove_link(&root->sysdev.kobj, kobject_name(&memory->sysdev.kobj)); }
/* * register cpu under node */ int register_cpu_under_node(unsigned int cpu, unsigned int nid) { int ret; struct device *obj; if (!node_online(nid)) return 0; obj = get_cpu_device(cpu); if (!obj) return 0; ret = sysfs_create_link(&node_devices[nid]->dev.kobj, &obj->kobj, kobject_name(&obj->kobj)); if (ret) return ret; return sysfs_create_link(&obj->kobj, &node_devices[nid]->dev.kobj, kobject_name(&node_devices[nid]->dev.kobj)); }
void unregister_cpu(struct cpu *cpu, struct node *root) { int logical_cpu = cpu->sysdev.id; if (root) sysfs_remove_link(&root->sysdev.kobj, kobject_name(&cpu->sysdev.kobj)); sysdev_remove_file(&cpu->sysdev, &attr_online); sysdev_unregister(&cpu->sysdev); cpu_sys_devices[logical_cpu] = NULL; return; }
static ssize_t targets_store(struct kobject *kobj, const char *buffer, size_t size) { char *arg; if ((arg = _chkcmd(buffer, "add")) != NULL) hdd_register(arg); else if ((arg = _chkcmd(buffer, "rm")) != NULL) hdd_unregister(arg); else ERR("Unknown kobject store to %s\n", kobject_name(kobj)); return size; }
void display_uninit_sysfs(struct platform_device *pdev) { struct omap_dss_device *dssdev = NULL; for_each_dss_dev(dssdev) { if (kobject_name(&dssdev->kobj) == NULL) continue; kobject_del(&dssdev->kobj); kobject_put(&dssdev->kobj); memset(&dssdev->kobj, 0, sizeof(dssdev->kobj)); } }
/* * edac_device_unregister_sysfs_main_kobj: * the '..../edac/<name>' kobject */ void edac_device_unregister_sysfs_main_kobj(struct edac_device_ctl_info *dev) { edac_dbg(0, "\n"); edac_dbg(4, "name of kobject is: %s\n", kobject_name(&dev->kobj)); /* * Unregister the edac device's kobject and * allow for reference count to reach 0 at which point * the callback will be called to: * a) module_put() this module * b) 'kfree' the memory */ kobject_put(&dev->kobj); }
/* * edac_device_unregister_sysfs_main_kobj: * the '..../edac/<name>' kobject */ void edac_device_unregister_sysfs_main_kobj(struct edac_device_ctl_info *dev) { debugf0("%s()\n", __func__); debugf4("%s() name of kobject is: %s\n", __func__, kobject_name(&dev->kobj)); /* * Unregister the edac device's kobject and * allow for reference count to reach 0 at which point * the callback will be called to: * a) module_put() this module * b) 'kfree' the memory */ kobject_put(&dev->kobj); edac_put_sysfs_class(); }
/** * sysfs_create_dir - create a directory for an object. * @kobj: object we're creating directory for. */ int sysfs_create_dir(struct kobject * kobj) { struct sysfs_dirent *parent_sd, *sd; int error = 0; BUG_ON(!kobj); if (kobj->parent) parent_sd = kobj->parent->sd; else parent_sd = &sysfs_root; error = create_dir(kobj, parent_sd, kobject_name(kobj), &sd); if (!error) kobj->sd = sd; return error; }
static void driver_bound(struct device *dev) { if (klist_node_attached(&dev->p->knode_driver)) { printk(KERN_WARNING "%s: device %s already bound\n", __func__, kobject_name(&dev->kobj)); return; } pr_debug("driver: '%s': %s: bound to device '%s'\n", dev_name(dev), __func__, dev->driver->name); klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices); if (dev->bus) blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_BOUND_DRIVER, dev); }
/** * device_bind_driver - bind a driver to one device. * @dev: device. * * Allow manual attachment of a driver to a device. * Caller must have already set @dev->driver. * * Note that this does not modify the bus reference count * nor take the bus's rwsem. Please verify those are accounted * for before calling this. (It is ok to call with no other effort * from a driver's probe() method.) * * This function must be called with @dev->sem held. */ void device_bind_driver(struct device * dev) { if (klist_node_attached(&dev->knode_driver)) return; pr_debug("bound device '%s' to driver '%s'\n", dev->bus_id, dev->driver->name); if (dev->bus) blocking_notifier_call_chain(&dev->bus->bus_notifier, BUS_NOTIFY_BOUND_DRIVER, dev); klist_add_tail(&dev->knode_driver, &dev->driver->klist_devices); sysfs_create_link(&dev->driver->kobj, &dev->kobj, kobject_name(&dev->kobj)); sysfs_create_link(&dev->kobj, &dev->driver->kobj, "driver"); }
int sysfs_create_file(struct kobject *kobj, const struct attribute *attr) { BUG_ON(!kobj || !kobj->sd || !attr); struct sysfs_buffer *buffer; struct inode *inode; /* TODO: Actually implement this! */ //printk(KERN_WARNING "%s creating %s %s\n", __FUNCTION__,kobject_name(kobj), attr->name); buffer = kzalloc(sizeof(struct sysfs_buffer), GFP_KERNEL); if(NULL == buffer) return -1; buffer->kobj = kobj; if (buffer->kobj->ktype && buffer->kobj->ktype->sysfs_ops) { buffer->ops = buffer->kobj->ktype->sysfs_ops; } else { WARN(1, KERN_ERR "missing sysfs attribute operations for " "kobject: %s\n", kobject_name(kobj)); } buffer->attr = (struct attribute *) attr; inode = kfs_mkdirent( kobj->sd, attr->name, NULL, &sysfs_file_operations, attr->mode & ~S_IFMT, // should be 0444 as we don't support writes.. buffer, sizeof(struct sysfs_buffer) ); if(NULL == inode) { kfree(buffer); return -1; } /* TODO: silently forgetting this inode is not cool; we will have to destroy it, eventually (or will we do this recursively by destroyxing the parent inode?) ... */ return 0; return (0); }
/* * register_cpu - Setup a driverfs device for a CPU. * @cpu - Callers can set the cpu->no_control field to 1, to indicate not to * generate a control file in sysfs for this CPU. * @num - CPU number to use when creating the device. * * Initialize and register the CPU device. */ int __init register_cpu(struct cpu *cpu, int num, struct node *root) { int error; cpu->node_id = cpu_to_node(num); cpu->sysdev.id = num; cpu->sysdev.cls = &cpu_sysdev_class; error = sysdev_register(&cpu->sysdev); if (!error && root) error = sysfs_create_link(&root->sysdev.kobj, &cpu->sysdev.kobj, kobject_name(&cpu->sysdev.kobj)); if (!error && !cpu->no_control) register_cpu_control(cpu); return error; }