#include <linux/workqueue.h>
#include <linux/regulator/consumer.h>
+#include <linux/usb/otg.h>
#include <linux/spi/cpcap.h>
#include <linux/spi/cpcap-regbits.h>
struct switch_dev wsdev;
struct switch_dev dsdev;
struct switch_dev asdev;
+ struct otg_transceiver *otg;
};
static int whisper_debug;
retval |= cpcap_regacc_write(data->cpcap, CPCAP_REG_USBC1, 0,
CPCAP_BIT_VBUSPD);
gpio_set_value(data->pdata->data_gpio, 1);
+ if (data->otg)
+ blocking_notifier_call_chain(&data->otg->notifier,
+ USB_EVENT_VBUS, NULL);
break;
case CPCAP_ACCY_USB_HOST:
CPCAP_BIT_VBUSPD);
gpio_set_value(data->pdata->pwr_gpio, 1);
gpio_set_value(data->pdata->data_gpio, 1);
+ if (data->otg)
+ blocking_notifier_call_chain(&data->otg->notifier,
+ USB_EVENT_ID, NULL);
break;
case CPCAP_ACCY_WHISPER:
retval |= cpcap_regacc_write(data->cpcap, CPCAP_REG_USBC2, 0,
CPCAP_BIT_USBXCVREN);
vusb_disable(data);
+ if (data->otg)
+ blocking_notifier_call_chain(&data->otg->notifier,
+ USB_EVENT_NONE, NULL);
break;
}
goto free_irqs;
}
+#ifdef CONFIG_USB_CPCAP_OTG
+ data->otg = otg_get_transceiver();
+#endif
+
data->cpcap->accydata = data;
dev_info(&pdev->dev, "CPCAP Whisper detection probed\n");
vusb_disable(data);
regulator_put(data->regulator);
+#ifdef CONFIG_USB_CPCAP_OTG
+ if (data->otg)
+ otg_put_transceiver(data->otg);
+#endif
+
wake_lock_destroy(&data->wake_lock);
data->cpcap->accydata = NULL;