提交 fc9a731e 编写于 作者: L Lukasz Majewski 提交者: Felipe Balbi

usb:hsotg:samsung: Use of regulator_bulk_* functions for USB regulators

This commit adds support for supply voltage management for s3c-hsotg IP
block. For that purpose a convenient regulator_bulk_* functions have been
used.
Signed-off-by: NLukasz Majewski <l.majewski@samsung.com>
Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>
Cc: Liam Girdwood <lrg@ti.com>
Signed-off-by: NFelipe Balbi <balbi@ti.com>
上级 41188786
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/regulator/consumer.h>
#include <linux/usb/ch9.h> #include <linux/usb/ch9.h>
#include <linux/usb/gadget.h> #include <linux/usb/gadget.h>
...@@ -38,6 +39,11 @@ ...@@ -38,6 +39,11 @@
#define DMA_ADDR_INVALID (~((dma_addr_t)0)) #define DMA_ADDR_INVALID (~((dma_addr_t)0))
static const char * const s3c_hsotg_supply_names[] = {
"vusb_d", /* digital USB supply, 1.2V */
"vusb_a", /* analog USB supply, 1.1V */
};
/* EP0_MPS_LIMIT /* EP0_MPS_LIMIT
* *
* Unfortunately there seems to be a limit of the amount of data that can * Unfortunately there seems to be a limit of the amount of data that can
...@@ -132,6 +138,7 @@ struct s3c_hsotg_ep { ...@@ -132,6 +138,7 @@ struct s3c_hsotg_ep {
* @regs: The memory area mapped for accessing registers. * @regs: The memory area mapped for accessing registers.
* @regs_res: The resource that was allocated when claiming register space. * @regs_res: The resource that was allocated when claiming register space.
* @irq: The IRQ number we are using * @irq: The IRQ number we are using
* @supplies: Definition of USB power supplies
* @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos. * @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos.
* @debug_root: root directrory for debugfs. * @debug_root: root directrory for debugfs.
* @debug_file: main status file for debugfs. * @debug_file: main status file for debugfs.
...@@ -152,6 +159,8 @@ struct s3c_hsotg { ...@@ -152,6 +159,8 @@ struct s3c_hsotg {
int irq; int irq;
struct clk *clk; struct clk *clk;
struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)];
unsigned int dedicated_fifos:1; unsigned int dedicated_fifos:1;
struct dentry *debug_root; struct dentry *debug_root;
...@@ -3256,6 +3265,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) ...@@ -3256,6 +3265,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
struct resource *res; struct resource *res;
int epnum; int epnum;
int ret; int ret;
int i;
plat = pdev->dev.platform_data; plat = pdev->dev.platform_data;
if (!plat) { if (!plat) {
...@@ -3350,6 +3360,26 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) ...@@ -3350,6 +3360,26 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
clk_enable(hsotg->clk); clk_enable(hsotg->clk);
/* regulators */
for (i = 0; i < ARRAY_SIZE(hsotg->supplies); i++)
hsotg->supplies[i].supply = s3c_hsotg_supply_names[i];
ret = regulator_bulk_get(dev, ARRAY_SIZE(hsotg->supplies),
hsotg->supplies);
if (ret) {
dev_err(dev, "failed to request supplies: %d\n", ret);
goto err_supplies;
}
ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies),
hsotg->supplies);
if (ret) {
dev_err(hsotg->dev, "failed to enable supplies: %d\n", ret);
goto err_supplies;
}
/* usb phy enable */ /* usb phy enable */
s3c_hsotg_phy_enable(hsotg); s3c_hsotg_phy_enable(hsotg);
...@@ -3362,7 +3392,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) ...@@ -3362,7 +3392,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
ret = usb_add_gadget_udc(&pdev->dev, &hsotg->gadget); ret = usb_add_gadget_udc(&pdev->dev, &hsotg->gadget);
if (ret) if (ret)
goto err_add_udc; goto err_supplies;
s3c_hsotg_create_debug(hsotg); s3c_hsotg_create_debug(hsotg);
...@@ -3371,9 +3401,12 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) ...@@ -3371,9 +3401,12 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
our_hsotg = hsotg; our_hsotg = hsotg;
return 0; return 0;
err_add_udc: err_supplies:
s3c_hsotg_phy_disable(hsotg); s3c_hsotg_phy_disable(hsotg);
regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies);
regulator_bulk_free(ARRAY_SIZE(hsotg->supplies), hsotg->supplies);
clk_disable(hsotg->clk); clk_disable(hsotg->clk);
clk_put(hsotg->clk); clk_put(hsotg->clk);
...@@ -3408,6 +3441,10 @@ static int __devexit s3c_hsotg_remove(struct platform_device *pdev) ...@@ -3408,6 +3441,10 @@ static int __devexit s3c_hsotg_remove(struct platform_device *pdev)
s3c_hsotg_phy_disable(hsotg); s3c_hsotg_phy_disable(hsotg);
regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies);
regulator_bulk_free(ARRAY_SIZE(hsotg->supplies), hsotg->supplies);
clk_disable(hsotg->clk); clk_disable(hsotg->clk);
clk_put(hsotg->clk); clk_put(hsotg->clk);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册