Skip to content

Commit effd217

Browse files
Aniketalexandrebelloni
authored andcommitted
i3c: dw: Add some functions for reusability
Separate logic for setting intr/thld registers in a func. Also modify enable function to take care of setting all fields in DEVICE_CTRL. These functions can be reused later for power management. Signed-off-by: Aniket <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexandre Belloni <[email protected]>
1 parent 4e89bc4 commit effd217

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

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

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,14 @@ static void dw_i3c_master_disable(struct dw_i3c_master *master)
300300

301301
static void dw_i3c_master_enable(struct dw_i3c_master *master)
302302
{
303-
writel(readl(master->regs + DEVICE_CTRL) | DEV_CTRL_ENABLE,
303+
u32 dev_ctrl;
304+
305+
dev_ctrl = readl(master->regs + DEVICE_CTRL);
306+
/* For now don't support Hot-Join */
307+
dev_ctrl |= DEV_CTRL_HOT_JOIN_NACK;
308+
if (master->i2c_slv_prsnt)
309+
dev_ctrl |= DEV_CTRL_I2C_SLAVE_PRESENT;
310+
writel(dev_ctrl | DEV_CTRL_ENABLE,
304311
master->regs + DEVICE_CTRL);
305312
}
306313

@@ -521,6 +528,32 @@ static void dw_i3c_master_end_xfer_locked(struct dw_i3c_master *master, u32 isr)
521528
dw_i3c_master_start_xfer_locked(master);
522529
}
523530

531+
static void dw_i3c_master_set_intr_regs(struct dw_i3c_master *master)
532+
{
533+
u32 thld_ctrl;
534+
535+
thld_ctrl = readl(master->regs + QUEUE_THLD_CTRL);
536+
thld_ctrl &= ~(QUEUE_THLD_CTRL_RESP_BUF_MASK |
537+
QUEUE_THLD_CTRL_IBI_STAT_MASK |
538+
QUEUE_THLD_CTRL_IBI_DATA_MASK);
539+
thld_ctrl |= QUEUE_THLD_CTRL_IBI_STAT(1) |
540+
QUEUE_THLD_CTRL_IBI_DATA(31);
541+
writel(thld_ctrl, master->regs + QUEUE_THLD_CTRL);
542+
543+
thld_ctrl = readl(master->regs + DATA_BUFFER_THLD_CTRL);
544+
thld_ctrl &= ~DATA_BUFFER_THLD_CTRL_RX_BUF;
545+
writel(thld_ctrl, master->regs + DATA_BUFFER_THLD_CTRL);
546+
547+
writel(INTR_ALL, master->regs + INTR_STATUS);
548+
writel(INTR_MASTER_MASK, master->regs + INTR_STATUS_EN);
549+
writel(INTR_MASTER_MASK, master->regs + INTR_SIGNAL_EN);
550+
551+
master->sir_rej_mask = IBI_REQ_REJECT_ALL;
552+
writel(master->sir_rej_mask, master->regs + IBI_SIR_REQ_REJECT);
553+
554+
writel(IBI_REQ_REJECT_ALL, master->regs + IBI_MR_REQ_REJECT);
555+
}
556+
524557
static int dw_i3c_clk_cfg(struct dw_i3c_master *master)
525558
{
526559
unsigned long core_rate, core_period;
@@ -615,7 +648,6 @@ static int dw_i3c_master_bus_init(struct i3c_master_controller *m)
615648
struct dw_i3c_master *master = to_dw_i3c_master(m);
616649
struct i3c_bus *bus = i3c_master_get_bus(m);
617650
struct i3c_device_info info = { };
618-
u32 thld_ctrl;
619651
int ret;
620652

621653
ret = master->platform_ops->init(master);
@@ -638,22 +670,6 @@ static int dw_i3c_master_bus_init(struct i3c_master_controller *m)
638670
return -EINVAL;
639671
}
640672

641-
thld_ctrl = readl(master->regs + QUEUE_THLD_CTRL);
642-
thld_ctrl &= ~(QUEUE_THLD_CTRL_RESP_BUF_MASK |
643-
QUEUE_THLD_CTRL_IBI_STAT_MASK |
644-
QUEUE_THLD_CTRL_IBI_DATA_MASK);
645-
thld_ctrl |= QUEUE_THLD_CTRL_IBI_STAT(1) |
646-
QUEUE_THLD_CTRL_IBI_DATA(31);
647-
writel(thld_ctrl, master->regs + QUEUE_THLD_CTRL);
648-
649-
thld_ctrl = readl(master->regs + DATA_BUFFER_THLD_CTRL);
650-
thld_ctrl &= ~DATA_BUFFER_THLD_CTRL_RX_BUF;
651-
writel(thld_ctrl, master->regs + DATA_BUFFER_THLD_CTRL);
652-
653-
writel(INTR_ALL, master->regs + INTR_STATUS);
654-
writel(INTR_MASTER_MASK, master->regs + INTR_STATUS_EN);
655-
writel(INTR_MASTER_MASK, master->regs + INTR_SIGNAL_EN);
656-
657673
ret = i3c_master_get_free_addr(m, 0);
658674
if (ret < 0)
659675
return ret;
@@ -668,15 +684,7 @@ static int dw_i3c_master_bus_init(struct i3c_master_controller *m)
668684
if (ret)
669685
return ret;
670686

671-
master->sir_rej_mask = IBI_REQ_REJECT_ALL;
672-
writel(master->sir_rej_mask, master->regs + IBI_SIR_REQ_REJECT);
673-
674-
writel(IBI_REQ_REJECT_ALL, master->regs + IBI_MR_REQ_REJECT);
675-
676-
/* For now don't support Hot-Join */
677-
writel(readl(master->regs + DEVICE_CTRL) | DEV_CTRL_HOT_JOIN_NACK,
678-
master->regs + DEVICE_CTRL);
679-
687+
dw_i3c_master_set_intr_regs(master);
680688
dw_i3c_master_enable(master);
681689

682690
return 0;

0 commit comments

Comments
 (0)