@@ -3325,8 +3325,10 @@ static int wcd938x_populate_dt_data(struct wcd938x_priv *wcd938x, struct device
3325
3325
return dev_err_probe (dev , ret , "Failed to get supplies\n" );
3326
3326
3327
3327
ret = regulator_bulk_enable (WCD938X_MAX_SUPPLY , wcd938x -> supplies );
3328
- if (ret )
3328
+ if (ret ) {
3329
+ regulator_bulk_free (WCD938X_MAX_SUPPLY , wcd938x -> supplies );
3329
3330
return dev_err_probe (dev , ret , "Failed to enable supplies\n" );
3331
+ }
3330
3332
3331
3333
wcd938x_dt_parse_micbias_info (dev , wcd938x );
3332
3334
@@ -3435,54 +3437,56 @@ static int wcd938x_bind(struct device *dev)
3435
3437
wcd938x -> rxdev = wcd938x_sdw_device_get (wcd938x -> rxnode );
3436
3438
if (!wcd938x -> rxdev ) {
3437
3439
dev_err (dev , "could not find slave with matching of node\n" );
3438
- return - EINVAL ;
3440
+ ret = - EINVAL ;
3441
+ goto err_unbind ;
3439
3442
}
3440
3443
wcd938x -> sdw_priv [AIF1_PB ] = dev_get_drvdata (wcd938x -> rxdev );
3441
3444
wcd938x -> sdw_priv [AIF1_PB ]-> wcd938x = wcd938x ;
3442
3445
3443
3446
wcd938x -> txdev = wcd938x_sdw_device_get (wcd938x -> txnode );
3444
3447
if (!wcd938x -> txdev ) {
3445
3448
dev_err (dev , "could not find txslave with matching of node\n" );
3446
- return - EINVAL ;
3449
+ ret = - EINVAL ;
3450
+ goto err_put_rxdev ;
3447
3451
}
3448
3452
wcd938x -> sdw_priv [AIF1_CAP ] = dev_get_drvdata (wcd938x -> txdev );
3449
3453
wcd938x -> sdw_priv [AIF1_CAP ]-> wcd938x = wcd938x ;
3450
3454
wcd938x -> tx_sdw_dev = dev_to_sdw_dev (wcd938x -> txdev );
3451
- if (!wcd938x -> tx_sdw_dev ) {
3452
- dev_err (dev , "could not get txslave with matching of dev\n" );
3453
- return - EINVAL ;
3454
- }
3455
3455
3456
3456
/* As TX is main CSR reg interface, which should not be suspended first.
3457
3457
* expicilty add the dependency link */
3458
3458
if (!device_link_add (wcd938x -> rxdev , wcd938x -> txdev , DL_FLAG_STATELESS |
3459
3459
DL_FLAG_PM_RUNTIME )) {
3460
3460
dev_err (dev , "could not devlink tx and rx\n" );
3461
- return - EINVAL ;
3461
+ ret = - EINVAL ;
3462
+ goto err_put_txdev ;
3462
3463
}
3463
3464
3464
3465
if (!device_link_add (dev , wcd938x -> txdev , DL_FLAG_STATELESS |
3465
3466
DL_FLAG_PM_RUNTIME )) {
3466
3467
dev_err (dev , "could not devlink wcd and tx\n" );
3467
- return - EINVAL ;
3468
+ ret = - EINVAL ;
3469
+ goto err_remove_rxtx_link ;
3468
3470
}
3469
3471
3470
3472
if (!device_link_add (dev , wcd938x -> rxdev , DL_FLAG_STATELESS |
3471
3473
DL_FLAG_PM_RUNTIME )) {
3472
3474
dev_err (dev , "could not devlink wcd and rx\n" );
3473
- return - EINVAL ;
3475
+ ret = - EINVAL ;
3476
+ goto err_remove_tx_link ;
3474
3477
}
3475
3478
3476
3479
wcd938x -> regmap = dev_get_regmap (& wcd938x -> tx_sdw_dev -> dev , NULL );
3477
3480
if (!wcd938x -> regmap ) {
3478
3481
dev_err (dev , "could not get TX device regmap\n" );
3479
- return - EINVAL ;
3482
+ ret = - EINVAL ;
3483
+ goto err_remove_rx_link ;
3480
3484
}
3481
3485
3482
3486
ret = wcd938x_irq_init (wcd938x , dev );
3483
3487
if (ret ) {
3484
3488
dev_err (dev , "%s: IRQ init failed: %d\n" , __func__ , ret );
3485
- return ret ;
3489
+ goto err_remove_rx_link ;
3486
3490
}
3487
3491
3488
3492
wcd938x -> sdw_priv [AIF1_PB ]-> slave_irq = wcd938x -> virq ;
@@ -3491,27 +3495,45 @@ static int wcd938x_bind(struct device *dev)
3491
3495
ret = wcd938x_set_micbias_data (wcd938x );
3492
3496
if (ret < 0 ) {
3493
3497
dev_err (dev , "%s: bad micbias pdata\n" , __func__ );
3494
- return ret ;
3498
+ goto err_remove_rx_link ;
3495
3499
}
3496
3500
3497
3501
ret = snd_soc_register_component (dev , & soc_codec_dev_wcd938x ,
3498
3502
wcd938x_dais , ARRAY_SIZE (wcd938x_dais ));
3499
- if (ret )
3503
+ if (ret ) {
3500
3504
dev_err (dev , "%s: Codec registration failed\n" ,
3501
3505
__func__ );
3506
+ goto err_remove_rx_link ;
3507
+ }
3502
3508
3503
- return ret ;
3509
+ return 0 ;
3504
3510
3511
+ err_remove_rx_link :
3512
+ device_link_remove (dev , wcd938x -> rxdev );
3513
+ err_remove_tx_link :
3514
+ device_link_remove (dev , wcd938x -> txdev );
3515
+ err_remove_rxtx_link :
3516
+ device_link_remove (wcd938x -> rxdev , wcd938x -> txdev );
3517
+ err_put_txdev :
3518
+ put_device (wcd938x -> txdev );
3519
+ err_put_rxdev :
3520
+ put_device (wcd938x -> rxdev );
3521
+ err_unbind :
3522
+ component_unbind_all (dev , wcd938x );
3523
+
3524
+ return ret ;
3505
3525
}
3506
3526
3507
3527
static void wcd938x_unbind (struct device * dev )
3508
3528
{
3509
3529
struct wcd938x_priv * wcd938x = dev_get_drvdata (dev );
3510
3530
3531
+ snd_soc_unregister_component (dev );
3511
3532
device_link_remove (dev , wcd938x -> txdev );
3512
3533
device_link_remove (dev , wcd938x -> rxdev );
3513
3534
device_link_remove (wcd938x -> rxdev , wcd938x -> txdev );
3514
- snd_soc_unregister_component (dev );
3535
+ put_device (wcd938x -> txdev );
3536
+ put_device (wcd938x -> rxdev );
3515
3537
component_unbind_all (dev , wcd938x );
3516
3538
}
3517
3539
@@ -3572,13 +3594,13 @@ static int wcd938x_probe(struct platform_device *pdev)
3572
3594
3573
3595
ret = wcd938x_add_slave_components (wcd938x , dev , & match );
3574
3596
if (ret )
3575
- return ret ;
3597
+ goto err_disable_regulators ;
3576
3598
3577
3599
wcd938x_reset (wcd938x );
3578
3600
3579
3601
ret = component_master_add_with_match (dev , & wcd938x_comp_ops , match );
3580
3602
if (ret )
3581
- return ret ;
3603
+ goto err_disable_regulators ;
3582
3604
3583
3605
pm_runtime_set_autosuspend_delay (dev , 1000 );
3584
3606
pm_runtime_use_autosuspend (dev );
@@ -3588,11 +3610,27 @@ static int wcd938x_probe(struct platform_device *pdev)
3588
3610
pm_runtime_idle (dev );
3589
3611
3590
3612
return 0 ;
3613
+
3614
+ err_disable_regulators :
3615
+ regulator_bulk_disable (WCD938X_MAX_SUPPLY , wcd938x -> supplies );
3616
+ regulator_bulk_free (WCD938X_MAX_SUPPLY , wcd938x -> supplies );
3617
+
3618
+ return ret ;
3591
3619
}
3592
3620
3593
3621
static void wcd938x_remove (struct platform_device * pdev )
3594
3622
{
3595
- component_master_del (& pdev -> dev , & wcd938x_comp_ops );
3623
+ struct device * dev = & pdev -> dev ;
3624
+ struct wcd938x_priv * wcd938x = dev_get_drvdata (dev );
3625
+
3626
+ component_master_del (dev , & wcd938x_comp_ops );
3627
+
3628
+ pm_runtime_disable (dev );
3629
+ pm_runtime_set_suspended (dev );
3630
+ pm_runtime_dont_use_autosuspend (dev );
3631
+
3632
+ regulator_bulk_disable (WCD938X_MAX_SUPPLY , wcd938x -> supplies );
3633
+ regulator_bulk_free (WCD938X_MAX_SUPPLY , wcd938x -> supplies );
3596
3634
}
3597
3635
3598
3636
#if defined(CONFIG_OF )
0 commit comments