drivers/usb/typec/stusb160x.c

Source file repositories/reference/linux-study-clean/drivers/usb/typec/stusb160x.c

File Facts

System
Linux kernel
Corpus path
drivers/usb/typec/stusb160x.c
Extension
.c
Size
23552 bytes
Lines
880
Domain
Driver Families
Bucket
drivers/usb
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 stusb160x {
	struct device		*dev;
	struct regmap		*regmap;
	struct regulator	*vdd_supply;
	struct regulator	*vsys_supply;
	struct regulator	*vconn_supply;
	struct regulator	*main_supply;

	struct typec_port	*port;
	struct typec_capability capability;
	struct typec_partner	*partner;

	enum typec_port_type	port_type;
	enum typec_pwr_opmode	pwr_opmode;
	bool			vbus_on;

	struct usb_role_switch	*role_sw;
};

static bool stusb160x_reg_writeable(struct device *dev, unsigned int reg)
{
	switch (reg) {
	case STUSB160X_ALERT_STATUS_MASK_CTRL:
	case STUSB160X_CC_CAPABILITY_CTRL:
	case STUSB160X_CC_VCONN_SWITCH_CTRL:
	case STUSB160X_VCONN_MONITORING_CTRL:
	case STUSB160X_VBUS_MONITORING_RANGE_CTRL:
	case STUSB160X_RESET_CTRL:
	case STUSB160X_VBUS_DISCHARGE_TIME_CTRL:
	case STUSB160X_CC_POWER_MODE_CTRL:
	case STUSB160X_VBUS_MONITORING_CTRL:
		return true;
	default:
		return false;
	}
}

static bool stusb160x_reg_readable(struct device *dev, unsigned int reg)
{
	if (reg <= 0x0A ||
	    (reg >= 0x14 && reg <= 0x17) ||
	    (reg >= 0x19 && reg <= 0x1D) ||
	    (reg >= 0x29 && reg <= 0x2D) ||
	    (reg == 0x1F || reg == 0x21 || reg == 0x24 || reg == 0x2F))
		return false;
	else
		return true;
}

static bool stusb160x_reg_volatile(struct device *dev, unsigned int reg)
{
	switch (reg) {
	case STUSB160X_ALERT_STATUS:
	case STUSB160X_CC_CONNECTION_STATUS_TRANS:
	case STUSB160X_CC_CONNECTION_STATUS:
	case STUSB160X_MONITORING_STATUS_TRANS:
	case STUSB160X_MONITORING_STATUS:
	case STUSB160X_CC_OPERATION_STATUS:
	case STUSB160X_HW_FAULT_STATUS_TRANS:
	case STUSB160X_HW_FAULT_STATUS:
	case STUSB160X_VBUS_DISCHARGE_STATUS:
	case STUSB160X_VBUS_ENABLE_STATUS:
		return true;
	default:
		return false;
	}
}

static bool stusb160x_reg_precious(struct device *dev, unsigned int reg)
{
	switch (reg) {
	case STUSB160X_ALERT_STATUS:
	case STUSB160X_CC_CONNECTION_STATUS_TRANS:
	case STUSB160X_MONITORING_STATUS_TRANS:
	case STUSB160X_HW_FAULT_STATUS_TRANS:
		return true;
	default:
		return false;
	}
}

static const struct regmap_config stusb1600_regmap_config = {
	.reg_bits	= 8,
	.reg_stride	= 1,
	.val_bits	= 8,
	.max_register	= STUSB1600_REG_MAX,
	.writeable_reg	= stusb160x_reg_writeable,
	.readable_reg	= stusb160x_reg_readable,
	.volatile_reg	= stusb160x_reg_volatile,
	.precious_reg	= stusb160x_reg_precious,

Annotation

Implementation Notes