From a5969cabbb4660eab42b6ef0412cbbd1200cf14d Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Sat, 12 Oct 2024 07:10:09 +0000
Subject: [PATCH] 修改led为gpio
---
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