diff options
-rw-r--r-- | Documentation/devicetree/bindings/net/can/microchip,mcp25xxfd.txt | 5 | ||||
-rw-r--r-- | drivers/net/can/spi/mcp25xxfd/mcp25xxfd_clock.c | 9 | ||||
-rw-r--r-- | drivers/net/can/spi/mcp25xxfd/mcp25xxfd_priv.h | 1 |
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; |