palmas_usb
} else if ((palmas_usb->linkstat == PALMAS_USB_STATE_ID) &&
palmas_usb->linkstat = PALMAS_USB_STATE_DISCONNECT;
dev_dbg(palmas_usb->dev, "USB-HOST cable is detached\n");
} else if ((palmas_usb->linkstat == PALMAS_USB_STATE_DISCONNECT) &&
palmas_usb->linkstat = PALMAS_USB_STATE_ID;
dev_dbg(palmas_usb->dev, "USB-HOST cable is attached\n");
struct palmas_usb *palmas_usb = container_of(to_delayed_work(work),
struct palmas_usb,
struct extcon_dev *edev = palmas_usb->edev;
if (!palmas_usb->id_gpiod)
id = gpiod_get_value_cansleep(palmas_usb->id_gpiod);
dev_dbg(palmas_usb->dev, "USB-HOST cable is detached\n");
dev_dbg(palmas_usb->dev, "USB-HOST cable is attached\n");
struct palmas_usb *palmas_usb = _palmas_usb;
queue_delayed_work(system_power_efficient_wq, &palmas_usb->wq_detectid,
palmas_usb->sw_debounce_jiffies);
static void palmas_enable_irq(struct palmas_usb *palmas_usb)
palmas_write(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
if (palmas_usb->enable_id_detection) {
palmas_write(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
palmas_write(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
if (palmas_usb->enable_vbus_detection)
palmas_vbus_irq_handler(palmas_usb->vbus_irq, palmas_usb);
if (palmas_usb->enable_id_detection) {
palmas_id_irq_handler(palmas_usb->id_irq, palmas_usb);
struct palmas_usb *palmas_usb;
palmas_usb = devm_kzalloc(&pdev->dev, sizeof(*palmas_usb), GFP_KERNEL);
if (!palmas_usb)
palmas_usb->wakeup = of_property_read_bool(node, "ti,wakeup");
palmas_usb->enable_id_detection = of_property_read_bool(node,
palmas_usb->enable_vbus_detection = of_property_read_bool(node,
palmas_usb->wakeup = true;
palmas_usb->enable_id_detection = true;
palmas_usb->enable_vbus_detection = true;
palmas_usb->wakeup = pdata->wakeup;
palmas_usb->id_gpiod = devm_gpiod_get_optional(&pdev->dev, "id",
if (IS_ERR(palmas_usb->id_gpiod))
return dev_err_probe(&pdev->dev, PTR_ERR(palmas_usb->id_gpiod),
palmas_usb->vbus_gpiod = devm_gpiod_get_optional(&pdev->dev, "vbus",
if (IS_ERR(palmas_usb->vbus_gpiod))
return dev_err_probe(&pdev->dev, PTR_ERR(palmas_usb->vbus_gpiod),
if (palmas_usb->enable_id_detection && palmas_usb->id_gpiod) {
palmas_usb->enable_id_detection = false;
palmas_usb->enable_gpio_id_detection = true;
if (palmas_usb->enable_vbus_detection && palmas_usb->vbus_gpiod) {
palmas_usb->enable_vbus_detection = false;
palmas_usb->enable_gpio_vbus_detection = true;
if (palmas_usb->enable_gpio_id_detection) {
status = gpiod_set_debounce(palmas_usb->id_gpiod,
palmas_usb->sw_debounce_jiffies = msecs_to_jiffies(debounce);
&palmas_usb->wq_detectid,
palmas->usb = palmas_usb;
palmas_usb->palmas = palmas;
palmas_usb->dev = &pdev->dev;
palmas_usb_wakeup(palmas, palmas_usb->wakeup);
platform_set_drvdata(pdev, palmas_usb);
palmas_usb->edev = devm_extcon_dev_allocate(&pdev->dev,
if (IS_ERR(palmas_usb->edev)) {
status = devm_extcon_dev_register(&pdev->dev, palmas_usb->edev);
if (palmas_usb->enable_id_detection) {
palmas_usb->id_otg_irq = regmap_irq_get_virq(palmas->irq_data,
palmas_usb->id_irq = regmap_irq_get_virq(palmas->irq_data,
status = devm_request_threaded_irq(palmas_usb->dev,
palmas_usb->id_irq,
"palmas_usb_id", palmas_usb);
palmas_usb->id_irq, status);
} else if (palmas_usb->enable_gpio_id_detection) {
palmas_usb->gpio_id_irq = gpiod_to_irq(palmas_usb->id_gpiod);
if (palmas_usb->gpio_id_irq < 0) {
return palmas_usb->gpio_id_irq;
palmas_usb->gpio_id_irq,
palmas_usb);
if (palmas_usb->enable_vbus_detection) {
palmas_usb->vbus_otg_irq = regmap_irq_get_virq(palmas->irq_data,
palmas_usb->vbus_irq = regmap_irq_get_virq(palmas->irq_data,
status = devm_request_threaded_irq(palmas_usb->dev,
palmas_usb->vbus_irq, NULL,
"palmas_usb_vbus", palmas_usb);
palmas_usb->vbus_irq, status);
} else if (palmas_usb->enable_gpio_vbus_detection) {
palmas_usb->vbus_otg_irq = regmap_irq_get_virq(palmas->irq_data,
palmas_usb->gpio_vbus_irq = gpiod_to_irq(palmas_usb->vbus_gpiod);
if (palmas_usb->gpio_vbus_irq < 0) {
return palmas_usb->gpio_vbus_irq;
palmas_usb->gpio_vbus_irq,
palmas_usb);
palmas_enable_irq(palmas_usb);
if (palmas_usb->enable_gpio_vbus_detection)
palmas_vbus_irq_handler(palmas_usb->gpio_vbus_irq, palmas_usb);
palmas_gpio_id_detect(&palmas_usb->wq_detectid.work);
struct palmas_usb *palmas_usb = dev_get_drvdata(dev);
if (palmas_usb->enable_vbus_detection)
enable_irq_wake(palmas_usb->vbus_irq);
if (palmas_usb->enable_gpio_vbus_detection)
enable_irq_wake(palmas_usb->gpio_vbus_irq);
if (palmas_usb->enable_id_detection)
enable_irq_wake(palmas_usb->id_irq);
if (palmas_usb->enable_gpio_id_detection)
enable_irq_wake(palmas_usb->gpio_id_irq);
struct palmas_usb *palmas_usb = dev_get_drvdata(dev);
if (palmas_usb->enable_vbus_detection)
disable_irq_wake(palmas_usb->vbus_irq);
if (palmas_usb->enable_gpio_vbus_detection)
disable_irq_wake(palmas_usb->gpio_vbus_irq);
if (palmas_usb->enable_id_detection)
disable_irq_wake(palmas_usb->id_irq);
if (palmas_usb->enable_gpio_id_detection)
disable_irq_wake(palmas_usb->gpio_id_irq);
if (palmas_usb->enable_gpio_vbus_detection)
palmas_vbus_irq_handler(palmas_usb->gpio_vbus_irq, palmas_usb);
palmas_gpio_id_detect(&palmas_usb->wq_detectid.work);
struct palmas_usb *palmas_usb = _palmas_usb;
struct extcon_dev *edev = palmas_usb->edev;
palmas_read(palmas_usb->palmas, PALMAS_INTERRUPT_BASE,
if (palmas_usb->linkstat != PALMAS_USB_STATE_VBUS) {
palmas_usb->linkstat = PALMAS_USB_STATE_VBUS;
dev_dbg(palmas_usb->dev, "USB cable is attached\n");
dev_dbg(palmas_usb->dev,
if (palmas_usb->linkstat == PALMAS_USB_STATE_VBUS) {
palmas_usb->linkstat = PALMAS_USB_STATE_DISCONNECT;
dev_dbg(palmas_usb->dev, "USB cable is detached\n");
dev_dbg(palmas_usb->dev,
struct palmas_usb *palmas_usb = _palmas_usb;
struct extcon_dev *edev = palmas_usb->edev;
palmas_read(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
palmas_read(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
palmas_write(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
palmas_usb->linkstat = PALMAS_USB_STATE_ID;
dev_dbg(palmas_usb->dev, "USB-HOST cable is attached\n");
palmas_write(palmas_usb->palmas, PALMAS_USB_OTG_BASE,
palmas_usb->linkstat = PALMAS_USB_STATE_DISCONNECT;
dev_dbg(palmas_usb->dev, "USB-HOST cable is detached\n");
struct palmas_usb;
#define comparator_to_palmas(x) container_of((x), struct palmas_usb, comparator)
struct palmas_usb *usb;