Commit 25bc99be authored by Frank Li's avatar Frank Li Committed by Alexandre Belloni
Browse files

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: 7ff730ca ("i3c: master: svc: enable the interrupt in the enable ibi function")
Reviewed-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: default avatarFrank Li <Frank.Li@nxp.com>
Link: https://lore.kernel.org/r/20241101165002.2479794-1-Frank.Li@nxp.com


Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
parent f6ca7306
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -130,8 +130,8 @@
#define SVC_I3C_PPBAUD_MAX 15
#define SVC_I3C_QUICK_I2C_CLK 4170000

#define SVC_I3C_EVENT_IBI	BIT(0)
#define SVC_I3C_EVENT_HOTJOIN	BIT(1)
#define SVC_I3C_EVENT_IBI	GENMASK(7, 0)
#define SVC_I3C_EVENT_HOTJOIN	BIT(31)

struct svc_i3c_cmd {
	u8 addr;
@@ -214,7 +214,7 @@ struct svc_i3c_master {
		spinlock_t lock;
	} ibi;
	struct mutex lock;
	int enabled_events;
	u32 enabled_events;
	u32 mctrl_config;
};

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

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

	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)
	struct svc_i3c_master *master = to_svc_i3c_master(m);
	int ret;

	master->enabled_events &= ~SVC_I3C_EVENT_IBI;
	master->enabled_events--;
	if (!master->enabled_events)
		svc_i3c_master_disable_interrupts(master);