kernel-brax3-ubuntu-touch/drivers/memory/mtk-smi.c
erascape f319b992b1 kernel-5.15: Initial import brax3 UT kernel
* halium configs enabled

Signed-off-by: erascape <erascape@proton.me>
2025-09-23 15:17:10 +00:00

3888 lines
138 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2015-2016 MediaTek Inc.
* Author: Yong Wu <yong.wu@mediatek.com>
*/
#include <linux/clk.h>
#include <linux/component.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/module.h>
#include <linux/suspend.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/pm_opp.h>
#include <linux/pm_runtime.h>
#include <linux/pm_domain.h>
#include <linux/delay.h>
#include <soc/mediatek/smi.h>
#include <dt-bindings/memory/mt2701-larb-port.h>
#include <dt-bindings/memory/mtk-memory-port.h>
#include <../misc/mediatek/include/mt-plat/aee.h>
#include <linux/kthread.h>
/* mt8173 */
#define SMI_LARB_MMU_EN 0xf00
/* mt8167 */
#define MT8167_SMI_LARB_MMU_EN 0xfc0
/* mt2701 */
#define REG_SMI_SECUR_CON_BASE 0x5c0
/* every register control 8 port, register offset 0x4 */
#define REG_SMI_SECUR_CON_OFFSET(id) (((id) >> 3) << 2)
#define REG_SMI_SECUR_CON_ADDR(id) \
(REG_SMI_SECUR_CON_BASE + REG_SMI_SECUR_CON_OFFSET(id))
/*
* every port have 4 bit to control, bit[port + 3] control virtual or physical,
* bit[port + 2 : port + 1] control the domain, bit[port] control the security
* or non-security.
*/
#define SMI_SECUR_CON_VAL_MSK(id) (~(0xf << (((id) & 0x7) << 2)))
#define SMI_SECUR_CON_VAL_VIRT(id) BIT((((id) & 0x7) << 2) + 3)
/* mt2701 domain should be set to 3 */
#define SMI_SECUR_CON_VAL_DOMAIN(id) (0x3 << ((((id) & 0x7) << 2) + 1))
/* mt2712 */
#define SMI_LARB_NONSEC_CON(id) (0x380 + ((id) * 4))
#define F_MMU_EN BIT(0)
#define BANK_SEL(id) ({ \
u32 _id = (id) & 0x3; \
(_id << 8 | _id << 10 | _id << 12 | _id << 14); \
})
/* mt6873 */
#define SMI_LARB_OSTDL_PORT 0x200
#define SMI_LARB_OSTDL_PORTx(id) (SMI_LARB_OSTDL_PORT + ((id) << 2))
#define SMI_LARB_SLP_CON 0x00c
#define SLP_PROT_EN BIT(0)
#define SLP_PROT_RDY BIT(16)
#define SMI_LARB_CMD_THRT_CON 0x24
#define SMI_LARB_SW_FLAG 0x40
#define SMI_LARB_WRR_PORT 0x100
#define SMI_LARB_WRR_PORTx(id) (SMI_LARB_WRR_PORT + ((id) << 2))
#define SMI_LARB_DISABLE_ULTRA 0x70
#define SMI_LARB_FORCE_ULTRA 0x78
#define SMI_LARB_FORCE_PREULTRA 0x7C
/* mt6893 */
#define SMI_LARB_VC_PRI_MODE (0x20)
#define SMI_LARB_DBG_CON (0xf0)
#define INT_SMI_LARB_DBG_CON (0x500 + (SMI_LARB_DBG_CON))
#define INT_SMI_LARB_CMD_THRT_CON (0x500 + (SMI_LARB_CMD_THRT_CON))
#define SMI_LARB_OSTD_MON_PORT(p) (0x280 + ((p) << 2))
#define INT_SMI_LARB_OSTD_MON_PORT(p) (0x500 + SMI_LARB_OSTD_MON_PORT(p))
#define INT_SMI_LARB_OSTDL_PORTx(id) (0x500 + SMI_LARB_OSTDL_PORT + ((id) << 2))
#define SMI_LARB_STAT (0x0)
#define INT_SMI_LARB_STAT (0x500)
/* SMI COMMON */
#define SMI_BUS_SEL 0x220
#define SMI_BUS_LARB_SHIFT(larbid) ((larbid) << 1)
#define SMI_CLAMP_EN (0x3C0)
#define SMI_CLAMP_EN_SET (0x3C4)
#define SMI_CLAMP_EN_CLR (0x3C8)
#define SMI_DEBUG_MISC (0x440)
#define SMI_DEBUG_S(s) (0x400 + ((s) << 2))
/* All are MMU0 defaultly. Only specialize mmu1 here. */
#define F_MMU1_LARB(larbid) (0x1 << SMI_BUS_LARB_SHIFT(larbid))
#define SMI_L1LEN 0x100
#define SMI_L1ARB0 0x104
#define SMI_L1ARB(id) (SMI_L1ARB0 + ((id) << 2))
#define SMI_M4U_TH 0x234
#define SMI_FIFO_TH1 0x238
#define SMI_FIFO_TH2 0x23c
#define SMI_PREULTRA_MASK1 0x244
#define SMI_DCM 0x300
#define SMI_DUMMY 0x444
#define SMI_LARB_PORT_NR_MAX 32
#define SMI_COMMON_LARB_NR_MAX 8
#define MTK_COMMON_NR_MAX 25
#define SMI_LARB_MISC_NR 5
#define SMI_COMMON_MISC_NR 8
#define SMI_L1LEN 0x100
#define SMI_L1ARB0 0x104
#define SMI_L1ARB(id) (SMI_L1ARB0 + ((id) << 2))
#define OSTDL_EN 14
#define WR_LIMIT_LSB 24
#define RD_LIMIT_LSB 16
#define MASK_7 (0x7f)
struct mtk_smi_reg_pair {
u16 offset;
u32 value;
};
struct mtk_smi_lock smi_lock;
EXPORT_SYMBOL(smi_lock);
enum mtk_smi_gen {
MTK_SMI_GEN1,
MTK_SMI_GEN2,
MTK_SMI_GEN3
};
enum smi_larb7_user {
VENC,
JPEG_ENC,
JPEG_DEC,
MAX_LARB7_USER
};
atomic_t larb7_ref_cnt[MAX_LARB7_USER];
struct mtk_smi_common_plat {
enum mtk_smi_gen gen;
bool has_gals;
u32 bus_sel; /* Balance some larbs to enter mmu0 or mmu1 */
bool has_bwl;
u32 *bwl;
bool has_p2_ostdl;
struct mtk_smi_reg_pair *misc;
};
struct mtk_smi_larb_gen {
int port_in_larb[MTK_LARB_NR_MAX + 1];
int port_in_larb_gen2[MTK_LARB_NR_MAX + 1];
void (*config_port)(struct device *);
void (*sleep_ctrl)(struct device *dev, bool toslp);
unsigned long larb_direct_to_common_mask;
bool has_gals;
bool has_bwl;
bool has_grouping;
bool has_bw_thrt;
u8 *bwl;
u8 *cmd_group; /* ovl with large ostd */
u8 *bw_thrt_en; /* non-HRT */
struct mtk_smi_reg_pair *misc;
};
struct mtk_smi {
struct device *dev;
struct clk *clk_apb, *clk_smi;
struct clk *clk_gals0, *clk_gals1;
struct clk *clk_async; /*only needed by mt2701*/
union {
void __iomem *smi_ao_base; /* only for gen1 */
void __iomem *base; /* only for gen2 */
};
const struct mtk_smi_common_plat *plat;
int commid;
atomic_t ref_count;
};
#define LARB_MAX_COMMON (2)
struct mtk_smi_larb { /* larb: local arbiter */
struct mtk_smi smi;
void __iomem *base;
struct device *smi_common_dev[LARB_MAX_COMMON];
struct device *smi_common;
const struct mtk_smi_larb_gen *larb_gen;
int larbid;
int comm_port_id[LARB_MAX_COMMON];
u32 *mmu;
bool clk_on_delay;
unsigned char *bank;
};
#define MAX_COMMON_FOR_CLAMP (3)
#define MAX_LARB_FOR_CLAMP (6)
#define RESET_CELL_NUM (2)
#define MAX_PD_CHECK_DEV_NUM (3)
#define SMI_OSTD_CNT_MASK (0x7FFE000)
struct mtk_smi_pd_log {
u8 power_status;
ktime_t time;
u32 clamp_status[MAX_COMMON_FOR_CLAMP];
u32 reset_status[MAX_LARB_FOR_CLAMP];
};
struct mtk_smi_pd {
struct device *dev;
struct device *smi_common_dev[MAX_COMMON_FOR_CLAMP];
u32 set_comm_port_range[MAX_COMMON_FOR_CLAMP];
struct device *suspend_check_dev[MAX_PD_CHECK_DEV_NUM];
u32 suspend_check_port[MAX_PD_CHECK_DEV_NUM];
u32 power_reset_pa[MAX_LARB_FOR_CLAMP];
void __iomem *power_reset_reg[MAX_LARB_FOR_CLAMP];
u32 power_reset_value[MAX_LARB_FOR_CLAMP];
struct notifier_block nb;
bool is_main;
bool suspend_check;
bool bus_prot;
u32 pre_off_check_result;
u32 pre_on_check_result;
struct mtk_smi_pd_log last_pd_log;
struct mtk_smi smi;
};
static u32 log_level;
enum smi_log_level {
log_config_bit = 0,
log_set_bw,
log_pd_callback,
};
#define MAX_INIT_POWER_ON_DEV (15)
static struct mtk_smi *init_power_on_dev[MAX_INIT_POWER_ON_DEV];
static unsigned int init_power_on_num;
#define MAX_PD_CTRL_NUM (8)
static struct mtk_smi_pd *smi_pd_ctrl[MAX_PD_CTRL_NUM];
static unsigned int smi_pd_ctrl_num;
static void power_reset_imp(struct mtk_smi_pd *smi_pd)
{
int i;
for (i = 0; (i < MAX_LARB_FOR_CLAMP) && smi_pd->power_reset_reg[i]; i++) {
writel(smi_pd->power_reset_value[i], smi_pd->power_reset_reg[i]);
writel(0, smi_pd->power_reset_reg[i]);
smi_pd->last_pd_log.reset_status[i] = readl(smi_pd->power_reset_reg[i]);
}
}
void mtk_smi_common_bw_set(struct device *dev, const u32 port, const u32 val)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
struct mtk_smi *common = dev_get_drvdata(larb->smi_common);
u32 orig_val, write_val;
if (port >= SMI_COMMON_LARB_NR_MAX) { /* max: 8 input larbs. */
dev_notice(dev, "%s port invalid:%d, val:%u.\n", __func__,
port, val);
return;
}
orig_val = common->plat->bwl[common->commid * SMI_COMMON_LARB_NR_MAX + port];
write_val = orig_val;
write_val &= ~(0x3fff);
write_val |= val & 0x3fff;
if (log_level & 1 << log_config_bit)
pr_info("[SMI]%s val:%#x orig_val:%#x write_val:%#x\n",
__func__, val, orig_val, write_val);
if (common->plat->gen == MTK_SMI_GEN3)
common->plat->bwl[common->commid * SMI_COMMON_LARB_NR_MAX + port] = write_val;
else if (common->plat->gen == MTK_SMI_GEN2)
common->plat->bwl[port] = write_val;
if (atomic_read(&common->ref_count))
writel(write_val, common->base + SMI_L1ARB(port));
}
EXPORT_SYMBOL_GPL(mtk_smi_common_bw_set);
bool is_other_ostd_existed(const u32 value, bool is_write)
{
bool existed;
existed = (value >> (is_write ? WR_LIMIT_LSB : RD_LIMIT_LSB)) & MASK_7;
if (log_level & 1 << log_config_bit)
pr_info("%s value: %#x is_write: %d exited: %d\n", __func__,
value, is_write, existed);
return existed;
}
void mtk_smi_common_ostdl_set(struct device *dev, const u32 port, bool is_write, const u32 val)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
struct mtk_smi *common = dev_get_drvdata(larb->smi_common);
u32 orig_val, write_val;
if (port >= SMI_COMMON_LARB_NR_MAX) { /* max: 8 input larbs. */
dev_notice(dev, "%s port invalid:%d, val:%u.\n", __func__,
port, val);
return;
}
if (!common->plat->has_p2_ostdl)
return;
orig_val = common->plat->bwl[common->commid * SMI_COMMON_LARB_NR_MAX + port];
write_val = orig_val;
if (val) {
if (is_other_ostd_existed(orig_val, !is_write))
write_val |= BIT(OSTDL_EN);
write_val |= (val & MASK_7) << (is_write ? WR_LIMIT_LSB : RD_LIMIT_LSB);
} else {
write_val &= ~BIT(OSTDL_EN);
write_val &= ~((MASK_7) << (is_write ? WR_LIMIT_LSB : RD_LIMIT_LSB));
}
common->plat->bwl[common->commid * SMI_COMMON_LARB_NR_MAX + port] = write_val;
if (atomic_read(&common->ref_count))
writel(write_val, common->base + SMI_L1ARB(port));
if (log_level & 1 << log_config_bit)
pr_info("[SMI]%s orig_val:%#x write_val:%#x\n",
__func__, orig_val, write_val);
}
EXPORT_SYMBOL_GPL(mtk_smi_common_ostdl_set);
void mtk_smi_larb_bw_set(struct device *dev, const u32 port, const u32 val)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
if (port >= SMI_LARB_PORT_NR_MAX) { /* max: 32 ports for a larb */
dev_notice(dev, "%s port invalid:%d, val:%u.\n", __func__,
port, val);
return;
}
if (val) {
if (larb->clk_on_delay && (port == 12 || port == 13)) {
dev_notice(dev, "%s:Not write %#x, val=%#x\n",
__func__, SMI_LARB_OSTDL_PORTx(port), val);
return;
}
larb->larb_gen->bwl[larb->larbid * SMI_LARB_PORT_NR_MAX + port] = val;
if (atomic_read(&larb->smi.ref_count))
writel(val, larb->base + SMI_LARB_OSTDL_PORTx(port));
}
}
EXPORT_SYMBOL_GPL(mtk_smi_larb_bw_set);
static void mtk_smi_larb_bw_set_ex(struct device *dev, const u32 port, const u32 val)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
if (port >= SMI_LARB_PORT_NR_MAX) { /* max: 32 ports for a larb */
dev_notice(dev, "%s port invalid:%d, val:%u.\n", __func__,
port, val);
return;
}
if (val) {
larb->larb_gen->bwl[larb->larbid * SMI_LARB_PORT_NR_MAX + port] = val;
if (atomic_read(&larb->smi.ref_count))
writel(val, larb->base + SMI_LARB_OSTDL_PORTx(port));
}
}
void mtk_smi_check_comm_ref_cnt(struct device *dev)
{
struct mtk_smi *common = dev_get_drvdata(dev);
int ref_count;
if (common) {
ref_count = atomic_read(&common->ref_count);
if (ref_count > 0)
pr_notice("%s comm:%u ref_cnt=%d\n", __func__, common->commid, ref_count);
}
}
EXPORT_SYMBOL_GPL(mtk_smi_check_comm_ref_cnt);
void mtk_smi_check_larb_ref_cnt(struct device *dev)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
int ref_count;
if (larb) {
ref_count = atomic_read(&larb->smi.ref_count);
if (ref_count > 0) {
pr_notice("%s larb:%u ref_cnt=%d\n", __func__, larb->larbid, ref_count);
if (larb->larbid == 7)
pr_notice("%s VENC:%d JPEG_ENC:%d JPEG_DEC:%d",
__func__,
larb7_ref_cnt[0],
larb7_ref_cnt[1],
larb7_ref_cnt[2]);
}
}
}
EXPORT_SYMBOL_GPL(mtk_smi_check_larb_ref_cnt);
void mtk_smi_init_power_off(void)
{
int i;
struct mtk_smi *smi;
for (i = 0; i < init_power_on_num; i++) {
smi = init_power_on_dev[i];
pm_runtime_put_sync(smi->dev);
}
}
EXPORT_SYMBOL_GPL(mtk_smi_init_power_off);
void mtk_smi_dump_last_pd(const char *user)
{
int i, j;
struct mtk_smi_pd *smi_pd;
pr_info("%s: check caller:%s\n", __func__, user);
for (i = 0; i < smi_pd_ctrl_num; i++) {
smi_pd = smi_pd_ctrl[i];
dev_notice(smi_pd->dev, "power status = %d\n", smi_pd->last_pd_log.power_status);
dev_notice(smi_pd->dev, "time = %18llu\n", smi_pd->last_pd_log.time);
for (j = 0; j < MAX_COMMON_FOR_CLAMP; j++) {
if (!smi_pd->smi_common_dev[j])
break;
dev_notice(smi_pd->dev, "%s: clamp status = %#x\n"
, dev_name(smi_pd->smi_common_dev[j])
, smi_pd->last_pd_log.clamp_status[j]);
}
if (!smi_pd->is_main) {
for (j = 0; (j < MAX_LARB_FOR_CLAMP) && smi_pd->power_reset_reg[j]; j++) {
dev_notice(smi_pd->dev, "reset status: %#x = %#x\n"
, smi_pd->power_reset_pa[j]
, smi_pd->last_pd_log.reset_status[j]);
}
}
}
}
EXPORT_SYMBOL_GPL(mtk_smi_dump_last_pd);
static int mtk_smi_clk_enable(const struct mtk_smi *smi)
{
int ret;
ret = clk_prepare_enable(smi->clk_apb);
if (ret)
return ret;
ret = clk_prepare_enable(smi->clk_smi);
if (ret)
goto err_disable_apb;
ret = clk_prepare_enable(smi->clk_gals0);
if (ret)
goto err_disable_smi;
ret = clk_prepare_enable(smi->clk_gals1);
if (ret)
goto err_disable_gals0;
return 0;
err_disable_gals0:
clk_disable_unprepare(smi->clk_gals0);
err_disable_smi:
clk_disable_unprepare(smi->clk_smi);
err_disable_apb:
clk_disable_unprepare(smi->clk_apb);
return ret;
}
static void mtk_smi_clk_disable(const struct mtk_smi *smi)
{
clk_disable_unprepare(smi->clk_gals1);
clk_disable_unprepare(smi->clk_gals0);
clk_disable_unprepare(smi->clk_smi);
clk_disable_unprepare(smi->clk_apb);
}
int mtk_smi_larb_ultra_dis(struct device *larbdev, bool is_dis)
{
struct mtk_smi_larb *larb;
u32 val, i;
if (unlikely(!larbdev))
return -EINVAL;
larb = dev_get_drvdata(larbdev);
if (unlikely(!larb))
return -ENODEV;
val = is_dis ? 0xffffffff : 0x0;
writel(val, larb->base + SMI_LARB_DISABLE_ULTRA);
if (is_dis) {
for (i = 0; i < 32; i++) {
writel_relaxed(readl_relaxed(larb->base + SMI_LARB_NONSEC_CON(i)) | 0x8,
larb->base + SMI_LARB_NONSEC_CON(i));
}
} else {
for (i = 0; i < 32; i++) {
writel_relaxed(readl_relaxed(larb->base + SMI_LARB_NONSEC_CON(i)) & 0xfffffff7,
larb->base + SMI_LARB_NONSEC_CON(i));
}
}
pr_info("[SMI]larb:%d set dis_ultra:%d\n", larb->larbid, is_dis);
return 0;
}
EXPORT_SYMBOL_GPL(mtk_smi_larb_ultra_dis);
int mtk_smi_larb_get(struct device *larbdev)
{
struct mtk_smi_larb *larb;
int ret;
if (unlikely(!larbdev))
return -EINVAL;
larb = dev_get_drvdata(larbdev);
if (unlikely(!larb))
return -ENODEV;
if (pm_suspend_target_state != PM_SUSPEND_ON)
pr_notice("%s:larb%d err power on/off timing, RPM_status:%d\n",
__func__, larb->larbid, larbdev->power.runtime_status);
if (log_level & 1 << log_config_bit)
pr_info("[SMI]larb:%d get ref_count:%d\n",
larb->larbid, atomic_read(&larb->smi.ref_count));
ret = pm_runtime_resume_and_get(larbdev);
if (ret < 0) {
dev_notice(larbdev, "Unable to enable SMI LARB%d. ret:%d\n",
larb->larbid, ret);
pm_runtime_put_sync(larbdev);
}
return (ret < 0) ? ret : 0;
}
EXPORT_SYMBOL_GPL(mtk_smi_larb_get);
void mtk_smi_larb_put(struct device *larbdev)
{
struct mtk_smi_larb *larb;
if (unlikely(!larbdev))
return;
larb = dev_get_drvdata(larbdev);
if (unlikely(!larb))
return;
if (pm_suspend_target_state != PM_SUSPEND_ON)
pr_notice("%s:larb%d err power on/off timing, RPM_status:%d\n",
__func__, larb->larbid, larbdev->power.runtime_status);
if (log_level & 1 << log_config_bit)
pr_info("[SMI]larb:%d put ref_count:%d\n",
larb->larbid, atomic_read(&larb->smi.ref_count));
pm_runtime_put_sync(larbdev);
}
EXPORT_SYMBOL_GPL(mtk_smi_larb_put);
int mtk_smi_larb_get_ex(struct device *larbdev, int user)
{
struct mtk_smi_larb *larb;
int ret;
if (unlikely(!larbdev))
return -EINVAL;
larb = dev_get_drvdata(larbdev);
if (unlikely(!larb))
return -ENODEV;
if (pm_suspend_target_state != PM_SUSPEND_ON)
pr_notice("%s:larb%d err power on/off timing, RPM_status:%d\n",
__func__, larb->larbid, larbdev->power.runtime_status);
if (log_level & 1 << log_config_bit)
pr_info("[SMI]larb:%d get ref_count:%d user:%d\n",
larb->larbid, atomic_read(&larb->smi.ref_count), user);
if (user >= 0 && user < MAX_LARB7_USER)
atomic_inc(&larb7_ref_cnt[user]);
ret = pm_runtime_resume_and_get(larbdev);
if (ret < 0) {
dev_notice(larbdev, "Unable to enable SMI LARB%d. ret:%d user:%d\n",
larb->larbid, ret, user);
pm_runtime_put_sync(larbdev);
}
return (ret < 0) ? ret : 0;
}
EXPORT_SYMBOL_GPL(mtk_smi_larb_get_ex);
void mtk_smi_larb_put_ex(struct device *larbdev, int user)
{
struct mtk_smi_larb *larb;
if (unlikely(!larbdev))
return;
larb = dev_get_drvdata(larbdev);
if (unlikely(!larb))
return;
if (pm_suspend_target_state != PM_SUSPEND_ON)
pr_notice("%s:larb%d err power on/off timing, RPM_status:%d\n",
__func__, larb->larbid, larbdev->power.runtime_status);
if (log_level & 1 << log_config_bit)
pr_info("[SMI]larb:%d put ref_count:%d\n",
larb->larbid, atomic_read(&larb->smi.ref_count));
pm_runtime_put_sync(larbdev);
if (user >= 0 && user < MAX_LARB7_USER)
atomic_dec(&larb7_ref_cnt[user]);
}
EXPORT_SYMBOL_GPL(mtk_smi_larb_put_ex);
void mtk_smi_add_device_link(struct device *dev, struct device *larbdev)
{
struct device_link *link;
struct mtk_smi_larb *larb = dev_get_drvdata(larbdev);
link = device_link_add(dev, larbdev,
DL_FLAG_PM_RUNTIME | DL_FLAG_STATELESS);
if (!link)
dev_notice(dev, "Unable to link SMI LARB%d\n", larb->larbid);
}
EXPORT_SYMBOL_GPL(mtk_smi_add_device_link);
s32 smi_sysram_enable(struct device *larbdev, const u32 master_id,
const bool enable, const char *user)
{
struct mtk_smi_larb *larb = dev_get_drvdata(larbdev);
u32 larbid = MTK_M4U_TO_LARB(master_id);
u32 port = MTK_M4U_TO_PORT(master_id);
u32 ostd[2], val;
ostd[0] = readl_relaxed(larb->base + SMI_LARB_OSTD_MON_PORT(port));
ostd[1] = readl_relaxed(larb->base + INT_SMI_LARB_OSTD_MON_PORT(port));
if (ostd[0] || ostd[1]) {
aee_kernel_exception(user,
"%s set larb%u port%u sysram %d failed ostd:%u %u\n",
user, larbid, port, enable, ostd[0], ostd[1]);
return (ostd[1] << 16) | ostd[0];
}
val = readl_relaxed(larb->base + SMI_LARB_NONSEC_CON(port));
if (enable)
writel(val | (0xf << 16),
larb->base + SMI_LARB_NONSEC_CON(port));
else
writel(val & 0xfff0ffff,
larb->base + SMI_LARB_NONSEC_CON(port));
wmb(); /* make sure settings are written */
return 0;
}
EXPORT_SYMBOL_GPL(smi_sysram_enable);
static int
mtk_smi_larb_bind(struct device *dev, struct device *master, void *data)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
struct mtk_smi_larb_iommu *larb_mmu = data;
unsigned int i;
if (log_level & 1 << log_config_bit)
pr_info("[SMI] start larb bind\n");
for (i = 0; i < MTK_LARB_NR_MAX; i++) {
if (dev == larb_mmu[i].dev) {
larb->larbid = i;
larb->mmu = &larb_mmu[i].mmu;
larb->bank = larb_mmu[i].bank;
if (log_level & 1 << log_config_bit)
dev_notice(dev,
"[SMI]larb%d bind ptr_mmu:0x%x val_mmu_32:0x%x bit32:%u\n",
i, larb->mmu, *((unsigned int *)(larb->mmu)),
larb->bank[i]);
return 0;
}
}
if (log_level & 1 << log_config_bit)
dev_notice(dev, "failed to find any larb matched\n");
return -ENODEV;
}
static void mtk_smi_larb_config_port_gen2_general(struct device *dev)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
u32 reg;
int i;
if (BIT(larb->larbid) & larb->larb_gen->larb_direct_to_common_mask)
return;
if (log_level & 1 << log_config_bit)
dev_notice(dev, "[SMI]larb%d config port\n", larb->larbid);
if (larb->mmu) {
if (log_level & 1 << log_config_bit)
dev_notice(dev, "[SMI]larb%d config mmu:0x%lx mmu_32:0x%x\n",
larb->larbid, *((unsigned long *)(larb->mmu)),
*((unsigned int *)(larb->mmu)));
for_each_set_bit(i, (unsigned long *)larb->mmu, 32) {
reg = readl_relaxed(larb->base + SMI_LARB_NONSEC_CON(i));
reg |= F_MMU_EN;
reg |= BANK_SEL(larb->bank[i]);
writel(reg, larb->base + SMI_LARB_NONSEC_CON(i));
if (log_level & 1 << log_config_bit)
dev_notice(dev,
"[SMI]larb:%d port:%d mmu:%u bit32:%u offset:%#x reg:%#x\n",
larb->larbid, i, larb->mmu, larb->bank[i],
SMI_LARB_NONSEC_CON(i), reg);
}
}
if (!larb->larb_gen->has_bwl)
return;
for (i = 0; i < larb->larb_gen->port_in_larb_gen2[larb->larbid]; i++)
mtk_smi_larb_bw_set_ex(larb->smi.dev, i, larb->larb_gen->bwl[
larb->larbid * SMI_LARB_PORT_NR_MAX + i]);
for (i = 0; i < SMI_LARB_MISC_NR; i++)
writel_relaxed(larb->larb_gen->misc[
larb->larbid * SMI_LARB_MISC_NR + i].value,
larb->base + larb->larb_gen->misc[
larb->larbid * SMI_LARB_MISC_NR + i].offset);
if (!larb->larb_gen->has_grouping || !larb->larb_gen->has_bw_thrt)
return;
for (i = larb->larb_gen->cmd_group[larb->larbid * 2];
i < larb->larb_gen->cmd_group[larb->larbid * 2 + 1]; i++) {
writel_relaxed(readl_relaxed(larb->base + SMI_LARB_NONSEC_CON(i)) | 0x2,
larb->base + SMI_LARB_NONSEC_CON(i));
}
for (i = larb->larb_gen->bw_thrt_en[larb->larbid * 2];
i < larb->larb_gen->bw_thrt_en[larb->larbid * 2 + 1]; i++) {
writel_relaxed(readl_relaxed(larb->base + SMI_LARB_NONSEC_CON(i)) | 0x8,
larb->base + SMI_LARB_NONSEC_CON(i));
}
wmb(); /* make sure settings are written */
}
static void mtk_smi_larb_config_port_mt8173(struct device *dev)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
writel(*larb->mmu, larb->base + SMI_LARB_MMU_EN);
}
static void mtk_smi_larb_config_port_mt8167(struct device *dev)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
writel(*larb->mmu, larb->base + MT8167_SMI_LARB_MMU_EN);
}
static void mtk_smi_larb_config_port_gen1(struct device *dev)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
const struct mtk_smi_larb_gen *larb_gen = larb->larb_gen;
struct mtk_smi *common = dev_get_drvdata(larb->smi_common_dev[0]);
int i, m4u_port_id, larb_port_num;
u32 sec_con_val, reg_val;
m4u_port_id = larb_gen->port_in_larb[larb->larbid];
larb_port_num = larb_gen->port_in_larb[larb->larbid + 1]
- larb_gen->port_in_larb[larb->larbid];
for (i = 0; i < larb_port_num; i++, m4u_port_id++) {
if (*larb->mmu & BIT(i)) {
/* bit[port + 3] controls the virtual or physical */
sec_con_val = SMI_SECUR_CON_VAL_VIRT(m4u_port_id);
} else {
/* do not need to enable m4u for this port */
continue;
}
reg_val = readl(common->smi_ao_base
+ REG_SMI_SECUR_CON_ADDR(m4u_port_id));
reg_val &= SMI_SECUR_CON_VAL_MSK(m4u_port_id);
reg_val |= sec_con_val;
reg_val |= SMI_SECUR_CON_VAL_DOMAIN(m4u_port_id);
writel(reg_val,
common->smi_ao_base
+ REG_SMI_SECUR_CON_ADDR(m4u_port_id));
}
}
static void
mtk_smi_larb_unbind(struct device *dev, struct device *master, void *data)
{
/* Do nothing as the iommu is always enabled. */
}
static const struct component_ops mtk_smi_larb_component_ops = {
.bind = mtk_smi_larb_bind,
.unbind = mtk_smi_larb_unbind,
};
static u8
mtk_smi_larb_mt6873_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x2, 0x28, 0xa, 0xc, 0x28,},
{0x2, 0x2, 0x18, 0x18, 0x18, 0xa, 0xc, 0x28,},
{0x5, 0x5, 0x5, 0x5, 0x1,},
{},
{0x28, 0x19, 0xb, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1,},
{0x1, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x16,},
{},
{0x1, 0x3, 0x2, 0x1, 0x1, 0x5, 0x2, 0x12, 0x13, 0x4, 0x4, 0x1,
0x4, 0x2, 0x1,},
{},
{0xa, 0x7, 0xf, 0x8, 0x1, 0x8, 0x9, 0x3, 0x3, 0x6, 0x7, 0x4,
0xa, 0x3, 0x4, 0xe, 0x1, 0x7, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1,},
{},
{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0xe, 0x1, 0x7, 0x8, 0x7, 0x7, 0x1, 0x6, 0x2,
0xf, 0x8, 0x1, 0x1, 0x1,},
{},
{0x2, 0xc, 0xc, 0xe, 0x6, 0x6, 0x6, 0x6, 0x6, 0x12, 0x6, 0x28,},
{0x2, 0xc, 0xc, 0x28, 0x12, 0x6,},
{},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x4, 0x28, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x4, 0x28, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x4, 0x28, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x2, 0x2, 0x4, 0x2,},
{0x9, 0x9, 0x5, 0x5, 0x1, 0x1,},
};
static u8
mtk_smi_larb_mt6853_cmd_group[MTK_LARB_NR_MAX][2] = {
{2, 3}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6853_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x2, 0x28, 0x1e,},
{0x2, 0x18, 0xa, 0xc, 0x1e,},
{0x5, 0x5, 0x5, 0x5, 0x1,},
{},
{0x28, 0x19, 0xb, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1, 0x16,},
{},
{},
{0x1, 0x3, 0x2, 0x1, 0x1, 0x5, 0x2, 0x12, 0x13, 0x4, 0x4, 0x1, 0x4,},
{},
{0xa, 0x7, 0xf, 0x8, 0x1, 0x8, 0x9, 0x3, 0x3, 0x6, 0x7, 0x4,
0xa, 0x3, 0x4, 0xe, 0x1, 0x7, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1,},
{},
{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0xe, 0x1, 0x7, 0x8, 0x7, 0x7, 0x1, 0x6, 0x2,
0xf, 0x8, 0x1, 0x1, 0x1,},
{},
{0x2, 0xc, 0xc, 0x1, 0x1, 0x1, 0x6, 0x6, 0x6, 0x12, 0x6, 0x1,},
{0x1, 0x1, 0x1, 0x28, 0x12, 0x6,},
{0x28, 0x1, 0x2, 0x28, 0x1,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x4, 0x28, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x4, 0x28, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x4, 0x28, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x2, 0x2, 0x4, 0x2,},
{0x9, 0x9, 0x5, 0x5, 0x1, 0x1,},
};
static u8
mtk_smi_larb_mt6853_bw_thrt_en[MTK_LARB_NR_MAX][2] = {
{0, 0}, {0, 0},
{0, 5}, {0, 0},
{0, 12}, {0, 0}, {0, 0},
{0, 13}, {0, 0},
{0, 29}, {0, 0}, {0, 29}, {0, 0},
{0, 0}, {0, 0},
{0, 19}, {0, 0}, {0, 0}, {0, 0},
{0, 4}, {0, 6}, /*20*/
};
static u8
mtk_smi_larb_mt6893_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x6, 0x2, 0x2, 0x2, 0x28, 0x18, 0x18, 0x1, 0x1, 0x1, 0x8, 0x8, 0x1, 0x3f,},
{0x2, 0x6, 0x2, 0x2, 0x2, 0x28, 0x18, 0x18, 0x1, 0x1, 0x1, 0x8, 0x8, 0x1, 0x3f,},
{0x5, 0x5, 0x5, 0x5, 0x1, 0x3f,},
{0x5, 0x5, 0x5, 0x5, 0x1, 0x3f,},
{0x28, 0x19, 0xb, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x1,},
{0x1, 0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x16,},
{},
{0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x4, 0x1,
0x4, 0x1, 0xa, 0x6, 0x1, 0xa, 0x6, 0x1, 0x1, 0x1, 0x1, 0x5,
0x3, 0x3, 0x4,},
{0x1, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x4, 0x4, 0x1,
0x4, 0x1, 0xa, 0x6, 0x1, 0xa, 0x6, 0x1, 0x1, 0x1, 0x1, 0x5,
0x3, 0x3, 0x4,},
{0x9, 0x7, 0xf, 0x8, 0x1, 0x8, 0x9, 0x3, 0x3, 0x6, 0x7, 0x4,
0x9, 0x3, 0x4, 0xe, 0x1, 0x7, 0x8, 0x7, 0x7, 0x1, 0x6, 0x2,
0xf, 0x8, 0x1, 0x1, 0x1,},
{},
{0x9, 0x7, 0xf, 0x8, 0x1, 0x8, 0x9, 0x3, 0x3, 0x6, 0x7, 0x4,
0x9, 0x3, 0x4, 0xe, 0x1, 0x7, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1,},
{},
{0x2, 0xc, 0xc, 0xe, 0x6, 0x6, 0x6, 0x6, 0x6, 0x12, 0x6, 0x1,},
{0x2, 0xc, 0xc, 0x28, 0x12, 0x6,},
{0x28, 0x1, 0x2, 0x28, 0x1,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x2, 0x14, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x2, 0x14, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x2, 0x14, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x2, 0x2, 0x4, 0x2,},
{0x9, 0x9, 0x5, 0x5, 0x1, 0x1,},
};
static u8
mtk_smi_larb_mt6893_cmd_group[MTK_LARB_NR_MAX][2] = {
{2, 3}, {1, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6893_bw_thrt_en[MTK_LARB_NR_MAX][2] = {
{14, 15}, {4, 5},
{0, 6}, {0, 0},
{0, 11}, {0, 0}, {0, 0},
{0, 27}, {0, 0},
{0, 29}, {0, 0}, {0, 29}, {0, 0},
{11, 12}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 4}, {0, 6},
};
static u8
mtk_smi_larb_mt6983_cmd_group[MTK_LARB_NR_MAX][2] = {
{7, 12}, {0, 5}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {7, 12}, {0, 5}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6983_bw_thrt_en[MTK_LARB_NR_MAX][2] = {
{14, 16}, {7, 8},
{0, 9}, {0, 0},
{0, 11}, {0, 9}, {0, 4},
{0, 31}, {0, 31},
{0, 25}, {0, 20}, {0, 30}, {0, 16},
{0, 0}, {0, 0},
{0, 19}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {14, 16}, /*20*/
{7, 8}, {0, 30}, {0, 30}, {0, 0},
{0, 0}, {0, 0}, {0, 0},/*26*/
{0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6983_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x6, 0x6, 0x4, 0x4, 0x2, 0x2, 0x40, 0x26, 0x26,
0x20, 0x20, 0xe, 0xe, 0x7, 0x1,}, /* LARB0 */
{0x40, 0x26, 0x26, 0x20, 0x20, 0xe, 0xe, 0x1,}, /* LARB1 */
{0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1,}, /* LARB2 */
{0x6, 0x6, 0x5, 0x5, 0x1, 0x1, 0x1, 0x2, 0x2,}, /* LARB3 */
{0x40, 0x28, 0x11, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x5, 0x1,}, /* LARB4 */
{0x1, 0x1, 0x5, 0x1, 0x1, 0x2, 0x17, 0xc, 0x24,}, /* LARB5 */
{0x1, 0x1, 0x1, 0x1,}, /* LARB6 */
{0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x4, 0x4, 0x1,
0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x3, 0x8, 0x5, 0x1,
0x1, 0x4, 0x2, 0x2, 0x3, 0x1, 0x1, 0x8, 0x5, 0x1, 0x1,}, /* LARB7 */
{0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x4, 0x4, 0x1,
0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x3, 0x8, 0x5, 0x1,
0x1, 0x4, 0x2, 0x2, 0x3, 0x1, 0x1, 0x8, 0x5, 0x1, 0x1,}, /* LARB8 */
{0x13, 0x1, 0x10, 0x8, 0x3, 0x5, 0x1, 0x1, 0x10, 0x10,
0x10, 0x1f, 0x30, 0x2, 0x13, 0x10, 0x8, 0x3, 0x2, 0x7,
0x5, 0x1, 0x30, 0x2, 0x7,}, /* LARB9 */
{0x2f, 0x1, 0x8, 0x8, 0x1, 0x1, 0x4, 0x18, 0x18, 0x19,
0xb, 0x1, 0x10, 0x9, 0x4, 0x4, 0x15, 0x1, 0x6, 0x40,}, /* LARB10 */
{0x4, 0x32, 0x1, 0x32, 0x1, 0x1, 0x1f, 0x10, 0x10, 0x13,
0x10, 0x8, 0x3, 0x5, 0x3, 0x1f, 0x10, 0x10, 0x1f, 0x1f,
0x10, 0x1, 0x1, 0x1f, 0x18, 0x2, 0x7, 0x5, 0x3, 0x40,}, /* LARB11 */
{0x6, 0x2, 0x4, 0x2, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4,
0x6, 0x2, 0x4, 0x2, 0x4, 0x4,}, /* LARB12 */
{0x2, 0x2, 0xa, 0xa, 0xa, 0xa, 0x1, 0x1, 0x2, 0x2,
0x2, 0x2, 0xa, 0xa, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x1, 0x1,}, /* LARB13 */
{0xa, 0xa, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0xa, 0xa,
0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x8,
0x8, 0x1, 0x1,}, /* LARB14 */
{0x1f, 0x1f, 0x4, 0x1, 0x1, 0x4, 0x10, 0x10, 0x10, 0x14,
0x4, 0x7, 0x15, 0x1, 0x1, 0x7, 0x9, 0x14, 0x1,}, /* LARB15 */
{0x1e, 0x2, 0x2, 0x8, 0x2, 0x8, 0x6, 0x2, 0x2, 0x4,
0x8, 0x4, 0x2, 0x4, 0x8, 0x2, 0x12,}, /* LARB16 */
{0x30, 0x10, 0xe, 0x14, 0x6, 0x2, 0x6,}, /* LARB17 */
{0x2, 0x2, 0x12, 0x1, 0x2, 0x2, 0xa, 0x1,}, /* LARB18 */
{0x2, 0x2, 0x2, 0x2,}, /* LARB19 */
{0x2, 0x6, 0x6, 0x4, 0x4, 0x2, 0x2, 0x40, 0x26, 0x26,
0x20, 0x20, 0xe, 0xe, 0x7, 0x1,}, /* LARB20 */
{0x40, 0x26, 0x26, 0x20, 0x20, 0xe, 0xe, 0x1,}, /* LARB21 */
{0x4, 0x32, 0x1, 0x32, 0x1, 0x1, 0x1f, 0x10, 0x10, 0x13,
0x10, 0x8, 0x3, 0x5, 0x3, 0x1f, 0x10, 0x10, 0x1f, 0x1f,
0x10, 0x1, 0x1, 0x1f, 0x18, 0x2, 0x7, 0x5, 0x3, 0x40,}, /* LARB22 */
{0x4, 0x32, 0x1, 0x32, 0x1, 0x1, 0x1f, 0x10, 0x10, 0x13,
0x10, 0x8, 0x3, 0x5, 0x3, 0x1f, 0x10, 0x10, 0x1f, 0x1f,
0x10, 0x1, 0x1, 0x1f, 0x18, 0x2, 0x7, 0x5, 0x3, 0x40,}, /* LARB23 */
{}, /* LARB24 */
{0x2, 0x2, 0x2, 0x8, 0x4, 0x2, 0x2, 0x2, 0x8, 0x4,
0x1, 0x4, 0x4, 0x2,}, /* LARB25 */
{0x2, 0x2, 0x2, 0x8, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1,
0x2, 0x4, 0x4, 0x2,}, /* LARB26 */
{0x1e, 0x2, 0x2, 0x8, 0x2, 0x8, 0x6, 0x2, 0x2, 0x4,
0x8, 0x4, 0x2, 0x4, 0x8, 0x2, 0x12,}, /* LARB27 */
{0x1e, 0x2, 0x2, 0x8, 0x2, 0x8, 0x6, 0x2, 0x2, 0x4,
0x8, 0x4, 0x2, 0x4, 0x8, 0x2, 0x12,}, /* LARB28 */
{0x30, 0x10, 0xe, 0x14, 0x6, 0x2, 0x6,}, /* LARB29 */
{0x30, 0x10, 0xe, 0x14, 0x6, 0x2, 0x6,}, /* LARB30 */
};
static u8
mtk_smi_larb_mt6879_cmd_group[MTK_LARB_NR_MAX][2] = {
{2, 3}, {1, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6879_bw_thrt_en[MTK_LARB_NR_MAX][2] = {
{4, 6}, {7, 8},
{0, 6}, {0, 0},
{0, 14}, {0, 0}, {0, 0},
{0, 15}, {0, 0},
{0, 25}, {0, 20}, {0, 30}, {0, 10},
{0, 0}, {0, 0},
{0, 19}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, /*20*/
{0, 0}, {0, 30}, {0, 30}, {0, 0},
{0, 0}, {0, 0}, {0, 0},/*27*/
{0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6879_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x4, 0x3e, 0xc, 0x6, 0x1,}, /* LARB0 */
{0x2, 0x20, 0x2, 0x4, 0x2, 0xc, 0x4, 0x1,}, /* LARB1 */
{0x2, 0x2, 0x4, 0x4, 0x1, 0x1,}, /* LARB2 */
{}, /* LARB3 */
{0x2f, 0x28, 0xc, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x5, 0x1,
0x17, 0x2, 0x4,}, /* LARB4 */
{}, /* LARB5 */
{}, /* LARB6 */
{0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x4, 0x4, 0x1, 0x3,
0x4, 0x4, 0x2, 0x16, 0x17,}, /* LARB7 */
{}, /* LARB8 */
{0x13, 0x1, 0x10, 0x8, 0x3, 0x5, 0x1, 0x1, 0x10, 0x10,
0x10, 0x1f, 0x30, 0x2, 0x13, 0x10, 0x8, 0x3, 0x2, 0x7,
0x5, 0x1, 0x30, 0x2, 0x7,}, /* LARB9 */
{0x2f, 0x1, 0x8, 0x8, 0x1, 0x1, 0x4, 0x18, 0x18, 0x19,
0xb, 0x1, 0x10, 0x9, 0x4, 0x4, 0x15, 0x1, 0x6, 0x40,}, /* LARB10 */
{0x4, 0x32, 0x1, 0x32, 0x1, 0x1, 0x1f, 0x10, 0x10, 0x13,
0x10, 0x8, 0x3, 0x5, 0x3, 0x1f, 0x10, 0x10, 0x1f, 0x1f,
0x10, 0x1, 0x1, 0x1f, 0x18, 0x2, 0x7, 0x5, 0x3, 0x40,}, /* LARB11 */
{0x6, 0x2, 0x4, 0x2, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4,}, /* LARB12 */
{0x2, 0x2, 0xa, 0xa, 0xa, 0xa, 0x4, 0x4, 0x2, 0x2,
0x2, 0x2, 0xa, 0xa, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2,}, /* LARB13 */
{0xa, 0xa, 0x2, 0x2, 0x2, 0x2, 0x4, 0x4, 0xa, 0xa,
0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x8,
0x8, 0x1, 0x1,}, /* LARB14 */
{0x1f, 0x1f, 0x4, 0x1, 0x1, 0x4, 0x10, 0x10, 0x10, 0x14,
0x4, 0x7, 0x15, 0x1, 0x1, 0x7, 0x9, 0x14, 0x1,}, /* LARB15 */
{0x1e, 0x2, 0x2, 0x8, 0x2, 0x8, 0x6, 0x2, 0x2, 0x4, 0x8,
0x4, 0x2, 0x4, 0x8, 0x2, 0x12,}, /* LARB16 */
{0x30, 0x10, 0xe, 0x14, 0x6, 0x2, 0x6,}, /* LARB17 */
{}, /* LARB18 */
{0x2, 0x2, 0x2, 0x2,}, /* LARB19 */
{}, /* LARB20 */
{}, /* LARB21 */
{0x4, 0x32, 0x1, 0x32, 0x1, 0x1, 0x1f, 0x10, 0x10, 0x13,
0x10, 0x8, 0x3, 0x5, 0x3, 0x1f, 0x10, 0x10, 0x1f, 0x1f,
0x10, 0x1, 0x1, 0x1f, 0x18, 0x2, 0x7, 0x5, 0x3, 0x40,}, /* LARB22 */
{0x4, 0x32, 0x1, 0x32, 0x1, 0x1, 0x1f, 0x10, 0x10, 0x13,
0x10, 0x8, 0x3, 0x5, 0x3, 0x1f, 0x10, 0x10, 0x1f, 0x1f,
0x10, 0x1, 0x1, 0x1f, 0x18, 0x2, 0x7, 0x5, 0x3, 0x40,}, /* LARB23 */
{}, /* LARB24 */
{0x2, 0x2, 0x2, 0x8, 0x4, 0x2, 0x2, 0x2, 0x8, 0x4, 0x1,}, /* LARB25 */
{0x2, 0x2, 0x2, 0x8, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2,}, /* LARB26 */
{0x1e, 0x2, 0x2, 0x8, 0x2, 0x8, 0x6, 0x2, 0x2, 0x4, 0x8,
0x4, 0x2, 0x4, 0x8, 0x2, 0x12,}, /* LARB27 */
{}, /* LARB28 */
{0x30, 0x10, 0xe, 0x14, 0x6, 0x2, 0x6,}, /* LARB29 */
};
static u8
mtk_smi_larb_mt6895_cmd_group[MTK_LARB_NR_MAX][2] = {
{7, 12}, {0, 5}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {7, 12}, {0, 5}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6895_bw_thrt_en[MTK_LARB_NR_MAX][2] = {
{14, 16}, {7, 8},
{0, 9}, {0, 0},
{0, 11}, {0, 9}, {0, 4},
{0, 31}, {0, 31},
{0, 25}, {0, 20}, {0, 30}, {0, 16},
{0, 0}, {0, 0},
{0, 19}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {14, 16}, /*20*/
{7, 8}, {0, 30}, {0, 30}, {0, 0},
{0, 0}, {0, 0}, {0, 0},/*26*/
{0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6895_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x6, 0x6, 0x4, 0x4, 0x2, 0x2, 0x40, 0x26, 0x26,
0x20, 0x20, 0xe, 0xe, 0x7, 0x1,}, /* LARB0 */
{0x40, 0x26, 0x26, 0x20, 0x20, 0xe, 0xe, 0x1,}, /* LARB1 */
{0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1,}, /* LARB2 */
{0x6, 0x6, 0x5, 0x5, 0x1, 0x1, 0x1, 0x2, 0x2,}, /* LARB3 */
{0x40, 0x28, 0x11, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x5, 0x1,}, /* LARB4 */
{0x1, 0x1, 0x5, 0x1, 0x1, 0x2, 0x17, 0xc, 0x24,}, /* LARB5 */
{0x1, 0x1, 0x1, 0x1,}, /* LARB6 */
{0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x4, 0x4, 0x1,
0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x3, 0x8, 0x5, 0x1,
0x1, 0x4, 0x2, 0x2, 0x3, 0x1, 0x1, 0x8, 0x5, 0x1, 0x1,}, /* LARB7 */
{0x1, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x4, 0x4, 0x1,
0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x3, 0x8, 0x5, 0x1,
0x1, 0x4, 0x2, 0x2, 0x3, 0x1, 0x1, 0x8, 0x5, 0x1, 0x1,}, /* LARB8 */
{0x13, 0x1, 0x10, 0x8, 0x3, 0x5, 0x1, 0x1, 0x10, 0x10,
0x10, 0x1f, 0x30, 0x2, 0x13, 0x10, 0x8, 0x3, 0x2, 0x7,
0x5, 0x1, 0x30, 0x2, 0x7,}, /* LARB9 */
{0x2f, 0x1, 0x8, 0x8, 0x1, 0x1, 0x4, 0x18, 0x18, 0x19,
0xb, 0x1, 0x10, 0x9, 0x4, 0x4, 0x15, 0x1, 0x6, 0x40,}, /* LARB10 */
{0x4, 0x32, 0x1, 0x32, 0x1, 0x1, 0x1f, 0x10, 0x10, 0x13,
0x10, 0x8, 0x3, 0x5, 0x3, 0x1f, 0x10, 0x10, 0x1f, 0x1f,
0x10, 0x1, 0x1, 0x1f, 0x18, 0x2, 0x7, 0x5, 0x3, 0x40,}, /* LARB11 */
{0x6, 0x2, 0x4, 0x2, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4,
0x6, 0x2, 0x4, 0x2, 0x4, 0x4,}, /* LARB12 */
{0x2, 0x2, 0xa, 0xa, 0xa, 0xa, 0x1, 0x1, 0x2, 0x2,
0x2, 0x2, 0xa, 0xa, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x1, 0x1,}, /* LARB13 */
{0xa, 0xa, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0xa, 0xa,
0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x8,
0x8, 0x1, 0x1,}, /* LARB14 */
{0x1f, 0x1f, 0x4, 0x1, 0x1, 0x4, 0x10, 0x10, 0x10, 0x14,
0x4, 0x7, 0x15, 0x1, 0x1, 0x7, 0x9, 0x14, 0x1,}, /* LARB15 */
{0x1e, 0x2, 0x2, 0x8, 0x2, 0x8, 0x6, 0x2, 0x2, 0x4,
0x8, 0x4, 0x2, 0x4, 0x8, 0x2, 0x12,}, /* LARB16 */
{0x30, 0x10, 0xe, 0x14, 0x6, 0x2, 0x6,}, /* LARB17 */
{0x2, 0x2, 0x12, 0x1, 0x2, 0x2, 0xa, 0x1,}, /* LARB18 */
{0x2, 0x2, 0x2, 0x2,}, /* LARB19 */
{0x2, 0x6, 0x6, 0x4, 0x4, 0x2, 0x2, 0x40, 0x26, 0x26,
0x20, 0x20, 0xe, 0xe, 0x7, 0x1,}, /* LARB20 */
{0x40, 0x26, 0x26, 0x20, 0x20, 0xe, 0xe, 0x1,}, /* LARB21 */
{0x4, 0x32, 0x1, 0x32, 0x1, 0x1, 0x1f, 0x10, 0x10, 0x13,
0x10, 0x8, 0x3, 0x5, 0x3, 0x1f, 0x10, 0x10, 0x1f, 0x1f,
0x10, 0x1, 0x1, 0x1f, 0x18, 0x2, 0x7, 0x5, 0x3, 0x40,}, /* LARB22 */
{0x4, 0x32, 0x1, 0x32, 0x1, 0x1, 0x1f, 0x10, 0x10, 0x13,
0x10, 0x8, 0x3, 0x5, 0x3, 0x1f, 0x10, 0x10, 0x1f, 0x1f,
0x10, 0x1, 0x1, 0x1f, 0x18, 0x2, 0x7, 0x5, 0x3, 0x40,}, /* LARB23 */
{}, /* LARB24 */
{0x2, 0x2, 0x2, 0x8, 0x4, 0x2, 0x2, 0x2, 0x8, 0x4,
0x1, 0x4, 0x4, 0x2,}, /* LARB25 */
{0x2, 0x2, 0x2, 0x8, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1,
0x2, 0x4, 0x4, 0x2,}, /* LARB26 */
{0x1e, 0x2, 0x2, 0x8, 0x2, 0x8, 0x6, 0x2, 0x2, 0x4,
0x8, 0x4, 0x2, 0x4, 0x8, 0x2, 0x12,}, /* LARB27 */
{0x1e, 0x2, 0x2, 0x8, 0x2, 0x8, 0x6, 0x2, 0x2, 0x4,
0x8, 0x4, 0x2, 0x4, 0x8, 0x2, 0x12,}, /* LARB28 */
{0x30, 0x10, 0xe, 0x14, 0x6, 0x2, 0x6,}, /* LARB29 */
{0x30, 0x10, 0xe, 0x14, 0x6, 0x2, 0x6,}, /* LARB30 */
};
static u8 //TBD
mtk_smi_larb_mt6886_cmd_group[MTK_LARB_NR_MAX][2] = {
{4, 5}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{4, 5}, {0, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6886_bw_thrt_en[MTK_LARB_NR_MAX][2] = {
{10, 11}, {5, 6}, {4, 5}, {0, 0}, {0, 14}, {0, 0},
{0, 0}, {0, 21}, {0, 0}, {0, 29}, {0, 21}, /*10*/
{0, 12}, {0, 12}, {0, 0}, {0, 0}, {0, 19},
{0, 0}, {0, 0}, {0, 0}, {2, 10}, {0, 0}, /*20*/
{0, 0}, {0, 12}, {0, 12}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 22}, {0, 0}, {0, 0}, /*30*/
{0, 0}, {0, 0}, {0, 0}, {0, 0}, /*34*/
};
static u8
mtk_smi_larb_mt6886_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x6, 0x4, 0x4, 0x40, 0x22, 0x22, 0xe, 0xe,
0xe, 0x26,}, /* LARB0 */
{0x40, 0x22, 0x22, 0xe, 0xe, 0x26,}, /* LARB1 */
{0x8, 0x8, 0x8, 0x8, 0x26,}, /* LARB2 */
{}, /* LARB3 */
{0x2f, 0x28, 0xc, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x5,
0x1, 0x17, 0x2, 0x4,}, /* LARB4 */
{}, /* LARB5 */
{}, /* LARB6 */
{0x1, 0x4, 0x2, 0x1, 0x1, 0x16, 0x17, 0x7, 0x4, 0x1,
0x1, 0x8, 0x3, 0x4, 0x4, 0x4, 0x2, 0x2, 0x7, 0x3,
0x4,}, /* LARB7 */
{}, /* LARB8 */
{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x16, 0x16, 0x6, 0x6, 0xc, 0x2b, 0x1c, 0xa, 0x31,
0x10, 0x8, 0x1, 0x1, 0x1, 0xc, 0x1, 0x1, 0x1,}, /* LARB9 */
{0x2b, 0x9, 0x9, 0x8, 0xf, 0x6, 0xb, 0x8, 0x1e, 0xb,
0xb, 0x8, 0x2b, 0x8, 0x19, 0xb, 0x8, 0x3, 0x3, 0x1,
0x1,}, /* LARB10 */
{0xc, 0x16, 0x6, 0x16, 0x1e, 0xf, 0xb, 0xb, 0x10, 0x3,
0x1, 0x1,}, /* LARB11 */
{0x5, 0x3, 0x3, 0x4, 0x8, 0x8, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1,}, /* LARB12 */
{0x2, 0x1c, 0x1, 0x2, 0x2,}, /* LARB13 */
{0x2, 0x28, 0x2, 0x2,}, /* LARB14 */
{0x19, 0x19, 0xb, 0xf, 0xb, 0xb, 0x6, 0xb, 0xb, 0x2b,
0xd, 0x20, 0x9, 0xd, 0xb, 0xb, 0xb, 0x1, 0x1,}, /* LARB15 */
{0x4, 0x12, 0x8, 0x12, 0x1e, 0x8, 0x4, 0x6, 0x4, 0x18,
0x6, 0x8, 0x1, 0x1, 0x1, 0x1,}, /* LARB16 */
{0x1a, 0x1a, 0x12, 0x6, 0x8, 0x4, 0x4, 0x1,}, /* LARB17 */
{}, /* LARB18 */
{0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x2, 0x2,}, /* LARB19 */
{}, /* LARB20 */
{}, /* LARB21 */
{0x8, 0x16, 0x6, 0x16, 0x1e, 0xf, 0xb, 0xb, 0x10, 0x3,
0x1, 0x1,}, /* LARB22 */
{0x6, 0x16, 0x6, 0x16, 0x1e, 0xf, 0xb, 0xb, 0x10, 0x3,
0x1, 0x1,}, /* LARB23 */
{}, /* LARB24 */
{0x2, 0x6, 0x2, 0x6, 0x4, 0x4, 0x1, 0x1, 0x1, 0x2,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x6, 0x6, 0x1, 0x1,}, /* LARB25 */
{0x2, 0x6, 0x1, 0x1, 0x1, 0x1, 0x6, 0x1, 0x1, 0x1,
0x1,}, /* LARB26 */
{0x8, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,}, /* LARB27 */
{0x16, 0x16, 0x9, 0x9, 0xc, 0x8, 0x8, 0xa, 0xd, 0x2b,
0x1c, 0x1d, 0x31, 0x10, 0x10, 0xd, 0xc, 0x8, 0x16, 0x1,
0x1, 0x1,}, /* LARB28 */
{0x1, 0x2, 0x2, 0x1, 0x1, 0xe, 0x6, 0x1, 0x2, 0x2,}, /* LARB29 */
{0x4, 0x12, 0x8, 0x12, 0x1e, 0x8, 0x4, 0x6, 0x4, 0x18,
0x6, 0x8, 0x1, 0x1, 0x1, 0x1,}, /* LARB30 */
{}, /* LARB31 */
{}, /* LARB32 */
{}, /* LARB33 */
{0x1a, 0x1a, 0x12, 0x6, 0x8, 0x4, 0x4, 0x1,}, /* LARB34 */
};
static u8
mtk_smi_larb_mt6855_cmd_group[MTK_LARB_NR_MAX][2] = {
{1, 2}, {1, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6855_bw_thrt_en[MTK_LARB_NR_MAX][2] = {
{4, 5}, {4, 5},
{0, 4}, {0, 0},
{0, 13}, {0, 0}, {0, 0},
{0, 13}, {0, 0},
{0, 29}, {0, 0}, {0, 29}, {0, 0},
{0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 6}, /*20*/
};
static u8
mtk_smi_larb_mt6855_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x40, 0x4, 0xa, 0x26,}, /* LARB0 */
{0x2, 0x20, 0x2, 0xa, 0x26,}, /* LARB1 */
{0x2, 0x4, 0x4, 0x1,}, /* LARB2 */
{}, /* LARB3 */
{0x2f, 0x1, 0xc, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x5, 0x1,
0x2, 0x4,}, /* LARB4 */
{}, /* LARB5 */
{}, /* LARB6 */
{0x1, 0x3, 0x2, 0x1, 0x1, 0x8, 0x8, 0x16, 0x17, 0x4,
0x4, 0x1, 0x4,}, /* LARB7 */
{}, /* LARB8 */
{0x6, 0x3, 0xc, 0x6, 0x1, 0x4, 0x4, 0x2, 0x2, 0x5,
0x5, 0x2, 0x6, 0x3, 0x3, 0xb, 0x1, 0x6, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,}, /* LARB9 */
{}, /* LARB10 */
{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0xb, 0x1, 0x6, 0x6, 0x5,
0x6, 0x1, 0x5, 0x2, 0xc, 0x6, 0x1, 0x1, 0x1,}, /* LARB11 */
{}, /* LARB12 */
{0x2, 0xa, 0xa, 0xc, 0x6, 0x6, 0x6, 0x6, 0x6, 0xe,
0x4, 0x1, 0x6, 0x6, 0x2,}, /* LARB13 */
{0x1, 0x1, 0x1, 0x2a, 0xe, 0x4, 0xc, 0xc, 0x6, 0x6,}, /* LARB14 */
{}, /* LARB15 */
{0x28, 0x10, 0x2, 0x8, 0x14, 0x2, 0x1e, 0x10, 0x4, 0x2,
0x4, 0x2, 0x4, 0x2, 0x6, 0x2, 0x4,}, /* LARB16 */
{0x28, 0x10, 0x2, 0x8, 0x14, 0x2, 0x1e, 0x10, 0x4, 0x2,
0x4, 0x2, 0x4, 0x2, 0x6, 0x2, 0x4,}, /* LARB17 */
{}, /* LARB18 */
{}, /* LARB19 */
{0x7, 0x7, 0x4, 0x4, 0x1, 0x1,}, /* LARB20 */
};
static u8
mtk_smi_larb_mt6835_cmd_group[MTK_LARB_NR_MAX][2] = {
{1, 2}, {1, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6835_bw_thrt_en[MTK_LARB_NR_MAX][2] = {
{4, 5}, {4, 5},
{0, 4}, {0, 0},
{0, 13}, {0, 0}, {0, 0},
{0, 13}, {0, 0},
{0, 29}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 6}, /*20*/
};
static u8
mtk_smi_larb_mt6835_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x48, 0x10, 0x8, 0x26,}, /* LARB0 */
{0x2, 0x24, 0x8, 0x1, 0x26,}, /* LARB1 */
{0x2, 0x4, 0x4, 0x1,}, /* LARB2 */
{}, /* LARB3 */
{0x2f, 0xc, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x5,}, /* LARB4 */
{}, /* LARB5 */
{}, /* LARB6 */
{0x1, 0x3, 0x2, 0x1, 0x1, 0x8, 0x8, 0x16, 0x17, 0x4,
0x4, 0x1, 0x4,}, /* LARB7 */
{}, /* LARB8 */
{0x6, 0x3, 0xc, 0x6, 0x1, 0x4, 0x4, 0x2, 0x2, 0x5,
0x5, 0x2, 0x6,}, /* LARB9 */
{}, /* LARB10 */
{}, /* LARB11 */
{}, /* LARB12 */
{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x6, 0x6, 0x6, 0x1,
0x1, 0x1,}, /* LARB13 */
{}, /* LARB14 */
{}, /* LARB15 */
{0x28, 0x10, 0x2, 0x8, 0x1, 0x1, 0x1e, 0x1, 0x4, 0x2,
0x4, 0x2, 0x4, 0x2, 0x6, 0x2, 0x4,}, /* LARB16 */
{0x28, 0x10, 0x2, 0x8, 0x1, 0x1, 0x1e, 0x1, 0x4, 0x2,
0x4, 0x2, 0x4, 0x2, 0x6, 0x2, 0x4,}, /* LARB17 */
{}, /* LARB18 */
{}, /* LARB19 */
{0x7, 0x7, 0x4, 0x4,}, /* LARB20 */
};
static u8
mtk_smi_larb_mt6833_cmd_group[MTK_LARB_NR_MAX][2] = {
{5, 8}, {5, 8}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6833_bw_thrt_en[MTK_LARB_NR_MAX][2] = {
{0, 0}, {0, 0},
{0, 5}, {0, 0},
{0, 12}, {0, 0}, {0, 0},
{0, 13}, {0, 0},
{0, 29}, {0, 0}, {0, 30}, {0, 3},
{0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 4}, {0, 6}, /*20*/
};
static u8
mtk_smi_larb_mt6833_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x2, 0x28, 0x28,},
{0x2, 0x18, 0x6, 0x6, 0x28,},
{0x6, 0x6, 0x6, 0x6, 0x1,},
{},
{0x28, 0x1, 0xc, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x18,},
{},
{},
{0x1, 0x3, 0x1, 0x1, 0x1, 0x3, 0x2, 0xd, 0x7, 0x5, 0x3, 0x1, 0x5,},
{},
{0xa, 0x7, 0xf, 0x8, 0x1, 0x8, 0x9, 0x3, 0x3, 0x6, 0x7, 0x4,
0xa, 0x3, 0x4, 0xe, 0x1, 0x7, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1,},
{},
{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0xe, 0x1, 0x7, 0x8, 0x7, 0x7, 0x1, 0x6, 0x2,
0xf, 0x8, 0x1, 0x1, 0x1,},
{},
{0x2, 0xc, 0xc, 0x1, 0x1, 0x1, 0x6, 0x6, 0x6, 0x12, 0x6, 0x1,},
{0x1, 0x1, 0x1, 0x1, 0x12, 0x6,},
{0x28, 0x1, 0x2, 0x28, 0x1,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x4, 0x28, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x4, 0x28, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x28, 0x14, 0x2, 0xc, 0x18, 0x4, 0x28, 0x14, 0x4, 0x4, 0x4, 0x2,
0x4, 0x2, 0x8, 0x4, 0x4,},
{0x2, 0x2, 0x4, 0x2,},
{0x9, 0x9, 0x5, 0x5, 0x1, 0x1,},
};
static u8
mtk_smi_larb_mt6985_cmd_group[MTK_LARB_NR_MAX][2] = {
{1, 6}, {0, 6}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 6}, {0, 6}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
};
static u8
mtk_smi_larb_mt6985_bw_thrt_en[MTK_LARB_NR_MAX][2] = {
{6, 9}, {7, 8}, {0, 9}, {7, 9}, {0, 11}, {0, 9},
{0, 4}, {0, 31}, {0, 31}, {0, 29}, {0, 19}, /*10*/
{0, 10}, {0, 11}, {0, 0}, {0, 0}, {0, 17},
{0, 0}, {0, 0}, {0, 4}, {4, 8}, {6, 9}, /*20*/
{7, 8}, {0, 10}, {0, 10}, {0, 0}, {4, 10},
{4, 10}, {0, 2}, {0, 22}, {0, 0}, {0, 0}, /*30*/
{0, 0}, {7, 9}, {8, 9}, {0, 0}, {0, 0}, /*35*/
{0, 31}, {0, 31},
};
static u8
mtk_smi_larb_mt6985_bwl[MTK_LARB_NR_MAX][SMI_LARB_PORT_NR_MAX] = {
{0x2, 0x40, 0x40, 0x2, 0x40, 0x40, 0xa, 0xa, 0x26,}, /* LARB0 */
{0x40, 0x2, 0x40, 0x40, 0x2, 0x40, 0x14, 0x26,}, /* LARB1 */
{0x4, 0x10, 0x26, 0x4, 0x10, 0x1, 0x1, 0x1, 0x1,}, /* LARB2 */
{0x6, 0x12, 0x26, 0x6, 0x12, 0x2, 0x2, 0x2, 0x2,}, /* LARB3 */
{0x40, 0x40, 0x22, 0x1, 0x1, 0x1, 0x1, 0x3, 0x3, 0xa, 0x1,}, /* LARB4 */
{0x2, 0x2, 0xa, 0x1, 0x1, 0x3, 0x2d, 0x17, 0x40,}, /* LARB5 */
{0xd, 0xf, 0xd, 0xf,}, /* LARB6 */
{0x20, 0x4, 0x2, 0x1, 0x1, 0x1d, 0x1d, 0x7, 0x4, 0x1,
0x1, 0x8, 0x3, 0x5, 0x8, 0x8, 0x3, 0x8, 0x5, 0xd,
0xd, 0x4, 0x2, 0x8, 0xb, 0x3, 0x4, 0x8, 0x5, 0x1, 0x1,}, /* LARB7 */
{0x20, 0x4, 0x2, 0x1, 0x1, 0x1d, 0x1d, 0x7, 0x4, 0x1,
0x1, 0x8, 0x3, 0x5, 0x8, 0x8, 0x3, 0x8, 0x5, 0xd,
0xd, 0x4, 0x2, 0x3, 0x4, 0x1, 0x4, 0x8, 0x5, 0x1, 0x1,}, /* LARB8 */
{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x16, 0x16, 0x6, 0x6, 0xc, 0x2b, 0x1c, 0xa, 0x31,
0x10, 0x8, 0x1, 0x1, 0x1, 0xc, 0x1, 0x1, 0x1,}, /* LARB9 */
{0x2b, 0x9, 0x9, 0x8, 0xf, 0x6, 0xb, 0x8, 0x1e, 0xb,
0xb, 0x8, 0x2b, 0x8, 0x19, 0x8, 0x3, 0x3,}, /* LARB10 */
{0x6, 0x23, 0x6, 0x23, 0x1e, 0xf, 0xb, 0xb, 0x16, 0x3,}, /* LARB11 */
{0x8, 0x5, 0x3, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1,}, /* LARB12 */
{0x2, 0x1c, 0x8, 0x1, 0x1,}, /* LARB13 */
{0x2, 0x28, 0x1, 0x1,}, /* LARB14 */
{0x19, 0x19, 0xb, 0xf, 0xb, 0xb, 0x6, 0xb, 0xb, 0x2b,
0xd, 0x20, 0x9, 0xd, 0xb, 0xb, 0xb,}, /* LARB15 */
{0x4, 0x12, 0x8, 0x12, 0x1e, 0x8, 0x4, 0x6, 0x4, 0x18,
0x6, 0x8, 0x1, 0x1, 0x1, 0x1,}, /* LARB16 */
{0x1a, 0x1a, 0x12, 0x6, 0x8, 0x4, 0x4, 0x1,}, /* LARB17 */
{0x8, 0x4, 0x1, 0x1,}, /* LARB18 */
{0x4, 0x4, 0x1, 0x1, 0x2, 0x1, 0x4, 0x2, 0x1, 0x1,
0x1, 0x1,}, /* LARB19 */
{0x2, 0x40, 0x40, 0x2, 0x40, 0x40, 0xa, 0xa, 0x26,}, /* LARB20 */
{0x40, 0x2, 0x40, 0x40, 0x2, 0x40, 0x14, 0x26,}, /* LARB21 */
{0x6, 0x23, 0x6, 0x23, 0x1e, 0xf, 0xb, 0xb, 0x16, 0x3,}, /* LARB22 */
{0x6, 0x23, 0x6, 0x23, 0x1e, 0xf, 0xb, 0xb, 0x16, 0x3,}, /* LARB23 */
{}, /* LARB24 */
{0x2, 0x6, 0x2, 0x6, 0x3, 0x3, 0x3, 0x3, 0x3, 0x1,
0x6, 0x6, 0x1, 0x1,}, /* LARB25 */
{0x2, 0x6, 0x2, 0x6, 0x3, 0x3, 0x3, 0x3, 0x3, 0x1,
0x6, 0x6, 0x1, 0x1,}, /* LARB26 */
{0xc, 0x4, 0x1a, 0x2, 0x8, 0x4, 0x2, 0x1,}, /* LARB27 */
{0x16, 0x16, 0x9, 0x9, 0xc, 0x8, 0x8, 0xa, 0xd, 0x2b,
0x1c, 0x1d, 0x31, 0x10, 0x10, 0xd, 0xc, 0x8, 0x16, 0x1,
0x1, 0x1,}, /* LARB28 */
{0x2, 0x2, 0x2, 0x2, 0x10, 0xe, 0x6, 0x6, 0x1, 0x1,}, /* LARB29 */
{0x4, 0x12, 0x8, 0x12, 0x1e, 0x8, 0x4, 0x6, 0x4, 0x18,
0x6, 0x8, 0x1, 0x1, 0x1, 0x1,}, /* LARB30 */
{0x4, 0x12, 0x8, 0x12, 0x1e, 0x8, 0x4, 0x6, 0x4, 0x18,
0x6, 0x8, 0x1, 0x1, 0x1, 0x1,}, /* LARB31 */
{0x2, 0x40, 0x6, 0x6, 0x6, 0xa, 0xa, 0xa, 0xa,}, /* LARB32 */
{0x2, 0x40, 0x6, 0x6, 0x6, 0xa, 0xa, 0xa, 0xa,}, /* LARB33 */
{0x1a, 0x1a, 0x12, 0x6, 0x8, 0x4, 0x4, 0x1,}, /* LARB34 */
{0x1a, 0x1a, 0x12, 0x6, 0x8, 0x4, 0x4, 0x1,}, /* LARB35 */
{0x20, 0x4, 0x2, 0x1, 0x1, 0x1d, 0x1d, 0x7, 0x4, 0x1,
0x1, 0x8, 0x3, 0x5, 0x8, 0x8, 0x3, 0x8, 0x5, 0xd,
0xd, 0x4, 0x2, 0x8, 0xb, 0x3, 0x4, 0x8, 0x5, 0x1, 0x1,}, /* LARB36 */
{0x20, 0x4, 0x2, 0x1, 0x1, 0x1d, 0x1d, 0x7, 0x4, 0x1,
0x1, 0x8, 0x1, 0x1, 0x8, 0x8, 0x3, 0x8, 0x5, 0xd,
0xd, 0x4, 0x2, 0x3, 0x4, 0x1, 0x4, 0x8, 0x5, 0x1, 0x1,}, /* LARB37 */
};
static struct mtk_smi_reg_pair
mtk_smi_larb_mt6833_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
};
static struct mtk_smi_reg_pair
mtk_smi_larb_mt6873_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
};
static struct mtk_smi_reg_pair
mtk_smi_larb_mt6853_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
};
static struct mtk_smi_reg_pair
mtk_smi_larb_mt6893_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_VC_PRI_MODE, 0x1}, {SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},},
{{SMI_LARB_VC_PRI_MODE, 0x1}, {SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{INT_SMI_LARB_CMD_THRT_CON, 0x370256},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{INT_SMI_LARB_CMD_THRT_CON, 0x370256},},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},
{INT_SMI_LARB_CMD_THRT_CON, 0x300256},},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},
{INT_SMI_LARB_CMD_THRT_CON, 0x300256},},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_DBG_CON, 0x1}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{INT_SMI_LARB_DBG_CON, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_DBG_CON, 0x1}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{INT_SMI_LARB_DBG_CON, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_FORCE_ULTRA, 0x8000}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_FORCE_ULTRA, 0x8000}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_FORCE_ULTRA, 0x8000}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
};
static struct mtk_smi_reg_pair
mtk_smi_larb_mt6983_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xC000},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x80},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x1ff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xcff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x1ff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xf},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xC000},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x80},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
};
static struct mtk_smi_reg_pair
mtk_smi_larb_mt6879_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
};
static struct mtk_smi_reg_pair
mtk_smi_larb_mt6895_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1},},
};
static struct mtk_smi_reg_pair //SMI_LARB_DISABLE_ULTRA TBD
mtk_smi_larb_mt6886_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x400},}, /*LARB0*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x20},}, /*LARB1*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x10},}, /*LARB2*/
{}, /*LARB3*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x3fff},}, /*LARB4*/
{}, /*LARB5*/
{}, /*LARB6*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x1fffff},}, /*LARB7*/
{}, /*LARB8*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x1fffffff},}, /*LARB9*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x1fffff},}, /*LARB10*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xfff},}, /*LARB11*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xfff},}, /*LARB12*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB13*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB14*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x7ffff},}, /*LARB15*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB16*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB17*/
{}, /*LARB18*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x3fc},}, /*LARB19*/
{}, /*LARB20*/
{}, /*LARB21*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xfff},}, /*LARB22*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xfff},}, /*LARB23*/
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB25*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB26*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB27*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x3fffff},}, /*LARB28*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB29*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB30*/
{}, /*LARB31*/
{}, /*LARB32*/
{}, /*LARB33*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB34*/
};
static struct mtk_smi_reg_pair
mtk_smi_larb_mt6855_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB0*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB1*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB2*/
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB4*/
{},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB7*/
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB9*/
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB11*/
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB13*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB14*/
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB16*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB17*/
{},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB20*/
};
static struct mtk_smi_reg_pair
mtk_smi_larb_mt6835_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_DISABLE_ULTRA, 0x10}}, /*LARB0*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_DISABLE_ULTRA, 0x10}}, /*LARB1*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_DISABLE_ULTRA, 0xf}}, /*LARB2*/
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_DISABLE_ULTRA, 0x1fff}}, /*LARB4*/
{},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_DISABLE_ULTRA, 0x1fff}}, /*LARB7*/
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_DISABLE_ULTRA, 0x1fffffff}}, /*LARB9*/
{},
{},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_SW_FLAG, 0x1},}, /*LARB13*/
{},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB16*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_FORCE_ULTRA, 0x8000},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB17*/
{},
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {SMI_LARB_SW_FLAG, 0x1},
{SMI_LARB_DISABLE_ULTRA, 0xf}}, /*LARB20*/
};
static struct mtk_smi_reg_pair
mtk_smi_larb_mt6985_misc[MTK_LARB_NR_MAX][SMI_LARB_MISC_NR] = {
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x100},}, /*LARB0*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x80},}, /*LARB1*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x1ff},}, /*LARB2*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x196},}, /*LARB3*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xfff},}, /*LARB4*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x1ff},}, /*LARB5*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xf},}, /*LARB6*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370256},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},}, /*LARB7*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},}, /*LARB8*/
{{SMI_LARB_CMD_THRT_CON, 0x3402ff}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x1fffffff},}, /*LARB9*/
{{SMI_LARB_CMD_THRT_CON, 0x3402ff}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x7ffff},}, /*LARB10*/
{{SMI_LARB_CMD_THRT_CON, 0x3402ff}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x3ff},}, /*LARB11*/
{{SMI_LARB_CMD_THRT_CON, 0x3402ff}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x7ff},}, /*LARB12*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB13*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB14*/
{{SMI_LARB_CMD_THRT_CON, 0x3402ff}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x1ffff},}, /*LARB15*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB16*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB17*/
{{SMI_LARB_CMD_THRT_CON, 0x3402ff}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xf},}, /*LARB18*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB19*/
{{SMI_LARB_CMD_THRT_CON, 0x370256}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x100},}, /*LARB20*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x80},}, /*LARB21*/
{{SMI_LARB_CMD_THRT_CON, 0x3402ff}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x3ff},}, /*LARB22*/
{{SMI_LARB_CMD_THRT_CON, 0x3402ff}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0x3ff},}, /*LARB23*/
{},
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB25*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB26*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB27*/
{{SMI_LARB_CMD_THRT_CON, 0x3402ff}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB28*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB29*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB30*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB31*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_FORCE_PREULTRA, 0x18},
{SMI_LARB_FORCE_ULTRA, 0x18},}, /*LARB32*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_FORCE_PREULTRA, 0x18},
{SMI_LARB_FORCE_ULTRA, 0x18},}, /*LARB33*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB34*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1},}, /*LARB35*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},}, /*LARB36*/
{{SMI_LARB_CMD_THRT_CON, 0x370223}, {INT_SMI_LARB_CMD_THRT_CON, 0x370223},
{SMI_LARB_SW_FLAG, 0x1}, {SMI_LARB_DISABLE_ULTRA, 0xffffffff},}, /*LARB37*/
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt8173 = {
/* mt8173 do not need the port in larb */
.config_port = mtk_smi_larb_config_port_mt8173,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt8167 = {
/* mt8167 do not need the port in larb */
.config_port = mtk_smi_larb_config_port_mt8167,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt2701 = {
.port_in_larb = {
LARB0_PORT_OFFSET, LARB1_PORT_OFFSET,
LARB2_PORT_OFFSET, LARB3_PORT_OFFSET
},
.config_port = mtk_smi_larb_config_port_gen1,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt2712 = {
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(8) | BIT(9), /* bdpsys */
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6779 = {
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask =
BIT(4) | BIT(6) | BIT(11) | BIT(12) | BIT(13),
/* DUMMY | IPU0 | IPU1 | CCU | MDLA */
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6873 = {
.port_in_larb_gen2 = {6, 8, 5, 0, 11, 8, 0, 15, 0, 29, 0, 29,
0, 12, 6, 0, 17, 17, 17, 4, 6,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(3) | BIT(6) | BIT(8) |
BIT(10) | BIT(12) | BIT(15) | BIT(21) |
BIT(22),
/*skip larb: 3,6,8,10,12,15,21,22*/
.has_bwl = true,
.bwl = (u8 *)mtk_smi_larb_mt6873_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6873_misc,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6853 = {
.port_in_larb_gen2 = {4, 5, 5, 0, 12, 0, 0, 13, 0, 29,
0, 29, 0, 12, 6, 5, 17, 17, 17, 4, 6,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(3) | BIT(5) | BIT(6) | BIT(8) |
BIT(10) | BIT(12) | BIT(15) | BIT(18) | BIT(21) |
BIT(22),
/*skip larb: 3,6,8,10,12,15,21,22*/
.has_bwl = true,
.has_grouping = true,
.has_bw_thrt = true,
.bwl = (u8 *)mtk_smi_larb_mt6853_bwl,
.cmd_group = (u8 *)mtk_smi_larb_mt6853_cmd_group,
.bw_thrt_en = (u8 *)mtk_smi_larb_mt6853_bw_thrt_en,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6853_misc,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6833 = {
.port_in_larb_gen2 = {4, 5, 5, 0, 12, 0, 0, 13, 0, 29,
0, 29, 0, 12, 6, 0, 17, 17, 0, 4, 6,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(3) | BIT(5) | BIT(6) | BIT(8) |
BIT(10) | BIT(12) | BIT(15) | BIT(18) | BIT(21) |
BIT(22),
/*skip larb: 3,6,8,10,12,15,18*/
.has_bwl = true,
.has_grouping = true,
.has_bw_thrt = true,
.bwl = (u8 *)mtk_smi_larb_mt6833_bwl,
.cmd_group = (u8 *)mtk_smi_larb_mt6833_cmd_group,
.bw_thrt_en = (u8 *)mtk_smi_larb_mt6833_bw_thrt_en,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6833_misc,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6893 = {
.port_in_larb_gen2 = {15, 15, 6, 6, 11, 8, 0, 27, 27, 29, 0, 29,
0, 12, 6, 5, 17, 17, 17, 4, 6,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(6) | BIT(10) | BIT(12),
/*skip larb: 6,10,12*/
.has_bwl = true,
.has_grouping = true,
.has_bw_thrt = true,
.bwl = (u8 *)mtk_smi_larb_mt6893_bwl,
.cmd_group = (u8 *)mtk_smi_larb_mt6893_cmd_group,
.bw_thrt_en = (u8 *)mtk_smi_larb_mt6893_bw_thrt_en,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6893_misc,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6983 = {
.port_in_larb_gen2 = {16, 8, 9, 9, 11, 9, 4, 31, 31, 25,
20, 30, 16, 24, 23, 19, 17, 7, 8, 4, 16, 8,
30, 30, 0, 14, 14, 17, 17, 7, 7,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(24),
/*skip larb: 24*/
.has_bwl = true,
.has_grouping = true,
.has_bw_thrt = true,
.bwl = (u8 *)mtk_smi_larb_mt6983_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6983_misc,
.cmd_group = (u8 *)mtk_smi_larb_mt6983_cmd_group,
.bw_thrt_en = (u8 *)mtk_smi_larb_mt6983_bw_thrt_en,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6879 = {
.port_in_larb_gen2 = {6, 8, 6, 0, 14, 0, 0, 15, 0, 25,
20, 30, 10, 24, 23, 19, 17, 7, 0, 4, 0, 0,
30, 30, 0, 11, 11, 17, 0, 7,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(3) | BIT(5) | BIT(6) | BIT(8) |
BIT(18) | BIT(20) | BIT(21) | BIT(24) | BIT(28),
/*skip larb: 3,5,6,8,18,20,21,24,28*/
.has_bwl = true,
.has_grouping = true,
.has_bw_thrt = true,
.bwl = (u8 *)mtk_smi_larb_mt6879_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6879_misc,
.cmd_group = (u8 *)mtk_smi_larb_mt6879_cmd_group,
.bw_thrt_en = (u8 *)mtk_smi_larb_mt6879_bw_thrt_en,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6895 = {
.port_in_larb_gen2 = {16, 8, 9, 9, 11, 9, 4, 31, 31, 25,
20, 30, 16, 24, 23, 19, 17, 7, 8, 4, 16, 8,
30, 30, 0, 14, 14, 17, 17, 7, 7,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(24),
/*skip larb: 24*/
.has_bwl = true,
.has_grouping = true,
.has_bw_thrt = true,
.bwl = (u8 *)mtk_smi_larb_mt6895_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6895_misc,
.cmd_group = (u8 *)mtk_smi_larb_mt6895_cmd_group,
.bw_thrt_en = (u8 *)mtk_smi_larb_mt6895_bw_thrt_en,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6886 = {
.port_in_larb_gen2 = {11, 6, 5, 0, 14, 0, 0, 21, 0, 29,
21, 12, 12, 5, 4, 19, 16, 8, 0, 12, 0, 0,
12, 12, 0, 20, 11, 8, 22, 10, 16, 0, 0,
0, 8,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(3) | BIT(5) | BIT(6) | BIT(8) |
BIT(18) | BIT(20) | BIT(21) | BIT(24) | BIT(31) |
BIT(32) | BIT(33),
.has_bwl = true,
.has_grouping = true,
.has_bw_thrt = true,
.bwl = (u8 *)mtk_smi_larb_mt6886_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6886_misc,
.cmd_group = (u8 *)mtk_smi_larb_mt6886_cmd_group,
.bw_thrt_en = (u8 *)mtk_smi_larb_mt6886_bw_thrt_en,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6855 = {
.port_in_larb_gen2 = {5, 5, 4, 0, 13, 0, 0, 13, 0, 29,
0, 29, 0, 15, 10, 0, 17, 17, 0, 0, 6,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(3) | BIT(5) | BIT(6) | BIT(8) |
BIT(10) | BIT(12) | BIT(15) | BIT(18) | BIT(19),
/*skip larb: 3,5,6,8,10,12,15,18,19*/
.has_bwl = true,
.has_grouping = true,
.has_bw_thrt = true,
.bwl = (u8 *)mtk_smi_larb_mt6855_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6855_misc,
.cmd_group = (u8 *)mtk_smi_larb_mt6855_cmd_group,
.bw_thrt_en = (u8 *)mtk_smi_larb_mt6855_bw_thrt_en,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6835 = {
.port_in_larb_gen2 = {5, 5, 4, 0, 9, 0, 0, 13, 0, 13,
0, 0, 0, 12, 0, 0, 17, 17, 0, 0, 4,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(3) | BIT(5) | BIT(6) | BIT(8) |
BIT(10) | BIT(11) | BIT(12) | BIT(14) |
BIT(15) | BIT(18) | BIT(19),
/*skip larb: 3,5,6,8,10,11,12,14,15,18,19*/
.has_bwl = true,
.has_grouping = true,
.has_bw_thrt = true,
.bwl = (u8 *)mtk_smi_larb_mt6835_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6835_misc,
.cmd_group = (u8 *)mtk_smi_larb_mt6835_cmd_group,
.bw_thrt_en = (u8 *)mtk_smi_larb_mt6835_bw_thrt_en,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt6985 = {
.port_in_larb_gen2 = {9, 8, 9, 9, 11, 9, 4, 31, 31, 29,
19, 10, 11, 5, 4, 17, 16, 8, 4, 12, 9, 8,
10, 10, 0, 14, 14, 8, 22, 10, 16, 16, 9,
9, 8, 8, 31, 31,},
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(24) | BIT(36),
/*skip larb: 24, 36*/
.has_gals = true,
.has_bwl = true,
.has_grouping = true,
.has_bw_thrt = true,
.bwl = (u8 *)mtk_smi_larb_mt6985_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_larb_mt6985_misc,
.cmd_group = (u8 *)mtk_smi_larb_mt6985_cmd_group,
.bw_thrt_en = (u8 *)mtk_smi_larb_mt6985_bw_thrt_en,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt8183 = {
.has_gals = true,
.config_port = mtk_smi_larb_config_port_gen2_general,
.larb_direct_to_common_mask = BIT(2) | BIT(3) | BIT(7),
/* IPU0 | IPU1 | CCU */
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt8192 = {
.config_port = mtk_smi_larb_config_port_gen2_general,
};
static const struct of_device_id mtk_smi_larb_of_ids[] = {
{
.compatible = "mediatek,mt8167-smi-larb",
.data = &mtk_smi_larb_mt8167
},
{
.compatible = "mediatek,mt8173-smi-larb",
.data = &mtk_smi_larb_mt8173
},
{
.compatible = "mediatek,mt2701-smi-larb",
.data = &mtk_smi_larb_mt2701
},
{
.compatible = "mediatek,mt6873-smi-larb",
.data = &mtk_smi_larb_mt6873
},
{
.compatible = "mediatek,mt2712-smi-larb",
.data = &mtk_smi_larb_mt2712
},
{
.compatible = "mediatek,mt6779-smi-larb",
.data = &mtk_smi_larb_mt6779
},
{
.compatible = "mediatek,mt8183-smi-larb",
.data = &mtk_smi_larb_mt8183
},
{
.compatible = "mediatek,mt6853-smi-larb",
.data = &mtk_smi_larb_mt6853
},
{
.compatible = "mediatek,mt6833-smi-larb",
.data = &mtk_smi_larb_mt6833
},
{
.compatible = "mediatek,mt6893-smi-larb",
.data = &mtk_smi_larb_mt6893
},
{
.compatible = "mediatek,mt6983-smi-larb",
.data = &mtk_smi_larb_mt6983
},
{
.compatible = "mediatek,mt6879-smi-larb",
.data = &mtk_smi_larb_mt6879
},
{
.compatible = "mediatek,mt6895-smi-larb",
.data = &mtk_smi_larb_mt6895
},
{
.compatible = "mediatek,mt6886-smi-larb",
.data = &mtk_smi_larb_mt6886
},
{
.compatible = "mediatek,mt6855-smi-larb",
.data = &mtk_smi_larb_mt6855
},
{
.compatible = "mediatek,mt6985-smi-larb",
.data = &mtk_smi_larb_mt6985
},
{
.compatible = "mediatek,mt8192-smi-larb",
.data = &mtk_smi_larb_mt8192
},
{
.compatible = "mediatek,mt6835-smi-larb",
.data = &mtk_smi_larb_mt6835
},
{}
};
static s32 smi_cmdq(void *data)
{
struct device *dev = (struct device *)data;
struct device_node *node = NULL;
struct platform_device *pdev = NULL;
node = of_parse_phandle(dev->of_node, "mediatek,cmdq", 0);
if (node) {
pdev = of_find_device_by_node(node);
of_node_put(node);
if (pdev) {
while (!platform_get_drvdata(pdev)) {
dev_notice(dev, "Failed to get [cmdq]\n");
msleep(100);
}
if (device_link_add(dev, &pdev->dev,
DL_FLAG_PM_RUNTIME | DL_FLAG_STATELESS))
dev_notice(dev, "Success to link [cmdq]\n");
else
dev_notice(dev, "Failed to link [cmdq]\n");
} else
dev_notice(dev, "Failed to get [cmdq] pdev\n");
} else
dev_notice(dev, "Failed to get [cmdq] node\n");
return 0;
}
#define SMI_SRAM_COMM_BASE (0x1e80b000)
#define SMICOMM_MAX_OFFSET (0x448)
static void dump_smi_sysram_common(void)
{
void __iomem *comm_base;
s32 ret, offset, len = 0, val;
char buf[LINK_MAX + 1] = {0};
comm_base = ioremap(SMI_SRAM_COMM_BASE, 0x1000);
pr_notice("[smi]===== slbmpu:%s%u =====\n", "COMM", 2);
for (offset = 0x100; offset <= SMICOMM_MAX_OFFSET; offset += 4) {
val = readl_relaxed(comm_base + offset);
if (!val)
continue;
ret = snprintf(buf + len, LINK_MAX - len, " %#x=%#x,",
offset, val);
if (ret < 0 || ret >= LINK_MAX - len) {
ret = snprintf(buf + len, LINK_MAX - len, "%c", '\0');
if (ret < 0)
pr_notice("%s ret:%d\n", __func__, ret);
pr_notice("[smi] %s\n", buf);
len = 0;
memset(buf, '\0', sizeof(char) * ARRAY_SIZE(buf));
ret = snprintf(buf + len, LINK_MAX - len, " %#x=%#x,",
offset, val);
if (ret < 0 || ret >= LINK_MAX - len)
pr_notice("%s: ret:%d buf size:%d\n",
__func__, ret, LINK_MAX - len);
}
len += ret;
}
ret = snprintf(buf + len, LINK_MAX - len, "%c", '\0');
if (ret < 0 || ret >= LINK_MAX - len)
pr_notice("%s: ret:%d buf size:%d\n", __func__, ret, LINK_MAX - len);
pr_notice("[smi] %s\n", buf);
iounmap(comm_base);
}
#define NEMI_VIO_BASE (0x10342000)
#define SEMI_VIO_BASE (0x10343000)
#define VIO_OFFS_START (0xd14)
#define VIO_OFFS_END (0xd24)
static void is_mpu_violation(struct device *dev, bool is_probe_start)
{
void __iomem *nemi_base;
void __iomem *semi_base;
u32 offset, val;
bool is_vio = false;
if (!of_property_read_bool(dev->of_node, "emimpu-check"))
return;
dev_notice(dev, "is probe start: %d\n", is_probe_start);
nemi_base = ioremap(NEMI_VIO_BASE, 0x1000);
semi_base = ioremap(SEMI_VIO_BASE, 0x1000);
/* check NEMI mpu violation */
for (offset = VIO_OFFS_START; offset <= VIO_OFFS_END; offset += 4) {
val = readl(nemi_base + offset);
if (val) {
is_vio = true;
dev_notice(dev, "%#x: %#x=%#x\n", NEMI_VIO_BASE, offset, val);
}
}
/* check SEMI mpu violation */
for (offset = VIO_OFFS_START; offset <= VIO_OFFS_END; offset += 4) {
val = readl(semi_base + offset);
if (val) {
is_vio = true;
dev_notice(dev, "%#x: %#x=%#x\n", SEMI_VIO_BASE, offset, val);
}
}
if (is_vio)
dump_smi_sysram_common();
iounmap(nemi_base);
iounmap(semi_base);
}
static int mtk_smi_larb_probe(struct platform_device *pdev)
{
struct mtk_smi_larb *larb;
struct resource *res;
struct device *dev = &pdev->dev, *smi_dev = &pdev->dev;
struct device_node *smi_node;
struct platform_device *smi_pdev;
struct device_link *link;
int ret, i;
is_mpu_violation(dev, true);
larb = devm_kzalloc(dev, sizeof(*larb), GFP_KERNEL);
if (!larb)
return -ENOMEM;
larb->larb_gen = of_device_get_match_data(dev);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
larb->base = devm_ioremap_resource(dev, res);
if (IS_ERR(larb->base))
return PTR_ERR(larb->base);
larb->smi.clk_apb = devm_clk_get(dev, "apb");
if (IS_ERR(larb->smi.clk_apb))
return PTR_ERR(larb->smi.clk_apb);
larb->smi.clk_smi = devm_clk_get(dev, "smi");
if (IS_ERR(larb->smi.clk_smi))
return PTR_ERR(larb->smi.clk_smi);
if (larb->larb_gen->has_gals) {
/* The larbs may still haven't gals even if the SoC support.*/
larb->smi.clk_gals0 = devm_clk_get(dev, "gals");
if (PTR_ERR(larb->smi.clk_gals0) == -ENOENT)
larb->smi.clk_gals0 = NULL;
else if (IS_ERR(larb->smi.clk_gals0))
return PTR_ERR(larb->smi.clk_gals0);
}
larb->smi.dev = dev;
atomic_set(&larb->smi.ref_count, 0);
for (i = 0; i < LARB_MAX_COMMON; i++) {
smi_node = of_parse_phandle(dev->of_node, "mediatek,smi", i);
if (!smi_node)
break;
smi_pdev = of_find_device_by_node(smi_node);
of_node_put(smi_node);
if (smi_pdev) {
if (!platform_get_drvdata(smi_pdev))
return -EPROBE_DEFER;
larb->smi_common_dev[i] = &smi_pdev->dev;
link = device_link_add(dev, larb->smi_common_dev[i],
DL_FLAG_PM_RUNTIME | DL_FLAG_STATELESS);
if (!link) {
dev_notice(dev, "Unable to link smi_common device %d\n", i);
return -ENODEV;
}
} else {
dev_notice(dev, "Failed to get the smi_common device %d\n", i);
return -EINVAL;
}
larb->comm_port_id[i] = -1;
of_property_read_u32_index(dev->of_node, "mediatek,comm-port-id",
i, &larb->comm_port_id[i]);
}
/* find smi common dev for mmqos */
larb->smi_common = larb->smi_common_dev[0];
for (;;) {
smi_node = smi_dev->of_node;
smi_node = of_parse_phandle(smi_node, "mediatek,smi", 0);
if (smi_node) {
smi_pdev = of_find_device_by_node(smi_node);
of_node_put(smi_node);
if (smi_pdev) {
if (of_property_read_bool(smi_pdev->dev.of_node, "smi-common")) {
larb->smi_common = &smi_pdev->dev;
dev_notice(dev, "Succeed to get smi-comm dev for mmqos\n");
break;
/* find smi-common dev successfully */
} else
smi_dev = &smi_pdev->dev;
} else {
dev_notice(dev, "Failed to get smi-comm dev for mmqos\n");
return -EINVAL;
}
} else {
/* skip mmqos fix */
dev_notice(dev, "Can not find smi-comm for mmqos\n");
break;
}
}
pm_runtime_enable(dev);
platform_set_drvdata(pdev, larb);
ret = component_add(dev, &mtk_smi_larb_component_ops);
of_property_read_u32(dev->of_node, "mediatek,larb-id", &larb->larbid);
if (of_property_read_bool(dev->of_node, "init-power-on")) {
ret = pm_runtime_get_sync(dev);
init_power_on_dev[init_power_on_num++] = &larb->smi;
if (ret < 0) {
dev_notice(dev, "Unable to enable SMI LARB%d. ret:%d\n",
larb->larbid, ret);
pm_runtime_put_sync(dev);
}
}
/*mt6886 wa for larb4 clk on delay*/
if (of_property_read_bool(dev->of_node, "clk-on-delay"))
larb->clk_on_delay = true;
is_mpu_violation(dev, false);
return ret;
}
static int mtk_smi_larb_remove(struct platform_device *pdev)
{
pm_runtime_disable(&pdev->dev);
component_del(&pdev->dev, &mtk_smi_larb_component_ops);
return 0;
}
static int __maybe_unused mtk_smi_larb_resume(struct device *dev)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
const struct mtk_smi_larb_gen *larb_gen = larb->larb_gen;
int ret;
atomic_inc(&larb->smi.ref_count);
if (log_level & 1 << log_config_bit)
pr_info("[SMI]larb:%d callback get ref_count:%d\n",
larb->larbid, atomic_read(&larb->smi.ref_count));
ret = mtk_smi_clk_enable(&larb->smi);
if (ret < 0) {
dev_err(dev, "Failed to enable clock(%d).\n", ret);
return ret;
}
if (larb_gen->sleep_ctrl)
larb_gen->sleep_ctrl(dev, false);
if (larb->clk_on_delay)
udelay(20);
/* Configure the basic setting for this larb */
larb_gen->config_port(dev);
return 0;
}
static RAW_NOTIFIER_HEAD(smi_driver_notifier_list);
int mtk_smi_driver_register_notifier(struct notifier_block *nb)
{
return raw_notifier_chain_register(&smi_driver_notifier_list, nb);
}
EXPORT_SYMBOL_GPL(mtk_smi_driver_register_notifier);
int mtk_smi_driver_unregister_notifier(struct notifier_block *nb)
{
return raw_notifier_chain_unregister(&smi_driver_notifier_list, nb);
}
EXPORT_SYMBOL_GPL(mtk_smi_driver_unregister_notifier);
static u32 mtk_smi_common_ostd_check(struct mtk_smi *common,
u32 check_port, unsigned long flags)
{
u32 i, val, ret = 0;
for (i = 0; i < SMI_COMMON_LARB_NR_MAX; i++) {
if ((check_port >> i) & 1) {
val = readl_relaxed(common->base + SMI_DEBUG_S(i));
if (log_level & 1 << log_pd_callback)
pr_notice("[SMI] common%d: %#x=%#x, power status = %ld\n",
common->commid, SMI_DEBUG_S(i), val, flags);
if (val & SMI_OSTD_CNT_MASK) {
pr_notice("[SMI] common%d bus check fail, power status = %ld\n",
common->commid, flags);
raw_notifier_call_chain(&smi_driver_notifier_list,
common->commid, NULL);
ret = ret | (1 << i);
}
}
}
return ret;
}
static int mtk_smi_power_suspend_check(struct mtk_smi_pd *smi_pd, unsigned long flags)
{
u32 i, ret;
struct mtk_smi *common;
if (flags == GENPD_NOTIFY_PRE_OFF)
smi_pd->pre_off_check_result = 0;
else if (flags == GENPD_NOTIFY_PRE_ON)
smi_pd->pre_on_check_result = 0;
for (i = 0; i < MAX_PD_CHECK_DEV_NUM; i++) {
if (!smi_pd->suspend_check_dev[i])
break;
common = dev_get_drvdata(smi_pd->suspend_check_dev[i]);
ret = mtk_smi_clk_enable(common);
if (ret) {
dev_notice(common->dev, "Failed to enable clock(%d)\n", ret);
return ret;
}
ret = mtk_smi_common_ostd_check(common, smi_pd->suspend_check_port[i], flags);
mtk_smi_clk_disable(common);
if (!ret)
continue;
switch (flags) {
case GENPD_NOTIFY_PRE_OFF:
smi_pd->pre_off_check_result = ret;
break;
case GENPD_NOTIFY_OFF:
dev_notice(smi_pd->dev, "[SMI] pre-off check result:%d\n",
smi_pd->pre_off_check_result);
raw_notifier_call_chain(&smi_driver_notifier_list,
TRIGGER_SMI_HANG_DETECT, NULL);
break;
case GENPD_NOTIFY_PRE_ON:
smi_pd->pre_on_check_result = ret;
break;
case GENPD_NOTIFY_ON:
dev_notice(smi_pd->dev, "[SMI] pre-on check result:%d\n",
smi_pd->pre_on_check_result);
raw_notifier_call_chain(&smi_driver_notifier_list,
TRIGGER_SMI_HANG_DETECT, NULL);
break;
default:
break;
}
}
return 0;
}
static int mtk_smi_pd_callback(struct notifier_block *nb,
unsigned long flags, void *data)
{
struct mtk_smi_pd *smi_pd =
container_of(nb, struct mtk_smi_pd, nb);
struct mtk_smi *common;
int i, j;
if (log_level & 1 << log_pd_callback)
dev_notice(smi_pd->dev,
"[smi] pd enter callback, power status = %ld\n", flags);
if (smi_pd->suspend_check)
mtk_smi_power_suspend_check(smi_pd, flags);
if (!smi_pd->bus_prot)
goto out;
if (flags == GENPD_NOTIFY_ON) {
/* enable related SMI common port */
if (log_level & 1 << log_pd_callback)
dev_notice(smi_pd->dev, "[smi] pd enter callback on:\n");
for (i = 0; i < MAX_COMMON_FOR_CLAMP; i++) {
if (!smi_pd->smi_common_dev[i])
break;
common = dev_get_drvdata(smi_pd->smi_common_dev[i]);
for (j = 0; j < SMI_COMMON_LARB_NR_MAX; j++) {
if ((smi_pd->set_comm_port_range[i] >> j) & 1) {
if (!smi_pd->is_main) {
power_reset_imp(smi_pd);
writel(1 << j, common->base + SMI_CLAMP_EN_CLR);
} else //disable SMI common port for main-power on
writel(1 << j, common->base + SMI_CLAMP_EN_SET);
}
}
smi_pd->last_pd_log.clamp_status[i] = readl(common->base + SMI_CLAMP_EN);
}
smi_pd->last_pd_log.power_status = GENPD_NOTIFY_ON;
smi_pd->last_pd_log.time = ktime_get();
} else if (flags == GENPD_NOTIFY_PRE_OFF) {
if (smi_pd->is_main)
return NOTIFY_OK;
/* disable related SMI common port */
if (log_level & 1 << log_pd_callback)
dev_notice(smi_pd->dev, "[smi] pd enter callback pre-off:\n");
for (i = 0; i < MAX_COMMON_FOR_CLAMP; i++) {
if (!smi_pd->smi_common_dev[i])
break;
common = dev_get_drvdata(smi_pd->smi_common_dev[i]);
for (j = 0; j < SMI_COMMON_LARB_NR_MAX; j++) {
if ((smi_pd->set_comm_port_range[i] >> j) & 1)
writel(1 << j, common->base + SMI_CLAMP_EN_SET);
}
smi_pd->last_pd_log.clamp_status[i] = readl(common->base + SMI_CLAMP_EN);
}
smi_pd->last_pd_log.power_status = GENPD_NOTIFY_PRE_OFF;
smi_pd->last_pd_log.time = ktime_get();
}
out:
return NOTIFY_OK;
}
static bool is_p2_lock;
void mtk_smi_larb_clamp_and_lock(struct device *larbdev, bool on)
{
struct mtk_smi_larb *larb = dev_get_drvdata(larbdev);
int i;
u32 clamp_reg = on ? SMI_CLAMP_EN_SET : SMI_CLAMP_EN_CLR;
if (unlikely(!larb))
return;
/* disable/enable related SMI common port */
for (i = 0; i < LARB_MAX_COMMON; i++) {
struct mtk_smi *common;
if (larb->comm_port_id[i] >= 0 && larb->smi_common_dev[i]) {
common = dev_get_drvdata(larb->smi_common_dev[i]);
writel(1 << larb->comm_port_id[i],
common->base + clamp_reg);
if (log_level & 1 << log_pd_callback)
pr_notice("[smi] %s on:%d larb%d, comm%d clamp: %#x = %#x\n",
__func__, on, larb->larbid, common->commid, SMI_CLAMP_EN,
readl(common->base + SMI_CLAMP_EN));
}
}
if (!is_p2_lock && on) {
spin_lock_irqsave(&smi_lock.lock, smi_lock.flags);
is_p2_lock = true;
} else if (is_p2_lock && !on) {
spin_unlock_irqrestore(&smi_lock.lock, smi_lock.flags);
is_p2_lock = false;
}
}
EXPORT_SYMBOL_GPL(mtk_smi_larb_clamp_and_lock);
static int __maybe_unused mtk_smi_larb_suspend(struct device *dev)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
const struct mtk_smi_larb_gen *larb_gen = larb->larb_gen;
atomic_dec(&larb->smi.ref_count);
if (log_level & 1 << log_config_bit)
pr_info("[SMI]larb:%d callback put ref_count:%d\n",
larb->larbid, atomic_read(&larb->smi.ref_count));
if (atomic_read(&larb->smi.ref_count)) {
dev_notice(dev, "Error: larb(%d) ref count=%d on suspend\n",
larb->larbid, atomic_read(&larb->smi.ref_count));
}
if (readl_relaxed(larb->base + SMI_LARB_STAT) ||
readl_relaxed(larb->base + INT_SMI_LARB_STAT)) {
pr_notice("[SMI]larb:%d, suspend but busy\n", larb->larbid);
raw_notifier_call_chain(&smi_driver_notifier_list, larb->larbid, larb);
}
if (larb_gen->sleep_ctrl)
larb_gen->sleep_ctrl(dev, true);
mtk_smi_clk_disable(&larb->smi);
return 0;
}
static const struct dev_pm_ops smi_larb_pm_ops = {
SET_RUNTIME_PM_OPS(mtk_smi_larb_suspend, mtk_smi_larb_resume, NULL)
};
static struct platform_driver mtk_smi_larb_driver = {
.probe = mtk_smi_larb_probe,
.remove = mtk_smi_larb_remove,
.driver = {
.name = "mtk-smi-larb",
.of_match_table = mtk_smi_larb_of_ids,
.pm = &smi_larb_pm_ops,
}
};
static u32 mtk_smi_common_mt6873_bwl[SMI_COMMON_LARB_NR_MAX] = {
0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
};
static u32 mtk_smi_common_mt6853_bwl[MTK_COMMON_NR_MAX][SMI_COMMON_LARB_NR_MAX] = {
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
};
static u32 mtk_smi_common_mt6833_bwl[MTK_COMMON_NR_MAX][SMI_COMMON_LARB_NR_MAX] = {
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
};
static u32 mtk_smi_common_mt6893_bwl[MTK_COMMON_NR_MAX][SMI_COMMON_LARB_NR_MAX] = {
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
};
static u32 mtk_smi_common_mt6983_bwl[MTK_COMMON_NR_MAX][SMI_COMMON_LARB_NR_MAX] = {
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
};
static u32 mtk_smi_common_mt6879_bwl[MTK_COMMON_NR_MAX][SMI_COMMON_LARB_NR_MAX] = {
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
};
static u32 mtk_smi_common_mt6895_bwl[MTK_COMMON_NR_MAX][SMI_COMMON_LARB_NR_MAX] = {
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
};
static u32 mtk_smi_common_mt6886_bwl[MTK_COMMON_NR_MAX][SMI_COMMON_LARB_NR_MAX] = {
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
};
static u32 mtk_smi_common_mt6855_bwl[MTK_COMMON_NR_MAX][SMI_COMMON_LARB_NR_MAX] = {
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
};
static u16 mtk_smi_common_mt6835_bwl[MTK_COMMON_NR_MAX][SMI_COMMON_LARB_NR_MAX] = {
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
};
static u32 mtk_smi_common_mt6985_bwl[MTK_COMMON_NR_MAX][SMI_COMMON_LARB_NR_MAX] = {
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6873_misc[SMI_COMMON_MISC_NR] = {
{SMI_L1LEN, 0xb},
{SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x90a090a},
{SMI_FIFO_TH2, 0x506090a},
{SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6853_misc[MTK_COMMON_NR_MAX][SMI_COMMON_MISC_NR] = {
{{SMI_L1LEN, 0xb}, {SMI_M4U_TH, 0xe100e10}, {SMI_FIFO_TH1, 0x90a090a},
{SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1}, {SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6833_misc[MTK_COMMON_NR_MAX][SMI_COMMON_MISC_NR] = {
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x4514}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x9100910}, {SMI_FIFO_TH2, 0x5060910},
{SMI_DCM, 0x4f1}, {SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6893_misc[MTK_COMMON_NR_MAX][SMI_COMMON_MISC_NR] = {
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x4514}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0x2}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x4514}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0x2}, {SMI_BUS_SEL, 0x1111}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6983_misc[MTK_COMMON_NR_MAX][SMI_COMMON_MISC_NR] = {
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x454}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},}, /* SMI_DISP_COMMON */
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x4405}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},}, /* SMI_MDP_COMMON */
{{SMI_L1LEN, 0x2}, {SMI_BUS_SEL, 0x4444}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_SYSRAM_COMMON */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_DISP_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_DISP_SUB_COMMON1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_MDP_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_MDP_SUB_COMMON1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_SYS_SUB_COMMON2 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_SYS_SUB_COMMON3 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_SYS_SUB_COMMON4 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_DISP0_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_DISP1_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_CAM_MM_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_CAM_SYS_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_CAM_MDP_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_IMG_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_IMG_SUB_COMMON1 */
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6879_misc[MTK_COMMON_NR_MAX][SMI_COMMON_MISC_NR] = {
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x1044}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* 0:SMI_DISP_COMMON */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 1:smi_infra_disp_subcommon0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 2:smi_infra_disp_subcommon1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 3:smi_mdp_subcommon0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 4:smi_mdp_subcommon1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 5:smi_img_subcommon0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 6:smi_img_subcommon1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 7:smi_cam_mm_subcommon0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 8:smi_cam_mm_subcommon0 */
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6895_misc[MTK_COMMON_NR_MAX][SMI_COMMON_MISC_NR] = {
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x454}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},}, /* SMI_DISP_COMMON */
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x4405}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},}, /* SMI_MDP_COMMON */
{{SMI_L1LEN, 0x2}, {SMI_BUS_SEL, 0x4444}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_SYSRAM_COMMON */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_DISP_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_DISP_SUB_COMMON1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_MDP_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_MDP_SUB_COMMON1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_SYS_SUB_COMMON2 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_SYS_SUB_COMMON3 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_SYS_SUB_COMMON4 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_DISP0_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_DISP1_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_CAM_MM_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_CAM_SYS_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_CAM_MDP_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_IMG_SUB_COMMON0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_IMG_SUB_COMMON1 */
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6886_misc[MTK_COMMON_NR_MAX][SMI_COMMON_MISC_NR] = {
/* SMI_DISP_COMMON: common0 */
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x4414}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
{},
/* SMI_SYSRAM_COMMON: common2 */
{{SMI_L1LEN, 0x2}, {SMI_DCM, 0x4f1}, {SMI_DUMMY, 0x1},},
/* COMMON3*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* COMMON4*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* COMMON5*/
{},
/* COMMON6*/
{},
/* COMMON7*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* COMMON8*/
{},
/* COMMON9*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* COMMON10*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* COMMON11*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* COMMON12*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* COMMON13*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* COMMON14*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* COMMON15*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6855_misc[MTK_COMMON_NR_MAX][SMI_COMMON_MISC_NR] = {
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x1044}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
/* 0:SMI_DISP_COMMON */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 1:smi_infra_disp_subcommon0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 2:smi_infra_disp_subcommon1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* 3:smi_mdp_subcommon0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* 4:smi_mdp_subcommon1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2083}, {SMI_DUMMY, 0x1},},
/* 5:smi_img_subcommon */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2083}, {SMI_DUMMY, 0x1},},
/* 6:smi_ipe_subcommon */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* 7:smi_cam_mm_subcommon0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* 8:smi_cam_mm_subcommon1 */
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6835_misc[MTK_COMMON_NR_MAX][SMI_COMMON_MISC_NR] = {
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x1044}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},
/* 0:SMI_DISP_COMMON */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 1:smi_infra_disp_subcommon0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* 2:smi_infra_disp_subcommon1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* 3:smi_mdp_subcommon0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* 4:smi_mdp_subcommon1 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2083}, {SMI_DUMMY, 0x1},},
/* 5:smi_img_subcommon */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2083}, {SMI_DUMMY, 0x1},},
/* 6:smi_ipe_subcommon */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* 7:smi_cam_mm_subcommon0 */
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* 8:smi_cam_mm_subcommon1 */
};
static struct mtk_smi_reg_pair
mtk_smi_common_mt6985_misc[MTK_COMMON_NR_MAX][SMI_COMMON_MISC_NR] = {
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x4444}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},}, /* SMI_DISP_COMMON */
{{SMI_L1LEN, 0xb}, {SMI_BUS_SEL, 0x5104}, {SMI_M4U_TH, 0xe100e10},
{SMI_FIFO_TH1, 0x506090a}, {SMI_FIFO_TH2, 0x506090a}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},}, /* SMI_MDP_COMMON */
{{SMI_L1LEN, 0x2}, {SMI_BUS_SEL, 0x4101}, {SMI_DCM, 0x4f1},
{SMI_DUMMY, 0x1},},/* SMI_SYSRAM_COMMON */
/* SMI_INFRA_DISP_SUB_COMMON0 id:3*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* SMI_INFRA_DISP_SUB_COMMON0 id:4*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* SMI_INFRA_MDP_SUB_COMMON0 id:5*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* SMI_INFRA_MDP_SUB_COMMON1 id:6*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* SMI_INFRA_SYS_SUB_COMMON2 id:7*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* SMI_INFRA_SYS_SUB_COMMON3 id:8*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2105}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:9*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* COMMON id:10 remove*/
{},
/* SMI_MDP_SUB_COMMON4 id:11*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:12*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:13*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:14*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:15*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:16*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:17*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:18*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:19*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:20*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:21*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2146}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:22*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2083}, {SMI_DUMMY, 0x1},},
/* SMI_MDP_SUB_COMMON4 id:23*/
{{SMI_L1LEN, 0xa}, {SMI_PREULTRA_MASK1, 0x2083}, {SMI_DUMMY, 0x1},},
};
static const struct mtk_smi_common_plat mtk_smi_common_gen1 = {
.gen = MTK_SMI_GEN1,
};
static const struct mtk_smi_common_plat mtk_smi_common_gen2 = {
.gen = MTK_SMI_GEN2,
};
static const struct mtk_smi_common_plat mtk_smi_common_gen3 = {
.gen = MTK_SMI_GEN3,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6779 = {
.gen = MTK_SMI_GEN2,
.has_gals = true,
.bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(4) |
F_MMU1_LARB(5) | F_MMU1_LARB(6) | F_MMU1_LARB(7),
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6873 = {
.gen = MTK_SMI_GEN2,
.has_gals = true,
.bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(4) |
F_MMU1_LARB(5) | F_MMU1_LARB(7),
.has_bwl = true,
.bwl = mtk_smi_common_mt6873_bwl,
.misc = mtk_smi_common_mt6873_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6853 = {
.gen = MTK_SMI_GEN3,
.has_gals = true,
.bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(4) |
F_MMU1_LARB(5) | F_MMU1_LARB(7),
.has_bwl = true,
.bwl = (u32 *)mtk_smi_common_mt6853_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_common_mt6853_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6833 = {
.gen = MTK_SMI_GEN3,
.has_gals = true,
.bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(4) |
F_MMU1_LARB(5) | F_MMU1_LARB(7),
.has_bwl = true,
.bwl = (u32 *)mtk_smi_common_mt6833_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_common_mt6833_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6893 = {
.gen = MTK_SMI_GEN3,
.has_gals = true,
.bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(4) |
F_MMU1_LARB(5) | F_MMU1_LARB(7),
.has_bwl = true,
.bwl = (u32 *)mtk_smi_common_mt6893_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_common_mt6893_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6983 = {
.gen = MTK_SMI_GEN3,
.has_gals = true,
.bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(4) |
F_MMU1_LARB(5) | F_MMU1_LARB(7),
.has_bwl = true,
.bwl = (u32 *)mtk_smi_common_mt6983_bwl,
.has_p2_ostdl = true,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_common_mt6983_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6879 = {
.gen = MTK_SMI_GEN3,
.has_gals = true,
.has_bwl = true,
.bwl = (u32 *)mtk_smi_common_mt6879_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_common_mt6879_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6895 = {
.gen = MTK_SMI_GEN3,
.has_gals = true,
.bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(4) |
F_MMU1_LARB(5) | F_MMU1_LARB(7),
.has_bwl = true,
.bwl = (u32 *)mtk_smi_common_mt6895_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_common_mt6895_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6886 = {
.gen = MTK_SMI_GEN3,
.has_gals = true,
.has_bwl = true,
.bwl = (u32 *)mtk_smi_common_mt6886_bwl,
.has_p2_ostdl = true,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_common_mt6886_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6855 = {
.gen = MTK_SMI_GEN3,
.has_gals = true,
.has_bwl = true,
.bwl = (u32 *)mtk_smi_common_mt6855_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_common_mt6855_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6835 = {
.gen = MTK_SMI_GEN3,
.has_gals = true,
.has_bwl = true,
.bwl = (u32 *)mtk_smi_common_mt6835_bwl,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_common_mt6835_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt6985 = {
.gen = MTK_SMI_GEN3,
.has_gals = true,
.has_bwl = true,
.bwl = (u32 *)mtk_smi_common_mt6985_bwl,
.has_p2_ostdl = true,
.misc = (struct mtk_smi_reg_pair *)mtk_smi_common_mt6985_misc,
};
static const struct mtk_smi_common_plat mtk_smi_common_mt8183 = {
.gen = MTK_SMI_GEN2,
.has_gals = true,
.bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(5) |
F_MMU1_LARB(7),
};
static const struct mtk_smi_common_plat mtk_smi_common_mt8192 = {
.gen = MTK_SMI_GEN2,
.has_gals = true,
.bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(5) |
F_MMU1_LARB(6),
};
static const struct of_device_id mtk_smi_common_of_ids[] = {
{
.compatible = "mediatek,mt8173-smi-common",
.data = &mtk_smi_common_gen2,
},
{
.compatible = "mediatek,mt8167-smi-common",
.data = &mtk_smi_common_gen2,
},
{
.compatible = "mediatek,mt2701-smi-common",
.data = &mtk_smi_common_gen1,
},
{
.compatible = "mediatek,mt2712-smi-common",
.data = &mtk_smi_common_gen2,
},
{
.compatible = "mediatek,mt6779-smi-common",
.data = &mtk_smi_common_mt6779,
},
{
.compatible = "mediatek,mt6873-smi-common",
.data = &mtk_smi_common_mt6873,
},
{
.compatible = "mediatek,mt8183-smi-common",
.data = &mtk_smi_common_mt8183,
},
{
.compatible = "mediatek,mt6853-smi-common",
.data = &mtk_smi_common_mt6853,
},
{
.compatible = "mediatek,mt6833-smi-common",
.data = &mtk_smi_common_mt6833,
},
{
.compatible = "mediatek,mt6893-smi-common",
.data = &mtk_smi_common_mt6893,
},
{
.compatible = "mediatek,mt6983-smi-common",
.data = &mtk_smi_common_mt6983,
},
{
.compatible = "mediatek,mt6879-smi-common",
.data = &mtk_smi_common_mt6879,
},
{
.compatible = "mediatek,mt6895-smi-common",
.data = &mtk_smi_common_mt6895,
},
{
.compatible = "mediatek,mt6886-smi-common",
.data = &mtk_smi_common_mt6886,
},
{
.compatible = "mediatek,mt6855-smi-common",
.data = &mtk_smi_common_mt6855,
},
{
.compatible = "mediatek,mt6985-smi-common",
.data = &mtk_smi_common_mt6985,
},
{
.compatible = "mediatek,mt8192-smi-common",
.data = &mtk_smi_common_mt8192,
},
{
.compatible = "mediatek,mt6835-smi-common",
.data = &mtk_smi_common_mt6835,
},
{}
};
static int mtk_smi_common_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct mtk_smi *common;
struct resource *res;
struct task_struct *kthr;
struct device_node *smi_node;
struct platform_device *smi_pdev;
struct device_link *link;
int ret;
is_mpu_violation(dev, true);
common = devm_kzalloc(dev, sizeof(*common), GFP_KERNEL);
if (!common)
return -ENOMEM;
common->dev = dev;
common->plat = of_device_get_match_data(dev);
atomic_set(&common->ref_count, 0);
common->clk_apb = devm_clk_get(dev, "apb");
if (IS_ERR(common->clk_apb))
return PTR_ERR(common->clk_apb);
common->clk_smi = devm_clk_get(dev, "smi");
if (IS_ERR(common->clk_smi))
return PTR_ERR(common->clk_smi);
if (common->plat->has_gals) {
common->clk_gals0 = devm_clk_get(dev, "gals0");
if (IS_ERR(common->clk_gals0))
return PTR_ERR(common->clk_gals0);
common->clk_gals1 = devm_clk_get(dev, "gals1");
if (IS_ERR(common->clk_gals1))
return PTR_ERR(common->clk_gals1);
}
/*
* for mtk smi gen 1, we need to get the ao(always on) base to config
* m4u port, and we need to enable the aync clock for transform the smi
* clock into emi clock domain, but for mtk smi gen2, there's no smi ao
* base.
*/
if (common->plat->gen == MTK_SMI_GEN1) {
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
common->smi_ao_base = devm_ioremap_resource(dev, res);
if (IS_ERR(common->smi_ao_base))
return PTR_ERR(common->smi_ao_base);
common->clk_async = devm_clk_get(dev, "async");
if (IS_ERR(common->clk_async))
return PTR_ERR(common->clk_async);
ret = clk_prepare_enable(common->clk_async);
if (ret)
return ret;
} else {
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
common->base = devm_ioremap_resource(dev, res);
if (IS_ERR(common->base))
return PTR_ERR(common->base);
}
smi_node = of_parse_phandle(dev->of_node, "mediatek,smi", 0);
if (smi_node) {
smi_pdev = of_find_device_by_node(smi_node);
of_node_put(smi_node);
if (smi_pdev) {
if (!platform_get_drvdata(smi_pdev))
return -EPROBE_DEFER;
link = device_link_add(dev, &smi_pdev->dev,
DL_FLAG_PM_RUNTIME |
DL_FLAG_STATELESS);
if (!link) {
dev_notice(dev,
"Unable to link sram smi-common dev\n");
return -ENODEV;
}
} else {
dev_notice(dev, "Failed to get sram smi_common device\n");
return -EINVAL;
}
}
smi_node = of_parse_phandle(dev->of_node, "mediatek,smi", 1);
if (smi_node) {
smi_pdev = of_find_device_by_node(smi_node);
of_node_put(smi_node);
if (smi_pdev) {
if (!platform_get_drvdata(smi_pdev))
return -EPROBE_DEFER;
link = device_link_add(dev, &smi_pdev->dev,
DL_FLAG_PM_RUNTIME |
DL_FLAG_STATELESS);
if (!link) {
dev_notice(dev,
"Unable to link sram smi-common dev\n");
return -ENODEV;
}
} else {
dev_notice(dev, "Failed to get sram smi_common device\n");
return -EINVAL;
}
}
of_property_read_u32(dev->of_node, "mediatek,common-id", &common->commid);
pm_runtime_enable(dev);
platform_set_drvdata(pdev, common);
if (of_parse_phandle(dev->of_node, "mediatek,cmdq", 0))
kthr = kthread_run(smi_cmdq, dev, __func__);
if (of_property_read_bool(dev->of_node, "init-power-on")) {
ret = pm_runtime_get_sync(dev);
init_power_on_dev[init_power_on_num++] = common;
if (ret < 0) {
dev_notice(dev, "Unable to enable SMI COMM%d. ret:%d\n",
common->commid, ret);
pm_runtime_put_sync(dev);
}
}
spin_lock_init(&smi_lock.lock);
is_mpu_violation(dev, false);
atomic_set(&larb7_ref_cnt[0], 0);
atomic_set(&larb7_ref_cnt[1], 0);
atomic_set(&larb7_ref_cnt[0], 0);
return 0;
}
static int mtk_smi_common_remove(struct platform_device *pdev)
{
pm_runtime_disable(&pdev->dev);
return 0;
}
static int __maybe_unused mtk_smi_common_resume(struct device *dev)
{
struct mtk_smi *common = dev_get_drvdata(dev);
u32 bus_sel = common->plat->bus_sel;
int i, ret;
ret = mtk_smi_clk_enable(common);
if (ret) {
dev_err(common->dev, "Failed to enable clock(%d).\n", ret);
return ret;
}
atomic_inc(&common->ref_count);
if ((common->plat->gen == MTK_SMI_GEN2 || common->plat->gen == MTK_SMI_GEN3)
&& bus_sel)
writel(bus_sel, common->base + SMI_BUS_SEL);
if ((common->plat->gen != MTK_SMI_GEN2 && common->plat->gen != MTK_SMI_GEN3)
|| !common->plat->has_bwl)
return 0;
if (common->plat->gen == MTK_SMI_GEN3) {
for (i = 0; i < SMI_COMMON_LARB_NR_MAX; i++)
writel_relaxed(
common->plat->bwl[common->commid * SMI_COMMON_LARB_NR_MAX + i],
common->base + SMI_L1ARB(i));
for (i = 0; i < SMI_COMMON_MISC_NR; i++)
writel_relaxed(common->plat->misc[
common->commid * SMI_COMMON_MISC_NR + i].value,
common->base + common->plat->misc[
common->commid * SMI_COMMON_MISC_NR + i].offset);
} else {
for (i = 0; i < SMI_COMMON_LARB_NR_MAX; i++)
writel_relaxed(common->plat->bwl[i],
common->base + SMI_L1ARB(i));
for (i = 0; i < SMI_COMMON_MISC_NR; i++)
writel_relaxed(common->plat->misc[i].value,
common->base + common->plat->misc[i].offset);
}
wmb(); /* make sure settings are written */
return 0;
}
static int __maybe_unused mtk_smi_common_suspend(struct device *dev)
{
struct mtk_smi *common = dev_get_drvdata(dev);
if (!(readl_relaxed(common->base + SMI_DEBUG_MISC) & 0x1)) {
pr_notice("[SMI]common:%d suspend but busy\n", common->commid);
raw_notifier_call_chain(&smi_driver_notifier_list, common->commid, NULL);
}
mtk_smi_clk_disable(common);
atomic_dec(&common->ref_count);
if (atomic_read(&common->ref_count)) {
dev_notice(dev, "Error: comm(%d) ref count=%d on suspend\n",
common->commid, atomic_read(&common->ref_count));
}
return 0;
}
static const struct dev_pm_ops smi_common_pm_ops = {
SET_RUNTIME_PM_OPS(mtk_smi_common_suspend, mtk_smi_common_resume, NULL)
};
static struct platform_driver mtk_smi_common_driver = {
.probe = mtk_smi_common_probe,
.remove = mtk_smi_common_remove,
.driver = {
.name = "mtk-smi-common",
.of_match_table = mtk_smi_common_of_ids,
.pm = &smi_common_pm_ops,
}
};
static const struct of_device_id mtk_smi_pd_of_ids[] = {
{
.compatible = "mediatek,smi-pd",
},
{}
};
static int mtk_smi_pd_probe(struct platform_device *pdev)
{
struct mtk_smi_pd *smi_pd;
struct device *dev = &pdev->dev;
struct device_node *smi_node;
struct platform_device *smi_pdev;
int ret, i;
u32 reset_tmp, reset_num, offset;
is_mpu_violation(dev, true);
smi_pd = devm_kzalloc(&pdev->dev, sizeof(*smi_pd), GFP_KERNEL);
if (!smi_pd)
return -ENOMEM;
smi_pd->dev = dev;
smi_pd->smi.dev = dev;
if (of_property_read_bool(dev->of_node, "main-power"))
smi_pd->is_main = true;
if (of_property_read_bool(dev->of_node, "suspend-check"))
smi_pd->suspend_check = true;
if (of_property_read_bool(dev->of_node, "bus-protect"))
smi_pd->bus_prot = true;
for (i = 0; i < MAX_COMMON_FOR_CLAMP; i++) {
smi_node = of_parse_phandle(dev->of_node, "mediatek,smi", i);
if (!smi_node)
break;
smi_pdev = of_find_device_by_node(smi_node);
of_node_put(smi_node);
if (smi_pdev) {
if (!platform_get_drvdata(smi_pdev))
return -EPROBE_DEFER;
smi_pd->smi_common_dev[i] = &smi_pdev->dev;
} else {
dev_notice(dev, "Failed to get smi_comm dev for setting clamp:%d\n", i);
return -EINVAL;
}
of_property_read_u32_index(dev->of_node, "mediatek,comm-port-range",
i, &smi_pd->set_comm_port_range[i]);
}
for (i = 0; i < MAX_PD_CHECK_DEV_NUM; i++) {
smi_node = of_parse_phandle(dev->of_node, "mediatek,suspend-check-dev", i);
if (!smi_node)
break;
smi_pdev = of_find_device_by_node(smi_node);
of_node_put(smi_node);
if (smi_pdev) {
if (!platform_get_drvdata(smi_pdev))
return -EPROBE_DEFER;
smi_pd->suspend_check_dev[i] = &smi_pdev->dev;
} else {
dev_notice(dev, "Failed to get smi_comm dev for suspend check:%d\n", i);
return -EINVAL;
}
of_property_read_u32_index(dev->of_node, "mediatek,suspend-check-port",
i, &smi_pd->suspend_check_port[i]);
}
if (of_get_property(dev->of_node, "power-reset", &reset_tmp)) {
reset_num = reset_tmp / (sizeof(u32) * RESET_CELL_NUM);
for (i = 0; i < reset_num; i++) {
offset = i * RESET_CELL_NUM;
if (of_property_read_u32_index(dev->of_node,
"power-reset", offset, &reset_tmp))
break;
smi_pd->power_reset_pa[i] = reset_tmp;
smi_pd->power_reset_reg[i] = ioremap(reset_tmp, 4);
if (of_property_read_u32_index(dev->of_node,
"power-reset", offset + 1, &reset_tmp))
break;
smi_pd->power_reset_value[i] = 1 << reset_tmp;
}
}
smi_pd->nb.notifier_call = mtk_smi_pd_callback;
ret = dev_pm_genpd_add_notifier(dev, &smi_pd->nb);
pm_runtime_enable(dev);
if (of_property_read_bool(dev->of_node, "init-power-on")) {
ret = pm_runtime_get_sync(dev);
init_power_on_dev[init_power_on_num++] = &smi_pd->smi;
if (ret < 0) {
dev_notice(dev, "Unable to enable disp power\n");
pm_runtime_put_sync(dev);
}
}
if (smi_pd->bus_prot)
smi_pd_ctrl[smi_pd_ctrl_num++] = smi_pd;
is_mpu_violation(dev, false);
return 0;
}
static struct platform_driver mtk_smi_pd_driver = {
.probe = mtk_smi_pd_probe,
.driver = {
.name = "mtk-smi-pd",
.of_match_table = mtk_smi_pd_of_ids,
}
};
static struct platform_driver * const smidrivers[] = {
&mtk_smi_common_driver,
&mtk_smi_pd_driver,
&mtk_smi_larb_driver,
};
static int __init mtk_smi_init(void)
{
return platform_register_drivers(smidrivers, ARRAY_SIZE(smidrivers));
}
module_init(mtk_smi_init);
static void __exit mtk_smi_exit(void)
{
platform_unregister_drivers(smidrivers, ARRAY_SIZE(smidrivers));
}
module_exit(mtk_smi_exit);
module_param(log_level, uint, 0644);
MODULE_PARM_DESC(log_level, "smi log level");
MODULE_DESCRIPTION("MediaTek SMI driver");
MODULE_LICENSE("GPL v2");