.. | .. |
---|
52 | 52 | struct clk *clk; |
---|
53 | 53 | spinlock_t lock; /* protect access to IPCC registers */ |
---|
54 | 54 | int irqs[IPCC_IRQ_NUM]; |
---|
55 | | - int wkp; |
---|
56 | 55 | u32 proc_id; |
---|
57 | 56 | u32 n_chans; |
---|
58 | 57 | u32 xcr; |
---|
.. | .. |
---|
282 | 281 | |
---|
283 | 282 | /* wakeup */ |
---|
284 | 283 | if (of_property_read_bool(np, "wakeup-source")) { |
---|
285 | | - ipcc->wkp = platform_get_irq_byname(pdev, "wakeup"); |
---|
286 | | - if (ipcc->wkp < 0) { |
---|
287 | | - if (ipcc->wkp != -EPROBE_DEFER) |
---|
288 | | - dev_err(dev, "could not get wakeup IRQ\n"); |
---|
289 | | - ret = ipcc->wkp; |
---|
290 | | - goto err_clk; |
---|
291 | | - } |
---|
| 284 | + device_set_wakeup_capable(dev, true); |
---|
292 | 285 | |
---|
293 | | - device_init_wakeup(dev, true); |
---|
294 | | - ret = dev_pm_set_dedicated_wake_irq(dev, ipcc->wkp); |
---|
| 286 | + ret = dev_pm_set_wake_irq(dev, ipcc->irqs[IPCC_IRQ_RX]); |
---|
295 | 287 | if (ret) { |
---|
296 | 288 | dev_err(dev, "Failed to set wake up irq\n"); |
---|
297 | 289 | goto err_init_wkp; |
---|
298 | 290 | } |
---|
299 | | - } else { |
---|
300 | | - device_init_wakeup(dev, false); |
---|
301 | 291 | } |
---|
302 | 292 | |
---|
303 | 293 | /* mailbox controller */ |
---|
.. | .. |
---|
319 | 309 | for (i = 0; i < ipcc->controller.num_chans; i++) |
---|
320 | 310 | ipcc->controller.chans[i].con_priv = (void *)i; |
---|
321 | 311 | |
---|
322 | | - ret = mbox_controller_register(&ipcc->controller); |
---|
| 312 | + ret = devm_mbox_controller_register(dev, &ipcc->controller); |
---|
323 | 313 | if (ret) |
---|
324 | 314 | goto err_irq_wkp; |
---|
325 | 315 | |
---|
.. | .. |
---|
336 | 326 | return 0; |
---|
337 | 327 | |
---|
338 | 328 | err_irq_wkp: |
---|
339 | | - if (ipcc->wkp) |
---|
| 329 | + if (of_property_read_bool(np, "wakeup-source")) |
---|
340 | 330 | dev_pm_clear_wake_irq(dev); |
---|
341 | 331 | err_init_wkp: |
---|
342 | | - device_init_wakeup(dev, false); |
---|
| 332 | + device_set_wakeup_capable(dev, false); |
---|
343 | 333 | err_clk: |
---|
344 | 334 | clk_disable_unprepare(ipcc->clk); |
---|
345 | 335 | return ret; |
---|
.. | .. |
---|
347 | 337 | |
---|
348 | 338 | static int stm32_ipcc_remove(struct platform_device *pdev) |
---|
349 | 339 | { |
---|
350 | | - struct stm32_ipcc *ipcc = platform_get_drvdata(pdev); |
---|
| 340 | + struct device *dev = &pdev->dev; |
---|
351 | 341 | |
---|
352 | | - mbox_controller_unregister(&ipcc->controller); |
---|
353 | | - |
---|
354 | | - if (ipcc->wkp) |
---|
| 342 | + if (of_property_read_bool(dev->of_node, "wakeup-source")) |
---|
355 | 343 | dev_pm_clear_wake_irq(&pdev->dev); |
---|
356 | 344 | |
---|
357 | | - device_init_wakeup(&pdev->dev, false); |
---|
| 345 | + device_set_wakeup_capable(dev, false); |
---|
358 | 346 | |
---|
359 | 347 | return 0; |
---|
360 | 348 | } |
---|
361 | 349 | |
---|
362 | 350 | #ifdef CONFIG_PM_SLEEP |
---|
363 | | -static void stm32_ipcc_set_irq_wake(struct device *dev, bool enable) |
---|
364 | | -{ |
---|
365 | | - struct stm32_ipcc *ipcc = dev_get_drvdata(dev); |
---|
366 | | - unsigned int i; |
---|
367 | | - |
---|
368 | | - if (device_may_wakeup(dev)) |
---|
369 | | - for (i = 0; i < IPCC_IRQ_NUM; i++) |
---|
370 | | - irq_set_irq_wake(ipcc->irqs[i], enable); |
---|
371 | | -} |
---|
372 | | - |
---|
373 | 351 | static int stm32_ipcc_suspend(struct device *dev) |
---|
374 | 352 | { |
---|
375 | 353 | struct stm32_ipcc *ipcc = dev_get_drvdata(dev); |
---|
.. | .. |
---|
377 | 355 | ipcc->xmr = readl_relaxed(ipcc->reg_proc + IPCC_XMR); |
---|
378 | 356 | ipcc->xcr = readl_relaxed(ipcc->reg_proc + IPCC_XCR); |
---|
379 | 357 | |
---|
380 | | - stm32_ipcc_set_irq_wake(dev, true); |
---|
381 | | - |
---|
382 | 358 | return 0; |
---|
383 | 359 | } |
---|
384 | 360 | |
---|
385 | 361 | static int stm32_ipcc_resume(struct device *dev) |
---|
386 | 362 | { |
---|
387 | 363 | struct stm32_ipcc *ipcc = dev_get_drvdata(dev); |
---|
388 | | - |
---|
389 | | - stm32_ipcc_set_irq_wake(dev, false); |
---|
390 | 364 | |
---|
391 | 365 | writel_relaxed(ipcc->xmr, ipcc->reg_proc + IPCC_XMR); |
---|
392 | 366 | writel_relaxed(ipcc->xcr, ipcc->reg_proc + IPCC_XCR); |
---|