diff options
Diffstat (limited to 'drivers/net/can/mcp251x.c')
-rw-r--r-- | drivers/net/can/mcp251x.c | 65 |
1 files changed, 27 insertions, 38 deletions
diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c index 9aa0c64c33c8..8cda23bf0614 100644 --- a/drivers/net/can/mcp251x.c +++ b/drivers/net/can/mcp251x.c | |||
@@ -269,7 +269,7 @@ struct mcp251x_priv { | |||
269 | #define MCP251X_IS(_model) \ | 269 | #define MCP251X_IS(_model) \ |
270 | static inline int mcp251x_is_##_model(struct spi_device *spi) \ | 270 | static inline int mcp251x_is_##_model(struct spi_device *spi) \ |
271 | { \ | 271 | { \ |
272 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); \ | 272 | struct mcp251x_priv *priv = spi_get_drvdata(spi); \ |
273 | return priv->model == CAN_MCP251X_MCP##_model; \ | 273 | return priv->model == CAN_MCP251X_MCP##_model; \ |
274 | } | 274 | } |
275 | 275 | ||
@@ -305,7 +305,7 @@ static void mcp251x_clean(struct net_device *net) | |||
305 | */ | 305 | */ |
306 | static int mcp251x_spi_trans(struct spi_device *spi, int len) | 306 | static int mcp251x_spi_trans(struct spi_device *spi, int len) |
307 | { | 307 | { |
308 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 308 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
309 | struct spi_transfer t = { | 309 | struct spi_transfer t = { |
310 | .tx_buf = priv->spi_tx_buf, | 310 | .tx_buf = priv->spi_tx_buf, |
311 | .rx_buf = priv->spi_rx_buf, | 311 | .rx_buf = priv->spi_rx_buf, |
@@ -333,7 +333,7 @@ static int mcp251x_spi_trans(struct spi_device *spi, int len) | |||
333 | 333 | ||
334 | static u8 mcp251x_read_reg(struct spi_device *spi, uint8_t reg) | 334 | static u8 mcp251x_read_reg(struct spi_device *spi, uint8_t reg) |
335 | { | 335 | { |
336 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 336 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
337 | u8 val = 0; | 337 | u8 val = 0; |
338 | 338 | ||
339 | priv->spi_tx_buf[0] = INSTRUCTION_READ; | 339 | priv->spi_tx_buf[0] = INSTRUCTION_READ; |
@@ -348,7 +348,7 @@ static u8 mcp251x_read_reg(struct spi_device *spi, uint8_t reg) | |||
348 | static void mcp251x_read_2regs(struct spi_device *spi, uint8_t reg, | 348 | static void mcp251x_read_2regs(struct spi_device *spi, uint8_t reg, |
349 | uint8_t *v1, uint8_t *v2) | 349 | uint8_t *v1, uint8_t *v2) |
350 | { | 350 | { |
351 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 351 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
352 | 352 | ||
353 | priv->spi_tx_buf[0] = INSTRUCTION_READ; | 353 | priv->spi_tx_buf[0] = INSTRUCTION_READ; |
354 | priv->spi_tx_buf[1] = reg; | 354 | priv->spi_tx_buf[1] = reg; |
@@ -361,7 +361,7 @@ static void mcp251x_read_2regs(struct spi_device *spi, uint8_t reg, | |||
361 | 361 | ||
362 | static void mcp251x_write_reg(struct spi_device *spi, u8 reg, uint8_t val) | 362 | static void mcp251x_write_reg(struct spi_device *spi, u8 reg, uint8_t val) |
363 | { | 363 | { |
364 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 364 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
365 | 365 | ||
366 | priv->spi_tx_buf[0] = INSTRUCTION_WRITE; | 366 | priv->spi_tx_buf[0] = INSTRUCTION_WRITE; |
367 | priv->spi_tx_buf[1] = reg; | 367 | priv->spi_tx_buf[1] = reg; |
@@ -373,7 +373,7 @@ static void mcp251x_write_reg(struct spi_device *spi, u8 reg, uint8_t val) | |||
373 | static void mcp251x_write_bits(struct spi_device *spi, u8 reg, | 373 | static void mcp251x_write_bits(struct spi_device *spi, u8 reg, |
374 | u8 mask, uint8_t val) | 374 | u8 mask, uint8_t val) |
375 | { | 375 | { |
376 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 376 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
377 | 377 | ||
378 | priv->spi_tx_buf[0] = INSTRUCTION_BIT_MODIFY; | 378 | priv->spi_tx_buf[0] = INSTRUCTION_BIT_MODIFY; |
379 | priv->spi_tx_buf[1] = reg; | 379 | priv->spi_tx_buf[1] = reg; |
@@ -386,7 +386,7 @@ static void mcp251x_write_bits(struct spi_device *spi, u8 reg, | |||
386 | static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, | 386 | static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, |
387 | int len, int tx_buf_idx) | 387 | int len, int tx_buf_idx) |
388 | { | 388 | { |
389 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 389 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
390 | 390 | ||
391 | if (mcp251x_is_2510(spi)) { | 391 | if (mcp251x_is_2510(spi)) { |
392 | int i; | 392 | int i; |
@@ -403,7 +403,7 @@ static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, | |||
403 | static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, | 403 | static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, |
404 | int tx_buf_idx) | 404 | int tx_buf_idx) |
405 | { | 405 | { |
406 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 406 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
407 | u32 sid, eid, exide, rtr; | 407 | u32 sid, eid, exide, rtr; |
408 | u8 buf[SPI_TRANSFER_BUF_LEN]; | 408 | u8 buf[SPI_TRANSFER_BUF_LEN]; |
409 | 409 | ||
@@ -434,7 +434,7 @@ static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, | |||
434 | static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, | 434 | static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, |
435 | int buf_idx) | 435 | int buf_idx) |
436 | { | 436 | { |
437 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 437 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
438 | 438 | ||
439 | if (mcp251x_is_2510(spi)) { | 439 | if (mcp251x_is_2510(spi)) { |
440 | int i, len; | 440 | int i, len; |
@@ -454,7 +454,7 @@ static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, | |||
454 | 454 | ||
455 | static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx) | 455 | static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx) |
456 | { | 456 | { |
457 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 457 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
458 | struct sk_buff *skb; | 458 | struct sk_buff *skb; |
459 | struct can_frame *frame; | 459 | struct can_frame *frame; |
460 | u8 buf[SPI_TRANSFER_BUF_LEN]; | 460 | u8 buf[SPI_TRANSFER_BUF_LEN]; |
@@ -550,7 +550,7 @@ static int mcp251x_do_set_mode(struct net_device *net, enum can_mode mode) | |||
550 | 550 | ||
551 | static int mcp251x_set_normal_mode(struct spi_device *spi) | 551 | static int mcp251x_set_normal_mode(struct spi_device *spi) |
552 | { | 552 | { |
553 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 553 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
554 | unsigned long timeout; | 554 | unsigned long timeout; |
555 | 555 | ||
556 | /* Enable interrupts */ | 556 | /* Enable interrupts */ |
@@ -620,7 +620,7 @@ static int mcp251x_setup(struct net_device *net, struct mcp251x_priv *priv, | |||
620 | 620 | ||
621 | static int mcp251x_hw_reset(struct spi_device *spi) | 621 | static int mcp251x_hw_reset(struct spi_device *spi) |
622 | { | 622 | { |
623 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 623 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
624 | int ret; | 624 | int ret; |
625 | unsigned long timeout; | 625 | unsigned long timeout; |
626 | 626 | ||
@@ -1026,7 +1026,7 @@ static int mcp251x_can_probe(struct spi_device *spi) | |||
1026 | CAN_CTRLMODE_LOOPBACK | CAN_CTRLMODE_LISTENONLY; | 1026 | CAN_CTRLMODE_LOOPBACK | CAN_CTRLMODE_LISTENONLY; |
1027 | priv->model = spi_get_device_id(spi)->driver_data; | 1027 | priv->model = spi_get_device_id(spi)->driver_data; |
1028 | priv->net = net; | 1028 | priv->net = net; |
1029 | dev_set_drvdata(&spi->dev, priv); | 1029 | spi_set_drvdata(spi, priv); |
1030 | 1030 | ||
1031 | priv->spi = spi; | 1031 | priv->spi = spi; |
1032 | mutex_init(&priv->mcp_lock); | 1032 | mutex_init(&priv->mcp_lock); |
@@ -1124,7 +1124,7 @@ error_out: | |||
1124 | static int mcp251x_can_remove(struct spi_device *spi) | 1124 | static int mcp251x_can_remove(struct spi_device *spi) |
1125 | { | 1125 | { |
1126 | struct mcp251x_platform_data *pdata = spi->dev.platform_data; | 1126 | struct mcp251x_platform_data *pdata = spi->dev.platform_data; |
1127 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 1127 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
1128 | struct net_device *net = priv->net; | 1128 | struct net_device *net = priv->net; |
1129 | 1129 | ||
1130 | unregister_candev(net); | 1130 | unregister_candev(net); |
@@ -1144,11 +1144,13 @@ static int mcp251x_can_remove(struct spi_device *spi) | |||
1144 | return 0; | 1144 | return 0; |
1145 | } | 1145 | } |
1146 | 1146 | ||
1147 | #ifdef CONFIG_PM | 1147 | #ifdef CONFIG_PM_SLEEP |
1148 | static int mcp251x_can_suspend(struct spi_device *spi, pm_message_t state) | 1148 | |
1149 | static int mcp251x_can_suspend(struct device *dev) | ||
1149 | { | 1150 | { |
1151 | struct spi_device *spi = to_spi_device(dev); | ||
1150 | struct mcp251x_platform_data *pdata = spi->dev.platform_data; | 1152 | struct mcp251x_platform_data *pdata = spi->dev.platform_data; |
1151 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 1153 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
1152 | struct net_device *net = priv->net; | 1154 | struct net_device *net = priv->net; |
1153 | 1155 | ||
1154 | priv->force_quit = 1; | 1156 | priv->force_quit = 1; |
@@ -1176,10 +1178,11 @@ static int mcp251x_can_suspend(struct spi_device *spi, pm_message_t state) | |||
1176 | return 0; | 1178 | return 0; |
1177 | } | 1179 | } |
1178 | 1180 | ||
1179 | static int mcp251x_can_resume(struct spi_device *spi) | 1181 | static int mcp251x_can_resume(struct device *dev) |
1180 | { | 1182 | { |
1183 | struct spi_device *spi = to_spi_device(dev); | ||
1181 | struct mcp251x_platform_data *pdata = spi->dev.platform_data; | 1184 | struct mcp251x_platform_data *pdata = spi->dev.platform_data; |
1182 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 1185 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
1183 | 1186 | ||
1184 | if (priv->after_suspend & AFTER_SUSPEND_POWER) { | 1187 | if (priv->after_suspend & AFTER_SUSPEND_POWER) { |
1185 | pdata->power_enable(1); | 1188 | pdata->power_enable(1); |
@@ -1197,11 +1200,11 @@ static int mcp251x_can_resume(struct spi_device *spi) | |||
1197 | enable_irq(spi->irq); | 1200 | enable_irq(spi->irq); |
1198 | return 0; | 1201 | return 0; |
1199 | } | 1202 | } |
1200 | #else | ||
1201 | #define mcp251x_can_suspend NULL | ||
1202 | #define mcp251x_can_resume NULL | ||
1203 | #endif | 1203 | #endif |
1204 | 1204 | ||
1205 | static SIMPLE_DEV_PM_OPS(mcp251x_can_pm_ops, mcp251x_can_suspend, | ||
1206 | mcp251x_can_resume); | ||
1207 | |||
1205 | static const struct spi_device_id mcp251x_id_table[] = { | 1208 | static const struct spi_device_id mcp251x_id_table[] = { |
1206 | { "mcp2510", CAN_MCP251X_MCP2510 }, | 1209 | { "mcp2510", CAN_MCP251X_MCP2510 }, |
1207 | { "mcp2515", CAN_MCP251X_MCP2515 }, | 1210 | { "mcp2515", CAN_MCP251X_MCP2515 }, |
@@ -1213,29 +1216,15 @@ MODULE_DEVICE_TABLE(spi, mcp251x_id_table); | |||
1213 | static struct spi_driver mcp251x_can_driver = { | 1216 | static struct spi_driver mcp251x_can_driver = { |
1214 | .driver = { | 1217 | .driver = { |
1215 | .name = DEVICE_NAME, | 1218 | .name = DEVICE_NAME, |
1216 | .bus = &spi_bus_type, | ||
1217 | .owner = THIS_MODULE, | 1219 | .owner = THIS_MODULE, |
1220 | .pm = &mcp251x_can_pm_ops, | ||
1218 | }, | 1221 | }, |
1219 | 1222 | ||
1220 | .id_table = mcp251x_id_table, | 1223 | .id_table = mcp251x_id_table, |
1221 | .probe = mcp251x_can_probe, | 1224 | .probe = mcp251x_can_probe, |
1222 | .remove = mcp251x_can_remove, | 1225 | .remove = mcp251x_can_remove, |
1223 | .suspend = mcp251x_can_suspend, | ||
1224 | .resume = mcp251x_can_resume, | ||
1225 | }; | 1226 | }; |
1226 | 1227 | module_spi_driver(mcp251x_can_driver); | |
1227 | static int __init mcp251x_can_init(void) | ||
1228 | { | ||
1229 | return spi_register_driver(&mcp251x_can_driver); | ||
1230 | } | ||
1231 | |||
1232 | static void __exit mcp251x_can_exit(void) | ||
1233 | { | ||
1234 | spi_unregister_driver(&mcp251x_can_driver); | ||
1235 | } | ||
1236 | |||
1237 | module_init(mcp251x_can_init); | ||
1238 | module_exit(mcp251x_can_exit); | ||
1239 | 1228 | ||
1240 | MODULE_AUTHOR("Chris Elston <celston@katalix.com>, " | 1229 | MODULE_AUTHOR("Chris Elston <celston@katalix.com>, " |
1241 | "Christian Pellegrin <chripell@evolware.org>"); | 1230 | "Christian Pellegrin <chripell@evolware.org>"); |