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 */
264 static inline int mcp251x_is_##_model(struct spi_device *spi) \
266 struct mcp251x_priv *priv = spi_get_drvdata(spi); \
267 return priv->model == CAN_MCP251X_MCP##_model; \
276 if (priv->tx_skb || priv->tx_busy) in mcp251x_clean()
277 net->stats.tx_errors++; in mcp251x_clean()
278 dev_kfree_skb(priv->tx_skb); in mcp251x_clean()
279 if (priv->tx_busy) in mcp251x_clean()
280 can_free_echo_skb(priv->net, 0, NULL); in mcp251x_clean()
281 priv->tx_skb = NULL; in mcp251x_clean()
282 priv->tx_busy = false; in mcp251x_clean()
286 * registers via SPI is not really different conceptually than using
297 static int mcp251x_spi_trans(struct spi_device *spi, int len) in mcp251x_spi_trans() argument
299 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_spi_trans()
301 .tx_buf = priv->spi_tx_buf, in mcp251x_spi_trans()
302 .rx_buf = priv->spi_rx_buf, in mcp251x_spi_trans()
312 ret = spi_sync(spi, &m); in mcp251x_spi_trans()
314 dev_err(&spi->dev, "spi transfer failed: ret = %d\n", ret); in mcp251x_spi_trans()
318 static int mcp251x_spi_write(struct spi_device *spi, int len) in mcp251x_spi_write() argument
320 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_spi_write()
323 ret = spi_write(spi, priv->spi_tx_buf, len); in mcp251x_spi_write()
325 dev_err(&spi->dev, "spi write failed: ret = %d\n", ret); in mcp251x_spi_write()
330 static u8 mcp251x_read_reg(struct spi_device *spi, u8 reg) in mcp251x_read_reg() argument
332 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_read_reg()
335 priv->spi_tx_buf[0] = INSTRUCTION_READ; in mcp251x_read_reg()
336 priv->spi_tx_buf[1] = reg; in mcp251x_read_reg()
338 if (spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX) { in mcp251x_read_reg()
339 spi_write_then_read(spi, priv->spi_tx_buf, 2, &val, 1); in mcp251x_read_reg()
341 mcp251x_spi_trans(spi, 3); in mcp251x_read_reg()
342 val = priv->spi_rx_buf[2]; in mcp251x_read_reg()
348 static void mcp251x_read_2regs(struct spi_device *spi, u8 reg, u8 *v1, u8 *v2) in mcp251x_read_2regs() argument
350 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_read_2regs()
352 priv->spi_tx_buf[0] = INSTRUCTION_READ; in mcp251x_read_2regs()
353 priv->spi_tx_buf[1] = reg; in mcp251x_read_2regs()
355 if (spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX) { in mcp251x_read_2regs()
358 spi_write_then_read(spi, priv->spi_tx_buf, 2, val, 2); in mcp251x_read_2regs()
362 mcp251x_spi_trans(spi, 4); in mcp251x_read_2regs()
364 *v1 = priv->spi_rx_buf[2]; in mcp251x_read_2regs()
365 *v2 = priv->spi_rx_buf[3]; in mcp251x_read_2regs()
369 static void mcp251x_write_reg(struct spi_device *spi, u8 reg, u8 val) in mcp251x_write_reg() argument
371 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_write_reg()
373 priv->spi_tx_buf[0] = INSTRUCTION_WRITE; in mcp251x_write_reg()
374 priv->spi_tx_buf[1] = reg; in mcp251x_write_reg()
375 priv->spi_tx_buf[2] = val; in mcp251x_write_reg()
377 mcp251x_spi_write(spi, 3); in mcp251x_write_reg()
380 static void mcp251x_write_2regs(struct spi_device *spi, u8 reg, u8 v1, u8 v2) in mcp251x_write_2regs() argument
382 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_write_2regs()
384 priv->spi_tx_buf[0] = INSTRUCTION_WRITE; in mcp251x_write_2regs()
385 priv->spi_tx_buf[1] = reg; in mcp251x_write_2regs()
386 priv->spi_tx_buf[2] = v1; in mcp251x_write_2regs()
387 priv->spi_tx_buf[3] = v2; in mcp251x_write_2regs()
389 mcp251x_spi_write(spi, 4); in mcp251x_write_2regs()
392 static void mcp251x_write_bits(struct spi_device *spi, u8 reg, in mcp251x_write_bits() argument
395 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_write_bits()
397 priv->spi_tx_buf[0] = INSTRUCTION_BIT_MODIFY; in mcp251x_write_bits()
398 priv->spi_tx_buf[1] = reg; in mcp251x_write_bits()
399 priv->spi_tx_buf[2] = mask; in mcp251x_write_bits()
400 priv->spi_tx_buf[3] = val; in mcp251x_write_bits()
402 mcp251x_spi_write(spi, 4); in mcp251x_write_bits()
405 static u8 mcp251x_read_stat(struct spi_device *spi) in mcp251x_read_stat() argument
407 return mcp251x_read_reg(spi, CANSTAT) & CANCTRL_REQOP_MASK; in mcp251x_read_stat()
451 val = BFPCTRL_BFE(offset - MCP251X_GPIO_RX0BF); in mcp251x_gpio_request()
453 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_request()
454 mcp251x_write_bits(priv->spi, BFPCTRL, val, val); in mcp251x_gpio_request()
455 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_request()
457 priv->reg_bfpctrl |= val; in mcp251x_gpio_request()
472 val = BFPCTRL_BFE(offset - MCP251X_GPIO_RX0BF); in mcp251x_gpio_free()
474 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_free()
475 mcp251x_write_bits(priv->spi, BFPCTRL, val, 0); in mcp251x_gpio_free()
476 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_free()
478 priv->reg_bfpctrl &= ~val; in mcp251x_gpio_free()
500 mask = BFPCTRL_BFS(offset - MCP251X_GPIO_RX0BF); in mcp251x_gpio_get()
503 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_get()
504 val = mcp251x_read_reg(priv->spi, reg); in mcp251x_gpio_get()
505 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_get()
517 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_get_multiple()
519 val = mcp251x_read_reg(priv->spi, TXRTSCTRL); in mcp251x_gpio_get_multiple()
524 val = mcp251x_read_reg(priv->spi, BFPCTRL); in mcp251x_gpio_get_multiple()
528 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_get_multiple()
540 mask = BFPCTRL_BFS(offset - MCP251X_GPIO_RX0BF); in mcp251x_gpio_set()
543 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_set()
544 mcp251x_write_bits(priv->spi, BFPCTRL, mask, val); in mcp251x_gpio_set()
545 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_set()
547 priv->reg_bfpctrl &= ~mask; in mcp251x_gpio_set()
548 priv->reg_bfpctrl |= val; in mcp251x_gpio_set()
567 mutex_lock(&priv->mcp_lock); in mcp251x_gpio_set_multiple()
568 mcp251x_write_bits(priv->spi, BFPCTRL, mask, val); in mcp251x_gpio_set_multiple()
569 mutex_unlock(&priv->mcp_lock); in mcp251x_gpio_set_multiple()
571 priv->reg_bfpctrl &= ~mask; in mcp251x_gpio_set_multiple()
572 priv->reg_bfpctrl |= val; in mcp251x_gpio_set_multiple()
575 static void mcp251x_gpio_restore(struct spi_device *spi) in mcp251x_gpio_restore() argument
577 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_gpio_restore()
579 mcp251x_write_reg(spi, BFPCTRL, priv->reg_bfpctrl); in mcp251x_gpio_restore()
584 struct gpio_chip *gpio = &priv->gpio; in mcp251x_gpio_setup()
586 if (!device_property_present(&priv->spi->dev, "gpio-controller")) in mcp251x_gpio_setup()
590 gpio->label = priv->spi->modalias; in mcp251x_gpio_setup()
591 gpio->parent = &priv->spi->dev; in mcp251x_gpio_setup()
592 gpio->owner = THIS_MODULE; in mcp251x_gpio_setup()
593 gpio->request = mcp251x_gpio_request; in mcp251x_gpio_setup()
594 gpio->free = mcp251x_gpio_free; in mcp251x_gpio_setup()
595 gpio->get_direction = mcp251x_gpio_get_direction; in mcp251x_gpio_setup()
596 gpio->get = mcp251x_gpio_get; in mcp251x_gpio_setup()
597 gpio->get_multiple = mcp251x_gpio_get_multiple; in mcp251x_gpio_setup()
598 gpio->set = mcp251x_gpio_set; in mcp251x_gpio_setup()
599 gpio->set_multiple = mcp251x_gpio_set_multiple; in mcp251x_gpio_setup()
600 gpio->base = -1; in mcp251x_gpio_setup()
601 gpio->ngpio = ARRAY_SIZE(mcp251x_gpio_names); in mcp251x_gpio_setup()
602 gpio->names = mcp251x_gpio_names; in mcp251x_gpio_setup()
603 gpio->can_sleep = true; in mcp251x_gpio_setup()
605 return devm_gpiochip_add_data(&priv->spi->dev, gpio, priv); in mcp251x_gpio_setup()
608 static inline void mcp251x_gpio_restore(struct spi_device *spi) in mcp251x_gpio_restore() argument
618 static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, in mcp251x_hw_tx_frame() argument
621 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_tx_frame()
623 if (mcp251x_is_2510(spi)) { in mcp251x_hw_tx_frame()
627 mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx) + i, in mcp251x_hw_tx_frame()
630 memcpy(priv->spi_tx_buf, buf, TXBDAT_OFF + len); in mcp251x_hw_tx_frame()
631 mcp251x_spi_write(spi, TXBDAT_OFF + len); in mcp251x_hw_tx_frame()
635 static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, in mcp251x_hw_tx() argument
638 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_tx()
642 exide = (frame->can_id & CAN_EFF_FLAG) ? 1 : 0; /* Extended ID Enable */ in mcp251x_hw_tx()
644 sid = (frame->can_id & CAN_EFF_MASK) >> 18; in mcp251x_hw_tx()
646 sid = frame->can_id & CAN_SFF_MASK; /* Standard ID */ in mcp251x_hw_tx()
647 eid = frame->can_id & CAN_EFF_MASK; /* Extended ID */ in mcp251x_hw_tx()
648 rtr = (frame->can_id & CAN_RTR_FLAG) ? 1 : 0; /* Remote transmission */ in mcp251x_hw_tx()
657 buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->len; in mcp251x_hw_tx()
658 memcpy(buf + TXBDAT_OFF, frame->data, frame->len); in mcp251x_hw_tx()
659 mcp251x_hw_tx_frame(spi, buf, frame->len, tx_buf_idx); in mcp251x_hw_tx()
662 priv->spi_tx_buf[0] = INSTRUCTION_RTS(1 << tx_buf_idx); in mcp251x_hw_tx()
663 mcp251x_spi_write(priv->spi, 1); in mcp251x_hw_tx()
666 static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, in mcp251x_hw_rx_frame() argument
669 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_rx_frame()
671 if (mcp251x_is_2510(spi)) { in mcp251x_hw_rx_frame()
675 buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i); in mcp251x_hw_rx_frame()
679 buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i); in mcp251x_hw_rx_frame()
681 priv->spi_tx_buf[RXBCTRL_OFF] = INSTRUCTION_READ_RXB(buf_idx); in mcp251x_hw_rx_frame()
682 if (spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX) { in mcp251x_hw_rx_frame()
683 spi_write_then_read(spi, priv->spi_tx_buf, 1, in mcp251x_hw_rx_frame()
684 priv->spi_rx_buf, in mcp251x_hw_rx_frame()
686 memcpy(buf + 1, priv->spi_rx_buf, in mcp251x_hw_rx_frame()
687 SPI_TRANSFER_BUF_LEN - 1); in mcp251x_hw_rx_frame()
689 mcp251x_spi_trans(spi, SPI_TRANSFER_BUF_LEN); in mcp251x_hw_rx_frame()
690 memcpy(buf, priv->spi_rx_buf, SPI_TRANSFER_BUF_LEN); in mcp251x_hw_rx_frame()
695 static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx) in mcp251x_hw_rx() argument
697 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_rx()
702 skb = alloc_can_skb(priv->net, &frame); in mcp251x_hw_rx()
704 dev_err(&spi->dev, "cannot allocate RX skb\n"); in mcp251x_hw_rx()
705 priv->net->stats.rx_dropped++; in mcp251x_hw_rx()
709 mcp251x_hw_rx_frame(spi, buf, buf_idx); in mcp251x_hw_rx()
712 frame->can_id = CAN_EFF_FLAG; in mcp251x_hw_rx()
713 frame->can_id |= in mcp251x_hw_rx()
723 frame->can_id |= CAN_RTR_FLAG; in mcp251x_hw_rx()
726 frame->can_id = in mcp251x_hw_rx()
730 frame->can_id |= CAN_RTR_FLAG; in mcp251x_hw_rx()
733 frame->len = can_cc_dlc2len(buf[RXBDLC_OFF] & RXBDLC_LEN_MASK); in mcp251x_hw_rx()
734 if (!(frame->can_id & CAN_RTR_FLAG)) { in mcp251x_hw_rx()
735 memcpy(frame->data, buf + RXBDAT_OFF, frame->len); in mcp251x_hw_rx()
737 priv->net->stats.rx_bytes += frame->len; in mcp251x_hw_rx()
739 priv->net->stats.rx_packets++; in mcp251x_hw_rx()
744 static void mcp251x_hw_sleep(struct spi_device *spi) in mcp251x_hw_sleep() argument
746 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_SLEEP); in mcp251x_hw_sleep()
750 static int mcp251x_hw_wake(struct spi_device *spi) in mcp251x_hw_wake() argument
756 disable_irq(spi->irq); in mcp251x_hw_wake()
757 mcp251x_write_2regs(spi, CANINTE, CANINTE_WAKIE, CANINTF_WAKIF); in mcp251x_hw_wake()
763 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_CONF); in mcp251x_hw_wake()
766 ret = mcp251x_read_stat_poll_timeout(spi, value, value == CANCTRL_REQOP_CONF, in mcp251x_hw_wake()
770 dev_err(&spi->dev, "MCP251x didn't enter in config mode\n"); in mcp251x_hw_wake()
775 mcp251x_write_2regs(spi, CANINTE, 0x00, 0x00); in mcp251x_hw_wake()
776 enable_irq(spi->irq); in mcp251x_hw_wake()
785 struct spi_device *spi = priv->spi; in mcp251x_hard_start_xmit() local
787 if (priv->tx_skb || priv->tx_busy) { in mcp251x_hard_start_xmit()
788 dev_warn(&spi->dev, "hard_xmit called while tx busy\n"); in mcp251x_hard_start_xmit()
796 priv->tx_skb = skb; in mcp251x_hard_start_xmit()
797 queue_work(priv->wq, &priv->tx_work); in mcp251x_hard_start_xmit()
809 /* We have to delay work since SPI I/O may sleep */ in mcp251x_do_set_mode()
810 priv->can.state = CAN_STATE_ERROR_ACTIVE; in mcp251x_do_set_mode()
811 priv->restart_tx = 1; in mcp251x_do_set_mode()
812 if (priv->can.restart_ms == 0) in mcp251x_do_set_mode()
813 priv->after_suspend = AFTER_SUSPEND_RESTART; in mcp251x_do_set_mode()
814 queue_work(priv->wq, &priv->restart_work); in mcp251x_do_set_mode()
817 return -EOPNOTSUPP; in mcp251x_do_set_mode()
823 static int mcp251x_set_normal_mode(struct spi_device *spi) in mcp251x_set_normal_mode() argument
825 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_set_normal_mode()
830 mcp251x_write_reg(spi, CANINTE, in mcp251x_set_normal_mode()
834 if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) { in mcp251x_set_normal_mode()
836 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK); in mcp251x_set_normal_mode()
837 } else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) { in mcp251x_set_normal_mode()
838 /* Put device into listen-only mode */ in mcp251x_set_normal_mode()
839 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LISTEN_ONLY); in mcp251x_set_normal_mode()
842 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL); in mcp251x_set_normal_mode()
845 ret = mcp251x_read_stat_poll_timeout(spi, value, value == 0, in mcp251x_set_normal_mode()
849 dev_err(&spi->dev, "MCP251x didn't enter in normal mode\n"); in mcp251x_set_normal_mode()
853 priv->can.state = CAN_STATE_ERROR_ACTIVE; in mcp251x_set_normal_mode()
860 struct can_bittiming *bt = &priv->can.bittiming; in mcp251x_do_set_bittiming()
861 struct spi_device *spi = priv->spi; in mcp251x_do_set_bittiming() local
863 mcp251x_write_reg(spi, CNF1, ((bt->sjw - 1) << CNF1_SJW_SHIFT) | in mcp251x_do_set_bittiming()
864 (bt->brp - 1)); in mcp251x_do_set_bittiming()
865 mcp251x_write_reg(spi, CNF2, CNF2_BTLMODE | in mcp251x_do_set_bittiming()
866 (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES ? in mcp251x_do_set_bittiming()
868 ((bt->phase_seg1 - 1) << CNF2_PS1_SHIFT) | in mcp251x_do_set_bittiming()
869 (bt->prop_seg - 1)); in mcp251x_do_set_bittiming()
870 mcp251x_write_bits(spi, CNF3, CNF3_PHSEG2_MASK, in mcp251x_do_set_bittiming()
871 (bt->phase_seg2 - 1)); in mcp251x_do_set_bittiming()
872 dev_dbg(&spi->dev, "CNF: 0x%02x 0x%02x 0x%02x\n", in mcp251x_do_set_bittiming()
873 mcp251x_read_reg(spi, CNF1), in mcp251x_do_set_bittiming()
874 mcp251x_read_reg(spi, CNF2), in mcp251x_do_set_bittiming()
875 mcp251x_read_reg(spi, CNF3)); in mcp251x_do_set_bittiming()
880 static int mcp251x_setup(struct net_device *net, struct spi_device *spi) in mcp251x_setup() argument
884 mcp251x_write_reg(spi, RXBCTRL(0), in mcp251x_setup()
886 mcp251x_write_reg(spi, RXBCTRL(1), in mcp251x_setup()
891 static int mcp251x_hw_reset(struct spi_device *spi) in mcp251x_hw_reset() argument
893 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_reset()
900 priv->spi_tx_buf[0] = INSTRUCTION_RESET; in mcp251x_hw_reset()
901 ret = mcp251x_spi_write(spi, 1); in mcp251x_hw_reset()
909 ret = mcp251x_read_stat_poll_timeout(spi, value, value == CANCTRL_REQOP_CONF, in mcp251x_hw_reset()
913 dev_err(&spi->dev, "MCP251x didn't enter in conf mode after reset\n"); in mcp251x_hw_reset()
917 static int mcp251x_hw_probe(struct spi_device *spi) in mcp251x_hw_probe() argument
922 ret = mcp251x_hw_reset(spi); in mcp251x_hw_probe()
926 ctrl = mcp251x_read_reg(spi, CANCTRL); in mcp251x_hw_probe()
928 dev_dbg(&spi->dev, "CANCTRL 0x%02x\n", ctrl); in mcp251x_hw_probe()
932 return -ENODEV; in mcp251x_hw_probe()
951 struct spi_device *spi = priv->spi; in mcp251x_stop() local
955 priv->force_quit = 1; in mcp251x_stop()
956 free_irq(spi->irq, priv); in mcp251x_stop()
958 mutex_lock(&priv->mcp_lock); in mcp251x_stop()
961 mcp251x_write_2regs(spi, CANINTE, 0x00, 0x00); in mcp251x_stop()
963 mcp251x_write_reg(spi, TXBCTRL(0), 0); in mcp251x_stop()
966 mcp251x_hw_sleep(spi); in mcp251x_stop()
968 mcp251x_power_enable(priv->transceiver, 0); in mcp251x_stop()
970 priv->can.state = CAN_STATE_STOPPED; in mcp251x_stop()
972 mutex_unlock(&priv->mcp_lock); in mcp251x_stop()
984 frame->can_id |= can_id; in mcp251x_error_skb()
985 frame->data[1] = data1; in mcp251x_error_skb()
996 struct spi_device *spi = priv->spi; in mcp251x_tx_work_handler() local
997 struct net_device *net = priv->net; in mcp251x_tx_work_handler()
1000 mutex_lock(&priv->mcp_lock); in mcp251x_tx_work_handler()
1001 if (priv->tx_skb) { in mcp251x_tx_work_handler()
1002 if (priv->can.state == CAN_STATE_BUS_OFF) { in mcp251x_tx_work_handler()
1005 frame = (struct can_frame *)priv->tx_skb->data; in mcp251x_tx_work_handler()
1007 if (frame->len > CAN_FRAME_MAX_DATA_LEN) in mcp251x_tx_work_handler()
1008 frame->len = CAN_FRAME_MAX_DATA_LEN; in mcp251x_tx_work_handler()
1009 mcp251x_hw_tx(spi, frame, 0); in mcp251x_tx_work_handler()
1010 priv->tx_busy = true; in mcp251x_tx_work_handler()
1011 can_put_echo_skb(priv->tx_skb, net, 0, 0); in mcp251x_tx_work_handler()
1012 priv->tx_skb = NULL; in mcp251x_tx_work_handler()
1015 mutex_unlock(&priv->mcp_lock); in mcp251x_tx_work_handler()
1022 struct spi_device *spi = priv->spi; in mcp251x_restart_work_handler() local
1023 struct net_device *net = priv->net; in mcp251x_restart_work_handler()
1025 mutex_lock(&priv->mcp_lock); in mcp251x_restart_work_handler()
1026 if (priv->after_suspend) { in mcp251x_restart_work_handler()
1027 if (priv->after_suspend & AFTER_SUSPEND_POWER) { in mcp251x_restart_work_handler()
1028 mcp251x_hw_reset(spi); in mcp251x_restart_work_handler()
1029 mcp251x_setup(net, spi); in mcp251x_restart_work_handler()
1030 mcp251x_gpio_restore(spi); in mcp251x_restart_work_handler()
1032 mcp251x_hw_wake(spi); in mcp251x_restart_work_handler()
1034 priv->force_quit = 0; in mcp251x_restart_work_handler()
1035 if (priv->after_suspend & AFTER_SUSPEND_RESTART) { in mcp251x_restart_work_handler()
1036 mcp251x_set_normal_mode(spi); in mcp251x_restart_work_handler()
1037 } else if (priv->after_suspend & AFTER_SUSPEND_UP) { in mcp251x_restart_work_handler()
1040 mcp251x_set_normal_mode(spi); in mcp251x_restart_work_handler()
1043 mcp251x_hw_sleep(spi); in mcp251x_restart_work_handler()
1045 priv->after_suspend = 0; in mcp251x_restart_work_handler()
1048 if (priv->restart_tx) { in mcp251x_restart_work_handler()
1049 priv->restart_tx = 0; in mcp251x_restart_work_handler()
1050 mcp251x_write_reg(spi, TXBCTRL(0), 0); in mcp251x_restart_work_handler()
1055 mutex_unlock(&priv->mcp_lock); in mcp251x_restart_work_handler()
1061 struct spi_device *spi = priv->spi; in mcp251x_can_ist() local
1062 struct net_device *net = priv->net; in mcp251x_can_ist()
1064 mutex_lock(&priv->mcp_lock); in mcp251x_can_ist()
1065 while (!priv->force_quit) { in mcp251x_can_ist()
1071 mcp251x_read_2regs(spi, CANINTF, &intf, &eflag); in mcp251x_can_ist()
1075 mcp251x_hw_rx(spi, 0); in mcp251x_can_ist()
1079 if (mcp251x_is_2510(spi)) in mcp251x_can_ist()
1080 mcp251x_write_bits(spi, CANINTF, in mcp251x_can_ist()
1083 /* check if buffer 1 is already known to be full, no need to re-read */ in mcp251x_can_ist()
1088 mcp251x_read_2regs(spi, CANINTF, &intf1, &eflag1); in mcp251x_can_ist()
1098 mcp251x_hw_rx(spi, 1); in mcp251x_can_ist()
1100 if (mcp251x_is_2510(spi)) in mcp251x_can_ist()
1111 mcp251x_write_bits(spi, CANINTF, clear_intf, 0x00); in mcp251x_can_ist()
1114 mcp251x_write_bits(spi, EFLG, eflag, 0x00); in mcp251x_can_ist()
1141 switch (priv->can.state) { in mcp251x_can_ist()
1145 priv->can.can_stats.error_warning++; in mcp251x_can_ist()
1150 priv->can.can_stats.error_passive++; in mcp251x_can_ist()
1155 priv->can.state = new_state; in mcp251x_can_ist()
1161 net->stats.rx_over_errors++; in mcp251x_can_ist()
1162 net->stats.rx_errors++; in mcp251x_can_ist()
1165 net->stats.rx_over_errors++; in mcp251x_can_ist()
1166 net->stats.rx_errors++; in mcp251x_can_ist()
1174 if (priv->can.state == CAN_STATE_BUS_OFF) { in mcp251x_can_ist()
1175 if (priv->can.restart_ms == 0) { in mcp251x_can_ist()
1176 priv->force_quit = 1; in mcp251x_can_ist()
1177 priv->can.can_stats.bus_off++; in mcp251x_can_ist()
1179 mcp251x_hw_sleep(spi); in mcp251x_can_ist()
1188 if (priv->tx_busy) { in mcp251x_can_ist()
1189 net->stats.tx_packets++; in mcp251x_can_ist()
1190 net->stats.tx_bytes += can_get_echo_skb(net, 0, in mcp251x_can_ist()
1192 priv->tx_busy = false; in mcp251x_can_ist()
1197 mutex_unlock(&priv->mcp_lock); in mcp251x_can_ist()
1204 struct spi_device *spi = priv->spi; in mcp251x_open() local
1210 dev_err(&spi->dev, "unable to set initial baudrate!\n"); in mcp251x_open()
1214 mutex_lock(&priv->mcp_lock); in mcp251x_open()
1215 mcp251x_power_enable(priv->transceiver, 1); in mcp251x_open()
1217 priv->force_quit = 0; in mcp251x_open()
1218 priv->tx_skb = NULL; in mcp251x_open()
1219 priv->tx_busy = false; in mcp251x_open()
1221 if (!dev_fwnode(&spi->dev)) in mcp251x_open()
1224 ret = request_threaded_irq(spi->irq, NULL, mcp251x_can_ist, in mcp251x_open()
1225 flags | IRQF_ONESHOT, dev_name(&spi->dev), in mcp251x_open()
1228 dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq); in mcp251x_open()
1232 ret = mcp251x_hw_wake(spi); in mcp251x_open()
1235 ret = mcp251x_setup(net, spi); in mcp251x_open()
1238 ret = mcp251x_set_normal_mode(spi); in mcp251x_open()
1243 mutex_unlock(&priv->mcp_lock); in mcp251x_open()
1248 free_irq(spi->irq, priv); in mcp251x_open()
1249 mcp251x_hw_sleep(spi); in mcp251x_open()
1251 mcp251x_power_enable(priv->transceiver, 0); in mcp251x_open()
1253 mutex_unlock(&priv->mcp_lock); in mcp251x_open()
1300 MODULE_DEVICE_TABLE(spi, mcp251x_id_table);
1302 static int mcp251x_can_probe(struct spi_device *spi) in mcp251x_can_probe() argument
1304 const void *match = device_get_match_data(&spi->dev); in mcp251x_can_probe()
1311 clk = devm_clk_get_optional(&spi->dev, NULL); in mcp251x_can_probe()
1317 device_property_read_u32(&spi->dev, "clock-frequency", &freq); in mcp251x_can_probe()
1321 return -ERANGE; in mcp251x_can_probe()
1326 return -ENOMEM; in mcp251x_can_probe()
1332 net->netdev_ops = &mcp251x_netdev_ops; in mcp251x_can_probe()
1333 net->ethtool_ops = &mcp251x_ethtool_ops; in mcp251x_can_probe()
1334 net->flags |= IFF_ECHO; in mcp251x_can_probe()
1337 priv->can.bittiming_const = &mcp251x_bittiming_const; in mcp251x_can_probe()
1338 priv->can.do_set_mode = mcp251x_do_set_mode; in mcp251x_can_probe()
1339 priv->can.clock.freq = freq / 2; in mcp251x_can_probe()
1340 priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | in mcp251x_can_probe()
1343 priv->model = (enum mcp251x_model)(uintptr_t)match; in mcp251x_can_probe()
1345 priv->model = spi_get_device_id(spi)->driver_data; in mcp251x_can_probe()
1346 priv->net = net; in mcp251x_can_probe()
1347 priv->clk = clk; in mcp251x_can_probe()
1349 spi_set_drvdata(spi, priv); in mcp251x_can_probe()
1351 /* Configure the SPI bus */ in mcp251x_can_probe()
1352 spi->bits_per_word = 8; in mcp251x_can_probe()
1353 if (mcp251x_is_2510(spi)) in mcp251x_can_probe()
1354 spi->max_speed_hz = spi->max_speed_hz ? : 5 * 1000 * 1000; in mcp251x_can_probe()
1356 spi->max_speed_hz = spi->max_speed_hz ? : 10 * 1000 * 1000; in mcp251x_can_probe()
1357 ret = spi_setup(spi); in mcp251x_can_probe()
1361 priv->power = devm_regulator_get_optional(&spi->dev, "vdd"); in mcp251x_can_probe()
1362 priv->transceiver = devm_regulator_get_optional(&spi->dev, "xceiver"); in mcp251x_can_probe()
1363 if ((PTR_ERR(priv->power) == -EPROBE_DEFER) || in mcp251x_can_probe()
1364 (PTR_ERR(priv->transceiver) == -EPROBE_DEFER)) { in mcp251x_can_probe()
1365 ret = -EPROBE_DEFER; in mcp251x_can_probe()
1369 ret = mcp251x_power_enable(priv->power, 1); in mcp251x_can_probe()
1373 priv->wq = alloc_workqueue("mcp251x_wq", WQ_FREEZABLE | WQ_MEM_RECLAIM, in mcp251x_can_probe()
1375 if (!priv->wq) { in mcp251x_can_probe()
1376 ret = -ENOMEM; in mcp251x_can_probe()
1379 INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler); in mcp251x_can_probe()
1380 INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler); in mcp251x_can_probe()
1382 priv->spi = spi; in mcp251x_can_probe()
1383 mutex_init(&priv->mcp_lock); in mcp251x_can_probe()
1385 priv->spi_tx_buf = devm_kzalloc(&spi->dev, SPI_TRANSFER_BUF_LEN, in mcp251x_can_probe()
1387 if (!priv->spi_tx_buf) { in mcp251x_can_probe()
1388 ret = -ENOMEM; in mcp251x_can_probe()
1392 priv->spi_rx_buf = devm_kzalloc(&spi->dev, SPI_TRANSFER_BUF_LEN, in mcp251x_can_probe()
1394 if (!priv->spi_rx_buf) { in mcp251x_can_probe()
1395 ret = -ENOMEM; in mcp251x_can_probe()
1399 SET_NETDEV_DEV(net, &spi->dev); in mcp251x_can_probe()
1402 ret = mcp251x_hw_probe(spi); in mcp251x_can_probe()
1404 if (ret == -ENODEV) in mcp251x_can_probe()
1405 dev_err(&spi->dev, "Cannot initialize MCP%x. Wrong wiring?\n", in mcp251x_can_probe()
1406 priv->model); in mcp251x_can_probe()
1410 mcp251x_hw_sleep(spi); in mcp251x_can_probe()
1420 netdev_info(net, "MCP%x successfully initialized.\n", priv->model); in mcp251x_can_probe()
1427 destroy_workqueue(priv->wq); in mcp251x_can_probe()
1428 priv->wq = NULL; in mcp251x_can_probe()
1429 mcp251x_power_enable(priv->power, 0); in mcp251x_can_probe()
1437 dev_err(&spi->dev, "Probe failed, err=%d\n", -ret); in mcp251x_can_probe()
1441 static void mcp251x_can_remove(struct spi_device *spi) in mcp251x_can_remove() argument
1443 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_can_remove()
1444 struct net_device *net = priv->net; in mcp251x_can_remove()
1448 mcp251x_power_enable(priv->power, 0); in mcp251x_can_remove()
1450 destroy_workqueue(priv->wq); in mcp251x_can_remove()
1451 priv->wq = NULL; in mcp251x_can_remove()
1453 clk_disable_unprepare(priv->clk); in mcp251x_can_remove()
1460 struct spi_device *spi = to_spi_device(dev); in mcp251x_can_suspend() local
1461 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_can_suspend()
1462 struct net_device *net = priv->net; in mcp251x_can_suspend()
1464 priv->force_quit = 1; in mcp251x_can_suspend()
1465 disable_irq(spi->irq); in mcp251x_can_suspend()
1472 mcp251x_hw_sleep(spi); in mcp251x_can_suspend()
1473 mcp251x_power_enable(priv->transceiver, 0); in mcp251x_can_suspend()
1474 priv->after_suspend = AFTER_SUSPEND_UP; in mcp251x_can_suspend()
1476 priv->after_suspend = AFTER_SUSPEND_DOWN; in mcp251x_can_suspend()
1479 mcp251x_power_enable(priv->power, 0); in mcp251x_can_suspend()
1480 priv->after_suspend |= AFTER_SUSPEND_POWER; in mcp251x_can_suspend()
1487 struct spi_device *spi = to_spi_device(dev); in mcp251x_can_resume() local
1488 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_can_resume()
1490 if (priv->after_suspend & AFTER_SUSPEND_POWER) in mcp251x_can_resume()
1491 mcp251x_power_enable(priv->power, 1); in mcp251x_can_resume()
1492 if (priv->after_suspend & AFTER_SUSPEND_UP) in mcp251x_can_resume()
1493 mcp251x_power_enable(priv->transceiver, 1); in mcp251x_can_resume()
1495 if (priv->after_suspend & (AFTER_SUSPEND_POWER | AFTER_SUSPEND_UP)) in mcp251x_can_resume()
1496 queue_work(priv->wq, &priv->restart_work); in mcp251x_can_resume()
1498 priv->after_suspend = 0; in mcp251x_can_resume()
1500 priv->force_quit = 0; in mcp251x_can_resume()
1501 enable_irq(spi->irq); in mcp251x_can_resume()