On 14/11/19 7:19 PM, Ivan Mikhaylov wrote: > On Thu, 2019-11-14 at 15:10 +0200, Adrian Hunter wrote: >> On 14/11/19 2:54 PM, Ivan Mikhaylov wrote: >>> Change the default .get_cd callback. Add inverted signal card detection >>> check. >>> >>> Signed-off-by: Ivan Mikhaylov <i.mikhaylov@xxxxxxxxx> >>> >>> diff --git a/drivers/mmc/host/sdhci-of-aspeed.c b/drivers/mmc/host/sdhci-of- >>> aspeed.c >>> index 8962f6664381..186559ee8fcc 100644 >>> --- a/drivers/mmc/host/sdhci-of-aspeed.c >>> +++ b/drivers/mmc/host/sdhci-of-aspeed.c >>> @@ -143,6 +143,19 @@ static inline int aspeed_sdhci_calculate_slot(struct >>> aspeed_sdhci *dev, >>> return (delta / 0x100) - 1; >>> } >>> >>> +static int aspeed_get_cd(struct mmc_host *mmc) >>> +{ >>> + struct sdhci_host *host = mmc_priv(mmc); >>> + >>> + int present = !!(sdhci_readl(host, SDHCI_PRESENT_STATE) >>> + & SDHCI_CARD_PRESENT); >>> + >>> + if (mmc->caps2 & MMC_CAP2_CD_ACTIVE_HIGH) >>> + present = !present; >> >> Perhaps safer to flip the bit using CONFIG_MMC_SDHCI_IO_ACCESSORS and >> ->readl() callback >> > > Sorry, don't quite understand what you're saying. You want to instantiate > '.read_l' callback instead of '.get_cd' in sdhci_ops and substitute the real > value? > > res = readl(base, reg); > if (reg == SDHCI_PRESENT_STATE) > if (mmc->caps2 & MMC_CAP2_CD_ACTIVE_HIGH) > return !res; Presumably just flip the SDHCI_CARD_PRESENT bit i.e. return res ^ SDHCI_CARD_PRESENT; > return res; > > Something like this? Yes > >> >>> + host->mmc_host_ops.get_cd = aspeed_get_cd; >>> + if (of_property_read_bool(pdev->dev.of_node, "cd-inverted")) >>> + dev_info(&pdev->dev, "aspeed: sdhci: presence signal inversion >>> enabled\n"); >> >> Is this print really needed? >> > I can remove it if you think it's redundant. > > Thanks. > >