blob: a26d9f1815e9da891e97a15526049a88308e3e38 [file] [log] [blame]
/*
* Copyright (C) 2017 MediaTek Inc.
*
* 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.
*/
#ifndef __PHY_MTK_SSUSB_H
#define __PHY_MTK_SSUSB_H
#include <linux/types.h>
#include <linux/clk.h>
struct mtk_phy_tuning {
s32 u2_vrt_ref;
s32 u2_term_ref;
s32 u2_enhance;
#ifdef OPLUS_FEATURE_CHG_BASIC
/* Baoquan.Lai@BSP.CHG.Basic, 2020/04/26, add for phy_tuning */
s32 host_u2_vrt_ref;
s32 host_u2_term_ref;
s32 host_u2_enhance;
#endif
bool inited;
};
struct mtk_phy_instance {
const struct mtk_phy_interface *phycfg;
struct mtk_phy_drv *phy_drv;
struct phy *phy;
void __iomem *port_base;
void __iomem *sif_misc;
void __iomem *sif_fmreg;
void __iomem *sif_u2phy_com;
void __iomem *sif_spllc;
void __iomem *sif_chip;
void __iomem *sif_u3phyd;
void __iomem *sif_u3phyd_bank2;
void __iomem *sif_u3phya;
void __iomem *sif_u3phya_da;
unsigned int port_rgsz;
bool sib_mode;
bool uart_mode;
int phy_number;
struct mtk_phy_tuning phy_tuning;
};
struct mtk_phy_interface {
int (*usb_phy_init)(struct mtk_phy_instance *instance);
void (*usb_phy_savecurrent)(struct mtk_phy_instance *instance);
void (*usb_phy_recover)(struct mtk_phy_instance *instance);
void (*usb_phy_switch_to_bc11)(struct mtk_phy_instance *instance,
bool on);
void (*usb_phy_dpdm_pulldown)(struct mtk_phy_instance *instance,
bool enable);
int (*usb_phy_lpm_enable)(struct mtk_phy_instance *instance, bool on);
int (*usb_phy_host_mode)(struct mtk_phy_instance *instance, bool on);
int (*usb_phy_io_read)(struct mtk_phy_instance *instance, u32 reg);
int (*usb_phy_io_write)(struct mtk_phy_instance *instance, u32 val,
u32 reg);
void (*usb_phy_switch_to_usb)(struct mtk_phy_instance *instance);
void (*usb_phy_switch_to_uart)(struct mtk_phy_instance *instance);
bool (*usb_phy_check_in_uart_mode)(struct mtk_phy_instance *instance);
void (*usb_phy_dump_usb2uart_reg)(struct mtk_phy_instance *instance);
void (*usb_phy_sib_enable_switch)(struct mtk_phy_instance *instance,
bool enable);
bool (*usb_phy_sib_switch_status)(struct mtk_phy_instance *instance);
bool (*usb_phy_u3_loop_back_test)(struct mtk_phy_instance *instance);
int (*usb_phy_inst_init)(struct mtk_phy_instance *instance);
unsigned int reg_offset;
char *name;
char *tuning_node_name;
u8 port_num;
u8 port_type;
};
struct mtk_usbphy_config {
const struct mtk_phy_interface *phys;
unsigned int num_phys;
unsigned int version;
int (*usb_drv_init)(struct platform_device *pdev,
struct mtk_phy_drv *drv);
int (*usb_drv_exit)(struct platform_device *pdev,
struct mtk_phy_drv *drv);
};
struct mtk_phy_drv {
struct device *dev;
const struct mtk_usbphy_config *phycfg;
void __iomem *phy_base;
void __iomem *ippc_base;
struct mtk_phy_instance **phys;
int nphys;
struct clk *clk;
struct regulator *vusb33;
struct regulator *vusb10;
};
/*Set the debug level for phy driver*/
#define K_ALET (1<<6)
#define K_CRIT (1<<5)
#define K_ERR (1<<4)
#define K_WARNIN (1<<3)
#define K_NOTICE (1<<2)
#define K_INFO (1<<1)
#define K_DEBUG (1<<0)
extern u32 phy_debug_level;
#define phy_printk(level, fmt, args...) do { \
if (phy_debug_level & level) { \
pr_info("[MTKPHY]" fmt, ## args); \
} \
} while (0)
extern const struct of_device_id mtk_phy_of_match[];
#endif