Merge "defconfig: sdxprairie: Enable SPMI MISC driver"
This commit is contained in:
committed by
Gerrit - the friendly Code Review server
commit
4b042fdc59
@@ -8,7 +8,7 @@ PROPERTIES
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: Should contain "qcom,pm8941-misc";
|
||||
Definition: Should contain "qcom,pm8941-misc" or "qcom,pmd-vbus-det";
|
||||
|
||||
- reg:
|
||||
Usage: required
|
||||
|
||||
@@ -408,6 +408,7 @@ CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
|
||||
CONFIG_ARM_MEMLAT_MON=y
|
||||
CONFIG_DEVFREQ_GOV_MEMLAT=y
|
||||
CONFIG_QCOM_DEVFREQ_DEVBW=y
|
||||
CONFIG_EXTCON_QCOM_SPMI_MISC=y
|
||||
CONFIG_IIO=y
|
||||
CONFIG_QCOM_SPMI_ADC5=y
|
||||
CONFIG_PWM=y
|
||||
|
||||
1
arch/arm/configs/vendor/sdxprairie_defconfig
vendored
1
arch/arm/configs/vendor/sdxprairie_defconfig
vendored
@@ -413,6 +413,7 @@ CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
|
||||
CONFIG_ARM_MEMLAT_MON=y
|
||||
CONFIG_DEVFREQ_GOV_MEMLAT=y
|
||||
CONFIG_QCOM_DEVFREQ_DEVBW=y
|
||||
CONFIG_EXTCON_QCOM_SPMI_MISC=y
|
||||
CONFIG_IIO=y
|
||||
CONFIG_QCOM_SPMI_ADC5=y
|
||||
CONFIG_PWM=y
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* extcon-qcom-spmi-misc.c - Qualcomm USB extcon driver to support USB ID
|
||||
* detection based on extcon-usb-gpio.c.
|
||||
* and VBUS detection based on extcon-usb-gpio.c.
|
||||
*
|
||||
* Copyright (C) 2016 Linaro, Ltd.
|
||||
* Stephen Boyd <stephen.boyd@linaro.org>
|
||||
@@ -28,30 +28,56 @@
|
||||
|
||||
struct qcom_usb_extcon_info {
|
||||
struct extcon_dev *edev;
|
||||
int irq;
|
||||
int id_irq;
|
||||
int vbus_irq;
|
||||
struct delayed_work wq_detcable;
|
||||
unsigned long debounce_jiffies;
|
||||
};
|
||||
|
||||
static const unsigned int qcom_usb_extcon_cable[] = {
|
||||
EXTCON_USB,
|
||||
EXTCON_USB_HOST,
|
||||
EXTCON_NONE,
|
||||
};
|
||||
|
||||
static void qcom_usb_extcon_detect_cable(struct work_struct *work)
|
||||
{
|
||||
bool id;
|
||||
bool state = 0;
|
||||
int ret;
|
||||
union extcon_property_value val;
|
||||
struct qcom_usb_extcon_info *info = container_of(to_delayed_work(work),
|
||||
struct qcom_usb_extcon_info,
|
||||
wq_detcable);
|
||||
|
||||
/* check ID and update cable state */
|
||||
ret = irq_get_irqchip_state(info->irq, IRQCHIP_STATE_LINE_LEVEL, &id);
|
||||
if (ret)
|
||||
return;
|
||||
if (info->id_irq > 0) {
|
||||
/* check ID and update cable state */
|
||||
ret = irq_get_irqchip_state(info->id_irq,
|
||||
IRQCHIP_STATE_LINE_LEVEL, &state);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
extcon_set_state_sync(info->edev, EXTCON_USB_HOST, !id);
|
||||
if (!state) {
|
||||
val.intval = true;
|
||||
extcon_set_property(info->edev, EXTCON_USB_HOST,
|
||||
EXTCON_PROP_USB_SS, val);
|
||||
}
|
||||
extcon_set_state_sync(info->edev, EXTCON_USB_HOST, !state);
|
||||
}
|
||||
|
||||
if (info->vbus_irq > 0) {
|
||||
/* check VBUS and update cable state */
|
||||
ret = irq_get_irqchip_state(info->vbus_irq,
|
||||
IRQCHIP_STATE_LINE_LEVEL, &state);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
if (state) {
|
||||
val.intval = true;
|
||||
extcon_set_property(info->edev, EXTCON_USB,
|
||||
EXTCON_PROP_USB_SS, val);
|
||||
}
|
||||
extcon_set_state_sync(info->edev, EXTCON_USB, state);
|
||||
}
|
||||
}
|
||||
|
||||
static irqreturn_t qcom_usb_irq_handler(int irq, void *dev_id)
|
||||
@@ -86,21 +112,48 @@ static int qcom_usb_extcon_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = extcon_set_property_capability(info->edev,
|
||||
EXTCON_USB, EXTCON_PROP_USB_SS);
|
||||
ret |= extcon_set_property_capability(info->edev,
|
||||
EXTCON_USB_HOST, EXTCON_PROP_USB_SS);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to register extcon props rc=%d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
info->debounce_jiffies = msecs_to_jiffies(USB_ID_DEBOUNCE_MS);
|
||||
INIT_DELAYED_WORK(&info->wq_detcable, qcom_usb_extcon_detect_cable);
|
||||
|
||||
info->irq = platform_get_irq_byname(pdev, "usb_id");
|
||||
if (info->irq < 0)
|
||||
return info->irq;
|
||||
|
||||
ret = devm_request_threaded_irq(dev, info->irq, NULL,
|
||||
info->id_irq = platform_get_irq_byname(pdev, "usb_id");
|
||||
if (info->id_irq > 0) {
|
||||
ret = devm_request_threaded_irq(dev, info->id_irq, NULL,
|
||||
qcom_usb_irq_handler,
|
||||
IRQF_TRIGGER_RISING |
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
pdev->name, info);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to request handler for ID IRQ\n");
|
||||
return ret;
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to request handler for ID IRQ\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
info->vbus_irq = platform_get_irq_byname(pdev, "usb_vbus");
|
||||
if (info->vbus_irq > 0) {
|
||||
ret = devm_request_threaded_irq(dev, info->vbus_irq, NULL,
|
||||
qcom_usb_irq_handler,
|
||||
IRQF_TRIGGER_RISING |
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
pdev->name, info);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to request handler for VBUS IRQ\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (info->id_irq < 0 && info->vbus_irq < 0) {
|
||||
dev_err(dev, "ID and VBUS IRQ not found\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, info);
|
||||
@@ -127,8 +180,12 @@ static int qcom_usb_extcon_suspend(struct device *dev)
|
||||
struct qcom_usb_extcon_info *info = dev_get_drvdata(dev);
|
||||
int ret = 0;
|
||||
|
||||
if (device_may_wakeup(dev))
|
||||
ret = enable_irq_wake(info->irq);
|
||||
if (device_may_wakeup(dev)) {
|
||||
if (info->id_irq > 0)
|
||||
ret = enable_irq_wake(info->id_irq);
|
||||
if (info->vbus_irq > 0)
|
||||
ret = enable_irq_wake(info->vbus_irq);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -138,8 +195,12 @@ static int qcom_usb_extcon_resume(struct device *dev)
|
||||
struct qcom_usb_extcon_info *info = dev_get_drvdata(dev);
|
||||
int ret = 0;
|
||||
|
||||
if (device_may_wakeup(dev))
|
||||
ret = disable_irq_wake(info->irq);
|
||||
if (device_may_wakeup(dev)) {
|
||||
if (info->id_irq > 0)
|
||||
ret = disable_irq_wake(info->id_irq);
|
||||
if (info->vbus_irq > 0)
|
||||
ret = disable_irq_wake(info->vbus_irq);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -150,6 +211,7 @@ static SIMPLE_DEV_PM_OPS(qcom_usb_extcon_pm_ops,
|
||||
|
||||
static const struct of_device_id qcom_usb_extcon_dt_match[] = {
|
||||
{ .compatible = "qcom,pm8941-misc", },
|
||||
{ .compatible = "qcom,pmd-vbus-det", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, qcom_usb_extcon_dt_match);
|
||||
|
||||
Reference in New Issue
Block a user