can: Proper ctrlmode handling for CAN devices
This patch adds error checking of ctrlmode values for CAN devices. As an example all availabe bits are implemented in the mcp251x driver. Signed-off-by: Christian Pellegrin <chripell@fsfe.org> Acked-by: Wolfgang Grandegger <wg@grandegger.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
1954dc1177
commit
ad72c347e5
@@ -539,9 +539,14 @@ static void mcp251x_set_normal_mode(struct spi_device *spi)
|
||||
if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) {
|
||||
/* Put device into loopback mode */
|
||||
mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK);
|
||||
} else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) {
|
||||
/* Put device into listen-only mode */
|
||||
mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LISTEN_ONLY);
|
||||
} else {
|
||||
/* Put device into normal mode */
|
||||
mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL);
|
||||
mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL |
|
||||
(priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT ?
|
||||
CANCTRL_OSM : 0));
|
||||
|
||||
/* Wait for the device to enter normal mode */
|
||||
timeout = jiffies + HZ;
|
||||
@@ -948,6 +953,10 @@ static int __devinit mcp251x_can_probe(struct spi_device *spi)
|
||||
priv->can.bittiming_const = &mcp251x_bittiming_const;
|
||||
priv->can.do_set_mode = mcp251x_do_set_mode;
|
||||
priv->can.clock.freq = pdata->oscillator_frequency / 2;
|
||||
priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES |
|
||||
CAN_CTRLMODE_LOOPBACK | CAN_CTRLMODE_LISTENONLY;
|
||||
if (pdata->model == CAN_MCP251X_MCP2515)
|
||||
priv->can.ctrlmode_supported |= CAN_CTRLMODE_ONE_SHOT;
|
||||
priv->net = net;
|
||||
dev_set_drvdata(&spi->dev, priv);
|
||||
|
||||
|
Reference in New Issue
Block a user