€•hÁŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ2/translations/zh_CN/driver-api/driver-model/devres”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ2/translations/zh_TW/driver-api/driver-model/devres”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ2/translations/it_IT/driver-api/driver-model/devres”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ2/translations/ja_JP/driver-api/driver-model/devres”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ2/translations/ko_KR/driver-api/driver-model/devres”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ2/translations/pt_BR/driver-api/driver-model/devres”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ2/translations/sp_SP/driver-api/driver-model/devres”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ Devres - Managed Device Resource”h]”hŒ Devres - Managed Device Resource”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒL/var/lib/git/docbuild/linux/Documentation/driver-api/driver-model/devres.rst”h´KubhŒ paragraph”“”)�”}”(hŒTejun Heo ”h]”(hŒTejun Heo <”…”�”}”(hhÍh²hh³Nh´NubhŒ reference”“”)�”}”(hŒ teheo@suse.de”h]”hŒ teheo@suse.de”…”�”}”(hh×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:teheo@suse.de”uh1hÕhhÍubhŒ>”…”�”}”(hhÍh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhÌ)�”}”(hŒFirst draft 10 January 2007”h]”hŒFirst draft 10 January 2007”…”�”}”(hhñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhŒcomment”“”)�”}”(hXƒcontents 1. Intro : Huh? Devres? 2. Devres : Devres in a nutshell 3. Devres Group : Group devres'es and release them together 4. Details : Life time rules, calling context, ... 5. Overhead : How much do we have to pay for this? 6. List of managed interfaces: Currently implemented managed interfaces”h]”hXƒcontents 1. Intro : Huh? Devres? 2. Devres : Devres in a nutshell 3. Devres Group : Group devres'es and release them together 4. Details : Life time rules, calling context, ... 5. Overhead : How much do we have to pay for this? 6. List of managed interfaces: Currently implemented managed interfaces”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hÿhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒ1. Intro”h]”hŒ1. Intro”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KubhÌ)�”}”(hXdevres came up while trying to convert libata to use iomap. Each iomapped address should be kept and unmapped on driver detach. For example, a plain SFF ATA controller (that is, good old PCI IDE) in native mode makes use of 5 PCI BARs and all of them should be maintained.”h]”hXdevres came up while trying to convert libata to use iomap. Each iomapped address should be kept and unmapped on driver detach. For example, a plain SFF ATA controller (that is, good old PCI IDE) in native mode makes use of 5 PCI BARs and all of them should be maintained.”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khjh²hubhÌ)�”}”(hX‹As with many other device drivers, libata low level drivers have sufficient bugs in ->remove and ->probe failure path. Well, yes, that's probably because libata low level driver developers are lazy bunch, but aren't all low level driver developers? After spending a day fiddling with braindamaged hardware with no document or braindamaged document, if it's finally working, well, it's working.”h]”hX“As with many other device drivers, libata low level drivers have sufficient bugs in ->remove and ->probe failure path. Well, yes, that’s probably because libata low level driver developers are lazy bunch, but aren’t all low level driver developers? After spending a day fiddling with braindamaged hardware with no document or braindamaged document, if it’s finally working, well, it’s working.”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khjh²hubhÌ)�”}”(hX.For one reason or another, low level drivers don't receive as much attention or testing as core code, and bugs on driver detach or initialization failure don't happen often enough to be noticeable. Init failure path is worse because it's much less travelled while needs to handle multiple entry points.”h]”hX4For one reason or another, low level drivers don’t receive as much attention or testing as core code, and bugs on driver detach or initialization failure don’t happen often enough to be noticeable. Init failure path is worse because it’s much less travelled while needs to handle multiple entry points.”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K#hjh²hubhÌ)�”}”(hŒúSo, many low level drivers end up leaking resources on driver detach and having half broken failure path implementation in ->probe() which would leak resources or even cause oops when failure occurs. iomap adds more to this mix. So do msi and msix.”h]”hŒúSo, many low level drivers end up leaking resources on driver detach and having half broken failure path implementation in ->probe() which would leak resources or even cause oops when failure occurs. iomap adds more to this mix. So do msi and msix.”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K)hjh²hubeh}”(h]”Œintro”ah ]”h"]”Œ1. intro”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒ 2. Devres”h]”hŒ 2. Devres”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjbh²hh³hÊh´K0ubhÌ)�”}”(hXfdevres is basically linked list of arbitrarily sized memory areas associated with a struct device. Each devres entry is associated with a release function. A devres can be released in several ways. No matter what, all devres entries are released on driver detach. On release, the associated release function is invoked and then the devres entry is freed.”h]”hXfdevres is basically linked list of arbitrarily sized memory areas associated with a struct device. Each devres entry is associated with a release function. A devres can be released in several ways. No matter what, all devres entries are released on driver detach. On release, the associated release function is invoked and then the devres entry is freed.”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K2hjbh²hubhÌ)�”}”(hX™Managed interface is created for resources commonly used by device drivers using devres. For example, coherent DMA memory is acquired using dma_alloc_coherent(). The managed version is called dmam_alloc_coherent(). It is identical to dma_alloc_coherent() except for the DMA memory allocated using it is managed and will be automatically released on driver detach. Implementation looks like the following::”h]”hX˜Managed interface is created for resources commonly used by device drivers using devres. For example, coherent DMA memory is acquired using dma_alloc_coherent(). The managed version is called dmam_alloc_coherent(). It is identical to dma_alloc_coherent() except for the DMA memory allocated using it is managed and will be automatically released on driver detach. Implementation looks like the following:”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K9hjbh²hubhŒ literal_block”“”)�”}”(hX·struct dma_devres { size_t size; void *vaddr; dma_addr_t dma_handle; }; static void dmam_coherent_release(struct device *dev, void *res) { struct dma_devres *this = res; dma_free_coherent(dev, this->size, this->vaddr, this->dma_handle); } dmam_alloc_coherent(dev, size, dma_handle, gfp) { struct dma_devres *dr; void *vaddr; dr = devres_alloc(dmam_coherent_release, sizeof(*dr), gfp); ... /* alloc DMA memory as usual */ vaddr = dma_alloc_coherent(...); ... /* record size, vaddr, dma_handle in dr */ dr->vaddr = vaddr; ... devres_add(dev, dr); return vaddr; }”h]”hX·struct dma_devres { size_t size; void *vaddr; dma_addr_t dma_handle; }; static void dmam_coherent_release(struct device *dev, void *res) { struct dma_devres *this = res; dma_free_coherent(dev, this->size, this->vaddr, this->dma_handle); } dmam_alloc_coherent(dev, size, dma_handle, gfp) { struct dma_devres *dr; void *vaddr; dr = devres_alloc(dmam_coherent_release, sizeof(*dr), gfp); ... /* alloc DMA memory as usual */ vaddr = dma_alloc_coherent(...); ... /* record size, vaddr, dma_handle in dr */ dr->vaddr = vaddr; ... devres_add(dev, dr); return vaddr; }”…”�”}”hj‘sbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j�h³hÊh´KAhjbh²hubhÌ)�”}”(hX)If a driver uses dmam_alloc_coherent(), the area is guaranteed to be freed whether initialization fails half-way or the device gets detached. If most resources are acquired using managed interface, a driver can have much simpler init and exit code. Init path basically looks like the following::”h]”hX(If a driver uses dmam_alloc_coherent(), the area is guaranteed to be freed whether initialization fails half-way or the device gets detached. If most resources are acquired using managed interface, a driver can have much simpler init and exit code. Init path basically looks like the following:”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kchjbh²hubj�)�”}”(hXUmy_init_one() { struct mydev *d; d = devm_kzalloc(dev, sizeof(*d), GFP_KERNEL); if (!d) return -ENOMEM; d->ring = dmam_alloc_coherent(...); if (!d->ring) return -ENOMEM; if (check something) return -EINVAL; ... return register_to_upper_layer(d); }”h]”hXUmy_init_one() { struct mydev *d; d = devm_kzalloc(dev, sizeof(*d), GFP_KERNEL); if (!d) return -ENOMEM; d->ring = dmam_alloc_coherent(...); if (!d->ring) return -ENOMEM; if (check something) return -EINVAL; ... return register_to_upper_layer(d); }”…”�”}”hj­sbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j�h³hÊh´Kihjbh²hubhÌ)�”}”(hŒAnd exit path::”h]”hŒAnd exit path:”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K|hjbh²hubj�)�”}”(hŒWmy_remove_one() { unregister_from_upper_layer(d); shutdown_my_hardware(); }”h]”hŒWmy_remove_one() { unregister_from_upper_layer(d); shutdown_my_hardware(); }”…”�”}”hjÉsbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j�h³hÊh´K~hjbh²hubhÌ)�”}”(hŒüAs shown above, low level drivers can be simplified a lot by using devres. Complexity is shifted from less maintained low level drivers to better maintained higher layer. Also, as init failure path is shared with exit path, both can get more testing.”h]”hŒüAs shown above, low level drivers can be simplified a lot by using devres. Complexity is shifted from less maintained low level drivers to better maintained higher layer. Also, as init failure path is shared with exit path, both can get more testing.”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K„hjbh²hubhÌ)�”}”(hX�Note though that when converting current calls or assignments to managed devm_* versions it is up to you to check if internal operations like allocating memory, have failed. Managed resources pertains to the freeing of these resources *only* - all other checks needed are still on you. In some cases this may mean introducing checks that were not necessary before moving to the managed devm_* calls.”h]”(hŒëNote though that when converting current calls or assignments to managed devm_* versions it is up to you to check if internal operations like allocating memory, have failed. Managed resources pertains to the freeing of these resources ”…”�”}”(hjåh²hh³Nh´NubhŒemphasis”“”)�”}”(hŒ*only*”h]”hŒonly”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jíhjåubhŒž - all other checks needed are still on you. In some cases this may mean introducing checks that were not necessary before moving to the managed devm_* calls.”…”�”}”(hjåh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K‰hjbh²hubeh}”(h]”Œdevres”ah ]”h"]”Œ 2. devres”ah$]”h&]”uh1hµhh·h²hh³hÊh´K0ubh¶)�”}”(hhh]”(h»)�”}”(hŒ3. Devres group”h]”hŒ3. Devres group”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´K’ubhÌ)�”}”(hŒëDevres entries can be grouped using devres group. When a group is released, all contained normal devres entries and properly nested groups are released. One usage is to rollback series of acquired resources on failure. For example::”h]”hŒêDevres entries can be grouped using devres group. When a group is released, all contained normal devres entries and properly nested groups are released. One usage is to rollback series of acquired resources on failure. For example:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K”hjh²hubj�)�”}”(hX if (!devres_open_group(dev, NULL, GFP_KERNEL)) return -ENOMEM; acquire A; if (failed) goto err; acquire B; if (failed) goto err; ... devres_remove_group(dev, NULL); return 0; err: devres_release_group(dev, NULL); return err_code;”h]”hX if (!devres_open_group(dev, NULL, GFP_KERNEL)) return -ENOMEM; acquire A; if (failed) goto err; acquire B; if (failed) goto err; ... devres_remove_group(dev, NULL); return 0; err: devres_release_group(dev, NULL); return err_code;”…”�”}”hj.sbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j�h³hÊh´K™hjh²hubhÌ)�”}”(hX As resource acquisition failure usually means probe failure, constructs like above are usually useful in midlayer driver (e.g. libata core layer) where interface function shouldn't have side effect on failure. For LLDs, just returning error code suffices in most cases.”h]”hXAs resource acquisition failure usually means probe failure, constructs like above are usually useful in midlayer driver (e.g. libata core layer) where interface function shouldn’t have side effect on failure. For LLDs, just returning error code suffices in most cases.”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¬hjh²hubhÌ)�”}”(hX—Each group is identified by `void *id`. It can either be explicitly specified by @id argument to devres_open_group() or automatically created by passing NULL as @id as in the above example. In both cases, devres_open_group() returns the group's id. The returned id can be passed to other devres functions to select the target group. If NULL is given to those functions, the latest open group is selected.”h]”(hŒEach group is identified by ”…”�”}”(hjJh²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ `void *id`”h]”hŒvoid *id”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRhjJubhXs. It can either be explicitly specified by @id argument to devres_open_group() or automatically created by passing NULL as @id as in the above example. In both cases, devres_open_group() returns the group’s id. The returned id can be passed to other devres functions to select the target group. If NULL is given to those functions, the latest open group is selected.”…”�”}”(hjJh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K±hjh²hubhÌ)�”}”(hŒ6For example, you can do something like the following::”h]”hŒ5For example, you can do something like the following:”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¹hjh²hubj�)�”}”(hXSint my_midlayer_create_something() { if (!devres_open_group(dev, my_midlayer_create_something, GFP_KERNEL)) return -ENOMEM; ... devres_close_group(dev, my_midlayer_create_something); return 0; } void my_midlayer_destroy_something() { devres_release_group(dev, my_midlayer_create_something); }”h]”hXSint my_midlayer_create_something() { if (!devres_open_group(dev, my_midlayer_create_something, GFP_KERNEL)) return -ENOMEM; ... devres_close_group(dev, my_midlayer_create_something); return 0; } void my_midlayer_destroy_something() { devres_release_group(dev, my_midlayer_create_something); }”…”�”}”hjzsbah}”(h]”h ]”h"]”h$]”h&]”jjuh1j�h³hÊh´K»hjh²hubeh}”(h]”Œ devres-group”ah ]”h"]”Œ3. devres group”ah$]”h&]”uh1hµhh·h²hh³hÊh´K’ubh¶)�”}”(hhh]”(h»)�”}”(hŒ 4. Details”h]”hŒ 4. Details”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj�h²hh³hÊh´KÍubhÌ)�”}”(hŒ‘Lifetime of a devres entry begins on devres allocation and finishes when it is released or destroyed (removed and freed) - no reference counting.”h]”hŒ‘Lifetime of a devres entry begins on devres allocation and finishes when it is released or destroyed (removed and freed) - no reference counting.”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÏhj�h²hubhÌ)�”}”(hXWdevres core guarantees atomicity to all basic devres operations and has support for single-instance devres types (atomic lookup-and-add-if-not-found). Other than that, synchronizing concurrent accesses to allocated devres data is caller's responsibility. This is usually non-issue because bus ops and resource allocations already do the job.”h]”hXYdevres core guarantees atomicity to all basic devres operations and has support for single-instance devres types (atomic lookup-and-add-if-not-found). Other than that, synchronizing concurrent accesses to allocated devres data is caller’s responsibility. This is usually non-issue because bus ops and resource allocations already do the job.”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÓhj�h²hubhÌ)�”}”(hŒWFor an example of single-instance devres type, read pcim_iomap_table() in lib/devres.c.”h]”hŒWFor an example of single-instance devres type, read pcim_iomap_table() in lib/devres.c.”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÚhj�h²hubhÌ)�”}”(hŒ\All devres interface functions can be called without context if the right gfp mask is given.”h]”hŒ\All devres interface functions can be called without context if the right gfp mask is given.”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÝhj�h²hubeh}”(h]”Œdetails”ah ]”h"]”Œ 4. details”ah$]”h&]”uh1hµhh·h²hh³hÊh´KÍubh¶)�”}”(hhh]”(h»)�”}”(hŒ 5. Overhead”h]”hŒ 5. Overhead”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjáh²hh³hÊh´KâubhÌ)�”}”(hXMEach devres bookkeeping info is allocated together with requested data area. With debug option turned off, bookkeeping info occupies 16 bytes on 32bit machines and 24 bytes on 64bit (three pointers rounded up to ull alignment). If singly linked list is used, it can be reduced to two pointers (8 bytes on 32bit, 16 bytes on 64bit).”h]”hXMEach devres bookkeeping info is allocated together with requested data area. With debug option turned off, bookkeeping info occupies 16 bytes on 32bit machines and 24 bytes on 64bit (three pointers rounded up to ull alignment). If singly linked list is used, it can be reduced to two pointers (8 bytes on 32bit, 16 bytes on 64bit).”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kähjáh²hubhÌ)�”}”(hŒ]Each devres group occupies 8 pointers. It can be reduced to 6 if singly linked list is used.”h]”hŒ]Each devres group occupies 8 pointers. It can be reduced to 6 if singly linked list is used.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kêhjáh²hubhÌ)�”}”(hŒÀMemory space overhead on ahci controller with two ports is between 300 and 400 bytes on 32bit machine after naive conversion (we can certainly invest a bit more effort into libata core layer).”h]”hŒÀMemory space overhead on ahci controller with two ports is between 300 and 400 bytes on 32bit machine after naive conversion (we can certainly invest a bit more effort into libata core layer).”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kíhjáh²hubeh}”(h]”Œoverhead”ah ]”h"]”Œ 5. overhead”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kâubh¶)�”}”(hhh]”(h»)�”}”(hŒ6. List of managed interfaces”h]”hŒ6. List of managed interfaces”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj$h²hh³hÊh´KóubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hX CLOCK devm_clk_get() devm_clk_get_optional() devm_clk_put() devm_clk_bulk_get() devm_clk_bulk_get_all() devm_clk_bulk_get_enable() devm_clk_bulk_get_optional() devm_get_clk_from_child() devm_clk_hw_register() devm_of_clk_add_hw_provider() devm_clk_hw_register_clkdev() ”h]”(hŒterm”“”)�”}”(hŒCLOCK”h]”hŒCLOCK”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´Mhj<ubhŒ definition”“”)�”}”(hhh]”hÌ)�”}”(hXdevm_clk_get() devm_clk_get_optional() devm_clk_put() devm_clk_bulk_get() devm_clk_bulk_get_all() devm_clk_bulk_get_enable() devm_clk_bulk_get_optional() devm_get_clk_from_child() devm_clk_hw_register() devm_of_clk_add_hw_provider() devm_clk_hw_register_clkdev()”h]”hXdevm_clk_get() devm_clk_get_optional() devm_clk_put() devm_clk_bulk_get() devm_clk_bulk_get_all() devm_clk_bulk_get_enable() devm_clk_bulk_get_optional() devm_get_clk_from_child() devm_clk_hw_register() devm_of_clk_add_hw_provider() devm_clk_hw_register_clkdev()”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KöhjRubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´Mhj7ubj;)�”}”(hŒŒDMA dmaenginem_async_device_register() dmam_alloc_coherent() dmam_alloc_attrs() dmam_free_coherent() dmam_pool_create() dmam_pool_destroy() ”h]”(jA)�”}”(hŒDMA”h]”hŒDMA”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MhjoubjQ)�”}”(hhh]”hÌ)�”}”(hŒ‡dmaenginem_async_device_register() dmam_alloc_coherent() dmam_alloc_attrs() dmam_free_coherent() dmam_pool_create() dmam_pool_destroy()”h]”hŒ‡dmaenginem_async_device_register() dmam_alloc_coherent() dmam_alloc_attrs() dmam_free_coherent() dmam_pool_create() dmam_pool_destroy()”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjoubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´Mhj7h²hubj;)�”}”(hŒDRM devm_drm_dev_alloc() ”h]”(jA)�”}”(hŒDRM”h]”hŒDRM”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M hjžubjQ)�”}”(hhh]”hÌ)�”}”(hŒdevm_drm_dev_alloc()”h]”hŒdevm_drm_dev_alloc()”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M hj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjžubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M hj7h²hubj;)�”}”(hŒõGPIO devm_gpiod_get() devm_gpiod_get_array() devm_gpiod_get_array_optional() devm_gpiod_get_index() devm_gpiod_get_index_optional() devm_gpiod_get_optional() devm_gpiod_put() devm_gpiod_unhinge() devm_gpiochip_add_data() devm_gpio_request_one() ”h]”(jA)�”}”(hŒGPIO”h]”hŒGPIO”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MhjÍubjQ)�”}”(hhh]”hÌ)�”}”(hŒïdevm_gpiod_get() devm_gpiod_get_array() devm_gpiod_get_array_optional() devm_gpiod_get_index() devm_gpiod_get_index_optional() devm_gpiod_get_optional() devm_gpiod_put() devm_gpiod_unhinge() devm_gpiochip_add_data() devm_gpio_request_one()”h]”hŒïdevm_gpiod_get() devm_gpiod_get_array() devm_gpiod_get_array_optional() devm_gpiod_get_index() devm_gpiod_get_index_optional() devm_gpiod_get_optional() devm_gpiod_put() devm_gpiod_unhinge() devm_gpiochip_add_data() devm_gpio_request_one()”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhjßubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjÍubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´Mhj7h²hubj;)�”}”(hŒ7I2C devm_i2c_add_adapter() devm_i2c_new_dummy_device() ”h]”(jA)�”}”(hŒI2C”h]”hŒI2C”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MhjüubjQ)�”}”(hhh]”hÌ)�”}”(hŒ2devm_i2c_add_adapter() devm_i2c_new_dummy_device()”h]”hŒ2devm_i2c_add_adapter() devm_i2c_new_dummy_device()”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjüubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´Mhj7h²hubj;)�”}”(hX©IIO devm_iio_device_alloc() devm_iio_device_register() devm_iio_dmaengine_buffer_setup() devm_iio_kfifo_buffer_setup() devm_iio_kfifo_buffer_setup_ext() devm_iio_map_array_register() devm_iio_triggered_buffer_setup() devm_iio_triggered_buffer_setup_ext() devm_iio_trigger_alloc() devm_iio_trigger_register() devm_iio_channel_get() devm_iio_channel_get_all() devm_iio_hw_consumer_alloc() devm_fwnode_iio_channel_get_by_name() ”h]”(jA)�”}”(hŒIIO”h]”hŒIIO”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M+hj+ubjQ)�”}”(hhh]”hÌ)�”}”(hX¤devm_iio_device_alloc() devm_iio_device_register() devm_iio_dmaengine_buffer_setup() devm_iio_kfifo_buffer_setup() devm_iio_kfifo_buffer_setup_ext() devm_iio_map_array_register() devm_iio_triggered_buffer_setup() devm_iio_triggered_buffer_setup_ext() devm_iio_trigger_alloc() devm_iio_trigger_register() devm_iio_channel_get() devm_iio_channel_get_all() devm_iio_hw_consumer_alloc() devm_fwnode_iio_channel_get_by_name()”h]”hX¤devm_iio_device_alloc() devm_iio_device_register() devm_iio_dmaengine_buffer_setup() devm_iio_kfifo_buffer_setup() devm_iio_kfifo_buffer_setup_ext() devm_iio_map_array_register() devm_iio_triggered_buffer_setup() devm_iio_triggered_buffer_setup_ext() devm_iio_trigger_alloc() devm_iio_trigger_register() devm_iio_channel_get() devm_iio_channel_get_all() devm_iio_hw_consumer_alloc() devm_fwnode_iio_channel_get_by_name()”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M+hj7h²hubj;)�”}”(hŒ#INPUT devm_input_allocate_device() ”h]”(jA)�”}”(hŒINPUT”h]”hŒINPUT”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M.hjZubjQ)�”}”(hhh]”hÌ)�”}”(hŒdevm_input_allocate_device()”h]”hŒdevm_input_allocate_device()”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M.hjlubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjZubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M.hj7h²hubj;)�”}”(hŒ¹IO region devm_release_mem_region() devm_release_region() devm_release_resource() devm_request_mem_region() devm_request_free_mem_region() devm_request_region() devm_request_resource() ”h]”(jA)�”}”(hŒ IO region”h]”hŒ IO region”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M7hj‰ubjQ)�”}”(hhh]”hÌ)�”}”(hŒ®devm_release_mem_region() devm_release_region() devm_release_resource() devm_request_mem_region() devm_request_free_mem_region() devm_request_region() devm_request_resource()”h]”hŒ®devm_release_mem_region() devm_release_region() devm_release_resource() devm_request_mem_region() devm_request_free_mem_region() devm_request_region() devm_request_resource()”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M1hj›ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj‰ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M7hj7h²hubj;)�”}”(hXÎIOMAP devm_ioport_map() devm_ioport_unmap() devm_ioremap() devm_ioremap_uc() devm_ioremap_wc() devm_ioremap_resource() : checks resource, requests memory region, ioremaps devm_ioremap_resource_wc() devm_platform_ioremap_resource() : calls devm_ioremap_resource() for platform device devm_platform_ioremap_resource_byname() devm_platform_get_and_ioremap_resource() devm_iounmap() Note: For the PCI devices the specific pcim_*() functions may be used, see below. ”h]”(jA)�”}”(hŒIOMAP”h]”hŒIOMAP”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MFhj¸ubjQ)�”}”(hhh]”(hÌ)�”}”(hXtdevm_ioport_map() devm_ioport_unmap() devm_ioremap() devm_ioremap_uc() devm_ioremap_wc() devm_ioremap_resource() : checks resource, requests memory region, ioremaps devm_ioremap_resource_wc() devm_platform_ioremap_resource() : calls devm_ioremap_resource() for platform device devm_platform_ioremap_resource_byname() devm_platform_get_and_ioremap_resource() devm_iounmap()”h]”hXtdevm_ioport_map() devm_ioport_unmap() devm_ioremap() devm_ioremap_uc() devm_ioremap_wc() devm_ioremap_resource() : checks resource, requests memory region, ioremaps devm_ioremap_resource_wc() devm_platform_ioremap_resource() : calls devm_ioremap_resource() for platform device devm_platform_ioremap_resource_byname() devm_platform_get_and_ioremap_resource() devm_iounmap()”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M:hjÊubhÌ)�”}”(hŒQNote: For the PCI devices the specific pcim_*() functions may be used, see below.”h]”hŒQNote: For the PCI devices the specific pcim_*() functions may be used, see below.”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MFhjÊubeh}”(h]”h ]”h"]”h$]”h&]”uh1jPhj¸ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´MFhj7h²hubj;)�”}”(hX8IRQ devm_free_irq() devm_request_any_context_irq() devm_request_irq() devm_request_threaded_irq() devm_irq_alloc_descs() devm_irq_alloc_desc() devm_irq_alloc_desc_at() devm_irq_alloc_desc_from() devm_irq_alloc_descs_from() devm_irq_alloc_generic_chip() devm_irq_setup_generic_chip() devm_irq_domain_create_sim() ”h]”(jA)�”}”(hŒIRQ”h]”hŒIRQ”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MThjõubjQ)�”}”(hhh]”hÌ)�”}”(hX3devm_free_irq() devm_request_any_context_irq() devm_request_irq() devm_request_threaded_irq() devm_irq_alloc_descs() devm_irq_alloc_desc() devm_irq_alloc_desc_at() devm_irq_alloc_desc_from() devm_irq_alloc_descs_from() devm_irq_alloc_generic_chip() devm_irq_setup_generic_chip() devm_irq_domain_create_sim()”h]”hX3devm_free_irq() devm_request_any_context_irq() devm_request_irq() devm_request_threaded_irq() devm_irq_alloc_descs() devm_irq_alloc_desc() devm_irq_alloc_desc_at() devm_irq_alloc_desc_from() devm_irq_alloc_descs_from() devm_irq_alloc_generic_chip() devm_irq_setup_generic_chip() devm_irq_domain_create_sim()”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MIhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjõubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´MThj7h²hubj;)�”}”(hŒ�LED devm_led_classdev_register() devm_led_classdev_register_ext() devm_led_classdev_unregister() devm_led_trigger_register() devm_of_led_get() ”h]”(jA)�”}”(hŒLED”h]”hŒLED”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M[hj$ubjQ)�”}”(hhh]”hÌ)�”}”(hŒŠdevm_led_classdev_register() devm_led_classdev_register_ext() devm_led_classdev_unregister() devm_led_trigger_register() devm_of_led_get()”h]”hŒŠdevm_led_classdev_register() devm_led_classdev_register_ext() devm_led_classdev_unregister() devm_led_trigger_register() devm_of_led_get()”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MWhj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M[hj7h²hubj;)�”}”(hŒgMDIO devm_mdiobus_alloc() devm_mdiobus_alloc_size() devm_mdiobus_register() devm_of_mdiobus_register() ”h]”(jA)�”}”(hŒMDIO”h]”hŒMDIO”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MahjSubjQ)�”}”(hhh]”hÌ)�”}”(hŒadevm_mdiobus_alloc() devm_mdiobus_alloc_size() devm_mdiobus_register() devm_of_mdiobus_register()”h]”hŒadevm_mdiobus_alloc() devm_mdiobus_alloc_size() devm_mdiobus_register() devm_of_mdiobus_register()”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M^hjeubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjSubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´Mahj7h²hubj;)�”}”(hŒ÷MEM devm_free_pages() devm_get_free_pages() devm_kasprintf() devm_kcalloc() devm_kfree() devm_kmalloc() devm_kmalloc_array() devm_kmemdup() devm_krealloc() devm_krealloc_array() devm_kstrdup() devm_kstrdup_const() devm_kvasprintf() devm_kzalloc() ”h]”(jA)�”}”(hŒMEM”h]”hŒMEM”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´Mqhj‚ubjQ)�”}”(hhh]”hÌ)�”}”(hŒòdevm_free_pages() devm_get_free_pages() devm_kasprintf() devm_kcalloc() devm_kfree() devm_kmalloc() devm_kmalloc_array() devm_kmemdup() devm_krealloc() devm_krealloc_array() devm_kstrdup() devm_kstrdup_const() devm_kvasprintf() devm_kzalloc()”h]”hŒòdevm_free_pages() devm_get_free_pages() devm_kasprintf() devm_kcalloc() devm_kfree() devm_kmalloc() devm_kmalloc_array() devm_kmemdup() devm_krealloc() devm_krealloc_array() devm_kstrdup() devm_kstrdup_const() devm_kvasprintf() devm_kzalloc()”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mdhj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj‚ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´Mqhj7h²hubj;)�”}”(hŒMFD devm_mfd_add_devices() ”h]”(jA)�”}”(hŒMFD”h]”hŒMFD”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´Mthj±ubjQ)�”}”(hhh]”hÌ)�”}”(hŒdevm_mfd_add_devices()”h]”hŒdevm_mfd_add_devices()”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MthjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj±ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´Mthj7h²hubj;)�”}”(hŒ_MUX devm_mux_chip_alloc() devm_mux_chip_register() devm_mux_control_get() devm_mux_state_get() ”h]”(jA)�”}”(hŒMUX”h]”hŒMUX”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MzhjàubjQ)�”}”(hhh]”hÌ)�”}”(hŒZdevm_mux_chip_alloc() devm_mux_chip_register() devm_mux_control_get() devm_mux_state_get()”h]”hŒZdevm_mux_chip_alloc() devm_mux_chip_register() devm_mux_control_get() devm_mux_state_get()”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mwhjòubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjàubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´Mzhj7h²hubj;)�”}”(hŒKNET devm_alloc_etherdev() devm_alloc_etherdev_mqs() devm_register_netdev() ”h]”(jA)�”}”(hŒNET”h]”hŒNET”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MhjubjQ)�”}”(hhh]”hÌ)�”}”(hŒFdevm_alloc_etherdev() devm_alloc_etherdev_mqs() devm_register_netdev()”h]”hŒFdevm_alloc_etherdev() devm_alloc_etherdev_mqs() devm_register_netdev()”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M}hj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´Mhj7h²hubj;)�”}”(hŒ PER-CPU MEM devm_alloc_percpu() ”h]”(jA)�”}”(hŒ PER-CPU MEM”h]”hŒ PER-CPU MEM”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M‚hj>ubjQ)�”}”(hhh]”hÌ)�”}”(hŒdevm_alloc_percpu()”h]”hŒdevm_alloc_percpu()”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M‚hjPubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj>ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M‚hj7h²hubj;)�”}”(hXãPCI devm_pci_alloc_host_bridge() : managed PCI host bridge allocation devm_pci_remap_cfgspace() : ioremap PCI configuration space devm_pci_remap_cfg_resource() : ioremap PCI configuration space resource pcim_enable_device() : after success, the PCI device gets disabled automatically on driver detach pcim_iomap() : do iomap() on a single BAR pcim_iomap_regions() : do request_region() and iomap() on multiple BARs pcim_iomap_table() : array of mapped addresses indexed by BAR pcim_iounmap() : do iounmap() on a single BAR pcim_pin_device() : keep PCI device enabled after release pcim_set_mwi() : enable Memory-Write-Invalidate PCI transaction ”h]”(jA)�”}”(hŒPCI”h]”hŒPCI”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M�hjmubjQ)�”}”(hhh]”(hÌ)�”}”(hŒËdevm_pci_alloc_host_bridge() : managed PCI host bridge allocation devm_pci_remap_cfgspace() : ioremap PCI configuration space devm_pci_remap_cfg_resource() : ioremap PCI configuration space resource”h]”hŒËdevm_pci_alloc_host_bridge() : managed PCI host bridge allocation devm_pci_remap_cfgspace() : ioremap PCI configuration space devm_pci_remap_cfg_resource() : ioremap PCI configuration space resource”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M…hjubhÌ)�”}”(hXpcim_enable_device() : after success, the PCI device gets disabled automatically on driver detach pcim_iomap() : do iomap() on a single BAR pcim_iomap_regions() : do request_region() and iomap() on multiple BARs pcim_iomap_table() : array of mapped addresses indexed by BAR pcim_iounmap() : do iounmap() on a single BAR pcim_pin_device() : keep PCI device enabled after release pcim_set_mwi() : enable Memory-Write-Invalidate PCI transaction”h]”hXpcim_enable_device() : after success, the PCI device gets disabled automatically on driver detach pcim_iomap() : do iomap() on a single BAR pcim_iomap_regions() : do request_region() and iomap() on multiple BARs pcim_iomap_table() : array of mapped addresses indexed by BAR pcim_iounmap() : do iounmap() on a single BAR pcim_pin_device() : keep PCI device enabled after release pcim_set_mwi() : enable Memory-Write-Invalidate PCI transaction”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M‰hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jPhjmubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M�hj7h²hubj;)�”}”(hŒPPHY devm_usb_get_phy() devm_usb_get_phy_by_node() devm_usb_get_phy_by_phandle() ”h]”(jA)�”}”(hŒPHY”h]”hŒPHY”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M”hjªubjQ)�”}”(hhh]”hÌ)�”}”(hŒKdevm_usb_get_phy() devm_usb_get_phy_by_node() devm_usb_get_phy_by_phandle()”h]”hŒKdevm_usb_get_phy() devm_usb_get_phy_by_node() devm_usb_get_phy_by_phandle()”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M’hj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjªubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M”hj7h²hubj;)�”}”(hŒ�PINCTRL devm_pinctrl_get() devm_pinctrl_put() devm_pinctrl_get_select() devm_pinctrl_register() devm_pinctrl_register_and_init() ”h]”(jA)�”}”(hŒPINCTRL”h]”hŒPINCTRL”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M›hjÙubjQ)�”}”(hhh]”hÌ)�”}”(hŒxdevm_pinctrl_get() devm_pinctrl_put() devm_pinctrl_get_select() devm_pinctrl_register() devm_pinctrl_register_and_init()”h]”hŒxdevm_pinctrl_get() devm_pinctrl_put() devm_pinctrl_get_select() devm_pinctrl_register() devm_pinctrl_register_and_init()”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M—hjëubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjÙubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M›hj7h²hubj;)�”}”(hŒ@POWER devm_reboot_mode_register() devm_reboot_mode_unregister() ”h]”(jA)�”}”(hŒPOWER”h]”hŒPOWER”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MŸhjubjQ)�”}”(hhh]”hÌ)�”}”(hŒ9devm_reboot_mode_register() devm_reboot_mode_unregister()”h]”hŒ9devm_reboot_mode_register() devm_reboot_mode_unregister()”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mžhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´MŸhj7h²hubj;)�”}”(hŒQPWM devm_pwmchip_alloc() devm_pwmchip_add() devm_pwm_get() devm_fwnode_pwm_get() ”h]”(jA)�”}”(hŒPWM”h]”hŒPWM”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M¥hj7ubjQ)�”}”(hhh]”hÌ)�”}”(hŒLdevm_pwmchip_alloc() devm_pwmchip_add() devm_pwm_get() devm_fwnode_pwm_get()”h]”hŒLdevm_pwmchip_alloc() devm_pwmchip_add() devm_pwm_get() devm_fwnode_pwm_get()”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M¢hjIubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj7ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M¥hj7h²hubj;)�”}”(hX!REGULATOR devm_regulator_bulk_register_supply_alias() devm_regulator_bulk_get() devm_regulator_bulk_get_const() devm_regulator_bulk_get_enable() devm_regulator_bulk_put() devm_regulator_get() devm_regulator_get_enable() devm_regulator_get_enable_read_voltage() devm_regulator_get_enable_optional() devm_regulator_get_exclusive() devm_regulator_get_optional() devm_regulator_irq_helper() devm_regulator_put() devm_regulator_register() devm_regulator_register_notifier() devm_regulator_register_supply_alias() devm_regulator_unregister_notifier() ”h]”(jA)�”}”(hŒ REGULATOR”h]”hŒ REGULATOR”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M¸hjfubjQ)�”}”(hhh]”hÌ)�”}”(hXdevm_regulator_bulk_register_supply_alias() devm_regulator_bulk_get() devm_regulator_bulk_get_const() devm_regulator_bulk_get_enable() devm_regulator_bulk_put() devm_regulator_get() devm_regulator_get_enable() devm_regulator_get_enable_read_voltage() devm_regulator_get_enable_optional() devm_regulator_get_exclusive() devm_regulator_get_optional() devm_regulator_irq_helper() devm_regulator_put() devm_regulator_register() devm_regulator_register_notifier() devm_regulator_register_supply_alias() devm_regulator_unregister_notifier()”h]”hXdevm_regulator_bulk_register_supply_alias() devm_regulator_bulk_get() devm_regulator_bulk_get_const() devm_regulator_bulk_get_enable() devm_regulator_bulk_put() devm_regulator_get() devm_regulator_get_enable() devm_regulator_get_enable_read_voltage() devm_regulator_get_enable_optional() devm_regulator_get_exclusive() devm_regulator_get_optional() devm_regulator_irq_helper() devm_regulator_put() devm_regulator_register() devm_regulator_register_notifier() devm_regulator_register_supply_alias() devm_regulator_unregister_notifier()”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M¨hjxubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjfubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M¸hj7h²hubj;)�”}”(hŒ@RESET devm_reset_control_get() devm_reset_controller_register() ”h]”(jA)�”}”(hŒRESET”h]”hŒRESET”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´M¼hj•ubjQ)�”}”(hhh]”hÌ)�”}”(hŒ9devm_reset_control_get() devm_reset_controller_register()”h]”hŒ9devm_reset_control_get() devm_reset_controller_register()”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M»hj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´M¼hj7h²hubj;)�”}”(hŒoRTC devm_rtc_device_register() devm_rtc_allocate_device() devm_rtc_register_device() devm_rtc_nvmem_register() ”h]”(jA)�”}”(hŒRTC”h]”hŒRTC”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MÂhjÄubjQ)�”}”(hhh]”hÌ)�”}”(hŒjdevm_rtc_device_register() devm_rtc_allocate_device() devm_rtc_register_device() devm_rtc_nvmem_register()”h]”hŒjdevm_rtc_device_register() devm_rtc_allocate_device() devm_rtc_register_device() devm_rtc_nvmem_register()”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M¿hjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjÄubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´MÂhj7h²hubj;)�”}”(hŒ!SERDEV devm_serdev_device_open() ”h]”(jA)�”}”(hŒSERDEV”h]”hŒSERDEV”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MÅhjóubjQ)�”}”(hhh]”hÌ)�”}”(hŒdevm_serdev_device_open()”h]”hŒdevm_serdev_device_open()”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MÅhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjóubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´MÅhj7h²hubj;)�”}”(hŒ5SLAVE DMA ENGINE devm_acpi_dma_controller_register() ”h]”(jA)�”}”(hŒSLAVE DMA ENGINE”h]”hŒSLAVE DMA ENGINE”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MÈhj"ubjQ)�”}”(hhh]”hÌ)�”}”(hŒ#devm_acpi_dma_controller_register()”h]”hŒ#devm_acpi_dma_controller_register()”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MÈhj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´MÈhj7h²hubj;)�”}”(hŒ¡SPI devm_spi_alloc_host() devm_spi_alloc_target() devm_spi_optimize_message() devm_spi_register_controller() devm_spi_register_host() devm_spi_register_target() ”h]”(jA)�”}”(hŒSPI”h]”hŒSPI”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MÐhjQubjQ)�”}”(hhh]”hÌ)�”}”(hŒœdevm_spi_alloc_host() devm_spi_alloc_target() devm_spi_optimize_message() devm_spi_register_controller() devm_spi_register_host() devm_spi_register_target()”h]”hŒœdevm_spi_alloc_host() devm_spi_alloc_target() devm_spi_optimize_message() devm_spi_register_controller() devm_spi_register_host() devm_spi_register_target()”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MËhjcubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjQubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´MÐhj7h²hubj;)�”}”(hŒ)WATCHDOG devm_watchdog_register_device() ”h]”(jA)�”}”(hŒWATCHDOG”h]”hŒWATCHDOG”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MÓhj€ubjQ)�”}”(hhh]”hÌ)�”}”(hŒdevm_watchdog_register_device()”h]”hŒdevm_watchdog_register_device()”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MÓhj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj€ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´MÓhj7h²hubj;)�”}”(hŒ?WORKQUEUE devm_alloc_workqueue() devm_alloc_ordered_workqueue()”h]”(jA)�”}”(hŒ WORKQUEUE”h]”hŒ WORKQUEUE”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´MÖhj¯ubjQ)�”}”(hhh]”hÌ)�”}”(hŒ5devm_alloc_workqueue() devm_alloc_ordered_workqueue()”h]”hŒ5devm_alloc_workqueue() devm_alloc_ordered_workqueue()”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MÖhjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj¯ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j:h³hÊh´MÖhj7h²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1j5hj$h²hh³hÊh´Nubeh}”(h]”Œlist-of-managed-interfaces”ah ]”h"]”Œ6. list of managed interfaces”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kóubeh}”(h]”Œdevres-managed-device-resource”ah ]”h"]”Œ devres - managed device resource”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jñjîj_j\j j j�jŠjÞjÛj!jjéjæuŒ nametypes”}”(jñ‰j_‰j ‰j�‰jÞ‰j!‰jé‰uh}”(jîh·j\jj jbjŠjjÛj�jjájæj$uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.