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

Commit a9138192 authored by Igor Grinberg's avatar Igor Grinberg Committed by Greg Kroah-Hartman
Browse files

USB: otg/ulpi: improve ulpi phy detection.



Improve ulpi phy detection by utilizing the "scratch" register.
Allow unknown ulpi phy work without the need to hard-code the id.

Signed-off-by: default avatarIgor Grinberg <grinberg@compulab.co.il>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent c6f694af
Loading
Loading
Loading
Loading
+32 −3
Original line number Diff line number Diff line
@@ -137,6 +137,32 @@ static int ulpi_set_flags(struct otg_transceiver *otg)
	return ulpi_set_fc_flags(otg);
}

static int ulpi_check_integrity(struct otg_transceiver *otg)
{
	int ret, i;
	unsigned int val = 0x55;

	for (i = 0; i < 2; i++) {
		ret = otg_io_write(otg, val, ULPI_SCRATCH);
		if (ret < 0)
			return ret;

		ret = otg_io_read(otg, ULPI_SCRATCH);
		if (ret < 0)
			return ret;

		if (ret != val) {
			pr_err("ULPI integrity check: failed!");
			return -ENODEV;
		}
		val = val << 1;
	}

	pr_info("ULPI integrity check: passed.\n");

	return 0;
}

static int ulpi_init(struct otg_transceiver *otg)
{
	int i, vid, pid, ret;
@@ -155,10 +181,13 @@ static int ulpi_init(struct otg_transceiver *otg)

	for (i = 0; i < ARRAY_SIZE(ulpi_ids); i++)
		if (ulpi_ids[i] == ULPI_ID(vid, pid))
			return ulpi_set_flags(otg);
			break;

	pr_err("ULPI ID does not match any known transceiver.\n");
	return -ENODEV;
	ret = ulpi_check_integrity(otg);
	if (ret)
		return ret;

	return ulpi_set_flags(otg);
}

static int ulpi_set_host(struct otg_transceiver *otg, struct usb_bus *host)