/*
 * Copyright 2022 NXP
 *
 * SPDX-License-Identifier: Apache-2.0
 */


#ifndef ZEPHYR_SUBSYS_SD_SD_OPS_H_
#define ZEPHYR_SUBSYS_SD_SD_OPS_H_

/*
 * Switches voltage of SD card to 1.8V, as described by
 * "Signal volatage switch procedure" in section 3.6.1 of SD specification.
 */
int sdmmc_switch_voltage(struct sd_card *card);

/*
 * Reads card identification register, and decodes it
 */
int card_read_cid(struct sd_card *card);

/*
 * Read card specific data register
 */
int sdmmc_read_csd(struct sd_card *card);

/*
 * Requests card to publish a new relative card address, and move from
 * identification to data mode
 */
int sdmmc_request_rca(struct sd_card *card);

/*
 * Selects card, moving it into data transfer mode
 */
int sdmmc_select_card(struct sd_card *card);

/* Returns 1 if host supports UHS, zero otherwise */
static inline int sdmmc_host_uhs(struct sdhc_host_props *props)
{
	return (props->host_caps.sdr50_support |
		props->host_caps.uhs_2_support |
		props->host_caps.sdr104_support |
		props->host_caps.ddr50_support)
		& (props->host_caps.vol_180_support);
}

int card_ioctl(struct sd_card *card, uint8_t cmd, void *buf);

int card_read_blocks(struct sd_card *card, uint8_t *rbuf,
	uint32_t start_block, uint32_t num_blocks);

int card_write_blocks(struct sd_card *card, const uint8_t *wbuf,
	uint32_t start_block, uint32_t num_blocks);

int card_app_command(struct sd_card *card, int relative_card_address);

int sdmmc_read_status(struct sd_card *card);

int sdmmc_wait_ready(struct sd_card *card);

#endif /* ZEPHYR_SUBSYS_SD_SD_OPS_H_ */
