From 16931f8ef3bc2a5ecce5ae77c33e2b5611ac8d98 Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Mon, 25 Jul 2022 13:58:56 +0200 Subject: [PATCH 3/3] mci: core: fixup broken-cd information into kernel DT In remote labs co-located with other hardware, we've observed card detect levers of different boards to sporadically fail to detect the card, e.g. because the cable on the usbsdmux was yanked around by accident. When this happens, barebox usually boots up normally as the card detect is ignored and then Linux waits indefinitely for the card-detect to turn active. We already maintain a broken_cd flag for each card. Use this to fixup the kernel DT appropriately. Signed-off-by: Ahmad Fatoum --- drivers/mci/mci-core.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c index 5101ac1d8298..92dbdaf469fd 100644 --- a/drivers/mci/mci-core.c +++ b/drivers/mci/mci-core.c @@ -1739,6 +1739,31 @@ static int mci_register_partition(struct mci_part *part) return 0; } +static int of_broken_cd_fixup(struct device_node *root, void *ctx) +{ + struct mci_host *host = ctx; + struct device_d *hw_dev = host->hw_dev; + struct device_node *np; + char *name; + + if (!host->broken_cd) + return 0; + + name = of_get_reproducible_name(hw_dev->device_node); + np = of_find_node_by_reproducible_name(root, name); + free(name); + if (!np) { + dev_warn(hw_dev, "Cannot find nodepath %s, cannot fixup\n", + hw_dev->device_node->full_name); + return -EINVAL; + } + + of_property_write_bool(np, "cd-gpios", false); + of_property_write_bool(np, "broken-cd", true); + + return 0; +} + /** * Probe an MCI card at the given host interface * @param mci MCI device instance @@ -1979,6 +2004,9 @@ int mci_register(struct mci_host *host) if (IS_ENABLED(CONFIG_MCI_STARTUP)) mci_card_probe(mci); + if (!host->no_sd && dev_of_node(host->hw_dev)) + of_register_fixup(of_broken_cd_fixup, host); + list_add_tail(&mci->list, &mci_list); return 0; -- 2.30.2