staging: mfd: add a PMIC driver for HiSilicon 6421 SPMI version
Add the PMIC SPMI driver for the HiSilicon 6421v600. [mchehab+huawei@kernel.org: keep just the MFD driver on this patch, and renamed filenames to better match other upstream drivers] The compete patch is at: https://github.com/96boards-hikey/linux/commit/08464419fba2 Signed-off-by: Mayulong <mayulong1@huawei.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> Link: https://lore.kernel.org/r/4ffb2694244baa47387e39e2c5d71243242c1fc1.1597647359.git.mchehab+huawei@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
7f3ac6c502
commit
4524ac56cd
165
include/linux/mfd/hi6421-spmi-pmic.h
Normal file
165
include/linux/mfd/hi6421-spmi-pmic.h
Normal file
@@ -0,0 +1,165 @@
|
||||
/*
|
||||
* Header file for device driver Hi6421 PMIC
|
||||
*
|
||||
* Copyright (c) 2013 Linaro Ltd.
|
||||
* Copyright (C) 2011 Hisilicon.
|
||||
*
|
||||
* Guodong Xu <guodong.xu@linaro.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef __HISI_PMIC_H
|
||||
#define __HISI_PMIC_H
|
||||
|
||||
#include <linux/irqdomain.h>
|
||||
|
||||
#define HISI_REGS_ENA_PROTECT_TIME (0) /* in microseconds */
|
||||
#define HISI_ECO_MODE_ENABLE (1)
|
||||
#define HISI_ECO_MODE_DISABLE (0)
|
||||
|
||||
typedef int (*pmic_ocp_callback)(char *);
|
||||
extern int hisi_pmic_special_ocp_register(char *power_name, pmic_ocp_callback handler);
|
||||
|
||||
struct irq_mask_info {
|
||||
int start_addr;
|
||||
int array;
|
||||
};
|
||||
|
||||
struct irq_info {
|
||||
int start_addr;
|
||||
int array;
|
||||
};
|
||||
|
||||
struct bit_info {
|
||||
int addr;
|
||||
int bit;
|
||||
};
|
||||
|
||||
struct write_lock {
|
||||
int addr;
|
||||
int val;
|
||||
};
|
||||
|
||||
struct hisi_pmic {
|
||||
struct resource *res;
|
||||
struct device *dev;
|
||||
void __iomem *regs;
|
||||
spinlock_t lock;
|
||||
struct irq_domain *domain;
|
||||
int irq;
|
||||
int gpio;
|
||||
unsigned int *irqs;
|
||||
int irqnum;
|
||||
int irqarray;
|
||||
struct irq_mask_info irq_mask_addr;
|
||||
struct irq_info irq_addr;
|
||||
int irqnum1;
|
||||
int irqarray1;
|
||||
struct irq_mask_info irq_mask_addr1;
|
||||
struct irq_info irq_addr1;
|
||||
struct write_lock normal_lock;
|
||||
struct write_lock debug_lock;
|
||||
};
|
||||
|
||||
/* 0:disable; 1:enable */
|
||||
unsigned int get_uv_mntn_status(void);
|
||||
void clear_uv_mntn_resered_reg_bit(void);
|
||||
void set_uv_mntn_resered_reg_bit(void);
|
||||
|
||||
#if defined(CONFIG_HISI_PMIC) || defined(CONFIG_HISI_PMIC_PMU_SPMI)
|
||||
/* Register Access Helpers */
|
||||
u32 hisi_pmic_read(struct hisi_pmic *pmic, int reg);
|
||||
void hisi_pmic_write(struct hisi_pmic *pmic, int reg, u32 val);
|
||||
void hisi_pmic_rmw(struct hisi_pmic *pmic, int reg, u32 mask, u32 bits);
|
||||
unsigned int hisi_pmic_reg_read(int addr);
|
||||
void hisi_pmic_reg_write(int addr, int val);
|
||||
void hisi_pmic_reg_write_lock(int addr, int val);
|
||||
int hisi_pmic_array_read(int addr, char *buff, unsigned int len);
|
||||
int hisi_pmic_array_write(int addr, char *buff, unsigned int len);
|
||||
extern int hisi_get_pmic_irq_byname(unsigned int pmic_irq_list);
|
||||
extern int hisi_pmic_get_vbus_status(void);
|
||||
#if defined(CONFIG_HISI_DIEID)
|
||||
u32 hisi_pmic_read_sub_pmu(u8 sid ,int reg);
|
||||
void hisi_pmic_write_sub_pmu(u8 sid ,int reg, u32 val);
|
||||
#endif
|
||||
#else
|
||||
static inline u32 hisi_pmic_read(struct hisi_pmic *pmic, int reg) { return 0; }
|
||||
static inline void hisi_pmic_write(struct hisi_pmic *pmic, int reg, u32 val) {}
|
||||
static inline void hisi_pmic_rmw(struct hisi_pmic *pmic, int reg, u32 mask, u32 bits) {}
|
||||
static inline unsigned int hisi_pmic_reg_read(int addr) { return 0; }
|
||||
static inline void hisi_pmic_reg_write(int addr, int val) {}
|
||||
static inline void hisi_pmic_reg_write_lock(int addr, int val) {}
|
||||
static inline int hisi_pmic_array_read(int addr, char *buff, unsigned int len) { return 0; }
|
||||
static inline int hisi_pmic_array_write(int addr, char *buff, unsigned int len) { return 0; }
|
||||
static inline int hisi_get_pmic_irq_byname(unsigned int pmic_irq_list) { return -1; }
|
||||
static inline int hisi_pmic_get_vbus_status(void) { return 1; }
|
||||
static inline u32 hisi_pmic_read_sub_pmu(u8 sid ,int reg) { return 0; }
|
||||
static inline void hisi_pmic_write_sub_pmu(u8 sid ,int reg, u32 val) {}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HISI_HI6421V500_PMU
|
||||
enum pmic_irq_list {
|
||||
POR_D45MR = 0,
|
||||
VBUS_CONNECT,
|
||||
VBUS_DISCONNECT,
|
||||
ALARMON_R,
|
||||
HOLD_6S,
|
||||
HOLD_1S,
|
||||
POWERKEY_UP,
|
||||
POWERKEY_DOWN,
|
||||
OCP_SCP_R,
|
||||
COUL_R,
|
||||
VSYS_OV,
|
||||
VSYS_UV,
|
||||
VSYS_PWROFF_ABS,
|
||||
VSYS_PWROFF_DEB,
|
||||
THSD_OTMP140,
|
||||
THSD_OTMP125,
|
||||
HRESETN,
|
||||
SIM0_HPD_R = 24,
|
||||
SIM0_HPD_F,
|
||||
SIM0_HPD_H,
|
||||
SIM0_HPD_L,
|
||||
SIM1_HPD_R,
|
||||
SIM1_HPD_F,
|
||||
SIM1_HPD_H,
|
||||
SIM1_HPD_L,
|
||||
PMIC_IRQ_LIST_MAX,
|
||||
};
|
||||
#else
|
||||
enum pmic_irq_list {
|
||||
OTMP = 0,
|
||||
VBUS_CONNECT,
|
||||
VBUS_DISCONNECT,
|
||||
ALARMON_R,
|
||||
HOLD_6S,
|
||||
HOLD_1S,
|
||||
POWERKEY_UP,
|
||||
POWERKEY_DOWN,
|
||||
OCP_SCP_R,
|
||||
COUL_R,
|
||||
SIM0_HPD_R,
|
||||
SIM0_HPD_F,
|
||||
SIM1_HPD_R,
|
||||
SIM1_HPD_F,
|
||||
PMIC_IRQ_LIST_MAX,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HISI_SR_DEBUG
|
||||
extern void get_ip_regulator_state(void);
|
||||
#endif
|
||||
#endif /* __HISI_PMIC_H */
|
||||
|
Reference in New Issue
Block a user