/* read ctl_out_1[4] to find USB attach or detach event */
reg = readl(chip->base + EUD_REG_CTL_OUT_1);
chip->usb_attached = reg & EUD_INT_SAFE_MODE;
}
staticvoid pet_eud(struct eud_chip *chip)
{
u32 reg; int ret;
/* When the EUD_INT_PET_EUD in SW_ATTACH_DET is set, the cable has been * disconnected and we need to detach the pet to check if EUD is in safe * mode before attaching again.
*/
reg = readl(chip->base + EUD_REG_SW_ATTACH_DET); if (reg & EUD_INT_PET_EUD) { /* Detach & Attach pet for EUD */
writel(0, chip->base + EUD_REG_SW_ATTACH_DET); /* Delay to make sure detach pet is done before attach pet */
ret = readl_poll_timeout(chip->base + EUD_REG_SW_ATTACH_DET,
reg, (reg == 0), 1, 100); if (ret) {
dev_err(chip->dev, "Detach pet failed\n"); return;
}
} /* Attach pet for EUD */
writel(EUD_INT_PET_EUD, chip->base + EUD_REG_SW_ATTACH_DET);
}
if (chip->usb_attached)
ret = usb_role_switch_set_role(chip->role_sw, USB_ROLE_DEVICE); else
ret = usb_role_switch_set_role(chip->role_sw, USB_ROLE_HOST); if (ret)
dev_err(chip->dev, "failed to set role switch\n");
/* set and clear vbus_int_clr[0] to clear interrupt */
writel(BIT(0), chip->base + EUD_REG_VBUS_INT_CLR);
writel(0, chip->base + EUD_REG_VBUS_INT_CLR);
chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); if (!chip) return -ENOMEM;
chip->dev = &pdev->dev;
chip->role_sw = usb_role_switch_get(&pdev->dev); if (IS_ERR(chip->role_sw)) return dev_err_probe(chip->dev, PTR_ERR(chip->role_sw), "failed to get role switch\n");
ret = devm_add_action_or_reset(chip->dev, eud_role_switch_release, chip); if (ret) return dev_err_probe(chip->dev, ret, "failed to add role switch release action\n");
chip->base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(chip->base)) return PTR_ERR(chip->base);
res = platform_get_resource(pdev, IORESOURCE_MEM, 1); if (!res) return -ENODEV;
chip->mode_mgr = res->start;
chip->irq = platform_get_irq(pdev, 0); if (chip->irq < 0) return chip->irq;
ret = devm_request_threaded_irq(&pdev->dev, chip->irq, handle_eud_irq,
handle_eud_irq_thread, IRQF_ONESHOT, NULL, chip); if (ret) return dev_err_probe(chip->dev, ret, "failed to allocate irq\n");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.