1717#include "qcom_wcnss.h"
1818
1919struct qcom_iris {
20- struct device * dev ;
20+ struct device dev ;
2121
2222 struct clk * xo_clk ;
2323
@@ -75,7 +75,7 @@ int qcom_iris_enable(struct qcom_iris *iris)
7575
7676 ret = clk_prepare_enable (iris -> xo_clk );
7777 if (ret ) {
78- dev_err (iris -> dev , "failed to enable xo clk\n" );
78+ dev_err (& iris -> dev , "failed to enable xo clk\n" );
7979 goto disable_regulators ;
8080 }
8181
@@ -93,43 +93,90 @@ void qcom_iris_disable(struct qcom_iris *iris)
9393 regulator_bulk_disable (iris -> num_vregs , iris -> vregs );
9494}
9595
96- static int qcom_iris_probe (struct platform_device * pdev )
96+ static const struct of_device_id iris_of_match [] = {
97+ { .compatible = "qcom,wcn3620" , .data = & wcn3620_data },
98+ { .compatible = "qcom,wcn3660" , .data = & wcn3660_data },
99+ { .compatible = "qcom,wcn3660b" , .data = & wcn3680_data },
100+ { .compatible = "qcom,wcn3680" , .data = & wcn3680_data },
101+ {}
102+ };
103+
104+ static void qcom_iris_release (struct device * dev )
105+ {
106+ struct qcom_iris * iris = container_of (dev , struct qcom_iris , dev );
107+
108+ of_node_put (iris -> dev .of_node );
109+ kfree (iris );
110+ }
111+
112+ struct qcom_iris * qcom_iris_probe (struct device * parent , bool * use_48mhz_xo )
97113{
114+ const struct of_device_id * match ;
98115 const struct iris_data * data ;
99- struct qcom_wcnss * wcnss ;
116+ struct device_node * of_node ;
100117 struct qcom_iris * iris ;
101118 int ret ;
102119 int i ;
103120
104- iris = devm_kzalloc (& pdev -> dev , sizeof (struct qcom_iris ), GFP_KERNEL );
105- if (!iris )
106- return - ENOMEM ;
121+ of_node = of_get_child_by_name (parent -> of_node , "iris" );
122+ if (!of_node ) {
123+ dev_err (parent , "No child node \"iris\" found\n" );
124+ return ERR_PTR (- EINVAL );
125+ }
126+
127+ iris = kzalloc (sizeof (* iris ), GFP_KERNEL );
128+ if (!iris ) {
129+ of_node_put (of_node );
130+ return ERR_PTR (- ENOMEM );
131+ }
132+
133+ device_initialize (& iris -> dev );
134+ iris -> dev .parent = parent ;
135+ iris -> dev .release = qcom_iris_release ;
136+ iris -> dev .of_node = of_node ;
137+
138+ dev_set_name (& iris -> dev , "%s.iris" , dev_name (parent ));
139+
140+ ret = device_add (& iris -> dev );
141+ if (ret ) {
142+ put_device (& iris -> dev );
143+ return ERR_PTR (ret );
144+ }
145+
146+ match = of_match_device (iris_of_match , & iris -> dev );
147+ if (!match ) {
148+ dev_err (& iris -> dev , "no matching compatible for iris\n" );
149+ ret = - EINVAL ;
150+ goto err_device_del ;
151+ }
107152
108- data = of_device_get_match_data (& pdev -> dev );
109- wcnss = dev_get_drvdata (pdev -> dev .parent );
153+ data = match -> data ;
110154
111- iris -> xo_clk = devm_clk_get (& pdev -> dev , "xo" );
155+ iris -> xo_clk = devm_clk_get (& iris -> dev , "xo" );
112156 if (IS_ERR (iris -> xo_clk )) {
113- if (PTR_ERR (iris -> xo_clk ) != - EPROBE_DEFER )
114- dev_err (& pdev -> dev , "failed to acquire xo clk\n" );
115- return PTR_ERR (iris -> xo_clk );
157+ ret = PTR_ERR (iris -> xo_clk );
158+ if (ret != - EPROBE_DEFER )
159+ dev_err (& iris -> dev , "failed to acquire xo clk\n" );
160+ goto err_device_del ;
116161 }
117162
118163 iris -> num_vregs = data -> num_vregs ;
119- iris -> vregs = devm_kcalloc (& pdev -> dev ,
164+ iris -> vregs = devm_kcalloc (& iris -> dev ,
120165 iris -> num_vregs ,
121166 sizeof (struct regulator_bulk_data ),
122167 GFP_KERNEL );
123- if (!iris -> vregs )
124- return - ENOMEM ;
168+ if (!iris -> vregs ) {
169+ ret = - ENOMEM ;
170+ goto err_device_del ;
171+ }
125172
126173 for (i = 0 ; i < iris -> num_vregs ; i ++ )
127174 iris -> vregs [i ].supply = data -> vregs [i ].name ;
128175
129- ret = devm_regulator_bulk_get (& pdev -> dev , iris -> num_vregs , iris -> vregs );
176+ ret = devm_regulator_bulk_get (& iris -> dev , iris -> num_vregs , iris -> vregs );
130177 if (ret ) {
131- dev_err (& pdev -> dev , "failed to get regulators\n" );
132- return ret ;
178+ dev_err (& iris -> dev , "failed to get regulators\n" );
179+ goto err_device_del ;
133180 }
134181
135182 for (i = 0 ; i < iris -> num_vregs ; i ++ ) {
@@ -143,34 +190,17 @@ static int qcom_iris_probe(struct platform_device *pdev)
143190 data -> vregs [i ].load_uA );
144191 }
145192
146- qcom_wcnss_assign_iris (wcnss , iris , data -> use_48mhz_xo );
147-
148- return 0 ;
149- }
193+ * use_48mhz_xo = data -> use_48mhz_xo ;
150194
151- static int qcom_iris_remove (struct platform_device * pdev )
152- {
153- struct qcom_wcnss * wcnss = dev_get_drvdata (pdev -> dev .parent );
195+ return iris ;
154196
155- qcom_wcnss_assign_iris (wcnss , NULL , false);
197+ err_device_del :
198+ device_del (& iris -> dev );
156199
157- return 0 ;
200+ return ERR_PTR ( ret ) ;
158201}
159202
160- static const struct of_device_id iris_of_match [] = {
161- { .compatible = "qcom,wcn3620" , .data = & wcn3620_data },
162- { .compatible = "qcom,wcn3660" , .data = & wcn3660_data },
163- { .compatible = "qcom,wcn3660b" , .data = & wcn3680_data },
164- { .compatible = "qcom,wcn3680" , .data = & wcn3680_data },
165- {}
166- };
167- MODULE_DEVICE_TABLE (of , iris_of_match );
168-
169- struct platform_driver qcom_iris_driver = {
170- .probe = qcom_iris_probe ,
171- .remove = qcom_iris_remove ,
172- .driver = {
173- .name = "qcom-iris" ,
174- .of_match_table = iris_of_match ,
175- },
176- };
203+ void qcom_iris_remove (struct qcom_iris * iris )
204+ {
205+ device_del (& iris -> dev );
206+ }
0 commit comments