@@ -1586,7 +1586,8 @@ static int stm32_sai_sub_parse_of(struct platform_device *pdev,
15861586 dev_err (& pdev -> dev ,
15871587 "External synchro not supported\n" );
15881588 of_node_put (args .np );
1589- return - EINVAL ;
1589+ ret = - EINVAL ;
1590+ goto err_put_sync_provider ;
15901591 }
15911592 sai -> sync = SAI_SYNC_EXTERNAL ;
15921593
@@ -1595,7 +1596,8 @@ static int stm32_sai_sub_parse_of(struct platform_device *pdev,
15951596 (sai -> synci > (SAI_GCR_SYNCIN_MAX + 1 ))) {
15961597 dev_err (& pdev -> dev , "Wrong SAI index\n" );
15971598 of_node_put (args .np );
1598- return - EINVAL ;
1599+ ret = - EINVAL ;
1600+ goto err_put_sync_provider ;
15991601 }
16001602
16011603 if (of_property_match_string (args .np , "compatible" ,
@@ -1609,7 +1611,8 @@ static int stm32_sai_sub_parse_of(struct platform_device *pdev,
16091611 if (!sai -> synco ) {
16101612 dev_err (& pdev -> dev , "Unknown SAI sub-block\n" );
16111613 of_node_put (args .np );
1612- return - EINVAL ;
1614+ ret = - EINVAL ;
1615+ goto err_put_sync_provider ;
16131616 }
16141617 }
16151618
@@ -1619,13 +1622,15 @@ static int stm32_sai_sub_parse_of(struct platform_device *pdev,
16191622
16201623 of_node_put (args .np );
16211624 sai -> sai_ck = devm_clk_get (& pdev -> dev , "sai_ck" );
1622- if (IS_ERR (sai -> sai_ck ))
1623- return dev_err_probe (& pdev -> dev , PTR_ERR (sai -> sai_ck ),
1624- "Missing kernel clock sai_ck\n" );
1625+ if (IS_ERR (sai -> sai_ck )) {
1626+ ret = dev_err_probe (& pdev -> dev , PTR_ERR (sai -> sai_ck ),
1627+ "Missing kernel clock sai_ck\n" );
1628+ goto err_put_sync_provider ;
1629+ }
16251630
16261631 ret = clk_prepare (sai -> pdata -> pclk );
16271632 if (ret < 0 )
1628- return ret ;
1633+ goto err_put_sync_provider ;
16291634
16301635 if (STM_SAI_IS_F4 (sai -> pdata ))
16311636 return 0 ;
@@ -1634,14 +1639,23 @@ static int stm32_sai_sub_parse_of(struct platform_device *pdev,
16341639 if (of_property_present (np , "#clock-cells" )) {
16351640 ret = stm32_sai_add_mclk_provider (sai );
16361641 if (ret < 0 )
1637- return ret ;
1642+ goto err_unprepare_pclk ;
16381643 } else {
16391644 sai -> sai_mclk = devm_clk_get_optional (& pdev -> dev , "MCLK" );
1640- if (IS_ERR (sai -> sai_mclk ))
1641- return PTR_ERR (sai -> sai_mclk );
1645+ if (IS_ERR (sai -> sai_mclk )) {
1646+ ret = PTR_ERR (sai -> sai_mclk );
1647+ goto err_unprepare_pclk ;
1648+ }
16421649 }
16431650
16441651 return 0 ;
1652+
1653+ err_unprepare_pclk :
1654+ clk_unprepare (sai -> pdata -> pclk );
1655+ err_put_sync_provider :
1656+ of_node_put (sai -> np_sync_provider );
1657+
1658+ return ret ;
16451659}
16461660
16471661static int stm32_sai_sub_probe (struct platform_device * pdev )
@@ -1688,26 +1702,34 @@ static int stm32_sai_sub_probe(struct platform_device *pdev)
16881702 IRQF_SHARED , dev_name (& pdev -> dev ), sai );
16891703 if (ret ) {
16901704 dev_err (& pdev -> dev , "IRQ request returned %d\n" , ret );
1691- return ret ;
1705+ goto err_unprepare_pclk ;
16921706 }
16931707
16941708 if (STM_SAI_PROTOCOL_IS_SPDIF (sai ))
16951709 conf = & stm32_sai_pcm_config_spdif ;
16961710
16971711 ret = snd_dmaengine_pcm_register (& pdev -> dev , conf , 0 );
1698- if (ret )
1699- return dev_err_probe (& pdev -> dev , ret , "Could not register pcm dma\n" );
1712+ if (ret ) {
1713+ ret = dev_err_probe (& pdev -> dev , ret , "Could not register pcm dma\n" );
1714+ goto err_unprepare_pclk ;
1715+ }
17001716
17011717 ret = snd_soc_register_component (& pdev -> dev , & stm32_component ,
17021718 & sai -> cpu_dai_drv , 1 );
1703- if (ret ) {
1704- snd_dmaengine_pcm_unregister (& pdev -> dev );
1705- return ret ;
1706- }
1719+ if (ret )
1720+ goto err_deregister_pcm_dma ;
17071721
17081722 pm_runtime_enable (& pdev -> dev );
17091723
17101724 return 0 ;
1725+
1726+ err_deregister_pcm_dma :
1727+ snd_dmaengine_pcm_unregister (& pdev -> dev );
1728+ err_unprepare_pclk :
1729+ clk_unprepare (sai -> pdata -> pclk );
1730+ of_node_put (sai -> np_sync_provider );
1731+
1732+ return ret ;
17111733}
17121734
17131735static void stm32_sai_sub_remove (struct platform_device * pdev )
@@ -1718,6 +1740,7 @@ static void stm32_sai_sub_remove(struct platform_device *pdev)
17181740 snd_dmaengine_pcm_unregister (& pdev -> dev );
17191741 snd_soc_unregister_component (& pdev -> dev );
17201742 pm_runtime_disable (& pdev -> dev );
1743+ of_node_put (sai -> np_sync_provider );
17211744}
17221745
17231746static int stm32_sai_sub_suspend (struct device * dev )
0 commit comments