4 * Copyright 2015-2016 Google Inc.
6 * Released under the GPLv2 only.
9 #include <linux/slab.h>
11 #include "audio_manager.h"
12 #include "audio_manager_private.h"
14 #define to_gb_audio_module_attr(x) \
15 container_of(x, struct gb_audio_manager_module_attribute, attr)
16 #define to_gb_audio_module(x) \
17 container_of(x, struct gb_audio_manager_module, kobj)
19 struct gb_audio_manager_module_attribute {
20 struct attribute attr;
21 ssize_t (*show)(struct gb_audio_manager_module *module,
22 struct gb_audio_manager_module_attribute *attr,
24 ssize_t (*store)(struct gb_audio_manager_module *module,
25 struct gb_audio_manager_module_attribute *attr,
26 const char *buf, size_t count);
29 static ssize_t gb_audio_module_attr_show(
30 struct kobject *kobj, struct attribute *attr, char *buf)
32 struct gb_audio_manager_module_attribute *attribute;
33 struct gb_audio_manager_module *module;
35 attribute = to_gb_audio_module_attr(attr);
36 module = to_gb_audio_module(kobj);
41 return attribute->show(module, attribute, buf);
44 static ssize_t gb_audio_module_attr_store(struct kobject *kobj,
45 struct attribute *attr,
46 const char *buf, size_t len)
48 struct gb_audio_manager_module_attribute *attribute;
49 struct gb_audio_manager_module *module;
51 attribute = to_gb_audio_module_attr(attr);
52 module = to_gb_audio_module(kobj);
54 if (!attribute->store)
57 return attribute->store(module, attribute, buf, len);
60 static const struct sysfs_ops gb_audio_module_sysfs_ops = {
61 .show = gb_audio_module_attr_show,
62 .store = gb_audio_module_attr_store,
65 static void gb_audio_module_release(struct kobject *kobj)
67 struct gb_audio_manager_module *module = to_gb_audio_module(kobj);
69 pr_info("Destroying audio module #%d\n", module->id);
70 /* TODO -> delete from list */
74 static ssize_t gb_audio_module_name_show(
75 struct gb_audio_manager_module *module,
76 struct gb_audio_manager_module_attribute *attr, char *buf)
78 return sprintf(buf, "%s", module->desc.name);
81 static struct gb_audio_manager_module_attribute gb_audio_module_name_attribute =
82 __ATTR(name, 0664, gb_audio_module_name_show, NULL);
84 static ssize_t gb_audio_module_slot_show(
85 struct gb_audio_manager_module *module,
86 struct gb_audio_manager_module_attribute *attr, char *buf)
88 return sprintf(buf, "%d", module->desc.slot);
91 static struct gb_audio_manager_module_attribute gb_audio_module_slot_attribute =
92 __ATTR(slot, 0664, gb_audio_module_slot_show, NULL);
94 static ssize_t gb_audio_module_vid_show(
95 struct gb_audio_manager_module *module,
96 struct gb_audio_manager_module_attribute *attr, char *buf)
98 return sprintf(buf, "%d", module->desc.vid);
101 static struct gb_audio_manager_module_attribute gb_audio_module_vid_attribute =
102 __ATTR(vid, 0664, gb_audio_module_vid_show, NULL);
104 static ssize_t gb_audio_module_pid_show(
105 struct gb_audio_manager_module *module,
106 struct gb_audio_manager_module_attribute *attr, char *buf)
108 return sprintf(buf, "%d", module->desc.pid);
111 static struct gb_audio_manager_module_attribute gb_audio_module_pid_attribute =
112 __ATTR(pid, 0664, gb_audio_module_pid_show, NULL);
114 static ssize_t gb_audio_module_cport_show(
115 struct gb_audio_manager_module *module,
116 struct gb_audio_manager_module_attribute *attr, char *buf)
118 return sprintf(buf, "%d", module->desc.cport);
121 static struct gb_audio_manager_module_attribute
122 gb_audio_module_cport_attribute =
123 __ATTR(cport, 0664, gb_audio_module_cport_show, NULL);
125 static ssize_t gb_audio_module_devices_show(
126 struct gb_audio_manager_module *module,
127 struct gb_audio_manager_module_attribute *attr, char *buf)
129 return sprintf(buf, "0x%X", module->desc.devices);
132 static struct gb_audio_manager_module_attribute
133 gb_audio_module_devices_attribute =
134 __ATTR(devices, 0664, gb_audio_module_devices_show, NULL);
136 static struct attribute *gb_audio_module_default_attrs[] = {
137 &gb_audio_module_name_attribute.attr,
138 &gb_audio_module_slot_attribute.attr,
139 &gb_audio_module_vid_attribute.attr,
140 &gb_audio_module_pid_attribute.attr,
141 &gb_audio_module_cport_attribute.attr,
142 &gb_audio_module_devices_attribute.attr,
143 NULL, /* need to NULL terminate the list of attributes */
146 static struct kobj_type gb_audio_module_type = {
147 .sysfs_ops = &gb_audio_module_sysfs_ops,
148 .release = gb_audio_module_release,
149 .default_attrs = gb_audio_module_default_attrs,
152 static void send_add_uevent(struct gb_audio_manager_module *module)
154 char name_string[128];
155 char slot_string[64];
158 char cport_string[64];
159 char devices_string[64];
171 snprintf(name_string, 128, "NAME=%s", module->desc.name);
172 snprintf(slot_string, 64, "SLOT=%d", module->desc.slot);
173 snprintf(vid_string, 64, "VID=%d", module->desc.vid);
174 snprintf(pid_string, 64, "PID=%d", module->desc.pid);
175 snprintf(cport_string, 64, "CPORT=%d", module->desc.cport);
176 snprintf(devices_string, 64, "DEVICES=0x%X", module->desc.devices);
178 kobject_uevent_env(&module->kobj, KOBJ_ADD, envp);
181 int gb_audio_manager_module_create(
182 struct gb_audio_manager_module **module,
183 struct kset *manager_kset,
184 int id, struct gb_audio_manager_module_descriptor *desc)
187 struct gb_audio_manager_module *m;
189 m = kzalloc(sizeof(*m), GFP_ATOMIC);
193 /* Initialize the node */
194 INIT_LIST_HEAD(&m->list);
196 /* Set the module id */
199 /* Copy the provided descriptor */
200 memcpy(&m->desc, desc, sizeof(*desc));
203 m->kobj.kset = manager_kset;
206 * Initialize and add the kobject to the kernel. All the default files
207 * will be created here. As we have already specified a kset for this
208 * kobject, we don't have to set a parent for the kobject, the kobject
209 * will be placed beneath that kset automatically.
211 err = kobject_init_and_add(&m->kobj, &gb_audio_module_type, NULL, "%d",
214 pr_err("failed initializing kobject for audio module #%d\n",
216 kobject_put(&m->kobj);
221 * Notify the object was created
226 pr_info("Created audio module #%d\n", id);
230 void gb_audio_manager_module_dump(struct gb_audio_manager_module *module)
232 pr_info("audio module #%d name=%s slot=%d vid=%d pid=%d cport=%d devices=0x%X\n",
239 module->desc.devices);