1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2018 Cadence Design Systems Inc. 4 * 5 * Author: Boris Brezillon <boris.brezillon@bootlin.com> 6 */ 7 8#include <linux/bitops.h> 9#include <linux/clk.h> 10#include <linux/err.h> 11#include <linux/errno.h> 12#include <linux/i3c/master.h> 13#include <linux/interrupt.h> 14#include <linux/io.h> 15#include <linux/iopoll.h> 16#include <linux/ioport.h> 17#include <linux/kernel.h> 18#include <linux/list.h> 19#include <linux/module.h> 20#include <linux/of.h> 21#include <linux/platform_device.h> 22#include <linux/slab.h> 23#include <linux/spinlock.h> 24#include <linux/workqueue.h> 25#include <linux/of_device.h> 26 27#define DEV_ID 0x0 28#define DEV_ID_I3C_MASTER 0x5034 29 30#define CONF_STATUS0 0x4 31#define CONF_STATUS0_CMDR_DEPTH(x) (4 << (((x) & GENMASK(31, 29)) >> 29)) 32#define CONF_STATUS0_ECC_CHK BIT(28) 33#define CONF_STATUS0_INTEG_CHK BIT(27) 34#define CONF_STATUS0_CSR_DAP_CHK BIT(26) 35#define CONF_STATUS0_TRANS_TOUT_CHK BIT(25) 36#define CONF_STATUS0_PROT_FAULTS_CHK BIT(24) 37#define CONF_STATUS0_GPO_NUM(x) (((x) & GENMASK(23, 16)) >> 16) 38#define CONF_STATUS0_GPI_NUM(x) (((x) & GENMASK(15, 8)) >> 8) 39#define CONF_STATUS0_IBIR_DEPTH(x) (4 << (((x) & GENMASK(7, 6)) >> 7)) 40#define CONF_STATUS0_SUPPORTS_DDR BIT(5) 41#define CONF_STATUS0_SEC_MASTER BIT(4) 42#define CONF_STATUS0_DEVS_NUM(x) ((x) & GENMASK(3, 0)) 43 44#define CONF_STATUS1 0x8 45#define CONF_STATUS1_IBI_HW_RES(x) ((((x) & GENMASK(31, 28)) >> 28) + 1) 46#define CONF_STATUS1_CMD_DEPTH(x) (4 << (((x) & GENMASK(27, 26)) >> 26)) 47#define CONF_STATUS1_SLVDDR_RX_DEPTH(x) (8 << (((x) & GENMASK(25, 21)) >> 21)) 48#define CONF_STATUS1_SLVDDR_TX_DEPTH(x) (8 << (((x) & GENMASK(20, 16)) >> 16)) 49#define CONF_STATUS1_IBI_DEPTH(x) (2 << (((x) & GENMASK(12, 10)) >> 10)) 50#define CONF_STATUS1_RX_DEPTH(x) (8 << (((x) & GENMASK(9, 5)) >> 5)) 51#define CONF_STATUS1_TX_DEPTH(x) (8 << ((x) & GENMASK(4, 0))) 52 53#define REV_ID 0xc 54#define REV_ID_VID(id) (((id) & GENMASK(31, 20)) >> 20) 55#define REV_ID_PID(id) (((id) & GENMASK(19, 8)) >> 8) 56#define REV_ID_REV_MAJOR(id) (((id) & GENMASK(7, 4)) >> 4) 57#define REV_ID_REV_MINOR(id) ((id) & GENMASK(3, 0)) 58 59#define CTRL 0x10 60#define CTRL_DEV_EN BIT(31) 61#define CTRL_HALT_EN BIT(30) 62#define CTRL_MCS BIT(29) 63#define CTRL_MCS_EN BIT(28) 64#define CTRL_THD_DELAY(x) (((x) << 24) & GENMASK(25, 24)) 65#define CTRL_HJ_DISEC BIT(8) 66#define CTRL_MST_ACK BIT(7) 67#define CTRL_HJ_ACK BIT(6) 68#define CTRL_HJ_INIT BIT(5) 69#define CTRL_MST_INIT BIT(4) 70#define CTRL_AHDR_OPT BIT(3) 71#define CTRL_PURE_BUS_MODE 0 72#define CTRL_MIXED_FAST_BUS_MODE 2 73#define CTRL_MIXED_SLOW_BUS_MODE 3 74#define CTRL_BUS_MODE_MASK GENMASK(1, 0) 75#define THD_DELAY_MAX 3 76 77#define PRESCL_CTRL0 0x14 78#define PRESCL_CTRL0_I2C(x) ((x) << 16) 79#define PRESCL_CTRL0_I3C(x) (x) 80#define PRESCL_CTRL0_I3C_MAX GENMASK(9, 0) 81#define PRESCL_CTRL0_I2C_MAX GENMASK(15, 0) 82 83#define PRESCL_CTRL1 0x18 84#define PRESCL_CTRL1_PP_LOW_MASK GENMASK(15, 8) 85#define PRESCL_CTRL1_PP_LOW(x) ((x) << 8) 86#define PRESCL_CTRL1_OD_LOW_MASK GENMASK(7, 0) 87#define PRESCL_CTRL1_OD_LOW(x) (x) 88 89#define MST_IER 0x20 90#define MST_IDR 0x24 91#define MST_IMR 0x28 92#define MST_ICR 0x2c 93#define MST_ISR 0x30 94#define MST_INT_HALTED BIT(18) 95#define MST_INT_MR_DONE BIT(17) 96#define MST_INT_IMM_COMP BIT(16) 97#define MST_INT_TX_THR BIT(15) 98#define MST_INT_TX_OVF BIT(14) 99#define MST_INT_IBID_THR BIT(12) 100#define MST_INT_IBID_UNF BIT(11) 101#define MST_INT_IBIR_THR BIT(10) 102#define MST_INT_IBIR_UNF BIT(9) 103#define MST_INT_IBIR_OVF BIT(8) 104#define MST_INT_RX_THR BIT(7) 105#define MST_INT_RX_UNF BIT(6) 106#define MST_INT_CMDD_EMP BIT(5) 107#define MST_INT_CMDD_THR BIT(4) 108#define MST_INT_CMDD_OVF BIT(3) 109#define MST_INT_CMDR_THR BIT(2) 110#define MST_INT_CMDR_UNF BIT(1) 111#define MST_INT_CMDR_OVF BIT(0) 112 113#define MST_STATUS0 0x34 114#define MST_STATUS0_IDLE BIT(18) 115#define MST_STATUS0_HALTED BIT(17) 116#define MST_STATUS0_MASTER_MODE BIT(16) 117#define MST_STATUS0_TX_FULL BIT(13) 118#define MST_STATUS0_IBID_FULL BIT(12) 119#define MST_STATUS0_IBIR_FULL BIT(11) 120#define MST_STATUS0_RX_FULL BIT(10) 121#define MST_STATUS0_CMDD_FULL BIT(9) 122#define MST_STATUS0_CMDR_FULL BIT(8) 123#define MST_STATUS0_TX_EMP BIT(5) 124#define MST_STATUS0_IBID_EMP BIT(4) 125#define MST_STATUS0_IBIR_EMP BIT(3) 126#define MST_STATUS0_RX_EMP BIT(2) 127#define MST_STATUS0_CMDD_EMP BIT(1) 128#define MST_STATUS0_CMDR_EMP BIT(0) 129 130#define CMDR 0x38 131#define CMDR_NO_ERROR 0 132#define CMDR_DDR_PREAMBLE_ERROR 1 133#define CMDR_DDR_PARITY_ERROR 2 134#define CMDR_DDR_RX_FIFO_OVF 3 135#define CMDR_DDR_TX_FIFO_UNF 4 136#define CMDR_M0_ERROR 5 137#define CMDR_M1_ERROR 6 138#define CMDR_M2_ERROR 7 139#define CMDR_MST_ABORT 8 140#define CMDR_NACK_RESP 9 141#define CMDR_INVALID_DA 10 142#define CMDR_DDR_DROPPED 11 143#define CMDR_ERROR(x) (((x) & GENMASK(27, 24)) >> 24) 144#define CMDR_XFER_BYTES(x) (((x) & GENMASK(19, 8)) >> 8) 145#define CMDR_CMDID_HJACK_DISEC 0xfe 146#define CMDR_CMDID_HJACK_ENTDAA 0xff 147#define CMDR_CMDID(x) ((x) & GENMASK(7, 0)) 148 149#define IBIR 0x3c 150#define IBIR_ACKED BIT(12) 151#define IBIR_SLVID(x) (((x) & GENMASK(11, 8)) >> 8) 152#define IBIR_ERROR BIT(7) 153#define IBIR_XFER_BYTES(x) (((x) & GENMASK(6, 2)) >> 2) 154#define IBIR_TYPE_IBI 0 155#define IBIR_TYPE_HJ 1 156#define IBIR_TYPE_MR 2 157#define IBIR_TYPE(x) ((x) & GENMASK(1, 0)) 158 159#define SLV_IER 0x40 160#define SLV_IDR 0x44 161#define SLV_IMR 0x48 162#define SLV_ICR 0x4c 163#define SLV_ISR 0x50 164#define SLV_INT_TM BIT(20) 165#define SLV_INT_ERROR BIT(19) 166#define SLV_INT_EVENT_UP BIT(18) 167#define SLV_INT_HJ_DONE BIT(17) 168#define SLV_INT_MR_DONE BIT(16) 169#define SLV_INT_DA_UPD BIT(15) 170#define SLV_INT_SDR_FAIL BIT(14) 171#define SLV_INT_DDR_FAIL BIT(13) 172#define SLV_INT_M_RD_ABORT BIT(12) 173#define SLV_INT_DDR_RX_THR BIT(11) 174#define SLV_INT_DDR_TX_THR BIT(10) 175#define SLV_INT_SDR_RX_THR BIT(9) 176#define SLV_INT_SDR_TX_THR BIT(8) 177#define SLV_INT_DDR_RX_UNF BIT(7) 178#define SLV_INT_DDR_TX_OVF BIT(6) 179#define SLV_INT_SDR_RX_UNF BIT(5) 180#define SLV_INT_SDR_TX_OVF BIT(4) 181#define SLV_INT_DDR_RD_COMP BIT(3) 182#define SLV_INT_DDR_WR_COMP BIT(2) 183#define SLV_INT_SDR_RD_COMP BIT(1) 184#define SLV_INT_SDR_WR_COMP BIT(0) 185 186#define SLV_STATUS0 0x54 187#define SLV_STATUS0_REG_ADDR(s) (((s) & GENMASK(23, 16)) >> 16) 188#define SLV_STATUS0_XFRD_BYTES(s) ((s) & GENMASK(15, 0)) 189 190#define SLV_STATUS1 0x58 191#define SLV_STATUS1_AS(s) (((s) & GENMASK(21, 20)) >> 20) 192#define SLV_STATUS1_VEN_TM BIT(19) 193#define SLV_STATUS1_HJ_DIS BIT(18) 194#define SLV_STATUS1_MR_DIS BIT(17) 195#define SLV_STATUS1_PROT_ERR BIT(16) 196#define SLV_STATUS1_DA(s) (((s) & GENMASK(15, 9)) >> 9) 197#define SLV_STATUS1_HAS_DA BIT(8) 198#define SLV_STATUS1_DDR_RX_FULL BIT(7) 199#define SLV_STATUS1_DDR_TX_FULL BIT(6) 200#define SLV_STATUS1_DDR_RX_EMPTY BIT(5) 201#define SLV_STATUS1_DDR_TX_EMPTY BIT(4) 202#define SLV_STATUS1_SDR_RX_FULL BIT(3) 203#define SLV_STATUS1_SDR_TX_FULL BIT(2) 204#define SLV_STATUS1_SDR_RX_EMPTY BIT(1) 205#define SLV_STATUS1_SDR_TX_EMPTY BIT(0) 206 207#define CMD0_FIFO 0x60 208#define CMD0_FIFO_IS_DDR BIT(31) 209#define CMD0_FIFO_IS_CCC BIT(30) 210#define CMD0_FIFO_BCH BIT(29) 211#define XMIT_BURST_STATIC_SUBADDR 0 212#define XMIT_SINGLE_INC_SUBADDR 1 213#define XMIT_SINGLE_STATIC_SUBADDR 2 214#define XMIT_BURST_WITHOUT_SUBADDR 3 215#define CMD0_FIFO_PRIV_XMIT_MODE(m) ((m) << 27) 216#define CMD0_FIFO_SBCA BIT(26) 217#define CMD0_FIFO_RSBC BIT(25) 218#define CMD0_FIFO_IS_10B BIT(24) 219#define CMD0_FIFO_PL_LEN(l) ((l) << 12) 220#define CMD0_FIFO_PL_LEN_MAX 4095 221#define CMD0_FIFO_DEV_ADDR(a) ((a) << 1) 222#define CMD0_FIFO_RNW BIT(0) 223 224#define CMD1_FIFO 0x64 225#define CMD1_FIFO_CMDID(id) ((id) << 24) 226#define CMD1_FIFO_CSRADDR(a) (a) 227#define CMD1_FIFO_CCC(id) (id) 228 229#define TX_FIFO 0x68 230 231#define IMD_CMD0 0x70 232#define IMD_CMD0_PL_LEN(l) ((l) << 12) 233#define IMD_CMD0_DEV_ADDR(a) ((a) << 1) 234#define IMD_CMD0_RNW BIT(0) 235 236#define IMD_CMD1 0x74 237#define IMD_CMD1_CCC(id) (id) 238 239#define IMD_DATA 0x78 240#define RX_FIFO 0x80 241#define IBI_DATA_FIFO 0x84 242#define SLV_DDR_TX_FIFO 0x88 243#define SLV_DDR_RX_FIFO 0x8c 244 245#define CMD_IBI_THR_CTRL 0x90 246#define IBIR_THR(t) ((t) << 24) 247#define CMDR_THR(t) ((t) << 16) 248#define IBI_THR(t) ((t) << 8) 249#define CMD_THR(t) (t) 250 251#define TX_RX_THR_CTRL 0x94 252#define RX_THR(t) ((t) << 16) 253#define TX_THR(t) (t) 254 255#define SLV_DDR_TX_RX_THR_CTRL 0x98 256#define SLV_DDR_RX_THR(t) ((t) << 16) 257#define SLV_DDR_TX_THR(t) (t) 258 259#define FLUSH_CTRL 0x9c 260#define FLUSH_IBI_RESP BIT(23) 261#define FLUSH_CMD_RESP BIT(22) 262#define FLUSH_SLV_DDR_RX_FIFO BIT(22) 263#define FLUSH_SLV_DDR_TX_FIFO BIT(21) 264#define FLUSH_IMM_FIFO BIT(20) 265#define FLUSH_IBI_FIFO BIT(19) 266#define FLUSH_RX_FIFO BIT(18) 267#define FLUSH_TX_FIFO BIT(17) 268#define FLUSH_CMD_FIFO BIT(16) 269 270#define TTO_PRESCL_CTRL0 0xb0 271#define TTO_PRESCL_CTRL0_DIVB(x) ((x) << 16) 272#define TTO_PRESCL_CTRL0_DIVA(x) (x) 273 274#define TTO_PRESCL_CTRL1 0xb4 275#define TTO_PRESCL_CTRL1_DIVB(x) ((x) << 16) 276#define TTO_PRESCL_CTRL1_DIVA(x) (x) 277 278#define DEVS_CTRL 0xb8 279#define DEVS_CTRL_DEV_CLR_SHIFT 16 280#define DEVS_CTRL_DEV_CLR_ALL GENMASK(31, 16) 281#define DEVS_CTRL_DEV_CLR(dev) BIT(16 + (dev)) 282#define DEVS_CTRL_DEV_ACTIVE(dev) BIT(dev) 283#define DEVS_CTRL_DEVS_ACTIVE_MASK GENMASK(15, 0) 284#define MAX_DEVS 16 285 286#define DEV_ID_RR0(d) (0xc0 + ((d) * 0x10)) 287#define DEV_ID_RR0_LVR_EXT_ADDR BIT(11) 288#define DEV_ID_RR0_HDR_CAP BIT(10) 289#define DEV_ID_RR0_IS_I3C BIT(9) 290#define DEV_ID_RR0_DEV_ADDR_MASK (GENMASK(6, 0) | GENMASK(15, 13)) 291#define DEV_ID_RR0_SET_DEV_ADDR(a) (((a) & GENMASK(6, 0)) | \ 292 (((a) & GENMASK(9, 7)) << 6)) 293#define DEV_ID_RR0_GET_DEV_ADDR(x) ((((x) >> 1) & GENMASK(6, 0)) | \ 294 (((x) >> 6) & GENMASK(9, 7))) 295 296#define DEV_ID_RR1(d) (0xc4 + ((d) * 0x10)) 297#define DEV_ID_RR1_PID_MSB(pid) (pid) 298 299#define DEV_ID_RR2(d) (0xc8 + ((d) * 0x10)) 300#define DEV_ID_RR2_PID_LSB(pid) ((pid) << 16) 301#define DEV_ID_RR2_BCR(bcr) ((bcr) << 8) 302#define DEV_ID_RR2_DCR(dcr) (dcr) 303#define DEV_ID_RR2_LVR(lvr) (lvr) 304 305#define SIR_MAP(x) (0x180 + ((x) * 4)) 306#define SIR_MAP_DEV_REG(d) SIR_MAP((d) / 2) 307#define SIR_MAP_DEV_SHIFT(d, fs) ((fs) + (((d) % 2) ? 16 : 0)) 308#define SIR_MAP_DEV_CONF_MASK(d) (GENMASK(15, 0) << (((d) % 2) ? 16 : 0)) 309#define SIR_MAP_DEV_CONF(d, c) ((c) << (((d) % 2) ? 16 : 0)) 310#define DEV_ROLE_SLAVE 0 311#define DEV_ROLE_MASTER 1 312#define SIR_MAP_DEV_ROLE(role) ((role) << 14) 313#define SIR_MAP_DEV_SLOW BIT(13) 314#define SIR_MAP_DEV_PL(l) ((l) << 8) 315#define SIR_MAP_PL_MAX GENMASK(4, 0) 316#define SIR_MAP_DEV_DA(a) ((a) << 1) 317#define SIR_MAP_DEV_ACK BIT(0) 318 319#define GPIR_WORD(x) (0x200 + ((x) * 4)) 320#define GPI_REG(val, id) \ 321 (((val) >> (((id) % 4) * 8)) & GENMASK(7, 0)) 322 323#define GPOR_WORD(x) (0x220 + ((x) * 4)) 324#define GPO_REG(val, id) \ 325 (((val) >> (((id) % 4) * 8)) & GENMASK(7, 0)) 326 327#define ASF_INT_STATUS 0x300 328#define ASF_INT_RAW_STATUS 0x304 329#define ASF_INT_MASK 0x308 330#define ASF_INT_TEST 0x30c 331#define ASF_INT_FATAL_SELECT 0x310 332#define ASF_INTEGRITY_ERR BIT(6) 333#define ASF_PROTOCOL_ERR BIT(5) 334#define ASF_TRANS_TIMEOUT_ERR BIT(4) 335#define ASF_CSR_ERR BIT(3) 336#define ASF_DAP_ERR BIT(2) 337#define ASF_SRAM_UNCORR_ERR BIT(1) 338#define ASF_SRAM_CORR_ERR BIT(0) 339 340#define ASF_SRAM_CORR_FAULT_STATUS 0x320 341#define ASF_SRAM_UNCORR_FAULT_STATUS 0x324 342#define ASF_SRAM_CORR_FAULT_INSTANCE(x) ((x) >> 24) 343#define ASF_SRAM_CORR_FAULT_ADDR(x) ((x) & GENMASK(23, 0)) 344 345#define ASF_SRAM_FAULT_STATS 0x328 346#define ASF_SRAM_FAULT_UNCORR_STATS(x) ((x) >> 16) 347#define ASF_SRAM_FAULT_CORR_STATS(x) ((x) & GENMASK(15, 0)) 348 349#define ASF_TRANS_TOUT_CTRL 0x330 350#define ASF_TRANS_TOUT_EN BIT(31) 351#define ASF_TRANS_TOUT_VAL(x) (x) 352 353#define ASF_TRANS_TOUT_FAULT_MASK 0x334 354#define ASF_TRANS_TOUT_FAULT_STATUS 0x338 355#define ASF_TRANS_TOUT_FAULT_APB BIT(3) 356#define ASF_TRANS_TOUT_FAULT_SCL_LOW BIT(2) 357#define ASF_TRANS_TOUT_FAULT_SCL_HIGH BIT(1) 358#define ASF_TRANS_TOUT_FAULT_FSCL_HIGH BIT(0) 359 360#define ASF_PROTO_FAULT_MASK 0x340 361#define ASF_PROTO_FAULT_STATUS 0x344 362#define ASF_PROTO_FAULT_SLVSDR_RD_ABORT BIT(31) 363#define ASF_PROTO_FAULT_SLVDDR_FAIL BIT(30) 364#define ASF_PROTO_FAULT_S(x) BIT(16 + (x)) 365#define ASF_PROTO_FAULT_MSTSDR_RD_ABORT BIT(15) 366#define ASF_PROTO_FAULT_MSTDDR_FAIL BIT(14) 367#define ASF_PROTO_FAULT_M(x) BIT(x) 368 369struct cdns_i3c_master_caps { 370 u32 cmdfifodepth; 371 u32 cmdrfifodepth; 372 u32 txfifodepth; 373 u32 rxfifodepth; 374 u32 ibirfifodepth; 375}; 376 377struct cdns_i3c_cmd { 378 u32 cmd0; 379 u32 cmd1; 380 u32 tx_len; 381 const void *tx_buf; 382 u32 rx_len; 383 void *rx_buf; 384 u32 error; 385}; 386 387struct cdns_i3c_xfer { 388 struct list_head node; 389 struct completion comp; 390 int ret; 391 unsigned int ncmds; 392 struct cdns_i3c_cmd cmds[]; 393}; 394 395struct cdns_i3c_data { 396 u8 thd_delay_ns; 397}; 398 399struct cdns_i3c_master { 400 struct work_struct hj_work; 401 struct i3c_master_controller base; 402 u32 free_rr_slots; 403 unsigned int maxdevs; 404 struct { 405 unsigned int num_slots; 406 struct i3c_dev_desc **slots; 407 spinlock_t lock; 408 } ibi; 409 struct { 410 struct list_head list; 411 struct cdns_i3c_xfer *cur; 412 spinlock_t lock; 413 } xferqueue; 414 void __iomem *regs; 415 struct clk *sysclk; 416 struct clk *pclk; 417 struct cdns_i3c_master_caps caps; 418 unsigned long i3c_scl_lim; 419 const struct cdns_i3c_data *devdata; 420}; 421 422static inline struct cdns_i3c_master * 423to_cdns_i3c_master(struct i3c_master_controller *master) 424{ 425 return container_of(master, struct cdns_i3c_master, base); 426} 427 428static void cdns_i3c_master_wr_to_tx_fifo(struct cdns_i3c_master *master, 429 const u8 *bytes, int nbytes) 430{ 431 writesl(master->regs + TX_FIFO, bytes, nbytes / 4); 432 if (nbytes & 3) { 433 u32 tmp = 0; 434 435 memcpy(&tmp, bytes + (nbytes & ~3), nbytes & 3); 436 writesl(master->regs + TX_FIFO, &tmp, 1); 437 } 438} 439 440static void cdns_i3c_master_rd_from_rx_fifo(struct cdns_i3c_master *master, 441 u8 *bytes, int nbytes) 442{ 443 readsl(master->regs + RX_FIFO, bytes, nbytes / 4); 444 if (nbytes & 3) { 445 u32 tmp; 446 447 readsl(master->regs + RX_FIFO, &tmp, 1); 448 memcpy(bytes + (nbytes & ~3), &tmp, nbytes & 3); 449 } 450} 451 452static bool cdns_i3c_master_supports_ccc_cmd(struct i3c_master_controller *m, 453 const struct i3c_ccc_cmd *cmd) 454{ 455 if (cmd->ndests > 1) 456 return false; 457 458 switch (cmd->id) { 459 case I3C_CCC_ENEC(true): 460 case I3C_CCC_ENEC(false): 461 case I3C_CCC_DISEC(true): 462 case I3C_CCC_DISEC(false): 463 case I3C_CCC_ENTAS(0, true): 464 case I3C_CCC_ENTAS(0, false): 465 case I3C_CCC_RSTDAA(true): 466 case I3C_CCC_RSTDAA(false): 467 case I3C_CCC_ENTDAA: 468 case I3C_CCC_SETMWL(true): 469 case I3C_CCC_SETMWL(false): 470 case I3C_CCC_SETMRL(true): 471 case I3C_CCC_SETMRL(false): 472 case I3C_CCC_DEFSLVS: 473 case I3C_CCC_ENTHDR(0): 474 case I3C_CCC_SETDASA: 475 case I3C_CCC_SETNEWDA: 476 case I3C_CCC_GETMWL: 477 case I3C_CCC_GETMRL: 478 case I3C_CCC_GETPID: 479 case I3C_CCC_GETBCR: 480 case I3C_CCC_GETDCR: 481 case I3C_CCC_GETSTATUS: 482 case I3C_CCC_GETACCMST: 483 case I3C_CCC_GETMXDS: 484 case I3C_CCC_GETHDRCAP: 485 return true; 486 default: 487 break; 488 } 489 490 return false; 491} 492 493static int cdns_i3c_master_disable(struct cdns_i3c_master *master) 494{ 495 u32 status; 496 497 writel(readl(master->regs + CTRL) & ~CTRL_DEV_EN, master->regs + CTRL); 498 499 return readl_poll_timeout(master->regs + MST_STATUS0, status, 500 status & MST_STATUS0_IDLE, 10, 1000000); 501} 502 503static void cdns_i3c_master_enable(struct cdns_i3c_master *master) 504{ 505 writel(readl(master->regs + CTRL) | CTRL_DEV_EN, master->regs + CTRL); 506} 507 508static struct cdns_i3c_xfer * 509cdns_i3c_master_alloc_xfer(struct cdns_i3c_master *master, unsigned int ncmds) 510{ 511 struct cdns_i3c_xfer *xfer; 512 513 xfer = kzalloc(struct_size(xfer, cmds, ncmds), GFP_KERNEL); 514 if (!xfer) 515 return NULL; 516 517 INIT_LIST_HEAD(&xfer->node); 518 xfer->ncmds = ncmds; 519 xfer->ret = -ETIMEDOUT; 520 521 return xfer; 522} 523 524static void cdns_i3c_master_free_xfer(struct cdns_i3c_xfer *xfer) 525{ 526 kfree(xfer); 527} 528 529static void cdns_i3c_master_start_xfer_locked(struct cdns_i3c_master *master) 530{ 531 struct cdns_i3c_xfer *xfer = master->xferqueue.cur; 532 unsigned int i; 533 534 if (!xfer) 535 return; 536 537 writel(MST_INT_CMDD_EMP, master->regs + MST_ICR); 538 for (i = 0; i < xfer->ncmds; i++) { 539 struct cdns_i3c_cmd *cmd = &xfer->cmds[i]; 540 541 cdns_i3c_master_wr_to_tx_fifo(master, cmd->tx_buf, 542 cmd->tx_len); 543 } 544 545 for (i = 0; i < xfer->ncmds; i++) { 546 struct cdns_i3c_cmd *cmd = &xfer->cmds[i]; 547 548 writel(cmd->cmd1 | CMD1_FIFO_CMDID(i), 549 master->regs + CMD1_FIFO); 550 writel(cmd->cmd0, master->regs + CMD0_FIFO); 551 } 552 553 writel(readl(master->regs + CTRL) | CTRL_MCS, 554 master->regs + CTRL); 555 writel(MST_INT_CMDD_EMP, master->regs + MST_IER); 556} 557 558static void cdns_i3c_master_end_xfer_locked(struct cdns_i3c_master *master, 559 u32 isr) 560{ 561 struct cdns_i3c_xfer *xfer = master->xferqueue.cur; 562 int i, ret = 0; 563 u32 status0; 564 565 if (!xfer) 566 return; 567 568 if (!(isr & MST_INT_CMDD_EMP)) 569 return; 570 571 writel(MST_INT_CMDD_EMP, master->regs + MST_IDR); 572 573 for (status0 = readl(master->regs + MST_STATUS0); 574 !(status0 & MST_STATUS0_CMDR_EMP); 575 status0 = readl(master->regs + MST_STATUS0)) { 576 struct cdns_i3c_cmd *cmd; 577 u32 cmdr, rx_len, id; 578 579 cmdr = readl(master->regs + CMDR); 580 id = CMDR_CMDID(cmdr); 581 if (id == CMDR_CMDID_HJACK_DISEC || 582 id == CMDR_CMDID_HJACK_ENTDAA || 583 WARN_ON(id >= xfer->ncmds)) 584 continue; 585 586 cmd = &xfer->cmds[CMDR_CMDID(cmdr)]; 587 rx_len = min_t(u32, CMDR_XFER_BYTES(cmdr), cmd->rx_len); 588 cdns_i3c_master_rd_from_rx_fifo(master, cmd->rx_buf, rx_len); 589 cmd->error = CMDR_ERROR(cmdr); 590 } 591 592 for (i = 0; i < xfer->ncmds; i++) { 593 switch (xfer->cmds[i].error) { 594 case CMDR_NO_ERROR: 595 break; 596 597 case CMDR_DDR_PREAMBLE_ERROR: 598 case CMDR_DDR_PARITY_ERROR: 599 case CMDR_M0_ERROR: 600 case CMDR_M1_ERROR: 601 case CMDR_M2_ERROR: 602 case CMDR_MST_ABORT: 603 case CMDR_NACK_RESP: 604 case CMDR_DDR_DROPPED: 605 ret = -EIO; 606 break; 607 608 case CMDR_DDR_RX_FIFO_OVF: 609 case CMDR_DDR_TX_FIFO_UNF: 610 ret = -ENOSPC; 611 break; 612 613 case CMDR_INVALID_DA: 614 default: 615 ret = -EINVAL; 616 break; 617 } 618 } 619 620 xfer->ret = ret; 621 complete(&xfer->comp); 622 623 xfer = list_first_entry_or_null(&master->xferqueue.list, 624 struct cdns_i3c_xfer, node); 625 if (xfer) 626 list_del_init(&xfer->node); 627 628 master->xferqueue.cur = xfer; 629 cdns_i3c_master_start_xfer_locked(master); 630} 631 632static void cdns_i3c_master_queue_xfer(struct cdns_i3c_master *master, 633 struct cdns_i3c_xfer *xfer) 634{ 635 unsigned long flags; 636 637 init_completion(&xfer->comp); 638 spin_lock_irqsave(&master->xferqueue.lock, flags); 639 if (master->xferqueue.cur) { 640 list_add_tail(&xfer->node, &master->xferqueue.list); 641 } else { 642 master->xferqueue.cur = xfer; 643 cdns_i3c_master_start_xfer_locked(master); 644 } 645 spin_unlock_irqrestore(&master->xferqueue.lock, flags); 646} 647 648static void cdns_i3c_master_unqueue_xfer(struct cdns_i3c_master *master, 649 struct cdns_i3c_xfer *xfer) 650{ 651 unsigned long flags; 652 653 spin_lock_irqsave(&master->xferqueue.lock, flags); 654 if (master->xferqueue.cur == xfer) { 655 u32 status; 656 657 writel(readl(master->regs + CTRL) & ~CTRL_DEV_EN, 658 master->regs + CTRL); 659 readl_poll_timeout_atomic(master->regs + MST_STATUS0, status, 660 status & MST_STATUS0_IDLE, 10, 661 1000000); 662 master->xferqueue.cur = NULL; 663 writel(FLUSH_RX_FIFO | FLUSH_TX_FIFO | FLUSH_CMD_FIFO | 664 FLUSH_CMD_RESP, 665 master->regs + FLUSH_CTRL); 666 writel(MST_INT_CMDD_EMP, master->regs + MST_IDR); 667 writel(readl(master->regs + CTRL) | CTRL_DEV_EN, 668 master->regs + CTRL); 669 } else { 670 list_del_init(&xfer->node); 671 } 672 spin_unlock_irqrestore(&master->xferqueue.lock, flags); 673} 674 675static enum i3c_error_code cdns_i3c_cmd_get_err(struct cdns_i3c_cmd *cmd) 676{ 677 switch (cmd->error) { 678 case CMDR_M0_ERROR: 679 return I3C_ERROR_M0; 680 681 case CMDR_M1_ERROR: 682 return I3C_ERROR_M1; 683 684 case CMDR_M2_ERROR: 685 case CMDR_NACK_RESP: 686 return I3C_ERROR_M2; 687 688 default: 689 break; 690 } 691 692 return I3C_ERROR_UNKNOWN; 693} 694 695static int cdns_i3c_master_send_ccc_cmd(struct i3c_master_controller *m, 696 struct i3c_ccc_cmd *cmd) 697{ 698 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 699 struct cdns_i3c_xfer *xfer; 700 struct cdns_i3c_cmd *ccmd; 701 int ret; 702 703 xfer = cdns_i3c_master_alloc_xfer(master, 1); 704 if (!xfer) 705 return -ENOMEM; 706 707 ccmd = xfer->cmds; 708 ccmd->cmd1 = CMD1_FIFO_CCC(cmd->id); 709 ccmd->cmd0 = CMD0_FIFO_IS_CCC | 710 CMD0_FIFO_PL_LEN(cmd->dests[0].payload.len); 711 712 if (cmd->id & I3C_CCC_DIRECT) 713 ccmd->cmd0 |= CMD0_FIFO_DEV_ADDR(cmd->dests[0].addr); 714 715 if (cmd->rnw) { 716 ccmd->cmd0 |= CMD0_FIFO_RNW; 717 ccmd->rx_buf = cmd->dests[0].payload.data; 718 ccmd->rx_len = cmd->dests[0].payload.len; 719 } else { 720 ccmd->tx_buf = cmd->dests[0].payload.data; 721 ccmd->tx_len = cmd->dests[0].payload.len; 722 } 723 724 cdns_i3c_master_queue_xfer(master, xfer); 725 if (!wait_for_completion_timeout(&xfer->comp, msecs_to_jiffies(1000))) 726 cdns_i3c_master_unqueue_xfer(master, xfer); 727 728 ret = xfer->ret; 729 cmd->err = cdns_i3c_cmd_get_err(&xfer->cmds[0]); 730 cdns_i3c_master_free_xfer(xfer); 731 732 return ret; 733} 734 735static int cdns_i3c_master_priv_xfers(struct i3c_dev_desc *dev, 736 struct i3c_priv_xfer *xfers, 737 int nxfers) 738{ 739 struct i3c_master_controller *m = i3c_dev_get_master(dev); 740 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 741 int txslots = 0, rxslots = 0, i, ret; 742 struct cdns_i3c_xfer *cdns_xfer; 743 744 for (i = 0; i < nxfers; i++) { 745 if (xfers[i].len > CMD0_FIFO_PL_LEN_MAX) 746 return -ENOTSUPP; 747 } 748 749 if (!nxfers) 750 return 0; 751 752 if (nxfers > master->caps.cmdfifodepth || 753 nxfers > master->caps.cmdrfifodepth) 754 return -ENOTSUPP; 755 756 /* 757 * First make sure that all transactions (block of transfers separated 758 * by a STOP marker) fit in the FIFOs. 759 */ 760 for (i = 0; i < nxfers; i++) { 761 if (xfers[i].rnw) 762 rxslots += DIV_ROUND_UP(xfers[i].len, 4); 763 else 764 txslots += DIV_ROUND_UP(xfers[i].len, 4); 765 } 766 767 if (rxslots > master->caps.rxfifodepth || 768 txslots > master->caps.txfifodepth) 769 return -ENOTSUPP; 770 771 cdns_xfer = cdns_i3c_master_alloc_xfer(master, nxfers); 772 if (!cdns_xfer) 773 return -ENOMEM; 774 775 for (i = 0; i < nxfers; i++) { 776 struct cdns_i3c_cmd *ccmd = &cdns_xfer->cmds[i]; 777 u32 pl_len = xfers[i].len; 778 779 ccmd->cmd0 = CMD0_FIFO_DEV_ADDR(dev->info.dyn_addr) | 780 CMD0_FIFO_PRIV_XMIT_MODE(XMIT_BURST_WITHOUT_SUBADDR); 781 782 if (xfers[i].rnw) { 783 ccmd->cmd0 |= CMD0_FIFO_RNW; 784 ccmd->rx_buf = xfers[i].data.in; 785 ccmd->rx_len = xfers[i].len; 786 pl_len++; 787 } else { 788 ccmd->tx_buf = xfers[i].data.out; 789 ccmd->tx_len = xfers[i].len; 790 } 791 792 ccmd->cmd0 |= CMD0_FIFO_PL_LEN(pl_len); 793 794 if (i < nxfers - 1) 795 ccmd->cmd0 |= CMD0_FIFO_RSBC; 796 797 if (!i) 798 ccmd->cmd0 |= CMD0_FIFO_BCH; 799 } 800 801 cdns_i3c_master_queue_xfer(master, cdns_xfer); 802 if (!wait_for_completion_timeout(&cdns_xfer->comp, 803 msecs_to_jiffies(1000))) 804 cdns_i3c_master_unqueue_xfer(master, cdns_xfer); 805 806 ret = cdns_xfer->ret; 807 808 for (i = 0; i < nxfers; i++) 809 xfers[i].err = cdns_i3c_cmd_get_err(&cdns_xfer->cmds[i]); 810 811 cdns_i3c_master_free_xfer(cdns_xfer); 812 813 return ret; 814} 815 816static int cdns_i3c_master_i2c_xfers(struct i2c_dev_desc *dev, 817 const struct i2c_msg *xfers, int nxfers) 818{ 819 struct i3c_master_controller *m = i2c_dev_get_master(dev); 820 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 821 unsigned int nrxwords = 0, ntxwords = 0; 822 struct cdns_i3c_xfer *xfer; 823 int i, ret = 0; 824 825 if (nxfers > master->caps.cmdfifodepth) 826 return -ENOTSUPP; 827 828 for (i = 0; i < nxfers; i++) { 829 if (xfers[i].len > CMD0_FIFO_PL_LEN_MAX) 830 return -ENOTSUPP; 831 832 if (xfers[i].flags & I2C_M_RD) 833 nrxwords += DIV_ROUND_UP(xfers[i].len, 4); 834 else 835 ntxwords += DIV_ROUND_UP(xfers[i].len, 4); 836 } 837 838 if (ntxwords > master->caps.txfifodepth || 839 nrxwords > master->caps.rxfifodepth) 840 return -ENOTSUPP; 841 842 xfer = cdns_i3c_master_alloc_xfer(master, nxfers); 843 if (!xfer) 844 return -ENOMEM; 845 846 for (i = 0; i < nxfers; i++) { 847 struct cdns_i3c_cmd *ccmd = &xfer->cmds[i]; 848 849 ccmd->cmd0 = CMD0_FIFO_DEV_ADDR(xfers[i].addr) | 850 CMD0_FIFO_PL_LEN(xfers[i].len) | 851 CMD0_FIFO_PRIV_XMIT_MODE(XMIT_BURST_WITHOUT_SUBADDR); 852 853 if (xfers[i].flags & I2C_M_TEN) 854 ccmd->cmd0 |= CMD0_FIFO_IS_10B; 855 856 if (xfers[i].flags & I2C_M_RD) { 857 ccmd->cmd0 |= CMD0_FIFO_RNW; 858 ccmd->rx_buf = xfers[i].buf; 859 ccmd->rx_len = xfers[i].len; 860 } else { 861 ccmd->tx_buf = xfers[i].buf; 862 ccmd->tx_len = xfers[i].len; 863 } 864 } 865 866 cdns_i3c_master_queue_xfer(master, xfer); 867 if (!wait_for_completion_timeout(&xfer->comp, msecs_to_jiffies(1000))) 868 cdns_i3c_master_unqueue_xfer(master, xfer); 869 870 ret = xfer->ret; 871 cdns_i3c_master_free_xfer(xfer); 872 873 return ret; 874} 875 876struct cdns_i3c_i2c_dev_data { 877 u16 id; 878 s16 ibi; 879 struct i3c_generic_ibi_pool *ibi_pool; 880}; 881 882static u32 prepare_rr0_dev_address(u32 addr) 883{ 884 u32 ret = (addr << 1) & 0xff; 885 886 /* RR0[7:1] = addr[6:0] */ 887 ret |= (addr & GENMASK(6, 0)) << 1; 888 889 /* RR0[15:13] = addr[9:7] */ 890 ret |= (addr & GENMASK(9, 7)) << 6; 891 892 /* RR0[0] = ~XOR(addr[6:0]) */ 893 if (!(hweight8(addr & 0x7f) & 1)) 894 ret |= 1; 895 896 return ret; 897} 898 899static void cdns_i3c_master_upd_i3c_addr(struct i3c_dev_desc *dev) 900{ 901 struct i3c_master_controller *m = i3c_dev_get_master(dev); 902 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 903 struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev); 904 u32 rr; 905 906 rr = prepare_rr0_dev_address(dev->info.dyn_addr ? 907 dev->info.dyn_addr : 908 dev->info.static_addr); 909 writel(DEV_ID_RR0_IS_I3C | rr, master->regs + DEV_ID_RR0(data->id)); 910} 911 912static int cdns_i3c_master_get_rr_slot(struct cdns_i3c_master *master, 913 u8 dyn_addr) 914{ 915 unsigned long activedevs; 916 u32 rr; 917 int i; 918 919 if (!dyn_addr) { 920 if (!master->free_rr_slots) 921 return -ENOSPC; 922 923 return ffs(master->free_rr_slots) - 1; 924 } 925 926 activedevs = readl(master->regs + DEVS_CTRL) & DEVS_CTRL_DEVS_ACTIVE_MASK; 927 activedevs &= ~BIT(0); 928 929 for_each_set_bit(i, &activedevs, master->maxdevs + 1) { 930 rr = readl(master->regs + DEV_ID_RR0(i)); 931 if (!(rr & DEV_ID_RR0_IS_I3C) || 932 DEV_ID_RR0_GET_DEV_ADDR(rr) != dyn_addr) 933 continue; 934 935 return i; 936 } 937 938 return -EINVAL; 939} 940 941static int cdns_i3c_master_reattach_i3c_dev(struct i3c_dev_desc *dev, 942 u8 old_dyn_addr) 943{ 944 cdns_i3c_master_upd_i3c_addr(dev); 945 946 return 0; 947} 948 949static int cdns_i3c_master_attach_i3c_dev(struct i3c_dev_desc *dev) 950{ 951 struct i3c_master_controller *m = i3c_dev_get_master(dev); 952 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 953 struct cdns_i3c_i2c_dev_data *data; 954 int slot; 955 956 data = kzalloc(sizeof(*data), GFP_KERNEL); 957 if (!data) 958 return -ENOMEM; 959 960 slot = cdns_i3c_master_get_rr_slot(master, dev->info.dyn_addr); 961 if (slot < 0) { 962 kfree(data); 963 return slot; 964 } 965 966 data->ibi = -1; 967 data->id = slot; 968 i3c_dev_set_master_data(dev, data); 969 master->free_rr_slots &= ~BIT(slot); 970 971 if (!dev->info.dyn_addr) { 972 cdns_i3c_master_upd_i3c_addr(dev); 973 writel(readl(master->regs + DEVS_CTRL) | 974 DEVS_CTRL_DEV_ACTIVE(data->id), 975 master->regs + DEVS_CTRL); 976 } 977 978 return 0; 979} 980 981static void cdns_i3c_master_detach_i3c_dev(struct i3c_dev_desc *dev) 982{ 983 struct i3c_master_controller *m = i3c_dev_get_master(dev); 984 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 985 struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev); 986 987 writel(readl(master->regs + DEVS_CTRL) | 988 DEVS_CTRL_DEV_CLR(data->id), 989 master->regs + DEVS_CTRL); 990 991 i3c_dev_set_master_data(dev, NULL); 992 master->free_rr_slots |= BIT(data->id); 993 kfree(data); 994} 995 996static int cdns_i3c_master_attach_i2c_dev(struct i2c_dev_desc *dev) 997{ 998 struct i3c_master_controller *m = i2c_dev_get_master(dev); 999 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 1000 struct cdns_i3c_i2c_dev_data *data; 1001 int slot; 1002 1003 slot = cdns_i3c_master_get_rr_slot(master, 0); 1004 if (slot < 0) 1005 return slot; 1006 1007 data = kzalloc(sizeof(*data), GFP_KERNEL); 1008 if (!data) 1009 return -ENOMEM; 1010 1011 data->id = slot; 1012 master->free_rr_slots &= ~BIT(slot); 1013 i2c_dev_set_master_data(dev, data); 1014 1015 writel(prepare_rr0_dev_address(dev->addr), 1016 master->regs + DEV_ID_RR0(data->id)); 1017 writel(dev->lvr, master->regs + DEV_ID_RR2(data->id)); 1018 writel(readl(master->regs + DEVS_CTRL) | 1019 DEVS_CTRL_DEV_ACTIVE(data->id), 1020 master->regs + DEVS_CTRL); 1021 1022 return 0; 1023} 1024 1025static void cdns_i3c_master_detach_i2c_dev(struct i2c_dev_desc *dev) 1026{ 1027 struct i3c_master_controller *m = i2c_dev_get_master(dev); 1028 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 1029 struct cdns_i3c_i2c_dev_data *data = i2c_dev_get_master_data(dev); 1030 1031 writel(readl(master->regs + DEVS_CTRL) | 1032 DEVS_CTRL_DEV_CLR(data->id), 1033 master->regs + DEVS_CTRL); 1034 master->free_rr_slots |= BIT(data->id); 1035 1036 i2c_dev_set_master_data(dev, NULL); 1037 kfree(data); 1038} 1039 1040static void cdns_i3c_master_bus_cleanup(struct i3c_master_controller *m) 1041{ 1042 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 1043 1044 cdns_i3c_master_disable(master); 1045} 1046 1047static void cdns_i3c_master_dev_rr_to_info(struct cdns_i3c_master *master, 1048 unsigned int slot, 1049 struct i3c_device_info *info) 1050{ 1051 u32 rr; 1052 1053 memset(info, 0, sizeof(*info)); 1054 rr = readl(master->regs + DEV_ID_RR0(slot)); 1055 info->dyn_addr = DEV_ID_RR0_GET_DEV_ADDR(rr); 1056 rr = readl(master->regs + DEV_ID_RR2(slot)); 1057 info->dcr = rr; 1058 info->bcr = rr >> 8; 1059 info->pid = rr >> 16; 1060 info->pid |= (u64)readl(master->regs + DEV_ID_RR1(slot)) << 16; 1061} 1062 1063static void cdns_i3c_master_upd_i3c_scl_lim(struct cdns_i3c_master *master) 1064{ 1065 struct i3c_master_controller *m = &master->base; 1066 unsigned long i3c_lim_period, pres_step, ncycles; 1067 struct i3c_bus *bus = i3c_master_get_bus(m); 1068 unsigned long new_i3c_scl_lim = 0; 1069 struct i3c_dev_desc *dev; 1070 u32 prescl1, ctrl; 1071 1072 i3c_bus_for_each_i3cdev(bus, dev) { 1073 unsigned long max_fscl; 1074 1075 max_fscl = max(I3C_CCC_MAX_SDR_FSCL(dev->info.max_read_ds), 1076 I3C_CCC_MAX_SDR_FSCL(dev->info.max_write_ds)); 1077 switch (max_fscl) { 1078 case I3C_SDR1_FSCL_8MHZ: 1079 max_fscl = 8000000; 1080 break; 1081 case I3C_SDR2_FSCL_6MHZ: 1082 max_fscl = 6000000; 1083 break; 1084 case I3C_SDR3_FSCL_4MHZ: 1085 max_fscl = 4000000; 1086 break; 1087 case I3C_SDR4_FSCL_2MHZ: 1088 max_fscl = 2000000; 1089 break; 1090 case I3C_SDR0_FSCL_MAX: 1091 default: 1092 max_fscl = 0; 1093 break; 1094 } 1095 1096 if (max_fscl && 1097 (new_i3c_scl_lim > max_fscl || !new_i3c_scl_lim)) 1098 new_i3c_scl_lim = max_fscl; 1099 } 1100 1101 /* Only update PRESCL_CTRL1 if the I3C SCL limitation has changed. */ 1102 if (new_i3c_scl_lim == master->i3c_scl_lim) 1103 return; 1104 master->i3c_scl_lim = new_i3c_scl_lim; 1105 if (!new_i3c_scl_lim) 1106 return; 1107 pres_step = 1000000000UL / (bus->scl_rate.i3c * 4); 1108 1109 /* Configure PP_LOW to meet I3C slave limitations. */ 1110 prescl1 = readl(master->regs + PRESCL_CTRL1) & 1111 ~PRESCL_CTRL1_PP_LOW_MASK; 1112 ctrl = readl(master->regs + CTRL); 1113 1114 i3c_lim_period = DIV_ROUND_UP(1000000000, master->i3c_scl_lim); 1115 ncycles = DIV_ROUND_UP(i3c_lim_period, pres_step); 1116 if (ncycles < 4) 1117 ncycles = 0; 1118 else 1119 ncycles -= 4; 1120 1121 prescl1 |= PRESCL_CTRL1_PP_LOW(ncycles); 1122 1123 /* Disable I3C master before updating PRESCL_CTRL1. */ 1124 if (ctrl & CTRL_DEV_EN) 1125 cdns_i3c_master_disable(master); 1126 1127 writel(prescl1, master->regs + PRESCL_CTRL1); 1128 1129 if (ctrl & CTRL_DEV_EN) 1130 cdns_i3c_master_enable(master); 1131} 1132 1133static int cdns_i3c_master_do_daa(struct i3c_master_controller *m) 1134{ 1135 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 1136 unsigned long olddevs, newdevs; 1137 int ret, slot; 1138 u8 addrs[MAX_DEVS] = { }; 1139 u8 last_addr = 0; 1140 1141 olddevs = readl(master->regs + DEVS_CTRL) & DEVS_CTRL_DEVS_ACTIVE_MASK; 1142 olddevs |= BIT(0); 1143 1144 /* Prepare RR slots before launching DAA. */ 1145 for_each_clear_bit(slot, &olddevs, master->maxdevs + 1) { 1146 ret = i3c_master_get_free_addr(m, last_addr + 1); 1147 if (ret < 0) 1148 return -ENOSPC; 1149 1150 last_addr = ret; 1151 addrs[slot] = last_addr; 1152 writel(prepare_rr0_dev_address(last_addr) | DEV_ID_RR0_IS_I3C, 1153 master->regs + DEV_ID_RR0(slot)); 1154 writel(0, master->regs + DEV_ID_RR1(slot)); 1155 writel(0, master->regs + DEV_ID_RR2(slot)); 1156 } 1157 1158 ret = i3c_master_entdaa_locked(&master->base); 1159 if (ret && ret != I3C_ERROR_M2) 1160 return ret; 1161 1162 newdevs = readl(master->regs + DEVS_CTRL) & DEVS_CTRL_DEVS_ACTIVE_MASK; 1163 newdevs &= ~olddevs; 1164 1165 /* 1166 * Clear all retaining registers filled during DAA. We already 1167 * have the addressed assigned to them in the addrs array. 1168 */ 1169 for_each_set_bit(slot, &newdevs, master->maxdevs + 1) 1170 i3c_master_add_i3c_dev_locked(m, addrs[slot]); 1171 1172 /* 1173 * Clear slots that ended up not being used. Can be caused by I3C 1174 * device creation failure or when the I3C device was already known 1175 * by the system but with a different address (in this case the device 1176 * already has a slot and does not need a new one). 1177 */ 1178 writel(readl(master->regs + DEVS_CTRL) | 1179 master->free_rr_slots << DEVS_CTRL_DEV_CLR_SHIFT, 1180 master->regs + DEVS_CTRL); 1181 1182 i3c_master_defslvs_locked(&master->base); 1183 1184 cdns_i3c_master_upd_i3c_scl_lim(master); 1185 1186 /* Unmask Hot-Join and Mastership request interrupts. */ 1187 i3c_master_enec_locked(m, I3C_BROADCAST_ADDR, 1188 I3C_CCC_EVENT_HJ | I3C_CCC_EVENT_MR); 1189 1190 return 0; 1191} 1192 1193static u8 cdns_i3c_master_calculate_thd_delay(struct cdns_i3c_master *master) 1194{ 1195 unsigned long sysclk_rate = clk_get_rate(master->sysclk); 1196 u8 thd_delay = DIV_ROUND_UP(master->devdata->thd_delay_ns, 1197 (NSEC_PER_SEC / sysclk_rate)); 1198 1199 /* Every value greater than 3 is not valid. */ 1200 if (thd_delay > THD_DELAY_MAX) 1201 thd_delay = THD_DELAY_MAX; 1202 1203 /* CTLR_THD_DEL value is encoded. */ 1204 return (THD_DELAY_MAX - thd_delay); 1205} 1206 1207static int cdns_i3c_master_bus_init(struct i3c_master_controller *m) 1208{ 1209 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 1210 unsigned long pres_step, sysclk_rate, max_i2cfreq; 1211 struct i3c_bus *bus = i3c_master_get_bus(m); 1212 u32 ctrl, prescl0, prescl1, pres, low; 1213 struct i3c_device_info info = { }; 1214 int ret, ncycles; 1215 1216 switch (bus->mode) { 1217 case I3C_BUS_MODE_PURE: 1218 ctrl = CTRL_PURE_BUS_MODE; 1219 break; 1220 1221 case I3C_BUS_MODE_MIXED_FAST: 1222 ctrl = CTRL_MIXED_FAST_BUS_MODE; 1223 break; 1224 1225 case I3C_BUS_MODE_MIXED_SLOW: 1226 ctrl = CTRL_MIXED_SLOW_BUS_MODE; 1227 break; 1228 1229 default: 1230 return -EINVAL; 1231 } 1232 1233 sysclk_rate = clk_get_rate(master->sysclk); 1234 if (!sysclk_rate) 1235 return -EINVAL; 1236 1237 pres = DIV_ROUND_UP(sysclk_rate, (bus->scl_rate.i3c * 4)) - 1; 1238 if (pres > PRESCL_CTRL0_I3C_MAX) 1239 return -ERANGE; 1240 1241 bus->scl_rate.i3c = sysclk_rate / ((pres + 1) * 4); 1242 1243 prescl0 = PRESCL_CTRL0_I3C(pres); 1244 1245 low = ((I3C_BUS_TLOW_OD_MIN_NS * sysclk_rate) / (pres + 1)) - 2; 1246 prescl1 = PRESCL_CTRL1_OD_LOW(low); 1247 1248 max_i2cfreq = bus->scl_rate.i2c; 1249 1250 pres = (sysclk_rate / (max_i2cfreq * 5)) - 1; 1251 if (pres > PRESCL_CTRL0_I2C_MAX) 1252 return -ERANGE; 1253 1254 bus->scl_rate.i2c = sysclk_rate / ((pres + 1) * 5); 1255 1256 prescl0 |= PRESCL_CTRL0_I2C(pres); 1257 writel(prescl0, master->regs + PRESCL_CTRL0); 1258 1259 /* Calculate OD and PP low. */ 1260 pres_step = 1000000000 / (bus->scl_rate.i3c * 4); 1261 ncycles = DIV_ROUND_UP(I3C_BUS_TLOW_OD_MIN_NS, pres_step) - 2; 1262 if (ncycles < 0) 1263 ncycles = 0; 1264 prescl1 = PRESCL_CTRL1_OD_LOW(ncycles); 1265 writel(prescl1, master->regs + PRESCL_CTRL1); 1266 1267 /* Get an address for the master. */ 1268 ret = i3c_master_get_free_addr(m, 0); 1269 if (ret < 0) 1270 return ret; 1271 1272 writel(prepare_rr0_dev_address(ret) | DEV_ID_RR0_IS_I3C, 1273 master->regs + DEV_ID_RR0(0)); 1274 1275 cdns_i3c_master_dev_rr_to_info(master, 0, &info); 1276 if (info.bcr & I3C_BCR_HDR_CAP) 1277 info.hdr_cap = I3C_CCC_HDR_MODE(I3C_HDR_DDR); 1278 1279 ret = i3c_master_set_info(&master->base, &info); 1280 if (ret) 1281 return ret; 1282 1283 /* 1284 * Enable Hot-Join, and, when a Hot-Join request happens, disable all 1285 * events coming from this device. 1286 * 1287 * We will issue ENTDAA afterwards from the threaded IRQ handler. 1288 */ 1289 ctrl |= CTRL_HJ_ACK | CTRL_HJ_DISEC | CTRL_HALT_EN | CTRL_MCS_EN; 1290 1291 /* 1292 * Configure data hold delay based on device-specific data. 1293 * 1294 * MIPI I3C Specification 1.0 defines non-zero minimal tHD_PP timing on 1295 * master output. This setting allows to meet this timing on master's 1296 * SoC outputs, regardless of PCB balancing. 1297 */ 1298 ctrl |= CTRL_THD_DELAY(cdns_i3c_master_calculate_thd_delay(master)); 1299 writel(ctrl, master->regs + CTRL); 1300 1301 cdns_i3c_master_enable(master); 1302 1303 return 0; 1304} 1305 1306static void cdns_i3c_master_handle_ibi(struct cdns_i3c_master *master, 1307 u32 ibir) 1308{ 1309 struct cdns_i3c_i2c_dev_data *data; 1310 bool data_consumed = false; 1311 struct i3c_ibi_slot *slot; 1312 u32 id = IBIR_SLVID(ibir); 1313 struct i3c_dev_desc *dev; 1314 size_t nbytes; 1315 u8 *buf; 1316 1317 /* 1318 * FIXME: maybe we should report the FIFO OVF errors to the upper 1319 * layer. 1320 */ 1321 if (id >= master->ibi.num_slots || (ibir & IBIR_ERROR)) 1322 goto out; 1323 1324 dev = master->ibi.slots[id]; 1325 spin_lock(&master->ibi.lock); 1326 1327 data = i3c_dev_get_master_data(dev); 1328 slot = i3c_generic_ibi_get_free_slot(data->ibi_pool); 1329 if (!slot) 1330 goto out_unlock; 1331 1332 buf = slot->data; 1333 1334 nbytes = IBIR_XFER_BYTES(ibir); 1335 readsl(master->regs + IBI_DATA_FIFO, buf, nbytes / 4); 1336 if (nbytes % 3) { 1337 u32 tmp = __raw_readl(master->regs + IBI_DATA_FIFO); 1338 1339 memcpy(buf + (nbytes & ~3), &tmp, nbytes & 3); 1340 } 1341 1342 slot->len = min_t(unsigned int, IBIR_XFER_BYTES(ibir), 1343 dev->ibi->max_payload_len); 1344 i3c_master_queue_ibi(dev, slot); 1345 data_consumed = true; 1346 1347out_unlock: 1348 spin_unlock(&master->ibi.lock); 1349 1350out: 1351 /* Consume data from the FIFO if it's not been done already. */ 1352 if (!data_consumed) { 1353 int i; 1354 1355 for (i = 0; i < IBIR_XFER_BYTES(ibir); i += 4) 1356 readl(master->regs + IBI_DATA_FIFO); 1357 } 1358} 1359 1360static void cnds_i3c_master_demux_ibis(struct cdns_i3c_master *master) 1361{ 1362 u32 status0; 1363 1364 writel(MST_INT_IBIR_THR, master->regs + MST_ICR); 1365 1366 for (status0 = readl(master->regs + MST_STATUS0); 1367 !(status0 & MST_STATUS0_IBIR_EMP); 1368 status0 = readl(master->regs + MST_STATUS0)) { 1369 u32 ibir = readl(master->regs + IBIR); 1370 1371 switch (IBIR_TYPE(ibir)) { 1372 case IBIR_TYPE_IBI: 1373 cdns_i3c_master_handle_ibi(master, ibir); 1374 break; 1375 1376 case IBIR_TYPE_HJ: 1377 WARN_ON(IBIR_XFER_BYTES(ibir) || (ibir & IBIR_ERROR)); 1378 queue_work(master->base.wq, &master->hj_work); 1379 break; 1380 1381 case IBIR_TYPE_MR: 1382 WARN_ON(IBIR_XFER_BYTES(ibir) || (ibir & IBIR_ERROR)); 1383 default: 1384 break; 1385 } 1386 } 1387} 1388 1389static irqreturn_t cdns_i3c_master_interrupt(int irq, void *data) 1390{ 1391 struct cdns_i3c_master *master = data; 1392 u32 status; 1393 1394 status = readl(master->regs + MST_ISR); 1395 if (!(status & readl(master->regs + MST_IMR))) 1396 return IRQ_NONE; 1397 1398 spin_lock(&master->xferqueue.lock); 1399 cdns_i3c_master_end_xfer_locked(master, status); 1400 spin_unlock(&master->xferqueue.lock); 1401 1402 if (status & MST_INT_IBIR_THR) 1403 cnds_i3c_master_demux_ibis(master); 1404 1405 return IRQ_HANDLED; 1406} 1407 1408static int cdns_i3c_master_disable_ibi(struct i3c_dev_desc *dev) 1409{ 1410 struct i3c_master_controller *m = i3c_dev_get_master(dev); 1411 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 1412 struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev); 1413 unsigned long flags; 1414 u32 sirmap; 1415 int ret; 1416 1417 ret = i3c_master_disec_locked(m, dev->info.dyn_addr, 1418 I3C_CCC_EVENT_SIR); 1419 if (ret) 1420 return ret; 1421 1422 spin_lock_irqsave(&master->ibi.lock, flags); 1423 sirmap = readl(master->regs + SIR_MAP_DEV_REG(data->ibi)); 1424 sirmap &= ~SIR_MAP_DEV_CONF_MASK(data->ibi); 1425 sirmap |= SIR_MAP_DEV_CONF(data->ibi, 1426 SIR_MAP_DEV_DA(I3C_BROADCAST_ADDR)); 1427 writel(sirmap, master->regs + SIR_MAP_DEV_REG(data->ibi)); 1428 spin_unlock_irqrestore(&master->ibi.lock, flags); 1429 1430 return ret; 1431} 1432 1433static int cdns_i3c_master_enable_ibi(struct i3c_dev_desc *dev) 1434{ 1435 struct i3c_master_controller *m = i3c_dev_get_master(dev); 1436 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 1437 struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev); 1438 unsigned long flags; 1439 u32 sircfg, sirmap; 1440 int ret; 1441 1442 spin_lock_irqsave(&master->ibi.lock, flags); 1443 sirmap = readl(master->regs + SIR_MAP_DEV_REG(data->ibi)); 1444 sirmap &= ~SIR_MAP_DEV_CONF_MASK(data->ibi); 1445 sircfg = SIR_MAP_DEV_ROLE(dev->info.bcr >> 6) | 1446 SIR_MAP_DEV_DA(dev->info.dyn_addr) | 1447 SIR_MAP_DEV_PL(dev->info.max_ibi_len) | 1448 SIR_MAP_DEV_ACK; 1449 1450 if (dev->info.bcr & I3C_BCR_MAX_DATA_SPEED_LIM) 1451 sircfg |= SIR_MAP_DEV_SLOW; 1452 1453 sirmap |= SIR_MAP_DEV_CONF(data->ibi, sircfg); 1454 writel(sirmap, master->regs + SIR_MAP_DEV_REG(data->ibi)); 1455 spin_unlock_irqrestore(&master->ibi.lock, flags); 1456 1457 ret = i3c_master_enec_locked(m, dev->info.dyn_addr, 1458 I3C_CCC_EVENT_SIR); 1459 if (ret) { 1460 spin_lock_irqsave(&master->ibi.lock, flags); 1461 sirmap = readl(master->regs + SIR_MAP_DEV_REG(data->ibi)); 1462 sirmap &= ~SIR_MAP_DEV_CONF_MASK(data->ibi); 1463 sirmap |= SIR_MAP_DEV_CONF(data->ibi, 1464 SIR_MAP_DEV_DA(I3C_BROADCAST_ADDR)); 1465 writel(sirmap, master->regs + SIR_MAP_DEV_REG(data->ibi)); 1466 spin_unlock_irqrestore(&master->ibi.lock, flags); 1467 } 1468 1469 return ret; 1470} 1471 1472static int cdns_i3c_master_request_ibi(struct i3c_dev_desc *dev, 1473 const struct i3c_ibi_setup *req) 1474{ 1475 struct i3c_master_controller *m = i3c_dev_get_master(dev); 1476 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 1477 struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev); 1478 unsigned long flags; 1479 unsigned int i; 1480 1481 data->ibi_pool = i3c_generic_ibi_alloc_pool(dev, req); 1482 if (IS_ERR(data->ibi_pool)) 1483 return PTR_ERR(data->ibi_pool); 1484 1485 spin_lock_irqsave(&master->ibi.lock, flags); 1486 for (i = 0; i < master->ibi.num_slots; i++) { 1487 if (!master->ibi.slots[i]) { 1488 data->ibi = i; 1489 master->ibi.slots[i] = dev; 1490 break; 1491 } 1492 } 1493 spin_unlock_irqrestore(&master->ibi.lock, flags); 1494 1495 if (i < master->ibi.num_slots) 1496 return 0; 1497 1498 i3c_generic_ibi_free_pool(data->ibi_pool); 1499 data->ibi_pool = NULL; 1500 1501 return -ENOSPC; 1502} 1503 1504static void cdns_i3c_master_free_ibi(struct i3c_dev_desc *dev) 1505{ 1506 struct i3c_master_controller *m = i3c_dev_get_master(dev); 1507 struct cdns_i3c_master *master = to_cdns_i3c_master(m); 1508 struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev); 1509 unsigned long flags; 1510 1511 spin_lock_irqsave(&master->ibi.lock, flags); 1512 master->ibi.slots[data->ibi] = NULL; 1513 data->ibi = -1; 1514 spin_unlock_irqrestore(&master->ibi.lock, flags); 1515 1516 i3c_generic_ibi_free_pool(data->ibi_pool); 1517} 1518 1519static void cdns_i3c_master_recycle_ibi_slot(struct i3c_dev_desc *dev, 1520 struct i3c_ibi_slot *slot) 1521{ 1522 struct cdns_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev); 1523 1524 i3c_generic_ibi_recycle_slot(data->ibi_pool, slot); 1525} 1526 1527static const struct i3c_master_controller_ops cdns_i3c_master_ops = { 1528 .bus_init = cdns_i3c_master_bus_init, 1529 .bus_cleanup = cdns_i3c_master_bus_cleanup, 1530 .do_daa = cdns_i3c_master_do_daa, 1531 .attach_i3c_dev = cdns_i3c_master_attach_i3c_dev, 1532 .reattach_i3c_dev = cdns_i3c_master_reattach_i3c_dev, 1533 .detach_i3c_dev = cdns_i3c_master_detach_i3c_dev, 1534 .attach_i2c_dev = cdns_i3c_master_attach_i2c_dev, 1535 .detach_i2c_dev = cdns_i3c_master_detach_i2c_dev, 1536 .supports_ccc_cmd = cdns_i3c_master_supports_ccc_cmd, 1537 .send_ccc_cmd = cdns_i3c_master_send_ccc_cmd, 1538 .priv_xfers = cdns_i3c_master_priv_xfers, 1539 .i2c_xfers = cdns_i3c_master_i2c_xfers, 1540 .enable_ibi = cdns_i3c_master_enable_ibi, 1541 .disable_ibi = cdns_i3c_master_disable_ibi, 1542 .request_ibi = cdns_i3c_master_request_ibi, 1543 .free_ibi = cdns_i3c_master_free_ibi, 1544 .recycle_ibi_slot = cdns_i3c_master_recycle_ibi_slot, 1545}; 1546 1547static void cdns_i3c_master_hj(struct work_struct *work) 1548{ 1549 struct cdns_i3c_master *master = container_of(work, 1550 struct cdns_i3c_master, 1551 hj_work); 1552 1553 i3c_master_do_daa(&master->base); 1554} 1555 1556static struct cdns_i3c_data cdns_i3c_devdata = { 1557 .thd_delay_ns = 10, 1558}; 1559 1560static const struct of_device_id cdns_i3c_master_of_ids[] = { 1561 { .compatible = "cdns,i3c-master", .data = &cdns_i3c_devdata }, 1562 { /* sentinel */ }, 1563}; 1564 1565static int cdns_i3c_master_probe(struct platform_device *pdev) 1566{ 1567 struct cdns_i3c_master *master; 1568 int ret, irq; 1569 u32 val; 1570 1571 master = devm_kzalloc(&pdev->dev, sizeof(*master), GFP_KERNEL); 1572 if (!master) 1573 return -ENOMEM; 1574 1575 master->devdata = of_device_get_match_data(&pdev->dev); 1576 if (!master->devdata) 1577 return -EINVAL; 1578 1579 master->regs = devm_platform_ioremap_resource(pdev, 0); 1580 if (IS_ERR(master->regs)) 1581 return PTR_ERR(master->regs); 1582 1583 master->pclk = devm_clk_get(&pdev->dev, "pclk"); 1584 if (IS_ERR(master->pclk)) 1585 return PTR_ERR(master->pclk); 1586 1587 master->sysclk = devm_clk_get(&pdev->dev, "sysclk"); 1588 if (IS_ERR(master->sysclk)) 1589 return PTR_ERR(master->sysclk); 1590 1591 irq = platform_get_irq(pdev, 0); 1592 if (irq < 0) 1593 return irq; 1594 1595 ret = clk_prepare_enable(master->pclk); 1596 if (ret) 1597 return ret; 1598 1599 ret = clk_prepare_enable(master->sysclk); 1600 if (ret) 1601 goto err_disable_pclk; 1602 1603 if (readl(master->regs + DEV_ID) != DEV_ID_I3C_MASTER) { 1604 ret = -EINVAL; 1605 goto err_disable_sysclk; 1606 } 1607 1608 spin_lock_init(&master->xferqueue.lock); 1609 INIT_LIST_HEAD(&master->xferqueue.list); 1610 1611 INIT_WORK(&master->hj_work, cdns_i3c_master_hj); 1612 writel(0xffffffff, master->regs + MST_IDR); 1613 writel(0xffffffff, master->regs + SLV_IDR); 1614 ret = devm_request_irq(&pdev->dev, irq, cdns_i3c_master_interrupt, 0, 1615 dev_name(&pdev->dev), master); 1616 if (ret) 1617 goto err_disable_sysclk; 1618 1619 platform_set_drvdata(pdev, master); 1620 1621 val = readl(master->regs + CONF_STATUS0); 1622 1623 /* Device ID0 is reserved to describe this master. */ 1624 master->maxdevs = CONF_STATUS0_DEVS_NUM(val); 1625 master->free_rr_slots = GENMASK(master->maxdevs, 1); 1626 master->caps.ibirfifodepth = CONF_STATUS0_IBIR_DEPTH(val); 1627 master->caps.cmdrfifodepth = CONF_STATUS0_CMDR_DEPTH(val); 1628 1629 val = readl(master->regs + CONF_STATUS1); 1630 master->caps.cmdfifodepth = CONF_STATUS1_CMD_DEPTH(val); 1631 master->caps.rxfifodepth = CONF_STATUS1_RX_DEPTH(val); 1632 master->caps.txfifodepth = CONF_STATUS1_TX_DEPTH(val); 1633 1634 spin_lock_init(&master->ibi.lock); 1635 master->ibi.num_slots = CONF_STATUS1_IBI_HW_RES(val); 1636 master->ibi.slots = devm_kcalloc(&pdev->dev, master->ibi.num_slots, 1637 sizeof(*master->ibi.slots), 1638 GFP_KERNEL); 1639 if (!master->ibi.slots) { 1640 ret = -ENOMEM; 1641 goto err_disable_sysclk; 1642 } 1643 1644 writel(IBIR_THR(1), master->regs + CMD_IBI_THR_CTRL); 1645 writel(MST_INT_IBIR_THR, master->regs + MST_IER); 1646 writel(DEVS_CTRL_DEV_CLR_ALL, master->regs + DEVS_CTRL); 1647 1648 ret = i3c_master_register(&master->base, &pdev->dev, 1649 &cdns_i3c_master_ops, false); 1650 if (ret) 1651 goto err_disable_sysclk; 1652 1653 return 0; 1654 1655err_disable_sysclk: 1656 clk_disable_unprepare(master->sysclk); 1657 1658err_disable_pclk: 1659 clk_disable_unprepare(master->pclk); 1660 1661 return ret; 1662} 1663 1664static int cdns_i3c_master_remove(struct platform_device *pdev) 1665{ 1666 struct cdns_i3c_master *master = platform_get_drvdata(pdev); 1667 int ret; 1668 1669 ret = i3c_master_unregister(&master->base); 1670 if (ret) 1671 return ret; 1672 1673 clk_disable_unprepare(master->sysclk); 1674 clk_disable_unprepare(master->pclk); 1675 1676 return 0; 1677} 1678 1679static struct platform_driver cdns_i3c_master = { 1680 .probe = cdns_i3c_master_probe, 1681 .remove = cdns_i3c_master_remove, 1682 .driver = { 1683 .name = "cdns-i3c-master", 1684 .of_match_table = cdns_i3c_master_of_ids, 1685 }, 1686}; 1687module_platform_driver(cdns_i3c_master); 1688 1689MODULE_AUTHOR("Boris Brezillon <boris.brezillon@bootlin.com>"); 1690MODULE_DESCRIPTION("Cadence I3C master driver"); 1691MODULE_LICENSE("GPL v2"); 1692MODULE_ALIAS("platform:cdns-i3c-master"); 1693