static ssize_t value_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { u16 val; u16 reg_addr; const char *name = attr->attr.name; struct most_dci_obj *dci_obj = to_dci_obj(dev); struct usb_device *usb_dev = dci_obj->usb_device; int err = kstrtou16(buf, 16, &val); if (err) return err; if (!strcmp(name, "arb_address")) { dci_obj->reg_addr = val; return count; } if (!strcmp(name, "arb_value")) err = drci_wr_reg(usb_dev, dci_obj->reg_addr, val); else if (!strcmp(name, "sync_ep")) err = start_sync_ep(usb_dev, val); else if (!get_static_reg_addr(rw_regs, name, ®_addr)) err = drci_wr_reg(usb_dev, reg_addr, val); else return -EFAULT; if (err < 0) return err; return count; }
/** * dci_attr_show - show function for dci object * @kobj: pointer to kobject * @attr: pointer to attribute struct * @buf: buffer */ static ssize_t dci_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) { struct most_dci_attribute *dci_attr = to_dci_attr(attr); struct most_dci_obj *dci_obj = to_dci_obj(kobj); if (!dci_attr->show) return -EIO; return dci_attr->show(dci_obj, dci_attr, buf); }
/** * dci_attr_store - store function for dci object * @kobj: pointer to kobject * @attr: pointer to attribute struct * @buf: buffer * @len: length of buffer */ static ssize_t dci_attr_store(struct kobject *kobj, struct attribute *attr, const char *buf, size_t len) { struct most_dci_attribute *dci_attr = to_dci_attr(attr); struct most_dci_obj *dci_obj = to_dci_obj(kobj); if (!dci_attr->store) return -EIO; return dci_attr->store(dci_obj, dci_attr, buf, len); }
static ssize_t value_show(struct device *dev, struct device_attribute *attr, char *buf) { const char *name = attr->attr.name; struct most_dci_obj *dci_obj = to_dci_obj(dev); u16 val; u16 reg_addr; int err; if (!strcmp(name, "arb_address")) return snprintf(buf, PAGE_SIZE, "%04x\n", dci_obj->reg_addr); if (!strcmp(name, "arb_value")) reg_addr = dci_obj->reg_addr; else if (get_static_reg_addr(ro_regs, name, ®_addr) && get_static_reg_addr(rw_regs, name, ®_addr)) return -EFAULT; err = drci_rd_reg(dci_obj->usb_device, reg_addr, &val); if (err < 0) return err; return snprintf(buf, PAGE_SIZE, "%04x\n", val); }
/** * most_dci_release - release function for dci object * @kobj: pointer to kobject * * This frees the memory allocated for the dci object */ static void most_dci_release(struct kobject *kobj) { struct most_dci_obj *dci_obj = to_dci_obj(kobj); kfree(dci_obj); }
static void release_dci(struct device *dev) { struct most_dci_obj *dci = to_dci_obj(dev); kfree(dci); }