usb: chipidea: Add dynamic pinctrl selection
Some hardware implementations require to configure pins differently according to the USB role (host/device), this can be an update of the pins routing or a simple GPIO value change. This patch introduces new optional "host" and "device" pinctrls. If these pinctrls are defined by the device, they are respectively selected on host/device role start. If a default pinctrl exist, it is restored on host/device role stop. Signed-off-by: Loic Poulain <loic.poulain@linaro.org> Signed-off-by: Peter Chen <peter.chen@nxp.com>
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
#include <linux/usb/hcd.h>
|
||||
#include <linux/usb/chipidea.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
|
||||
#include "../host/ehci.h"
|
||||
|
||||
@@ -153,6 +154,10 @@ static int host_start(struct ci_hdrc *ci)
|
||||
}
|
||||
}
|
||||
|
||||
if (ci->platdata->pins_host)
|
||||
pinctrl_select_state(ci->platdata->pctl,
|
||||
ci->platdata->pins_host);
|
||||
|
||||
ret = usb_add_hcd(hcd, 0, 0);
|
||||
if (ret) {
|
||||
goto disable_reg;
|
||||
@@ -197,6 +202,10 @@ static void host_stop(struct ci_hdrc *ci)
|
||||
}
|
||||
ci->hcd = NULL;
|
||||
ci->otg.host = NULL;
|
||||
|
||||
if (ci->platdata->pins_host && ci->platdata->pins_default)
|
||||
pinctrl_select_state(ci->platdata->pctl,
|
||||
ci->platdata->pins_default);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user