pmic_typec_port
struct pmic_typec_port *pmic_typec_port;
struct pmic_typec_port *pmic_typec_port;
struct pmic_typec_port *pmic_typec_port =
container_of(work, struct pmic_typec_port, cc_debounce_dwork.work);
spin_lock_irqsave(&pmic_typec_port->lock, flags);
pmic_typec_port->debouncing_cc = false;
spin_unlock_irqrestore(&pmic_typec_port->lock, flags);
dev_dbg(pmic_typec_port->dev, "Debounce cc complete\n");
struct pmic_typec_port *pmic_typec_port = irq_data->pmic_typec_port;
spin_lock_irqsave(&pmic_typec_port->lock, flags);
ret = regmap_read(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_MISC_STATUS_REG,
if (!pmic_typec_port->debouncing_cc)
spin_unlock_irqrestore(&pmic_typec_port->lock, flags);
tcpm_vbus_change(pmic_typec_port->tcpm_port);
tcpm_cc_change(pmic_typec_port->tcpm_port);
static int qcom_pmic_typec_port_vbus_detect(struct pmic_typec_port *pmic_typec_port)
struct device *dev = pmic_typec_port->dev;
ret = regmap_read(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_MISC_STATUS_REG,
static int qcom_pmic_typec_port_vbus_toggle(struct pmic_typec_port *pmic_typec_port, bool on)
ret = regulator_enable(pmic_typec_port->vdd_vbus);
ret = regulator_disable(pmic_typec_port->vdd_vbus);
ret = regmap_read_poll_timeout(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_SM_STATUS_REG,
dev_warn(pmic_typec_port->dev, "vbus vsafe%dv fail\n", on ? 5 : 0);
struct pmic_typec_port *pmic_typec_port = tcpm->pmic_typec_port;
mutex_lock(&pmic_typec_port->vbus_lock);
ret = pmic_typec_port->vbus_enabled || qcom_pmic_typec_port_vbus_detect(pmic_typec_port);
mutex_unlock(&pmic_typec_port->vbus_lock);
struct pmic_typec_port *pmic_typec_port = tcpm->pmic_typec_port;
mutex_lock(&pmic_typec_port->vbus_lock);
if (pmic_typec_port->vbus_enabled == on)
ret = qcom_pmic_typec_port_vbus_toggle(pmic_typec_port, on);
pmic_typec_port->vbus_enabled = on;
mutex_unlock(&pmic_typec_port->vbus_lock);
struct pmic_typec_port *pmic_typec_port = tcpm->pmic_typec_port;
struct device *dev = pmic_typec_port->dev;
ret = regmap_read(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_MISC_STATUS_REG, &misc);
if (pmic_typec_port->debouncing_cc) {
ret = regmap_read(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_SRC_STATUS_REG,
ret = regmap_read(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_SNK_STATUS_REG,
static void qcom_pmic_set_cc_debounce(struct pmic_typec_port *pmic_typec_port)
pmic_typec_port->debouncing_cc = true;
schedule_delayed_work(&pmic_typec_port->cc_debounce_dwork,
struct pmic_typec_port *pmic_typec_port = tcpm->pmic_typec_port;
struct device *dev = pmic_typec_port->dev;
spin_lock_irqsave(&pmic_typec_port->lock, flags);
ret = regmap_read(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_MISC_STATUS_REG,
ret = regmap_write(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_CURRSRC_CFG_REG,
pmic_typec_port->cc = cc;
qcom_pmic_set_cc_debounce(pmic_typec_port);
spin_unlock_irqrestore(&pmic_typec_port->lock, flags);
pmic_typec_port->debouncing_cc, !!(misc & CC_ATTACHED),
struct pmic_typec_port *pmic_typec_port = tcpm->pmic_typec_port;
struct device *dev = pmic_typec_port->dev;
spin_lock_irqsave(&pmic_typec_port->lock, flags);
ret = regmap_read(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_MISC_STATUS_REG, &misc);
ret = regmap_update_bits(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_VCONN_CONTROL_REG,
spin_unlock_irqrestore(&pmic_typec_port->lock, flags);
struct pmic_typec_port *pmic_typec_port = tcpm->pmic_typec_port;
struct device *dev = pmic_typec_port->dev;
spin_lock_irqsave(&pmic_typec_port->lock, flags);
ret = regmap_read(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_MISC_STATUS_REG, &misc);
misc, !!(misc & CC_ATTACHED), port_type, pmic_typec_port->cc, cc);
qcom_pmic_set_cc_debounce(pmic_typec_port);
ret = regmap_write(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_MODE_CFG_REG,
ret = regmap_write(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_MODE_CFG_REG,
spin_unlock_irqrestore(&pmic_typec_port->lock, flags);
struct pmic_typec_port *pmic_typec_port = tcpm->pmic_typec_port;
ret = regmap_write(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_INTERRUPT_EN_CFG_1_REG,
ret = regmap_write(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_INTERRUPT_EN_CFG_2_REG,
ret = regmap_write(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_MODE_CFG_REG, EN_TRY_SNK);
ret = regmap_update_bits(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_VCONN_CONTROL_REG,
ret = regmap_update_bits(pmic_typec_port->regmap,
pmic_typec_port->base + TYPEC_EXIT_STATE_CFG_REG,
pmic_typec_port->tcpm_port = tcpm_port;
for (i = 0; i < pmic_typec_port->nr_irqs; i++)
enable_irq(pmic_typec_port->irq_data[i].irq);
struct pmic_typec_port *pmic_typec_port = tcpm->pmic_typec_port;
for (i = 0; i < pmic_typec_port->nr_irqs; i++)
disable_irq(pmic_typec_port->irq_data[i].irq);
struct pmic_typec_port *pmic_typec_port;
pmic_typec_port = devm_kzalloc(dev, sizeof(*pmic_typec_port), GFP_KERNEL);
if (!pmic_typec_port)
mutex_init(&pmic_typec_port->vbus_lock);
pmic_typec_port->vdd_vbus = devm_of_regulator_get_optional(dev,
if (pmic_typec_port->vdd_vbus == ERR_PTR(-ENODEV))
pmic_typec_port->vdd_vbus = devm_regulator_get(dev, "vdd-vbus");
if (IS_ERR(pmic_typec_port->vdd_vbus))
return PTR_ERR(pmic_typec_port->vdd_vbus);
pmic_typec_port->dev = dev;
pmic_typec_port->base = base;
pmic_typec_port->regmap = regmap;
pmic_typec_port->nr_irqs = res->nr_irqs;
pmic_typec_port->irq_data = irq_data;
spin_lock_init(&pmic_typec_port->lock);
INIT_DELAYED_WORK(&pmic_typec_port->cc_debounce_dwork,
irq_data->pmic_typec_port = pmic_typec_port;
tcpm->pmic_typec_port = pmic_typec_port;