drivers/phy/hisilicon/phy-hi3670-usb3.c

Source file repositories/reference/linux-study-clean/drivers/phy/hisilicon/phy-hi3670-usb3.c

File Facts

System
Linux kernel
Corpus path
drivers/phy/hisilicon/phy-hi3670-usb3.c
Extension
.c
Size
15715 bytes
Lines
663
Domain
Driver Families
Bucket
drivers/phy
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct hi3670_priv {
	struct device *dev;
	struct regmap *peri_crg;
	struct regmap *pctrl;
	struct regmap *sctrl;
	struct regmap *usb31misc;

	u32 eye_diagram_param;
	u32 tx_vboost_lvl;

	u32 peri_crg_offset;
	u32 pctrl_offset;
	u32 usb31misc_offset;
};

static int hi3670_phy_cr_clk(struct regmap *usb31misc)
{
	int ret;

	/* Clock up */
	ret = regmap_update_bits(usb31misc, USB_MISC_CFG54,
				 CFG54_USB31PHY_CR_CLK, CFG54_USB31PHY_CR_CLK);
	if (ret)
		return ret;

	/* Clock down */
	return regmap_update_bits(usb31misc, USB_MISC_CFG54,
				  CFG54_USB31PHY_CR_CLK, 0);
}

static int hi3670_phy_cr_set_sel(struct regmap *usb31misc)
{
	return regmap_update_bits(usb31misc, USB_MISC_CFG54,
				  CFG54_USB31PHY_CR_SEL, CFG54_USB31PHY_CR_SEL);
}

static int hi3670_phy_cr_start(struct regmap *usb31misc, int direction)
{
	int ret, reg;

	if (direction)
		reg = CFG54_USB31PHY_CR_WR_EN;
	else
		reg = CFG54_USB31PHY_CR_RD_EN;

	ret = regmap_update_bits(usb31misc, USB_MISC_CFG54, reg, reg);

	if (ret)
		return ret;

	ret = hi3670_phy_cr_clk(usb31misc);
	if (ret)
		return ret;

	return regmap_update_bits(usb31misc, USB_MISC_CFG54,
				  CFG54_USB31PHY_CR_RD_EN | CFG54_USB31PHY_CR_WR_EN, 0);
}

static int hi3670_phy_cr_wait_ack(struct regmap *usb31misc)
{
	u32 reg;
	int retry = 10;
	int ret;

	while (retry-- > 0) {
		ret = regmap_read(usb31misc, USB_MISC_CFG54, &reg);
		if (ret)
			return ret;
		if ((reg & CFG54_USB31PHY_CR_ACK) == CFG54_USB31PHY_CR_ACK)
			return 0;

		ret = hi3670_phy_cr_clk(usb31misc);
		if (ret)
			return ret;

		usleep_range(10, 20);
	}

	return -ETIMEDOUT;
}

static int hi3670_phy_cr_set_addr(struct regmap *usb31misc, u32 addr)
{
	u32 reg;
	int ret;

	ret = regmap_read(usb31misc, USB_MISC_CFG54, &reg);
	if (ret)
		return ret;

Annotation

Implementation Notes