Lines Matching +full:- +full:spi
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* CAN bus driver for Microchip 251x/25625 CAN Controller with SPI Interface
17 * - Sascha Hauer, Marc Kleine-Budde, Pengutronix
18 * - Simon Kallweit, intefo AG
43 #include <linux/spi/spi.h>
46 /* SPI interface instruction set */
197 /* Buffer size required for the largest SPI transfer (i.e., reading a
231 struct spi_device *spi; member
234 struct mutex mcp_lock; /* SPI device lock */
263 static inline int mcp251x_is_##_model(struct spi_device *spi) \
265 struct mcp251x_priv *priv = spi_get_drvdata(spi); \
266 return priv->model == CAN_MCP251X_MCP##_model; \
275 if (priv->tx_skb || priv->tx_len) in mcp251x_clean()
276 net->stats.tx_errors++; in mcp251x_clean()
277 dev_kfree_skb(priv->tx_skb); in mcp251x_clean()
278 if (priv->tx_len) in mcp251x_clean()
279 can_free_echo_skb(priv->net, 0); in mcp251x_clean()
280 priv->tx_skb = NULL; in mcp251x_clean()
281 priv->tx_len = 0; in mcp251x_clean()
285 * registers via SPI is not really different conceptually than using
296 static int mcp251x_spi_trans(struct spi_device *spi, int len) in mcp251x_spi_trans() argument
298 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_spi_trans()
300 .tx_buf = priv->spi_tx_buf, in mcp251x_spi_trans()
301 .rx_buf = priv->spi_rx_buf, in mcp251x_spi_trans()
311 ret = spi_sync(spi, &m); in mcp251x_spi_trans()
313 dev_err(&spi->dev, "spi transfer failed: ret = %d\n", ret); in mcp251x_spi_trans()
317 static u8 mcp251x_read_reg(struct spi_device *spi, u8 reg) in mcp251x_read_reg() argument
319 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_read_reg()
322 priv->spi_tx_buf[0] = INSTRUCTION_READ; in mcp251x_read_reg()
323 priv->spi_tx_buf[1] = reg; in mcp251x_read_reg()
325 if (spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX) { in mcp251x_read_reg()
326 spi_write_then_read(spi, priv->spi_tx_buf, 2, &val, 1); in mcp251x_read_reg()
328 mcp251x_spi_trans(spi, 3); in mcp251x_read_reg()
329 val = priv->spi_rx_buf[2]; in mcp251x_read_reg()
335 static void mcp251x_read_2regs(struct spi_device *spi, u8 reg, u8 *v1, u8 *v2) in mcp251x_read_2regs() argument
337 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_read_2regs()
339 priv->spi_tx_buf[0] = INSTRUCTION_READ; in mcp251x_read_2regs()
340 priv->spi_tx_buf[1] = reg; in mcp251x_read_2regs()
342 if (spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX) { in mcp251x_read_2regs()
345 spi_write_then_read(spi, priv->spi_tx_buf, 2, val, 2); in mcp251x_read_2regs()
349 mcp251x_spi_trans(spi, 4); in mcp251x_read_2regs()
351 *v1 = priv->spi_rx_buf[2]; in mcp251x_read_2regs()
352 *v2 = priv->spi_rx_buf[3]; in mcp251x_read_2regs()
356 static void mcp251x_write_reg(struct spi_device *spi, u8 reg, u8 val) in mcp251x_write_reg() argument
358 struct mcp251x_priv *priv = spi_get_drvdata(spi); 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_2regs(struct spi_device *spi, u8 reg, u8 v1, u8 v2) in mcp251x_write_2regs() argument
369 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_write_2regs()
371 priv->spi_tx_buf[0] = INSTRUCTION_WRITE; in mcp251x_write_2regs()
372 priv->spi_tx_buf[1] = reg; in mcp251x_write_2regs()
373 priv->spi_tx_buf[2] = v1; in mcp251x_write_2regs()
374 priv->spi_tx_buf[3] = v2; in mcp251x_write_2regs()
376 mcp251x_spi_trans(spi, 4); in mcp251x_write_2regs()
379 static void mcp251x_write_bits(struct spi_device *spi, u8 reg, in mcp251x_write_bits() argument
382 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_write_bits()
384 priv->spi_tx_buf[0] = INSTRUCTION_BIT_MODIFY; in mcp251x_write_bits()
385 priv->spi_tx_buf[1] = reg; in mcp251x_write_bits()
386 priv->spi_tx_buf[2] = mask; in mcp251x_write_bits()
387 priv->spi_tx_buf[3] = val; in mcp251x_write_bits()
389 mcp251x_spi_trans(spi, 4); in mcp251x_write_bits()
392 static u8 mcp251x_read_stat(struct spi_device *spi) in mcp251x_read_stat() argument
394 return mcp251x_read_reg(spi, CANSTAT) & CANCTRL_REQOP_MASK; in mcp251x_read_stat()
438 val = BFPCTRL_BFE(offset - MCP251X_GPIO_RX0BF); in mcp251x_gpio_request()
440 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_request()
441 mcp251x_write_bits(priv->spi, BFPCTRL, val, val); in mcp251x_gpio_request()
442 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_request()
444 priv->reg_bfpctrl |= val; in mcp251x_gpio_request()
459 val = BFPCTRL_BFE(offset - MCP251X_GPIO_RX0BF); in mcp251x_gpio_free()
461 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_free()
462 mcp251x_write_bits(priv->spi, BFPCTRL, val, 0); in mcp251x_gpio_free()
463 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_free()
465 priv->reg_bfpctrl &= ~val; in mcp251x_gpio_free()
487 mask = BFPCTRL_BFS(offset - MCP251X_GPIO_RX0BF); in mcp251x_gpio_get()
490 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_get()
491 val = mcp251x_read_reg(priv->spi, reg); in mcp251x_gpio_get()
492 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_get()
504 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_get_multiple()
506 val = mcp251x_read_reg(priv->spi, TXRTSCTRL); in mcp251x_gpio_get_multiple()
511 val = mcp251x_read_reg(priv->spi, BFPCTRL); in mcp251x_gpio_get_multiple()
515 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_get_multiple()
527 mask = BFPCTRL_BFS(offset - MCP251X_GPIO_RX0BF); in mcp251x_gpio_set()
530 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_set()
531 mcp251x_write_bits(priv->spi, BFPCTRL, mask, val); in mcp251x_gpio_set()
532 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_set()
534 priv->reg_bfpctrl &= ~mask; in mcp251x_gpio_set()
535 priv->reg_bfpctrl |= val; in mcp251x_gpio_set()
554 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_set_multiple()
555 mcp251x_write_bits(priv->spi, BFPCTRL, mask, val); in mcp251x_gpio_set_multiple()
556 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_set_multiple()
558 priv->reg_bfpctrl &= ~mask; in mcp251x_gpio_set_multiple()
559 priv->reg_bfpctrl |= val; in mcp251x_gpio_set_multiple()
562 static void mcp251x_gpio_restore(struct spi_device *spi) in mcp251x_gpio_restore() argument
564 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_gpio_restore()
566 mcp251x_write_reg(spi, BFPCTRL, priv->reg_bfpctrl); in mcp251x_gpio_restore()
571 struct gpio_chip *gpio = &priv->gpio; in mcp251x_gpio_setup()
573 if (!device_property_present(&priv->spi->dev, "gpio-controller")) in mcp251x_gpio_setup()
577 gpio->label = priv->spi->modalias; in mcp251x_gpio_setup()
578 gpio->parent = &priv->spi->dev; in mcp251x_gpio_setup()
579 gpio->owner = THIS_MODULE; in mcp251x_gpio_setup()
580 gpio->request = mcp251x_gpio_request; in mcp251x_gpio_setup()
581 gpio->free = mcp251x_gpio_free; in mcp251x_gpio_setup()
582 gpio->get_direction = mcp251x_gpio_get_direction; in mcp251x_gpio_setup()
583 gpio->get = mcp251x_gpio_get; in mcp251x_gpio_setup()
584 gpio->get_multiple = mcp251x_gpio_get_multiple; in mcp251x_gpio_setup()
585 gpio->set = mcp251x_gpio_set; in mcp251x_gpio_setup()
586 gpio->set_multiple = mcp251x_gpio_set_multiple; in mcp251x_gpio_setup()
587 gpio->base = -1; in mcp251x_gpio_setup()
588 gpio->ngpio = ARRAY_SIZE(mcp251x_gpio_names); in mcp251x_gpio_setup()
589 gpio->names = mcp251x_gpio_names; in mcp251x_gpio_setup()
590 gpio->can_sleep = true; in mcp251x_gpio_setup()
592 gpio->of_node = priv->spi->dev.of_node; in mcp251x_gpio_setup()
595 return devm_gpiochip_add_data(&priv->spi->dev, gpio, priv); in mcp251x_gpio_setup()
598 static inline void mcp251x_gpio_restore(struct spi_device *spi) in mcp251x_gpio_restore() argument
608 static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, in mcp251x_hw_tx_frame() argument
611 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_tx_frame()
613 if (mcp251x_is_2510(spi)) { in mcp251x_hw_tx_frame()
617 mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx) + i, in mcp251x_hw_tx_frame()
620 memcpy(priv->spi_tx_buf, buf, TXBDAT_OFF + len); in mcp251x_hw_tx_frame()
621 mcp251x_spi_trans(spi, TXBDAT_OFF + len); in mcp251x_hw_tx_frame()
625 static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, in mcp251x_hw_tx() argument
628 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_tx()
632 exide = (frame->can_id & CAN_EFF_FLAG) ? 1 : 0; /* Extended ID Enable */ in mcp251x_hw_tx()
634 sid = (frame->can_id & CAN_EFF_MASK) >> 18; in mcp251x_hw_tx()
636 sid = frame->can_id & CAN_SFF_MASK; /* Standard ID */ in mcp251x_hw_tx()
637 eid = frame->can_id & CAN_EFF_MASK; /* Extended ID */ in mcp251x_hw_tx()
638 rtr = (frame->can_id & CAN_RTR_FLAG) ? 1 : 0; /* Remote transmission */ in mcp251x_hw_tx()
647 buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc; in mcp251x_hw_tx()
648 memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc); in mcp251x_hw_tx()
649 mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx); in mcp251x_hw_tx()
652 priv->spi_tx_buf[0] = INSTRUCTION_RTS(1 << tx_buf_idx); in mcp251x_hw_tx()
653 mcp251x_spi_trans(priv->spi, 1); in mcp251x_hw_tx()
656 static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, in mcp251x_hw_rx_frame() argument
659 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_rx_frame()
661 if (mcp251x_is_2510(spi)) { in mcp251x_hw_rx_frame()
665 buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i); in mcp251x_hw_rx_frame()
669 buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i); in mcp251x_hw_rx_frame()
671 priv->spi_tx_buf[RXBCTRL_OFF] = INSTRUCTION_READ_RXB(buf_idx); in mcp251x_hw_rx_frame()
672 if (spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX) { in mcp251x_hw_rx_frame()
673 spi_write_then_read(spi, priv->spi_tx_buf, 1, in mcp251x_hw_rx_frame()
674 priv->spi_rx_buf, in mcp251x_hw_rx_frame()
676 memcpy(buf + 1, priv->spi_rx_buf, in mcp251x_hw_rx_frame()
677 SPI_TRANSFER_BUF_LEN - 1); in mcp251x_hw_rx_frame()
679 mcp251x_spi_trans(spi, SPI_TRANSFER_BUF_LEN); in mcp251x_hw_rx_frame()
680 memcpy(buf, priv->spi_rx_buf, SPI_TRANSFER_BUF_LEN); in mcp251x_hw_rx_frame()
685 static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx) in mcp251x_hw_rx() argument
687 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_rx()
692 skb = alloc_can_skb(priv->net, &frame); in mcp251x_hw_rx()
694 dev_err(&spi->dev, "cannot allocate RX skb\n"); in mcp251x_hw_rx()
695 priv->net->stats.rx_dropped++; in mcp251x_hw_rx()
699 mcp251x_hw_rx_frame(spi, buf, buf_idx); in mcp251x_hw_rx()
702 frame->can_id = CAN_EFF_FLAG; in mcp251x_hw_rx()
703 frame->can_id |= in mcp251x_hw_rx()
713 frame->can_id |= CAN_RTR_FLAG; in mcp251x_hw_rx()
716 frame->can_id = in mcp251x_hw_rx()
720 frame->can_id |= CAN_RTR_FLAG; in mcp251x_hw_rx()
723 frame->can_dlc = get_can_dlc(buf[RXBDLC_OFF] & RXBDLC_LEN_MASK); in mcp251x_hw_rx()
724 memcpy(frame->data, buf + RXBDAT_OFF, frame->can_dlc); in mcp251x_hw_rx()
726 priv->net->stats.rx_packets++; in mcp251x_hw_rx()
727 priv->net->stats.rx_bytes += frame->can_dlc; in mcp251x_hw_rx()
729 can_led_event(priv->net, CAN_LED_EVENT_RX); in mcp251x_hw_rx()
734 static void mcp251x_hw_sleep(struct spi_device *spi) in mcp251x_hw_sleep() argument
736 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_SLEEP); in mcp251x_hw_sleep()
740 static int mcp251x_hw_wake(struct spi_device *spi) in mcp251x_hw_wake() argument
746 disable_irq(spi->irq); in mcp251x_hw_wake()
747 mcp251x_write_2regs(spi, CANINTE, CANINTE_WAKIE, CANINTF_WAKIF); in mcp251x_hw_wake()
753 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_CONF); in mcp251x_hw_wake()
756 ret = mcp251x_read_stat_poll_timeout(spi, value, value == CANCTRL_REQOP_CONF, in mcp251x_hw_wake()
760 dev_err(&spi->dev, "MCP251x didn't enter in config mode\n"); in mcp251x_hw_wake()
765 mcp251x_write_2regs(spi, CANINTE, 0x00, 0x00); in mcp251x_hw_wake()
766 enable_irq(spi->irq); in mcp251x_hw_wake()
775 struct spi_device *spi = priv->spi; in mcp251x_hard_start_xmit() local
777 if (priv->tx_skb || priv->tx_len) { in mcp251x_hard_start_xmit()
778 dev_warn(&spi->dev, "hard_xmit called while tx busy\n"); in mcp251x_hard_start_xmit()
786 priv->tx_skb = skb; in mcp251x_hard_start_xmit()
787 queue_work(priv->wq, &priv->tx_work); in mcp251x_hard_start_xmit()
799 /* We have to delay work since SPI I/O may sleep */ in mcp251x_do_set_mode()
800 priv->can.state = CAN_STATE_ERROR_ACTIVE; in mcp251x_do_set_mode()
801 priv->restart_tx = 1; in mcp251x_do_set_mode()
802 if (priv->can.restart_ms == 0) in mcp251x_do_set_mode()
803 priv->after_suspend = AFTER_SUSPEND_RESTART; in mcp251x_do_set_mode()
804 queue_work(priv->wq, &priv->restart_work); in mcp251x_do_set_mode()
807 return -EOPNOTSUPP; in mcp251x_do_set_mode()
813 static int mcp251x_set_normal_mode(struct spi_device *spi) in mcp251x_set_normal_mode() argument
815 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_set_normal_mode()
820 mcp251x_write_reg(spi, CANINTE, in mcp251x_set_normal_mode()
824 if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) { in mcp251x_set_normal_mode()
826 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK); in mcp251x_set_normal_mode()
827 } else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) { in mcp251x_set_normal_mode()
828 /* Put device into listen-only mode */ in mcp251x_set_normal_mode()
829 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LISTEN_ONLY); in mcp251x_set_normal_mode()
832 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL); in mcp251x_set_normal_mode()
835 ret = mcp251x_read_stat_poll_timeout(spi, value, value == 0, in mcp251x_set_normal_mode()
839 dev_err(&spi->dev, "MCP251x didn't enter in normal mode\n"); in mcp251x_set_normal_mode()
843 priv->can.state = CAN_STATE_ERROR_ACTIVE; in mcp251x_set_normal_mode()
850 struct can_bittiming *bt = &priv->can.bittiming; in mcp251x_do_set_bittiming()
851 struct spi_device *spi = priv->spi; in mcp251x_do_set_bittiming() local
853 mcp251x_write_reg(spi, CNF1, ((bt->sjw - 1) << CNF1_SJW_SHIFT) | in mcp251x_do_set_bittiming()
854 (bt->brp - 1)); in mcp251x_do_set_bittiming()
855 mcp251x_write_reg(spi, CNF2, CNF2_BTLMODE | in mcp251x_do_set_bittiming()
856 (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES ? in mcp251x_do_set_bittiming()
858 ((bt->phase_seg1 - 1) << CNF2_PS1_SHIFT) | in mcp251x_do_set_bittiming()
859 (bt->prop_seg - 1)); in mcp251x_do_set_bittiming()
860 mcp251x_write_bits(spi, CNF3, CNF3_PHSEG2_MASK, in mcp251x_do_set_bittiming()
861 (bt->phase_seg2 - 1)); in mcp251x_do_set_bittiming()
862 dev_dbg(&spi->dev, "CNF: 0x%02x 0x%02x 0x%02x\n", in mcp251x_do_set_bittiming()
863 mcp251x_read_reg(spi, CNF1), in mcp251x_do_set_bittiming()
864 mcp251x_read_reg(spi, CNF2), in mcp251x_do_set_bittiming()
865 mcp251x_read_reg(spi, CNF3)); in mcp251x_do_set_bittiming()
870 static int mcp251x_setup(struct net_device *net, struct spi_device *spi) in mcp251x_setup() argument
874 mcp251x_write_reg(spi, RXBCTRL(0), in mcp251x_setup()
876 mcp251x_write_reg(spi, RXBCTRL(1), in mcp251x_setup()
881 static int mcp251x_hw_reset(struct spi_device *spi) in mcp251x_hw_reset() argument
883 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_reset()
890 priv->spi_tx_buf[0] = INSTRUCTION_RESET; in mcp251x_hw_reset()
891 ret = mcp251x_spi_trans(spi, 1); in mcp251x_hw_reset()
899 ret = mcp251x_read_stat_poll_timeout(spi, value, value == CANCTRL_REQOP_CONF, in mcp251x_hw_reset()
903 dev_err(&spi->dev, "MCP251x didn't enter in conf mode after reset\n"); in mcp251x_hw_reset()
907 static int mcp251x_hw_probe(struct spi_device *spi) in mcp251x_hw_probe() argument
912 ret = mcp251x_hw_reset(spi); in mcp251x_hw_probe()
916 ctrl = mcp251x_read_reg(spi, CANCTRL); in mcp251x_hw_probe()
918 dev_dbg(&spi->dev, "CANCTRL 0x%02x\n", ctrl); in mcp251x_hw_probe()
922 return -ENODEV; in mcp251x_hw_probe()
941 struct spi_device *spi = priv->spi; in mcp251x_stop() local
945 priv->force_quit = 1; in mcp251x_stop()
946 free_irq(spi->irq, priv); in mcp251x_stop()
947 destroy_workqueue(priv->wq); in mcp251x_stop()
948 priv->wq = NULL; in mcp251x_stop()
950 mutex_lock(&priv->mcp_lock); in mcp251x_stop()
953 mcp251x_write_2regs(spi, CANINTE, 0x00, 0x00); in mcp251x_stop()
955 mcp251x_write_reg(spi, TXBCTRL(0), 0); in mcp251x_stop()
958 mcp251x_hw_sleep(spi); in mcp251x_stop()
960 mcp251x_power_enable(priv->transceiver, 0); in mcp251x_stop()
962 priv->can.state = CAN_STATE_STOPPED; in mcp251x_stop()
964 mutex_unlock(&priv->mcp_lock); in mcp251x_stop()
978 frame->can_id |= can_id; in mcp251x_error_skb()
979 frame->data[1] = data1; in mcp251x_error_skb()
990 struct spi_device *spi = priv->spi; in mcp251x_tx_work_handler() local
991 struct net_device *net = priv->net; in mcp251x_tx_work_handler()
994 mutex_lock(&priv->mcp_lock); in mcp251x_tx_work_handler()
995 if (priv->tx_skb) { in mcp251x_tx_work_handler()
996 if (priv->can.state == CAN_STATE_BUS_OFF) { in mcp251x_tx_work_handler()
999 frame = (struct can_frame *)priv->tx_skb->data; in mcp251x_tx_work_handler()
1001 if (frame->can_dlc > CAN_FRAME_MAX_DATA_LEN) in mcp251x_tx_work_handler()
1002 frame->can_dlc = CAN_FRAME_MAX_DATA_LEN; in mcp251x_tx_work_handler()
1003 mcp251x_hw_tx(spi, frame, 0); in mcp251x_tx_work_handler()
1004 priv->tx_len = 1 + frame->can_dlc; in mcp251x_tx_work_handler()
1005 can_put_echo_skb(priv->tx_skb, net, 0); in mcp251x_tx_work_handler()
1006 priv->tx_skb = NULL; in mcp251x_tx_work_handler()
1009 mutex_unlock(&priv->mcp_lock); in mcp251x_tx_work_handler()
1016 struct spi_device *spi = priv->spi; in mcp251x_restart_work_handler() local
1017 struct net_device *net = priv->net; in mcp251x_restart_work_handler()
1019 mutex_lock(&priv->mcp_lock); in mcp251x_restart_work_handler()
1020 if (priv->after_suspend) { in mcp251x_restart_work_handler()
1021 if (priv->after_suspend & AFTER_SUSPEND_POWER) { in mcp251x_restart_work_handler()
1022 mcp251x_hw_reset(spi); in mcp251x_restart_work_handler()
1023 mcp251x_setup(net, spi); in mcp251x_restart_work_handler()
1024 mcp251x_gpio_restore(spi); in mcp251x_restart_work_handler()
1026 mcp251x_hw_wake(spi); in mcp251x_restart_work_handler()
1028 priv->force_quit = 0; in mcp251x_restart_work_handler()
1029 if (priv->after_suspend & AFTER_SUSPEND_RESTART) { in mcp251x_restart_work_handler()
1030 mcp251x_set_normal_mode(spi); in mcp251x_restart_work_handler()
1031 } else if (priv->after_suspend & AFTER_SUSPEND_UP) { in mcp251x_restart_work_handler()
1034 mcp251x_set_normal_mode(spi); in mcp251x_restart_work_handler()
1037 mcp251x_hw_sleep(spi); in mcp251x_restart_work_handler()
1039 priv->after_suspend = 0; in mcp251x_restart_work_handler()
1042 if (priv->restart_tx) { in mcp251x_restart_work_handler()
1043 priv->restart_tx = 0; in mcp251x_restart_work_handler()
1044 mcp251x_write_reg(spi, TXBCTRL(0), 0); in mcp251x_restart_work_handler()
1049 mutex_unlock(&priv->mcp_lock); in mcp251x_restart_work_handler()
1055 struct spi_device *spi = priv->spi; in mcp251x_can_ist() local
1056 struct net_device *net = priv->net; in mcp251x_can_ist()
1058 mutex_lock(&priv->mcp_lock); in mcp251x_can_ist()
1059 while (!priv->force_quit) { in mcp251x_can_ist()
1065 mcp251x_read_2regs(spi, CANINTF, &intf, &eflag); in mcp251x_can_ist()
1072 mcp251x_hw_rx(spi, 0); in mcp251x_can_ist()
1076 if (mcp251x_is_2510(spi)) in mcp251x_can_ist()
1077 mcp251x_write_bits(spi, CANINTF, in mcp251x_can_ist()
1083 mcp251x_hw_rx(spi, 1); in mcp251x_can_ist()
1085 if (mcp251x_is_2510(spi)) in mcp251x_can_ist()
1093 mcp251x_write_bits(spi, CANINTF, clear_intf, 0x00); in mcp251x_can_ist()
1096 mcp251x_write_bits(spi, EFLG, eflag, 0x00); in mcp251x_can_ist()
1123 switch (priv->can.state) { in mcp251x_can_ist()
1127 priv->can.can_stats.error_warning++; in mcp251x_can_ist()
1132 priv->can.can_stats.error_passive++; in mcp251x_can_ist()
1137 priv->can.state = new_state; in mcp251x_can_ist()
1143 net->stats.rx_over_errors++; in mcp251x_can_ist()
1144 net->stats.rx_errors++; in mcp251x_can_ist()
1147 net->stats.rx_over_errors++; in mcp251x_can_ist()
1148 net->stats.rx_errors++; in mcp251x_can_ist()
1156 if (priv->can.state == CAN_STATE_BUS_OFF) { in mcp251x_can_ist()
1157 if (priv->can.restart_ms == 0) { in mcp251x_can_ist()
1158 priv->force_quit = 1; in mcp251x_can_ist()
1159 priv->can.can_stats.bus_off++; in mcp251x_can_ist()
1161 mcp251x_hw_sleep(spi); in mcp251x_can_ist()
1170 net->stats.tx_packets++; in mcp251x_can_ist()
1171 net->stats.tx_bytes += priv->tx_len - 1; in mcp251x_can_ist()
1173 if (priv->tx_len) { in mcp251x_can_ist()
1175 priv->tx_len = 0; in mcp251x_can_ist()
1180 mutex_unlock(&priv->mcp_lock); in mcp251x_can_ist()
1187 struct spi_device *spi = priv->spi; in mcp251x_open() local
1193 dev_err(&spi->dev, "unable to set initial baudrate!\n"); in mcp251x_open()
1197 mutex_lock(&priv->mcp_lock); in mcp251x_open()
1198 mcp251x_power_enable(priv->transceiver, 1); in mcp251x_open()
1200 priv->force_quit = 0; in mcp251x_open()
1201 priv->tx_skb = NULL; in mcp251x_open()
1202 priv->tx_len = 0; in mcp251x_open()
1204 if (!dev_fwnode(&spi->dev)) in mcp251x_open()
1207 ret = request_threaded_irq(spi->irq, NULL, mcp251x_can_ist, in mcp251x_open()
1208 flags | IRQF_ONESHOT, dev_name(&spi->dev), in mcp251x_open()
1211 dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq); in mcp251x_open()
1215 priv->wq = alloc_workqueue("mcp251x_wq", WQ_FREEZABLE | WQ_MEM_RECLAIM, in mcp251x_open()
1217 if (!priv->wq) { in mcp251x_open()
1218 ret = -ENOMEM; in mcp251x_open()
1221 INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler); in mcp251x_open()
1222 INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler); in mcp251x_open()
1224 ret = mcp251x_hw_wake(spi); in mcp251x_open()
1227 ret = mcp251x_setup(net, spi); in mcp251x_open()
1230 ret = mcp251x_set_normal_mode(spi); in mcp251x_open()
1237 mutex_unlock(&priv->mcp_lock); in mcp251x_open()
1242 destroy_workqueue(priv->wq); in mcp251x_open()
1244 free_irq(spi->irq, priv); in mcp251x_open()
1245 mcp251x_hw_sleep(spi); in mcp251x_open()
1247 mcp251x_power_enable(priv->transceiver, 0); in mcp251x_open()
1249 mutex_unlock(&priv->mcp_lock); in mcp251x_open()
1292 MODULE_DEVICE_TABLE(spi, mcp251x_id_table);
1294 static int mcp251x_can_probe(struct spi_device *spi) in mcp251x_can_probe() argument
1296 const void *match = device_get_match_data(&spi->dev); in mcp251x_can_probe()
1303 clk = devm_clk_get_optional(&spi->dev, NULL); in mcp251x_can_probe()
1309 device_property_read_u32(&spi->dev, "clock-frequency", &freq); in mcp251x_can_probe()
1313 return -ERANGE; in mcp251x_can_probe()
1318 return -ENOMEM; in mcp251x_can_probe()
1324 net->netdev_ops = &mcp251x_netdev_ops; in mcp251x_can_probe()
1325 net->flags |= IFF_ECHO; in mcp251x_can_probe()
1328 priv->can.bittiming_const = &mcp251x_bittiming_const; in mcp251x_can_probe()
1329 priv->can.do_set_mode = mcp251x_do_set_mode; in mcp251x_can_probe()
1330 priv->can.clock.freq = freq / 2; in mcp251x_can_probe()
1331 priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | in mcp251x_can_probe()
1334 priv->model = (enum mcp251x_model)match; in mcp251x_can_probe()
1336 priv->model = spi_get_device_id(spi)->driver_data; in mcp251x_can_probe()
1337 priv->net = net; in mcp251x_can_probe()
1338 priv->clk = clk; in mcp251x_can_probe()
1340 spi_set_drvdata(spi, priv); in mcp251x_can_probe()
1342 /* Configure the SPI bus */ in mcp251x_can_probe()
1343 spi->bits_per_word = 8; in mcp251x_can_probe()
1344 if (mcp251x_is_2510(spi)) in mcp251x_can_probe()
1345 spi->max_speed_hz = spi->max_speed_hz ? : 5 * 1000 * 1000; in mcp251x_can_probe()
1347 spi->max_speed_hz = spi->max_speed_hz ? : 10 * 1000 * 1000; in mcp251x_can_probe()
1348 ret = spi_setup(spi); in mcp251x_can_probe()
1352 priv->power = devm_regulator_get_optional(&spi->dev, "vdd"); in mcp251x_can_probe()
1353 priv->transceiver = devm_regulator_get_optional(&spi->dev, "xceiver"); in mcp251x_can_probe()
1354 if ((PTR_ERR(priv->power) == -EPROBE_DEFER) || in mcp251x_can_probe()
1355 (PTR_ERR(priv->transceiver) == -EPROBE_DEFER)) { in mcp251x_can_probe()
1356 ret = -EPROBE_DEFER; in mcp251x_can_probe()
1360 ret = mcp251x_power_enable(priv->power, 1); in mcp251x_can_probe()
1364 priv->spi = spi; in mcp251x_can_probe()
1365 mutex_init(&priv->mcp_lock); in mcp251x_can_probe()
1367 priv->spi_tx_buf = devm_kzalloc(&spi->dev, SPI_TRANSFER_BUF_LEN, in mcp251x_can_probe()
1369 if (!priv->spi_tx_buf) { in mcp251x_can_probe()
1370 ret = -ENOMEM; in mcp251x_can_probe()
1374 priv->spi_rx_buf = devm_kzalloc(&spi->dev, SPI_TRANSFER_BUF_LEN, in mcp251x_can_probe()
1376 if (!priv->spi_rx_buf) { in mcp251x_can_probe()
1377 ret = -ENOMEM; in mcp251x_can_probe()
1381 SET_NETDEV_DEV(net, &spi->dev); in mcp251x_can_probe()
1384 ret = mcp251x_hw_probe(spi); in mcp251x_can_probe()
1386 if (ret == -ENODEV) in mcp251x_can_probe()
1387 dev_err(&spi->dev, "Cannot initialize MCP%x. Wrong wiring?\n", in mcp251x_can_probe()
1388 priv->model); in mcp251x_can_probe()
1392 mcp251x_hw_sleep(spi); in mcp251x_can_probe()
1404 netdev_info(net, "MCP%x successfully initialized.\n", priv->model); in mcp251x_can_probe()
1408 mcp251x_power_enable(priv->power, 0); in mcp251x_can_probe()
1416 dev_err(&spi->dev, "Probe failed, err=%d\n", -ret); in mcp251x_can_probe()
1420 static int mcp251x_can_remove(struct spi_device *spi) in mcp251x_can_remove() argument
1422 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_can_remove()
1423 struct net_device *net = priv->net; in mcp251x_can_remove()
1427 mcp251x_power_enable(priv->power, 0); in mcp251x_can_remove()
1429 clk_disable_unprepare(priv->clk); in mcp251x_can_remove()
1438 struct spi_device *spi = to_spi_device(dev); in mcp251x_can_suspend() local
1439 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_can_suspend()
1440 struct net_device *net = priv->net; in mcp251x_can_suspend()
1442 priv->force_quit = 1; in mcp251x_can_suspend()
1443 disable_irq(spi->irq); in mcp251x_can_suspend()
1450 mcp251x_hw_sleep(spi); in mcp251x_can_suspend()
1451 mcp251x_power_enable(priv->transceiver, 0); in mcp251x_can_suspend()
1452 priv->after_suspend = AFTER_SUSPEND_UP; in mcp251x_can_suspend()
1454 priv->after_suspend = AFTER_SUSPEND_DOWN; in mcp251x_can_suspend()
1457 mcp251x_power_enable(priv->power, 0); in mcp251x_can_suspend()
1458 priv->after_suspend |= AFTER_SUSPEND_POWER; in mcp251x_can_suspend()
1465 struct spi_device *spi = to_spi_device(dev); in mcp251x_can_resume() local
1466 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_can_resume()
1468 if (priv->after_suspend & AFTER_SUSPEND_POWER) in mcp251x_can_resume()
1469 mcp251x_power_enable(priv->power, 1); in mcp251x_can_resume()
1470 if (priv->after_suspend & AFTER_SUSPEND_UP) in mcp251x_can_resume()
1471 mcp251x_power_enable(priv->transceiver, 1); in mcp251x_can_resume()
1473 if (priv->after_suspend & (AFTER_SUSPEND_POWER | AFTER_SUSPEND_UP)) in mcp251x_can_resume()
1474 queue_work(priv->wq, &priv->restart_work); in mcp251x_can_resume()
1476 priv->after_suspend = 0; in mcp251x_can_resume()
1478 priv->force_quit = 0; in mcp251x_can_resume()
1479 enable_irq(spi->irq); in mcp251x_can_resume()