diff options
Diffstat (limited to 'drivers/usb/gadget/s3c-hsotg.c')
-rw-r--r-- | 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 3484a09d1ddb..e1a54d21ecaf 100644 --- a/drivers/usb/gadget/s3c-hsotg.c +++ b/drivers/usb/gadget/s3c-hsotg.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/io.h> | 27 | #include <linux/io.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/clk.h> | 29 | #include <linux/clk.h> |
30 | #include <linux/regulator/consumer.h> | ||
30 | 31 | ||
31 | #include <linux/usb/ch9.h> | 32 | #include <linux/usb/ch9.h> |
32 | #include <linux/usb/gadget.h> | 33 | #include <linux/usb/gadget.h> |
@@ -38,6 +39,11 @@ | |||
38 | 39 | ||
39 | #define DMA_ADDR_INVALID (~((dma_addr_t)0)) | 40 | #define DMA_ADDR_INVALID (~((dma_addr_t)0)) |
40 | 41 | ||
42 | static const char * const s3c_hsotg_supply_names[] = { | ||
43 | "vusb_d", /* digital USB supply, 1.2V */ | ||
44 | "vusb_a", /* analog USB supply, 1.1V */ | ||
45 | }; | ||
46 | |||
41 | /* EP0_MPS_LIMIT | 47 | /* EP0_MPS_LIMIT |
42 | * | 48 | * |
43 | * Unfortunately there seems to be a limit of the amount of data that can | 49 | * Unfortunately there seems to be a limit of the amount of data that can |
@@ -132,6 +138,7 @@ struct s3c_hsotg_ep { | |||
132 | * @regs: The memory area mapped for accessing registers. | 138 | * @regs: The memory area mapped for accessing registers. |
133 | * @regs_res: The resource that was allocated when claiming register space. | 139 | * @regs_res: The resource that was allocated when claiming register space. |
134 | * @irq: The IRQ number we are using | 140 | * @irq: The IRQ number we are using |
141 | * @supplies: Definition of USB power supplies | ||
135 | * @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos. | 142 | * @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos. |
136 | * @debug_root: root directrory for debugfs. | 143 | * @debug_root: root directrory for debugfs. |
137 | * @debug_file: main status file for debugfs. | 144 | * @debug_file: main status file for debugfs. |
@@ -152,6 +159,8 @@ struct s3c_hsotg { | |||
152 | int irq; | 159 | int irq; |
153 | struct clk *clk; | 160 | struct clk *clk; |
154 | 161 | ||
162 | struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)]; | ||
163 | |||
155 | unsigned int dedicated_fifos:1; | 164 | unsigned int dedicated_fifos:1; |
156 | 165 | ||
157 | struct dentry *debug_root; | 166 | struct dentry *debug_root; |
@@ -3256,6 +3265,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) | |||
3256 | struct resource *res; | 3265 | struct resource *res; |
3257 | int epnum; | 3266 | int epnum; |
3258 | int ret; | 3267 | int ret; |
3268 | int i; | ||
3259 | 3269 | ||
3260 | plat = pdev->dev.platform_data; | 3270 | plat = pdev->dev.platform_data; |
3261 | if (!plat) { | 3271 | if (!plat) { |
@@ -3350,6 +3360,26 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) | |||
3350 | 3360 | ||
3351 | clk_enable(hsotg->clk); | 3361 | clk_enable(hsotg->clk); |
3352 | 3362 | ||
3363 | /* regulators */ | ||
3364 | |||
3365 | for (i = 0; i < ARRAY_SIZE(hsotg->supplies); i++) | ||
3366 | hsotg->supplies[i].supply = s3c_hsotg_supply_names[i]; | ||
3367 | |||
3368 | ret = regulator_bulk_get(dev, ARRAY_SIZE(hsotg->supplies), | ||
3369 | hsotg->supplies); | ||
3370 | if (ret) { | ||
3371 | dev_err(dev, "failed to request supplies: %d\n", ret); | ||
3372 | goto err_supplies; | ||
3373 | } | ||
3374 | |||
3375 | ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies), | ||
3376 | hsotg->supplies); | ||
3377 | |||
3378 | if (ret) { | ||
3379 | dev_err(hsotg->dev, "failed to enable supplies: %d\n", ret); | ||
3380 | goto err_supplies; | ||
3381 | } | ||
3382 | |||
3353 | /* usb phy enable */ | 3383 | /* usb phy enable */ |
3354 | s3c_hsotg_phy_enable(hsotg); | 3384 | s3c_hsotg_phy_enable(hsotg); |
3355 | 3385 | ||
@@ -3362,7 +3392,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) | |||
3362 | 3392 | ||
3363 | ret = usb_add_gadget_udc(&pdev->dev, &hsotg->gadget); | 3393 | ret = usb_add_gadget_udc(&pdev->dev, &hsotg->gadget); |
3364 | if (ret) | 3394 | if (ret) |
3365 | goto err_add_udc; | 3395 | goto err_supplies; |
3366 | 3396 | ||
3367 | s3c_hsotg_create_debug(hsotg); | 3397 | s3c_hsotg_create_debug(hsotg); |
3368 | 3398 | ||
@@ -3371,9 +3401,12 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) | |||
3371 | our_hsotg = hsotg; | 3401 | our_hsotg = hsotg; |
3372 | return 0; | 3402 | return 0; |
3373 | 3403 | ||
3374 | err_add_udc: | 3404 | err_supplies: |
3375 | s3c_hsotg_phy_disable(hsotg); | 3405 | s3c_hsotg_phy_disable(hsotg); |
3376 | 3406 | ||
3407 | regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); | ||
3408 | regulator_bulk_free(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); | ||
3409 | |||
3377 | clk_disable(hsotg->clk); | 3410 | clk_disable(hsotg->clk); |
3378 | clk_put(hsotg->clk); | 3411 | clk_put(hsotg->clk); |
3379 | 3412 | ||
@@ -3408,6 +3441,10 @@ static int __devexit s3c_hsotg_remove(struct platform_device *pdev) | |||
3408 | 3441 | ||
3409 | s3c_hsotg_phy_disable(hsotg); | 3442 | s3c_hsotg_phy_disable(hsotg); |
3410 | 3443 | ||
3444 | |||
3445 | regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); | ||
3446 | regulator_bulk_free(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); | ||
3447 | |||
3411 | clk_disable(hsotg->clk); | 3448 | clk_disable(hsotg->clk); |
3412 | clk_put(hsotg->clk); | 3449 | clk_put(hsotg->clk); |
3413 | 3450 | ||