^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * sun4i_can.c - CAN bus controller driver for Allwinner SUN4I&SUN7I based SoCs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2013 Peter Chen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2015 Gerhard Bertelsmann
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Parts of this software are based on (derived from) the SJA1000 code by:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Copyright (C) 2014 Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Copyright (C) 2007 Wolfgang Grandegger <wg@grandegger.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Copyright (C) 2002-2007 Volkswagen Group Electronic Research
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Copyright (C) 2003 Matthias Brukner, Trajet Gmbh, Rebenring 33,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * 38106 Braunschweig, GERMANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * modification, are permitted provided that the following conditions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * 1. Redistributions of source code must retain the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * notice, this list of conditions and the following disclaimer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * 2. Redistributions in binary form must reproduce the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * notice, this list of conditions and the following disclaimer in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * documentation and/or other materials provided with the distribution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * 3. Neither the name of Volkswagen nor the names of its contributors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * may be used to endorse or promote products derived from this software
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * without specific prior written permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * Alternatively, provided that this notice is retained in full, this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * software may be distributed under the terms of the GNU General
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * Public License ("GPL") version 2, in which case the provisions of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * GPL apply INSTEAD OF those given above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * The provided data structures and external interfaces from this code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * are not restricted to be used by modules with a GPL compatible license.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * DAMAGE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include <linux/can.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #include <linux/can/dev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #include <linux/can/error.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #include <linux/can/led.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define DRV_NAME "sun4i_can"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /* Registers address (physical base address 0x01C2BC00) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define SUN4I_REG_MSEL_ADDR 0x0000 /* CAN Mode Select */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define SUN4I_REG_CMD_ADDR 0x0004 /* CAN Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define SUN4I_REG_STA_ADDR 0x0008 /* CAN Status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define SUN4I_REG_INT_ADDR 0x000c /* CAN Interrupt Flag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define SUN4I_REG_INTEN_ADDR 0x0010 /* CAN Interrupt Enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define SUN4I_REG_BTIME_ADDR 0x0014 /* CAN Bus Timing 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define SUN4I_REG_TEWL_ADDR 0x0018 /* CAN Tx Error Warning Limit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define SUN4I_REG_ERRC_ADDR 0x001c /* CAN Error Counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define SUN4I_REG_RMCNT_ADDR 0x0020 /* CAN Receive Message Counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define SUN4I_REG_RBUFSA_ADDR 0x0024 /* CAN Receive Buffer Start Address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define SUN4I_REG_BUF0_ADDR 0x0040 /* CAN Tx/Rx Buffer 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define SUN4I_REG_BUF1_ADDR 0x0044 /* CAN Tx/Rx Buffer 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define SUN4I_REG_BUF2_ADDR 0x0048 /* CAN Tx/Rx Buffer 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define SUN4I_REG_BUF3_ADDR 0x004c /* CAN Tx/Rx Buffer 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define SUN4I_REG_BUF4_ADDR 0x0050 /* CAN Tx/Rx Buffer 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define SUN4I_REG_BUF5_ADDR 0x0054 /* CAN Tx/Rx Buffer 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define SUN4I_REG_BUF6_ADDR 0x0058 /* CAN Tx/Rx Buffer 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define SUN4I_REG_BUF7_ADDR 0x005c /* CAN Tx/Rx Buffer 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define SUN4I_REG_BUF8_ADDR 0x0060 /* CAN Tx/Rx Buffer 8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define SUN4I_REG_BUF9_ADDR 0x0064 /* CAN Tx/Rx Buffer 9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define SUN4I_REG_BUF10_ADDR 0x0068 /* CAN Tx/Rx Buffer 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define SUN4I_REG_BUF11_ADDR 0x006c /* CAN Tx/Rx Buffer 11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define SUN4I_REG_BUF12_ADDR 0x0070 /* CAN Tx/Rx Buffer 12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define SUN4I_REG_ACPC_ADDR 0x0040 /* CAN Acceptance Code 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define SUN4I_REG_ACPM_ADDR 0x0044 /* CAN Acceptance Mask 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define SUN4I_REG_RBUF_RBACK_START_ADDR 0x0180 /* CAN transmit buffer start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define SUN4I_REG_RBUF_RBACK_END_ADDR 0x01b0 /* CAN transmit buffer end */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) /* Controller Register Description */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* mode select register (r/w)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * offset:0x0000 default:0x0000_0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define SUN4I_MSEL_SLEEP_MODE (0x01 << 4) /* write in reset mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define SUN4I_MSEL_WAKE_UP (0x00 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define SUN4I_MSEL_SINGLE_FILTER (0x01 << 3) /* write in reset mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define SUN4I_MSEL_DUAL_FILTERS (0x00 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define SUN4I_MSEL_LOOPBACK_MODE BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define SUN4I_MSEL_LISTEN_ONLY_MODE BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define SUN4I_MSEL_RESET_MODE BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* command register (w)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * offset:0x0004 default:0x0000_0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define SUN4I_CMD_BUS_OFF_REQ BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define SUN4I_CMD_SELF_RCV_REQ BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define SUN4I_CMD_CLEAR_OR_FLAG BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define SUN4I_CMD_RELEASE_RBUF BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define SUN4I_CMD_ABORT_REQ BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define SUN4I_CMD_TRANS_REQ BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* status register (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * offset:0x0008 default:0x0000_003c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define SUN4I_STA_BIT_ERR (0x00 << 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define SUN4I_STA_FORM_ERR (0x01 << 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define SUN4I_STA_STUFF_ERR (0x02 << 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define SUN4I_STA_OTHER_ERR (0x03 << 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define SUN4I_STA_MASK_ERR (0x03 << 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define SUN4I_STA_ERR_DIR BIT(21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define SUN4I_STA_ERR_SEG_CODE (0x1f << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define SUN4I_STA_START (0x03 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define SUN4I_STA_ID28_21 (0x02 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define SUN4I_STA_ID20_18 (0x06 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define SUN4I_STA_SRTR (0x04 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define SUN4I_STA_IDE (0x05 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define SUN4I_STA_ID17_13 (0x07 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define SUN4I_STA_ID12_5 (0x0f << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define SUN4I_STA_ID4_0 (0x0e << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define SUN4I_STA_RTR (0x0c << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define SUN4I_STA_RB1 (0x0d << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define SUN4I_STA_RB0 (0x09 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define SUN4I_STA_DLEN (0x0b << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define SUN4I_STA_DATA_FIELD (0x0a << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define SUN4I_STA_CRC_SEQUENCE (0x08 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define SUN4I_STA_CRC_DELIMITER (0x18 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define SUN4I_STA_ACK (0x19 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define SUN4I_STA_ACK_DELIMITER (0x1b << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define SUN4I_STA_END (0x1a << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define SUN4I_STA_INTERMISSION (0x12 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define SUN4I_STA_ACTIVE_ERROR (0x11 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define SUN4I_STA_PASSIVE_ERROR (0x16 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define SUN4I_STA_TOLERATE_DOMINANT_BITS (0x13 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define SUN4I_STA_ERROR_DELIMITER (0x17 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define SUN4I_STA_OVERLOAD (0x1c << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define SUN4I_STA_BUS_OFF BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define SUN4I_STA_ERR_STA BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define SUN4I_STA_TRANS_BUSY BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define SUN4I_STA_RCV_BUSY BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define SUN4I_STA_TRANS_OVER BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define SUN4I_STA_TBUF_RDY BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define SUN4I_STA_DATA_ORUN BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define SUN4I_STA_RBUF_RDY BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /* interrupt register (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * offset:0x000c default:0x0000_0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define SUN4I_INT_BUS_ERR BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define SUN4I_INT_ARB_LOST BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define SUN4I_INT_ERR_PASSIVE BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define SUN4I_INT_WAKEUP BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define SUN4I_INT_DATA_OR BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define SUN4I_INT_ERR_WRN BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define SUN4I_INT_TBUF_VLD BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define SUN4I_INT_RBUF_VLD BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /* interrupt enable register (r/w)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * offset:0x0010 default:0x0000_0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define SUN4I_INTEN_BERR BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define SUN4I_INTEN_ARB_LOST BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define SUN4I_INTEN_ERR_PASSIVE BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define SUN4I_INTEN_WAKEUP BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define SUN4I_INTEN_OR BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define SUN4I_INTEN_ERR_WRN BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define SUN4I_INTEN_TX BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define SUN4I_INTEN_RX BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) /* error code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) #define SUN4I_ERR_INRCV (0x1 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define SUN4I_ERR_INTRANS (0x0 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) /* filter mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) #define SUN4I_FILTER_CLOSE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #define SUN4I_SINGLE_FLTER_MODE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define SUN4I_DUAL_FILTER_MODE 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) /* message buffer flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define SUN4I_MSG_EFF_FLAG BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define SUN4I_MSG_RTR_FLAG BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /* max. number of interrupts handled in ISR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define SUN4I_CAN_MAX_IRQ 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define SUN4I_MODE_MAX_RETRIES 100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) struct sun4ican_priv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) struct can_priv can;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) void __iomem *base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) spinlock_t cmdreg_lock; /* lock for concurrent cmd register writes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) static const struct can_bittiming_const sun4ican_bittiming_const = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) .name = DRV_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) .tseg1_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) .tseg1_max = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .tseg2_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) .tseg2_max = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) .sjw_max = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) .brp_min = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) .brp_max = 64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) .brp_inc = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) static void sun4i_can_write_cmdreg(struct sun4ican_priv *priv, u8 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) spin_lock_irqsave(&priv->cmdreg_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) writel(val, priv->base + SUN4I_REG_CMD_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) spin_unlock_irqrestore(&priv->cmdreg_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) static int set_normal_mode(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) int retry = SUN4I_MODE_MAX_RETRIES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) u32 mod_reg_val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) mod_reg_val = readl(priv->base + SUN4I_REG_MSEL_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) mod_reg_val &= ~SUN4I_MSEL_RESET_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) writel(mod_reg_val, priv->base + SUN4I_REG_MSEL_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) } while (retry-- && (mod_reg_val & SUN4I_MSEL_RESET_MODE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) if (readl(priv->base + SUN4I_REG_MSEL_ADDR) & SUN4I_MSEL_RESET_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) netdev_err(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) "setting controller into normal mode failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) static int set_reset_mode(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) int retry = SUN4I_MODE_MAX_RETRIES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) u32 mod_reg_val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) mod_reg_val = readl(priv->base + SUN4I_REG_MSEL_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) mod_reg_val |= SUN4I_MSEL_RESET_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) writel(mod_reg_val, priv->base + SUN4I_REG_MSEL_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) } while (retry-- && !(mod_reg_val & SUN4I_MSEL_RESET_MODE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if (!(readl(priv->base + SUN4I_REG_MSEL_ADDR) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) SUN4I_MSEL_RESET_MODE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) netdev_err(dev, "setting controller into reset mode failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) /* bittiming is called in reset_mode only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) static int sun4ican_set_bittiming(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) struct can_bittiming *bt = &priv->can.bittiming;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) u32 cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) cfg = ((bt->brp - 1) & 0x3FF) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) (((bt->sjw - 1) & 0x3) << 14) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) (((bt->prop_seg + bt->phase_seg1 - 1) & 0xf) << 16) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) (((bt->phase_seg2 - 1) & 0x7) << 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) cfg |= 0x800000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) netdev_dbg(dev, "setting BITTIMING=0x%08x\n", cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) writel(cfg, priv->base + SUN4I_REG_BTIME_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) static int sun4ican_get_berr_counter(const struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) struct can_berr_counter *bec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) u32 errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) err = clk_prepare_enable(priv->clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) netdev_err(dev, "could not enable clock\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) errors = readl(priv->base + SUN4I_REG_ERRC_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) bec->txerr = errors & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) bec->rxerr = (errors >> 16) & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) clk_disable_unprepare(priv->clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) static int sun4i_can_start(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) u32 mod_reg_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) /* we need to enter the reset mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) err = set_reset_mode(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) netdev_err(dev, "could not enter reset mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) /* set filters - we accept all */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) writel(0x00000000, priv->base + SUN4I_REG_ACPC_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) writel(0xFFFFFFFF, priv->base + SUN4I_REG_ACPM_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) /* clear error counters and error code capture */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) writel(0, priv->base + SUN4I_REG_ERRC_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) /* enable interrupts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) writel(0xFF, priv->base + SUN4I_REG_INTEN_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) writel(0xFF & ~SUN4I_INTEN_BERR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) priv->base + SUN4I_REG_INTEN_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) /* enter the selected mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) mod_reg_val = readl(priv->base + SUN4I_REG_MSEL_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) mod_reg_val |= SUN4I_MSEL_LOOPBACK_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) mod_reg_val |= SUN4I_MSEL_LISTEN_ONLY_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) writel(mod_reg_val, priv->base + SUN4I_REG_MSEL_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) err = sun4ican_set_bittiming(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) /* we are ready to enter the normal mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) err = set_normal_mode(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) netdev_err(dev, "could not enter normal mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) priv->can.state = CAN_STATE_ERROR_ACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) static int sun4i_can_stop(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) priv->can.state = CAN_STATE_STOPPED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) /* we need to enter reset mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) err = set_reset_mode(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) netdev_err(dev, "could not enter reset mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) /* disable all interrupts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) writel(0, priv->base + SUN4I_REG_INTEN_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) static int sun4ican_set_mode(struct net_device *dev, enum can_mode mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) switch (mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) case CAN_MODE_START:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) err = sun4i_can_start(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) netdev_err(dev, "starting CAN controller failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) if (netif_queue_stopped(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) netif_wake_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) /* transmit a CAN message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) * message layout in the sk_buff should be like this:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) * xx xx xx xx ff ll 00 11 22 33 44 55 66 77
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) * [ can_id ] [flags] [len] [can data (up to 8 bytes]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) static netdev_tx_t sun4ican_start_xmit(struct sk_buff *skb, struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) struct can_frame *cf = (struct can_frame *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) u8 dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) u32 dreg, msg_flag_n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) canid_t id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) if (can_dropped_invalid_skb(dev, skb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) return NETDEV_TX_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) netif_stop_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) id = cf->can_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) dlc = cf->can_dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) msg_flag_n = dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) if (id & CAN_RTR_FLAG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) msg_flag_n |= SUN4I_MSG_RTR_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if (id & CAN_EFF_FLAG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) msg_flag_n |= SUN4I_MSG_EFF_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) dreg = SUN4I_REG_BUF5_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) writel((id >> 21) & 0xFF, priv->base + SUN4I_REG_BUF1_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) writel((id >> 13) & 0xFF, priv->base + SUN4I_REG_BUF2_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) writel((id >> 5) & 0xFF, priv->base + SUN4I_REG_BUF3_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) writel((id << 3) & 0xF8, priv->base + SUN4I_REG_BUF4_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) dreg = SUN4I_REG_BUF3_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) writel((id >> 3) & 0xFF, priv->base + SUN4I_REG_BUF1_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) writel((id << 5) & 0xE0, priv->base + SUN4I_REG_BUF2_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) for (i = 0; i < dlc; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) writel(cf->data[i], priv->base + (dreg + i * 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) writel(msg_flag_n, priv->base + SUN4I_REG_BUF0_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) can_put_echo_skb(skb, dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) sun4i_can_write_cmdreg(priv, SUN4I_CMD_SELF_RCV_REQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) sun4i_can_write_cmdreg(priv, SUN4I_CMD_TRANS_REQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) return NETDEV_TX_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) static void sun4i_can_rx(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) struct net_device_stats *stats = &dev->stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) struct can_frame *cf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) u8 fi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) u32 dreg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) canid_t id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) /* create zero'ed CAN frame buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) skb = alloc_can_skb(dev, &cf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) fi = readl(priv->base + SUN4I_REG_BUF0_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) cf->can_dlc = get_can_dlc(fi & 0x0F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) if (fi & SUN4I_MSG_EFF_FLAG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) dreg = SUN4I_REG_BUF5_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) id = (readl(priv->base + SUN4I_REG_BUF1_ADDR) << 21) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) (readl(priv->base + SUN4I_REG_BUF2_ADDR) << 13) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) (readl(priv->base + SUN4I_REG_BUF3_ADDR) << 5) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) ((readl(priv->base + SUN4I_REG_BUF4_ADDR) >> 3) & 0x1f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) id |= CAN_EFF_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) dreg = SUN4I_REG_BUF3_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) id = (readl(priv->base + SUN4I_REG_BUF1_ADDR) << 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) ((readl(priv->base + SUN4I_REG_BUF2_ADDR) >> 5) & 0x7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) /* remote frame ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) if (fi & SUN4I_MSG_RTR_FLAG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) id |= CAN_RTR_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) for (i = 0; i < cf->can_dlc; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) cf->data[i] = readl(priv->base + dreg + i * 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) cf->can_id = id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) sun4i_can_write_cmdreg(priv, SUN4I_CMD_RELEASE_RBUF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) stats->rx_packets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) stats->rx_bytes += cf->can_dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) netif_rx(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) can_led_event(dev, CAN_LED_EVENT_RX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) struct net_device_stats *stats = &dev->stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) struct can_frame *cf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) enum can_state state = priv->can.state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) enum can_state rx_state, tx_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) unsigned int rxerr, txerr, errc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) u32 ecc, alc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) /* we don't skip if alloc fails because we want the stats anyhow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) skb = alloc_can_err_skb(dev, &cf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) errc = readl(priv->base + SUN4I_REG_ERRC_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) rxerr = (errc >> 16) & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) txerr = errc & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) if (skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) cf->data[6] = txerr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) cf->data[7] = rxerr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (isrc & SUN4I_INT_DATA_OR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) /* data overrun interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) netdev_dbg(dev, "data overrun interrupt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) if (likely(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) cf->can_id |= CAN_ERR_CRTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) stats->rx_over_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) stats->rx_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) /* reset the CAN IP by entering reset mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) * ignoring timeout error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) set_reset_mode(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) set_normal_mode(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) /* clear bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) sun4i_can_write_cmdreg(priv, SUN4I_CMD_CLEAR_OR_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) if (isrc & SUN4I_INT_ERR_WRN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) /* error warning interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) netdev_dbg(dev, "error warning interrupt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) if (status & SUN4I_STA_BUS_OFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) state = CAN_STATE_BUS_OFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) else if (status & SUN4I_STA_ERR_STA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) state = CAN_STATE_ERROR_WARNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) state = CAN_STATE_ERROR_ACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) if (isrc & SUN4I_INT_BUS_ERR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) /* bus error interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) netdev_dbg(dev, "bus error interrupt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) priv->can.can_stats.bus_error++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) stats->rx_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) if (likely(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) ecc = readl(priv->base + SUN4I_REG_STA_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) switch (ecc & SUN4I_STA_MASK_ERR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) case SUN4I_STA_BIT_ERR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) cf->data[2] |= CAN_ERR_PROT_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) case SUN4I_STA_FORM_ERR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) cf->data[2] |= CAN_ERR_PROT_FORM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) case SUN4I_STA_STUFF_ERR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) cf->data[2] |= CAN_ERR_PROT_STUFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) cf->data[3] = (ecc & SUN4I_STA_ERR_SEG_CODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) >> 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) /* error occurred during transmission? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) if ((ecc & SUN4I_STA_ERR_DIR) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) cf->data[2] |= CAN_ERR_PROT_TX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) if (isrc & SUN4I_INT_ERR_PASSIVE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) /* error passive interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) netdev_dbg(dev, "error passive interrupt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) if (state == CAN_STATE_ERROR_PASSIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) state = CAN_STATE_ERROR_WARNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) state = CAN_STATE_ERROR_PASSIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) if (isrc & SUN4I_INT_ARB_LOST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) /* arbitration lost interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) netdev_dbg(dev, "arbitration lost interrupt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) alc = readl(priv->base + SUN4I_REG_STA_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) priv->can.can_stats.arbitration_lost++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) if (likely(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) cf->can_id |= CAN_ERR_LOSTARB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) cf->data[0] = (alc >> 8) & 0x1f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) if (state != priv->can.state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) tx_state = txerr >= rxerr ? state : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) rx_state = txerr <= rxerr ? state : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) if (likely(skb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) can_change_state(dev, cf, tx_state, rx_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) priv->can.state = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) if (state == CAN_STATE_BUS_OFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) can_bus_off(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) if (likely(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) stats->rx_packets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) stats->rx_bytes += cf->can_dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) netif_rx(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) struct net_device *dev = (struct net_device *)dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) struct net_device_stats *stats = &dev->stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) u8 isrc, status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) int n = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) while ((isrc = readl(priv->base + SUN4I_REG_INT_ADDR)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) (n < SUN4I_CAN_MAX_IRQ)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) n++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) status = readl(priv->base + SUN4I_REG_STA_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) if (isrc & SUN4I_INT_WAKEUP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) netdev_warn(dev, "wakeup interrupt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) if (isrc & SUN4I_INT_TBUF_VLD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) /* transmission complete interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) stats->tx_bytes +=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) readl(priv->base +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) SUN4I_REG_RBUF_RBACK_START_ADDR) & 0xf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) stats->tx_packets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) can_get_echo_skb(dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) netif_wake_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) can_led_event(dev, CAN_LED_EVENT_TX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) if ((isrc & SUN4I_INT_RBUF_VLD) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) !(isrc & SUN4I_INT_DATA_OR)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) /* receive interrupt - don't read if overrun occurred */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) while (status & SUN4I_STA_RBUF_RDY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) /* RX buffer is not empty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) sun4i_can_rx(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) status = readl(priv->base + SUN4I_REG_STA_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) if (isrc &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) (SUN4I_INT_DATA_OR | SUN4I_INT_ERR_WRN | SUN4I_INT_BUS_ERR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) SUN4I_INT_ERR_PASSIVE | SUN4I_INT_ARB_LOST)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) /* error interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) if (sun4i_can_err(dev, isrc, status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) netdev_err(dev, "can't allocate buffer - clearing pending interrupts\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) /* clear interrupts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) writel(isrc, priv->base + SUN4I_REG_INT_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) readl(priv->base + SUN4I_REG_INT_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) if (n >= SUN4I_CAN_MAX_IRQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) netdev_dbg(dev, "%d messages handled in ISR", n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) return (n) ? IRQ_HANDLED : IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) static int sun4ican_open(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) /* common open */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) err = open_candev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) /* register interrupt handler */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) err = request_irq(dev->irq, sun4i_can_interrupt, 0, dev->name, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) netdev_err(dev, "request_irq err: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) goto exit_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) /* turn on clocking for CAN peripheral block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) err = clk_prepare_enable(priv->clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) netdev_err(dev, "could not enable CAN peripheral clock\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) goto exit_clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) err = sun4i_can_start(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) netdev_err(dev, "could not start CAN peripheral\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) goto exit_can_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) can_led_event(dev, CAN_LED_EVENT_OPEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) netif_start_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) exit_can_start:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) clk_disable_unprepare(priv->clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) exit_clock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) free_irq(dev->irq, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) exit_irq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) close_candev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) static int sun4ican_close(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) struct sun4ican_priv *priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) netif_stop_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) sun4i_can_stop(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) clk_disable_unprepare(priv->clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) free_irq(dev->irq, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) close_candev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) can_led_event(dev, CAN_LED_EVENT_STOP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) static const struct net_device_ops sun4ican_netdev_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) .ndo_open = sun4ican_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) .ndo_stop = sun4ican_close,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) .ndo_start_xmit = sun4ican_start_xmit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) static const struct of_device_id sun4ican_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) {.compatible = "allwinner,sun4i-a10-can"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) {},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) MODULE_DEVICE_TABLE(of, sun4ican_of_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) static int sun4ican_remove(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) struct net_device *dev = platform_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) unregister_netdev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) free_candev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) static int sun4ican_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) struct device_node *np = pdev->dev.of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) void __iomem *addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) int err, irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) struct sun4ican_priv *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) clk = of_clk_get(np, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) if (IS_ERR(clk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) dev_err(&pdev->dev, "unable to request clock\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) irq = platform_get_irq(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) if (irq < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) addr = devm_platform_ioremap_resource(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) if (IS_ERR(addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) err = PTR_ERR(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) dev = alloc_candev(sizeof(struct sun4ican_priv), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) if (!dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) dev_err(&pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) "could not allocate memory for CAN device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) dev->netdev_ops = &sun4ican_netdev_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) dev->irq = irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) dev->flags |= IFF_ECHO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) priv = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) priv->can.clock.freq = clk_get_rate(clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) priv->can.bittiming_const = &sun4ican_bittiming_const;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) priv->can.do_set_mode = sun4ican_set_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) priv->can.do_get_berr_counter = sun4ican_get_berr_counter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) CAN_CTRLMODE_LISTENONLY |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) CAN_CTRLMODE_LOOPBACK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) CAN_CTRLMODE_3_SAMPLES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) priv->base = addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) priv->clk = clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) spin_lock_init(&priv->cmdreg_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) platform_set_drvdata(pdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) SET_NETDEV_DEV(dev, &pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) err = register_candev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) DRV_NAME, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) goto exit_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) devm_can_led_init(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) dev_info(&pdev->dev, "device registered (base=%p, irq=%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) priv->base, dev->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) exit_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) free_candev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) static struct platform_driver sun4i_can_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) .name = DRV_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) .of_match_table = sun4ican_of_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) .probe = sun4ican_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) .remove = sun4ican_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) module_platform_driver(sun4i_can_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) MODULE_AUTHOR("Peter Chen <xingkongcp@gmail.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) MODULE_AUTHOR("Gerhard Bertelsmann <info@gerhard-bertelsmann.de>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) MODULE_LICENSE("Dual BSD/GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) MODULE_DESCRIPTION("CAN driver for Allwinner SoCs (A10/A20)");