Lines Matching full:spi

2 /* CAN bus driver for Microchip 251x/25625 CAN Controller with SPI Interface
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); \
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()
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()
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()
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()
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()
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()
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()
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()
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()
454 mcp251x_write_bits(priv->spi, BFPCTRL, val, val); in mcp251x_gpio_request()
475 mcp251x_write_bits(priv->spi, BFPCTRL, val, 0); in mcp251x_gpio_free()
504 val = mcp251x_read_reg(priv->spi, reg); in mcp251x_gpio_get()
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()
544 mcp251x_write_bits(priv->spi, BFPCTRL, mask, val); in mcp251x_gpio_set()
568 mcp251x_write_bits(priv->spi, BFPCTRL, mask, 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()
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()
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()
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()
659 mcp251x_hw_tx_frame(spi, buf, frame->len, 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()
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()
689 mcp251x_spi_trans(spi, 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()
704 dev_err(&spi->dev, "cannot allocate RX skb\n"); in mcp251x_hw_rx()
709 mcp251x_hw_rx_frame(spi, buf, buf_idx); 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_nosync(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
788 dev_warn(&spi->dev, "hard_xmit called while tx busy\n"); in mcp251x_hard_start_xmit()
809 /* We have to delay work since SPI I/O may sleep */ 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()
836 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK); 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()
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()
865 mcp251x_write_reg(spi, CNF2, CNF2_BTLMODE | in mcp251x_do_set_bittiming()
870 mcp251x_write_bits(spi, CNF3, CNF3_PHSEG2_MASK, 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()
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()
951 struct spi_device *spi = priv->spi; in mcp251x_stop() local
956 free_irq(spi->irq, priv); 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()
996 struct spi_device *spi = priv->spi; in mcp251x_tx_work_handler() local
1009 mcp251x_hw_tx(spi, frame, 0); in mcp251x_tx_work_handler()
1022 struct spi_device *spi = priv->spi; in mcp251x_restart_work_handler() local
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()
1036 mcp251x_set_normal_mode(spi); 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()
1050 mcp251x_write_reg(spi, TXBCTRL(0), 0); in mcp251x_restart_work_handler()
1061 struct spi_device *spi = priv->spi; in mcp251x_can_ist() local
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()
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()
1179 mcp251x_hw_sleep(spi); 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()
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()
1248 free_irq(spi->irq, priv); in mcp251x_open()
1249 mcp251x_hw_sleep(spi); 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()
1345 priv->model = spi_get_device_id(spi)->driver_data; 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()
1382 priv->spi = spi; in mcp251x_can_probe()
1385 priv->spi_tx_buf = devm_kzalloc(&spi->dev, SPI_TRANSFER_BUF_LEN, in mcp251x_can_probe()
1392 priv->spi_rx_buf = devm_kzalloc(&spi->dev, SPI_TRANSFER_BUF_LEN, 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()
1405 dev_err(&spi->dev, "Cannot initialize MCP%x. Wrong wiring?\n", in mcp251x_can_probe()
1410 mcp251x_hw_sleep(spi); 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()
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()
1465 disable_irq(spi->irq); in mcp251x_can_suspend()
1472 mcp251x_hw_sleep(spi); 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()
1501 enable_irq(spi->irq); in mcp251x_can_resume()