@@ -2822,8 +2822,8 @@ static void s3c_hsotg_init(struct s3c_hsotg *hsotg)
2822
2822
hsotg -> regs + S3C_GAHBCFG );
2823
2823
}
2824
2824
2825
- static int s3c_hsotg_start (struct usb_gadget_driver * driver ,
2826
- int ( * bind )( struct usb_gadget * ) )
2825
+ static int s3c_hsotg_udc_start (struct usb_gadget * gadget ,
2826
+ struct usb_gadget_driver * driver )
2827
2827
{
2828
2828
struct s3c_hsotg * hsotg = our_hsotg ;
2829
2829
int ret ;
@@ -2841,7 +2841,7 @@ static int s3c_hsotg_start(struct usb_gadget_driver *driver,
2841
2841
if (driver -> max_speed < USB_SPEED_FULL )
2842
2842
dev_err (hsotg -> dev , "%s: bad speed\n" , __func__ );
2843
2843
2844
- if (!bind || ! driver -> setup ) {
2844
+ if (!driver -> setup ) {
2845
2845
dev_err (hsotg -> dev , "%s: missing entry points\n" , __func__ );
2846
2846
return - EINVAL ;
2847
2847
}
@@ -2854,20 +2854,14 @@ static int s3c_hsotg_start(struct usb_gadget_driver *driver,
2854
2854
hsotg -> gadget .dev .dma_mask = hsotg -> dev -> dma_mask ;
2855
2855
hsotg -> gadget .speed = USB_SPEED_UNKNOWN ;
2856
2856
2857
- ret = device_add (& hsotg -> gadget .dev );
2857
+ ret = regulator_bulk_enable (ARRAY_SIZE (hsotg -> supplies ),
2858
+ hsotg -> supplies );
2858
2859
if (ret ) {
2859
- dev_err (hsotg -> dev , "failed to register gadget device \n" );
2860
+ dev_err (hsotg -> dev , "failed to enable supplies: %d \n" , ret );
2860
2861
goto err ;
2861
2862
}
2862
2863
2863
- ret = bind (& hsotg -> gadget );
2864
- if (ret ) {
2865
- dev_err (hsotg -> dev , "failed bind %s\n" , driver -> driver .name );
2866
-
2867
- hsotg -> gadget .dev .driver = NULL ;
2868
- hsotg -> driver = NULL ;
2869
- goto err ;
2870
- }
2864
+ s3c_hsotg_phy_enable (hsotg );
2871
2865
2872
2866
s3c_hsotg_core_init (hsotg );
2873
2867
hsotg -> last_rst = jiffies ;
@@ -2880,7 +2874,8 @@ static int s3c_hsotg_start(struct usb_gadget_driver *driver,
2880
2874
return ret ;
2881
2875
}
2882
2876
2883
- static int s3c_hsotg_stop (struct usb_gadget_driver * driver )
2877
+ static int s3c_hsotg_udc_stop (struct usb_gadget * gadget ,
2878
+ struct usb_gadget_driver * driver )
2884
2879
{
2885
2880
struct s3c_hsotg * hsotg = our_hsotg ;
2886
2881
int ep ;
@@ -2895,13 +2890,12 @@ static int s3c_hsotg_stop(struct usb_gadget_driver *driver)
2895
2890
for (ep = 0 ; ep < hsotg -> num_of_eps ; ep ++ )
2896
2891
s3c_hsotg_ep_disable (& hsotg -> eps [ep ].ep );
2897
2892
2898
- call_gadget (hsotg , disconnect );
2893
+ s3c_hsotg_phy_disable (hsotg );
2894
+ regulator_bulk_disable (ARRAY_SIZE (hsotg -> supplies ), hsotg -> supplies );
2899
2895
2900
- driver -> unbind (& hsotg -> gadget );
2901
2896
hsotg -> driver = NULL ;
2902
2897
hsotg -> gadget .speed = USB_SPEED_UNKNOWN ;
2903
-
2904
- device_del (& hsotg -> gadget .dev );
2898
+ hsotg -> gadget .dev .driver = NULL ;
2905
2899
2906
2900
dev_info (hsotg -> dev , "unregistered gadget driver '%s'\n" ,
2907
2901
driver -> driver .name );
@@ -2916,8 +2910,8 @@ static int s3c_hsotg_gadget_getframe(struct usb_gadget *gadget)
2916
2910
2917
2911
static struct usb_gadget_ops s3c_hsotg_gadget_ops = {
2918
2912
.get_frame = s3c_hsotg_gadget_getframe ,
2919
- .start = s3c_hsotg_start ,
2920
- .stop = s3c_hsotg_stop ,
2913
+ .udc_start = s3c_hsotg_udc_start ,
2914
+ .udc_stop = s3c_hsotg_udc_stop ,
2921
2915
};
2922
2916
2923
2917
/**
@@ -3479,6 +3473,23 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
3479
3473
for (epnum = 0 ; epnum < hsotg -> num_of_eps ; epnum ++ )
3480
3474
s3c_hsotg_initep (hsotg , & hsotg -> eps [epnum ], epnum );
3481
3475
3476
+ /* disable power and clock */
3477
+
3478
+ ret = regulator_bulk_disable (ARRAY_SIZE (hsotg -> supplies ),
3479
+ hsotg -> supplies );
3480
+ if (ret ) {
3481
+ dev_err (hsotg -> dev , "failed to disable supplies: %d\n" , ret );
3482
+ goto err_ep_mem ;
3483
+ }
3484
+
3485
+ s3c_hsotg_phy_disable (hsotg );
3486
+
3487
+ ret = device_add (& hsotg -> gadget .dev );
3488
+ if (ret ) {
3489
+ put_device (& hsotg -> gadget .dev );
3490
+ goto err_ep_mem ;
3491
+ }
3492
+
3482
3493
ret = usb_add_gadget_udc (& pdev -> dev , & hsotg -> gadget );
3483
3494
if (ret )
3484
3495
goto err_ep_mem ;
@@ -3496,7 +3507,6 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
3496
3507
err_supplies :
3497
3508
s3c_hsotg_phy_disable (hsotg );
3498
3509
3499
- regulator_bulk_disable (ARRAY_SIZE (hsotg -> supplies ), hsotg -> supplies );
3500
3510
regulator_bulk_free (ARRAY_SIZE (hsotg -> supplies ), hsotg -> supplies );
3501
3511
3502
3512
clk_disable (hsotg -> clk );
@@ -3523,7 +3533,10 @@ static int __devexit s3c_hsotg_remove(struct platform_device *pdev)
3523
3533
3524
3534
s3c_hsotg_delete_debug (hsotg );
3525
3535
3526
- usb_gadget_unregister_driver (hsotg -> driver );
3536
+ if (hsotg -> driver ) {
3537
+ /* should have been done already by driver model core */
3538
+ usb_gadget_unregister_driver (hsotg -> driver );
3539
+ }
3527
3540
3528
3541
free_irq (hsotg -> irq , hsotg );
3529
3542
iounmap (hsotg -> regs );
@@ -3532,14 +3545,12 @@ static int __devexit s3c_hsotg_remove(struct platform_device *pdev)
3532
3545
kfree (hsotg -> regs_res );
3533
3546
3534
3547
s3c_hsotg_phy_disable (hsotg );
3535
-
3536
-
3537
- regulator_bulk_disable (ARRAY_SIZE (hsotg -> supplies ), hsotg -> supplies );
3538
3548
regulator_bulk_free (ARRAY_SIZE (hsotg -> supplies ), hsotg -> supplies );
3539
3549
3540
3550
clk_disable (hsotg -> clk );
3541
3551
clk_put (hsotg -> clk );
3542
3552
3553
+ device_unregister (& hsotg -> gadget .dev );
3543
3554
kfree (hsotg );
3544
3555
return 0 ;
3545
3556
}
0 commit comments