802-can-0025-can-flexcan-add-LPSR-mode-support-for-i.MX7D.patch 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. From 211c20a459a0fd4868ed22ecfc2b2186d9df6da0 Mon Sep 17 00:00:00 2001
  2. From: Joakim Zhang <[email protected]>
  3. Date: Tue, 30 Jul 2019 14:43:25 +0800
  4. Subject: [PATCH] can: flexcan: add LPSR mode support for i.MX7D
  5. For i.MX7D LPSR mode, the controller will lost power and got the
  6. configuration state lost after system resume back.
  7. So we need to set pinctrl state again and re-start chip to do
  8. re-configuration after resume.
  9. For wakeup case, it should not set pinctrl to sleep state by
  10. pinctrl_pm_select_sleep_state.
  11. For interface is not up before suspend case, we don't need
  12. re-configure as it will be configured by user later by interface up.
  13. Signed-off-by: Joakim Zhang <[email protected]>
  14. ---
  15. drivers/net/can/flexcan.c | 21 ++++++++++++++-------
  16. 1 file changed, 14 insertions(+), 7 deletions(-)
  17. --- a/drivers/net/can/flexcan.c
  18. +++ b/drivers/net/can/flexcan.c
  19. @@ -26,6 +26,7 @@
  20. #include <linux/platform_device.h>
  21. #include <linux/pm_runtime.h>
  22. #include <linux/regulator/consumer.h>
  23. +#include <linux/pinctrl/consumer.h>
  24. #include <linux/regmap.h>
  25. #define DRV_NAME "flexcan"
  26. @@ -1942,7 +1943,7 @@ static int __maybe_unused flexcan_suspen
  27. {
  28. struct net_device *dev = dev_get_drvdata(device);
  29. struct flexcan_priv *priv = netdev_priv(dev);
  30. - int err = 0;
  31. + int err;
  32. if (netif_running(dev)) {
  33. /* if wakeup is enabled, enter stop mode
  34. @@ -1954,25 +1955,27 @@ static int __maybe_unused flexcan_suspen
  35. if (err)
  36. return err;
  37. } else {
  38. - err = flexcan_chip_disable(priv);
  39. + flexcan_chip_stop(dev);
  40. +
  41. + err = pm_runtime_force_suspend(device);
  42. if (err)
  43. return err;
  44. - err = pm_runtime_force_suspend(device);
  45. + pinctrl_pm_select_sleep_state(device);
  46. }
  47. netif_stop_queue(dev);
  48. netif_device_detach(dev);
  49. }
  50. priv->can.state = CAN_STATE_SLEEPING;
  51. - return err;
  52. + return 0;
  53. }
  54. static int __maybe_unused flexcan_resume(struct device *device)
  55. {
  56. struct net_device *dev = dev_get_drvdata(device);
  57. struct flexcan_priv *priv = netdev_priv(dev);
  58. - int err = 0;
  59. + int err;
  60. priv->can.state = CAN_STATE_ERROR_ACTIVE;
  61. if (netif_running(dev)) {
  62. @@ -1984,15 +1987,19 @@ static int __maybe_unused flexcan_resume
  63. if (err)
  64. return err;
  65. } else {
  66. + pinctrl_pm_select_default_state(device);
  67. +
  68. err = pm_runtime_force_resume(device);
  69. if (err)
  70. return err;
  71. - err = flexcan_chip_enable(priv);
  72. + err = flexcan_chip_start(dev);
  73. + if (err)
  74. + return err;
  75. }
  76. }
  77. - return err;
  78. + return 0;
  79. }
  80. static int __maybe_unused flexcan_runtime_suspend(struct device *device)