| /* |
| * Greybus operations |
| * |
| * Copyright 2015-2016 Google Inc. |
| * |
| * Released under the GPLv2 only. |
| */ |
| |
| #include <linux/string.h> |
| #include <linux/sysfs.h> |
| |
| #include "audio_manager.h" |
| #include "audio_manager_private.h" |
| |
| static ssize_t manager_sysfs_add_store( |
| struct kobject *kobj, struct kobj_attribute *attr, |
| const char *buf, size_t count) |
| { |
| struct gb_audio_manager_module_descriptor desc = { {0} }; |
| |
| int num = sscanf(buf, |
| "name=%" GB_AUDIO_MANAGER_MODULE_NAME_LEN_SSCANF "s " |
| "vid=%d pid=%d intf_id=%d i/p devices=0x%X o/p devices=0x%X", |
| desc.name, &desc.vid, &desc.pid, &desc.intf_id, |
| &desc.ip_devices, &desc.op_devices); |
| |
| if (num != 7) |
| return -EINVAL; |
| |
| num = gb_audio_manager_add(&desc); |
| if (num < 0) |
| return -EINVAL; |
| |
| return count; |
| } |
| |
| static struct kobj_attribute manager_add_attribute = |
| __ATTR(add, 0664, NULL, manager_sysfs_add_store); |
| |
| static ssize_t manager_sysfs_remove_store( |
| struct kobject *kobj, struct kobj_attribute *attr, |
| const char *buf, size_t count) |
| { |
| int id; |
| |
| int num = kstrtoint(buf, 10, &id); |
| |
| if (num != 1) |
| return -EINVAL; |
| |
| num = gb_audio_manager_remove(id); |
| if (num) |
| return num; |
| |
| return count; |
| } |
| |
| static struct kobj_attribute manager_remove_attribute = |
| __ATTR(remove, 0664, NULL, manager_sysfs_remove_store); |
| |
| static ssize_t manager_sysfs_dump_store( |
| struct kobject *kobj, struct kobj_attribute *attr, |
| const char *buf, size_t count) |
| { |
| int id; |
| |
| int num = kstrtoint(buf, 10, &id); |
| |
| if (num == 1) { |
| num = gb_audio_manager_dump_module(id); |
| if (num) |
| return num; |
| } else if (!strncmp("all", buf, 3)) { |
| gb_audio_manager_dump_all(); |
| } else { |
| return -EINVAL; |
| } |
| |
| return count; |
| } |
| |
| static struct kobj_attribute manager_dump_attribute = |
| __ATTR(dump, 0664, NULL, manager_sysfs_dump_store); |
| |
| static void manager_sysfs_init_attribute( |
| struct kobject *kobj, struct kobj_attribute *kattr) |
| { |
| int err; |
| |
| err = sysfs_create_file(kobj, &kattr->attr); |
| if (err) { |
| pr_warn("creating the sysfs entry for %s failed: %d\n", |
| kattr->attr.name, err); |
| } |
| } |
| |
| void gb_audio_manager_sysfs_init(struct kobject *kobj) |
| { |
| manager_sysfs_init_attribute(kobj, &manager_add_attribute); |
| manager_sysfs_init_attribute(kobj, &manager_remove_attribute); |
| manager_sysfs_init_attribute(kobj, &manager_dump_attribute); |
| } |