usb: chipidea: move vbus regulator operation to core
The vbus regulator is a common element for USB vbus operation, So, move it from glue layer to core. Tested-by: Marek Vasut <marex@denx.de> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> Signed-off-by: Peter Chen <peter.chen@freescale.com> Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
6a6243b164
Коммит
1542d9c35d
|
@ -19,7 +19,6 @@
|
|||
#include <linux/dma-mapping.h>
|
||||
#include <linux/usb/chipidea.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#include "ci.h"
|
||||
#include "ci_hdrc_imx.h"
|
||||
|
@ -28,7 +27,6 @@ struct ci_hdrc_imx_data {
|
|||
struct usb_phy *phy;
|
||||
struct platform_device *ci_pdev;
|
||||
struct clk *clk;
|
||||
struct regulator *reg_vbus;
|
||||
};
|
||||
|
||||
static const struct usbmisc_ops *usbmisc_ops;
|
||||
|
@ -131,20 +129,6 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
|
|||
goto err_clk;
|
||||
}
|
||||
|
||||
/* we only support host now, so enable vbus here */
|
||||
data->reg_vbus = devm_regulator_get(&pdev->dev, "vbus");
|
||||
if (!IS_ERR(data->reg_vbus)) {
|
||||
ret = regulator_enable(data->reg_vbus);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"Failed to enable vbus regulator, err=%d\n",
|
||||
ret);
|
||||
goto err_clk;
|
||||
}
|
||||
} else {
|
||||
data->reg_vbus = NULL;
|
||||
}
|
||||
|
||||
pdata.phy = data->phy;
|
||||
|
||||
if (!pdev->dev.dma_mask)
|
||||
|
@ -157,7 +141,7 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"usbmisc init failed, ret=%d\n", ret);
|
||||
goto err;
|
||||
goto err_clk;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -169,7 +153,7 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
|
|||
dev_err(&pdev->dev,
|
||||
"Can't register ci_hdrc platform device, err=%d\n",
|
||||
ret);
|
||||
goto err;
|
||||
goto err_clk;
|
||||
}
|
||||
|
||||
if (usbmisc_ops && usbmisc_ops->post) {
|
||||
|
@ -190,9 +174,6 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
|
|||
|
||||
disable_device:
|
||||
ci_hdrc_remove_device(data->ci_pdev);
|
||||
err:
|
||||
if (data->reg_vbus)
|
||||
regulator_disable(data->reg_vbus);
|
||||
err_clk:
|
||||
clk_disable_unprepare(data->clk);
|
||||
return ret;
|
||||
|
@ -205,9 +186,6 @@ static int ci_hdrc_imx_remove(struct platform_device *pdev)
|
|||
pm_runtime_disable(&pdev->dev);
|
||||
ci_hdrc_remove_device(data->ci_pdev);
|
||||
|
||||
if (data->reg_vbus)
|
||||
regulator_disable(data->reg_vbus);
|
||||
|
||||
if (data->phy)
|
||||
usb_phy_shutdown(data->phy);
|
||||
|
||||
|
|
|
@ -65,6 +65,7 @@
|
|||
#include <linux/usb/chipidea.h>
|
||||
#include <linux/usb/of.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#include "ci.h"
|
||||
#include "udc.h"
|
||||
|
@ -342,6 +343,24 @@ static irqreturn_t ci_irq(int irq, void *data)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int ci_get_platdata(struct device *dev,
|
||||
struct ci_hdrc_platform_data *platdata)
|
||||
{
|
||||
/* Get the vbus regulator */
|
||||
platdata->reg_vbus = devm_regulator_get(dev, "vbus");
|
||||
if (PTR_ERR(platdata->reg_vbus) == -EPROBE_DEFER) {
|
||||
return -EPROBE_DEFER;
|
||||
} else if (PTR_ERR(platdata->reg_vbus) == -ENODEV) {
|
||||
platdata->reg_vbus = NULL; /* no vbus regualator is needed */
|
||||
} else if (IS_ERR(platdata->reg_vbus)) {
|
||||
dev_err(dev, "Getting regulator error: %ld\n",
|
||||
PTR_ERR(platdata->reg_vbus));
|
||||
return PTR_ERR(platdata->reg_vbus);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static DEFINE_IDA(ci_ida);
|
||||
|
||||
struct platform_device *ci_hdrc_add_device(struct device *dev,
|
||||
|
@ -351,6 +370,10 @@ struct platform_device *ci_hdrc_add_device(struct device *dev,
|
|||
struct platform_device *pdev;
|
||||
int id, ret;
|
||||
|
||||
ret = ci_get_platdata(dev, platdata);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
id = ida_simple_get(&ci_ida, 0, 0, GFP_KERNEL);
|
||||
if (id < 0)
|
||||
return ERR_PTR(id);
|
||||
|
|
|
@ -24,6 +24,7 @@ struct ci_hdrc_platform_data {
|
|||
#define CI_HDRC_CONTROLLER_RESET_EVENT 0
|
||||
#define CI_HDRC_CONTROLLER_STOPPED_EVENT 1
|
||||
void (*notify_event) (struct ci_hdrc *ci, unsigned event);
|
||||
struct regulator *reg_vbus;
|
||||
};
|
||||
|
||||
/* Default offset of capability registers */
|
||||
|
|
Загрузка…
Ссылка в новой задаче