Skip to content

Commit 25bc99b

Browse files
nxpfranklialexandrebelloni
authored andcommitted
i3c: master: svc: Modify enabled_events bit 7:0 to act as IBI enable counter
Fix issue where disabling IBI on one device disables the entire IBI interrupt. Modify bit 7:0 of enabled_events to serve as an IBI enable counter, ensuring that the system IBI interrupt is disabled only when all I3C devices have IBI disabled. Cc: stable@kernel.org Fixes: 7ff730c ("i3c: master: svc: enable the interrupt in the enable ibi function") Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> Signed-off-by: Frank Li <Frank.Li@nxp.com> Link: https://lore.kernel.org/r/20241101165002.2479794-1-Frank.Li@nxp.com Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
1 parent f6ca730 commit 25bc99b

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

drivers/i3c/master/svc-i3c-master.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@
130130
#define SVC_I3C_PPBAUD_MAX 15
131131
#define SVC_I3C_QUICK_I2C_CLK 4170000
132132

133-
#define SVC_I3C_EVENT_IBI BIT(0)
134-
#define SVC_I3C_EVENT_HOTJOIN BIT(1)
133+
#define SVC_I3C_EVENT_IBI GENMASK(7, 0)
134+
#define SVC_I3C_EVENT_HOTJOIN BIT(31)
135135

136136
struct svc_i3c_cmd {
137137
u8 addr;
@@ -214,7 +214,7 @@ struct svc_i3c_master {
214214
spinlock_t lock;
215215
} ibi;
216216
struct mutex lock;
217-
int enabled_events;
217+
u32 enabled_events;
218218
u32 mctrl_config;
219219
};
220220

@@ -1688,7 +1688,7 @@ static int svc_i3c_master_enable_ibi(struct i3c_dev_desc *dev)
16881688
return ret;
16891689
}
16901690

1691-
master->enabled_events |= SVC_I3C_EVENT_IBI;
1691+
master->enabled_events++;
16921692
svc_i3c_master_enable_interrupts(master, SVC_I3C_MINT_SLVSTART);
16931693

16941694
return i3c_master_enec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR);
@@ -1700,7 +1700,7 @@ static int svc_i3c_master_disable_ibi(struct i3c_dev_desc *dev)
17001700
struct svc_i3c_master *master = to_svc_i3c_master(m);
17011701
int ret;
17021702

1703-
master->enabled_events &= ~SVC_I3C_EVENT_IBI;
1703+
master->enabled_events--;
17041704
if (!master->enabled_events)
17051705
svc_i3c_master_disable_interrupts(master);
17061706

0 commit comments

Comments
 (0)