blob: ed90e8afb97c1ed90b38f79b68fddf35d45cfd06 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2019 MediaTek Inc.
* Author: Argus Lin <argus.lin@mediatek.com>
*/
#ifndef __PMIF_H__
#define __PMIF_H__
#include <linux/clk.h>
enum {
SPMI_MASTER_0 = 0,
SPMI_MASTER_1,
SPMI_MASTER_2,
SPMI_MASTER_3
};
/**
* @base: pmif base address.
* @regs: pmif register offset table.
* @spmimst_base: spmi master base address.
* @spmimst_regs: spmi master register offset table.
* @infra_base: infra base address.
* @infra_regs: infra register offset table.
* @topckgen_base: topckgen base address.
* @topckgen_regs: topckgen register offset table.
* @toprgu_base: toprgu base address.
* @toprgu_regs: toprgu register offset table.
* @dbgregs: pmif debug register offset table.
* @dbgver: pmif debug version.
* @swinf_ch_start: indicate sw channel start number, lower is hw channel.
* @ap_swinf_no: indicate ap sw channel number.
* @write: indicate write cmd.
* @mstid: indicate mstid.
* @pmifid: indicate pmifid.
* @irq: indicate irq number.
* @grpid: indicates which group id we used.
* @lock: indicate lock key.
* @pmifThread_lock: indicate pmif interrupt thread pm protection.
* @pmif_mutex: indicate pmif interrupt thread mutex protection.
* @spmic: indicate spmi controller.
* @pmif_sys_ck: indicate pmif infracfg_ao sys_ck cg.
* @pmif_tmr_ck: indicate pmif infracfg_ao tmr_ck cg.
* @pmif_clk_mux: indicate pmif clock source, be as consumer.
* @pmif_clk_osc_d10: indicate pmif clock source to osc d10.
* @pmif_clk26m: indicate pmif clock source to clk26m.
* @spmimst_clk_mux: indicate spmimst clock source, be as consumer.
* @spmimst_clk26m: indicate spmimst clock sourc to clk26m.
* @spmimst_clk_osc_d10: indicate spmimst clock source to osc d10.
* @cmd: sends a non-data command sequence on the SPMI bus.
* @read_cmd: sends a register read command sequence on the SPMI bus.
* @write_cmd: sends a register write command sequence on the SPMI bus.
* @pmif_enable_clk_set: pmif clock set.
* @pmif_force_normal_mode: enable pmif normal mode.
* @pmif_enable_swinf: enable sw interface arbritation.
* @pmif_enable_cmdIssue: enable cmd enable to access.
* @pmif_enable: set pmif all done.
* @is_pmif_init_done: check if pmif init done.
* @pmif_enable_reset: SW reset pmif.
* @pmif_cali_clock: calibrate spmi master clock.
* @spmi_config_master: config spmi master.
*/
struct pmif {
void __iomem *base;
const u32 *regs;
void __iomem *spmimst_base;
const u32 *spmimst_regs;
void __iomem *infra_base;
const u32 *infra_regs;
void __iomem *topckgen_base;
const u32 *topckgen_regs;
void __iomem *toprgu_base;
const u32 *toprgu_regs;
const u32 *dbgregs;
u32 dbgver;
u32 swinf_ch_start;
u32 ap_swinf_no;
int write;
int mstid;
int pmifid;
int irq;
int grpid;
raw_spinlock_t lock;
struct wakeup_source *pmifThread_lock;
struct mutex pmif_mutex;
struct spmi_controller *spmic;
struct clk *pmif_sys_ck;
struct clk *pmif_tmr_ck;
struct clk *pmif_clk_mux;
struct clk *pmif_clk_osc_d10;
struct clk *pmif_clk26m;
struct clk *spmimst_clk_mux;
struct clk *spmimst_clk26m;
struct clk *spmimst_clk_osc_d10;
int (*cmd)(struct spmi_controller *ctrl, unsigned int opcode);
int (*read_cmd)(struct spmi_controller *ctrl, u8 opc, u8 sid,
u16 addr, u8 *buf, size_t len);
int (*write_cmd)(struct spmi_controller *ctrl, u8 opc, u8 sid,
u16 addr, const u8 *buf, size_t len);
void (*pmif_enable_clk_set)(struct pmif *arb);
void (*pmif_force_normal_mode)(struct pmif *arb);
void (*pmif_enable_swinf)(struct pmif *arb, unsigned int chan_no,
unsigned int swinf_no);
void (*pmif_enable_cmdIssue)(struct pmif *arb, bool en);
void (*pmif_enable)(struct pmif *arb);
int (*is_pmif_init_done)(struct pmif *arb);
void (*pmif_enable_reset)(struct pmif *arb);
int (*pmif_cali_clock)(struct pmif *arb);
int (*spmi_config_master)(struct pmif *arb, unsigned int mstid,
bool en);
};
#endif /*__PMIF_H__*/