@@ -300,7 +300,14 @@ static void dw_i3c_master_disable(struct dw_i3c_master *master)
300300
301301static 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+
524557static 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