From 15ade055295d13f95d49e3d99b09f3bbfb4a43e7 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 07:25:24 +0000
Subject: [PATCH] add at24 driver

---
 kernel/drivers/video/rockchip/rga3/rga_drv.c |  201 +++++++++++++------------------------------------
 1 files changed, 54 insertions(+), 147 deletions(-)

diff --git a/kernel/drivers/video/rockchip/rga3/rga_drv.c b/kernel/drivers/video/rockchip/rga3/rga_drv.c
index 576b460..226fb77 100644
--- a/kernel/drivers/video/rockchip/rga3/rga_drv.c
+++ b/kernel/drivers/video/rockchip/rga3/rga_drv.c
@@ -26,20 +26,6 @@
 static struct hrtimer timer;
 static ktime_t kt;
 
-static const struct rga_backend_ops rga3_ops = {
-	.get_version = rga3_get_version,
-	.set_reg = rga3_set_reg,
-	.init_reg = rga3_init_reg,
-	.soft_reset = rga3_soft_reset
-};
-
-static const struct rga_backend_ops rga2_ops = {
-	.get_version = rga2_get_version,
-	.set_reg = rga2_set_reg,
-	.init_reg = rga2_init_reg,
-	.soft_reset = rga2_soft_reset
-};
-
 static struct rga_session *rga_session_init(void);
 static int rga_session_deinit(struct rga_session *session);
 
