Commit 6c4c9a9a authored by Hans de Goede's avatar Hans de Goede Committed by Rafael J. Wysocki

power: supply: axp288_charger: Only wait for INT3496 device if present

On some devices with an axp288 pmic setting vbus path based on the
id-pin is handled by an ACPI _AIE interrupt on the gpio and the
INT3496 device is disabled.

Instead of returning -EPROBE_DEFER on these devices waiting for the
never to show up INT3496 device, check for its presence and only
request and monitor the matching extcon if the device is there,
otherwise let the firmware handle the vbus path control.
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Acked-by: default avatarSebastian Reichel <sre@kernel.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent af3ec837
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include <linux/acpi.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/regmap.h> #include <linux/regmap.h>
...@@ -113,7 +114,8 @@ ...@@ -113,7 +114,8 @@
#define ILIM_3000MA 3000 /* 3000mA */ #define ILIM_3000MA 3000 /* 3000mA */
#define AXP288_EXTCON_DEV_NAME "axp288_extcon" #define AXP288_EXTCON_DEV_NAME "axp288_extcon"
#define USB_HOST_EXTCON_DEV_NAME "INT3496:00" #define USB_HOST_EXTCON_HID "INT3496"
#define USB_HOST_EXTCON_NAME "INT3496:00"
static const unsigned int cable_ids[] = static const unsigned int cable_ids[] =
{ EXTCON_CHG_USB_SDP, EXTCON_CHG_USB_CDP, EXTCON_CHG_USB_DCP }; { EXTCON_CHG_USB_SDP, EXTCON_CHG_USB_CDP, EXTCON_CHG_USB_DCP };
...@@ -807,11 +809,15 @@ static int axp288_charger_probe(struct platform_device *pdev) ...@@ -807,11 +809,15 @@ static int axp288_charger_probe(struct platform_device *pdev)
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
info->otg.cable = extcon_get_extcon_dev(USB_HOST_EXTCON_DEV_NAME); if (acpi_dev_present(USB_HOST_EXTCON_HID, NULL, -1)) {
info->otg.cable = extcon_get_extcon_dev(USB_HOST_EXTCON_NAME);
if (info->otg.cable == NULL) { if (info->otg.cable == NULL) {
dev_dbg(dev, "EXTCON_USB_HOST is not ready, probe deferred\n"); dev_dbg(dev, "EXTCON_USB_HOST is not ready, probe deferred\n");
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
dev_info(&pdev->dev,
"Using " USB_HOST_EXTCON_HID " extcon for usb-id\n");
}
platform_set_drvdata(pdev, info); platform_set_drvdata(pdev, info);
mutex_init(&info->lock); mutex_init(&info->lock);
...@@ -849,6 +855,7 @@ static int axp288_charger_probe(struct platform_device *pdev) ...@@ -849,6 +855,7 @@ static int axp288_charger_probe(struct platform_device *pdev)
/* Register for OTG notification */ /* Register for OTG notification */
INIT_WORK(&info->otg.work, axp288_charger_otg_evt_worker); INIT_WORK(&info->otg.work, axp288_charger_otg_evt_worker);
info->otg.id_nb.notifier_call = axp288_charger_handle_otg_evt; info->otg.id_nb.notifier_call = axp288_charger_handle_otg_evt;
if (info->otg.cable) {
ret = devm_extcon_register_notifier(&pdev->dev, info->otg.cable, ret = devm_extcon_register_notifier(&pdev->dev, info->otg.cable,
EXTCON_USB_HOST, &info->otg.id_nb); EXTCON_USB_HOST, &info->otg.id_nb);
if (ret) { if (ret) {
...@@ -856,6 +863,7 @@ static int axp288_charger_probe(struct platform_device *pdev) ...@@ -856,6 +863,7 @@ static int axp288_charger_probe(struct platform_device *pdev)
return ret; return ret;
} }
schedule_work(&info->otg.work); schedule_work(&info->otg.work);
}
/* Register charger interrupts */ /* Register charger interrupts */
for (i = 0; i < CHRG_INTR_END; i++) { for (i = 0; i < CHRG_INTR_END; i++) {
......
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