usb: ehci-mx6: handle vbus-supply
Drop board_ehci_power when dm usb used and switch to use regulator api to handle vbus. Signed-off-by: Peng Fan <peng.fan@nxp.com> Cc: Marek Vasut <marex@denx.de> Cc: Simon Glass <sjg@chromium.org> Cc: Stefano Babic <sbabic@denx.de>
This commit is contained in:
		
							parent
							
								
									cccbddc38c
								
							
						
					
					
						commit
						fcf9f9f97a
					
				|  | @ -17,6 +17,7 @@ | ||||||
| #include <asm/imx-common/iomux-v3.h> | #include <asm/imx-common/iomux-v3.h> | ||||||
| #include <asm/imx-common/sys_proto.h> | #include <asm/imx-common/sys_proto.h> | ||||||
| #include <dm.h> | #include <dm.h> | ||||||
|  | #include <power/regulator.h> | ||||||
| 
 | 
 | ||||||
| #include "ehci.h" | #include "ehci.h" | ||||||
| 
 | 
 | ||||||
|  | @ -388,6 +389,7 @@ int ehci_hcd_stop(int index) | ||||||
| struct ehci_mx6_priv_data { | struct ehci_mx6_priv_data { | ||||||
| 	struct ehci_ctrl ctrl; | 	struct ehci_ctrl ctrl; | ||||||
| 	struct usb_ehci *ehci; | 	struct usb_ehci *ehci; | ||||||
|  | 	struct udevice *vbus_supply; | ||||||
| 	enum usb_init_type init_type; | 	enum usb_init_type init_type; | ||||||
| 	int portnr; | 	int portnr; | ||||||
| }; | }; | ||||||
|  | @ -403,7 +405,15 @@ static int mx6_init_after_reset(struct ehci_ctrl *dev) | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
| 	board_ehci_power(priv->portnr, (type == USB_INIT_DEVICE) ? 0 : 1); | 	if (priv->vbus_supply) { | ||||||
|  | 		ret = regulator_set_enable(priv->vbus_supply, | ||||||
|  | 					   (type == USB_INIT_DEVICE) ? | ||||||
|  | 					   false : true); | ||||||
|  | 		if (ret) { | ||||||
|  | 			puts("Error enabling VBUS supply\n"); | ||||||
|  | 			return ret; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if (type == USB_INIT_DEVICE) | 	if (type == USB_INIT_DEVICE) | ||||||
| 		return 0; | 		return 0; | ||||||
|  | @ -496,19 +506,33 @@ static int ehci_usb_probe(struct udevice *dev) | ||||||
| 	struct usb_platdata *plat = dev_get_platdata(dev); | 	struct usb_platdata *plat = dev_get_platdata(dev); | ||||||
| 	struct usb_ehci *ehci = (struct usb_ehci *)dev_get_addr(dev); | 	struct usb_ehci *ehci = (struct usb_ehci *)dev_get_addr(dev); | ||||||
| 	struct ehci_mx6_priv_data *priv = dev_get_priv(dev); | 	struct ehci_mx6_priv_data *priv = dev_get_priv(dev); | ||||||
|  | 	enum usb_init_type type = plat->init_type; | ||||||
| 	struct ehci_hccr *hccr; | 	struct ehci_hccr *hccr; | ||||||
| 	struct ehci_hcor *hcor; | 	struct ehci_hcor *hcor; | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	priv->ehci = ehci; | 	priv->ehci = ehci; | ||||||
| 	priv->portnr = dev->seq; | 	priv->portnr = dev->seq; | ||||||
| 	priv->init_type = plat->init_type; | 	priv->init_type = type; | ||||||
|  | 
 | ||||||
|  | 	ret = device_get_supply_regulator(dev, "vbus-supply", | ||||||
|  | 					  &priv->vbus_supply); | ||||||
|  | 	if (ret) | ||||||
|  | 		debug("%s: No vbus supply\n", dev->name); | ||||||
| 
 | 
 | ||||||
| 	ret = ehci_mx6_common_init(ehci, priv->portnr); | 	ret = ehci_mx6_common_init(ehci, priv->portnr); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
| 	board_ehci_power(priv->portnr, (priv->init_type == USB_INIT_DEVICE) ? 0 : 1); | 	if (priv->vbus_supply) { | ||||||
|  | 		ret = regulator_set_enable(priv->vbus_supply, | ||||||
|  | 					   (type == USB_INIT_DEVICE) ? | ||||||
|  | 					   false : true); | ||||||
|  | 		if (ret) { | ||||||
|  | 			puts("Error enabling VBUS supply\n"); | ||||||
|  | 			return ret; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if (priv->init_type == USB_INIT_HOST) { | 	if (priv->init_type == USB_INIT_HOST) { | ||||||
| 		setbits_le32(&ehci->usbmode, CM_HOST); | 		setbits_le32(&ehci->usbmode, CM_HOST); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue