|
@@ -35,6 +35,7 @@
|
|
|
#include <linux/list.h>
|
|
|
#include <linux/io.h>
|
|
|
#include <linux/pm_runtime.h>
|
|
|
+#include <linux/pinctrl/consumer.h>
|
|
|
|
|
|
#include <linux/can.h>
|
|
|
#include <linux/can/dev.h>
|
|
@@ -603,6 +604,8 @@ static int c_can_start(struct net_device *dev)
|
|
|
|
|
|
priv->can.state = CAN_STATE_ERROR_ACTIVE;
|
|
|
|
|
|
+ /* activate pins */
|
|
|
+ pinctrl_pm_select_default_state(dev->dev.parent);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -611,6 +614,9 @@ static void c_can_stop(struct net_device *dev)
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
c_can_irq_control(priv, false);
|
|
|
+
|
|
|
+ /* deactivate pins */
|
|
|
+ pinctrl_pm_select_sleep_state(dev->dev.parent);
|
|
|
priv->can.state = CAN_STATE_STOPPED;
|
|
|
}
|
|
|
|
|
@@ -1244,6 +1250,13 @@ int register_c_can_dev(struct net_device *dev)
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
int err;
|
|
|
|
|
|
+ /* Deactivate pins to prevent DRA7 DCAN IP from being
|
|
|
+ * stuck in transition when module is disabled.
|
|
|
+ * Pins are activated in c_can_start() and deactivated
|
|
|
+ * in c_can_stop()
|
|
|
+ */
|
|
|
+ pinctrl_pm_select_sleep_state(dev->dev.parent);
|
|
|
+
|
|
|
c_can_pm_runtime_enable(priv);
|
|
|
|
|
|
dev->flags |= IFF_ECHO; /* we support local echo */
|