u8 bus_width = 8;
struct sd_emmc_adjust *gadjust = (struct sd_emmc_adjust *)&adjust;
u32 blksz = 512;
- u8 *blk_test;
int ret = 0;
- blk_test = kmalloc(blksz * CALI_BLK_CNT, GFP_KERNEL);
- if (!blk_test)
- return -ENOMEM;
-
if (mmc->ios.bus_width == 0)
bus_width = 1;
else if (mmc->ios.bus_width == 2)
pdata->caling = 1;
aml_sd_emmc_cali_transfer(mmc,
MMC_READ_MULTIPLE_BLOCK,
- blk_test, blksz);
+ host->blk_test, blksz);
for (i = 0; i < 4; i++) {
cali_tmp[i] = readl(host->base
+ SD_EMMC_CALOUT + i*4);
pr_info("\n");
#endif
}
- kfree(blk_test);
- blk_test = NULL;
return ret;
}
u8 cal_per_line_num = 8;
struct sd_emmc_adjust *gadjust = (struct sd_emmc_adjust *)&adjust;
u32 blksz = 512;
- u8 *blk_test;
int ret = 0;
- blk_test = kmalloc(blksz * CALI_BLK_CNT, GFP_KERNEL);
- if (!blk_test)
- return -ENOMEM;
-
if (mmc->ios.bus_width == 0)
bus_width = 1;
else if (mmc->ios.bus_width == 2)
pdata->caling = 1;
aml_sd_emmc_cali_transfer(mmc,
MMC_READ_MULTIPLE_BLOCK,
- blk_test, blksz);
+ host->blk_test, blksz);
pdata->calout[dly_tmp][cal_time]
= readl(host->base + SD_EMMC_CALOUT)
& 0x3f;
}
#endif
}
- kfree(blk_test);
- blk_test = NULL;
return ret;
}
int adj_delay = 0;
const u8 *blk_pattern = tuning_data->blk_pattern;
unsigned int blksz = tuning_data->blksz;
- u8 *blk_test;
int wrap_win_start = -1, wrap_win_size = 0;
int best_win_start = -1, best_win_size = 0;
int curr_win_start = -1, curr_win_size = 0;
blksz = 512;
opcode = 17;
}
- blk_test = kmalloc(blksz, GFP_KERNEL);
- if (!blk_test)
- return -ENOMEM;
pr_info("%s: clk %d %s tuning start\n",
mmc_hostname(mmc), (ctrl->ddr ? (clock / 2) : clock),
gadjust->cali_rise = 0;
writel(adjust, host->base + SD_EMMC_ADJUST);
nmatch = aml_sd_emmc_tuning_transfer(mmc, opcode,
- blk_pattern, blk_test, blksz);
+ blk_pattern, host->blk_test, blksz);
/*get a ok adjust point!*/
if (nmatch == TUNING_NUM_PER_POINT) {
if (adj_delay == 0)
}
*best_start = best_win_start;
*best_size = best_win_size;
- kfree(blk_test);
return 0;
}
u8 steps, nmatch;
u8 rx_phase, rx_delay;
struct aml_emmc_rxclk *emmc_rxclk = &host->emmc_rxclk;
- u8 *blk_test;
u32 clock;
int rxclk_find;
u8 rx_tuning_result[25] = {0};
blksz = 512;
opcode = 17;
}
- blk_test = kmalloc(blksz, GFP_KERNEL);
- if (!blk_test)
- return -ENOMEM;
host->is_tunning = 1;
pr_info("%s: clk %d %s tuning start\n",
writel(vclk, host->base + SD_EMMC_CLOCK);
pdata->clkc = vclk;
nmatch = aml_sd_emmc_tuning_transfer(mmc, opcode,
- blk_pattern, blk_test, blksz);
+ blk_pattern, host->blk_test, blksz);
rx_tuning_result[rx_phase * 5 + rx_delay] = nmatch;
}
}
if (rxclk_find < 0) {
pr_info("%s: tuning failed\n", mmc_hostname(host->mmc));
- kfree(blk_test);
return -1;
} else if (rxclk_find < 10) {
rx_phase = 0;
emmc_rxclk->rxclk_rx_delay = rx_delay;
emmc_rxclk->rxclk_point = rxclk_find;
- kfree(blk_test);
return 0;
}
sd_emmc_err("%s: warning... response crc,vstat:0x%x,virqc:%x\n",
mmc_hostname(host->mmc),
vstat, virqc);
- pr_info("%s %d cmd:%d arg:0x%x ",
- __func__, __LINE__,
- mrq->cmd->opcode, mrq->cmd->arg);
host->status = HOST_RSP_CRC_ERR;
mrq->cmd->error = -EILSEQ;
} else if (ista->resp_timeout) {
}
if (err) {
- if (host->is_tunning == 0)
+ if (host->is_tunning == 0) {
aml_host_bus_fsm_show(host, ista->bus_fsm);
- if (aml_card_type_mmc(pdata))
- mmc_cmd_LBA_show(mmc, mrq);
+ if (aml_card_type_mmc(pdata))
+ mmc_cmd_LBA_show(mmc, mrq);
+ }
}
if (host->xfer_step == XFER_IRQ_UNKNOWN_IRQ)
if (ret)
goto free_host;
+ host->blk_test = kzalloc((512 * CALI_BLK_CNT), GFP_KERNEL);
+ if (host->blk_test == NULL) {
+ ret = -ENOMEM;
+ goto free_host;
+ }
/* data desc buffer */
host->desc_buf =
dma_alloc_coherent(host->dev,
if (host->desc_buf == NULL) {
dev_err(host->dev, "Unable to map allocate DMA desc buffer.\n");
ret = -ENOMEM;
- goto free_host;
+ goto free_cali;
}
/* data bounce buffer */
if (host->bn_buf == NULL) {
dev_err(host->dev, "Unable to map allocate DMA bounce buffer.\n");
ret = -ENOMEM;
- goto free_host;
+ goto free_cali;
}
host->pdata = pdata;
else
ret = meson_mmc_clk_init(host);
if (ret)
- goto free_host;
+ goto free_cali;
ret = mmc_of_parse(mmc);
if (ret) {
dev_warn(&pdev->dev, "error parsing DT: %d\n", ret);
- goto free_host;
+ goto free_cali;
}
if (amlsd_get_platform_data(pdev, pdata, mmc, 0))
ret = mmc_add_host(mmc);
if (ret) { /* error */
sd_emmc_err("Failed to add mmc host.\n");
- goto free_host;
+ goto free_cali;
}
if (aml_card_type_sdio(pdata)) /* if sdio_wifi */
sdio_host = mmc;
"amlsd_cd", host);
if (ret) {
sd_emmc_err("Failed to request SD IN detect\n");
- goto free_host;
+ goto free_cali;
}
}
pr_info("%s() : success!\n", __func__);
return 0;
+free_cali:
+ kfree(host->blk_test);
free_host:
mmc_free_host(mmc);
kfree(pdata);
if (host->core_clk)
clk_disable_unprepare(host->core_clk);
+ kfree(host->blk_test);
mmc_free_host(host->mmc);
kfree(pdata);
return 0;