1919
2020#include <dt-bindings/clk/exynos-audss-clk.h>
2121
22+ enum exynos_audss_clk_type {
23+ TYPE_EXYNOS4210 ,
24+ TYPE_EXYNOS5250 ,
25+ TYPE_EXYNOS5420 ,
26+ };
27+
2228static DEFINE_SPINLOCK (lock );
2329static struct clk * * clk_table ;
2430static void __iomem * reg_base ;
@@ -59,6 +65,16 @@ static struct syscore_ops exynos_audss_clk_syscore_ops = {
5965};
6066#endif /* CONFIG_PM_SLEEP */
6167
68+ static const struct of_device_id exynos_audss_clk_of_match [] = {
69+ { .compatible = "samsung,exynos4210-audss-clock" ,
70+ .data = (void * )TYPE_EXYNOS4210 , },
71+ { .compatible = "samsung,exynos5250-audss-clock" ,
72+ .data = (void * )TYPE_EXYNOS5250 , },
73+ { .compatible = "samsung,exynos5420-audss-clock" ,
74+ .data = (void * )TYPE_EXYNOS5420 , },
75+ {},
76+ };
77+
6278/* register exynos_audss clocks */
6379static int exynos_audss_clk_probe (struct platform_device * pdev )
6480{
@@ -68,6 +84,13 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
6884 const char * mout_i2s_p [] = {"mout_audss" , "cdclk0" , "sclk_audio0" };
6985 const char * sclk_pcm_p = "sclk_pcm0" ;
7086 struct clk * pll_ref , * pll_in , * cdclk , * sclk_audio , * sclk_pcm_in ;
87+ const struct of_device_id * match ;
88+ enum exynos_audss_clk_type variant ;
89+
90+ match = of_match_node (exynos_audss_clk_of_match , pdev -> dev .of_node );
91+ if (!match )
92+ return - EINVAL ;
93+ variant = (enum exynos_audss_clk_type )match -> data ;
7194
7295 res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
7396 reg_base = devm_ioremap_resource (& pdev -> dev , res );
@@ -83,7 +106,10 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
83106 return - ENOMEM ;
84107
85108 clk_data .clks = clk_table ;
86- clk_data .clk_num = EXYNOS_AUDSS_MAX_CLKS ;
109+ if (variant == TYPE_EXYNOS5420 )
110+ clk_data .clk_num = EXYNOS_AUDSS_MAX_CLKS ;
111+ else
112+ clk_data .clk_num = EXYNOS_AUDSS_MAX_CLKS - 1 ;
87113
88114 pll_ref = devm_clk_get (& pdev -> dev , "pll_ref" );
89115 pll_in = devm_clk_get (& pdev -> dev , "pll_in" );
@@ -142,6 +168,12 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
142168 sclk_pcm_p , CLK_SET_RATE_PARENT ,
143169 reg_base + ASS_CLK_GATE , 5 , 0 , & lock );
144170
171+ if (variant == TYPE_EXYNOS5420 ) {
172+ clk_table [EXYNOS_ADMA ] = clk_register_gate (NULL , "adma" ,
173+ "dout_srp" , CLK_SET_RATE_PARENT ,
174+ reg_base + ASS_CLK_GATE , 9 , 0 , & lock );
175+ }
176+
145177 for (i = 0 ; i < clk_data .clk_num ; i ++ ) {
146178 if (IS_ERR (clk_table [i ])) {
147179 dev_err (& pdev -> dev , "failed to register clock %d\n" , i );
@@ -188,12 +220,6 @@ static int exynos_audss_clk_remove(struct platform_device *pdev)
188220 return 0 ;
189221}
190222
191- static const struct of_device_id exynos_audss_clk_of_match [] = {
192- { .compatible = "samsung,exynos4210-audss-clock" , },
193- { .compatible = "samsung,exynos5250-audss-clock" , },
194- {},
195- };
196-
197223static struct platform_driver exynos_audss_clk_driver = {
198224 .driver = {
199225 .name = "exynos-audss-clk" ,
0 commit comments