Commit 7281e05a authored by Laxman Dewangan's avatar Laxman Dewangan Committed by Chanwoo Choi

extcon: palmas: Option to disable ID/VBUS detection based on platform

Based on system design, platform needs to detect the VBUS or ID or
both. Provide option to select this through platform data to
disable part of cable detection through palmas-usb.
Signed-off-by: default avatarLaxman Dewangan <ldewangan@nvidia.com>
Acked-by: default avatarGraeme Gregory <gg@slimlogic.co.uk>
Signed-off-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: default avatarMyungjoo Ham <myungjoo.ham@samsung.com>
parent 024783ef
...@@ -6,6 +6,8 @@ Required Properties: ...@@ -6,6 +6,8 @@ Required Properties:
Optional Properties: Optional Properties:
- ti,wakeup : To enable the wakeup comparator in probe - ti,wakeup : To enable the wakeup comparator in probe
- ti,enable-id-detection: Perform ID detection.
- ti,enable-vbus-detection: Perform VBUS detection.
palmas-usb { palmas-usb {
compatible = "ti,twl6035-usb", "ti,palmas-usb"; compatible = "ti,twl6035-usb", "ti,palmas-usb";
......
...@@ -122,11 +122,14 @@ static void palmas_enable_irq(struct palmas_usb *palmas_usb) ...@@ -122,11 +122,14 @@ static void palmas_enable_irq(struct palmas_usb *palmas_usb)
PALMAS_USB_ID_INT_EN_HI_SET_ID_GND | PALMAS_USB_ID_INT_EN_HI_SET_ID_GND |
PALMAS_USB_ID_INT_EN_HI_SET_ID_FLOAT); PALMAS_USB_ID_INT_EN_HI_SET_ID_FLOAT);
if (palmas_usb->enable_vbus_detection)
palmas_vbus_irq_handler(palmas_usb->vbus_irq, palmas_usb); palmas_vbus_irq_handler(palmas_usb->vbus_irq, palmas_usb);
/* cold plug for host mode needs this delay */ /* cold plug for host mode needs this delay */
if (palmas_usb->enable_id_detection) {
msleep(30); msleep(30);
palmas_id_irq_handler(palmas_usb->id_irq, palmas_usb); palmas_id_irq_handler(palmas_usb->id_irq, palmas_usb);
}
} }
static int palmas_usb_probe(struct platform_device *pdev) static int palmas_usb_probe(struct platform_device *pdev)
...@@ -137,21 +140,25 @@ static int palmas_usb_probe(struct platform_device *pdev) ...@@ -137,21 +140,25 @@ static int palmas_usb_probe(struct platform_device *pdev)
struct palmas_usb *palmas_usb; struct palmas_usb *palmas_usb;
int status; int status;
if (node && !pdata) {
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata)
return -ENOMEM;
pdata->wakeup = of_property_read_bool(node, "ti,wakeup");
} else if (!pdata) {
return -EINVAL;
}
palmas_usb = devm_kzalloc(&pdev->dev, sizeof(*palmas_usb), GFP_KERNEL); palmas_usb = devm_kzalloc(&pdev->dev, sizeof(*palmas_usb), GFP_KERNEL);
if (!palmas_usb) if (!palmas_usb)
return -ENOMEM; return -ENOMEM;
if (node && !pdata) {
palmas_usb->wakeup = of_property_read_bool(node, "ti,wakeup");
palmas_usb->enable_id_detection = of_property_read_bool(node,
"ti,enable-id-detection");
palmas_usb->enable_vbus_detection = of_property_read_bool(node,
"ti,enable-vbus-detection");
} else {
palmas_usb->wakeup = true;
palmas_usb->enable_id_detection = true;
palmas_usb->enable_vbus_detection = true;
if (pdata)
palmas_usb->wakeup = pdata->wakeup;
}
palmas->usb = palmas_usb; palmas->usb = palmas_usb;
palmas_usb->palmas = palmas; palmas_usb->palmas = palmas;
...@@ -166,7 +173,7 @@ static int palmas_usb_probe(struct platform_device *pdev) ...@@ -166,7 +173,7 @@ static int palmas_usb_probe(struct platform_device *pdev)
palmas_usb->vbus_irq = regmap_irq_get_virq(palmas->irq_data, palmas_usb->vbus_irq = regmap_irq_get_virq(palmas->irq_data,
PALMAS_VBUS_IRQ); PALMAS_VBUS_IRQ);
palmas_usb_wakeup(palmas, pdata->wakeup); palmas_usb_wakeup(palmas, palmas_usb->wakeup);
platform_set_drvdata(pdev, palmas_usb); platform_set_drvdata(pdev, palmas_usb);
...@@ -179,7 +186,9 @@ static int palmas_usb_probe(struct platform_device *pdev) ...@@ -179,7 +186,9 @@ static int palmas_usb_probe(struct platform_device *pdev)
return status; return status;
} }
status = devm_request_threaded_irq(palmas_usb->dev, palmas_usb->id_irq, if (palmas_usb->enable_id_detection) {
status = devm_request_threaded_irq(palmas_usb->dev,
palmas_usb->id_irq,
NULL, palmas_id_irq_handler, NULL, palmas_id_irq_handler,
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING |
IRQF_ONESHOT | IRQF_EARLY_RESUME, IRQF_ONESHOT | IRQF_EARLY_RESUME,
...@@ -189,9 +198,12 @@ static int palmas_usb_probe(struct platform_device *pdev) ...@@ -189,9 +198,12 @@ static int palmas_usb_probe(struct platform_device *pdev)
palmas_usb->id_irq, status); palmas_usb->id_irq, status);
goto fail_extcon; goto fail_extcon;
} }
}
if (palmas_usb->enable_vbus_detection) {
status = devm_request_threaded_irq(palmas_usb->dev, status = devm_request_threaded_irq(palmas_usb->dev,
palmas_usb->vbus_irq, NULL, palmas_vbus_irq_handler, palmas_usb->vbus_irq, NULL,
palmas_vbus_irq_handler,
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING |
IRQF_ONESHOT | IRQF_EARLY_RESUME, IRQF_ONESHOT | IRQF_EARLY_RESUME,
"palmas_usb_vbus", palmas_usb); "palmas_usb_vbus", palmas_usb);
...@@ -200,6 +212,7 @@ static int palmas_usb_probe(struct platform_device *pdev) ...@@ -200,6 +212,7 @@ static int palmas_usb_probe(struct platform_device *pdev)
palmas_usb->vbus_irq, status); palmas_usb->vbus_irq, status);
goto fail_extcon; goto fail_extcon;
} }
}
palmas_enable_irq(palmas_usb); palmas_enable_irq(palmas_usb);
device_set_wakeup_capable(&pdev->dev, true); device_set_wakeup_capable(&pdev->dev, true);
...@@ -226,7 +239,9 @@ static int palmas_usb_suspend(struct device *dev) ...@@ -226,7 +239,9 @@ static int palmas_usb_suspend(struct device *dev)
struct palmas_usb *palmas_usb = dev_get_drvdata(dev); struct palmas_usb *palmas_usb = dev_get_drvdata(dev);
if (device_may_wakeup(dev)) { if (device_may_wakeup(dev)) {
if (palmas_usb->enable_vbus_detection)
enable_irq_wake(palmas_usb->vbus_irq); enable_irq_wake(palmas_usb->vbus_irq);
if (palmas_usb->enable_id_detection)
enable_irq_wake(palmas_usb->id_irq); enable_irq_wake(palmas_usb->id_irq);
} }
return 0; return 0;
...@@ -237,7 +252,9 @@ static int palmas_usb_resume(struct device *dev) ...@@ -237,7 +252,9 @@ static int palmas_usb_resume(struct device *dev)
struct palmas_usb *palmas_usb = dev_get_drvdata(dev); struct palmas_usb *palmas_usb = dev_get_drvdata(dev);
if (device_may_wakeup(dev)) { if (device_may_wakeup(dev)) {
if (palmas_usb->enable_vbus_detection)
disable_irq_wake(palmas_usb->vbus_irq); disable_irq_wake(palmas_usb->vbus_irq);
if (palmas_usb->enable_id_detection)
disable_irq_wake(palmas_usb->id_irq); disable_irq_wake(palmas_usb->id_irq);
} }
return 0; return 0;
......
...@@ -377,6 +377,9 @@ struct palmas_usb { ...@@ -377,6 +377,9 @@ struct palmas_usb {
int vbus_irq; int vbus_irq;
enum palmas_usb_state linkstat; enum palmas_usb_state linkstat;
int wakeup;
bool enable_vbus_detection;
bool enable_id_detection;
}; };
#define comparator_to_palmas(x) container_of((x), struct palmas_usb, comparator) #define comparator_to_palmas(x) container_of((x), struct palmas_usb, comparator)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment