Changeset 718 for GPL/branches/uniaud32-next/lib32/devres.c
- Timestamp:
- Sep 2, 2022, 4:26:36 AM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/branches/uniaud32-next/lib32/devres.c
r716 r718 13 13 #include <linux/gfp.h> 14 14 #include <linux/errno.h> 15 #include <asm/io.h> 15 16 16 17 struct devres_node { 17 18 struct list_head entry; 18 19 dr_release_t release; 19 #ifdef CONFIG_DEBUG_DEVRES20 20 const char *name; 21 21 size_t size; 22 #endif23 22 }; 24 23 … … 26 25 struct devres_node node; 27 26 /* -- 3 pointers */ 28 u nsigned long longdata[]; /* guarantee ull alignment */27 u8 data[]; /* guarantee ull alignment */ 29 28 }; 30 29 … … 36 35 }; 37 36 37 static void set_node_dbginfo(struct devres_node *node, const char *name, 38 size_t size) 39 { 40 node->name = name; 41 node->size = size; 42 } 43 38 44 #define devres_log(dev, node, op) do {} while (0) 39 45 … … 83 89 BUG_ON(!list_empty(&node->entry)); 84 90 //#ifndef TARGET_OS2 85 /* Traps here on OS/2 */ 91 /* Traps here on OS/2 - release builds on non-HDA hardware only */ 92 rprintf(("add_dr")); 86 93 list_add_tail(&node->entry, &dev->devres_head); 94 rprintf(("add_dr2")); 87 95 //#endif 88 96 } … … 99 107 void devres_add(struct device *dev, void *res) 100 108 { 101 /* Traps here on OS/2 */102 109 struct devres *dr = container_of(res, struct devres, data); 103 110 unsigned long flags; 111 104 112 spin_lock_irqsave(&dev->devres_lock, flags); 105 113 add_dr(dev, &dr->node); … … 108 116 109 117 /** 110 * devres_alloc- Allocate device resource data118 * __devres_alloc_node - Allocate device resource data 111 119 * @release: Release function devres will be associated with 112 120 * @size: Allocation size 113 121 * @gfp: Allocation flags 114 122 * @nid: NUMA node 123 * @name: Name of the resource 115 124 * 116 125 * Allocate devres of @size bytes. The allocated area is zeroed, then … … 121 130 * Pointer to allocated devres on success, NULL on failure. 122 131 */ 123 void * devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid) 132 void *__devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid, 133 const char *name) 124 134 { 125 135 struct devres *dr; 126 136 127 137 dr = alloc_dr(release, size, gfp | __GFP_ZERO, nid); 138 if (unlikely(!dr)) 139 return NULL; 140 set_node_dbginfo(&dr->node, name, size); 128 141 return dr->data; 129 142 } … … 145 158 } 146 159 160 #if 0 //2022-09-02 147 161 static int remove_nodes(struct device *dev, 148 162 struct list_head *first, struct list_head *end, … … 257 271 flags); 258 272 } 273 #endif 259 274 260 275 static struct devres *find_dr(struct device *dev, dr_release_t release, … … 305 320 } 306 321 322 /* 323 * Custom devres actions allow inserting a simple function call 324 * into the teadown sequence. 325 */ 326 327 struct action_devres { 328 void *data; 329 void (*action)(void *); 330 }; 331 332 static void devm_action_release(struct device *dev, void *res) 333 { 334 struct action_devres *devres = res; 335 336 devres->action(devres->data); 337 } 338 307 339 /** 308 340 * devm_add_action() - add a custom action to list of managed resources … … 316 348 int devm_add_action(struct device *dev, void (*action)(void *), void *data) 317 349 { 350 struct action_devres *devres; 351 352 devres = devres_alloc(devm_action_release, 353 sizeof(struct action_devres), GFP_KERNEL); 354 if (!devres) 355 return -ENOMEM; 356 357 devres->data = data; 358 devres->action = action; 359 360 devres_add(dev, devres); 361 318 362 return 0; 319 363 } … … 331 375 { 332 376 } 377 378 /* 379 * Managed kmalloc/kfree 380 */ 381 static void devm_kmalloc_release(struct device *dev, void *res) 382 { 383 /* noop */ 384 } 385 386 static int devm_kmalloc_match(struct device *dev, void *res, void *data) 387 { 388 return res == data; 389 } 390 391 /** 392 * devm_kmalloc - Resource-managed kmalloc 393 * @dev: Device to allocate memory for 394 * @size: Allocation size 395 * @gfp: Allocation gfp flags 396 * 397 * Managed kmalloc. Memory allocated with this function is 398 * automatically freed on driver detach. Like all other devres 399 * resources, guaranteed alignment is unsigned long long. 400 * 401 * RETURNS: 402 * Pointer to allocated memory on success, NULL on failure. 403 */ 404 void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp) 405 { 406 struct devres *dr; 407 408 if (unlikely(!size)) 409 return ZERO_SIZE_PTR; 410 411 /* use raw alloc_dr for kmalloc caller tracing */ 412 dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev)); 413 if (unlikely(!dr)) 414 return NULL; 415 416 /* 417 * This is named devm_kzalloc_release for historical reasons 418 * The initial implementation did not support kmalloc, only kzalloc 419 */ 420 set_node_dbginfo(&dr->node, "devm_kzalloc_release", size); 421 devres_add(dev, dr->data); 422 return dr->data; 423 } 424 EXPORT_SYMBOL_GPL(devm_kmalloc); 425 426 enum devm_ioremap_type { 427 DEVM_IOREMAP = 0, 428 DEVM_IOREMAP_UC, 429 DEVM_IOREMAP_WC, 430 DEVM_IOREMAP_NP, 431 }; 432 433 void devm_ioremap_release(struct device *dev, void *res) 434 { 435 iounmap(*(void __iomem **)res); 436 } 437 438 static int devm_ioremap_match(struct device *dev, void *res, void *match_data) 439 { 440 return *(void **)res == match_data; 441 } 442 443 static void *__devm_ioremap(struct device *dev, resource_size_t offset, 444 resource_size_t size, 445 enum devm_ioremap_type type) 446 { 447 void __iomem **ptr, *addr = NULL; 448 449 ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL); 450 if (!ptr) 451 return NULL; 452 453 switch (type) { 454 case DEVM_IOREMAP: 455 addr = ioremap(offset, size); 456 break; 457 #if 0 458 case DEVM_IOREMAP_UC: 459 addr = ioremap_uc(offset, size); 460 break; 461 case DEVM_IOREMAP_WC: 462 addr = ioremap_wc(offset, size); 463 break; 464 case DEVM_IOREMAP_NP: 465 addr = ioremap_np(offset, size); 466 break; 467 #endif 468 } 469 470 if (addr) { 471 *ptr = addr; 472 devres_add(dev, ptr); 473 } else 474 devres_free(ptr); 475 476 return addr; 477 } 478 479 /** 480 * devm_ioremap - Managed ioremap() 481 * @dev: Generic device to remap IO address for 482 * @offset: Resource address to map 483 * @size: Size of map 484 * 485 * Managed ioremap(). Map is automatically unmapped on driver detach. 486 */ 487 void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, 488 resource_size_t size) 489 { 490 return __devm_ioremap(dev, offset, size, DEVM_IOREMAP); 491 } 492 EXPORT_SYMBOL(devm_ioremap);
Note:
See TracChangeset
for help on using the changeset viewer.