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: Lukasz Majewski <[email protected]>
Signed-off-by: Kyungmin Park <[email protected]>
---
 drivers/usb/gadget/s3c-hsotg.c |   41 ++++++++++++++++++++++++++++++++++++++-
 1 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c
index 4170654..b35c657 100644
--- a/drivers/usb/gadget/s3c-hsotg.c
+++ b/drivers/usb/gadget/s3c-hsotg.c
@@ -27,6 +27,7 @@
 #include <linux/io.h>
 #include <linux/slab.h>
 #include <linux/clk.h>
+#include <linux/regulator/consumer.h>
 
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
@@ -41,6 +42,11 @@
 
 #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
  *
  * Unfortunately there seems to be a limit of the amount of data that can
@@ -135,6 +141,7 @@ struct s3c_hsotg_ep {
  * @regs: The memory area mapped for accessing registers.
  * @regs_res: The resource that was allocated when claiming register space.
  * @irq: The IRQ number we are using
+ * @supplies: Definition of USB power supplies
  * @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos.
  * @debug_root: root directrory for debugfs.
  * @debug_file: main status file for debugfs.
@@ -155,6 +162,8 @@ struct s3c_hsotg {
        int                     irq;
        struct clk              *clk;
 
+       struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)];
+
        unsigned int            dedicated_fifos:1;
 
        struct dentry           *debug_root;
@@ -3258,6 +3267,7 @@ static int __devinit s3c_hsotg_probe(struct 
platform_device *pdev)
        struct resource *res;
        int epnum;
        int ret;
+       int i;
 
        plat = pdev->dev.platform_data;
        if (!plat) {
@@ -3356,6 +3366,26 @@ static int __devinit s3c_hsotg_probe(struct 
platform_device *pdev)
 
        s3c_hsotg_phy_enable(hsotg);
 
+       /* 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;
+       }
+
        s3c_hsotg_corereset(hsotg);
        s3c_hsotg_init(hsotg);
 
@@ -3365,7 +3395,7 @@ static int __devinit s3c_hsotg_probe(struct 
platform_device *pdev)
 
        ret = usb_add_gadget_udc(&pdev->dev, &hsotg->gadget);
        if (ret)
-               goto err_add_udc;
+               goto err_supplies;
 
        s3c_hsotg_create_debug(hsotg);
 
@@ -3374,9 +3404,12 @@ static int __devinit s3c_hsotg_probe(struct 
platform_device *pdev)
        our_hsotg = hsotg;
        return 0;
 
-err_add_udc:
+err_supplies:
        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_put(hsotg->clk);
 
@@ -3411,6 +3444,10 @@ static int __devexit s3c_hsotg_remove(struct 
platform_device *pdev)
 
        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_put(hsotg->clk);
 
-- 
1.7.2.3

--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to