Lines Matching full:spi

2 /* CAN bus driver for Microchip 251x/25625 CAN Controller with SPI Interface
39 #include <linux/spi/spi.h>
43 /* SPI interface instruction set */
170 /* Buffer size required for the largest SPI transfer (i.e., reading a
204 struct spi_device *spi; member
207 struct mutex mcp_lock; /* SPI device lock */
232 static inline int mcp251x_is_##_model(struct spi_device *spi) \
234 struct mcp251x_priv *priv = spi_get_drvdata(spi); \
254 * registers via SPI is not really different conceptually than using
265 static int mcp251x_spi_trans(struct spi_device *spi, int len) in mcp251x_spi_trans() argument
267 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_spi_trans()
280 ret = spi_sync(spi, &m); in mcp251x_spi_trans()
282 dev_err(&spi->dev, "spi transfer failed: ret = %d\n", ret); in mcp251x_spi_trans()
286 static u8 mcp251x_read_reg(struct spi_device *spi, u8 reg) in mcp251x_read_reg() argument
288 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_read_reg()
294 mcp251x_spi_trans(spi, 3); in mcp251x_read_reg()
300 static void mcp251x_read_2regs(struct spi_device *spi, u8 reg, u8 *v1, u8 *v2) in mcp251x_read_2regs() argument
302 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_read_2regs()
307 mcp251x_spi_trans(spi, 4); in mcp251x_read_2regs()
313 static void mcp251x_write_reg(struct spi_device *spi, u8 reg, u8 val) in mcp251x_write_reg() argument
315 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_write_reg()
321 mcp251x_spi_trans(spi, 3); in mcp251x_write_reg()
324 static void mcp251x_write_bits(struct spi_device *spi, u8 reg, in mcp251x_write_bits() argument
327 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_write_bits()
334 mcp251x_spi_trans(spi, 4); in mcp251x_write_bits()
337 static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, in mcp251x_hw_tx_frame() argument
340 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_tx_frame()
342 if (mcp251x_is_2510(spi)) { in mcp251x_hw_tx_frame()
346 mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx) + i, in mcp251x_hw_tx_frame()
350 mcp251x_spi_trans(spi, TXBDAT_OFF + len); in mcp251x_hw_tx_frame()
354 static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, in mcp251x_hw_tx() argument
357 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_tx()
378 mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx); in mcp251x_hw_tx()
382 mcp251x_spi_trans(priv->spi, 1); in mcp251x_hw_tx()
385 static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, in mcp251x_hw_rx_frame() argument
388 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_rx_frame()
390 if (mcp251x_is_2510(spi)) { in mcp251x_hw_rx_frame()
394 buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i); in mcp251x_hw_rx_frame()
398 buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i); in mcp251x_hw_rx_frame()
401 mcp251x_spi_trans(spi, SPI_TRANSFER_BUF_LEN); in mcp251x_hw_rx_frame()
406 static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx) in mcp251x_hw_rx() argument
408 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_rx()
415 dev_err(&spi->dev, "cannot allocate RX skb\n"); in mcp251x_hw_rx()
420 mcp251x_hw_rx_frame(spi, buf, buf_idx); in mcp251x_hw_rx()
455 static void mcp251x_hw_sleep(struct spi_device *spi) in mcp251x_hw_sleep() argument
457 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_SLEEP); in mcp251x_hw_sleep()
464 struct spi_device *spi = priv->spi; in mcp251x_hard_start_xmit() local
467 dev_warn(&spi->dev, "hard_xmit called while tx busy\n"); in mcp251x_hard_start_xmit()
488 /* We have to delay work since SPI I/O may sleep */ in mcp251x_do_set_mode()
502 static int mcp251x_set_normal_mode(struct spi_device *spi) in mcp251x_set_normal_mode() argument
504 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_set_normal_mode()
508 mcp251x_write_reg(spi, CANINTE, in mcp251x_set_normal_mode()
514 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK); in mcp251x_set_normal_mode()
517 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LISTEN_ONLY); in mcp251x_set_normal_mode()
520 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL); in mcp251x_set_normal_mode()
524 while (mcp251x_read_reg(spi, CANSTAT) & CANCTRL_REQOP_MASK) { in mcp251x_set_normal_mode()
527 dev_err(&spi->dev, "MCP251x didn't enter in normal mode\n"); in mcp251x_set_normal_mode()
540 struct spi_device *spi = priv->spi; in mcp251x_do_set_bittiming() local
542 mcp251x_write_reg(spi, CNF1, ((bt->sjw - 1) << CNF1_SJW_SHIFT) | in mcp251x_do_set_bittiming()
544 mcp251x_write_reg(spi, CNF2, CNF2_BTLMODE | in mcp251x_do_set_bittiming()
549 mcp251x_write_bits(spi, CNF3, CNF3_PHSEG2_MASK, in mcp251x_do_set_bittiming()
551 dev_dbg(&spi->dev, "CNF: 0x%02x 0x%02x 0x%02x\n", in mcp251x_do_set_bittiming()
552 mcp251x_read_reg(spi, CNF1), in mcp251x_do_set_bittiming()
553 mcp251x_read_reg(spi, CNF2), in mcp251x_do_set_bittiming()
554 mcp251x_read_reg(spi, CNF3)); in mcp251x_do_set_bittiming()
559 static int mcp251x_setup(struct net_device *net, struct spi_device *spi) in mcp251x_setup() argument
563 mcp251x_write_reg(spi, RXBCTRL(0), in mcp251x_setup()
565 mcp251x_write_reg(spi, RXBCTRL(1), in mcp251x_setup()
570 static int mcp251x_hw_reset(struct spi_device *spi) in mcp251x_hw_reset() argument
572 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_hw_reset()
580 ret = mcp251x_spi_trans(spi, 1); in mcp251x_hw_reset()
589 while ((mcp251x_read_reg(spi, CANSTAT) & CANCTRL_REQOP_MASK) != in mcp251x_hw_reset()
595 dev_err(&spi->dev, in mcp251x_hw_reset()
603 static int mcp251x_hw_probe(struct spi_device *spi) in mcp251x_hw_probe() argument
608 ret = mcp251x_hw_reset(spi); in mcp251x_hw_probe()
612 ctrl = mcp251x_read_reg(spi, CANCTRL); in mcp251x_hw_probe()
614 dev_dbg(&spi->dev, "CANCTRL 0x%02x\n", ctrl); in mcp251x_hw_probe()
637 struct spi_device *spi = priv->spi; in mcp251x_stop() local
642 free_irq(spi->irq, priv); in mcp251x_stop()
649 mcp251x_write_reg(spi, CANINTE, 0x00); in mcp251x_stop()
650 mcp251x_write_reg(spi, CANINTF, 0x00); in mcp251x_stop()
652 mcp251x_write_reg(spi, TXBCTRL(0), 0); in mcp251x_stop()
655 mcp251x_hw_sleep(spi); in mcp251x_stop()
687 struct spi_device *spi = priv->spi; in mcp251x_tx_work_handler() local
700 mcp251x_hw_tx(spi, frame, 0); in mcp251x_tx_work_handler()
713 struct spi_device *spi = priv->spi; in mcp251x_restart_work_handler() local
718 mcp251x_hw_reset(spi); in mcp251x_restart_work_handler()
719 mcp251x_setup(net, spi); in mcp251x_restart_work_handler()
722 mcp251x_set_normal_mode(spi); in mcp251x_restart_work_handler()
726 mcp251x_set_normal_mode(spi); in mcp251x_restart_work_handler()
729 mcp251x_hw_sleep(spi); in mcp251x_restart_work_handler()
736 mcp251x_write_reg(spi, TXBCTRL(0), 0); in mcp251x_restart_work_handler()
747 struct spi_device *spi = priv->spi; in mcp251x_can_ist() local
757 mcp251x_read_2regs(spi, CANINTF, &intf, &eflag); in mcp251x_can_ist()
764 mcp251x_hw_rx(spi, 0); in mcp251x_can_ist()
768 if (mcp251x_is_2510(spi)) in mcp251x_can_ist()
769 mcp251x_write_bits(spi, CANINTF, in mcp251x_can_ist()
775 mcp251x_hw_rx(spi, 1); in mcp251x_can_ist()
777 if (mcp251x_is_2510(spi)) in mcp251x_can_ist()
785 mcp251x_write_bits(spi, CANINTF, clear_intf, 0x00); in mcp251x_can_ist()
788 mcp251x_write_bits(spi, EFLG, eflag, 0x00); in mcp251x_can_ist()
853 mcp251x_hw_sleep(spi); in mcp251x_can_ist()
879 struct spi_device *spi = priv->spi; in mcp251x_open() local
885 dev_err(&spi->dev, "unable to set initial baudrate!\n"); in mcp251x_open()
896 if (!dev_fwnode(&spi->dev)) in mcp251x_open()
899 ret = request_threaded_irq(spi->irq, NULL, mcp251x_can_ist, in mcp251x_open()
900 flags | IRQF_ONESHOT, dev_name(&spi->dev), in mcp251x_open()
903 dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq); in mcp251x_open()
916 ret = mcp251x_hw_reset(spi); in mcp251x_open()
919 ret = mcp251x_setup(net, spi); in mcp251x_open()
922 ret = mcp251x_set_normal_mode(spi); in mcp251x_open()
936 free_irq(spi->irq, priv); in mcp251x_open()
937 mcp251x_hw_sleep(spi); in mcp251x_open()
984 MODULE_DEVICE_TABLE(spi, mcp251x_id_table);
986 static int mcp251x_can_probe(struct spi_device *spi) in mcp251x_can_probe() argument
988 const void *match = device_get_match_data(&spi->dev); in mcp251x_can_probe()
989 struct mcp251x_platform_data *pdata = dev_get_platdata(&spi->dev); in mcp251x_can_probe()
995 clk = devm_clk_get_optional(&spi->dev, NULL); in mcp251x_can_probe()
1028 priv->model = spi_get_device_id(spi)->driver_data; in mcp251x_can_probe()
1032 spi_set_drvdata(spi, priv); in mcp251x_can_probe()
1034 /* Configure the SPI bus */ in mcp251x_can_probe()
1035 spi->bits_per_word = 8; in mcp251x_can_probe()
1036 if (mcp251x_is_2510(spi)) in mcp251x_can_probe()
1037 spi->max_speed_hz = spi->max_speed_hz ? : 5 * 1000 * 1000; in mcp251x_can_probe()
1039 spi->max_speed_hz = spi->max_speed_hz ? : 10 * 1000 * 1000; in mcp251x_can_probe()
1040 ret = spi_setup(spi); in mcp251x_can_probe()
1044 priv->power = devm_regulator_get_optional(&spi->dev, "vdd"); in mcp251x_can_probe()
1045 priv->transceiver = devm_regulator_get_optional(&spi->dev, "xceiver"); in mcp251x_can_probe()
1056 priv->spi = spi; in mcp251x_can_probe()
1059 priv->spi_tx_buf = devm_kzalloc(&spi->dev, SPI_TRANSFER_BUF_LEN, in mcp251x_can_probe()
1066 priv->spi_rx_buf = devm_kzalloc(&spi->dev, SPI_TRANSFER_BUF_LEN, in mcp251x_can_probe()
1073 SET_NETDEV_DEV(net, &spi->dev); in mcp251x_can_probe()
1076 ret = mcp251x_hw_probe(spi); in mcp251x_can_probe()
1079 dev_err(&spi->dev, "Cannot initialize MCP%x. Wrong wiring?\n", in mcp251x_can_probe()
1084 mcp251x_hw_sleep(spi); in mcp251x_can_probe()
1104 dev_err(&spi->dev, "Probe failed, err=%d\n", -ret); in mcp251x_can_probe()
1108 static int mcp251x_can_remove(struct spi_device *spi) in mcp251x_can_remove() argument
1110 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_can_remove()
1126 struct spi_device *spi = to_spi_device(dev); in mcp251x_can_suspend() local
1127 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_can_suspend()
1131 disable_irq(spi->irq); in mcp251x_can_suspend()
1138 mcp251x_hw_sleep(spi); in mcp251x_can_suspend()
1153 struct spi_device *spi = to_spi_device(dev); in mcp251x_can_resume() local
1154 struct mcp251x_priv *priv = spi_get_drvdata(spi); in mcp251x_can_resume()
1167 enable_irq(spi->irq); in mcp251x_can_resume()