diff options
author | Roger Quadros <rogerq@ti.com> | 2014-11-07 09:49:19 -0500 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2014-11-17 06:19:27 -0500 |
commit | 0741bfb9395ad176be91f66d2ef3f6f669e27890 (patch) | |
tree | 13b8dd7257a2be3cad489095b672785ef14229fe | |
parent | 3ff9027ca6b00e194d2eae353febf7233cfcc1ea (diff) |
can: c_can: Add support for START pulse in RAMINIT sequence
Some SoCs e.g. (TI DRA7xx) need a START pulse to start the
RAMINIT sequence i.e. START bit must be set and cleared before
checking for the DONE bit status.
Signed-off-by: Roger Quadros <rogerq@ti.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r-- | drivers/net/can/c_can/c_can.h | 1 | ||||
-rw-r--r-- | drivers/net/can/c_can/c_can_platform.c | 7 |
2 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h index 28a73d14ea8d..8acdc7fa4792 100644 --- a/drivers/net/can/c_can/c_can.h +++ b/drivers/net/can/c_can/c_can.h | |||
@@ -188,6 +188,7 @@ struct c_can_raminit { | |||
188 | struct regmap *syscon; /* for raminit ctrl. reg. access */ | 188 | struct regmap *syscon; /* for raminit ctrl. reg. access */ |
189 | unsigned int reg; /* register index within syscon */ | 189 | unsigned int reg; /* register index within syscon */ |
190 | struct raminit_bits bits; | 190 | struct raminit_bits bits; |
191 | bool needs_pulse; | ||
191 | }; | 192 | }; |
192 | 193 | ||
193 | /* c_can private data structure */ | 194 | /* c_can private data structure */ |
diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c index 1fbfa1d59c29..41fa460c3592 100644 --- a/drivers/net/can/c_can/c_can_platform.c +++ b/drivers/net/can/c_can/c_can_platform.c | |||
@@ -120,6 +120,12 @@ static void c_can_hw_raminit_syscon(const struct c_can_priv *priv, bool enable) | |||
120 | ctrl |= 1 << raminit->bits.start; | 120 | ctrl |= 1 << raminit->bits.start; |
121 | regmap_write(raminit->syscon, raminit->reg, ctrl); | 121 | regmap_write(raminit->syscon, raminit->reg, ctrl); |
122 | 122 | ||
123 | /* clear START bit if start pulse is needed */ | ||
124 | if (raminit->needs_pulse) { | ||
125 | ctrl &= ~(1 << raminit->bits.start); | ||
126 | regmap_write(raminit->syscon, raminit->reg, ctrl); | ||
127 | } | ||
128 | |||
123 | ctrl |= 1 << raminit->bits.done; | 129 | ctrl |= 1 << raminit->bits.done; |
124 | c_can_hw_raminit_wait_syscon(priv, mask, ctrl); | 130 | c_can_hw_raminit_wait_syscon(priv, mask, ctrl); |
125 | } | 131 | } |
@@ -325,6 +331,7 @@ static int c_can_plat_probe(struct platform_device *pdev) | |||
325 | } | 331 | } |
326 | 332 | ||
327 | raminit->bits = drvdata->raminit_bits[id]; | 333 | raminit->bits = drvdata->raminit_bits[id]; |
334 | raminit->needs_pulse = drvdata->raminit_pulse; | ||
328 | 335 | ||
329 | priv->raminit = c_can_hw_raminit_syscon; | 336 | priv->raminit = c_can_hw_raminit_syscon; |
330 | } else { | 337 | } else { |