Skip to content

Commit 47c9b85

Browse files
committed
i3c_controller: non-sticky interrupt pending
Set interrupt pending on source signal rising edge, to allow clearing it and then resolving, e.g.: static irqreturn_t adi_i3c_controller_irq(int irq, void *data) { struct adi_i3c_controller *controller = data; u32 pending; pending = readl_relaxed(controller->regs + REG_IRQ_PENDING); writel_relaxed(pending, controller->regs + REG_IRQ_PENDING); if (pending & IRQ_PENDING_CMDR_PENDING) { spin_lock(&controller->xferqueue.lock); adi_i3c_controller_end_xfer_locked(controller, pending); spin_unlock(&controller->xferqueue.lock); } if (pending & IRQ_PENDING_IBI_PENDING) adi_i3c_controller_demux_ibis(controller); if (pending & IRQ_PENDING_DAA_PENDING) adi_i3c_controller_handle_da_req(controller); return IRQ_HANDLED; } Signed-off-by: Jorge Marques <[email protected]>
1 parent 28f6322 commit 47c9b85

File tree

1 file changed

+10
-14
lines changed

1 file changed

+10
-14
lines changed

library/i3c_controller/i3c_controller_host_interface/i3c_controller_regmap.v

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,12 @@ module i3c_controller_regmap #(
126126
reg up_wack_ff = 1'b0;
127127
reg up_rack_ff = 1'b0;
128128

129-
// Holds DAA trigger High until sdo_fifo_empty goes Low,
130-
// meaning DA got written.
131-
reg daa_trigger_lock;
132-
133-
reg daa_pending;
129+
reg cmdr_fifo_valid_r;
130+
reg ibi_fifo_valid_r;
131+
reg daa_trigger_r;
134132
reg cmdr_pending;
135133
reg ibi_pending;
134+
reg daa_pending;
136135

137136
reg [`I3C_REGMAP_IRQ_WIDTH:0] up_irq_mask = 8'h0;
138137
reg [6:0] ops;
@@ -522,37 +521,34 @@ module i3c_controller_regmap #(
522521

523522
always @(posedge s_axi_aclk) begin
524523
if (up_sw_resetn == 1'b0) begin
525-
daa_trigger_lock <= 1'b0;
526524
daa_pending <= 1'b0;
527525
cmdr_pending <= 1'b0;
528526
ibi_pending <= 1'b0;
529527
end else begin
530-
if (cmdr_fifo_valid == 1'b1) begin
528+
if (cmdr_fifo_valid == 1'b1 && cmdr_fifo_valid_r == 1'b0) begin
531529
cmdr_pending <= 1'b1;
532530
end else if (up_wreq_s == 1'b1 &&
533531
up_waddr_s[7:0] == `I3C_REGMAP_IRQ_PENDING &&
534532
up_wdata_s[`I3C_REGMAP_IRQ_CMDR_PENDING] == 1'b1) begin
535533
cmdr_pending <= 1'b0;
536534
end
537-
if (ibi_fifo_valid == 1'b1) begin
535+
if (ibi_fifo_valid == 1'b1 && ibi_fifo_valid_r == 1'b0) begin
538536
ibi_pending <= 1'b1;
539537
end else if (up_wreq_s == 1'b1 &&
540538
up_waddr_s[7:0] == `I3C_REGMAP_IRQ_PENDING &&
541539
up_wdata_s[`I3C_REGMAP_IRQ_IBI_PENDING] == 1'b1) begin
542540
ibi_pending <= 1'b0;
543541
end
544-
if (daa_trigger_lock == 1'b1) begin
542+
if (daa_trigger == 1'b1 && daa_trigger_r == 1'b0) begin
545543
daa_pending <= 1'b1;
546544
end else if (up_wreq_s == 1'b1 &&
547545
up_waddr_s[7:0] == `I3C_REGMAP_IRQ_PENDING &&
548546
up_wdata_s[`I3C_REGMAP_IRQ_DAA_PENDING] == 1'b1) begin
549547
daa_pending <= 1'b0;
550548
end
551-
if (daa_trigger) begin
552-
daa_trigger_lock <= 1'b1;
553-
end else if (sdo_valid_w) begin
554-
daa_trigger_lock <= 1'b0;
555-
end
549+
cmdr_fifo_valid_r <= cmdr_fifo_valid;
550+
ibi_fifo_valid_r <= ibi_fifo_valid;
551+
daa_trigger_r <= daa_trigger;
556552
end
557553
end
558554

0 commit comments

Comments
 (0)