usb: chipidea: fix no transceiver case
Since usb phy code does return ERR_PTR() values, make sure that we don't
end up dereferencing them. This is a problem, for example, on platforms
that don't register a phy for chipidea since b7fa5c2a ("usb: phy: return
-ENXIO when PHY layer isn't enabled").
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									2d8f4447b5
								
							
						
					
					
						commit
						d343f4e8d6
					
				| @ -1678,8 +1678,11 @@ static int udc_start(struct ci13xxx *ci) | ||||
| 
 | ||||
| 	ci->gadget.ep0 = &ci->ep0in->ep; | ||||
| 
 | ||||
| 	if (ci->global_phy) | ||||
| 	if (ci->global_phy) { | ||||
| 		ci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2); | ||||
| 		if (IS_ERR(ci->transceiver)) | ||||
| 			ci->transceiver = NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) { | ||||
| 		if (ci->transceiver == NULL) { | ||||
| @ -1694,7 +1697,7 @@ static int udc_start(struct ci13xxx *ci) | ||||
| 			goto put_transceiver; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!IS_ERR_OR_NULL(ci->transceiver)) { | ||||
| 	if (ci->transceiver) { | ||||
| 		retval = otg_set_peripheral(ci->transceiver->otg, | ||||
| 						&ci->gadget); | ||||
| 		if (retval) | ||||
| @ -1711,7 +1714,7 @@ static int udc_start(struct ci13xxx *ci) | ||||
| 	return retval; | ||||
| 
 | ||||
| remove_trans: | ||||
| 	if (!IS_ERR_OR_NULL(ci->transceiver)) { | ||||
| 	if (ci->transceiver) { | ||||
| 		otg_set_peripheral(ci->transceiver->otg, NULL); | ||||
| 		if (ci->global_phy) | ||||
| 			usb_put_phy(ci->transceiver); | ||||
| @ -1719,7 +1722,7 @@ remove_trans: | ||||
| 
 | ||||
| 	dev_err(dev, "error = %i\n", retval); | ||||
| put_transceiver: | ||||
| 	if (!IS_ERR_OR_NULL(ci->transceiver) && ci->global_phy) | ||||
| 	if (ci->transceiver && ci->global_phy) | ||||
| 		usb_put_phy(ci->transceiver); | ||||
| destroy_eps: | ||||
| 	destroy_eps(ci); | ||||
| @ -1747,7 +1750,7 @@ static void udc_stop(struct ci13xxx *ci) | ||||
| 	dma_pool_destroy(ci->td_pool); | ||||
| 	dma_pool_destroy(ci->qh_pool); | ||||
| 
 | ||||
| 	if (!IS_ERR_OR_NULL(ci->transceiver)) { | ||||
| 	if (ci->transceiver) { | ||||
| 		otg_set_peripheral(ci->transceiver->otg, NULL); | ||||
| 		if (ci->global_phy) | ||||
| 			usb_put_phy(ci->transceiver); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user