Skip to content

Commit 1df7752

Browse files
committed
Merge tag 'i3c/for-6.15' of git://git.kernel.org/pub/scm/linux/kernel/git/i3c/linux
Pull i3c updates from Alexandre Belloni: "The silvaco driver gets support for the integration of the IP in the Nuvoton npcm845 SoC. There is also a fix for a possible NULL pointer dereference that can happen with early IBIs. Summary: Core: - Fix a possible NULL pointer dereference due to IBI coming when the target driver is not yet probed. Drivers: - mipi-i3c-hci: Use I2C DMA-safe api - svc: add Nuvoton npcm845 support" * tag 'i3c/for-6.15' of git://git.kernel.org/pub/scm/linux/kernel/git/i3c/linux: i3c: Add NULL pointer check in i3c_master_queue_ibi() i3c: master: Drop duplicate check before calling OF APIs i3c: master: svc: Fix implicit fallthrough in svc_i3c_master_ibi_work() i3c: master: svc: Fix missing STOP for master request i3c: master: svc: Use readsb helper for reading MDB i3c: master: svc: Fix missing the IBI rules i3c: master: svc: Fix i3c_master_get_free_addr return check i3c: master: svc: Fix npcm845 DAA process corruption i3c: master: svc: Fix npcm845 invalid slvstart event i3c: master: svc: Fix npcm845 FIFO empty issue i3c: master: svc: Add support for Nuvoton npcm845 i3c dt-bindings: i3c: silvaco: Add npcm845 compatible string dt-bindings: i3c: dw: Add power-domains i3c: master: svc: Flush FIFO before sending Dynamic Address Assignment(DAA) i3c: mipi-i3c-hci: Use I2C DMA-safe api i3c: Remove the const qualifier from i2c_msg pointer in i2c_xfers API MAINTAINERS: Add Frank Li to Silvaco I3C MAINTAINERS: Remove Conor Culhane from Silvaco I3C
2 parents 696c45b + bd496a4 commit 1df7752

File tree

10 files changed

+154
-36
lines changed

10 files changed

+154
-36
lines changed

CREDITS

+4
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,10 @@ N: John Crispin
855855
856856
D: MediaTek MT7623 Gigabit ethernet support
857857

858+
N: Conor Culhane
859+
860+
D: Silvaco I3C master driver
861+
858862
N: Laurence Culhane
859863
860864
D: Wrote the initial alpha SLIP code

Documentation/devicetree/bindings/i3c/silvaco,i3c-master.yaml

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ allOf:
1414

1515
properties:
1616
compatible:
17-
const: silvaco,i3c-master-v1
17+
enum:
18+
- nuvoton,npcm845-i3c
19+
- silvaco,i3c-master-v1
1820

1921
reg:
2022
maxItems: 1

Documentation/devicetree/bindings/i3c/snps,dw-i3c-master.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ properties:
3434
interrupts:
3535
maxItems: 1
3636

37+
power-domains:
38+
maxItems: 1
39+
3740
required:
3841
- compatible
3942
- reg

MAINTAINERS

+3-1
Original file line numberDiff line numberDiff line change
@@ -11265,6 +11265,7 @@ F: drivers/i3c/master/dw*
1126511265

1126611266
I3C SUBSYSTEM
1126711267
M: Alexandre Belloni <[email protected]>
11268+
R: Frank Li <[email protected]>
1126811269
L: [email protected] (moderated for non-subscribers)
1126911270
S: Maintained
1127011271
C: irc://chat.freenode.net/linux-i3c
@@ -22106,8 +22107,9 @@ F: drivers/video/fbdev/sm712*
2210622107

2210722108
SILVACO I3C DUAL-ROLE MASTER
2210822109
M: Miquel Raynal <[email protected]>
22109-
M: Conor Culhane <conor.culhane@silvaco.com>
22110+
M: Frank Li <Frank.Li@nxp.com>
2211022111
L: [email protected] (moderated for non-subscribers)
22112+
2211122113
S: Maintained
2211222114
F: Documentation/devicetree/bindings/i3c/silvaco,i3c-master.yaml
2211322115
F: drivers/i3c/master/svc-i3c-master.c

drivers/i3c/master.c

