From mboxrd@z Thu Jan 1 00:00:00 1970 From: per.forlin@linaro.org (Per Forlin) Date: Fri, 17 Jun 2011 12:15:55 +0200 Subject: [PATCH v4 03/12] omap_hsmmc: add support for pre_req and post_req In-Reply-To: References: <1306360653-6196-1-git-send-email-per.forlin@linaro.org> <1306360653-6196-4-git-send-email-per.forlin@linaro.org> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 16 June 2011 15:14, S, Venkatraman wrote: > On Thu, May 26, 2011 at 3:27 AM, Per Forlin wrote: >> pre_req() runs dma_map_sg(), post_req() runs dma_unmap_sg. >> If not calling pre_req() before omap_hsmmc_request() >> dma_map_sg will be issued before starting the transfer. >> It is optional to use pre_req(). If issuing pre_req() >> post_req() must be to be called as well. >> >> Signed-off-by: Per Forlin >> --- >> ?drivers/mmc/host/omap_hsmmc.c | ? 87 +++++++++++++++++++++++++++++++++++++++-- >> ?1 files changed, 83 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c >> index ad3731a..2116c09 100644 >> --- a/drivers/mmc/host/omap_hsmmc.c >> +++ b/drivers/mmc/host/omap_hsmmc.c >> @@ -141,6 +141,11 @@ >> ?#define OMAP_HSMMC_WRITE(base, reg, val) \ >> ? ? ? ?__raw_writel((val), (base) + OMAP_HSMMC_##reg) >> >> +struct omap_hsmmc_next { >> + ? ? ? unsigned int ? ?dma_len; >> + ? ? ? s32 ? ? ? ? ? ? cookie; >> +}; >> + >> ?struct omap_hsmmc_host { >> ? ? ? ?struct ?device ? ? ? ? ?*dev; >> ? ? ? ?struct ?mmc_host ? ? ? ?*mmc; >> @@ -184,6 +189,7 @@ struct omap_hsmmc_host { >> ? ? ? ?int ? ? ? ? ? ? ? ? ? ? reqs_blocked; >> ? ? ? ?int ? ? ? ? ? ? ? ? ? ? use_reg; >> ? ? ? ?int ? ? ? ? ? ? ? ? ? ? req_in_progress; >> + ? ? ? struct omap_hsmmc_next ?next_data; >> >> ? ? ? ?struct ?omap_mmc_platform_data ?*pdata; >> ?}; >> @@ -1344,8 +1350,9 @@ static void omap_hsmmc_dma_cb(int lch, u16 ch_status, void *cb_data) >> ? ? ? ? ? ? ? ?return; >> ? ? ? ?} >> >> - ? ? ? dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, >> - ? ? ? ? ? ? ? omap_hsmmc_get_dma_dir(host, data)); >> + ? ? ? if (!data->host_cookie) >> + ? ? ? ? ? ? ? dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ?omap_hsmmc_get_dma_dir(host, data)); >> >> ? ? ? ?req_in_progress = host->req_in_progress; >> ? ? ? ?dma_ch = host->dma_ch; >> @@ -1363,6 +1370,45 @@ static void omap_hsmmc_dma_cb(int lch, u16 ch_status, void *cb_data) >> ? ? ? ?} >> ?} >> >> +static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct mmc_data *data, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct omap_hsmmc_next *next) >> +{ > > As you are passing &host->next_data into next, next will always be a > valid pointer. So.. > omap_hsmmc_pre_dma_transfer() is called from two places. in pre_req() and start_dma_transfer(). next is NULL if called from start_dma_transfer. /Per