162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef LINUX_MMC_HSQ_H
362306a36Sopenharmony_ci#define LINUX_MMC_HSQ_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#define HSQ_NUM_SLOTS	64
662306a36Sopenharmony_ci#define HSQ_INVALID_TAG	HSQ_NUM_SLOTS
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistruct hsq_slot {
962306a36Sopenharmony_ci	struct mmc_request *mrq;
1062306a36Sopenharmony_ci};
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cistruct mmc_hsq {
1362306a36Sopenharmony_ci	struct mmc_host *mmc;
1462306a36Sopenharmony_ci	struct mmc_request *mrq;
1562306a36Sopenharmony_ci	wait_queue_head_t wait_queue;
1662306a36Sopenharmony_ci	struct hsq_slot *slot;
1762306a36Sopenharmony_ci	spinlock_t lock;
1862306a36Sopenharmony_ci	struct work_struct retry_work;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	int next_tag;
2162306a36Sopenharmony_ci	int num_slots;
2262306a36Sopenharmony_ci	int qcnt;
2362306a36Sopenharmony_ci	int tail_tag;
2462306a36Sopenharmony_ci	int tag_slot[HSQ_NUM_SLOTS];
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	bool enabled;
2762306a36Sopenharmony_ci	bool waiting_for_idle;
2862306a36Sopenharmony_ci	bool recovery_halt;
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ciint mmc_hsq_init(struct mmc_hsq *hsq, struct mmc_host *mmc);
3262306a36Sopenharmony_civoid mmc_hsq_suspend(struct mmc_host *mmc);
3362306a36Sopenharmony_ciint mmc_hsq_resume(struct mmc_host *mmc);
3462306a36Sopenharmony_cibool mmc_hsq_finalize_request(struct mmc_host *mmc, struct mmc_request *mrq);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#endif
37