Skip to content

Commit

Permalink
sd: omit zero-initialization for sdhc_command and sdhc_data structures
Browse files Browse the repository at this point in the history
The decision to omit zero-initialization is driven by a desire to enhance
Zephyr's compactness and efficiency.

This is achieved by omitting zero-initialization, thereby reducing the
instruction count and, as a byproduct, the code size.

After a thorough review of the usage of struct sdhc_command and sdhc_data,
it has been determined that zero-initialization can be omitted.
Only a portion of the fields need to be manually initialized.
(e.g. cmd.retries, data.block_addr)

For the uninitialized fields, it can be expected from successful
operations that data will be appropriately written back from
the underlying layer.

Signed-off-by: Pisit Sawangvonganan <[email protected]>
  • Loading branch information
ndrs-pst authored and aescolar committed Jan 25, 2024
1 parent 612aa71 commit 8534c38
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 18 deletions.
6 changes: 3 additions & 3 deletions subsys/sd/sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ LOG_MODULE_REGISTER(sd, CONFIG_SD_LOG_LEVEL);
/* Idle all cards on bus. Can be used to clear errors on cards */
static inline int sd_idle(struct sd_card *card)
{
struct sdhc_command cmd = {0};
struct sdhc_command cmd;

/* Reset card with CMD0 */
cmd.opcode = SD_GO_IDLE_STATE;
Expand All @@ -35,7 +35,7 @@ static inline int sd_idle(struct sd_card *card)
/* Sends CMD8 during SD initialization */
static int sd_send_interface_condition(struct sd_card *card)
{
struct sdhc_command cmd = {0};
struct sdhc_command cmd;
int ret;
uint32_t resp;

Expand Down Expand Up @@ -72,7 +72,7 @@ static int sd_send_interface_condition(struct sd_card *card)
/* Sends CMD59 to enable CRC checking for SD card in SPI mode */
static int sd_enable_crc(struct sd_card *card)
{
struct sdhc_command cmd = {0};
struct sdhc_command cmd;

/* CMD59 for CRC mode is only valid for SPI hosts */
__ASSERT_NO_MSG(card->host_props.is_spi);
Expand Down
31 changes: 17 additions & 14 deletions subsys/sd/sd_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@ LOG_MODULE_DECLARE(sd, CONFIG_SD_LOG_LEVEL);
/* Read card status. Return 0 if card is inactive */
int sdmmc_read_status(struct sd_card *card)
{
struct sdhc_command cmd = {0};
struct sdhc_command cmd;
int ret;

cmd.opcode = SD_SEND_STATUS;
cmd.arg = 0;
if (!card->host_props.is_spi) {
cmd.arg = (card->relative_addr << 16U);
}
Expand Down Expand Up @@ -203,8 +204,8 @@ static inline void sdmmc_decode_cid(struct sd_cid *cid, uint32_t *raw_cid)
/* Reads card id/csd register (in SPI mode) */
static int sdmmc_spi_read_cxd(struct sd_card *card, uint32_t opcode, uint32_t *cxd)
{
struct sdhc_command cmd = {0};
struct sdhc_data data = {0};
struct sdhc_command cmd;
struct sdhc_data data;
int ret, i;
/* Use internal card buffer for data transfer */
uint32_t *cxd_be = (uint32_t *)card->card_buffer;
Expand All @@ -216,6 +217,7 @@ static int sdmmc_spi_read_cxd(struct sd_card *card, uint32_t opcode, uint32_t *c
cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;

/* CID/CSD is 16 bytes */
data.block_addr = 0; /* Unused set to 0 */
data.block_size = 16;
data.blocks = 1U;
data.data = cxd_be;
Expand All @@ -235,7 +237,7 @@ static int sdmmc_spi_read_cxd(struct sd_card *card, uint32_t opcode, uint32_t *c
/* Reads card id/csd register (native SD mode */
static int sdmmc_read_cxd(struct sd_card *card, uint32_t opcode, uint32_t rca, uint32_t *cxd)
{
struct sdhc_command cmd = {0};
struct sdhc_command cmd;
int ret;

cmd.opcode = opcode;
Expand Down Expand Up @@ -323,7 +325,7 @@ int card_read_cid(struct sd_card *card)
int sdmmc_switch_voltage(struct sd_card *card)
{
int ret, sd_clock;
struct sdhc_command cmd = {0};
struct sdhc_command cmd;

/* Check to make sure card supports 1.8V */
if (!(card->flags & SD_1800MV_FLAG)) {
Expand Down Expand Up @@ -408,7 +410,7 @@ int sdmmc_switch_voltage(struct sd_card *card)
*/
int sdmmc_request_rca(struct sd_card *card)
{
struct sdhc_command cmd = {0};
struct sdhc_command cmd;
int ret;

cmd.opcode = SD_SEND_RELATIVE_ADDR;
Expand All @@ -435,7 +437,7 @@ int sdmmc_request_rca(struct sd_card *card)
*/
int sdmmc_select_card(struct sd_card *card)
{
struct sdhc_command cmd = {0};
struct sdhc_command cmd;
int ret;

cmd.opcode = SD_SELECT_CARD;
Expand All @@ -460,7 +462,7 @@ int sdmmc_select_card(struct sd_card *card)
/* Helper to send SD app command */
int card_app_command(struct sd_card *card, int relative_card_address)
{
struct sdhc_command cmd = {0};
struct sdhc_command cmd;
int ret;

cmd.opcode = SD_APP_CMD;
Expand Down Expand Up @@ -489,8 +491,8 @@ int card_app_command(struct sd_card *card, int relative_card_address)
static int card_read(struct sd_card *card, uint8_t *rbuf, uint32_t start_block, uint32_t num_blocks)
{
int ret;
struct sdhc_command cmd = {0};
struct sdhc_data data = {0};
struct sdhc_command cmd;
struct sdhc_data data;

/*
* Note: The SD specification allows for CMD23 to be sent before a
Expand Down Expand Up @@ -611,8 +613,8 @@ int card_read_blocks(struct sd_card *card, uint8_t *rbuf, uint32_t start_block,
static int card_query_written(struct sd_card *card, uint32_t *num_written)
{
int ret;
struct sdhc_command cmd = {0};
struct sdhc_data data = {0};
struct sdhc_command cmd;
struct sdhc_data data;
uint32_t *blocks = (uint32_t *)card->card_buffer;

ret = card_app_command(card, card->relative_addr);
Expand All @@ -627,6 +629,7 @@ static int card_query_written(struct sd_card *card, uint32_t *num_written)
cmd.retries = CONFIG_SD_CMD_RETRIES;
cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;

data.block_addr = 0; /* Unused set to 0 */
data.block_size = 4U;
data.blocks = 1U;
data.data = blocks;
Expand All @@ -653,8 +656,8 @@ static int card_write(struct sd_card *card, const uint8_t *wbuf, uint32_t start_
{
int ret;
uint32_t blocks;
struct sdhc_command cmd = {0};
struct sdhc_data data = {0};
struct sdhc_command cmd;
struct sdhc_data data;

/*
* See the note in card_read() above. We will not issue CMD23
Expand Down
2 changes: 1 addition & 1 deletion subsys/sd/sd_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

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

Expand Down

0 comments on commit 8534c38

Please sign in to comment.