1 /* 2 * attribute_container.c - implementation of a simple container for classes 3 * 4 * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com> 5 * 6 * This file is licensed under GPLv2 7 * 8 * The basic idea here is to enable a device to be attached to an 9 * aritrary numer of classes without having to allocate storage for them. 10 * Instead, the contained classes select the devices they need to attach 11 * to via a matching function. 12 */ 13 14 #include <linux/attribute_container.h> 15 #include <linux/init.h> 16 #include <linux/device.h> 17 #include <linux/kernel.h> 18 #include <linux/slab.h> 19 #include <linux/list.h> 20 #include <linux/module.h> 21 #include <linux/mutex.h> 22 23 #include "base.h" 24 25 /* This is a private structure used to tie the classdev and the 26 * container .. it should never be visible outside this file */ 27 struct internal_container { 28 struct klist_node node; 29 struct attribute_container *cont; 30 struct class_device classdev; 31 }; 32 33 static void internal_container_klist_get(struct klist_node *n) 34 { 35 struct internal_container *ic = 36 container_of(n, struct internal_container, node); 37 class_device_get(&ic->classdev); 38 } 39 40 static void internal_container_klist_put(struct klist_node *n) 41 { 42 struct internal_container *ic = 43 container_of(n, struct internal_container, node); 44 class_device_put(&ic->classdev); 45 } 46 47 48 /** 49 * attribute_container_classdev_to_container - given a classdev, return the container 50 * 51 * @classdev: the class device created by attribute_container_add_device. 52 * 53 * Returns the container associated with this classdev. 54 */ 55 struct attribute_container * 56 attribute_container_classdev_to_container(struct class_device *classdev) 57 { 58 struct internal_container *ic = 59 container_of(classdev, struct internal_container, classdev); 60 return ic->cont; 61 } 62 EXPORT_SYMBOL_GPL(attribute_container_classdev_to_container); 63 64 static struct list_head attribute_container_list; 65 66 static DEFINE_MUTEX(attribute_container_mutex); 67 68 /** 69 * attribute_container_register - register an attribute container 70 * 71 * @cont: The container to register. This must be allocated by the 72 * callee and should also be zeroed by it. 73 */ 74 int 75 attribute_container_register(struct attribute_container *cont) 76 { 77 INIT_LIST_HEAD(&cont->node); 78 klist_init(&cont->containers,internal_container_klist_get, 79 internal_container_klist_put); 80 81 mutex_lock(&attribute_container_mutex); 82 list_add_tail(&cont->node, &attribute_container_list); 83 mutex_unlock(&attribute_container_mutex); 84 85 return 0; 86 } 87 EXPORT_SYMBOL_GPL(attribute_container_register); 88 89 /** 90 * attribute_container_unregister - remove a container registration 91 * 92 * @cont: previously registered container to remove 93 */ 94 int 95 attribute_container_unregister(struct attribute_container *cont) 96 { 97 int retval = -EBUSY; 98 mutex_lock(&attribute_container_mutex); 99 spin_lock(&cont->containers.k_lock); 100 if (!list_empty(&cont->containers.k_list)) 101 goto out; 102 retval = 0; 103 list_del(&cont->node); 104 out: 105 spin_unlock(&cont->containers.k_lock); 106 mutex_unlock(&attribute_container_mutex); 107 return retval; 108 109 } 110 EXPORT_SYMBOL_GPL(attribute_container_unregister); 111 112 /* private function used as class release */ 113 static void attribute_container_release(struct class_device *classdev) 114 { 115 struct internal_container *ic 116 = container_of(classdev, struct internal_container, classdev); 117 struct device *dev = classdev->dev; 118 119 kfree(ic); 120 put_device(dev); 121 } 122 123 /** 124 * attribute_container_add_device - see if any container is interested in dev 125 * 126 * @dev: device to add attributes to 127 * @fn: function to trigger addition of class device. 128 * 129 * This function allocates storage for the class device(s) to be 130 * attached to dev (one for each matching attribute_container). If no 131 * fn is provided, the code will simply register the class device via 132 * class_device_add. If a function is provided, it is expected to add 133 * the class device at the appropriate time. One of the things that 134 * might be necessary is to allocate and initialise the classdev and 135 * then add it a later time. To do this, call this routine for 136 * allocation and initialisation and then use 137 * attribute_container_device_trigger() to call class_device_add() on 138 * it. Note: after this, the class device contains a reference to dev 139 * which is not relinquished until the release of the classdev. 140 */ 141 void 142 attribute_container_add_device(struct device *dev, 143 int (*fn)(struct attribute_container *, 144 struct device *, 145 struct class_device *)) 146 { 147 struct attribute_container *cont; 148 149 mutex_lock(&attribute_container_mutex); 150 list_for_each_entry(cont, &attribute_container_list, node) { 151 struct internal_container *ic; 152 153 if (attribute_container_no_classdevs(cont)) 154 continue; 155 156 if (!cont->match(cont, dev)) 157 continue; 158 159 ic = kzalloc(sizeof(*ic), GFP_KERNEL); 160 if (!ic) { 161 dev_printk(KERN_ERR, dev, "failed to allocate class container\n"); 162 continue; 163 } 164 165 ic->cont = cont; 166 class_device_initialize(&ic->classdev); 167 ic->classdev.dev = get_device(dev); 168 ic->classdev.class = cont->class; 169 cont->class->release = attribute_container_release; 170 strcpy(ic->classdev.class_id, dev->bus_id); 171 if (fn) 172 fn(cont, dev, &ic->classdev); 173 else 174 attribute_container_add_class_device(&ic->classdev); 175 klist_add_tail(&ic->node, &cont->containers); 176 } 177 mutex_unlock(&attribute_container_mutex); 178 } 179 180 /* FIXME: can't break out of this unless klist_iter_exit is also 181 * called before doing the break 182 */ 183 #define klist_for_each_entry(pos, head, member, iter) \ 184 for (klist_iter_init(head, iter); (pos = ({ \ 185 struct klist_node *n = klist_next(iter); \ 186 n ? container_of(n, typeof(*pos), member) : \ 187 ({ klist_iter_exit(iter) ; NULL; }); \ 188 }) ) != NULL; ) 189 190 191 /** 192 * attribute_container_remove_device - make device eligible for removal. 193 * 194 * @dev: The generic device 195 * @fn: A function to call to remove the device 196 * 197 * This routine triggers device removal. If fn is NULL, then it is 198 * simply done via class_device_unregister (note that if something 199 * still has a reference to the classdev, then the memory occupied 200 * will not be freed until the classdev is released). If you want a 201 * two phase release: remove from visibility and then delete the 202 * device, then you should use this routine with a fn that calls 203 * class_device_del() and then use 204 * attribute_container_device_trigger() to do the final put on the 205 * classdev. 206 */ 207 void 208 attribute_container_remove_device(struct device *dev, 209 void (*fn)(struct attribute_container *, 210 struct device *, 211 struct class_device *)) 212 { 213 struct attribute_container *cont; 214 215 mutex_lock(&attribute_container_mutex); 216 list_for_each_entry(cont, &attribute_container_list, node) { 217 struct internal_container *ic; 218 struct klist_iter iter; 219 220 if (attribute_container_no_classdevs(cont)) 221 continue; 222 223 if (!cont->match(cont, dev)) 224 continue; 225 226 klist_for_each_entry(ic, &cont->containers, node, &iter) { 227 if (dev != ic->classdev.dev) 228 continue; 229 klist_del(&ic->node); 230 if (fn) 231 fn(cont, dev, &ic->classdev); 232 else { 233 attribute_container_remove_attrs(&ic->classdev); 234 class_device_unregister(&ic->classdev); 235 } 236 } 237 } 238 mutex_unlock(&attribute_container_mutex); 239 } 240 241 /** 242 * attribute_container_device_trigger - execute a trigger for each matching classdev 243 * 244 * @dev: The generic device to run the trigger for 245 * @fn the function to execute for each classdev. 246 * 247 * This funcion is for executing a trigger when you need to know both 248 * the container and the classdev. If you only care about the 249 * container, then use attribute_container_trigger() instead. 250 */ 251 void 252 attribute_container_device_trigger(struct device *dev, 253 int (*fn)(struct attribute_container *, 254 struct device *, 255 struct class_device *)) 256 { 257 struct attribute_container *cont; 258 259 mutex_lock(&attribute_container_mutex); 260 list_for_each_entry(cont, &attribute_container_list, node) { 261 struct internal_container *ic; 262 struct klist_iter iter; 263 264 if (!cont->match(cont, dev)) 265 continue; 266 267 if (attribute_container_no_classdevs(cont)) { 268 fn(cont, dev, NULL); 269 continue; 270 } 271 272 klist_for_each_entry(ic, &cont->containers, node, &iter) { 273 if (dev == ic->classdev.dev) 274 fn(cont, dev, &ic->classdev); 275 } 276 } 277 mutex_unlock(&attribute_container_mutex); 278 } 279 280 /** 281 * attribute_container_trigger - trigger a function for each matching container 282 * 283 * @dev: The generic device to activate the trigger for 284 * @fn: the function to trigger 285 * 286 * This routine triggers a function that only needs to know the 287 * matching containers (not the classdev) associated with a device. 288 * It is more lightweight than attribute_container_device_trigger, so 289 * should be used in preference unless the triggering function 290 * actually needs to know the classdev. 291 */ 292 void 293 attribute_container_trigger(struct device *dev, 294 int (*fn)(struct attribute_container *, 295 struct device *)) 296 { 297 struct attribute_container *cont; 298 299 mutex_lock(&attribute_container_mutex); 300 list_for_each_entry(cont, &attribute_container_list, node) { 301 if (cont->match(cont, dev)) 302 fn(cont, dev); 303 } 304 mutex_unlock(&attribute_container_mutex); 305 } 306 307 /** 308 * attribute_container_add_attrs - add attributes 309 * 310 * @classdev: The class device 311 * 312 * This simply creates all the class device sysfs files from the 313 * attributes listed in the container 314 */ 315 int 316 attribute_container_add_attrs(struct class_device *classdev) 317 { 318 struct attribute_container *cont = 319 attribute_container_classdev_to_container(classdev); 320 struct class_device_attribute **attrs = cont->attrs; 321 int i, error; 322 323 if (!attrs) 324 return 0; 325 326 for (i = 0; attrs[i]; i++) { 327 error = class_device_create_file(classdev, attrs[i]); 328 if (error) 329 return error; 330 } 331 332 return 0; 333 } 334 335 /** 336 * attribute_container_add_class_device - same function as class_device_add 337 * 338 * @classdev: the class device to add 339 * 340 * This performs essentially the same function as class_device_add except for 341 * attribute containers, namely add the classdev to the system and then 342 * create the attribute files 343 */ 344 int 345 attribute_container_add_class_device(struct class_device *classdev) 346 { 347 int error = class_device_add(classdev); 348 if (error) 349 return error; 350 return attribute_container_add_attrs(classdev); 351 } 352 353 /** 354 * attribute_container_add_class_device_adapter - simple adapter for triggers 355 * 356 * This function is identical to attribute_container_add_class_device except 357 * that it is designed to be called from the triggers 358 */ 359 int 360 attribute_container_add_class_device_adapter(struct attribute_container *cont, 361 struct device *dev, 362 struct class_device *classdev) 363 { 364 return attribute_container_add_class_device(classdev); 365 } 366 367 /** 368 * attribute_container_remove_attrs - remove any attribute files 369 * 370 * @classdev: The class device to remove the files from 371 * 372 */ 373 void 374 attribute_container_remove_attrs(struct class_device *classdev) 375 { 376 struct attribute_container *cont = 377 attribute_container_classdev_to_container(classdev); 378 struct class_device_attribute **attrs = cont->attrs; 379 int i; 380 381 if (!attrs) 382 return; 383 384 for (i = 0; attrs[i]; i++) 385 class_device_remove_file(classdev, attrs[i]); 386 } 387 388 /** 389 * attribute_container_class_device_del - equivalent of class_device_del 390 * 391 * @classdev: the class device 392 * 393 * This function simply removes all the attribute files and then calls 394 * class_device_del. 395 */ 396 void 397 attribute_container_class_device_del(struct class_device *classdev) 398 { 399 attribute_container_remove_attrs(classdev); 400 class_device_del(classdev); 401 } 402 403 /** 404 * attribute_container_find_class_device - find the corresponding class_device 405 * 406 * @cont: the container 407 * @dev: the generic device 408 * 409 * Looks up the device in the container's list of class devices and returns 410 * the corresponding class_device. 411 */ 412 struct class_device * 413 attribute_container_find_class_device(struct attribute_container *cont, 414 struct device *dev) 415 { 416 struct class_device *cdev = NULL; 417 struct internal_container *ic; 418 struct klist_iter iter; 419 420 klist_for_each_entry(ic, &cont->containers, node, &iter) { 421 if (ic->classdev.dev == dev) { 422 cdev = &ic->classdev; 423 /* FIXME: must exit iterator then break */ 424 klist_iter_exit(&iter); 425 break; 426 } 427 } 428 429 return cdev; 430 } 431 EXPORT_SYMBOL_GPL(attribute_container_find_class_device); 432 433 int __init 434 attribute_container_init(void) 435 { 436 INIT_LIST_HEAD(&attribute_container_list); 437 return 0; 438 } 439