From 9370bb92b2d16684ee45cf24e879c93c509162da Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Thu, 19 Dec 2024 01:47:39 +0000 Subject: [PATCH] add wifi6 8852be driver --- kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c | 64 ++++++++++++-------------------- 1 files changed, 24 insertions(+), 40 deletions(-) diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c index 4a3c7d7..c71c03f 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -28,6 +28,7 @@ #include <linux/nospec.h> #include <linux/workqueue.h> #include <soc/rockchip/pm_domains.h> +#include <soc/rockchip/rockchip_iommu.h> #include <soc/rockchip/rockchip_ipa.h> #include <soc/rockchip/rockchip_opp_select.h> #include <soc/rockchip/rockchip_system_monitor.h> @@ -504,7 +505,6 @@ mpp_write(mpp, RKVENC_INT_MSK_BASE, 0x100); mpp_write(mpp, RKVENC_INT_CLR_BASE, 0xffffffff); - udelay(5); mpp_write(mpp, RKVENC_INT_STATUS_BASE, 0); mpp_debug_leave(); @@ -534,11 +534,10 @@ if (task->irq_status & RKVENC_INT_ERROR_BITS) { atomic_inc(&mpp->reset_request); - /* dump register */ if (mpp_debug_unlikely(DEBUG_DUMP_ERR_REG)) { - mpp_debug(DEBUG_DUMP_ERR_REG, "irq_status: %08x\n", - task->irq_status); - mpp_task_dump_hw_reg(mpp, mpp_task); + /* dump error register */ + mpp_debug(DEBUG_DUMP_ERR_REG, "irq_status: %08x\n", task->irq_status); + mpp_task_dump_hw_reg(mpp); } } @@ -756,7 +755,7 @@ } seq_puts(seq, "\n"); /* item data*/ - seq_printf(seq, "|%8p|", session); + seq_printf(seq, "|%8d|", session->index); seq_printf(seq, "%8s|", mpp_device_name[session->device_type]); for (i = ENC_INFO_BASE; i < ENC_INFO_BUTT; i++) { u32 flag = priv->codec_info[i].flag; @@ -789,7 +788,7 @@ mutex_lock(&mpp->srv->session_lock); list_for_each_entry_safe(session, n, &mpp->srv->session_list, - session_link) { + service_link) { if (session->device_type != MPP_DEVICE_RKVENC) continue; if (!session->priv) @@ -970,7 +969,7 @@ }; static struct monitor_dev_profile enc_mdevp = { - .type = MONITOR_TPYE_DEV, + .type = MONITOR_TYPE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, }; @@ -999,15 +998,19 @@ return ret; } +static const struct rockchip_opp_data __maybe_unused rv1126_rkvenc_opp_data = { + .get_soc_info = rv1126_get_soc_info, +}; + static const struct of_device_id rockchip_rkvenc_of_match[] = { #ifdef CONFIG_CPU_RV1126 { .compatible = "rockchip,rv1109", - .data = (void *)&rv1126_get_soc_info, + .data = (void *)&rv1126_rkvenc_opp_data, }, { .compatible = "rockchip,rv1126", - .data = (void *)&rv1126_get_soc_info, + .data = (void *)&rv1126_rkvenc_opp_data, }, #endif {}, @@ -1018,6 +1021,7 @@ struct rkvenc_dev *enc = to_rkvenc_dev(mpp); struct clk *clk_core = enc->core_clk_info.clk; struct devfreq_cooling_power *venc_dcp = &venc_cooling_power_data; + struct rockchip_opp_info opp_info = {0}; int ret = 0; if (!clk_core) @@ -1035,8 +1039,8 @@ return 0; } - ret = rockchip_init_opp_table(mpp->dev, rockchip_rkvenc_of_match, - "leakage", "venc"); + rockchip_get_opp_data(rockchip_rkvenc_of_match, &opp_info); + ret = rockchip_init_opp_table(mpp->dev, &opp_info, "leakage", "venc"); if (ret) { dev_err(mpp->dev, "failed to init_opp_table\n"); return ret; @@ -1146,7 +1150,7 @@ else enc->aux_iova = page_iova; - rk_iommu_unmask_irq(mpp->dev); + rockchip_iommu_unmask_irq(mpp->dev); mpp_iommu_up_write(mpp->iommu_info); mpp_debug_leave(); @@ -1163,7 +1167,7 @@ mpp_debug(DEBUG_IOMMU, "IOMMU_GET_BUS_ID(status)=%d\n", IOMMU_GET_BUS_ID(status)); if (IOMMU_GET_BUS_ID(status)) { enc->fault_iova = iova; - rk_iommu_mask_irq(mpp->dev); + rockchip_iommu_mask_irq(mpp->dev); queue_work(enc->iommu_wq, &enc->iommu_work); } mpp_debug_leave(); @@ -1228,7 +1232,7 @@ } INIT_WORK(&enc->iommu_work, rkvenc_iommu_handle_work); - mpp->iommu_info->hdl = rkvenc_iommu_fault_handle; + mpp->fault_handler = rkvenc_iommu_fault_handle; return ret; } @@ -1443,7 +1447,7 @@ if (!enc) return -ENOMEM; mpp = &enc->mpp; - platform_set_drvdata(pdev, enc); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_rkvenc_dt_match, pdev->dev.of_node); @@ -1482,39 +1486,19 @@ static int rkvenc_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct rkvenc_dev *enc = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); dev_info(dev, "remove device\n"); - mpp_dev_remove(&enc->mpp); - rkvenc_procfs_remove(&enc->mpp); + mpp_dev_remove(mpp); + rkvenc_procfs_remove(mpp); return 0; -} - -static void rkvenc_shutdown(struct platform_device *pdev) -{ - int ret; - int val; - struct device *dev = &pdev->dev; - struct rkvenc_dev *enc = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &enc->mpp; - - dev_info(dev, "shutdown device\n"); - - atomic_inc(&mpp->srv->shutdown_request); - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 1000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); - - dev_info(dev, "shutdown success\n"); } struct platform_driver rockchip_rkvenc_driver = { .probe = rkvenc_probe, .remove = rkvenc_remove, - .shutdown = rkvenc_shutdown, + .shutdown = mpp_dev_shutdown, .driver = { .name = RKVENC_DRIVER_NAME, .of_match_table = of_match_ptr(mpp_rkvenc_dt_match), -- Gitblit v1.6.2