Lines Matching +full:spi +full:- +full:tx +full:- +full:delay +full:- +full:us

2  * CAN bus driver for Microchip 251x CAN Controller with SPI Interface
17 * - Sascha Hauer, Marc Kleine-Budde, Pengutronix
18 * - Simon Kallweit, intefo AG
32 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
65 #include <linux/delay.h>
67 #include <linux/dma-mapping.h>
76 #include <linux/spi/spi.h>
79 /* SPI interface instruction set */
202 * Buffer size required for the largest SPI transfer (i.e., reading a
213 static int mcp251x_enable_dma; /* Enable SPI DMA. Default: 0 (Off) */
215 MODULE_PARM_DESC(mcp251x_enable_dma, "Enable SPI DMA. Default: 0 (Off)");
237 struct spi_device *spi; member
240 struct mutex mcp_lock; /* SPI device lock */
264 static inline int mcp251x_is_##_model(struct spi_device *spi) \
266 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); \
267 return priv->model == CAN_MCP251X_MCP##_model; \
277 if (priv->tx_skb || priv->tx_len) in mcp251x_clean()
278 net->stats.tx_errors++; in mcp251x_clean()
279 if (priv->tx_skb) in mcp251x_clean()
280 dev_kfree_skb(priv->tx_skb); in mcp251x_clean()
281 if (priv->tx_len) in mcp251x_clean()
282 can_free_echo_skb(priv->net, 0); in mcp251x_clean()
283 priv->tx_skb = NULL; in mcp251x_clean()
284 priv->tx_len = 0; in mcp251x_clean()
289 * registers via SPI is not really different conceptually than using
300 static int mcp251x_spi_trans(struct spi_device *spi, int len) in mcp251x_spi_trans() argument
302 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_spi_trans()
304 .tx_buf = priv->spi_tx_buf, in mcp251x_spi_trans()
305 .rx_buf = priv->spi_rx_buf, in mcp251x_spi_trans()
315 t.tx_dma = priv->spi_tx_dma; in mcp251x_spi_trans()
316 t.rx_dma = priv->spi_rx_dma; in mcp251x_spi_trans()
322 ret = spi_sync(spi, &m); in mcp251x_spi_trans()
324 dev_err(&spi->dev, "spi transfer failed: ret = %d\n", ret); in mcp251x_spi_trans()
328 static u8 mcp251x_read_reg(struct spi_device *spi, uint8_t reg) in mcp251x_read_reg() argument
330 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_read_reg()
333 priv->spi_tx_buf[0] = INSTRUCTION_READ; in mcp251x_read_reg()
334 priv->spi_tx_buf[1] = reg; in mcp251x_read_reg()
336 mcp251x_spi_trans(spi, 3); in mcp251x_read_reg()
337 val = priv->spi_rx_buf[2]; in mcp251x_read_reg()
342 static void mcp251x_read_2regs(struct spi_device *spi, uint8_t reg, in mcp251x_read_2regs() argument
345 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_read_2regs()
347 priv->spi_tx_buf[0] = INSTRUCTION_READ; in mcp251x_read_2regs()
348 priv->spi_tx_buf[1] = reg; in mcp251x_read_2regs()
350 mcp251x_spi_trans(spi, 4); in mcp251x_read_2regs()
352 *v1 = priv->spi_rx_buf[2]; in mcp251x_read_2regs()
353 *v2 = priv->spi_rx_buf[3]; in mcp251x_read_2regs()
356 static void mcp251x_write_reg(struct spi_device *spi, u8 reg, uint8_t val) in mcp251x_write_reg() argument
358 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_write_reg()
360 priv->spi_tx_buf[0] = INSTRUCTION_WRITE; in mcp251x_write_reg()
361 priv->spi_tx_buf[1] = reg; in mcp251x_write_reg()
362 priv->spi_tx_buf[2] = val; in mcp251x_write_reg()
364 mcp251x_spi_trans(spi, 3); in mcp251x_write_reg()
367 static void mcp251x_write_bits(struct spi_device *spi, u8 reg, in mcp251x_write_bits() argument
370 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_write_bits()
372 priv->spi_tx_buf[0] = INSTRUCTION_BIT_MODIFY; in mcp251x_write_bits()
373 priv->spi_tx_buf[1] = reg; in mcp251x_write_bits()
374 priv->spi_tx_buf[2] = mask; in mcp251x_write_bits()
375 priv->spi_tx_buf[3] = val; in mcp251x_write_bits()
377 mcp251x_spi_trans(spi, 4); in mcp251x_write_bits()
380 static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, in mcp251x_hw_tx_frame() argument
383 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_hw_tx_frame()
385 if (mcp251x_is_2510(spi)) { in mcp251x_hw_tx_frame()
389 mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx) + i, in mcp251x_hw_tx_frame()
392 memcpy(priv->spi_tx_buf, buf, TXBDAT_OFF + len); in mcp251x_hw_tx_frame()
393 mcp251x_spi_trans(spi, TXBDAT_OFF + len); in mcp251x_hw_tx_frame()
397 static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, in mcp251x_hw_tx() argument
403 exide = (frame->can_id & CAN_EFF_FLAG) ? 1 : 0; /* Extended ID Enable */ in mcp251x_hw_tx()
405 sid = (frame->can_id & CAN_EFF_MASK) >> 18; in mcp251x_hw_tx()
407 sid = frame->can_id & CAN_SFF_MASK; /* Standard ID */ in mcp251x_hw_tx()
408 eid = frame->can_id & CAN_EFF_MASK; /* Extended ID */ in mcp251x_hw_tx()
409 rtr = (frame->can_id & CAN_RTR_FLAG) ? 1 : 0; /* Remote transmission */ in mcp251x_hw_tx()
418 buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc; in mcp251x_hw_tx()
419 memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc); in mcp251x_hw_tx()
420 mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx); in mcp251x_hw_tx()
421 mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx), TXBCTRL_TXREQ); in mcp251x_hw_tx()
424 static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, in mcp251x_hw_rx_frame() argument
427 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_hw_rx_frame()
429 if (mcp251x_is_2510(spi)) { in mcp251x_hw_rx_frame()
433 buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i); in mcp251x_hw_rx_frame()
437 buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i); in mcp251x_hw_rx_frame()
439 priv->spi_tx_buf[RXBCTRL_OFF] = INSTRUCTION_READ_RXB(buf_idx); in mcp251x_hw_rx_frame()
440 mcp251x_spi_trans(spi, SPI_TRANSFER_BUF_LEN); in mcp251x_hw_rx_frame()
441 memcpy(buf, priv->spi_rx_buf, SPI_TRANSFER_BUF_LEN); in mcp251x_hw_rx_frame()
445 static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx) in mcp251x_hw_rx() argument
447 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_hw_rx()
452 skb = alloc_can_skb(priv->net, &frame); in mcp251x_hw_rx()
454 dev_err(&spi->dev, "cannot allocate RX skb\n"); in mcp251x_hw_rx()
455 priv->net->stats.rx_dropped++; in mcp251x_hw_rx()
459 mcp251x_hw_rx_frame(spi, buf, buf_idx); in mcp251x_hw_rx()
462 frame->can_id = CAN_EFF_FLAG; in mcp251x_hw_rx()
463 frame->can_id |= in mcp251x_hw_rx()
473 frame->can_id |= CAN_RTR_FLAG; in mcp251x_hw_rx()
476 frame->can_id = in mcp251x_hw_rx()
480 frame->can_id |= CAN_RTR_FLAG; in mcp251x_hw_rx()
483 frame->can_dlc = get_can_dlc(buf[RXBDLC_OFF] & RXBDLC_LEN_MASK); in mcp251x_hw_rx()
484 memcpy(frame->data, buf + RXBDAT_OFF, frame->can_dlc); in mcp251x_hw_rx()
486 priv->net->stats.rx_packets++; in mcp251x_hw_rx()
487 priv->net->stats.rx_bytes += frame->can_dlc; in mcp251x_hw_rx()
491 static void mcp251x_hw_sleep(struct spi_device *spi) in mcp251x_hw_sleep() argument
493 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_SLEEP); in mcp251x_hw_sleep()
500 struct spi_device *spi = priv->spi; in mcp251x_hard_start_xmit() local
502 if (priv->tx_skb || priv->tx_len) { in mcp251x_hard_start_xmit()
503 dev_warn(&spi->dev, "hard_xmit called while tx busy\n"); in mcp251x_hard_start_xmit()
511 priv->tx_skb = skb; in mcp251x_hard_start_xmit()
512 queue_work(priv->wq, &priv->tx_work); in mcp251x_hard_start_xmit()
524 /* We have to delay work since SPI I/O may sleep */ in mcp251x_do_set_mode()
525 priv->can.state = CAN_STATE_ERROR_ACTIVE; in mcp251x_do_set_mode()
526 priv->restart_tx = 1; in mcp251x_do_set_mode()
527 if (priv->can.restart_ms == 0) in mcp251x_do_set_mode()
528 priv->after_suspend = AFTER_SUSPEND_RESTART; in mcp251x_do_set_mode()
529 queue_work(priv->wq, &priv->restart_work); in mcp251x_do_set_mode()
532 return -EOPNOTSUPP; in mcp251x_do_set_mode()
538 static int mcp251x_set_normal_mode(struct spi_device *spi) in mcp251x_set_normal_mode() argument
540 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_set_normal_mode()
544 mcp251x_write_reg(spi, CANINTE, in mcp251x_set_normal_mode()
548 if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) { in mcp251x_set_normal_mode()
550 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK); in mcp251x_set_normal_mode()
551 } else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) { in mcp251x_set_normal_mode()
552 /* Put device into listen-only mode */ in mcp251x_set_normal_mode()
553 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LISTEN_ONLY); in mcp251x_set_normal_mode()
556 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL); in mcp251x_set_normal_mode()
560 while (mcp251x_read_reg(spi, CANSTAT) & CANCTRL_REQOP_MASK) { in mcp251x_set_normal_mode()
563 dev_err(&spi->dev, "MCP251x didn't" in mcp251x_set_normal_mode()
565 return -EBUSY; in mcp251x_set_normal_mode()
569 priv->can.state = CAN_STATE_ERROR_ACTIVE; in mcp251x_set_normal_mode()
576 struct can_bittiming *bt = &priv->can.bittiming; in mcp251x_do_set_bittiming()
577 struct spi_device *spi = priv->spi; in mcp251x_do_set_bittiming() local
579 mcp251x_write_reg(spi, CNF1, ((bt->sjw - 1) << CNF1_SJW_SHIFT) | in mcp251x_do_set_bittiming()
580 (bt->brp - 1)); in mcp251x_do_set_bittiming()
581 mcp251x_write_reg(spi, CNF2, CNF2_BTLMODE | in mcp251x_do_set_bittiming()
582 (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES ? in mcp251x_do_set_bittiming()
584 ((bt->phase_seg1 - 1) << CNF2_PS1_SHIFT) | in mcp251x_do_set_bittiming()
585 (bt->prop_seg - 1)); in mcp251x_do_set_bittiming()
586 mcp251x_write_bits(spi, CNF3, CNF3_PHSEG2_MASK, in mcp251x_do_set_bittiming()
587 (bt->phase_seg2 - 1)); in mcp251x_do_set_bittiming()
588 dev_info(&spi->dev, "CNF: 0x%02x 0x%02x 0x%02x\n", in mcp251x_do_set_bittiming()
589 mcp251x_read_reg(spi, CNF1), in mcp251x_do_set_bittiming()
590 mcp251x_read_reg(spi, CNF2), in mcp251x_do_set_bittiming()
591 mcp251x_read_reg(spi, CNF3)); in mcp251x_do_set_bittiming()
597 struct spi_device *spi) in mcp251x_setup() argument
601 mcp251x_write_reg(spi, RXBCTRL(0), in mcp251x_setup()
603 mcp251x_write_reg(spi, RXBCTRL(1), in mcp251x_setup()
608 static int mcp251x_hw_reset(struct spi_device *spi) in mcp251x_hw_reset() argument
610 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_hw_reset()
614 priv->spi_tx_buf[0] = INSTRUCTION_RESET; in mcp251x_hw_reset()
615 ret = spi_write(spi, priv->spi_tx_buf, 1); in mcp251x_hw_reset()
617 dev_err(&spi->dev, "reset failed: ret = %d\n", ret); in mcp251x_hw_reset()
618 return -EIO; in mcp251x_hw_reset()
624 while ((mcp251x_read_reg(spi, CANSTAT) & CANCTRL_REQOP_MASK) in mcp251x_hw_reset()
628 dev_err(&spi->dev, "MCP251x didn't" in mcp251x_hw_reset()
630 return -EBUSY; in mcp251x_hw_reset()
636 static int mcp251x_hw_probe(struct spi_device *spi) in mcp251x_hw_probe() argument
640 mcp251x_hw_reset(spi); in mcp251x_hw_probe()
644 * reset defaults taken from data sheet which allows us to see in mcp251x_hw_probe()
648 st1 = mcp251x_read_reg(spi, CANSTAT) & 0xEE; in mcp251x_hw_probe()
649 st2 = mcp251x_read_reg(spi, CANCTRL) & 0x17; in mcp251x_hw_probe()
651 dev_dbg(&spi->dev, "CANSTAT 0x%02x CANCTRL 0x%02x\n", st1, st2); in mcp251x_hw_probe()
660 struct spi_device *spi = priv->spi; in mcp251x_open_clean() local
661 struct mcp251x_platform_data *pdata = spi->dev.platform_data; in mcp251x_open_clean()
663 free_irq(spi->irq, priv); in mcp251x_open_clean()
664 mcp251x_hw_sleep(spi); in mcp251x_open_clean()
665 if (pdata->transceiver_enable) in mcp251x_open_clean()
666 pdata->transceiver_enable(0); in mcp251x_open_clean()
673 struct spi_device *spi = priv->spi; in mcp251x_stop() local
674 struct mcp251x_platform_data *pdata = spi->dev.platform_data; in mcp251x_stop()
678 priv->force_quit = 1; in mcp251x_stop()
679 free_irq(spi->irq, priv); in mcp251x_stop()
680 destroy_workqueue(priv->wq); in mcp251x_stop()
681 priv->wq = NULL; in mcp251x_stop()
683 mutex_lock(&priv->mcp_lock); in mcp251x_stop()
686 mcp251x_write_reg(spi, CANINTE, 0x00); in mcp251x_stop()
687 mcp251x_write_reg(spi, CANINTF, 0x00); in mcp251x_stop()
689 mcp251x_write_reg(spi, TXBCTRL(0), 0); in mcp251x_stop()
692 mcp251x_hw_sleep(spi); in mcp251x_stop()
694 if (pdata->transceiver_enable) in mcp251x_stop()
695 pdata->transceiver_enable(0); in mcp251x_stop()
697 priv->can.state = CAN_STATE_STOPPED; in mcp251x_stop()
699 mutex_unlock(&priv->mcp_lock); in mcp251x_stop()
711 frame->can_id |= can_id; in mcp251x_error_skb()
712 frame->data[1] = data1; in mcp251x_error_skb()
715 dev_err(&net->dev, in mcp251x_error_skb()
724 struct spi_device *spi = priv->spi; in mcp251x_tx_work_handler() local
725 struct net_device *net = priv->net; in mcp251x_tx_work_handler()
728 mutex_lock(&priv->mcp_lock); in mcp251x_tx_work_handler()
729 if (priv->tx_skb) { in mcp251x_tx_work_handler()
730 if (priv->can.state == CAN_STATE_BUS_OFF) { in mcp251x_tx_work_handler()
733 frame = (struct can_frame *)priv->tx_skb->data; in mcp251x_tx_work_handler()
735 if (frame->can_dlc > CAN_FRAME_MAX_DATA_LEN) in mcp251x_tx_work_handler()
736 frame->can_dlc = CAN_FRAME_MAX_DATA_LEN; in mcp251x_tx_work_handler()
737 mcp251x_hw_tx(spi, frame, 0); in mcp251x_tx_work_handler()
738 priv->tx_len = 1 + frame->can_dlc; in mcp251x_tx_work_handler()
739 can_put_echo_skb(priv->tx_skb, net, 0); in mcp251x_tx_work_handler()
740 priv->tx_skb = NULL; in mcp251x_tx_work_handler()
743 mutex_unlock(&priv->mcp_lock); in mcp251x_tx_work_handler()
750 struct spi_device *spi = priv->spi; in mcp251x_restart_work_handler() local
751 struct net_device *net = priv->net; in mcp251x_restart_work_handler()
753 mutex_lock(&priv->mcp_lock); in mcp251x_restart_work_handler()
754 if (priv->after_suspend) { in mcp251x_restart_work_handler()
756 mcp251x_hw_reset(spi); in mcp251x_restart_work_handler()
757 mcp251x_setup(net, priv, spi); in mcp251x_restart_work_handler()
758 if (priv->after_suspend & AFTER_SUSPEND_RESTART) { in mcp251x_restart_work_handler()
759 mcp251x_set_normal_mode(spi); in mcp251x_restart_work_handler()
760 } else if (priv->after_suspend & AFTER_SUSPEND_UP) { in mcp251x_restart_work_handler()
763 mcp251x_set_normal_mode(spi); in mcp251x_restart_work_handler()
766 mcp251x_hw_sleep(spi); in mcp251x_restart_work_handler()
768 priv->after_suspend = 0; in mcp251x_restart_work_handler()
769 priv->force_quit = 0; in mcp251x_restart_work_handler()
772 if (priv->restart_tx) { in mcp251x_restart_work_handler()
773 priv->restart_tx = 0; in mcp251x_restart_work_handler()
774 mcp251x_write_reg(spi, TXBCTRL(0), 0); in mcp251x_restart_work_handler()
779 mutex_unlock(&priv->mcp_lock); in mcp251x_restart_work_handler()
785 struct spi_device *spi = priv->spi; in mcp251x_can_ist() local
786 struct net_device *net = priv->net; in mcp251x_can_ist()
788 mutex_lock(&priv->mcp_lock); in mcp251x_can_ist()
789 while (!priv->force_quit) { in mcp251x_can_ist()
795 mcp251x_read_2regs(spi, CANINTF, &intf, &eflag); in mcp251x_can_ist()
802 mcp251x_hw_rx(spi, 0); in mcp251x_can_ist()
807 if (mcp251x_is_2510(spi)) in mcp251x_can_ist()
808 mcp251x_write_bits(spi, CANINTF, CANINTF_RX0IF, 0x00); in mcp251x_can_ist()
813 mcp251x_hw_rx(spi, 1); in mcp251x_can_ist()
815 if (mcp251x_is_2510(spi)) in mcp251x_can_ist()
819 /* any error or tx interrupt we need to clear? */ in mcp251x_can_ist()
823 mcp251x_write_bits(spi, CANINTF, clear_intf, 0x00); in mcp251x_can_ist()
826 mcp251x_write_bits(spi, EFLG, eflag, 0x00); in mcp251x_can_ist()
853 switch (priv->can.state) { in mcp251x_can_ist()
857 priv->can.can_stats.error_warning++; in mcp251x_can_ist()
861 priv->can.can_stats.error_passive++; in mcp251x_can_ist()
866 priv->can.state = new_state; in mcp251x_can_ist()
872 net->stats.rx_over_errors++; in mcp251x_can_ist()
873 net->stats.rx_errors++; in mcp251x_can_ist()
876 net->stats.rx_over_errors++; in mcp251x_can_ist()
877 net->stats.rx_errors++; in mcp251x_can_ist()
885 if (priv->can.state == CAN_STATE_BUS_OFF) { in mcp251x_can_ist()
886 if (priv->can.restart_ms == 0) { in mcp251x_can_ist()
887 priv->force_quit = 1; in mcp251x_can_ist()
889 mcp251x_hw_sleep(spi); in mcp251x_can_ist()
898 net->stats.tx_packets++; in mcp251x_can_ist()
899 net->stats.tx_bytes += priv->tx_len - 1; in mcp251x_can_ist()
900 if (priv->tx_len) { in mcp251x_can_ist()
902 priv->tx_len = 0; in mcp251x_can_ist()
908 mutex_unlock(&priv->mcp_lock); in mcp251x_can_ist()
915 struct spi_device *spi = priv->spi; in mcp251x_open() local
916 struct mcp251x_platform_data *pdata = spi->dev.platform_data; in mcp251x_open()
921 dev_err(&spi->dev, "unable to set initial baudrate!\n"); in mcp251x_open()
925 mutex_lock(&priv->mcp_lock); in mcp251x_open()
926 if (pdata->transceiver_enable) in mcp251x_open()
927 pdata->transceiver_enable(1); in mcp251x_open()
929 priv->force_quit = 0; in mcp251x_open()
930 priv->tx_skb = NULL; in mcp251x_open()
931 priv->tx_len = 0; in mcp251x_open()
933 ret = request_threaded_irq(spi->irq, NULL, mcp251x_can_ist, in mcp251x_open()
934 pdata->irq_flags ? pdata->irq_flags : IRQF_TRIGGER_FALLING, in mcp251x_open()
937 dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq); in mcp251x_open()
938 if (pdata->transceiver_enable) in mcp251x_open()
939 pdata->transceiver_enable(0); in mcp251x_open()
944 priv->wq = create_freezable_workqueue("mcp251x_wq"); in mcp251x_open()
945 INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler); in mcp251x_open()
946 INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler); in mcp251x_open()
948 ret = mcp251x_hw_reset(spi); in mcp251x_open()
953 ret = mcp251x_setup(net, priv, spi); in mcp251x_open()
958 ret = mcp251x_set_normal_mode(spi); in mcp251x_open()
966 mutex_unlock(&priv->mcp_lock); in mcp251x_open()
976 static int __devinit mcp251x_can_probe(struct spi_device *spi) in mcp251x_can_probe() argument
980 struct mcp251x_platform_data *pdata = spi->dev.platform_data; in mcp251x_can_probe()
981 int ret = -ENODEV; in mcp251x_can_probe()
990 ret = -ENOMEM; in mcp251x_can_probe()
994 net->netdev_ops = &mcp251x_netdev_ops; in mcp251x_can_probe()
995 net->flags |= IFF_ECHO; in mcp251x_can_probe()
998 priv->can.bittiming_const = &mcp251x_bittiming_const; in mcp251x_can_probe()
999 priv->can.do_set_mode = mcp251x_do_set_mode; in mcp251x_can_probe()
1000 priv->can.clock.freq = pdata->oscillator_frequency / 2; in mcp251x_can_probe()
1001 priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | in mcp251x_can_probe()
1003 priv->model = spi_get_device_id(spi)->driver_data; in mcp251x_can_probe()
1004 priv->net = net; in mcp251x_can_probe()
1005 dev_set_drvdata(&spi->dev, priv); in mcp251x_can_probe()
1007 priv->spi = spi; in mcp251x_can_probe()
1008 mutex_init(&priv->mcp_lock); in mcp251x_can_probe()
1012 spi->dev.coherent_dma_mask = ~0; in mcp251x_can_probe()
1016 * that much and share it between Tx and Rx DMA buffers. in mcp251x_can_probe()
1018 priv->spi_tx_buf = dma_alloc_coherent(&spi->dev, in mcp251x_can_probe()
1020 &priv->spi_tx_dma, in mcp251x_can_probe()
1023 if (priv->spi_tx_buf) { in mcp251x_can_probe()
1024 priv->spi_rx_buf = (u8 *)(priv->spi_tx_buf + in mcp251x_can_probe()
1026 priv->spi_rx_dma = (dma_addr_t)(priv->spi_tx_dma + in mcp251x_can_probe()
1029 /* Fall back to non-DMA */ in mcp251x_can_probe()
1034 /* Allocate non-DMA buffers */ in mcp251x_can_probe()
1036 priv->spi_tx_buf = kmalloc(SPI_TRANSFER_BUF_LEN, GFP_KERNEL); in mcp251x_can_probe()
1037 if (!priv->spi_tx_buf) { in mcp251x_can_probe()
1038 ret = -ENOMEM; in mcp251x_can_probe()
1041 priv->spi_rx_buf = kmalloc(SPI_TRANSFER_BUF_LEN, GFP_KERNEL); in mcp251x_can_probe()
1042 if (!priv->spi_rx_buf) { in mcp251x_can_probe()
1043 ret = -ENOMEM; in mcp251x_can_probe()
1048 if (pdata->power_enable) in mcp251x_can_probe()
1049 pdata->power_enable(1); in mcp251x_can_probe()
1052 if (pdata->board_specific_setup) in mcp251x_can_probe()
1053 pdata->board_specific_setup(spi); in mcp251x_can_probe()
1055 SET_NETDEV_DEV(net, &spi->dev); in mcp251x_can_probe()
1057 /* Configure the SPI bus */ in mcp251x_can_probe()
1058 spi->mode = SPI_MODE_0; in mcp251x_can_probe()
1059 spi->bits_per_word = 8; in mcp251x_can_probe()
1060 spi_setup(spi); in mcp251x_can_probe()
1063 if (!mcp251x_hw_probe(spi)) { in mcp251x_can_probe()
1064 dev_info(&spi->dev, "Probe failed\n"); in mcp251x_can_probe()
1067 mcp251x_hw_sleep(spi); in mcp251x_can_probe()
1069 if (pdata->transceiver_enable) in mcp251x_can_probe()
1070 pdata->transceiver_enable(0); in mcp251x_can_probe()
1074 dev_info(&spi->dev, "probed\n"); in mcp251x_can_probe()
1079 kfree(priv->spi_rx_buf); in mcp251x_can_probe()
1082 kfree(priv->spi_tx_buf); in mcp251x_can_probe()
1086 dma_free_coherent(&spi->dev, PAGE_SIZE, in mcp251x_can_probe()
1087 priv->spi_tx_buf, priv->spi_tx_dma); in mcp251x_can_probe()
1089 if (pdata->power_enable) in mcp251x_can_probe()
1090 pdata->power_enable(0); in mcp251x_can_probe()
1091 dev_err(&spi->dev, "probe failed\n"); in mcp251x_can_probe()
1096 static int __devexit mcp251x_can_remove(struct spi_device *spi) in mcp251x_can_remove() argument
1098 struct mcp251x_platform_data *pdata = spi->dev.platform_data; in mcp251x_can_remove()
1099 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_can_remove()
1100 struct net_device *net = priv->net; in mcp251x_can_remove()
1106 dma_free_coherent(&spi->dev, PAGE_SIZE, in mcp251x_can_remove()
1107 priv->spi_tx_buf, priv->spi_tx_dma); in mcp251x_can_remove()
1109 kfree(priv->spi_tx_buf); in mcp251x_can_remove()
1110 kfree(priv->spi_rx_buf); in mcp251x_can_remove()
1113 if (pdata->power_enable) in mcp251x_can_remove()
1114 pdata->power_enable(0); in mcp251x_can_remove()
1120 static int mcp251x_can_suspend(struct spi_device *spi, pm_message_t state) in mcp251x_can_suspend() argument
1122 struct mcp251x_platform_data *pdata = spi->dev.platform_data; in mcp251x_can_suspend()
1123 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_can_suspend()
1124 struct net_device *net = priv->net; in mcp251x_can_suspend()
1126 priv->force_quit = 1; in mcp251x_can_suspend()
1127 disable_irq(spi->irq); in mcp251x_can_suspend()
1135 mcp251x_hw_sleep(spi); in mcp251x_can_suspend()
1136 if (pdata->transceiver_enable) in mcp251x_can_suspend()
1137 pdata->transceiver_enable(0); in mcp251x_can_suspend()
1138 priv->after_suspend = AFTER_SUSPEND_UP; in mcp251x_can_suspend()
1140 priv->after_suspend = AFTER_SUSPEND_DOWN; in mcp251x_can_suspend()
1143 if (pdata->power_enable) { in mcp251x_can_suspend()
1144 pdata->power_enable(0); in mcp251x_can_suspend()
1145 priv->after_suspend |= AFTER_SUSPEND_POWER; in mcp251x_can_suspend()
1151 static int mcp251x_can_resume(struct spi_device *spi) in mcp251x_can_resume() argument
1153 struct mcp251x_platform_data *pdata = spi->dev.platform_data; in mcp251x_can_resume()
1154 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); in mcp251x_can_resume()
1156 if (priv->after_suspend & AFTER_SUSPEND_POWER) { in mcp251x_can_resume()
1157 pdata->power_enable(1); in mcp251x_can_resume()
1158 queue_work(priv->wq, &priv->restart_work); in mcp251x_can_resume()
1160 if (priv->after_suspend & AFTER_SUSPEND_UP) { in mcp251x_can_resume()
1161 if (pdata->transceiver_enable) in mcp251x_can_resume()
1162 pdata->transceiver_enable(1); in mcp251x_can_resume()
1163 queue_work(priv->wq, &priv->restart_work); in mcp251x_can_resume()
1165 priv->after_suspend = 0; in mcp251x_can_resume()
1168 priv->force_quit = 0; in mcp251x_can_resume()
1169 enable_irq(spi->irq); in mcp251x_can_resume()
1183 MODULE_DEVICE_TABLE(spi, mcp251x_id_table);