drivers/phy/intel/phy-intel-keembay-usb.c

Source file repositories/reference/linux-study-clean/drivers/phy/intel/phy-intel-keembay-usb.c

File Facts

System
Linux kernel
Corpus path
drivers/phy/intel/phy-intel-keembay-usb.c
Extension
.c
Size
7633 bytes
Lines
302
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 keembay_usb_phy {
	struct device *dev;
	struct regmap *regmap_cpr;
	struct regmap *regmap_slv;
};

static const struct regmap_config keembay_regmap_config = {
	.reg_bits = 32,
	.val_bits = 32,
	.reg_stride = 4,
	.max_register = USS_USB_TIEOFFS_CONSTANTS_REG1,
};

static int keembay_usb_clocks_on(struct keembay_usb_phy *priv)
{
	int ret;

	ret = regmap_update_bits(priv->regmap_cpr, USS_CPR_CLK_SET,
				 USS_CPR_MASK, USS_CPR_MASK);
	if (ret) {
		dev_err(priv->dev, "error clock set: %d\n", ret);
		return ret;
	}

	ret = regmap_update_bits(priv->regmap_cpr, USS_CPR_RST_SET,
				 USS_CPR_MASK, USS_CPR_MASK);
	if (ret) {
		dev_err(priv->dev, "error reset set: %d\n", ret);
		return ret;
	}

	ret = regmap_update_bits(priv->regmap_slv,
				 USS_USB_TIEOFFS_CONSTANTS_REG1,
				 IDDQ_ENABLE_MASK,
				 FIELD_PREP(IDDQ_ENABLE_MASK, 0));
	if (ret) {
		dev_err(priv->dev, "error iddq disable: %d\n", ret);
		return ret;
	}

	/* Wait 30us to ensure all analog blocks are powered up. */
	usleep_range(30, 60);

	ret = regmap_update_bits(priv->regmap_slv, USS_USB_PHY_CFG0,
				 PHY_REF_USE_PAD_MASK,
				 FIELD_PREP(PHY_REF_USE_PAD_MASK, 1));
	if (ret)
		dev_err(priv->dev, "error ref clock select: %d\n", ret);

	return ret;
}

static int keembay_usb_core_off(struct keembay_usb_phy *priv)
{
	int ret;

	ret = regmap_update_bits(priv->regmap_slv, USS_USB_CTRL_CFG0,
				 VCC_RESET_N_MASK,
				 FIELD_PREP(VCC_RESET_N_MASK, 0));
	if (ret)
		dev_err(priv->dev, "error core reset: %d\n", ret);

	return ret;
}

static int keembay_usb_core_on(struct keembay_usb_phy *priv)
{
	int ret;

	ret = regmap_update_bits(priv->regmap_slv, USS_USB_CTRL_CFG0,
				 VCC_RESET_N_MASK,
				 FIELD_PREP(VCC_RESET_N_MASK, 1));
	if (ret)
		dev_err(priv->dev, "error core on: %d\n", ret);

	return ret;
}

static int keembay_usb_phys_on(struct keembay_usb_phy *priv)
{
	int ret;

	ret = regmap_update_bits(priv->regmap_slv, USS_USB_PHY_CFG0,
				 POR_MASK | PHY_RESET_MASK,
				 FIELD_PREP(POR_MASK | PHY_RESET_MASK, 0));
	if (ret)
		dev_err(priv->dev, "error phys on: %d\n", ret);

	return ret;
}

Annotation

Implementation Notes