Lines Matching refs:rcan

274 	struct rockchip_canfd *rcan = netdev_priv(ndev);  in set_reset_mode()  local
276 reset_control_assert(rcan->reset); in set_reset_mode()
278 reset_control_deassert(rcan->reset); in set_reset_mode()
280 rockchip_canfd_write(rcan, CAN_MODE, 0); in set_reset_mode()
283 rockchip_canfd_read(rcan, CAN_MODE)); in set_reset_mode()
290 struct rockchip_canfd *rcan = netdev_priv(ndev); in set_normal_mode() local
293 val = rockchip_canfd_read(rcan, CAN_MODE); in set_normal_mode()
295 if (rcan->mode >= ROCKCHIP_CAN_MODE && rcan->txtorx) in set_normal_mode()
297 rockchip_canfd_write(rcan, CAN_MODE, val); in set_normal_mode()
300 rockchip_canfd_read(rcan, CAN_MODE)); in set_normal_mode()
307 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_set_bittiming() local
308 const struct can_bittiming *bt = &rcan->can.bittiming; in rockchip_canfd_set_bittiming()
309 const struct can_bittiming *dbt = &rcan->can.data_bittiming; in rockchip_canfd_set_bittiming()
321 if (rcan->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) in rockchip_canfd_set_bittiming()
324 rockchip_canfd_write(rcan, CAN_NBTP, reg_btp); in rockchip_canfd_set_bittiming()
326 if (rcan->can.ctrlmode & CAN_CTRLMODE_FD) { in rockchip_canfd_set_bittiming()
339 tdco = (rcan->can.clock.freq / dbt->bitrate) * 2 / 3; in rockchip_canfd_set_bittiming()
344 rockchip_canfd_write(rcan, CAN_TDCR, in rockchip_canfd_set_bittiming()
354 if (rcan->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) in rockchip_canfd_set_bittiming()
357 rockchip_canfd_write(rcan, CAN_DBTP, reg_btp); in rockchip_canfd_set_bittiming()
361 rockchip_canfd_read(rcan, CAN_NBTP), in rockchip_canfd_set_bittiming()
362 rockchip_canfd_read(rcan, CAN_DBTP), in rockchip_canfd_set_bittiming()
363 rockchip_canfd_read(rcan, CAN_TDCR)); in rockchip_canfd_set_bittiming()
370 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_get_berr_counter() local
373 err = pm_runtime_get_sync(rcan->dev); in rockchip_canfd_get_berr_counter()
380 bec->rxerr = rockchip_canfd_read(rcan, CAN_RX_ERR_CNT); in rockchip_canfd_get_berr_counter()
381 bec->txerr = rockchip_canfd_read(rcan, CAN_TX_ERR_CNT); in rockchip_canfd_get_berr_counter()
383 pm_runtime_put(rcan->dev); in rockchip_canfd_get_berr_counter()
386 rockchip_canfd_read(rcan, CAN_RX_ERR_CNT), in rockchip_canfd_get_berr_counter()
387 rockchip_canfd_read(rcan, CAN_TX_ERR_CNT)); in rockchip_canfd_get_berr_counter()
394 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_start() local
400 rockchip_canfd_write(rcan, CAN_INT_MASK, 0); in rockchip_canfd_start()
403 rockchip_canfd_write(rcan, CAN_IDCODE, 0); in rockchip_canfd_start()
404 rockchip_canfd_write(rcan, CAN_IDMASK, CAN_RX_FILTER_MASK); in rockchip_canfd_start()
405 rockchip_canfd_write(rcan, CAN_IDCODE0, 0); in rockchip_canfd_start()
406 rockchip_canfd_write(rcan, CAN_IDMASK0, CAN_RX_FILTER_MASK); in rockchip_canfd_start()
407 rockchip_canfd_write(rcan, CAN_IDCODE1, 0); in rockchip_canfd_start()
408 rockchip_canfd_write(rcan, CAN_IDMASK1, CAN_RX_FILTER_MASK); in rockchip_canfd_start()
409 rockchip_canfd_write(rcan, CAN_IDCODE2, 0); in rockchip_canfd_start()
410 rockchip_canfd_write(rcan, CAN_IDMASK2, CAN_RX_FILTER_MASK); in rockchip_canfd_start()
411 rockchip_canfd_write(rcan, CAN_IDCODE3, 0); in rockchip_canfd_start()
412 rockchip_canfd_write(rcan, CAN_IDMASK3, CAN_RX_FILTER_MASK); in rockchip_canfd_start()
413 rockchip_canfd_write(rcan, CAN_IDCODE4, 0); in rockchip_canfd_start()
414 rockchip_canfd_write(rcan, CAN_IDMASK4, CAN_RX_FILTER_MASK); in rockchip_canfd_start()
417 val = rockchip_canfd_read(rcan, CAN_MODE); in rockchip_canfd_start()
420 rockchip_canfd_write(rcan, CAN_RXFC, in rockchip_canfd_start()
421 rockchip_canfd_read(rcan, CAN_RXFC) | FIFO_ENABLE); in rockchip_canfd_start()
427 if (rcan->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) in rockchip_canfd_start()
432 rockchip_canfd_write(rcan, CAN_MODE, val); in rockchip_canfd_start()
438 rcan->can.state = CAN_STATE_ERROR_ACTIVE; in rockchip_canfd_start()
441 rockchip_canfd_read(rcan, CAN_MODE), in rockchip_canfd_start()
442 rockchip_canfd_read(rcan, CAN_INT_MASK)); in rockchip_canfd_start()
449 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_stop() local
451 rcan->can.state = CAN_STATE_STOPPED; in rockchip_canfd_stop()
456 rockchip_canfd_write(rcan, CAN_INT_MASK, 0xffff); in rockchip_canfd_stop()
459 rockchip_canfd_read(rcan, CAN_MODE), in rockchip_canfd_stop()
460 rockchip_canfd_read(rcan, CAN_INT_MASK)); in rockchip_canfd_stop()
489 struct rockchip_canfd *rcan = in rockchip_canfd_tx_err_delay_work() local
493 id = rockchip_canfd_read(rcan, CAN_TXID); in rockchip_canfd_tx_err_delay_work()
494 err_code = rockchip_canfd_read(rcan, CAN_ERR_CODE); in rockchip_canfd_tx_err_delay_work()
496 mode = rockchip_canfd_read(rcan, CAN_MODE); in rockchip_canfd_tx_err_delay_work()
497 rockchip_canfd_write(rcan, CAN_MODE, 0); in rockchip_canfd_tx_err_delay_work()
498 rockchip_canfd_write(rcan, CAN_MODE, mode); in rockchip_canfd_tx_err_delay_work()
499 rockchip_canfd_write(rcan, CAN_CMD, CAN_TX0_REQ); in rockchip_canfd_tx_err_delay_work()
500 schedule_delayed_work(&rcan->tx_err_work, 1); in rockchip_canfd_tx_err_delay_work()
501 } else if (rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && id & CAN_EFF_FLAG) { in rockchip_canfd_tx_err_delay_work()
502 schedule_delayed_work(&rcan->tx_err_work, 1); in rockchip_canfd_tx_err_delay_work()
514 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_start_xmit() local
526 if (rockchip_canfd_read(rcan, CAN_CMD) & CAN_TX0_REQ) in rockchip_canfd_start_xmit()
549 if ((rcan->can.ctrlmode & CAN_CTRLMODE_FD) && can_is_canfd_skb(skb)) { in rockchip_canfd_start_xmit()
555 if (!rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && cf->can_id & CAN_EFF_FLAG) { in rockchip_canfd_start_xmit()
562 rockchip_canfd_write(rcan, CAN_TXID, rcan->tx_invalid[1]); in rockchip_canfd_start_xmit()
563 rockchip_canfd_write(rcan, CAN_TXFIC, rcan->tx_invalid[0]); in rockchip_canfd_start_xmit()
564 rockchip_canfd_write(rcan, CAN_TXDAT0, rcan->tx_invalid[2]); in rockchip_canfd_start_xmit()
565 rockchip_canfd_write(rcan, CAN_TXDAT1, rcan->tx_invalid[3]); in rockchip_canfd_start_xmit()
566 rockchip_canfd_write(rcan, CAN_CMD, CAN_TX0_REQ); in rockchip_canfd_start_xmit()
567 rockchip_canfd_write(rcan, CAN_TXID, id); in rockchip_canfd_start_xmit()
568 rockchip_canfd_write(rcan, CAN_TXFIC, dlc); in rockchip_canfd_start_xmit()
570 rockchip_canfd_write(rcan, CAN_TXDAT0 + i, in rockchip_canfd_start_xmit()
572 rockchip_canfd_write(rcan, CAN_CMD, CAN_TX1_REQ); in rockchip_canfd_start_xmit()
579 rockchip_canfd_write(rcan, CAN_TXID, id); in rockchip_canfd_start_xmit()
580 rockchip_canfd_write(rcan, CAN_TXFIC, dlc); in rockchip_canfd_start_xmit()
583 rockchip_canfd_write(rcan, CAN_TXDAT0 + i, in rockchip_canfd_start_xmit()
586 rockchip_canfd_write(rcan, CAN_CMD, CAN_TX1_REQ); in rockchip_canfd_start_xmit()
588 if (rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && cf->can_id & CAN_EFF_FLAG) in rockchip_canfd_start_xmit()
589 schedule_delayed_work(&rcan->tx_err_work, 1); in rockchip_canfd_start_xmit()
598 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_rx() local
607 dlc = rockchip_canfd_read(rcan, CAN_RXFRD); in rockchip_canfd_rx()
608 id_rockchip_canfd = rockchip_canfd_read(rcan, CAN_RXFRD); in rockchip_canfd_rx()
609 ts = rockchip_canfd_read(rcan, CAN_RXFRD); in rockchip_canfd_rx()
611 data[i] = rockchip_canfd_read(rcan, CAN_RXFRD); in rockchip_canfd_rx()
613 if (rcan->mode >= ROCKCHIP_CAN_MODE) { in rockchip_canfd_rx()
618 if (rcan->txtorx) { in rockchip_canfd_rx()
619 if (rockchip_canfd_read(rcan, CAN_TX_CHECK_FIC) & FORMAT_MASK) { in rockchip_canfd_rx()
620 ret = rockchip_canfd_read(rcan, CAN_TXID) & CAN_SFF_MASK; in rockchip_canfd_rx()
622 rockchip_canfd_write(rcan, CAN_TX_CHECK_FIC, in rockchip_canfd_rx()
680 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_err() local
689 rxerr = rockchip_canfd_read(rcan, CAN_RX_ERR_CNT); in rockchip_canfd_err()
690 txerr = rockchip_canfd_read(rcan, CAN_TX_ERR_CNT); in rockchip_canfd_err()
691 sta_reg = rockchip_canfd_read(rcan, CAN_STATE); in rockchip_canfd_err()
699 rcan->can.state = CAN_STATE_BUS_OFF; in rockchip_canfd_err()
700 rcan->can.can_stats.bus_off++; in rockchip_canfd_err()
703 rcan->can.can_stats.error_warning++; in rockchip_canfd_err()
704 rcan->can.state = CAN_STATE_ERROR_WARNING; in rockchip_canfd_err()
715 rcan->can.can_stats.error_passive++; in rockchip_canfd_err()
716 rcan->can.state = CAN_STATE_ERROR_PASSIVE; in rockchip_canfd_err()
726 if (rcan->can.state >= CAN_STATE_BUS_OFF || in rockchip_canfd_err()
740 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_interrupt() local
748 isr = rockchip_canfd_read(rcan, CAN_INT); in rockchip_canfd_interrupt()
750 dlc = rockchip_canfd_read(rcan, CAN_TXFIC); in rockchip_canfd_interrupt()
757 if (rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && dlc & FORMAT_MASK) { in rockchip_canfd_interrupt()
758 cancel_delayed_work(&rcan->tx_err_work); in rockchip_canfd_interrupt()
759 rockchip_canfd_write(rcan, CAN_TX_CHECK_FIC, FORMAT_MASK); in rockchip_canfd_interrupt()
760 quota = (rockchip_canfd_read(rcan, CAN_RXFC) & in rockchip_canfd_interrupt()
761 rcan->rx_fifo_mask) >> in rockchip_canfd_interrupt()
762 rcan->rx_fifo_shift; in rockchip_canfd_interrupt()
767 if (rockchip_canfd_read(rcan, CAN_TX_CHECK_FIC) & CAN_TX0_REQ) in rockchip_canfd_interrupt()
768 rockchip_canfd_write(rcan, CAN_CMD, CAN_TX1_REQ); in rockchip_canfd_interrupt()
769 rockchip_canfd_write(rcan, CAN_TX_CHECK_FIC, 0); in rockchip_canfd_interrupt()
771 rockchip_canfd_write(rcan, CAN_CMD, 0); in rockchip_canfd_interrupt()
778 quota = (rockchip_canfd_read(rcan, CAN_RXFC) & rcan->rx_fifo_mask) >> in rockchip_canfd_interrupt()
779 rcan->rx_fifo_shift; in rockchip_canfd_interrupt()
792 rockchip_canfd_write(rcan, CAN_INT, isr); in rockchip_canfd_interrupt()
798 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_open() local
806 err = pm_runtime_get_sync(rcan->dev); in rockchip_canfd_open()
826 pm_runtime_put(rcan->dev); in rockchip_canfd_open()
834 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_close() local
840 pm_runtime_put(rcan->dev); in rockchip_canfd_close()
841 cancel_delayed_work_sync(&rcan->tx_err_work); in rockchip_canfd_close()
916 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_runtime_suspend() local
918 clk_bulk_disable_unprepare(rcan->num_clks, rcan->clks); in rockchip_canfd_runtime_suspend()
933 struct rockchip_canfd *rcan = netdev_priv(ndev); in rockchip_canfd_runtime_resume() local
936 ret = clk_bulk_prepare_enable(rcan->num_clks, rcan->clks); in rockchip_canfd_runtime_resume()
971 struct rockchip_canfd *rcan; in rockchip_canfd_probe() local
992 rcan = netdev_priv(ndev); in rockchip_canfd_probe()
1002 rcan->reset = devm_reset_control_array_get(&pdev->dev, false, false); in rockchip_canfd_probe()
1003 if (IS_ERR(rcan->reset)) { in rockchip_canfd_probe()
1004 if (PTR_ERR(rcan->reset) != -EPROBE_DEFER) in rockchip_canfd_probe()
1006 return PTR_ERR(rcan->reset); in rockchip_canfd_probe()
1008 rcan->num_clks = devm_clk_bulk_get_all(&pdev->dev, &rcan->clks); in rockchip_canfd_probe()
1009 if (rcan->num_clks < 1) in rockchip_canfd_probe()
1012 rcan->mode = (unsigned long)of_device_get_match_data(&pdev->dev); in rockchip_canfd_probe()
1014 rcan->base = addr; in rockchip_canfd_probe()
1015 rcan->can.clock.freq = clk_get_rate(rcan->clks[0].clk); in rockchip_canfd_probe()
1016 rcan->dev = &pdev->dev; in rockchip_canfd_probe()
1017 rcan->can.state = CAN_STATE_STOPPED; in rockchip_canfd_probe()
1018 switch (rcan->mode) { in rockchip_canfd_probe()
1020 rcan->can.bittiming_const = &rockchip_canfd_bittiming_const; in rockchip_canfd_probe()
1021 rcan->can.data_bittiming_const = &rockchip_canfd_data_bittiming_const; in rockchip_canfd_probe()
1022 rcan->can.do_set_mode = rockchip_canfd_set_mode; in rockchip_canfd_probe()
1023 rcan->can.do_get_berr_counter = rockchip_canfd_get_berr_counter; in rockchip_canfd_probe()
1024 rcan->can.do_set_bittiming = rockchip_canfd_set_bittiming; in rockchip_canfd_probe()
1025 rcan->can.do_set_data_bittiming = rockchip_canfd_set_bittiming; in rockchip_canfd_probe()
1026 rcan->can.ctrlmode = CAN_CTRLMODE_FD; in rockchip_canfd_probe()
1028 rcan->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | in rockchip_canfd_probe()
1030 rcan->rx_fifo_shift = RX_FIFO_CNT0_SHIFT; in rockchip_canfd_probe()
1031 rcan->rx_fifo_mask = RX_FIFO_CNT0_MASK; in rockchip_canfd_probe()
1035 rcan->can.bittiming_const = &rockchip_canfd_bittiming_const; in rockchip_canfd_probe()
1036 rcan->can.do_set_mode = rockchip_canfd_set_mode; in rockchip_canfd_probe()
1037 rcan->can.do_get_berr_counter = rockchip_canfd_get_berr_counter; in rockchip_canfd_probe()
1038 rcan->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING | in rockchip_canfd_probe()
1042 rcan->rx_fifo_shift = RX_FIFO_CNT0_SHIFT; in rockchip_canfd_probe()
1043 rcan->rx_fifo_mask = RX_FIFO_CNT0_MASK; in rockchip_canfd_probe()
1049 if (rcan->mode == ROCKCHIP_CAN_MODE) { in rockchip_canfd_probe()
1050 rcan->rx_fifo_shift = RX_FIFO_CNT1_SHIFT; in rockchip_canfd_probe()
1051 rcan->rx_fifo_mask = RX_FIFO_CNT1_MASK; in rockchip_canfd_probe()
1056 rcan->tx_invalid, 4)) in rockchip_canfd_probe()
1057 rcan->txtorx = 1; in rockchip_canfd_probe()
1062 rcan->can.restart_ms = 1; in rockchip_canfd_probe()
1064 INIT_DELAYED_WORK(&rcan->tx_err_work, rockchip_canfd_tx_err_delay_work); in rockchip_canfd_probe()