summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Krummenacher <max.krummenacher@toradex.com>2019-11-21 20:04:36 +0100
committerMax Krummenacher <max.krummenacher@toradex.com>2019-12-02 14:22:42 +0100
commit797a01e26e044709c1ed985f698badd5f868a059 (patch)
treefbd3eac23163a996d63afe175f08dfc7cc305275
parent1d067ee045c0f2e34d94a8cae7f34bf5355251c4 (diff)
can: mcp25xxfd: allow to keep the clock allways on
This allows to have a clock on clko even if the controller is disabled. Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
-rw-r--r--Documentation/devicetree/bindings/net/can/microchip,mcp25xxfd.txt5
-rw-r--r--drivers/net/can/spi/mcp25xxfd/mcp25xxfd_clock.c9
-rw-r--r--drivers/net/can/spi/mcp25xxfd/mcp25xxfd_priv.h1
3 files changed, 14 insertions, 1 deletions
diff --git a/Documentation/devicetree/bindings/net/can/microchip,mcp25xxfd.txt b/Documentation/devicetree/bindings/net/can/microchip,mcp25xxfd.txt
index d53754d6d2a4..33c5c28f1455 100644
--- a/Documentation/devicetree/bindings/net/can/microchip,mcp25xxfd.txt
+++ b/Documentation/devicetree/bindings/net/can/microchip,mcp25xxfd.txt
@@ -16,6 +16,11 @@ Optional properties:
- microchip,clock-out-div = <0|1|2|4|10>: Clock output pin divider
0 = Start of Frame output
default: 10
+ - microchip,clock-allways-on: bool: Do not disable the clock if CAN
+ is inactive. Thus a clock on the
+ clko pin will not be stopped.
+ This results in a higher standby
+ current.
- microchip,clock-div2: bool: divide the internal clock by 2
- microchip,gpio-open-drain: bool: enable open-drain for all pins
(except cantx)
diff --git a/drivers/net/can/spi/mcp25xxfd/mcp25xxfd_clock.c b/drivers/net/can/spi/mcp25xxfd/mcp25xxfd_clock.c
index e33def233630..32b5888df88e 100644
--- a/drivers/net/can/spi/mcp25xxfd/mcp25xxfd_clock.c
+++ b/drivers/net/can/spi/mcp25xxfd/mcp25xxfd_clock.c
@@ -244,6 +244,10 @@ int mcp25xxfd_clock_stop(struct mcp25xxfd_priv *priv, int requestor_mask)
{
int ret;
+ /* keep the clock on if explicitely configured */
+ if (priv->config.clock_allways_on)
+ return 0;
+
/* without a clock there is nothing we can do... */
if (IS_ERR(priv->clk))
return PTR_ERR(priv->clk);
@@ -366,10 +370,12 @@ static int mcp25xxfd_clock_of_parse(struct mcp25xxfd_priv *priv)
u32 val;
int ret;
- priv->config.clock_div2 = false;
priv->config.clock_div2 =
of_property_read_bool(np, "microchip,clock-div2");
+ priv->config.clock_allways_on =
+ of_property_read_bool(np, "microchip,clock-allways-on");
+
priv->config.clock_odiv = 10;
ret = of_property_read_u32_index(np, "microchip,clock-out-div",
0, &val);
@@ -408,6 +414,7 @@ int mcp25xxfd_clock_init(struct mcp25xxfd_priv *priv)
mutex_init(&priv->clk_user_lock);
priv->config.clock_div2 = false;
+ priv->config.clock_allways_on = false;
priv->config.clock_odiv = 10;
ret = mcp25xxfd_clock_of_parse(priv);
diff --git a/drivers/net/can/spi/mcp25xxfd/mcp25xxfd_priv.h b/drivers/net/can/spi/mcp25xxfd/mcp25xxfd_priv.h
index 33a5192c66a1..ced89e0b9e3c 100644
--- a/drivers/net/can/spi/mcp25xxfd/mcp25xxfd_priv.h
+++ b/drivers/net/can/spi/mcp25xxfd/mcp25xxfd_priv.h
@@ -46,6 +46,7 @@ struct mcp25xxfd_priv {
int clock_pll;
int clock_div2;
int clock_odiv;
+ int clock_allways_on;
/* gpio related */
bool gpio_open_drain;
bool gpio0_xstandby;