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