forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mtd: nand: ecc: Provide a helper to retrieve a pilelined engine device
In a pipelined engine situation, we might either have the host which internally has support for error correction, or have it using an external hardware block for this purpose. In the former case, the host is also the ECC engine. In the latter case, it is not. In order to get the right pointers on the right devices (for example: in order to devm_* allocate variables), let's introduce this helper which can safely be called by pipelined ECC engines in order to retrieve the right device structure. Signed-off-by: Miquel Raynal <[email protected]> Link: https://lore.kernel.org/linux-mtd/[email protected]
- Loading branch information
1 parent
48e6633
commit 5145abe
Showing
2 changed files
with
32 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -699,6 +699,37 @@ void nand_ecc_put_on_host_hw_engine(struct nand_device *nand) | |
} | ||
EXPORT_SYMBOL(nand_ecc_put_on_host_hw_engine); | ||
|
||
/* | ||
* In the case of a pipelined engine, the device registering the ECC | ||
* engine is not necessarily the ECC engine itself but may be a host controller. | ||
* It is then useful to provide a helper to retrieve the right device object | ||
* which actually represents the ECC engine. | ||
*/ | ||
struct device *nand_ecc_get_engine_dev(struct device *host) | ||
{ | ||
struct platform_device *ecc_pdev; | ||
struct device_node *np; | ||
|
||
/* | ||
* If the device node contains this property, it means we need to follow | ||
* it in order to get the right ECC engine device we are looking for. | ||
*/ | ||
np = of_parse_phandle(host->of_node, "nand-ecc-engine", 0); | ||
if (!np) | ||
return host; | ||
|
||
ecc_pdev = of_find_device_by_node(np); | ||
if (!ecc_pdev) { | ||
of_node_put(np); | ||
return NULL; | ||
} | ||
|
||
platform_device_put(ecc_pdev); | ||
of_node_put(np); | ||
|
||
return &ecc_pdev->dev; | ||
} | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Miquel Raynal <[email protected]>"); | ||
MODULE_DESCRIPTION("Generic ECC engine"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters