@@ -129,6 +129,8 @@ static void pruss_cleanup(struct device *dev, struct uio_pruss_dev *gdev)
129129 clk_disable (gdev -> pruss_clk );
130130 clk_put (gdev -> pruss_clk );
131131 kfree (gdev );
132+ pm_runtime_put (dev );
133+ pm_runtime_disable (dev );
132134}
133135
134136static int pruss_probe (struct platform_device * pdev )
@@ -155,15 +157,25 @@ static int pruss_probe(struct platform_device *pdev)
155157 kfree (gdev );
156158 return - ENOMEM ;
157159 }
160+
161+ pm_runtime_enable (dev );
162+ ret = pm_runtime_get_sync (dev );
163+ if (ret < 0 ) {
164+ dev_err (dev , "pm_runtime_get_sync() failed\n" );
165+ pm_runtime_disable (dev );
166+ kfree (gdev -> info );
167+ kfree (gdev );
168+ return ret ;
169+ }
170+
158171#ifdef CONFIG_ARCH_DAVINCI_DA850
159172 /* Power on PRU in case its not done as part of boot-loader */
160173 gdev -> pruss_clk = clk_get (dev , "pruss" );
161174 if (IS_ERR (gdev -> pruss_clk )) {
162175 dev_err (dev , "Failed to get clock\n" );
163176 ret = PTR_ERR (gdev -> pruss_clk );
164- kfree (gdev -> info );
165- kfree (gdev );
166- return ret ;
177+ gdev -> pruss_clk = NULL ;
178+ goto out_free ;
167179 } else {
168180 ret = clk_enable (gdev -> pruss_clk );
169181 if (ret ) {
@@ -177,17 +189,10 @@ static int pruss_probe(struct platform_device *pdev)
177189#endif
178190
179191 if (dev -> of_node ) {
180- pm_runtime_enable (dev );
181- ret = pm_runtime_get_sync (dev );
182- if (IS_ERR_VALUE (ret )) {
183- dev_err (dev , "pm_runtime_get_sync() failed\n" );
184- return ret ;
185- }
186-
187192 ret = of_address_to_resource (dev -> of_node , 0 , & res );
188193 if (IS_ERR_VALUE (ret )) {
189194 dev_err (dev , "failed to parse DT reg\n" );
190- return ret ;
195+ goto out_free ;
191196 }
192197 regs_prussio = & res ;
193198 } else {
0 commit comments