+9-12
Original file line numberDiff line numberDiff line change
@@ -2276,7 +2276,7 @@ static int of_i3c_master_add_dev(struct i3c_master_controller *master,
22762276
u32 reg[3];
22772277
int ret;
22782278

2279-
if (!master || !node)
2279+
if (!master)
22802280
return -EINVAL;
22812281

22822282
ret = of_property_read_u32_array(node, "reg", reg, ARRAY_SIZE(reg));
@@ -2369,14 +2369,10 @@ static u8 i3c_master_i2c_get_lvr(struct i2c_client *client)
23692369
{
23702370
/* Fall back to no spike filters and FM bus mode. */
23712371
u8 lvr = I3C_LVR_I2C_INDEX(2) | I3C_LVR_I2C_FM_MODE;
2372+
u32 reg[3];
23722373

2373-
if (client->dev.of_node) {
2374-
u32 reg[3];
2375-
2376-
if (!of_property_read_u32_array(client->dev.of_node, "reg",
2377-
reg, ARRAY_SIZE(reg)))
2378-
lvr = reg[2];
2379-
}
2374+
if (!of_property_read_u32_array(client->dev.of_node, "reg", reg, ARRAY_SIZE(reg)))
2375+
lvr = reg[2];
23802376

23812377
return lvr;
23822378
}
@@ -2486,7 +2482,7 @@ static int i3c_master_i2c_adapter_init(struct i3c_master_controller *master)
24862482
struct i2c_adapter *adap = i3c_master_to_i2c_adapter(master);
24872483
struct i2c_dev_desc *i2cdev;
24882484
struct i2c_dev_boardinfo *i2cboardinfo;
2489-
int ret, id = -ENODEV;
2485+
int ret, id;
24902486

24912487
adap->dev.parent = master->dev.parent;
24922488
adap->owner = master->dev.parent->driver->owner;
@@ -2497,9 +2493,7 @@ static int i3c_master_i2c_adapter_init(struct i3c_master_controller *master)
24972493
adap->timeout = 1000;
24982494
adap->retries = 3;
24992495

2500-
if (master->dev.of_node)
2501-
id = of_alias_get_id(master->dev.of_node, "i2c");
2502-
2496+
id = of_alias_get_id(master->dev.of_node, "i2c");
25032497
if (id >= 0) {
25042498
adap->nr = id;
25052499
ret = i2c_add_numbered_adapter(adap);
@@ -2561,6 +2555,9 @@ static void i3c_master_unregister_i3c_devs(struct i3c_master_controller *master)
25612555
*/
25622556
void i3c_master_queue_ibi(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot)
25632557
{
2558+
if (!dev->ibi || !slot)
2559+
return;
2560+
25642561
atomic_inc(&dev->ibi->pending_ibis);
25652562
queue_work(dev->ibi->wq, &slot->work);
25662563
}

drivers/i3c/master/dw-i3c-master.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ static void dw_i3c_master_detach_i3c_dev(struct i3c_dev_desc *dev)
10791079
}
10801080

10811081
static int dw_i3c_master_i2c_xfers(struct i2c_dev_desc *dev,
1082-
const struct i2c_msg *i2c_xfers,
1082+
struct i2c_msg *i2c_xfers,
10831083
int i2c_nxfers)
10841084
{
10851085
struct dw_i3c_i2c_dev_data *data = i2c_dev_get_master_data(dev);

drivers/i3c/master/i3c-master-cdns.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,7 @@ static int cdns_i3c_master_priv_xfers(struct i3c_dev_desc *dev,
813813
}
814814

815815
static int cdns_i3c_master_i2c_xfers(struct i2c_dev_desc *dev,
816-
const struct i2c_msg *xfers, int nxfers)
816+
struct i2c_msg *xfers, int nxfers)
817817
{
818818
struct i3c_master_controller *m = i2c_dev_get_master(dev);
819819
struct cdns_i3c_master *master = to_cdns_i3c_master(m);

drivers/i3c/master/mipi-i3c-hci/core.c

+4-6
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ static int i3c_hci_priv_xfers(struct i3c_dev_desc *dev,
367367
}
368368

369369
static int i3c_hci_i2c_xfers(struct i2c_dev_desc *dev,
370-
const struct i2c_msg *i2c_xfers, int nxfers)
370+
struct i2c_msg *i2c_xfers, int nxfers)
371371
{
372372
struct i3c_master_controller *m = i2c_dev_get_master(dev);
373373
struct i3c_hci *hci = to_i3c_hci(m);
@@ -382,14 +382,11 @@ static int i3c_hci_i2c_xfers(struct i2c_dev_desc *dev,
382382
return -ENOMEM;
383383

384384
for (i = 0; i < nxfers; i++) {
385-
xfer[i].data = i2c_xfers[i].buf;
385+
xfer[i].data = i2c_get_dma_safe_msg_buf(&i2c_xfers[i], 1);
386386
xfer[i].data_len = i2c_xfers[i].len;
387387
xfer[i].rnw = i2c_xfers[i].flags & I2C_M_RD;
388388
hci->cmd->prep_i2c_xfer(hci, dev, &xfer[i]);
389389
xfer[i].cmd_desc[0] |= CMD_0_ROC;
390-
ret = i3c_hci_alloc_safe_xfer_buf(hci, &xfer[i]);
391-
if (ret)
392-
goto out;
393390
}
394391
last = i - 1;
395392
xfer[last].cmd_desc[0] |= CMD_0_TOC;
@@ -412,7 +409,8 @@ static int i3c_hci_i2c_xfers(struct i2c_dev_desc *dev,
412409

413410
out:
414411
for (i = 0; i < nxfers; i++)
415-
i3c_hci_free_safe_xfer_buf(hci, &xfer[i]);
412+
i2c_put_dma_safe_msg_buf(xfer[i].data, &i2c_xfers[i],
413+
ret ? false : true);
416414

417415
hci_free_xfer(xfer, nxfers);
418416
return ret;

0 commit comments

Comments
 (0)