diff options
Diffstat (limited to 'drivers/usb/chipidea/ci_hdrc_imx.c')
| -rw-r--r-- | drivers/usb/chipidea/ci_hdrc_imx.c | 55 | 
1 files changed, 32 insertions, 23 deletions
diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c index 74d998d9b45..2e58f8dfd31 100644 --- a/drivers/usb/chipidea/ci_hdrc_imx.c +++ b/drivers/usb/chipidea/ci_hdrc_imx.c @@ -23,6 +23,26 @@  #include "ci.h"  #include "ci_hdrc_imx.h" +#define CI_HDRC_IMX_IMX28_WRITE_FIX BIT(0) + +struct ci_hdrc_imx_platform_flag { +	unsigned int flags; +}; + +static const struct ci_hdrc_imx_platform_flag imx27_usb_data = { +}; + +static const struct ci_hdrc_imx_platform_flag imx28_usb_data = { +	.flags = CI_HDRC_IMX_IMX28_WRITE_FIX, +}; + +static const struct of_device_id ci_hdrc_imx_dt_ids[] = { +	{ .compatible = "fsl,imx28-usb", .data = &imx28_usb_data}, +	{ .compatible = "fsl,imx27-usb", .data = &imx27_usb_data}, +	{ /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, ci_hdrc_imx_dt_ids); +  struct ci_hdrc_imx_data {  	struct usb_phy *phy;  	struct platform_device *ci_pdev; @@ -76,12 +96,15 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)  {  	struct ci_hdrc_imx_data *data;  	struct ci_hdrc_platform_data pdata = { -		.name		= "ci_hdrc_imx", +		.name		= dev_name(&pdev->dev),  		.capoffset	= DEF_CAPOFFSET,  		.flags		= CI_HDRC_REQUIRE_TRANSCEIVER |  				  CI_HDRC_DISABLE_STREAMING,  	};  	int ret; +	const struct of_device_id *of_id = +			of_match_device(ci_hdrc_imx_dt_ids, &pdev->dev); +	const struct ci_hdrc_imx_platform_flag *imx_platform_flag = of_id->data;  	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);  	if (!data) { @@ -108,23 +131,19 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)  	}  	data->phy = devm_usb_get_phy_by_phandle(&pdev->dev, "fsl,usbphy", 0); -	if (!IS_ERR(data->phy)) { -		ret = usb_phy_init(data->phy); -		if (ret) { -			dev_err(&pdev->dev, "unable to init phy: %d\n", ret); -			goto err_clk; -		} -	} else if (PTR_ERR(data->phy) == -EPROBE_DEFER) { -		ret = -EPROBE_DEFER; +	if (IS_ERR(data->phy)) { +		ret = PTR_ERR(data->phy);  		goto err_clk;  	}  	pdata.phy = data->phy; -	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); +	if (imx_platform_flag->flags & CI_HDRC_IMX_IMX28_WRITE_FIX) +		pdata.flags |= CI_HDRC_IMX28_WRITE_FIX; + +	ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); +	if (ret) +		goto err_clk;  	if (data->usbmisc_data) {  		ret = imx_usbmisc_init(data->usbmisc_data); @@ -175,21 +194,11 @@ static int ci_hdrc_imx_remove(struct platform_device *pdev)  	pm_runtime_disable(&pdev->dev);  	ci_hdrc_remove_device(data->ci_pdev); - -	if (data->phy) -		usb_phy_shutdown(data->phy); -  	clk_disable_unprepare(data->clk);  	return 0;  } -static const struct of_device_id ci_hdrc_imx_dt_ids[] = { -	{ .compatible = "fsl,imx27-usb", }, -	{ /* sentinel */ } -}; -MODULE_DEVICE_TABLE(of, ci_hdrc_imx_dt_ids); -  static struct platform_driver ci_hdrc_imx_driver = {  	.probe = ci_hdrc_imx_probe,  	.remove = ci_hdrc_imx_remove,  | 
