forked from mirrors/linux
		
	usb: core: comply to PHY framework
Current implementation of the USB core does not take into account the new PHY framework. Correct the situation by adding a call to phy_set_mode() before phy_power_on(). Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									c9381e185f
								
							
						
					
					
						commit
						b97a313483
					
				
					 3 changed files with 35 additions and 0 deletions
				
			
		| 
						 | 
					@ -2736,6 +2736,11 @@ int usb_add_hcd(struct usb_hcd *hcd,
 | 
				
			||||||
		if (retval)
 | 
							if (retval)
 | 
				
			||||||
			return retval;
 | 
								return retval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							retval = usb_phy_roothub_set_mode(hcd->phy_roothub,
 | 
				
			||||||
 | 
											  PHY_MODE_USB_HOST_SS);
 | 
				
			||||||
 | 
							if (retval)
 | 
				
			||||||
 | 
								goto err_usb_phy_roothub_power_on;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		retval = usb_phy_roothub_power_on(hcd->phy_roothub);
 | 
							retval = usb_phy_roothub_power_on(hcd->phy_roothub);
 | 
				
			||||||
		if (retval)
 | 
							if (retval)
 | 
				
			||||||
			goto err_usb_phy_roothub_power_on;
 | 
								goto err_usb_phy_roothub_power_on;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -123,6 +123,34 @@ int usb_phy_roothub_exit(struct usb_phy_roothub *phy_roothub)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(usb_phy_roothub_exit);
 | 
					EXPORT_SYMBOL_GPL(usb_phy_roothub_exit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int usb_phy_roothub_set_mode(struct usb_phy_roothub *phy_roothub,
 | 
				
			||||||
 | 
								     enum phy_mode mode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct usb_phy_roothub *roothub_entry;
 | 
				
			||||||
 | 
						struct list_head *head;
 | 
				
			||||||
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!phy_roothub)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						head = &phy_roothub->list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						list_for_each_entry(roothub_entry, head, list) {
 | 
				
			||||||
 | 
							err = phy_set_mode(roothub_entry->phy, mode);
 | 
				
			||||||
 | 
							if (err)
 | 
				
			||||||
 | 
								goto err_out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					err_out:
 | 
				
			||||||
 | 
						list_for_each_entry_continue_reverse(roothub_entry, head, list)
 | 
				
			||||||
 | 
							phy_power_off(roothub_entry->phy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return err;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL_GPL(usb_phy_roothub_set_mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int usb_phy_roothub_power_on(struct usb_phy_roothub *phy_roothub)
 | 
					int usb_phy_roothub_power_on(struct usb_phy_roothub *phy_roothub)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct usb_phy_roothub *roothub_entry;
 | 
						struct usb_phy_roothub *roothub_entry;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,8 @@ struct usb_phy_roothub *usb_phy_roothub_alloc(struct device *dev);
 | 
				
			||||||
int usb_phy_roothub_init(struct usb_phy_roothub *phy_roothub);
 | 
					int usb_phy_roothub_init(struct usb_phy_roothub *phy_roothub);
 | 
				
			||||||
int usb_phy_roothub_exit(struct usb_phy_roothub *phy_roothub);
 | 
					int usb_phy_roothub_exit(struct usb_phy_roothub *phy_roothub);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int usb_phy_roothub_set_mode(struct usb_phy_roothub *phy_roothub,
 | 
				
			||||||
 | 
								     enum phy_mode mode);
 | 
				
			||||||
int usb_phy_roothub_power_on(struct usb_phy_roothub *phy_roothub);
 | 
					int usb_phy_roothub_power_on(struct usb_phy_roothub *phy_roothub);
 | 
				
			||||||
void usb_phy_roothub_power_off(struct usb_phy_roothub *phy_roothub);
 | 
					void usb_phy_roothub_power_off(struct usb_phy_roothub *phy_roothub);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue