15
15
#include <linux/reset-controller.h>
16
16
#include <linux/slab.h>
17
17
18
+ #include <soc/amlogic/reset-meson-aux.h>
19
+
18
20
#include "meson-clkc-utils.h"
19
21
#include "axg-audio.h"
20
22
#include "clk-regmap.h"
@@ -1678,84 +1680,6 @@ static struct clk_regmap *const sm1_clk_regmaps[] = {
1678
1680
& sm1_earcrx_dmac_clk ,
1679
1681
};
1680
1682
1681
- struct axg_audio_reset_data {
1682
- struct reset_controller_dev rstc ;
1683
- struct regmap * map ;
1684
- unsigned int offset ;
1685
- };
1686
-
1687
- static void axg_audio_reset_reg_and_bit (struct axg_audio_reset_data * rst ,
1688
- unsigned long id ,
1689
- unsigned int * reg ,
1690
- unsigned int * bit )
1691
- {
1692
- unsigned int stride = regmap_get_reg_stride (rst -> map );
1693
-
1694
- * reg = (id / (stride * BITS_PER_BYTE )) * stride ;
1695
- * reg += rst -> offset ;
1696
- * bit = id % (stride * BITS_PER_BYTE );
1697
- }
1698
-
1699
- static int axg_audio_reset_update (struct reset_controller_dev * rcdev ,
1700
- unsigned long id , bool assert )
1701
- {
1702
- struct axg_audio_reset_data * rst =
1703
- container_of (rcdev , struct axg_audio_reset_data , rstc );
1704
- unsigned int offset , bit ;
1705
-
1706
- axg_audio_reset_reg_and_bit (rst , id , & offset , & bit );
1707
-
1708
- regmap_update_bits (rst -> map , offset , BIT (bit ),
1709
- assert ? BIT (bit ) : 0 );
1710
-
1711
- return 0 ;
1712
- }
1713
-
1714
- static int axg_audio_reset_status (struct reset_controller_dev * rcdev ,
1715
- unsigned long id )
1716
- {
1717
- struct axg_audio_reset_data * rst =
1718
- container_of (rcdev , struct axg_audio_reset_data , rstc );
1719
- unsigned int val , offset , bit ;
1720
-
1721
- axg_audio_reset_reg_and_bit (rst , id , & offset , & bit );
1722
-
1723
- regmap_read (rst -> map , offset , & val );
1724
-
1725
- return !!(val & BIT (bit ));
1726
- }
1727
-
1728
- static int axg_audio_reset_assert (struct reset_controller_dev * rcdev ,
1729
- unsigned long id )
1730
- {
1731
- return axg_audio_reset_update (rcdev , id , true);
1732
- }
1733
-
1734
- static int axg_audio_reset_deassert (struct reset_controller_dev * rcdev ,
1735
- unsigned long id )
1736
- {
1737
- return axg_audio_reset_update (rcdev , id , false);
1738
- }
1739
-
1740
- static int axg_audio_reset_toggle (struct reset_controller_dev * rcdev ,
1741
- unsigned long id )
1742
- {
1743
- int ret ;
1744
-
1745
- ret = axg_audio_reset_assert (rcdev , id );
1746
- if (ret )
1747
- return ret ;
1748
-
1749
- return axg_audio_reset_deassert (rcdev , id );
1750
- }
1751
-
1752
- static const struct reset_control_ops axg_audio_rstc_ops = {
1753
- .assert = axg_audio_reset_assert ,
1754
- .deassert = axg_audio_reset_deassert ,
1755
- .reset = axg_audio_reset_toggle ,
1756
- .status = axg_audio_reset_status ,
1757
- };
1758
-
1759
1683
static struct regmap_config axg_audio_regmap_cfg = {
1760
1684
.reg_bits = 32 ,
1761
1685
.val_bits = 32 ,
@@ -1766,16 +1690,14 @@ struct audioclk_data {
1766
1690
struct clk_regmap * const * regmap_clks ;
1767
1691
unsigned int regmap_clk_num ;
1768
1692
struct meson_clk_hw_data hw_clks ;
1769
- unsigned int reset_offset ;
1770
- unsigned int reset_num ;
1771
1693
unsigned int max_register ;
1694
+ const char * rst_drvname ;
1772
1695
};
1773
1696
1774
1697
static int axg_audio_clkc_probe (struct platform_device * pdev )
1775
1698
{
1776
1699
struct device * dev = & pdev -> dev ;
1777
1700
const struct audioclk_data * data ;
1778
- struct axg_audio_reset_data * rst ;
1779
1701
struct regmap * map ;
1780
1702
void __iomem * regs ;
1781
1703
struct clk_hw * hw ;
@@ -1834,22 +1756,11 @@ static int axg_audio_clkc_probe(struct platform_device *pdev)
1834
1756
if (ret )
1835
1757
return ret ;
1836
1758
1837
- /* Stop here if there is no reset */
1838
- if (!data -> reset_num )
1839
- return 0 ;
1840
-
1841
- rst = devm_kzalloc (dev , sizeof (* rst ), GFP_KERNEL );
1842
- if (!rst )
1843
- return - ENOMEM ;
1844
-
1845
- rst -> map = map ;
1846
- rst -> offset = data -> reset_offset ;
1847
- rst -> rstc .nr_resets = data -> reset_num ;
1848
- rst -> rstc .ops = & axg_audio_rstc_ops ;
1849
- rst -> rstc .of_node = dev -> of_node ;
1850
- rst -> rstc .owner = THIS_MODULE ;
1759
+ /* Register auxiliary reset driver when applicable */
1760
+ if (data -> rst_drvname )
1761
+ ret = devm_meson_rst_aux_register (dev , map , data -> rst_drvname );
1851
1762
1852
- return devm_reset_controller_register ( dev , & rst -> rstc ) ;
1763
+ return ret ;
1853
1764
}
1854
1765
1855
1766
static const struct audioclk_data axg_audioclk_data = {
@@ -1869,9 +1780,8 @@ static const struct audioclk_data g12a_audioclk_data = {
1869
1780
.hws = g12a_audio_hw_clks ,
1870
1781
.num = ARRAY_SIZE (g12a_audio_hw_clks ),
1871
1782
},
1872
- .reset_offset = AUDIO_SW_RESET ,
1873
- .reset_num = 26 ,
1874
1783
.max_register = AUDIO_CLK_SPDIFOUT_B_CTRL ,
1784
+ .rst_drvname = "rst-g12a" ,
1875
1785
};
1876
1786
1877
1787
static const struct audioclk_data sm1_audioclk_data = {
@@ -1881,9 +1791,8 @@ static const struct audioclk_data sm1_audioclk_data = {
1881
1791
.hws = sm1_audio_hw_clks ,
1882
1792
.num = ARRAY_SIZE (sm1_audio_hw_clks ),
1883
1793
},
1884
- .reset_offset = AUDIO_SM1_SW_RESET0 ,
1885
- .reset_num = 39 ,
1886
1794
.max_register = AUDIO_EARCRX_DMAC_CLK_CTRL ,
1795
+ .rst_drvname = "rst-sm1" ,
1887
1796
};
1888
1797
1889
1798
static const struct of_device_id clkc_match_table [] = {
0 commit comments