Skip to content

Commit

Permalink
mmc: sdhci-esdhc-mcf: Use sg_miter for swapping
Browse files Browse the repository at this point in the history
Use sg_miter iterator instead of sg_virt() and custom code
to loop over the scatterlist. The memory iterator will do
bounce buffering if the page happens to be located in high memory,
which the driver may or may not be using.

Suggested-by: Christoph Hellwig <[email protected]>
Link: https://lore.kernel.org/linux-mmc/[email protected]/
Signed-off-by: Linus Walleij <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Ulf Hansson <[email protected]>
  • Loading branch information
linusw authored and storulf committed Feb 13, 2024
1 parent 68cfdeb commit e8a167b
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions drivers/mmc/host/sdhci-esdhc-mcf.c
Original file line number Diff line number Diff line change
Expand Up @@ -299,9 +299,8 @@ static void esdhc_mcf_pltfm_set_bus_width(struct sdhci_host *host, int width)
static void esdhc_mcf_request_done(struct sdhci_host *host,
struct mmc_request *mrq)
{
struct scatterlist *sg;
struct sg_mapping_iter sgm;
u32 *buffer;
int i;

if (!mrq->data || !mrq->data->bytes_xfered)
goto exit_done;
Expand All @@ -313,10 +312,13 @@ static void esdhc_mcf_request_done(struct sdhci_host *host,
* On mcf5441x there is no hw sdma option/flag to select the dma
* transfer endiannes. A swap after the transfer is needed.
*/
for_each_sg(mrq->data->sg, sg, mrq->data->sg_len, i) {
buffer = (u32 *)sg_virt(sg);
esdhc_mcf_buffer_swap32(buffer, sg->length);
sg_miter_start(&sgm, mrq->data->sg, mrq->data->sg_len,
SG_MITER_TO_SG | SG_MITER_FROM_SG);
while (sg_miter_next(&sgm)) {
buffer = sgm.addr;
esdhc_mcf_buffer_swap32(buffer, sgm.length);
}
sg_miter_stop(&sgm);

exit_done:
mmc_request_done(host->mmc, mrq);
Expand Down

0 comments on commit e8a167b

Please sign in to comment.