diff options
author | Hauke Mehrtens <hauke@hauke-m.de> | 2023-01-22 19:08:04 +0100 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2023-02-03 11:59:07 +0100 |
commit | 30c0ffecccbe6fe8e2289bed33027f9e2507039a (patch) | |
tree | 7132ee65bcde755ce67cbfc73a06edb705da5bb3 /target/linux/bcm47xx/patches-5.15/106-v5.18-mtd-rawnand-brcmnand-Allow-platform-data-instantation.patch | |
parent | 822c554d5755301337bce959554bf973b4292322 (diff) | |
download | upstream-30c0ffecccbe6fe8e2289bed33027f9e2507039a.tar.gz upstream-30c0ffecccbe6fe8e2289bed33027f9e2507039a.tar.bz2 upstream-30c0ffecccbe6fe8e2289bed33027f9e2507039a.zip |
bcm47xx: Copy kernel from 5.10 to 5.15
Copy patches and configuration from kernel 5.10 to kernel 5.15 files. No
changes were done.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Diffstat (limited to 'target/linux/bcm47xx/patches-5.15/106-v5.18-mtd-rawnand-brcmnand-Allow-platform-data-instantation.patch')
-rw-r--r-- | target/linux/bcm47xx/patches-5.15/106-v5.18-mtd-rawnand-brcmnand-Allow-platform-data-instantation.patch | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/target/linux/bcm47xx/patches-5.15/106-v5.18-mtd-rawnand-brcmnand-Allow-platform-data-instantation.patch b/target/linux/bcm47xx/patches-5.15/106-v5.18-mtd-rawnand-brcmnand-Allow-platform-data-instantation.patch new file mode 100644 index 0000000000..fb9ee07d04 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.15/106-v5.18-mtd-rawnand-brcmnand-Allow-platform-data-instantation.patch @@ -0,0 +1,124 @@ +From: Florian Fainelli <f.fainelli@gmail.com> +Subject: [PATCH v3 7/9] mtd: rawnand: brcmnand: Allow platform data instantation +Date: Fri, 07 Jan 2022 10:46:12 -0800 +Content-Type: text/plain; charset="utf-8" + +Make use of the recently refactored code in brcmnand_init_cs() and +derive the chip-select from the platform data that is supplied. Update +the various code paths to avoid relying on possibly non-existent +resources, too. + +Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> +--- + drivers/mtd/nand/raw/brcmnand/brcmnand.c | 45 ++++++++++++++++++------ + 1 file changed, 35 insertions(+), 10 deletions(-) + +--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +@@ -9,6 +9,7 @@ + #include <linux/delay.h> + #include <linux/device.h> + #include <linux/platform_device.h> ++#include <linux/platform_data/brcmnand.h> + #include <linux/err.h> + #include <linux/completion.h> + #include <linux/interrupt.h> +@@ -2719,7 +2720,8 @@ static const struct nand_controller_ops + .attach_chip = brcmnand_attach_chip, + }; + +-static int brcmnand_init_cs(struct brcmnand_host *host) ++static int brcmnand_init_cs(struct brcmnand_host *host, ++ const char * const *part_probe_types) + { + struct brcmnand_controller *ctrl = host->ctrl; + struct device *dev = ctrl->dev; +@@ -2772,7 +2774,7 @@ static int brcmnand_init_cs(struct brcmn + if (ret) + return ret; + +- ret = mtd_device_register(mtd, NULL, 0); ++ ret = mtd_device_parse_register(mtd, part_probe_types, NULL, NULL, 0); + if (ret) + nand_cleanup(chip); + +@@ -2941,17 +2943,15 @@ static int brcmnand_edu_setup(struct pla + + int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) + { ++ struct brcmnand_platform_data *pd = dev_get_platdata(&pdev->dev); + struct device *dev = &pdev->dev; + struct device_node *dn = dev->of_node, *child; + struct brcmnand_controller *ctrl; ++ struct brcmnand_host *host; + struct resource *res; + int ret; + +- /* We only support device-tree instantiation */ +- if (!dn) +- return -ENODEV; +- +- if (!of_match_node(brcmnand_of_match, dn)) ++ if (dn && !of_match_node(brcmnand_of_match, dn)) + return -ENODEV; + + ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL); +@@ -2978,7 +2978,7 @@ int brcmnand_probe(struct platform_devic + /* NAND register range */ + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + ctrl->nand_base = devm_ioremap_resource(dev, res); +- if (IS_ERR(ctrl->nand_base)) ++ if (IS_ERR(ctrl->nand_base) && !brcmnand_soc_has_ops(soc)) + return PTR_ERR(ctrl->nand_base); + + /* Enable clock before using NAND registers */ +@@ -3122,7 +3122,6 @@ int brcmnand_probe(struct platform_devic + + for_each_available_child_of_node(dn, child) { + if (of_device_is_compatible(child, "brcm,nandcs")) { +- struct brcmnand_host *host; + + host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); + if (!host) { +@@ -3142,7 +3141,7 @@ int brcmnand_probe(struct platform_devic + + nand_set_flash_node(&host->chip, child); + +- ret = brcmnand_init_cs(host); ++ ret = brcmnand_init_cs(host, NULL); + if (ret) { + devm_kfree(dev, host); + continue; /* Try all chip-selects */ +@@ -3152,6 +3151,32 @@ int brcmnand_probe(struct platform_devic + } + } + ++ if (!list_empty(&ctrl->host_list)) ++ return 0; ++ ++ if (!pd) { ++ ret = -ENODEV; ++ goto err; ++ } ++ ++ /* If we got there we must have been probing via platform data */ ++ host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); ++ if (!host) { ++ ret = -ENOMEM; ++ goto err; ++ } ++ host->pdev = pdev; ++ host->ctrl = ctrl; ++ host->cs = pd->chip_select; ++ host->chip.ecc.size = pd->ecc_stepsize; ++ host->chip.ecc.strength = pd->ecc_strength; ++ ++ ret = brcmnand_init_cs(host, pd->part_probe_types); ++ if (ret) ++ goto err; ++ ++ list_add_tail(&host->node, &ctrl->host_list); ++ + /* No chip-selects could initialize properly */ + if (list_empty(&ctrl->host_list)) { + ret = -ENODEV; |