diff options
Diffstat (limited to 'drivers/usb/host/ehci-atmel.c')
| -rw-r--r-- | drivers/usb/host/ehci-atmel.c | 24 | 
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c index 3b645ff46f7..ec9f7b75d49 100644 --- a/drivers/usb/host/ehci-atmel.c +++ b/drivers/usb/host/ehci-atmel.c @@ -30,13 +30,17 @@ static const char hcd_name[] = "ehci-atmel";  static struct hc_driver __read_mostly ehci_atmel_hc_driver;  /* interface and function clocks */ -static struct clk *iclk, *fclk; +static struct clk *iclk, *fclk, *uclk;  static int clocked;  /*-------------------------------------------------------------------------*/  static void atmel_start_clock(void)  { +	if (IS_ENABLED(CONFIG_COMMON_CLK)) { +		clk_set_rate(uclk, 48000000); +		clk_prepare_enable(uclk); +	}  	clk_prepare_enable(iclk);  	clk_prepare_enable(fclk);  	clocked = 1; @@ -46,6 +50,8 @@ static void atmel_stop_clock(void)  {  	clk_disable_unprepare(fclk);  	clk_disable_unprepare(iclk); +	if (IS_ENABLED(CONFIG_COMMON_CLK)) +		clk_disable_unprepare(uclk);  	clocked = 0;  } @@ -90,10 +96,9 @@ static int ehci_atmel_drv_probe(struct platform_device *pdev)  	 * Since shared usb code relies on it, set it here for now.  	 * Once we have dma capability bindings this can go away.  	 */ -	if (!pdev->dev.dma_mask) -		pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask; -	if (!pdev->dev.coherent_dma_mask) -		pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); +	retval = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); +	if (retval) +		goto fail_create_hcd;  	hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev));  	if (!hcd) { @@ -130,6 +135,14 @@ static int ehci_atmel_drv_probe(struct platform_device *pdev)  		retval = -ENOENT;  		goto fail_request_resource;  	} +	if (IS_ENABLED(CONFIG_COMMON_CLK)) { +		uclk = devm_clk_get(&pdev->dev, "usb_clk"); +		if (IS_ERR(uclk)) { +			dev_err(&pdev->dev, "failed to get uclk\n"); +			retval = PTR_ERR(uclk); +			goto fail_request_resource; +		} +	}  	ehci = hcd_to_ehci(hcd);  	/* registers start at offset 0x0 */ @@ -140,6 +153,7 @@ static int ehci_atmel_drv_probe(struct platform_device *pdev)  	retval = usb_add_hcd(hcd, irq, IRQF_SHARED);  	if (retval)  		goto fail_add_hcd; +	device_wakeup_enable(hcd->self.controller);  	return retval;  | 
