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

Commit da912545 authored by Ankit Sharma's avatar Ankit Sharma Committed by Ashay Jaiswal
Browse files

power: smb138x-charger: Add support of extcon based notifications



Add extcon support in charger driver which is used to notify cable
state(device/host mode, CC orientation) to USB driver.

CRs-Fixed: 2086422
Change-Id: I68448059c4ef2089881623f074dc1b578fb36f3d
Signed-off-by: default avatarAnkit Sharma <ansharma@codeaurora.org>
parent de321e13
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -43,6 +43,13 @@ Charger specific properties:
  Definition: Boolean flag which indicates that the charger should not draw
	      current from any of its input sources (USB, DC).

- qcom,use-extcon
  Usage:      optional
  Value type: <empty>
  Definition: Boolean flag which specify that smb138x will act as main charger
	      to do extcon USB calls. If not defined, other charger driver can
	      act as main charger to do extcon USB calls.

- qcom,fcc-max-ua
  Usage:      optional
  Value type: <u32>
+51 −8
Original line number Diff line number Diff line
@@ -170,6 +170,9 @@ static int smb138x_parse_dt(struct smb138x *chip)
	chip->dt.suspend_input = of_property_read_bool(node,
				"qcom,suspend-input");

	chg->use_extcon = of_property_read_bool(node,
				"qcom,use-extcon");

	rc = of_property_read_u32(node,
				"qcom,fcc-max-ua", &chip->dt.fcc_ua);
	if (rc < 0)
@@ -1405,55 +1408,95 @@ static int smb138x_master_probe(struct smb138x *chip)
	rc = smb138x_parse_dt(chip);
	if (rc < 0) {
		pr_err("Couldn't parse device tree rc=%d\n", rc);
		return rc;
		goto cleanup;
	}

	rc = smb138x_init_vbus_regulator(chip);
	if (rc < 0) {
		pr_err("Couldn't initialize vbus regulator rc=%d\n",
			rc);
		return rc;
		goto cleanup;
	}

	rc = smb138x_init_vconn_regulator(chip);
	if (rc < 0) {
		pr_err("Couldn't initialize vconn regulator rc=%d\n",
			rc);
		return rc;
		goto cleanup;
	}

	if (chg->use_extcon) {
		/* extcon registration */
		chg->extcon = devm_extcon_dev_allocate(chg->dev,
							smblib_extcon_cable);
		if (IS_ERR(chg->extcon)) {
			rc = PTR_ERR(chg->extcon);
			dev_err(chg->dev, "failed to allocate extcon device rc=%d\n",
					rc);
			goto cleanup;
		}

		chg->extcon->mutually_exclusive = smblib_extcon_exclusive;
		rc = devm_extcon_dev_register(chg->dev, chg->extcon);
		if (rc < 0) {
			dev_err(chg->dev, "failed to register extcon device rc=%d\n",
						rc);
			goto cleanup;
		}

		/* Support reporting polarity and speed via properties */
		rc = extcon_set_property_capability(chg->extcon,
				EXTCON_USB, EXTCON_PROP_USB_TYPEC_POLARITY);
		rc |= extcon_set_property_capability(chg->extcon,
				EXTCON_USB, EXTCON_PROP_USB_SS);
		rc |= extcon_set_property_capability(chg->extcon,
				EXTCON_USB_HOST,
				EXTCON_PROP_USB_TYPEC_POLARITY);
		rc |= extcon_set_property_capability(chg->extcon,
				EXTCON_USB_HOST, EXTCON_PROP_USB_SS);
		if (rc < 0) {
			dev_err(chg->dev,
				"failed to configure extcon capabilities\n");
			goto cleanup;
		}
	}

	rc = smb138x_init_usb_psy(chip);
	if (rc < 0) {
		pr_err("Couldn't initialize usb psy rc=%d\n", rc);
		return rc;
		goto cleanup;
	}

	rc = smb138x_init_batt_psy(chip);
	if (rc < 0) {
		pr_err("Couldn't initialize batt psy rc=%d\n", rc);
		return rc;
		goto cleanup;
	}

	rc = smb138x_init_hw(chip);
	if (rc < 0) {
		pr_err("Couldn't initialize hardware rc=%d\n", rc);
		return rc;
		goto cleanup;
	}

	rc = smb138x_determine_initial_status(chip);
	if (rc < 0) {
		pr_err("Couldn't determine initial status rc=%d\n",
			rc);
		return rc;
		goto cleanup;
	}

	rc = smb138x_request_interrupts(chip);
	if (rc < 0) {
		pr_err("Couldn't request interrupts rc=%d\n", rc);
		return rc;
		goto cleanup;
	}

	return rc;

cleanup:
	smblib_deinit(chg);
	return rc;
}

static int smb138x_slave_probe(struct smb138x *chip)