aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can/mcp251x.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/can/mcp251x.c')
-rw-r--r--drivers/net/can/mcp251x.c65
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) \
270static inline int mcp251x_is_##_model(struct spi_device *spi) \ 270static 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 */
306static int mcp251x_spi_trans(struct spi_device *spi, int len) 306static 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
334static u8 mcp251x_read_reg(struct spi_device *spi, uint8_t reg) 334static 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)
348static void mcp251x_read_2regs(struct spi_device *spi, uint8_t reg, 348static 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
362static void mcp251x_write_reg(struct spi_device *spi, u8 reg, uint8_t val) 362static 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)
373static void mcp251x_write_bits(struct spi_device *spi, u8 reg, 373static 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,
386static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, 386static 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,
403static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, 403static 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,
434static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, 434static 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
455static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx) 455static 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
551static int mcp251x_set_normal_mode(struct spi_device *spi) 551static 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
621static int mcp251x_hw_reset(struct spi_device *spi) 621static 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:
1124static int mcp251x_can_remove(struct spi_device *spi) 1124static 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
1148static int mcp251x_can_suspend(struct spi_device *spi, pm_message_t state) 1148
1149static 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
1179static int mcp251x_can_resume(struct spi_device *spi) 1181static 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
1205static SIMPLE_DEV_PM_OPS(mcp251x_can_pm_ops, mcp251x_can_suspend,
1206 mcp251x_can_resume);
1207
1205static const struct spi_device_id mcp251x_id_table[] = { 1208static 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);
1213static struct spi_driver mcp251x_can_driver = { 1216static 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 1227module_spi_driver(mcp251x_can_driver);
1227static int __init mcp251x_can_init(void)
1228{
1229 return spi_register_driver(&mcp251x_can_driver);
1230}
1231
1232static void __exit mcp251x_can_exit(void)
1233{
1234 spi_unregister_driver(&mcp251x_can_driver);
1235}
1236
1237module_init(mcp251x_can_init);
1238module_exit(mcp251x_can_exit);
1239 1228
1240MODULE_AUTHOR("Chris Elston <celston@katalix.com>, " 1229MODULE_AUTHOR("Chris Elston <celston@katalix.com>, "
1241 "Christian Pellegrin <chripell@evolware.org>"); 1230 "Christian Pellegrin <chripell@evolware.org>");