1515#include <linux/reset-controller.h>
1616#include <linux/slab.h>
1717
18+ #include <soc/amlogic/reset-meson-aux.h>
19+
1820#include "meson-clkc-utils.h"
1921#include "axg-audio.h"
2022#include "clk-regmap.h"
@@ -1678,84 +1680,6 @@ static struct clk_regmap *const sm1_clk_regmaps[] = {
16781680 & sm1_earcrx_dmac_clk ,
16791681};
16801682
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-
17591683static struct regmap_config axg_audio_regmap_cfg = {
17601684 .reg_bits = 32 ,
17611685 .val_bits = 32 ,
@@ -1766,16 +1690,14 @@ struct audioclk_data {
17661690 struct clk_regmap * const * regmap_clks ;
17671691 unsigned int regmap_clk_num ;
17681692 struct meson_clk_hw_data hw_clks ;
1769- unsigned int reset_offset ;
1770- unsigned int reset_num ;
17711693 unsigned int max_register ;
1694+ const char * rst_drvname ;
17721695};
17731696
17741697static int axg_audio_clkc_probe (struct platform_device * pdev )
17751698{
17761699 struct device * dev = & pdev -> dev ;
17771700 const struct audioclk_data * data ;
1778- struct axg_audio_reset_data * rst ;
17791701 struct regmap * map ;
17801702 void __iomem * regs ;
17811703 struct clk_hw * hw ;
@@ -1834,22 +1756,11 @@ static int axg_audio_clkc_probe(struct platform_device *pdev)
18341756 if (ret )
18351757 return ret ;
18361758
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 );
18511762
1852- return devm_reset_controller_register ( dev , & rst -> rstc ) ;
1763+ return ret ;
18531764}
18541765
18551766static const struct audioclk_data axg_audioclk_data = {
@@ -1869,9 +1780,8 @@ static const struct audioclk_data g12a_audioclk_data = {
18691780 .hws = g12a_audio_hw_clks ,
18701781 .num = ARRAY_SIZE (g12a_audio_hw_clks ),
18711782 },
1872- .reset_offset = AUDIO_SW_RESET ,
1873- .reset_num = 26 ,
18741783 .max_register = AUDIO_CLK_SPDIFOUT_B_CTRL ,
1784+ .rst_drvname = "rst-g12a" ,
18751785};
18761786
18771787static const struct audioclk_data sm1_audioclk_data = {
@@ -1881,9 +1791,8 @@ static const struct audioclk_data sm1_audioclk_data = {
18811791 .hws = sm1_audio_hw_clks ,
18821792 .num = ARRAY_SIZE (sm1_audio_hw_clks ),
18831793 },
1884- .reset_offset = AUDIO_SM1_SW_RESET0 ,
1885- .reset_num = 39 ,
18861794 .max_register = AUDIO_EARCRX_DMAC_CLK_CTRL ,
1795+ .rst_drvname = "rst-sm1" ,
18871796};
18881797
18891798static const struct of_device_id clkc_match_table [] = {
0 commit comments