xref: /openbmc/linux/drivers/mmc/host/mmc_hsq.h (revision e026a3f9)
1511ce378SBaolin Wang /* SPDX-License-Identifier: GPL-2.0 */
2511ce378SBaolin Wang #ifndef LINUX_MMC_HSQ_H
3511ce378SBaolin Wang #define LINUX_MMC_HSQ_H
4511ce378SBaolin Wang 
5*e026a3f9SMichael Wu #define HSQ_NUM_SLOTS	64
6*e026a3f9SMichael Wu #define HSQ_INVALID_TAG	HSQ_NUM_SLOTS
7*e026a3f9SMichael Wu 
8511ce378SBaolin Wang struct hsq_slot {
9511ce378SBaolin Wang 	struct mmc_request *mrq;
10511ce378SBaolin Wang };
11511ce378SBaolin Wang 
12511ce378SBaolin Wang struct mmc_hsq {
13511ce378SBaolin Wang 	struct mmc_host *mmc;
14511ce378SBaolin Wang 	struct mmc_request *mrq;
15511ce378SBaolin Wang 	wait_queue_head_t wait_queue;
16511ce378SBaolin Wang 	struct hsq_slot *slot;
17511ce378SBaolin Wang 	spinlock_t lock;
186db96e58SBaolin Wang 	struct work_struct retry_work;
19511ce378SBaolin Wang 
20511ce378SBaolin Wang 	int next_tag;
21511ce378SBaolin Wang 	int num_slots;
22511ce378SBaolin Wang 	int qcnt;
23*e026a3f9SMichael Wu 	int tail_tag;
24*e026a3f9SMichael Wu 	int tag_slot[HSQ_NUM_SLOTS];
25511ce378SBaolin Wang 
26511ce378SBaolin Wang 	bool enabled;
27511ce378SBaolin Wang 	bool waiting_for_idle;
28511ce378SBaolin Wang 	bool recovery_halt;
29511ce378SBaolin Wang };
30511ce378SBaolin Wang 
31511ce378SBaolin Wang int mmc_hsq_init(struct mmc_hsq *hsq, struct mmc_host *mmc);
32511ce378SBaolin Wang void mmc_hsq_suspend(struct mmc_host *mmc);
33511ce378SBaolin Wang int mmc_hsq_resume(struct mmc_host *mmc);
34511ce378SBaolin Wang bool mmc_hsq_finalize_request(struct mmc_host *mmc, struct mmc_request *mrq);
35511ce378SBaolin Wang 
36511ce378SBaolin Wang #endif
37