Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c0a0a29 authored by Hans de Goede's avatar Hans de Goede Committed by Sebastian Reichel
Browse files

power: supply: axp288_charger: Simplify extcon cable handling



Simplify extcon cable handling using the new
devm_extcon_register_notifier_all function to listen to all cables
in one go.

Reviewed-by: default avatarChen-Yu Tsai <wens@csie.org>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.co.uk>
parent 81d56dd3
Loading
Loading
Loading
Loading
+10 −41
Original line number Diff line number Diff line
@@ -103,9 +103,6 @@
#define USB_HOST_EXTCON_HID		"INT3496"
#define USB_HOST_EXTCON_NAME		"INT3496:00"

static const unsigned int cable_ids[] =
	{ EXTCON_CHG_USB_SDP, EXTCON_CHG_USB_CDP, EXTCON_CHG_USB_DCP };

enum {
	VBUS_OV_IRQ = 0,
	CHARGE_DONE_IRQ,
@@ -137,7 +134,7 @@ struct axp288_chrg_info {
	/* SDP/CDP/DCP USB charging cable notifications */
	struct {
		struct extcon_dev *edev;
		struct notifier_block nb[ARRAY_SIZE(cable_ids)];
		struct notifier_block nb;
		struct work_struct work;
	} cable;

@@ -595,34 +592,11 @@ static void axp288_charger_extcon_evt_worker(struct work_struct *work)
	power_supply_changed(info->psy_usb);
}

/*
 * We need 3 copies of this, because there is no way to find out for which
 * cable id we are being called from the passed in arguments; and we must
 * have a separate nb for each extcon_register_notifier call.
 */
static int axp288_charger_handle_cable0_evt(struct notifier_block *nb,
					    unsigned long event, void *param)
{
	struct axp288_chrg_info *info =
		container_of(nb, struct axp288_chrg_info, cable.nb[0]);
	schedule_work(&info->cable.work);
	return NOTIFY_OK;
}

static int axp288_charger_handle_cable1_evt(struct notifier_block *nb,
static int axp288_charger_handle_cable_evt(struct notifier_block *nb,
					   unsigned long event, void *param)
{
	struct axp288_chrg_info *info =
		container_of(nb, struct axp288_chrg_info, cable.nb[1]);
	schedule_work(&info->cable.work);
	return NOTIFY_OK;
}

static int axp288_charger_handle_cable2_evt(struct notifier_block *nb,
					    unsigned long event, void *param)
{
	struct axp288_chrg_info *info =
		container_of(nb, struct axp288_chrg_info, cable.nb[2]);
		container_of(nb, struct axp288_chrg_info, cable.nb);
	schedule_work(&info->cable.work);
	return NOTIFY_OK;
}
@@ -800,18 +774,13 @@ static int axp288_charger_probe(struct platform_device *pdev)

	/* Register for extcon notification */
	INIT_WORK(&info->cable.work, axp288_charger_extcon_evt_worker);
	info->cable.nb[0].notifier_call = axp288_charger_handle_cable0_evt;
	info->cable.nb[1].notifier_call = axp288_charger_handle_cable1_evt;
	info->cable.nb[2].notifier_call = axp288_charger_handle_cable2_evt;
	for (i = 0; i < ARRAY_SIZE(cable_ids); i++) {
		ret = devm_extcon_register_notifier(dev, info->cable.edev,
					  cable_ids[i], &info->cable.nb[i]);
	info->cable.nb.notifier_call = axp288_charger_handle_cable_evt;
	ret = devm_extcon_register_notifier_all(dev, info->cable.edev,
						&info->cable.nb);
	if (ret) {
			dev_err(dev, "failed to register extcon notifier for %u: %d\n",
				cable_ids[i], ret);
		dev_err(dev, "failed to register cable extcon notifier\n");
		return ret;
	}
	}
	schedule_work(&info->cable.work);

	/* Register for OTG notification */