提交 a9138192 编写于 作者: I Igor Grinberg 提交者: Greg Kroah-Hartman

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: NIgor Grinberg <grinberg@compulab.co.il>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 c6f694af
......@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册