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 <a.fatoum@xxxxxxxxxxxxxx> --- v1 -> v2: - apply to all controllers that have broken-cd and not only to probed ones (Sascha) --- 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 26b524007609..82f39d8fc9b8 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 @@ -1989,6 +2014,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