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/clk/rockchip/clk-ddr.c | 226 +++++++++++--------------------------------------------- 1 files changed, 45 insertions(+), 181 deletions(-) diff --git a/kernel/drivers/clk/rockchip/clk-ddr.c b/kernel/drivers/clk/rockchip/clk-ddr.c index 33d22e3..46df75f 100644 --- a/kernel/drivers/clk/rockchip/clk-ddr.c +++ b/kernel/drivers/clk/rockchip/clk-ddr.c @@ -1,19 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) 2016 Rockchip Electronics Co. Ltd. * Author: Lin Huang <hl@rock-chips.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ -#include <drm/drmP.h> #include <linux/arm-smccc.h> #include <linux/clk.h> #include <linux/clk-provider.h> @@ -21,17 +11,12 @@ #include <linux/of.h> #include <linux/rockchip/rockchip_sip.h> #include <linux/slab.h> -#include <soc/rockchip/rockchip_dmc.h> #include <soc/rockchip/rockchip_sip.h> -#include <soc/rockchip/scpi.h> -#include <uapi/drm/drm_mode.h> #ifdef CONFIG_ARM #include <asm/psci.h> #endif #include "clk.h" - -#define MHZ (1000000) struct rockchip_ddrclk { struct clk_hw hw; @@ -46,52 +31,29 @@ #define to_rockchip_ddrclk_hw(hw) container_of(hw, struct rockchip_ddrclk, hw) -static int rk_drm_get_lcdc_type(void) +struct share_params_ddrclk { + u32 hz; + u32 lcdc_type; +}; + +struct rockchip_ddrclk_data { + void __iomem *params; + int (*dmcfreq_wait_complete)(void); +}; + +static struct rockchip_ddrclk_data ddr_data = {NULL, NULL}; + +void rockchip_set_ddrclk_params(void __iomem *params) { - struct drm_device *drm; - u32 lcdc_type = 0; - - drm = drm_device_get_by_name("rockchip"); - if (drm) { - struct drm_connector *conn; - - list_for_each_entry(conn, &drm->mode_config.connector_list, - head) { - if (conn->encoder) { - lcdc_type = conn->connector_type; - break; - } - } - } - - switch (lcdc_type) { - case DRM_MODE_CONNECTOR_DPI: - case DRM_MODE_CONNECTOR_LVDS: - lcdc_type = SCREEN_LVDS; - break; - case DRM_MODE_CONNECTOR_DisplayPort: - lcdc_type = SCREEN_DP; - break; - case DRM_MODE_CONNECTOR_HDMIA: - case DRM_MODE_CONNECTOR_HDMIB: - lcdc_type = SCREEN_HDMI; - break; - case DRM_MODE_CONNECTOR_TV: - lcdc_type = SCREEN_TVOUT; - break; - case DRM_MODE_CONNECTOR_eDP: - lcdc_type = SCREEN_EDP; - break; - case DRM_MODE_CONNECTOR_DSI: - lcdc_type = SCREEN_MIPI; - break; - default: - lcdc_type = SCREEN_NULL; - break; - } - - return lcdc_type; + ddr_data.params = params; } +EXPORT_SYMBOL(rockchip_set_ddrclk_params); + +void rockchip_set_ddrclk_dmcfreq_wait_complete(int (*func)(void)) +{ + ddr_data.dmcfreq_wait_complete = func; +} +EXPORT_SYMBOL(rockchip_set_ddrclk_dmcfreq_wait_complete); static int rockchip_ddrclk_sip_set_rate(struct clk_hw *hw, unsigned long drate, unsigned long prate) @@ -139,7 +101,7 @@ struct rockchip_ddrclk *ddrclk = to_rockchip_ddrclk_hw(hw); u32 val; - val = clk_readl(ddrclk->reg_base + + val = readl(ddrclk->reg_base + ddrclk->mux_offset) >> ddrclk->mux_shift; val &= GENMASK(ddrclk->mux_width - 1, 0); @@ -153,116 +115,24 @@ .get_parent = rockchip_ddrclk_get_parent, }; -static u32 ddr_clk_cached; - -static int rockchip_ddrclk_scpi_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long prate) -{ - u32 ret; - u32 lcdc_type; - - lcdc_type = rk_drm_get_lcdc_type(); - - ret = scpi_ddr_set_clk_rate(drate / MHZ, lcdc_type); - if (ret) { - ddr_clk_cached = ret; - ret = 0; - } else { - ddr_clk_cached = 0; - ret = -1; - } - - return ret; -} - -static unsigned long rockchip_ddrclk_scpi_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - if (ddr_clk_cached) - return (MHZ * ddr_clk_cached); - else - return (MHZ * scpi_ddr_get_clk_rate()); -} - -static long rockchip_ddrclk_scpi_round_rate(struct clk_hw *hw, - unsigned long rate, - unsigned long *prate) -{ - rate = rate / MHZ; - rate = (rate / 12) * 12; - - return (rate * MHZ); -} - -static const struct clk_ops rockchip_ddrclk_scpi_ops = { - .recalc_rate = rockchip_ddrclk_scpi_recalc_rate, - .set_rate = rockchip_ddrclk_scpi_set_rate, - .round_rate = rockchip_ddrclk_scpi_round_rate, - .get_parent = rockchip_ddrclk_get_parent, -}; - -struct share_params { - u32 hz; - u32 lcdc_type; - u32 vop; - u32 vop_dclk_mode; - u32 sr_idle_en; - u32 addr_mcu_el3; - /* - * 1: need to wait flag1 - * 0: never wait flag1 - */ - u32 wait_flag1; - /* - * 1: need to wait flag1 - * 0: never wait flag1 - */ - u32 wait_flag0; - u32 complt_hwirq; - /* if need, add parameter after */ -}; - -struct rockchip_ddrclk_data { - u32 inited_flag; - void __iomem *share_memory; -}; - -static struct rockchip_ddrclk_data ddr_data; - -static void rockchip_ddrclk_data_init(void) -{ - struct arm_smccc_res res; - - res = sip_smc_request_share_mem(1, SHARE_PAGE_TYPE_DDR); - - if (!res.a0) { - ddr_data.share_memory = (void __iomem *)res.a1; - ddr_data.inited_flag = 1; - } -} - static int rockchip_ddrclk_sip_set_rate_v2(struct clk_hw *hw, unsigned long drate, unsigned long prate) { - struct share_params *p; + struct share_params_ddrclk *p; struct arm_smccc_res res; - if (!ddr_data.inited_flag) - rockchip_ddrclk_data_init(); - - p = (struct share_params *)ddr_data.share_memory; - - p->hz = drate; - p->lcdc_type = rk_drm_get_lcdc_type(); - p->wait_flag1 = 1; - p->wait_flag0 = 1; + p = (struct share_params_ddrclk *)ddr_data.params; + if (p) + p->hz = drate; res = sip_smc_dram(SHARE_PAGE_TYPE_DDR, 0, ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE); - if ((int)res.a1 == SIP_RET_SET_RATE_TIMEOUT) - rockchip_dmcfreq_wait_complete(); + if ((int)res.a1 == SIP_RET_SET_RATE_TIMEOUT) { + if (ddr_data.dmcfreq_wait_complete) + ddr_data.dmcfreq_wait_complete(); + } return res.a0; } @@ -284,15 +154,12 @@ unsigned long rate, unsigned long *prate) { - struct share_params *p; + struct share_params_ddrclk *p; struct arm_smccc_res res; - if (!ddr_data.inited_flag) - rockchip_ddrclk_data_init(); - - p = (struct share_params *)ddr_data.share_memory; - - p->hz = rate; + p = (struct share_params_ddrclk *)ddr_data.params; + if (p) + p->hz = rate; res = sip_smc_dram(SHARE_PAGE_TYPE_DDR, 0, ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE); @@ -309,16 +176,15 @@ .get_parent = rockchip_ddrclk_get_parent, }; -struct clk * __init -rockchip_clk_register_ddrclk(const char *name, int flags, - const char *const *parent_names, - u8 num_parents, int mux_offset, - int mux_shift, int mux_width, - int div_shift, int div_width, - int ddr_flag, void __iomem *reg_base) +struct clk *rockchip_clk_register_ddrclk(const char *name, int flags, + const char *const *parent_names, + u8 num_parents, int mux_offset, + int mux_shift, int mux_width, + int div_shift, int div_width, + int ddr_flag, void __iomem *reg_base) { struct rockchip_ddrclk *ddrclk; - struct clk_init_data init = {}; + struct clk_init_data init; struct clk *clk; #ifdef CONFIG_ARM @@ -343,14 +209,11 @@ init.ops = &rockchip_ddrclk_sip_ops; break; #endif -#ifdef CONFIG_ROCKCHIP_DDRCLK_SCPI - case ROCKCHIP_DDRCLK_SCPI: - init.ops = &rockchip_ddrclk_scpi_ops; - break; -#endif +#ifdef CONFIG_ROCKCHIP_DDRCLK_SIP_V2 case ROCKCHIP_DDRCLK_SIP_V2: init.ops = &rockchip_ddrclk_sip_ops_v2; break; +#endif default: pr_err("%s: unsupported ddrclk type %d\n", __func__, ddr_flag); kfree(ddrclk); @@ -372,3 +235,4 @@ return clk; } +EXPORT_SYMBOL_GPL(rockchip_clk_register_ddrclk); -- Gitblit v1.6.2