162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/drivers/mmc/core/host.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 2003 Russell King, All Rights Reserved.
662306a36Sopenharmony_ci *  Copyright 2007 Pierre Ossman
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#ifndef _MMC_CORE_HOST_H
962306a36Sopenharmony_ci#define _MMC_CORE_HOST_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/mmc/host.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ciint mmc_register_host_class(void);
1462306a36Sopenharmony_civoid mmc_unregister_host_class(void);
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_civoid mmc_retune_enable(struct mmc_host *host);
1762306a36Sopenharmony_civoid mmc_retune_disable(struct mmc_host *host);
1862306a36Sopenharmony_civoid mmc_retune_hold(struct mmc_host *host);
1962306a36Sopenharmony_civoid mmc_retune_release(struct mmc_host *host);
2062306a36Sopenharmony_ciint mmc_retune(struct mmc_host *host);
2162306a36Sopenharmony_civoid mmc_retune_pause(struct mmc_host *host);
2262306a36Sopenharmony_civoid mmc_retune_unpause(struct mmc_host *host);
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic inline void mmc_retune_clear(struct mmc_host *host)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	host->retune_now = 0;
2762306a36Sopenharmony_ci	host->need_retune = 0;
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistatic inline void mmc_retune_hold_now(struct mmc_host *host)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	host->retune_now = 0;
3362306a36Sopenharmony_ci	host->hold_retune += 1;
3462306a36Sopenharmony_ci}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cistatic inline void mmc_retune_recheck(struct mmc_host *host)
3762306a36Sopenharmony_ci{
3862306a36Sopenharmony_ci	if (host->hold_retune <= 1)
3962306a36Sopenharmony_ci		host->retune_now = 1;
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic inline int mmc_host_cmd23(struct mmc_host *host)
4362306a36Sopenharmony_ci{
4462306a36Sopenharmony_ci	return host->caps & MMC_CAP_CMD23;
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistatic inline bool mmc_host_done_complete(struct mmc_host *host)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	return host->caps & MMC_CAP_DONE_COMPLETE;
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic inline int mmc_boot_partition_access(struct mmc_host *host)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC);
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic inline int mmc_host_uhs(struct mmc_host *host)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	return host->caps &
6062306a36Sopenharmony_ci		(MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
6162306a36Sopenharmony_ci		 MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 |
6262306a36Sopenharmony_ci		 MMC_CAP_UHS_DDR50) &&
6362306a36Sopenharmony_ci	       host->caps & MMC_CAP_4_BIT_DATA;
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistatic inline bool mmc_card_hs200(struct mmc_card *card)
6762306a36Sopenharmony_ci{
6862306a36Sopenharmony_ci	return card->host->ios.timing == MMC_TIMING_MMC_HS200;
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistatic inline bool mmc_card_ddr52(struct mmc_card *card)
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	return card->host->ios.timing == MMC_TIMING_MMC_DDR52;
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic inline bool mmc_card_hs400(struct mmc_card *card)
7762306a36Sopenharmony_ci{
7862306a36Sopenharmony_ci	return card->host->ios.timing == MMC_TIMING_MMC_HS400;
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic inline bool mmc_card_hs400es(struct mmc_card *card)
8262306a36Sopenharmony_ci{
8362306a36Sopenharmony_ci	return card->host->ios.enhanced_strobe;
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic inline bool mmc_card_sd_express(struct mmc_host *host)
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci	return host->ios.timing == MMC_TIMING_SD_EXP ||
8962306a36Sopenharmony_ci		host->ios.timing == MMC_TIMING_SD_EXP_1_2V;
9062306a36Sopenharmony_ci}
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#endif
9362306a36Sopenharmony_ci
94