@@ -49,6 +35,7 @@
 {
 	struct rga_external_buffer buffer;
 
+	memset(&buffer, 0x0, sizeof(buffer));
 	buffer.memory = (unsigned long)dma_buf;
 	buffer.type = RGA_DMA_BUFFER_PTR;
 	buffer.memory_parm.width = channel_info->vir_w;
@@ -270,8 +257,8 @@
 	struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager;
 
 	session = rga_session_init();
-	if (!session)
-		return -ENOMEM;
+	if (IS_ERR(session))
+		return PTR_ERR(session);
 
 	request_id = rga_request_alloc(0, session);
 	if (request_id < 0) {
@@ -561,22 +548,38 @@
 
 static struct rga_session *rga_session_init(void)
 {
+	int new_id;
+
 	struct rga_session_manager *session_manager = NULL;
-	struct rga_session *session = kzalloc(sizeof(*session), GFP_KERNEL);
+	struct rga_session *session = NULL;
 
 	session_manager = rga_drvdata->session_manager;
 	if (session_manager == NULL) {
 		pr_err("rga_session_manager is null!\n");
-		kfree(session);
-		return NULL;
+		return ERR_PTR(-EFAULT);
+	}
+
+	session = kzalloc(sizeof(*session), GFP_KERNEL);
+	if (!session) {
+		pr_err("rga_session alloc failed\n");
+		return ERR_PTR(-ENOMEM);
 	}
 
 	mutex_lock(&session_manager->lock);
 
 	idr_preload(GFP_KERNEL);
-	session->id = idr_alloc(&session_manager->ctx_id_idr, session, 1, 0, GFP_ATOMIC);
-	session_manager->session_cnt++;
+	new_id = idr_alloc_cyclic(&session_manager->ctx_id_idr, session, 1, 0, GFP_NOWAIT);
 	idr_preload_end();
+	if (new_id < 0) {
+		mutex_unlock(&session_manager->lock);
+
+		pr_err("rga_session alloc id failed!\n");
+		kfree(session);
+		return ERR_PTR(new_id);
+	}
+
+	session->id = new_id;
+	session_manager->session_cnt++;
 
 	mutex_unlock(&session_manager->lock);
 
@@ -588,29 +591,7 @@
 
 static int rga_session_deinit(struct rga_session *session)
 {
-	pid_t pid;
-	int request_id;
-	struct rga_pending_request_manager *request_manager;
-	struct rga_request *request;
-
-	pid = current->pid;
-
-	request_manager = rga_drvdata->pend_request_manager;
-
-	mutex_lock(&request_manager->lock);
-
-	idr_for_each_entry(&request_manager->request_idr, request, request_id) {
-
-		if (session == request->session) {
-			pr_err("[pid:%d] destroy request[%d] when the user exits",
-			       pid, request->id);
-			rga_request_put(request);
-		}
-	}
-
-	mutex_unlock(&request_manager->lock);
-
-	rga_job_session_destroy(session);
+	rga_request_session_destroy_abort(session);
 	rga_mm_session_release_buffer(session);
 
 	rga_session_free_remove_idr(session);
@@ -670,8 +651,9 @@
 
 		ret = rga_mm_import_buffer(&external_buffer[i], session);
 		if (ret == 0) {
-			pr_err("buffer[%d] mm import buffer failed! memory = 0x%lx, type = 0x%x\n",
+			pr_err("buffer[%d] mm import buffer failed! memory = 0x%lx, type = %s(0x%x)\n",
 			       i, (unsigned long)external_buffer[i].memory,
+			       rga_get_memory_type_str(external_buffer[i].type),
 			       external_buffer[i].type);
 
 			goto err_free_external_buffer;
@@ -741,7 +723,8 @@
 
 		ret = rga_mm_release_buffer(external_buffer[i].handle);
 		if (ret < 0) {
-			pr_err("buffer[%d] mm release buffer failed!\n", i);
+			pr_err("buffer[%d] mm release buffer failed! handle = %d\n",
+			       i, external_buffer[i].handle);
 
 			goto err_free_external_buffer;
 		}
@@ -1140,8 +1123,8 @@
 	struct rga_session *session = NULL;
 
 	session = rga_session_init();
-	if (!session)
-		return -ENOMEM;
+	if (IS_ERR(session))
+		return PTR_ERR(session);
 
 	file->private_data = (void *)session;
 
@@ -1157,97 +1140,39 @@
 	return 0;
 }
 
-static irqreturn_t rga3_irq_handler(int irq, void *data)
+static irqreturn_t rga_irq_handler(int irq, void *data)
 {
+	irqreturn_t irq_ret = IRQ_NONE;
 	struct rga_scheduler_t *scheduler = data;
 
-	if (DEBUGGER_EN(INT_FLAG))
-		pr_info("irqthread INT[%x],STATS0[%x], STATS1[%x]\n",
-			rga_read(RGA3_INT_RAW, scheduler),
-			rga_read(RGA3_STATUS0, scheduler),
-			rga_read(RGA3_STATUS1, scheduler));
+	if (scheduler->ops->irq)
+		irq_ret = scheduler->ops->irq(scheduler);
 
-	/* TODO: if error interrupt then soft reset hardware */
-	//scheduler->ops->soft_reset(job->core);
-
-	/*clear INT */
-	rga_write(1, RGA3_INT_CLR, scheduler);
-
-	return IRQ_WAKE_THREAD;
+	return irq_ret;
 }
 
-static irqreturn_t rga3_irq_thread(int irq, void *data)
+static irqreturn_t rga_isr_thread(int irq, void *data)
 {
+	irqreturn_t irq_ret = IRQ_NONE;
 	struct rga_scheduler_t *scheduler = data;
 	struct rga_job *job;
 
-	job = scheduler->running_job;
-
-	if (!job) {
-		pr_err("running job is invaild on irq thread\n");
+	job = rga_job_done(scheduler);
+	if (job == NULL) {
+		pr_err("isr thread invalid job!\n");
 		return IRQ_HANDLED;
 	}
 
-	if (DEBUGGER_EN(INT_FLAG))
-		pr_info("irq INT[%x], STATS0[%x], STATS1[%x]\n",
-			rga_read(RGA3_INT_RAW, scheduler),
-			rga_read(RGA3_STATUS0, scheduler),
-			rga_read(RGA3_STATUS1, scheduler));
+	if (scheduler->ops->isr_thread)
+		irq_ret = scheduler->ops->isr_thread(job, scheduler);
 
-	rga_job_done(scheduler, 0);
+	rga_request_release_signal(scheduler, job);
 
-	return IRQ_HANDLED;
-}
+	rga_job_next(scheduler);
 
-static irqreturn_t rga2_irq_handler(int irq, void *data)
-{
-	struct rga_scheduler_t *scheduler = data;
+	rga_power_disable(scheduler);
 
-	if (DEBUGGER_EN(INT_FLAG))
-		pr_info("irqthread INT[%x],STATS0[%x]\n",
-			rga_read(RGA2_INT, scheduler), rga_read(RGA2_STATUS,
-								 scheduler));
-
-	/*if error interrupt then soft reset hardware */
-	//warning
-	if (rga_read(RGA2_INT, scheduler) & 0x01) {
-		pr_err("err irq! INT[%x],STATS0[%x]\n",
-			 rga_read(RGA2_INT, scheduler),
-			 rga_read(RGA2_STATUS, scheduler));
-		scheduler->ops->soft_reset(scheduler);
-	}
-
-	/*clear INT */
-	rga_write(rga_read(RGA2_INT, scheduler) |
-		  (0x1 << 4) | (0x1 << 5) | (0x1 << 6) | (0x1 << 7) |
-		  (0x1 << 15) | (0x1 << 16), RGA2_INT, scheduler);
-
-	return IRQ_WAKE_THREAD;
-}
-
-static irqreturn_t rga2_irq_thread(int irq, void *data)
-{
-	struct rga_scheduler_t *scheduler = data;
-	struct rga_job *job;
-
-	job = scheduler->running_job;
-
-	if (!job)
-		return IRQ_HANDLED;
-
-	if (DEBUGGER_EN(INT_FLAG))
-		pr_info("irq INT[%x], STATS0[%x]\n",
-			rga_read(RGA2_INT, scheduler), rga_read(RGA2_STATUS,
-								 scheduler));
-
-	job->rga_command_base.osd_info.cur_flags0 = rga_read(RGA2_OSD_CUR_FLAGS0_OFFSET,
-							     scheduler);
-	job->rga_command_base.osd_info.cur_flags1 = rga_read(RGA2_OSD_CUR_FLAGS1_OFFSET,
-							     scheduler);
-
-	rga_job_done(scheduler, 0);
-
-	return IRQ_HANDLED;
+	return irq_ret;
 }
 
 const struct file_operations rga_fops = {
@@ -1290,44 +1215,24 @@
 	"clk_rga3_1",
 };
 
-static const struct rga_irqs_data_t single_rga2_irqs[] = {
-	{"rga2_irq", rga2_irq_handler, rga2_irq_thread}
-};
-
-static const struct rga_irqs_data_t rga3_core0_irqs[] = {
-	{"rga3_core0_irq", rga3_irq_handler, rga3_irq_thread}
-};
-
-static const struct rga_irqs_data_t rga3_core1_irqs[] = {
-	{"rga3_core1_irq", rga3_irq_handler, rga3_irq_thread}
-};
-
 static const struct rga_match_data_t old_rga2_match_data = {
 	.clks = old_rga2_clks,
 	.num_clks = ARRAY_SIZE(old_rga2_clks),
-	.irqs = single_rga2_irqs,
-	.num_irqs = ARRAY_SIZE(single_rga2_irqs)
 };
 
 static const struct rga_match_data_t rk3588_rga2_match_data = {
 	.clks = rk3588_rga2_clks,
 	.num_clks = ARRAY_SIZE(rk3588_rga2_clks),
-	.irqs = single_rga2_irqs,
-	.num_irqs = ARRAY_SIZE(single_rga2_irqs)
 };
 
 static const struct rga_match_data_t rga3_core0_match_data = {
 	.clks = rga3_core_0_clks,
 	.num_clks = ARRAY_SIZE(rga3_core_0_clks),
-	.irqs = rga3_core0_irqs,
-	.num_irqs = ARRAY_SIZE(rga3_core0_irqs)
 };
 
 static const struct rga_match_data_t rga3_core1_match_data = {
 	.clks = rga3_core_1_clks,
 	.num_clks = ARRAY_SIZE(rga3_core_1_clks),
-	.irqs = rga3_core1_irqs,
-	.num_irqs = ARRAY_SIZE(rga3_core1_irqs)
 };
 
 static const struct of_device_id rga3_core0_dt_ids[] = {
@@ -1439,21 +1344,21 @@
 	/* there are irq names in dts */
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0) {
-		dev_err(dev, "no irq %s in dts\n", match_data->irqs[0].name);
+		dev_err(dev, "no irq %s in dts\n", dev_driver_string(dev));
 		return irq;
 	}
 
 	scheduler->irq = irq;
 
-	pr_info("%s, irq = %d, match scheduler\n", match_data->irqs[0].name, irq);
+	pr_info("%s, irq = %d, match scheduler\n", dev_driver_string(dev), irq);
 
 	ret = devm_request_threaded_irq(dev, irq,
-					match_data->irqs[0].irq_hdl,
-					match_data->irqs[0].irq_thread,
+					rga_irq_handler,
+					rga_isr_thread,
 					IRQF_SHARED,
 					dev_driver_string(dev), scheduler);
 	if (ret < 0) {
-		pr_err("request irq name: %s failed: %d\n", match_data->irqs[0].name, ret);
+		pr_err("request irq name: %s failed: %d\n", dev_driver_string(dev), ret);
 		return ret;
 	}
 
@@ -1695,6 +1600,8 @@
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
 #ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
 module_init(rga_init);
+#elif defined CONFIG_VIDEO_REVERSE_IMAGE
+fs_initcall(rga_init);
 #else
 late_initcall(rga_init);
 #endif

--
Gitblit v1.6.2