From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 08:20:59 +0000
Subject: [PATCH] kernel_5.10 no rt

---
 kernel/drivers/mmc/host/rk_sdmmc_ops.c |   20 +++++++++++++++++---
 1 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/kernel/drivers/mmc/host/rk_sdmmc_ops.c b/kernel/drivers/mmc/host/rk_sdmmc_ops.c
index 96f20d2..d0ef613 100644
--- a/kernel/drivers/mmc/host/rk_sdmmc_ops.c
+++ b/kernel/drivers/mmc/host/rk_sdmmc_ops.c
@@ -22,6 +22,8 @@
 #include <linux/seq_file.h>
 #include <linux/mutex.h>
 #include <linux/miscdevice.h>
+#include <linux/pm.h>
+#include <linux/pm_runtime.h>
 #include "../core/block.h"
 #include "../core/card.h"
 #include "../core/core.h"
@@ -131,7 +133,7 @@
 /*
  * Transfer a single sector of kernel addressable data
  */
-int rk_emmc_transfer(u8 *buffer, unsigned addr, unsigned blksz, int write)
+int rk_emmc_transfer(u8 *buffer, unsigned int addr, unsigned int datasz, int write)
 {
 	int ret = 0;
 	enum emmc_area_type areatype;
@@ -150,11 +152,18 @@
 	mrq.data = &data;
 	mrq.stop = &stop;
 
-	sg_init_one(&sg, buffer, blksz);
+	sg_init_one(&sg, buffer, datasz);
 
-	rk_emmc_prepare_mrq(&mrq, &sg, 1, addr, 1, blksz, write);
+	rk_emmc_prepare_mrq(&mrq, &sg, 1, addr, datasz / BLKSZ, BLKSZ, write);
 
+	pm_runtime_get_sync(&this_card->dev);
 	mmc_claim_host(this_card->host);
+
+	if (this_card->ext_csd.cmdq_en) {
+		ret = mmc_cmdq_disable(this_card);
+		if (ret)
+			goto exit;
+	}
 
 	areatype = (enum emmc_area_type)this_card->ext_csd.part_config
 		    & EXT_CSD_PART_CONFIG_ACC_MASK;
@@ -186,7 +195,12 @@
 	}
 
 exit:
+	if (this_card->reenable_cmdq && !this_card->ext_csd.cmdq_en)
+		mmc_cmdq_enable(this_card);
+
 	mmc_release_host(this_card->host);
+	pm_runtime_put(&this_card->dev);
+
 	return ret;
 }
 EXPORT_SYMBOL(rk_emmc_transfer);

--
Gitblit v1.6.2