Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (C) 2018 Cadence Design Systems Inc.
0004  *
0005  * Author: Boris Brezillon <boris.brezillon@bootlin.com>
0006  */
0007 
0008 #include <linux/bitops.h>
0009 #include <linux/clk.h>
0010 #include <linux/err.h>
0011 #include <linux/errno.h>
0012 #include <linux/i3c/master.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/io.h>
0015 #include <linux/iopoll.h>
0016 #include <linux/ioport.h>
0017 #include <linux/kernel.h>
0018 #include <linux/list.h>
0019 #include <linux/module.h>
0020 #include <linux/of.h>
0021 #include <linux/platform_device.h>
0022 #include <linux/slab.h>
0023 #include <linux/spinlock.h>
0024 #include <linux/workqueue.h>
0025 #include <linux/of_device.h>
0026 
0027 #define DEV_ID              0x0
0028 #define DEV_ID_I3C_MASTER       0x5034
0029 
0030 #define CONF_STATUS0            0x4
0031 #define CONF_STATUS0_CMDR_DEPTH(x)  (4 << (((x) & GENMASK(31, 29)) >> 29))
0032 #define CONF_STATUS0_ECC_CHK        BIT(28)
0033 #define CONF_STATUS0_INTEG_CHK      BIT(27)
0034 #define CONF_STATUS0_CSR_DAP_CHK    BIT(26)
0035 #define CONF_STATUS0_TRANS_TOUT_CHK BIT(25)
0036 #define CONF_STATUS0_PROT_FAULTS_CHK    BIT(24)
0037 #define CONF_STATUS0_GPO_NUM(x)     (((x) & GENMASK(23, 16)) >> 16)
0038 #define CONF_STATUS0_GPI_NUM(x)     (((x) & GENMASK(15, 8)) >> 8)
0039 #define CONF_STATUS0_IBIR_DEPTH(x)  (4 << (((x) & GENMASK(7, 6)) >> 7))
0040 #define CONF_STATUS0_SUPPORTS_DDR   BIT(5)
0041 #define CONF_STATUS0_SEC_MASTER     BIT(4)
0042 #define CONF_STATUS0_DEVS_NUM(x)    ((x) & GENMASK(3, 0))
0043 
0044 #define CONF_STATUS1            0x8
0045 #define CONF_STATUS1_IBI_HW_RES(x)  ((((x) & GENMASK(31, 28)) >> 28) + 1)
0046 #define CONF_STATUS1_CMD_DEPTH(x)   (4 << (((x) & GENMASK(27, 26)) >> 26))
0047 #define CONF_STATUS1_SLVDDR_RX_DEPTH(x) (8 << (((x) & GENMASK(25, 21)) >> 21))
0048 #define CONF_STATUS1_SLVDDR_TX_DEPTH(x) (8 << (((x) & GENMASK(20, 16)) >> 16))
0049 #define CONF_STATUS1_IBI_DEPTH(x)   (2 << (((x) & GENMASK(12, 10)) >> 10))
0050 #define CONF_STATUS1_RX_DEPTH(x)    (8 << (((x) & GENMASK(9, 5)) >> 5))
0051 #define CONF_STATUS1_TX_DEPTH(x)    (8 << ((x) & GENMASK(4, 0)))
0052 
0053 #define REV_ID              0xc
0054 #define REV_ID_VID(id)          (((id) & GENMASK(31, 20)) >> 20)
0055 #define REV_ID_PID(id)          (((id) & GENMASK(19, 8)) >> 8)
0056 #define REV_ID_REV_MAJOR(id)        (((id) & GENMASK(7, 4)) >> 4)
0057 #define REV_ID_REV_MINOR(id)        ((id) & GENMASK(3, 0))
0058 
0059 #define CTRL                0x10
0060 #define CTRL_DEV_EN         BIT(31)
0061 #define CTRL_HALT_EN            BIT(30)
0062 #define CTRL_MCS            BIT(29)
0063 #define CTRL_MCS_EN         BIT(28)
0064 #define CTRL_THD_DELAY(x)       (((x) << 24) & GENMASK(25, 24))
0065 #define CTRL_HJ_DISEC           BIT(8)
0066 #define CTRL_MST_ACK            BIT(7)
0067 #define CTRL_HJ_ACK         BIT(6)
0068 #define CTRL_HJ_INIT            BIT(5)
0069 #define CTRL_MST_INIT           BIT(4)
0070 #define CTRL_AHDR_OPT           BIT(3)
0071 #define CTRL_PURE_BUS_MODE      0
0072 #define CTRL_MIXED_FAST_BUS_MODE    2
0073 #define CTRL_MIXED_SLOW_BUS_MODE    3
0074 #define CTRL_BUS_MODE_MASK      GENMASK(1, 0)
0075 #define THD_DELAY_MAX           3
0076 
0077 #define PRESCL_CTRL0            0x14
0078 #define PRESCL_CTRL0_I2C(x)     ((x) << 16)
0079 #define PRESCL_CTRL0_I3C(x)     (x)
0080 #define PRESCL_CTRL0_MAX        GENMASK(9, 0)
0081 
0082 #define PRESCL_CTRL1            0x18
0083 #define PRESCL_CTRL1_PP_LOW_MASK    GENMASK(15, 8)
0084 #define PRESCL_CTRL1_PP_LOW(x)      ((x) << 8)
0085 #define PRESCL_CTRL1_OD_LOW_MASK    GENMASK(7, 0)
0086 #define PRESCL_CTRL1_OD_LOW(x)      (x)
0087 
0088 #define MST_IER             0x20
0089 #define MST_IDR             0x24
0090 #define MST_IMR             0x28
0091 #define MST_ICR             0x2c
0092 #define MST_ISR             0x30
0093 #define MST_INT_HALTED          BIT(18)
0094 #define MST_INT_MR_DONE         BIT(17)
0095 #define MST_INT_IMM_COMP        BIT(16)
0096 #define MST_INT_TX_THR          BIT(15)
0097 #define MST_INT_TX_OVF          BIT(14)
0098 #define MST_INT_IBID_THR        BIT(12)
0099 #define MST_INT_IBID_UNF        BIT(11)
0100 #define MST_INT_IBIR_THR        BIT(10)
0101 #define MST_INT_IBIR_UNF        BIT(9)
0102 #define MST_INT_IBIR_OVF        BIT(8)
0103 #define MST_INT_RX_THR          BIT(7)
0104 #define MST_INT_RX_UNF          BIT(6)
0105 #define MST_INT_CMDD_EMP        BIT(5)
0106 #define MST_INT_CMDD_THR        BIT(4)
0107 #define MST_INT_CMDD_OVF        BIT(3)
0108 #define MST_INT_CMDR_THR        BIT(2)
0109 #define MST_INT_CMDR_UNF        BIT(1)
0110 #define MST_INT_CMDR_OVF        BIT(0)
0111 
0112 #define MST_STATUS0         0x34
0113 #define MST_STATUS0_IDLE        BIT(18)
0114 #define MST_STATUS0_HALTED      BIT(17)
0115 #define MST_STATUS0_MASTER_MODE     BIT(16)
0116 #define MST_STATUS0_TX_FULL     BIT(13)
0117 #define MST_STATUS0_IBID_FULL       BIT(12)
0118 #define MST_STATUS0_IBIR_FULL       BIT(11)
0119 #define MST_STATUS0_RX_FULL     BIT(10)
0120 #define MST_STATUS0_CMDD_FULL       BIT(9)
0121 #define MST_STATUS0_CMDR_FULL       BIT(8)
0122 #define MST_STATUS0_TX_EMP      BIT(5)
0123 #define MST_STATUS0_IBID_EMP        BIT(4)
0124 #define MST_STATUS0_IBIR_EMP        BIT(3)
0125 #define MST_STATUS0_RX_EMP      BIT(2)
0126 #define MST_STATUS0_CMDD_EMP        BIT(1)
0127 #define MST_STATUS0_CMDR_EMP        BIT(0)
0128 
0129 #define CMDR                0x38
0130 #define CMDR_NO_ERROR           0
0131 #define CMDR_DDR_PREAMBLE_ERROR     1
0132 #define CMDR_DDR_PARITY_ERROR       2
0133 #define CMDR_DDR_RX_FIFO_OVF        3
0134 #define CMDR_DDR_TX_FIFO_UNF        4
0135 #define CMDR_M0_ERROR           5
0136 #define CMDR_M1_ERROR           6
0137 #define CMDR_M2_ERROR           7
0138 #define CMDR_MST_ABORT          8
0139 #define CMDR_NACK_RESP          9
0140 #define CMDR_INVALID_DA         10
0141 #define CMDR_DDR_DROPPED        11
0142 #define CMDR_ERROR(x)           (((x) & GENMASK(27, 24)) >> 24)
0143 #define CMDR_XFER_BYTES(x)      (((x) & GENMASK(19, 8)) >> 8)
0144 #define CMDR_CMDID_HJACK_DISEC      0xfe
0145 #define CMDR_CMDID_HJACK_ENTDAA     0xff
0146 #define CMDR_CMDID(x)           ((x) & GENMASK(7, 0))
0147 
0148 #define IBIR                0x3c
0149 #define IBIR_ACKED          BIT(12)
0150 #define IBIR_SLVID(x)           (((x) & GENMASK(11, 8)) >> 8)
0151 #define IBIR_ERROR          BIT(7)
0152 #define IBIR_XFER_BYTES(x)      (((x) & GENMASK(6, 2)) >> 2)
0153 #define IBIR_TYPE_IBI           0
0154 #define IBIR_TYPE_HJ            1
0155 #define IBIR_TYPE_MR            2
0156 #define IBIR_TYPE(x)            ((x) & GENMASK(1, 0))
0157 
0158 #define SLV_IER             0x40
0159 #define SLV_IDR             0x44
0160 #define SLV_IMR             0x48
0161 #define SLV_ICR             0x4c
0162 #define SLV_ISR             0x50
0163 #define SLV_INT_TM          BIT(20)
0164 #define SLV_INT_ERROR           BIT(19)
0165 #define SLV_INT_EVENT_UP        BIT(18)
0166 #define SLV_INT_HJ_DONE         BIT(17)
0167 #define SLV_INT_MR_DONE         BIT(16)
0168 #define SLV_INT_DA_UPD          BIT(15)
0169 #define SLV_INT_SDR_FAIL        BIT(14)
0170 #define SLV_INT_DDR_FAIL        BIT(13)
0171 #define SLV_INT_M_RD_ABORT      BIT(12)
0172 #define SLV_INT_DDR_RX_THR      BIT(11)
0173 #define SLV_INT_DDR_TX_THR      BIT(10)
0174 #define SLV_INT_SDR_RX_THR      BIT(9)
0175 #define SLV_INT_SDR_TX_THR      BIT(8)
0176 #define SLV_INT_DDR_RX_UNF      BIT(7)
0177 #define SLV_INT_DDR_TX_OVF      BIT(6)
0178 #define SLV_INT_SDR_RX_UNF      BIT(5)
0179 #define SLV_INT_SDR_TX_OVF      BIT(4)
0180 #define SLV_INT_DDR_RD_COMP     BIT(3)
0181 #define SLV_INT_DDR_WR_COMP     BIT(2)
0182 #define SLV_INT_SDR_RD_COMP     BIT(1)
0183 #define SLV_INT_SDR_WR_COMP     BIT(0)
0184 
0185 #define SLV_STATUS0         0x54
0186 #define SLV_STATUS0_REG_ADDR(s)     (((s) & GENMASK(23, 16)) >> 16)
0187 #define SLV_STATUS0_XFRD_BYTES(s)   ((s) & GENMASK(15, 0))
0188 
0189 #define SLV_STATUS1         0x58
0190 #define SLV_STATUS1_AS(s)       (((s) & GENMASK(21, 20)) >> 20)
0191 #define SLV_STATUS1_VEN_TM      BIT(19)
0192 #define SLV_STATUS1_HJ_DIS      BIT(18)
0193 #define SLV_STATUS1_MR_DIS      BIT(17)
0194 #define SLV_STATUS1_PROT_ERR        BIT(16)
0195 #define SLV_STATUS1_DA(x)       (((s) & GENMASK(15, 9)) >> 9)
0196 #define SLV_STATUS1_HAS_DA      BIT(8)
0197 #define SLV_STATUS1_DDR_RX_FULL     BIT(7)
0198 #define SLV_STATUS1_DDR_TX_FULL     BIT(6)
0199 #define SLV_STATUS1_DDR_RX_EMPTY    BIT(5)
0200 #define SLV_STATUS1_DDR_TX_EMPTY    BIT(4)
0201 #define SLV_STATUS1_SDR_RX_FULL     BIT(3)
0202 #define SLV_STATUS1_SDR_TX_FULL     BIT(2)
0203 #define SLV_STATUS1_SDR_RX_EMPTY    BIT(1)
0204 #define SLV_STATUS1_SDR_TX_EMPTY    BIT(0)
0205 
0206 #define CMD0_FIFO           0x60
0207 #define CMD0_FIFO_IS_DDR        BIT(31)
0208 #define CMD0_FIFO_IS_CCC        BIT(30)
0209 #define CMD0_FIFO_BCH           BIT(29)
0210 #define XMIT_BURST_STATIC_SUBADDR   0
0211 #define XMIT_SINGLE_INC_SUBADDR     1
0212 #define XMIT_SINGLE_STATIC_SUBADDR  2
0213 #define XMIT_BURST_WITHOUT_SUBADDR  3
0214 #define CMD0_FIFO_PRIV_XMIT_MODE(m) ((m) << 27)
0215 #define CMD0_FIFO_SBCA          BIT(26)
0216 #define CMD0_FIFO_RSBC          BIT(25)
0217 #define CMD0_FIFO_IS_10B        BIT(24)
0218 #define CMD0_FIFO_PL_LEN(l)     ((l) << 12)
0219 #define CMD0_FIFO_PL_LEN_MAX        4095
0220 #define CMD0_FIFO_DEV_ADDR(a)       ((a) << 1)
0221 #define CMD0_FIFO_RNW           BIT(0)
0222 
0223 #define CMD1_FIFO           0x64
0224 #define CMD1_FIFO_CMDID(id)     ((id) << 24)
0225 #define CMD1_FIFO_CSRADDR(a)        (a)
0226 #define CMD1_FIFO_CCC(id)       (id)
0227 
0228 #define TX_FIFO             0x68
0229 
0230 #define IMD_CMD0            0x70
0231 #define IMD_CMD0_PL_LEN(l)      ((l) << 12)
0232 #define IMD_CMD0_DEV_ADDR(a)        ((a) << 1)
0233 #define IMD_CMD0_RNW            BIT(0)
0234 
0235 #define IMD_CMD1            0x74
0236 #define IMD_CMD1_CCC(id)        (id)
0237 
0238 #define IMD_DATA            0x78
0239 #define RX_FIFO             0x80
0240 #define IBI_DATA_FIFO           0x84
0241 #define SLV_DDR_TX_FIFO         0x88
0242 #define SLV_DDR_RX_FIFO         0x8c
0243 
0244 #define CMD_IBI_THR_CTRL        0x90
0245 #define IBIR_THR(t)         ((t) << 24)
0246 #define CMDR_THR(t)         ((t) << 16)
0247 #define IBI_THR(t)          ((t) << 8)
0248 #define CMD_THR(t)          (t)
0249 
0250 #define TX_RX_THR_CTRL          0x94
0251 #define RX_THR(t)           ((t) << 16)
0252 #define TX_THR(t)           (t)
0253 
0254 #define SLV_DDR_TX_RX_THR_CTRL      0x98
0255 #define SLV_DDR_RX_THR(t)       ((t) << 16)
0256 #define SLV_DDR_TX_THR(t)       (t)
0257 
0258 #define FLUSH_CTRL          0x9c
0259 #define FLUSH_IBI_RESP          BIT(23)
0260 #define FLUSH_CMD_RESP          BIT(22)
0261 #define FLUSH_SLV_DDR_RX_FIFO       BIT(22)
0262 #define FLUSH_SLV_DDR_TX_FIFO       BIT(21)
0263 #define FLUSH_IMM_FIFO          BIT(20)
0264 #define FLUSH_IBI_FIFO          BIT(19)
0265 #define FLUSH_RX_FIFO           BIT(18)
0266 #define FLUSH_TX_FIFO           BIT(17)
0267 #define FLUSH_CMD_FIFO          BIT(16)
0268 
0269 #define TTO_PRESCL_CTRL0        0xb0
0270 #define TTO_PRESCL_CTRL0_DIVB(x)    ((x) << 16)
0271 #define TTO_PRESCL_CTRL0_DIVA(x)    (x)
0272 
0273 #define TTO_PRESCL_CTRL1        0xb4
0274 #define TTO_PRESCL_CTRL1_DIVB(x)    ((x) << 16)
0275 #define TTO_PRESCL_CTRL1_DIVA(x)    (x)
0276 
0277 #define DEVS_CTRL           0xb8
0278 #define DEVS_CTRL_DEV_CLR_SHIFT     16
0279 #define DEVS_CTRL_DEV_CLR_ALL       GENMASK(31, 16)
0280 #define DEVS_CTRL_DEV_CLR(dev)      BIT(16 + (dev))
0281 #define DEVS_CTRL_DEV_ACTIVE(dev)   BIT(dev)
0282 #define DEVS_CTRL_DEVS_ACTIVE_MASK  GENMASK(15, 0)
0283 #define MAX_DEVS            16
0284 
0285 #define DEV_ID_RR0(d)           (0xc0 + ((d) * 0x10))
0286 #define DEV_ID_RR0_LVR_EXT_ADDR     BIT(11)
0287 #define DEV_ID_RR0_HDR_CAP      BIT(10)
0288 #define DEV_ID_RR0_IS_I3C       BIT(9)
0289 #define DEV_ID_RR0_DEV_ADDR_MASK    (GENMASK(6, 0) | GENMASK(15, 13))
0290 #define DEV_ID_RR0_SET_DEV_ADDR(a)  (((a) & GENMASK(6, 0)) |    \
0291                      (((a) & GENMASK(9, 7)) << 6))
0292 #define DEV_ID_RR0_GET_DEV_ADDR(x)  ((((x) >> 1) & GENMASK(6, 0)) | \
0293                      (((x) >> 6) & GENMASK(9, 7)))
0294 
0295 #define DEV_ID_RR1(d)           (0xc4 + ((d) * 0x10))
0296 #define DEV_ID_RR1_PID_MSB(pid)     (pid)
0297 
0298 #define DEV_ID_RR2(d)           (0xc8 + ((d) * 0x10))
0299 #define DEV_ID_RR2_PID_LSB(pid)     ((pid) << 16)
0300 #define DEV_ID_RR2_BCR(bcr)     ((bcr) << 8)
0301 #define DEV_ID_RR2_DCR(dcr)     (dcr)
0302 #define DEV_ID_RR2_LVR(lvr)     (lvr)
0303 
0304 #define SIR_MAP(x)          (0x180 + ((x) * 4))
0305 #define SIR_MAP_DEV_REG(d)      SIR_MAP((d) / 2)
0306 #define SIR_MAP_DEV_SHIFT(d, fs)    ((fs) + (((d) % 2) ? 16 : 0))
0307 #define SIR_MAP_DEV_CONF_MASK(d)    (GENMASK(15, 0) << (((d) % 2) ? 16 : 0))
0308 #define SIR_MAP_DEV_CONF(d, c)      ((c) << (((d) % 2) ? 16 : 0))
0309 #define DEV_ROLE_SLAVE          0
0310 #define DEV_ROLE_MASTER         1
0311 #define SIR_MAP_DEV_ROLE(role)      ((role) << 14)
0312 #define SIR_MAP_DEV_SLOW        BIT(13)
0313 #define SIR_MAP_DEV_PL(l)       ((l) << 8)
0314 #define SIR_MAP_PL_MAX          GENMASK(4, 0)
0315 #define SIR_MAP_DEV_DA(a)       ((a) << 1)
0316 #define SIR_MAP_DEV_ACK         BIT(0)
0317 
0318 #define GPIR_WORD(x)            (0x200 + ((x) * 4))
0319 #define GPI_REG(val, id)        \
0320     (((val) >> (((id) % 4) * 8)) & GENMASK(7, 0))
0321 
0322 #define GPOR_WORD(x)            (0x220 + ((x) * 4))
0323 #define GPO_REG(val, id)        \
0324     (((val) >> (((id) % 4) * 8)) & GENMASK(7, 0))
0325 
0326 #define ASF_INT_STATUS          0x300
0327 #define ASF_INT_RAW_STATUS      0x304
0328 #define ASF_INT_MASK            0x308
0329 #define ASF_INT_TEST            0x30c
0330 #define ASF_INT_FATAL_SELECT        0x310
0331 #define ASF_INTEGRITY_ERR       BIT(6)
0332 #define ASF_PROTOCOL_ERR        BIT(5)
0333 #define ASF_TRANS_TIMEOUT_ERR       BIT(4)
0334 #define ASF_CSR_ERR         BIT(3)
0335 #define ASF_DAP_ERR         BIT(2)
0336 #define ASF_SRAM_UNCORR_ERR     BIT(1)
0337 #define ASF_SRAM_CORR_ERR       BIT(0)
0338 
0339 #define ASF_SRAM_CORR_FAULT_STATUS  0x320
0340 #define ASF_SRAM_UNCORR_FAULT_STATUS    0x324
0341 #define ASF_SRAM_CORR_FAULT_INSTANCE(x) ((x) >> 24)
0342 #define ASF_SRAM_CORR_FAULT_ADDR(x) ((x) & GENMASK(23, 0))
0343 
0344 #define ASF_SRAM_FAULT_STATS        0x328
0345 #define ASF_SRAM_FAULT_UNCORR_STATS(x)  ((x) >> 16)
0346 #define ASF_SRAM_FAULT_CORR_STATS(x)    ((x) & GENMASK(15, 0))
0347 
0348 #define ASF_TRANS_TOUT_CTRL     0x330
0349 #define ASF_TRANS_TOUT_EN       BIT(31)
0350 #define ASF_TRANS_TOUT_VAL(x)   (x)
0351 
0352 #define ASF_TRANS_TOUT_FAULT_MASK   0x334
0353 #define ASF_TRANS_TOUT_FAULT_STATUS 0x338
0354 #define ASF_TRANS_TOUT_FAULT_APB    BIT(3)
0355 #define ASF_TRANS_TOUT_FAULT_SCL_LOW    BIT(2)
0356 #define ASF_TRANS_TOUT_FAULT_SCL_HIGH   BIT(1)
0357 #define ASF_TRANS_TOUT_FAULT_FSCL_HIGH  BIT(0)
0358 
0359 #define ASF_PROTO_FAULT_MASK        0x340
0360 #define ASF_PROTO_FAULT_STATUS      0x344
0361 #define ASF_PROTO_FAULT_SLVSDR_RD_ABORT BIT(31)
0362 #define ASF_PROTO_FAULT_SLVDDR_FAIL BIT(30)
0363 #define ASF_PROTO_FAULT_S(x)        BIT(16 + (x))
0364 #define ASF_PROTO_FAULT_MSTSDR_RD_ABORT BIT(15)
0365 #define ASF_PROTO_FAULT_MSTDDR_FAIL BIT(14)
0366 #define ASF_PROTO_FAULT_M(x)        BIT(x)
0367 
0368 struct cdns_i3c_master_caps {
0369     u32 cmdfifodepth;
0370     u32 cmdrfifodepth;
0371     u32 txfifodepth;
0372     u32 rxfifodepth;
0373     u32 ibirfifodepth;
0374 };
0375 
0376 struct cdns_i3c_cmd {
0377     u32 cmd0;
0378     u32 cmd1;
0379     u32 tx_len;
0380     const void *tx_buf;
0381     u32 rx_len;
0382     void *rx_buf;
0383     u32 error;
0384 };
0385 
0386 struct cdns_i3c_xfer {
0387     struct list_head node;
0388     struct completion comp;
0389     int ret;
0390     unsigned int ncmds;
0391     struct cdns_i3c_cmd cmds[];
0392 };
0393 
0394 struct cdns_i3c_data {
0395     u8 thd_delay_ns;
0396 };
0397 
0398 struct cdns_i3c_master {
0399     struct work_struct hj_work;
0400     struct i3c_master_controller base;
0401     u32 free_rr_slots;
0402     unsigned int maxdevs;
0403     struct {
0404         unsigned int num_slots;
0405         struct i3c_dev_desc **slots;
0406         spinlock_t lock;
0407     } ibi;
0408     struct {
0409         struct list_head list;
0410         struct cdns_i3c_xfer *cur;
0411         spinlock_t lock;
0412     } xferqueue;
0413     void __iomem *regs;
0414     struct clk *sysclk;
0415     struct clk *pclk;
0416     struct cdns_i3c_master_caps caps;
0417     unsigned long i3c_scl_lim;
0418     const struct cdns_i3c_data *devdata;
0419 };
0420 
0421 static inline struct cdns_i3c_master *
0422 to_cdns_i3c_master(struct i3c_master_controller *master)
0423 {
0424     return container_of(master, struct cdns_i3c_master, base);
0425 }
0426 
0427 static void cdns_i3c_master_wr_to_tx_fifo(struct cdns_i3c_master *master,
0428                       const u8 *bytes, int nbytes)
0429 {
0430     writesl(master->regs + TX_FIFO, bytes, nbytes / 4);
0431     if (nbytes & 3) {
0432         u32 tmp = 0;
0433 
0434         memcpy(&tmp, bytes + (nbytes & ~3), nbytes & 3);
0435         writesl(master->regs + TX_FIFO, &tmp, 1);
0436     }
0437 }
0438 
0439 static void cdns_i3c_master_rd_from_rx_fifo(struct cdns_i3c_master *master,
0440                         u8 *bytes, int nbytes)
0441 {
0442     readsl(master->regs + RX_FIFO, bytes, nbytes / 4);
0443     if (nbytes & 3) {
0444         u32 tmp;
0445 
0446         readsl(master->regs + RX_FIFO, &tmp, 1);
0447         memcpy(bytes + (nbytes & ~3), &tmp, nbytes & 3);
0448     }
0449 }
0450 
0451 static bool cdns_i3c_master_supports_ccc_cmd(struct i3c_master_controller *m,
0452                          const struct i3c_ccc_cmd *cmd)
0453 {
0454     if (cmd->ndests > 1)
0455         return false;
0456 
0457     switch (cmd->id) {
0458     case I3C_CCC_ENEC(true):
0459     case I3C_CCC_ENEC(false):
0460     case I3C_CCC_DISEC(true):
0461     case I3C_CCC_DISEC(false):
0462     case I3C_CCC_ENTAS(0, true):
0463     case I3C_CCC_ENTAS(0, false):
0464     case I3C_CCC_RSTDAA(true):
0465     case I3C_CCC_RSTDAA(false):
0466     case I3C_CCC_ENTDAA:
0467     case I3C_CCC_SETMWL(true):
0468     case I3C_CCC_SETMWL(false):
0469     case I3C_CCC_SETMRL(true):
0470     case I3C_CCC_SETMRL(false):
0471     case I3C_CCC_DEFSLVS:
0472     case I3C_CCC_ENTHDR(0):
0473     case I3C_CCC_SETDASA:
0474     case I3C_CCC_SETNEWDA:
0475     case I3C_CCC_GETMWL:
0476     case I3C_CCC_GETMRL:
0477     case I3C_CCC_GETPID:
0478     case I3C_CCC_GETBCR:
0479     case I3C_CCC_GETDCR:
0480     case I3C_CCC_GETSTATUS:
0481     case I3C_CCC_GETACCMST:
0482     case I3C_CCC_GETMXDS:
0483     case I3C_CCC_GETHDRCAP:
0484         return true;
0485     default:
0486         break;
0487     }
0488 
0489     return false;
0490 }
0491 
0492 static int cdns_i3c_master_disable(struct cdns_i3c_master *master)
0493 {
0494     u32 status;
0495 
0496     writel(readl(master->regs + CTRL) & ~CTRL_DEV_EN, master->regs + CTRL);
0497 
0498     return readl_poll_timeout(master->regs + MST_STATUS0, status,
0499                   status & MST_STATUS0_IDLE, 10, 1000000);
0500 }
0501 
0502 static void cdns_i3c_master_enable(struct cdns_i3c_master *master)
0503 {
0504     writel(readl(master->regs + CTRL) | CTRL_DEV_EN, master->regs + CTRL);
0505 }
0506 
0507 static struct cdns_i3c_xfer *
0508 cdns_i3c_master_alloc_xfer(struct cdns_i3c_master *master, unsigned int ncmds)
0509 {
0510     struct cdns_i3c_xfer *xfer;
0511 
0512     xfer = kzalloc(struct_size(xfer, cmds, ncmds), GFP_KERNEL);
0513     if (!xfer)
0514         return NULL;
0515 
0516     INIT_LIST_HEAD(&xfer->node);
0517     xfer->ncmds = ncmds;
0518     xfer->ret = -ETIMEDOUT;
0519 
0520     return xfer;
0521 }
0522 
0523 static void cdns_i3c_master_free_xfer(struct cdns_i3c_xfer *xfer)
0524 {
0525     kfree(xfer);
0526 }
0527 
0528 static void cdns_i3c_master_start_xfer_locked(struct cdns_i3c_master *master)
0529 {
0530     struct cdns_i3c_xfer *xfer = master->xferqueue.cur;
0531     unsigned int i;
0532 
0533     if (!xfer)
0534         return;
0535 
0536     writel(MST_INT_CMDD_EMP, master->regs + MST_ICR);
0537     for (i = 0; i < xfer->ncmds; i++) {
0538         struct cdns_i3c_cmd *cmd = &xfer->cmds[i];
0539 
0540         cdns_i3c_master_wr_to_tx_fifo(master, cmd->tx_buf,
0541                           cmd->tx_len);
0542     }
0543 
0544     for (i = 0; i < xfer->ncmds; i++) {
0545         struct cdns_i3c_cmd *cmd = &xfer->cmds[i];
0546 
0547         writel(cmd->cmd1 | CMD1_FIFO_CMDID(i),
0548                master->regs + CMD1_FIFO);
0549         writel(cmd->cmd0, master->regs + CMD0_FIFO);
0550     }
0551 
0552     writel(readl(master->regs + CTRL) | CTRL_MCS,
0553            master->regs + CTRL);
0554     writel(MST_INT_CMDD_EMP, master->regs + MST_IER);
0555 }
0556 
0557 static void cdns_i3c_master_end_xfer_locked(struct cdns_i3c_master *master,
0558                         u32 isr)
0559 {
0560     struct cdns_i3c_xfer *xfer = master->xferqueue.cur;
0561     int i, ret = 0;
0562     u32 status0;
0563 
0564     if (!xfer)
0565         return;
0566 
0567     if (!(isr & MST_INT_CMDD_EMP))
0568         return;
0569 
0570     writel(MST_INT_CMDD_EMP, master->regs + MST_IDR);
0571 
0572     for (status0 = readl(master->regs + MST_STATUS0);
0573          !(status0 & MST_STATUS0_CMDR_EMP);
0574          status0 = readl(master->regs + MST_STATUS0)) {
0575         struct cdns_i3c_cmd *cmd;
0576         u32 cmdr, rx_len, id;
0577 
0578         cmdr = readl(master->regs + CMDR);
0579         id = CMDR_CMDID(cmdr);
0580         if (id == CMDR_CMDID_HJACK_DISEC ||
0581             id == CMDR_CMDID_HJACK_ENTDAA ||
0582             WARN_ON(id >= xfer->ncmds))
0583             continue;
0584 
0585         cmd = &xfer->cmds[CMDR_CMDID(cmdr)];
0586         rx_len = min_t(u32, CMDR_XFER_BYTES(cmdr), cmd->rx_len);
0587         cdns_i3c_master_rd_from_rx_fifo(master, cmd->rx_buf, rx_len);
0588         cmd->error = CMDR_ERROR(cmdr);
0589     }
0590 
0591     for (i = 0; i < xfer->ncmds; i++) {
0592         switch (xfer->cmds[i].error) {
0593         case CMDR_NO_ERROR:
0594             break;
0595 
0596         case CMDR_DDR_PREAMBLE_ERROR:
0597         case CMDR_DDR_PARITY_ERROR:
0598         case CMDR_M0_ERROR:
0599         case CMDR_M1_ERROR:
0600         case CMDR_M2_ERROR:
0601         case CMDR_MST_ABORT:
0602         case CMDR_NACK_RESP:
0603         case CMDR_DDR_DROPPED:
0604             ret = -EIO;
0605             break;
0606 
0607         case CMDR_DDR_RX_FIFO_OVF:
0608         case CMDR_DDR_TX_FIFO_UNF:
0609             ret = -ENOSPC;
0610             break;
0611 
0612         case CMDR_INVALID_DA:
0613         default:
0614             ret = -EINVAL;
0615             break;
0616         }
0617     }
0618 
0619     xfer->ret = ret;
0620     complete(&xfer->comp);
0621 
0622     xfer = list_first_entry_or_null(&master->xferqueue.list,
0623                     struct cdns_i3c_xfer, node);
0624     if (xfer)
0625         list_del_init(&xfer->node);
0626 
0627     master->xferqueue.cur = xfer;
0628     cdns_i3c_master_start_xfer_locked(master);
0629 }
0630 
0631 static void cdns_i3c_master_queue_xfer(struct cdns_i3c_master *master,
0632                        struct cdns_i3c_xfer *xfer)
0633 {
0634     unsigned long flags;
0635 
0636     init_completion(&xfer->comp);
0637     spin_lock_irqsave(&master->xferqueue.lock, flags);
0638     if (master->xferqueue.cur) {
0639         list_add_tail(&xfer->node, &master->xferqueue.list);
0640     } else {
0641         master->xferqueue.cur = xfer;
0642         cdns_i3c_master_start_xfer_locked(master);
0643     }
0644     spin_unlock_irqrestore(&master->xferqueue.lock, flags);
0645 }
0646 
0647 static void cdns_i3c_master_unqueue_xfer(struct cdns_i3c_master *master,
0648                      struct cdns_i3c_xfer *xfer)
0649 {
0650     unsigned long flags;
0651 
0652     spin_lock_irqsave(&master->xferqueue.lock, flags);
0653     if (master->xferqueue.cur == xfer) {
0654         u32 status;
0655 
0656         writel(readl(master->regs + CTRL) & ~CTRL_DEV_EN,
0657                master->regs + CTRL);
0658         readl_poll_timeout_atomic(master->regs + MST_STATUS0, status,
0659                       status & MST_STATUS0_IDLE, 10,
0660                       1000000);
0661         master->xferqueue.cur = NULL;
0662         writel(FLUSH_RX_FIFO | FLUSH_TX_FIFO | FLUSH_CMD_FIFO |
0663                FLUSH_CMD_RESP,
0664                master->regs + FLUSH_CTRL);
0665         writel(MST_INT_CMDD_EMP, master->regs + MST_IDR);
0666         writel(readl(master->regs + CTRL) | CTRL_DEV_EN,
0667                master->regs + CTRL);
0668     } else {
0669         list_del_init(&xfer->node);
0670     }
0671     spin_unlock_irqrestore(&master->xferqueue.lock, flags);
0672 }
0673 
0674 static enum i3c_error_code cdns_i3c_cmd_get_err(struct cdns_i3c_cmd *cmd)
0675 {
0676     switch (cmd->error) {
0677     case CMDR_M0_ERROR:
0678         return I3C_ERROR_M0;
0679 
0680     case CMDR_M1_ERROR:
0681         return I3C_ERROR_M1;
0682 
0683     case CMDR_M2_ERROR:
0684     case CMDR_NACK_RESP:
0685         return I3C_ERROR_M2;
0686 
0687     default:
0688         break;
0689     }
0690 
0691     return I3C_ERROR_UNKNOWN;
0692 }
0693 
0694 static int cdns_i3c_master_send_ccc_cmd(struct i3c_master_controller *m,
0695                     struct i3c_ccc_cmd *cmd)
0696 {
0697     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
0698     struct cdns_i3c_xfer *xfer;
0699     struct cdns_i3c_cmd *ccmd;
0700     int ret;
0701 
0702     xfer = cdns_i3c_master_alloc_xfer(master, 1);
0703     if (!xfer)
0704         return -ENOMEM;
0705 
0706     ccmd = xfer->cmds;
0707     ccmd->cmd1 = CMD1_FIFO_CCC(cmd->id);
0708     ccmd->cmd0 = CMD0_FIFO_IS_CCC |
0709              CMD0_FIFO_PL_LEN(cmd->dests[0].payload.len);
0710 
0711     if (cmd->id & I3C_CCC_DIRECT)
0712         ccmd->cmd0 |= CMD0_FIFO_DEV_ADDR(cmd->dests[0].addr);
0713 
0714     if (cmd->rnw) {
0715         ccmd->cmd0 |= CMD0_FIFO_RNW;
0716         ccmd->rx_buf = cmd->dests[0].payload.data;
0717         ccmd->rx_len = cmd->dests[0].payload.len;
0718     } else {
0719         ccmd->tx_buf = cmd->dests[0].payload.data;
0720         ccmd->tx_len = cmd->dests[0].payload.len;
0721     }
0722 
0723     cdns_i3c_master_queue_xfer(master, xfer);
0724     if (!wait_for_completion_timeout(&xfer->comp, msecs_to_jiffies(1000)))
0725         cdns_i3c_master_unqueue_xfer(master, xfer);
0726 
0727     ret = xfer->ret;
0728     cmd->err = cdns_i3c_cmd_get_err(&xfer->cmds[0]);
0729     cdns_i3c_master_free_xfer(xfer);
0730 
0731     return ret;
0732 }
0733 
0734 static int cdns_i3c_master_priv_xfers(struct i3c_dev_desc *dev,
0735                       struct i3c_priv_xfer *xfers,
0736                       int nxfers)
0737 {
0738     struct i3c_master_controller *m = i3c_dev_get_master(dev);
0739     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
0740     int txslots = 0, rxslots = 0, i, ret;
0741     struct cdns_i3c_xfer *cdns_xfer;
0742 
0743     for (i = 0; i < nxfers; i++) {
0744         if (xfers[i].len > CMD0_FIFO_PL_LEN_MAX)
0745             return -ENOTSUPP;
0746     }
0747 
0748     if (!nxfers)
0749         return 0;
0750 
0751     if (nxfers > master->caps.cmdfifodepth ||
0752         nxfers > master->caps.cmdrfifodepth)
0753         return -ENOTSUPP;
0754 
0755     /*
0756      * First make sure that all transactions (block of transfers separated
0757      * by a STOP marker) fit in the FIFOs.
0758      */
0759     for (i = 0; i < nxfers; i++) {
0760         if (xfers[i].rnw)
0761             rxslots += DIV_ROUND_UP(xfers[i].len, 4);
0762         else
0763             txslots += DIV_ROUND_UP(xfers[i].len, 4);
0764     }
0765 
0766     if (rxslots > master->caps.rxfifodepth ||
0767         txslots > master->caps.txfifodepth)
0768         return -ENOTSUPP;
0769 
0770     cdns_xfer = cdns_i3c_master_alloc_xfer(master, nxfers);
0771     if (!cdns_xfer)
0772         return -ENOMEM;
0773 
0774     for (i = 0; i < nxfers; i++) {
0775         struct cdns_i3c_cmd *ccmd = &cdns_xfer->cmds[i];
0776         u32 pl_len = xfers[i].len;
0777 
0778         ccmd->cmd0 = CMD0_FIFO_DEV_ADDR(dev->info.dyn_addr) |
0779             CMD0_FIFO_PRIV_XMIT_MODE(XMIT_BURST_WITHOUT_SUBADDR);
0780 
0781         if (xfers[i].rnw) {
0782             ccmd->cmd0 |= CMD0_FIFO_RNW;
0783             ccmd->rx_buf = xfers[i].data.in;
0784             ccmd->rx_len = xfers[i].len;
0785             pl_len++;
0786         } else {
0787             ccmd->tx_buf = xfers[i].data.out;
0788             ccmd->tx_len = xfers[i].len;
0789         }
0790 
0791         ccmd->cmd0 |= CMD0_FIFO_PL_LEN(pl_len);
0792 
0793         if (i < nxfers - 1)
0794             ccmd->cmd0 |= CMD0_FIFO_RSBC;
0795 
0796         if (!i)
0797             ccmd->cmd0 |= CMD0_FIFO_BCH;
0798     }
0799 
0800     cdns_i3c_master_queue_xfer(master, cdns_xfer);
0801     if (!wait_for_completion_timeout(&cdns_xfer->comp,
0802                      msecs_to_jiffies(1000)))
0803         cdns_i3c_master_unqueue_xfer(master, cdns_xfer);
0804 
0805     ret = cdns_xfer->ret;
0806 
0807     for (i = 0; i < nxfers; i++)
0808         xfers[i].err = cdns_i3c_cmd_get_err(&cdns_xfer->cmds[i]);
0809 
0810     cdns_i3c_master_free_xfer(cdns_xfer);
0811 
0812     return ret;
0813 }
0814 
0815 static int cdns_i3c_master_i2c_xfers(struct i2c_dev_desc *dev,
0816                      const struct i2c_msg *xfers, int nxfers)
0817 {
0818     struct i3c_master_controller *m = i2c_dev_get_master(dev);
0819     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
0820     unsigned int nrxwords = 0, ntxwords = 0;
0821     struct cdns_i3c_xfer *xfer;
0822     int i, ret = 0;
0823 
0824     if (nxfers > master->caps.cmdfifodepth)
0825         return -ENOTSUPP;
0826 
0827     for (i = 0; i < nxfers; i++) {
0828         if (xfers[i].len > CMD0_FIFO_PL_LEN_MAX)
0829             return -ENOTSUPP;
0830 
0831         if (xfers[i].flags & I2C_M_RD)
0832             nrxwords += DIV_ROUND_UP(xfers[i].len, 4);
0833         else
0834             ntxwords += DIV_ROUND_UP(xfers[i].len, 4);
0835     }
0836 
0837     if (ntxwords > master->caps.txfifodepth ||
0838         nrxwords > master->caps.rxfifodepth)
0839         return -ENOTSUPP;
0840 
0841     xfer = cdns_i3c_master_alloc_xfer(master, nxfers);
0842     if (!xfer)
0843         return -ENOMEM;
0844 
0845     for (i = 0; i < nxfers; i++) {
0846         struct cdns_i3c_cmd *ccmd = &xfer->cmds[i];
0847 
0848         ccmd->cmd0 = CMD0_FIFO_DEV_ADDR(xfers[i].addr) |
0849             CMD0_FIFO_PL_LEN(xfers[i].len) |
0850             CMD0_FIFO_PRIV_XMIT_MODE(XMIT_BURST_WITHOUT_SUBADDR);
0851 
0852         if (xfers[i].flags & I2C_M_TEN)
0853             ccmd->cmd0 |= CMD0_FIFO_IS_10B;
0854 
0855         if (xfers[i].flags & I2C_M_RD) {
0856             ccmd->cmd0 |= CMD0_FIFO_RNW;
0857             ccmd->rx_buf = xfers[i].buf;
0858             ccmd->rx_len = xfers[i].len;
0859         } else {
0860             ccmd->tx_buf = xfers[i].buf;
0861             ccmd->tx_len = xfers[i].len;
0862         }
0863     }
0864 
0865     cdns_i3c_master_queue_xfer(master, xfer);
0866     if (!wait_for_completion_timeout(&xfer->comp, msecs_to_jiffies(1000)))
0867         cdns_i3c_master_unqueue_xfer(master, xfer);
0868 
0869     ret = xfer->ret;
0870     cdns_i3c_master_free_xfer(xfer);
0871 
0872     return ret;
0873 }
0874 
0875 struct cdns_i3c_i2c_dev_data {
0876     u16 id;
0877     s16 ibi;
0878     struct i3c_generic_ibi_pool *ibi_pool;
0879 };
0880 
0881 static u32 prepare_rr0_dev_address(u32 addr)
0882 {
0883     u32 ret = (addr << 1) & 0xff;
0884 
0885     /* RR0[7:1] = addr[6:0] */
0886     ret |= (addr & GENMASK(6, 0)) << 1;
0887 
0888     /* RR0[15:13] = addr[9:7] */
0889     ret |= (addr & GENMASK(9, 7)) << 6;
0890 
0891     /* RR0[0] = ~XOR(addr[6:0]) */
0892     if (!(hweight8(addr & 0x7f) & 1))
0893         ret |= 1;
0894 
0895     return ret;
0896 }
0897 
0898 static void cdns_i3c_master_upd_i3c_addr(struct i3c_dev_desc *dev)
0899 {
0900     struct i3c_master_controller *m = i3c_dev_get_master(dev);
0901     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
0902     struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
0903     u32 rr;
0904 
0905     rr = prepare_rr0_dev_address(dev->info.dyn_addr ?
0906                      dev->info.dyn_addr :
0907                      dev->info.static_addr);
0908     writel(DEV_ID_RR0_IS_I3C | rr, master->regs + DEV_ID_RR0(data->id));
0909 }
0910 
0911 static int cdns_i3c_master_get_rr_slot(struct cdns_i3c_master *master,
0912                        u8 dyn_addr)
0913 {
0914     unsigned long activedevs;
0915     u32 rr;
0916     int i;
0917 
0918     if (!dyn_addr) {
0919         if (!master->free_rr_slots)
0920             return -ENOSPC;
0921 
0922         return ffs(master->free_rr_slots) - 1;
0923     }
0924 
0925     activedevs = readl(master->regs + DEVS_CTRL) & DEVS_CTRL_DEVS_ACTIVE_MASK;
0926     activedevs &= ~BIT(0);
0927 
0928     for_each_set_bit(i, &activedevs, master->maxdevs + 1) {
0929         rr = readl(master->regs + DEV_ID_RR0(i));
0930         if (!(rr & DEV_ID_RR0_IS_I3C) ||
0931             DEV_ID_RR0_GET_DEV_ADDR(rr) != dyn_addr)
0932             continue;
0933 
0934         return i;
0935     }
0936 
0937     return -EINVAL;
0938 }
0939 
0940 static int cdns_i3c_master_reattach_i3c_dev(struct i3c_dev_desc *dev,
0941                         u8 old_dyn_addr)
0942 {
0943     cdns_i3c_master_upd_i3c_addr(dev);
0944 
0945     return 0;
0946 }
0947 
0948 static int cdns_i3c_master_attach_i3c_dev(struct i3c_dev_desc *dev)
0949 {
0950     struct i3c_master_controller *m = i3c_dev_get_master(dev);
0951     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
0952     struct cdns_i3c_i2c_dev_data *data;
0953     int slot;
0954 
0955     data = kzalloc(sizeof(*data), GFP_KERNEL);
0956     if (!data)
0957         return -ENOMEM;
0958 
0959     slot = cdns_i3c_master_get_rr_slot(master, dev->info.dyn_addr);
0960     if (slot < 0) {
0961         kfree(data);
0962         return slot;
0963     }
0964 
0965     data->ibi = -1;
0966     data->id = slot;
0967     i3c_dev_set_master_data(dev, data);
0968     master->free_rr_slots &= ~BIT(slot);
0969 
0970     if (!dev->info.dyn_addr) {
0971         cdns_i3c_master_upd_i3c_addr(dev);
0972         writel(readl(master->regs + DEVS_CTRL) |
0973                DEVS_CTRL_DEV_ACTIVE(data->id),
0974                master->regs + DEVS_CTRL);
0975     }
0976 
0977     return 0;
0978 }
0979 
0980 static void cdns_i3c_master_detach_i3c_dev(struct i3c_dev_desc *dev)
0981 {
0982     struct i3c_master_controller *m = i3c_dev_get_master(dev);
0983     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
0984     struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
0985 
0986     writel(readl(master->regs + DEVS_CTRL) |
0987            DEVS_CTRL_DEV_CLR(data->id),
0988            master->regs + DEVS_CTRL);
0989 
0990     i3c_dev_set_master_data(dev, NULL);
0991     master->free_rr_slots |= BIT(data->id);
0992     kfree(data);
0993 }
0994 
0995 static int cdns_i3c_master_attach_i2c_dev(struct i2c_dev_desc *dev)
0996 {
0997     struct i3c_master_controller *m = i2c_dev_get_master(dev);
0998     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
0999     struct cdns_i3c_i2c_dev_data *data;
1000     int slot;
1001 
1002     slot = cdns_i3c_master_get_rr_slot(master, 0);
1003     if (slot < 0)
1004         return slot;
1005 
1006     data = kzalloc(sizeof(*data), GFP_KERNEL);
1007     if (!data)
1008         return -ENOMEM;
1009 
1010     data->id = slot;
1011     master->free_rr_slots &= ~BIT(slot);
1012     i2c_dev_set_master_data(dev, data);
1013 
1014     writel(prepare_rr0_dev_address(dev->addr),
1015            master->regs + DEV_ID_RR0(data->id));
1016     writel(dev->lvr, master->regs + DEV_ID_RR2(data->id));
1017     writel(readl(master->regs + DEVS_CTRL) |
1018            DEVS_CTRL_DEV_ACTIVE(data->id),
1019            master->regs + DEVS_CTRL);
1020 
1021     return 0;
1022 }
1023 
1024 static void cdns_i3c_master_detach_i2c_dev(struct i2c_dev_desc *dev)
1025 {
1026     struct i3c_master_controller *m = i2c_dev_get_master(dev);
1027     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
1028     struct cdns_i3c_i2c_dev_data *data = i2c_dev_get_master_data(dev);
1029 
1030     writel(readl(master->regs + DEVS_CTRL) |
1031            DEVS_CTRL_DEV_CLR(data->id),
1032            master->regs + DEVS_CTRL);
1033     master->free_rr_slots |= BIT(data->id);
1034 
1035     i2c_dev_set_master_data(dev, NULL);
1036     kfree(data);
1037 }
1038 
1039 static void cdns_i3c_master_bus_cleanup(struct i3c_master_controller *m)
1040 {
1041     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
1042 
1043     cdns_i3c_master_disable(master);
1044 }
1045 
1046 static void cdns_i3c_master_dev_rr_to_info(struct cdns_i3c_master *master,
1047                        unsigned int slot,
1048                        struct i3c_device_info *info)
1049 {
1050     u32 rr;
1051 
1052     memset(info, 0, sizeof(*info));
1053     rr = readl(master->regs + DEV_ID_RR0(slot));
1054     info->dyn_addr = DEV_ID_RR0_GET_DEV_ADDR(rr);
1055     rr = readl(master->regs + DEV_ID_RR2(slot));
1056     info->dcr = rr;
1057     info->bcr = rr >> 8;
1058     info->pid = rr >> 16;
1059     info->pid |= (u64)readl(master->regs + DEV_ID_RR1(slot)) << 16;
1060 }
1061 
1062 static void cdns_i3c_master_upd_i3c_scl_lim(struct cdns_i3c_master *master)
1063 {
1064     struct i3c_master_controller *m = &master->base;
1065     unsigned long i3c_lim_period, pres_step, ncycles;
1066     struct i3c_bus *bus = i3c_master_get_bus(m);
1067     unsigned long new_i3c_scl_lim = 0;
1068     struct i3c_dev_desc *dev;
1069     u32 prescl1, ctrl;
1070 
1071     i3c_bus_for_each_i3cdev(bus, dev) {
1072         unsigned long max_fscl;
1073 
1074         max_fscl = max(I3C_CCC_MAX_SDR_FSCL(dev->info.max_read_ds),
1075                    I3C_CCC_MAX_SDR_FSCL(dev->info.max_write_ds));
1076         switch (max_fscl) {
1077         case I3C_SDR1_FSCL_8MHZ:
1078             max_fscl = 8000000;
1079             break;
1080         case I3C_SDR2_FSCL_6MHZ:
1081             max_fscl = 6000000;
1082             break;
1083         case I3C_SDR3_FSCL_4MHZ:
1084             max_fscl = 4000000;
1085             break;
1086         case I3C_SDR4_FSCL_2MHZ:
1087             max_fscl = 2000000;
1088             break;
1089         case I3C_SDR0_FSCL_MAX:
1090         default:
1091             max_fscl = 0;
1092             break;
1093         }
1094 
1095         if (max_fscl &&
1096             (new_i3c_scl_lim > max_fscl || !new_i3c_scl_lim))
1097             new_i3c_scl_lim = max_fscl;
1098     }
1099 
1100     /* Only update PRESCL_CTRL1 if the I3C SCL limitation has changed. */
1101     if (new_i3c_scl_lim == master->i3c_scl_lim)
1102         return;
1103     master->i3c_scl_lim = new_i3c_scl_lim;
1104     if (!new_i3c_scl_lim)
1105         return;
1106     pres_step = 1000000000UL / (bus->scl_rate.i3c * 4);
1107 
1108     /* Configure PP_LOW to meet I3C slave limitations. */
1109     prescl1 = readl(master->regs + PRESCL_CTRL1) &
1110           ~PRESCL_CTRL1_PP_LOW_MASK;
1111     ctrl = readl(master->regs + CTRL);
1112 
1113     i3c_lim_period = DIV_ROUND_UP(1000000000, master->i3c_scl_lim);
1114     ncycles = DIV_ROUND_UP(i3c_lim_period, pres_step);
1115     if (ncycles < 4)
1116         ncycles = 0;
1117     else
1118         ncycles -= 4;
1119 
1120     prescl1 |= PRESCL_CTRL1_PP_LOW(ncycles);
1121 
1122     /* Disable I3C master before updating PRESCL_CTRL1. */
1123     if (ctrl & CTRL_DEV_EN)
1124         cdns_i3c_master_disable(master);
1125 
1126     writel(prescl1, master->regs + PRESCL_CTRL1);
1127 
1128     if (ctrl & CTRL_DEV_EN)
1129         cdns_i3c_master_enable(master);
1130 }
1131 
1132 static int cdns_i3c_master_do_daa(struct i3c_master_controller *m)
1133 {
1134     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
1135     unsigned long olddevs, newdevs;
1136     int ret, slot;
1137     u8 addrs[MAX_DEVS] = { };
1138     u8 last_addr = 0;
1139 
1140     olddevs = readl(master->regs + DEVS_CTRL) & DEVS_CTRL_DEVS_ACTIVE_MASK;
1141     olddevs |= BIT(0);
1142 
1143     /* Prepare RR slots before launching DAA. */
1144     for_each_clear_bit(slot, &olddevs, master->maxdevs + 1) {
1145         ret = i3c_master_get_free_addr(m, last_addr + 1);
1146         if (ret < 0)
1147             return -ENOSPC;
1148 
1149         last_addr = ret;
1150         addrs[slot] = last_addr;
1151         writel(prepare_rr0_dev_address(last_addr) | DEV_ID_RR0_IS_I3C,
1152                master->regs + DEV_ID_RR0(slot));
1153         writel(0, master->regs + DEV_ID_RR1(slot));
1154         writel(0, master->regs + DEV_ID_RR2(slot));
1155     }
1156 
1157     ret = i3c_master_entdaa_locked(&master->base);
1158     if (ret && ret != I3C_ERROR_M2)
1159         return ret;
1160 
1161     newdevs = readl(master->regs + DEVS_CTRL) & DEVS_CTRL_DEVS_ACTIVE_MASK;
1162     newdevs &= ~olddevs;
1163 
1164     /*
1165      * Clear all retaining registers filled during DAA. We already
1166      * have the addressed assigned to them in the addrs array.
1167      */
1168     for_each_set_bit(slot, &newdevs, master->maxdevs + 1)
1169         i3c_master_add_i3c_dev_locked(m, addrs[slot]);
1170 
1171     /*
1172      * Clear slots that ended up not being used. Can be caused by I3C
1173      * device creation failure or when the I3C device was already known
1174      * by the system but with a different address (in this case the device
1175      * already has a slot and does not need a new one).
1176      */
1177     writel(readl(master->regs + DEVS_CTRL) |
1178            master->free_rr_slots << DEVS_CTRL_DEV_CLR_SHIFT,
1179            master->regs + DEVS_CTRL);
1180 
1181     i3c_master_defslvs_locked(&master->base);
1182 
1183     cdns_i3c_master_upd_i3c_scl_lim(master);
1184 
1185     /* Unmask Hot-Join and Mastership request interrupts. */
1186     i3c_master_enec_locked(m, I3C_BROADCAST_ADDR,
1187                    I3C_CCC_EVENT_HJ | I3C_CCC_EVENT_MR);
1188 
1189     return 0;
1190 }
1191 
1192 static u8 cdns_i3c_master_calculate_thd_delay(struct cdns_i3c_master *master)
1193 {
1194     unsigned long sysclk_rate = clk_get_rate(master->sysclk);
1195     u8 thd_delay = DIV_ROUND_UP(master->devdata->thd_delay_ns,
1196                     (NSEC_PER_SEC / sysclk_rate));
1197 
1198     /* Every value greater than 3 is not valid. */
1199     if (thd_delay > THD_DELAY_MAX)
1200         thd_delay = THD_DELAY_MAX;
1201 
1202     /* CTLR_THD_DEL value is encoded. */
1203     return (THD_DELAY_MAX - thd_delay);
1204 }
1205 
1206 static int cdns_i3c_master_bus_init(struct i3c_master_controller *m)
1207 {
1208     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
1209     unsigned long pres_step, sysclk_rate, max_i2cfreq;
1210     struct i3c_bus *bus = i3c_master_get_bus(m);
1211     u32 ctrl, prescl0, prescl1, pres, low;
1212     struct i3c_device_info info = { };
1213     int ret, ncycles;
1214 
1215     switch (bus->mode) {
1216     case I3C_BUS_MODE_PURE:
1217         ctrl = CTRL_PURE_BUS_MODE;
1218         break;
1219 
1220     case I3C_BUS_MODE_MIXED_FAST:
1221         ctrl = CTRL_MIXED_FAST_BUS_MODE;
1222         break;
1223 
1224     case I3C_BUS_MODE_MIXED_SLOW:
1225         ctrl = CTRL_MIXED_SLOW_BUS_MODE;
1226         break;
1227 
1228     default:
1229         return -EINVAL;
1230     }
1231 
1232     sysclk_rate = clk_get_rate(master->sysclk);
1233     if (!sysclk_rate)
1234         return -EINVAL;
1235 
1236     pres = DIV_ROUND_UP(sysclk_rate, (bus->scl_rate.i3c * 4)) - 1;
1237     if (pres > PRESCL_CTRL0_MAX)
1238         return -ERANGE;
1239 
1240     bus->scl_rate.i3c = sysclk_rate / ((pres + 1) * 4);
1241 
1242     prescl0 = PRESCL_CTRL0_I3C(pres);
1243 
1244     low = ((I3C_BUS_TLOW_OD_MIN_NS * sysclk_rate) / (pres + 1)) - 2;
1245     prescl1 = PRESCL_CTRL1_OD_LOW(low);
1246 
1247     max_i2cfreq = bus->scl_rate.i2c;
1248 
1249     pres = (sysclk_rate / (max_i2cfreq * 5)) - 1;
1250     if (pres > PRESCL_CTRL0_MAX)
1251         return -ERANGE;
1252 
1253     bus->scl_rate.i2c = sysclk_rate / ((pres + 1) * 5);
1254 
1255     prescl0 |= PRESCL_CTRL0_I2C(pres);
1256     writel(prescl0, master->regs + PRESCL_CTRL0);
1257 
1258     /* Calculate OD and PP low. */
1259     pres_step = 1000000000 / (bus->scl_rate.i3c * 4);
1260     ncycles = DIV_ROUND_UP(I3C_BUS_TLOW_OD_MIN_NS, pres_step) - 2;
1261     if (ncycles < 0)
1262         ncycles = 0;
1263     prescl1 = PRESCL_CTRL1_OD_LOW(ncycles);
1264     writel(prescl1, master->regs + PRESCL_CTRL1);
1265 
1266     /* Get an address for the master. */
1267     ret = i3c_master_get_free_addr(m, 0);
1268     if (ret < 0)
1269         return ret;
1270 
1271     writel(prepare_rr0_dev_address(ret) | DEV_ID_RR0_IS_I3C,
1272            master->regs + DEV_ID_RR0(0));
1273 
1274     cdns_i3c_master_dev_rr_to_info(master, 0, &info);
1275     if (info.bcr & I3C_BCR_HDR_CAP)
1276         info.hdr_cap = I3C_CCC_HDR_MODE(I3C_HDR_DDR);
1277 
1278     ret = i3c_master_set_info(&master->base, &info);
1279     if (ret)
1280         return ret;
1281 
1282     /*
1283      * Enable Hot-Join, and, when a Hot-Join request happens, disable all
1284      * events coming from this device.
1285      *
1286      * We will issue ENTDAA afterwards from the threaded IRQ handler.
1287      */
1288     ctrl |= CTRL_HJ_ACK | CTRL_HJ_DISEC | CTRL_HALT_EN | CTRL_MCS_EN;
1289 
1290     /*
1291      * Configure data hold delay based on device-specific data.
1292      *
1293      * MIPI I3C Specification 1.0 defines non-zero minimal tHD_PP timing on
1294      * master output. This setting allows to meet this timing on master's
1295      * SoC outputs, regardless of PCB balancing.
1296      */
1297     ctrl |= CTRL_THD_DELAY(cdns_i3c_master_calculate_thd_delay(master));
1298     writel(ctrl, master->regs + CTRL);
1299 
1300     cdns_i3c_master_enable(master);
1301 
1302     return 0;
1303 }
1304 
1305 static void cdns_i3c_master_handle_ibi(struct cdns_i3c_master *master,
1306                        u32 ibir)
1307 {
1308     struct cdns_i3c_i2c_dev_data *data;
1309     bool data_consumed = false;
1310     struct i3c_ibi_slot *slot;
1311     u32 id = IBIR_SLVID(ibir);
1312     struct i3c_dev_desc *dev;
1313     size_t nbytes;
1314     u8 *buf;
1315 
1316     /*
1317      * FIXME: maybe we should report the FIFO OVF errors to the upper
1318      * layer.
1319      */
1320     if (id >= master->ibi.num_slots || (ibir & IBIR_ERROR))
1321         goto out;
1322 
1323     dev = master->ibi.slots[id];
1324     spin_lock(&master->ibi.lock);
1325 
1326     data = i3c_dev_get_master_data(dev);
1327     slot = i3c_generic_ibi_get_free_slot(data->ibi_pool);
1328     if (!slot)
1329         goto out_unlock;
1330 
1331     buf = slot->data;
1332 
1333     nbytes = IBIR_XFER_BYTES(ibir);
1334     readsl(master->regs + IBI_DATA_FIFO, buf, nbytes / 4);
1335     if (nbytes % 3) {
1336         u32 tmp = __raw_readl(master->regs + IBI_DATA_FIFO);
1337 
1338         memcpy(buf + (nbytes & ~3), &tmp, nbytes & 3);
1339     }
1340 
1341     slot->len = min_t(unsigned int, IBIR_XFER_BYTES(ibir),
1342               dev->ibi->max_payload_len);
1343     i3c_master_queue_ibi(dev, slot);
1344     data_consumed = true;
1345 
1346 out_unlock:
1347     spin_unlock(&master->ibi.lock);
1348 
1349 out:
1350     /* Consume data from the FIFO if it's not been done already. */
1351     if (!data_consumed) {
1352         int i;
1353 
1354         for (i = 0; i < IBIR_XFER_BYTES(ibir); i += 4)
1355             readl(master->regs + IBI_DATA_FIFO);
1356     }
1357 }
1358 
1359 static void cnds_i3c_master_demux_ibis(struct cdns_i3c_master *master)
1360 {
1361     u32 status0;
1362 
1363     writel(MST_INT_IBIR_THR, master->regs + MST_ICR);
1364 
1365     for (status0 = readl(master->regs + MST_STATUS0);
1366          !(status0 & MST_STATUS0_IBIR_EMP);
1367          status0 = readl(master->regs + MST_STATUS0)) {
1368         u32 ibir = readl(master->regs + IBIR);
1369 
1370         switch (IBIR_TYPE(ibir)) {
1371         case IBIR_TYPE_IBI:
1372             cdns_i3c_master_handle_ibi(master, ibir);
1373             break;
1374 
1375         case IBIR_TYPE_HJ:
1376             WARN_ON(IBIR_XFER_BYTES(ibir) || (ibir & IBIR_ERROR));
1377             queue_work(master->base.wq, &master->hj_work);
1378             break;
1379 
1380         case IBIR_TYPE_MR:
1381             WARN_ON(IBIR_XFER_BYTES(ibir) || (ibir & IBIR_ERROR));
1382             break;
1383 
1384         default:
1385             break;
1386         }
1387     }
1388 }
1389 
1390 static irqreturn_t cdns_i3c_master_interrupt(int irq, void *data)
1391 {
1392     struct cdns_i3c_master *master = data;
1393     u32 status;
1394 
1395     status = readl(master->regs + MST_ISR);
1396     if (!(status & readl(master->regs + MST_IMR)))
1397         return IRQ_NONE;
1398 
1399     spin_lock(&master->xferqueue.lock);
1400     cdns_i3c_master_end_xfer_locked(master, status);
1401     spin_unlock(&master->xferqueue.lock);
1402 
1403     if (status & MST_INT_IBIR_THR)
1404         cnds_i3c_master_demux_ibis(master);
1405 
1406     return IRQ_HANDLED;
1407 }
1408 
1409 static int cdns_i3c_master_disable_ibi(struct i3c_dev_desc *dev)
1410 {
1411     struct i3c_master_controller *m = i3c_dev_get_master(dev);
1412     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
1413     struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
1414     unsigned long flags;
1415     u32 sirmap;
1416     int ret;
1417 
1418     ret = i3c_master_disec_locked(m, dev->info.dyn_addr,
1419                       I3C_CCC_EVENT_SIR);
1420     if (ret)
1421         return ret;
1422 
1423     spin_lock_irqsave(&master->ibi.lock, flags);
1424     sirmap = readl(master->regs + SIR_MAP_DEV_REG(data->ibi));
1425     sirmap &= ~SIR_MAP_DEV_CONF_MASK(data->ibi);
1426     sirmap |= SIR_MAP_DEV_CONF(data->ibi,
1427                    SIR_MAP_DEV_DA(I3C_BROADCAST_ADDR));
1428     writel(sirmap, master->regs + SIR_MAP_DEV_REG(data->ibi));
1429     spin_unlock_irqrestore(&master->ibi.lock, flags);
1430 
1431     return ret;
1432 }
1433 
1434 static int cdns_i3c_master_enable_ibi(struct i3c_dev_desc *dev)
1435 {
1436     struct i3c_master_controller *m = i3c_dev_get_master(dev);
1437     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
1438     struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
1439     unsigned long flags;
1440     u32 sircfg, sirmap;
1441     int ret;
1442 
1443     spin_lock_irqsave(&master->ibi.lock, flags);
1444     sirmap = readl(master->regs + SIR_MAP_DEV_REG(data->ibi));
1445     sirmap &= ~SIR_MAP_DEV_CONF_MASK(data->ibi);
1446     sircfg = SIR_MAP_DEV_ROLE(dev->info.bcr >> 6) |
1447          SIR_MAP_DEV_DA(dev->info.dyn_addr) |
1448          SIR_MAP_DEV_PL(dev->info.max_ibi_len) |
1449          SIR_MAP_DEV_ACK;
1450 
1451     if (dev->info.bcr & I3C_BCR_MAX_DATA_SPEED_LIM)
1452         sircfg |= SIR_MAP_DEV_SLOW;
1453 
1454     sirmap |= SIR_MAP_DEV_CONF(data->ibi, sircfg);
1455     writel(sirmap, master->regs + SIR_MAP_DEV_REG(data->ibi));
1456     spin_unlock_irqrestore(&master->ibi.lock, flags);
1457 
1458     ret = i3c_master_enec_locked(m, dev->info.dyn_addr,
1459                      I3C_CCC_EVENT_SIR);
1460     if (ret) {
1461         spin_lock_irqsave(&master->ibi.lock, flags);
1462         sirmap = readl(master->regs + SIR_MAP_DEV_REG(data->ibi));
1463         sirmap &= ~SIR_MAP_DEV_CONF_MASK(data->ibi);
1464         sirmap |= SIR_MAP_DEV_CONF(data->ibi,
1465                        SIR_MAP_DEV_DA(I3C_BROADCAST_ADDR));
1466         writel(sirmap, master->regs + SIR_MAP_DEV_REG(data->ibi));
1467         spin_unlock_irqrestore(&master->ibi.lock, flags);
1468     }
1469 
1470     return ret;
1471 }
1472 
1473 static int cdns_i3c_master_request_ibi(struct i3c_dev_desc *dev,
1474                        const struct i3c_ibi_setup *req)
1475 {
1476     struct i3c_master_controller *m = i3c_dev_get_master(dev);
1477     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
1478     struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
1479     unsigned long flags;
1480     unsigned int i;
1481 
1482     data->ibi_pool = i3c_generic_ibi_alloc_pool(dev, req);
1483     if (IS_ERR(data->ibi_pool))
1484         return PTR_ERR(data->ibi_pool);
1485 
1486     spin_lock_irqsave(&master->ibi.lock, flags);
1487     for (i = 0; i < master->ibi.num_slots; i++) {
1488         if (!master->ibi.slots[i]) {
1489             data->ibi = i;
1490             master->ibi.slots[i] = dev;
1491             break;
1492         }
1493     }
1494     spin_unlock_irqrestore(&master->ibi.lock, flags);
1495 
1496     if (i < master->ibi.num_slots)
1497         return 0;
1498 
1499     i3c_generic_ibi_free_pool(data->ibi_pool);
1500     data->ibi_pool = NULL;
1501 
1502     return -ENOSPC;
1503 }
1504 
1505 static void cdns_i3c_master_free_ibi(struct i3c_dev_desc *dev)
1506 {
1507     struct i3c_master_controller *m = i3c_dev_get_master(dev);
1508     struct cdns_i3c_master *master = to_cdns_i3c_master(m);
1509     struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
1510     unsigned long flags;
1511 
1512     spin_lock_irqsave(&master->ibi.lock, flags);
1513     master->ibi.slots[data->ibi] = NULL;
1514     data->ibi = -1;
1515     spin_unlock_irqrestore(&master->ibi.lock, flags);
1516 
1517     i3c_generic_ibi_free_pool(data->ibi_pool);
1518 }
1519 
1520 static void cdns_i3c_master_recycle_ibi_slot(struct i3c_dev_desc *dev,
1521                          struct i3c_ibi_slot *slot)
1522 {
1523     struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
1524 
1525     i3c_generic_ibi_recycle_slot(data->ibi_pool, slot);
1526 }
1527 
1528 static const struct i3c_master_controller_ops cdns_i3c_master_ops = {
1529     .bus_init = cdns_i3c_master_bus_init,
1530     .bus_cleanup = cdns_i3c_master_bus_cleanup,
1531     .do_daa = cdns_i3c_master_do_daa,
1532     .attach_i3c_dev = cdns_i3c_master_attach_i3c_dev,
1533     .reattach_i3c_dev = cdns_i3c_master_reattach_i3c_dev,
1534     .detach_i3c_dev = cdns_i3c_master_detach_i3c_dev,
1535     .attach_i2c_dev = cdns_i3c_master_attach_i2c_dev,
1536     .detach_i2c_dev = cdns_i3c_master_detach_i2c_dev,
1537     .supports_ccc_cmd = cdns_i3c_master_supports_ccc_cmd,
1538     .send_ccc_cmd = cdns_i3c_master_send_ccc_cmd,
1539     .priv_xfers = cdns_i3c_master_priv_xfers,
1540     .i2c_xfers = cdns_i3c_master_i2c_xfers,
1541     .enable_ibi = cdns_i3c_master_enable_ibi,
1542     .disable_ibi = cdns_i3c_master_disable_ibi,
1543     .request_ibi = cdns_i3c_master_request_ibi,
1544     .free_ibi = cdns_i3c_master_free_ibi,
1545     .recycle_ibi_slot = cdns_i3c_master_recycle_ibi_slot,
1546 };
1547 
1548 static void cdns_i3c_master_hj(struct work_struct *work)
1549 {
1550     struct cdns_i3c_master *master = container_of(work,
1551                               struct cdns_i3c_master,
1552                               hj_work);
1553 
1554     i3c_master_do_daa(&master->base);
1555 }
1556 
1557 static struct cdns_i3c_data cdns_i3c_devdata = {
1558     .thd_delay_ns = 10,
1559 };
1560 
1561 static const struct of_device_id cdns_i3c_master_of_ids[] = {
1562     { .compatible = "cdns,i3c-master", .data = &cdns_i3c_devdata },
1563     { /* sentinel */ },
1564 };
1565 
1566 static int cdns_i3c_master_probe(struct platform_device *pdev)
1567 {
1568     struct cdns_i3c_master *master;
1569     int ret, irq;
1570     u32 val;
1571 
1572     master = devm_kzalloc(&pdev->dev, sizeof(*master), GFP_KERNEL);
1573     if (!master)
1574         return -ENOMEM;
1575 
1576     master->devdata = of_device_get_match_data(&pdev->dev);
1577     if (!master->devdata)
1578         return -EINVAL;
1579 
1580     master->regs = devm_platform_ioremap_resource(pdev, 0);
1581     if (IS_ERR(master->regs))
1582         return PTR_ERR(master->regs);
1583 
1584     master->pclk = devm_clk_get(&pdev->dev, "pclk");
1585     if (IS_ERR(master->pclk))
1586         return PTR_ERR(master->pclk);
1587 
1588     master->sysclk = devm_clk_get(&pdev->dev, "sysclk");
1589     if (IS_ERR(master->sysclk))
1590         return PTR_ERR(master->sysclk);
1591 
1592     irq = platform_get_irq(pdev, 0);
1593     if (irq < 0)
1594         return irq;
1595 
1596     ret = clk_prepare_enable(master->pclk);
1597     if (ret)
1598         return ret;
1599 
1600     ret = clk_prepare_enable(master->sysclk);
1601     if (ret)
1602         goto err_disable_pclk;
1603 
1604     if (readl(master->regs + DEV_ID) != DEV_ID_I3C_MASTER) {
1605         ret = -EINVAL;
1606         goto err_disable_sysclk;
1607     }
1608 
1609     spin_lock_init(&master->xferqueue.lock);
1610     INIT_LIST_HEAD(&master->xferqueue.list);
1611 
1612     INIT_WORK(&master->hj_work, cdns_i3c_master_hj);
1613     writel(0xffffffff, master->regs + MST_IDR);
1614     writel(0xffffffff, master->regs + SLV_IDR);
1615     ret = devm_request_irq(&pdev->dev, irq, cdns_i3c_master_interrupt, 0,
1616                    dev_name(&pdev->dev), master);
1617     if (ret)
1618         goto err_disable_sysclk;
1619 
1620     platform_set_drvdata(pdev, master);
1621 
1622     val = readl(master->regs + CONF_STATUS0);
1623 
1624     /* Device ID0 is reserved to describe this master. */
1625     master->maxdevs = CONF_STATUS0_DEVS_NUM(val);
1626     master->free_rr_slots = GENMASK(master->maxdevs, 1);
1627 
1628     val = readl(master->regs + CONF_STATUS1);
1629     master->caps.cmdfifodepth = CONF_STATUS1_CMD_DEPTH(val);
1630     master->caps.rxfifodepth = CONF_STATUS1_RX_DEPTH(val);
1631     master->caps.txfifodepth = CONF_STATUS1_TX_DEPTH(val);
1632     master->caps.ibirfifodepth = CONF_STATUS0_IBIR_DEPTH(val);
1633     master->caps.cmdrfifodepth = CONF_STATUS0_CMDR_DEPTH(val);
1634 
1635     spin_lock_init(&master->ibi.lock);
1636     master->ibi.num_slots = CONF_STATUS1_IBI_HW_RES(val);
1637     master->ibi.slots = devm_kcalloc(&pdev->dev, master->ibi.num_slots,
1638                      sizeof(*master->ibi.slots),
1639                      GFP_KERNEL);
1640     if (!master->ibi.slots) {
1641         ret = -ENOMEM;
1642         goto err_disable_sysclk;
1643     }
1644 
1645     writel(IBIR_THR(1), master->regs + CMD_IBI_THR_CTRL);
1646     writel(MST_INT_IBIR_THR, master->regs + MST_IER);
1647     writel(DEVS_CTRL_DEV_CLR_ALL, master->regs + DEVS_CTRL);
1648 
1649     ret = i3c_master_register(&master->base, &pdev->dev,
1650                   &cdns_i3c_master_ops, false);
1651     if (ret)
1652         goto err_disable_sysclk;
1653 
1654     return 0;
1655 
1656 err_disable_sysclk:
1657     clk_disable_unprepare(master->sysclk);
1658 
1659 err_disable_pclk:
1660     clk_disable_unprepare(master->pclk);
1661 
1662     return ret;
1663 }
1664 
1665 static int cdns_i3c_master_remove(struct platform_device *pdev)
1666 {
1667     struct cdns_i3c_master *master = platform_get_drvdata(pdev);
1668     int ret;
1669 
1670     ret = i3c_master_unregister(&master->base);
1671     if (ret)
1672         return ret;
1673 
1674     clk_disable_unprepare(master->sysclk);
1675     clk_disable_unprepare(master->pclk);
1676 
1677     return 0;
1678 }
1679 
1680 static struct platform_driver cdns_i3c_master = {
1681     .probe = cdns_i3c_master_probe,
1682     .remove = cdns_i3c_master_remove,
1683     .driver = {
1684         .name = "cdns-i3c-master",
1685         .of_match_table = cdns_i3c_master_of_ids,
1686     },
1687 };
1688 module_platform_driver(cdns_i3c_master);
1689 
1690 MODULE_AUTHOR("Boris Brezillon <boris.brezillon@bootlin.com>");
1691 MODULE_DESCRIPTION("Cadence I3C master driver");
1692 MODULE_LICENSE("GPL v2");
1693 MODULE_ALIAS("platform:cdns-i3c-master");