@@ -1,14 +1,20 @@
// SPDX-License-Identifier: GPL-2.0
//
-// Copyright (c) 2021 MediaTek Inc.
+// Copyright (c) 2024 MediaTek Inc.
#include <linux/clk.h>
#include <linux/iopoll.h>
+#include <linux/interrupt.h>
+#include <linux/irqdomain.h>
+#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
+#include <linux/sched/clock.h>
+#include <linux/sched/mm.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/spmi.h>
+#include <linux/irq.h>
#define SWINF_IDLE 0x00
#define SWINF_WFVLDCLR 0x06
@@ -21,14 +27,21 @@
#define PMIF_CMD_EXT_REG_LONG 3
#define PMIF_DELAY_US 10
-#define PMIF_TIMEOUT_US (10 * 1000)
+#define PMIF_TIMEOUT_US (100 * 1000)
#define PMIF_CHAN_OFFSET 0x5
+#define PMIF_CAPS_VER_1 1
+#define PMIF_CAPS_VER_2 2
+
#define PMIF_MAX_CLKS 3
#define SPMI_OP_ST_BUSY 1
+#define SPMI_SOC_CHANNEL 2
+
+#define PMIF_IRQDESC(name) { #name, pmif_##name##_irq_handler, -1}
+
struct ch_reg {
u32 ch_sta;
u32 wdata;
@@ -41,25 +54,53 @@ struct pmif_data {
const u32 *regs;
const u32 *spmimst_regs;
u32 soc_chan;
+ u32 caps;
};
struct pmif {
- void __iomem *base;
- void __iomem *spmimst_base;
+ void __iomem *pmif_base[2];
+ void __iomem *spmimst_base[2];
struct ch_reg chan;
struct clk_bulk_data clks[PMIF_MAX_CLKS];
size_t nclks;
const struct pmif_data *data;
- raw_spinlock_t lock;
+ raw_spinlock_t lock_m;
+ raw_spinlock_t lock_p;
+ struct spmi_controller *spmic;
+ struct wakeup_source *pmif_m_Thread_lock;
+ struct wakeup_source *pmif_p_Thread_lock;
+ struct mutex pmif_m_mutex;
+ struct mutex pmif_p_mutex;
+ int irq;
+ int irq_p;
+ struct irq_domain *domain;
+ struct irq_chip irq_chip;
+ struct irq_chip irq_chip_p;
+ int rcs_irq;
+ int rcs_irq_p;
+ struct mutex rcs_m_irqlock;
+ struct mutex rcs_p_irqlock;
+ bool *rcs_enable_hwirq;
+ int spmi_nack_irq;
+ int spmi_p_nack_irq;
};
static const char * const pmif_clock_names[] = {
"pmif_sys_ck", "pmif_tmr_ck", "spmimst_clk_mux", };
+struct pmif_irq_desc {
+ const char *name;
+ irq_handler_t irq_handler;
+ int irq;
+};
+
enum pmif_regs {
PMIF_INIT_DONE,
PMIF_INF_EN,
+ MD_AUXADC_RDATA_0_ADDR,
+ MD_AUXADC_RDATA_1_ADDR,
+ MD_AUXADC_RDATA_2_ADDR,
PMIF_ARB_EN,
PMIF_CMDISSUE_EN,
PMIF_TIMER_CTRL,
@@ -103,6 +144,11 @@ enum pmif_regs {