17
17
* Copyright (C) 2008 Darius Augulis <darius.augulis at teltonika.lt>
18
18
*
19
19
* Copyright 2013 Freescale Semiconductor, Inc.
20
+ * Copyright 2020 NXP
20
21
*
21
22
*/
22
23
73
74
#define IMX_I2C_I2SR 0x03 /* i2c status */
74
75
#define IMX_I2C_I2DR 0x04 /* i2c transfer data */
75
76
77
+ /*
78
+ * All of the layerscape series SoCs support IBIC register.
79
+ */
80
+ #define IMX_I2C_IBIC 0x05 /* i2c bus interrupt config */
81
+
76
82
#define IMX_I2C_REGSHIFT 2
77
83
#define VF610_I2C_REGSHIFT 0
78
84
91
97
#define I2CR_MSTA 0x20
92
98
#define I2CR_IIEN 0x40
93
99
#define I2CR_IEN 0x80
100
+ #define IBIC_BIIE 0x80 /* Bus idle interrupt enable */
94
101
95
102
/* register bits different operating codes definition:
96
103
* 1) I2SR: Interrupt flags clear operation differ between SoCs:
@@ -201,6 +208,7 @@ struct imx_i2c_struct {
201
208
struct pinctrl_state * pinctrl_pins_gpio ;
202
209
203
210
struct imx_i2c_dma * dma ;
211
+ struct i2c_client * slave ;
204
212
};
205
213
206
214
static const struct imx_i2c_hwdata imx1_i2c_hwdata = {
@@ -252,6 +260,11 @@ static inline int is_imx1_i2c(struct imx_i2c_struct *i2c_imx)
252
260
return i2c_imx -> hwdata -> devtype == IMX1_I2C ;
253
261
}
254
262
263
+ static inline int is_vf610_i2c (struct imx_i2c_struct * i2c_imx )
264
+ {
265
+ return i2c_imx -> hwdata -> devtype == VF610_I2C ;
266
+ }
267
+
255
268
static inline void imx_i2c_write_reg (unsigned int val ,
256
269
struct imx_i2c_struct * i2c_imx , unsigned int reg )
257
270
{
@@ -264,6 +277,27 @@ static inline unsigned char imx_i2c_read_reg(struct imx_i2c_struct *i2c_imx,
264
277
return readb (i2c_imx -> base + (reg << i2c_imx -> hwdata -> regshift ));
265
278
}
266
279
280
+ static void i2c_imx_clear_irq (struct imx_i2c_struct * i2c_imx , unsigned int bits )
281
+ {
282
+ unsigned int temp ;
283
+
284
+ /*
285
+ * i2sr_clr_opcode is the value to clear all interrupts. Here we want to
286
+ * clear only <bits>, so we write ~i2sr_clr_opcode with just <bits>
287
+ * toggled. This is required because i.MX needs W0C and Vybrid uses W1C.
288
+ */
289
+ temp = ~i2c_imx -> hwdata -> i2sr_clr_opcode ^ bits ;
290
+ imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2SR );
291
+ }
292
+
293
+ /* Set up i2c controller register and i2c status register to default value. */
294
+ static void i2c_imx_reset_regs (struct imx_i2c_struct * i2c_imx )
295
+ {
296
+ imx_i2c_write_reg (i2c_imx -> hwdata -> i2cr_ien_opcode ^ I2CR_IEN ,
297
+ i2c_imx , IMX_I2C_I2CR );
298
+ i2c_imx_clear_irq (i2c_imx , I2SR_IIF | I2SR_IAL );
299
+ }
300
+
267
301
/* Functions for DMA support */
268
302
static void i2c_imx_dma_request (struct imx_i2c_struct * i2c_imx ,
269
303
dma_addr_t phy_addr )
@@ -399,19 +433,6 @@ static void i2c_imx_dma_free(struct imx_i2c_struct *i2c_imx)
399
433
dma -> chan_using = NULL ;
400
434
}
401
435
402
- static void i2c_imx_clear_irq (struct imx_i2c_struct * i2c_imx , unsigned int bits )
403
- {
404
- unsigned int temp ;
405
-
406
- /*
407
- * i2sr_clr_opcode is the value to clear all interrupts. Here we want to
408
- * clear only <bits>, so we write ~i2sr_clr_opcode with just <bits>
409
- * toggled. This is required because i.MX needs W0C and Vybrid uses W1C.
410
- */
411
- temp = ~i2c_imx -> hwdata -> i2sr_clr_opcode ^ bits ;
412
- imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2SR );
413
- }
414
-
415
436
static int i2c_imx_bus_busy (struct imx_i2c_struct * i2c_imx , int for_busy , bool atomic )
416
437
{
417
438
unsigned long orig_jiffies = jiffies ;
@@ -625,18 +646,165 @@ static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx, bool atomic)
625
646
imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2CR );
626
647
}
627
648
649
+ /*
650
+ * Enable bus idle interrupts
651
+ * Note: IBIC register will be cleared after disabled i2c module.
652
+ * All of layerscape series SoCs support IBIC register.
653
+ */
654
+ static void i2c_imx_enable_bus_idle (struct imx_i2c_struct * i2c_imx )
655
+ {
656
+ if (is_vf610_i2c (i2c_imx )) {
657
+ unsigned int temp ;
658
+
659
+ temp = imx_i2c_read_reg (i2c_imx , IMX_I2C_IBIC );
660
+ temp |= IBIC_BIIE ;
661
+ imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_IBIC );
662
+ }
663
+ }
664
+
665
+ static irqreturn_t i2c_imx_slave_isr (struct imx_i2c_struct * i2c_imx ,
666
+ unsigned int status , unsigned int ctl )
667
+ {
668
+ u8 value ;
669
+
670
+ if (status & I2SR_IAL ) { /* Arbitration lost */
671
+ i2c_imx_clear_irq (i2c_imx , I2SR_IAL );
672
+ if (!(status & I2SR_IAAS ))
673
+ return IRQ_HANDLED ;
674
+ }
675
+
676
+ if (status & I2SR_IAAS ) { /* Addressed as a slave */
677
+ if (status & I2SR_SRW ) { /* Master wants to read from us*/
678
+ dev_dbg (& i2c_imx -> adapter .dev , "read requested" );
679
+ i2c_slave_event (i2c_imx -> slave , I2C_SLAVE_READ_REQUESTED , & value );
680
+
681
+ /* Slave transmit */
682
+ ctl |= I2CR_MTX ;
683
+ imx_i2c_write_reg (ctl , i2c_imx , IMX_I2C_I2CR );
684
+
685
+ /* Send data */
686
+ imx_i2c_write_reg (value , i2c_imx , IMX_I2C_I2DR );
687
+ } else { /* Master wants to write to us */
688
+ dev_dbg (& i2c_imx -> adapter .dev , "write requested" );
689
+ i2c_slave_event (i2c_imx -> slave , I2C_SLAVE_WRITE_REQUESTED , & value );
690
+
691
+ /* Slave receive */
692
+ ctl &= ~I2CR_MTX ;
693
+ imx_i2c_write_reg (ctl , i2c_imx , IMX_I2C_I2CR );
694
+ /* Dummy read */
695
+ imx_i2c_read_reg (i2c_imx , IMX_I2C_I2DR );
696
+ }
697
+ } else if (!(ctl & I2CR_MTX )) { /* Receive mode */
698
+ if (status & I2SR_IBB ) { /* No STOP signal detected */
699
+ value = imx_i2c_read_reg (i2c_imx , IMX_I2C_I2DR );
700
+ i2c_slave_event (i2c_imx -> slave , I2C_SLAVE_WRITE_RECEIVED , & value );
701
+ } else { /* STOP signal is detected */
702
+ dev_dbg (& i2c_imx -> adapter .dev ,
703
+ "STOP signal detected" );
704
+ i2c_slave_event (i2c_imx -> slave , I2C_SLAVE_STOP , & value );
705
+ }
706
+ } else if (!(status & I2SR_RXAK )) { /* Transmit mode received ACK */
707
+ ctl |= I2CR_MTX ;
708
+ imx_i2c_write_reg (ctl , i2c_imx , IMX_I2C_I2CR );
709
+
710
+ i2c_slave_event (i2c_imx -> slave , I2C_SLAVE_READ_PROCESSED , & value );
711
+
712
+ imx_i2c_write_reg (value , i2c_imx , IMX_I2C_I2DR );
713
+ } else { /* Transmit mode received NAK */
714
+ ctl &= ~I2CR_MTX ;
715
+ imx_i2c_write_reg (ctl , i2c_imx , IMX_I2C_I2CR );
716
+ imx_i2c_read_reg (i2c_imx , IMX_I2C_I2DR );
717
+ }
718
+
719
+ return IRQ_HANDLED ;
720
+ }
721
+
722
+ static void i2c_imx_slave_init (struct imx_i2c_struct * i2c_imx )
723
+ {
724
+ int temp ;
725
+
726
+ /* Set slave addr. */
727
+ imx_i2c_write_reg ((i2c_imx -> slave -> addr << 1 ), i2c_imx , IMX_I2C_IADR );
728
+
729
+ i2c_imx_reset_regs (i2c_imx );
730
+
731
+ /* Enable module */
732
+ temp = i2c_imx -> hwdata -> i2cr_ien_opcode ;
733
+ imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2CR );
734
+
735
+ /* Enable interrupt from i2c module */
736
+ temp |= I2CR_IIEN ;
737
+ imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2CR );
738
+
739
+ i2c_imx_enable_bus_idle (i2c_imx );
740
+ }
741
+
742
+ static int i2c_imx_reg_slave (struct i2c_client * client )
743
+ {
744
+ struct imx_i2c_struct * i2c_imx = i2c_get_adapdata (client -> adapter );
745
+ int ret ;
746
+
747
+ if (i2c_imx -> slave )
748
+ return - EBUSY ;
749
+
750
+ i2c_imx -> slave = client ;
751
+
752
+ /* Resume */
753
+ ret = pm_runtime_get_sync (i2c_imx -> adapter .dev .parent );
754
+ if (ret < 0 ) {
755
+ dev_err (& i2c_imx -> adapter .dev , "failed to resume i2c controller" );
756
+ return ret ;
757
+ }
758
+
759
+ i2c_imx_slave_init (i2c_imx );
760
+
761
+ return 0 ;
762
+ }
763
+
764
+ static int i2c_imx_unreg_slave (struct i2c_client * client )
765
+ {
766
+ struct imx_i2c_struct * i2c_imx = i2c_get_adapdata (client -> adapter );
767
+ int ret ;
768
+
769
+ if (!i2c_imx -> slave )
770
+ return - EINVAL ;
771
+
772
+ /* Reset slave address. */
773
+ imx_i2c_write_reg (0 , i2c_imx , IMX_I2C_IADR );
774
+
775
+ i2c_imx_reset_regs (i2c_imx );
776
+
777
+ i2c_imx -> slave = NULL ;
778
+
779
+ /* Suspend */
780
+ ret = pm_runtime_put_sync (i2c_imx -> adapter .dev .parent );
781
+ if (ret < 0 )
782
+ dev_err (& i2c_imx -> adapter .dev , "failed to suspend i2c controller" );
783
+
784
+ return ret ;
785
+ }
786
+
787
+ static irqreturn_t i2c_imx_master_isr (struct imx_i2c_struct * i2c_imx , unsigned int status )
788
+ {
789
+ /* save status register */
790
+ i2c_imx -> i2csr = status ;
791
+ wake_up (& i2c_imx -> queue );
792
+
793
+ return IRQ_HANDLED ;
794
+ }
795
+
628
796
static irqreturn_t i2c_imx_isr (int irq , void * dev_id )
629
797
{
630
798
struct imx_i2c_struct * i2c_imx = dev_id ;
631
- unsigned int temp ;
799
+ unsigned int ctl , status ;
632
800
633
- temp = imx_i2c_read_reg (i2c_imx , IMX_I2C_I2SR );
634
- if (temp & I2SR_IIF ) {
635
- /* save status register */
636
- i2c_imx -> i2csr = temp ;
801
+ status = imx_i2c_read_reg (i2c_imx , IMX_I2C_I2SR );
802
+ ctl = imx_i2c_read_reg (i2c_imx , IMX_I2C_I2CR );
803
+ if (status & I2SR_IIF ) {
637
804
i2c_imx_clear_irq (i2c_imx , I2SR_IIF );
638
- wake_up (& i2c_imx -> queue );
639
- return IRQ_HANDLED ;
805
+ if (i2c_imx -> slave && !(ctl & I2CR_MSTA ))
806
+ return i2c_imx_slave_isr (i2c_imx , status , ctl );
807
+ return i2c_imx_master_isr (i2c_imx , status );
640
808
}
641
809
642
810
return IRQ_NONE ;
@@ -1014,6 +1182,10 @@ static int i2c_imx_xfer_common(struct i2c_adapter *adapter,
1014
1182
dev_dbg (& i2c_imx -> adapter .dev , "<%s> exit with: %s: %d\n" , __func__ ,
1015
1183
(result < 0 ) ? "error" : "success msg" ,
1016
1184
(result < 0 ) ? result : num );
1185
+ /* After data is transferred, switch to slave mode(as a receiver) */
1186
+ if (i2c_imx -> slave )
1187
+ i2c_imx_slave_init (i2c_imx );
1188
+
1017
1189
return (result < 0 ) ? result : num ;
1018
1190
}
1019
1191
@@ -1127,6 +1299,8 @@ static const struct i2c_algorithm i2c_imx_algo = {
1127
1299
.master_xfer = i2c_imx_xfer ,
1128
1300
.master_xfer_atomic = i2c_imx_xfer_atomic ,
1129
1301
.functionality = i2c_imx_func ,
1302
+ .reg_slave = i2c_imx_reg_slave ,
1303
+ .unreg_slave = i2c_imx_unreg_slave ,
1130
1304
};
1131
1305
1132
1306
static int i2c_imx_probe (struct platform_device * pdev )
@@ -1216,10 +1390,7 @@ static int i2c_imx_probe(struct platform_device *pdev)
1216
1390
clk_notifier_register (i2c_imx -> clk , & i2c_imx -> clk_change_nb );
1217
1391
i2c_imx_set_clk (i2c_imx , clk_get_rate (i2c_imx -> clk ));
1218
1392
1219
- /* Set up chip registers to defaults */
1220
- imx_i2c_write_reg (i2c_imx -> hwdata -> i2cr_ien_opcode ^ I2CR_IEN ,
1221
- i2c_imx , IMX_I2C_I2CR );
1222
- imx_i2c_write_reg (i2c_imx -> hwdata -> i2sr_clr_opcode , i2c_imx , IMX_I2C_I2SR );
1393
+ i2c_imx_reset_regs (i2c_imx );
1223
1394
1224
1395
/* Init optional bus recovery function */
1225
1396
ret = i2c_imx_init_recovery_info (i2c_imx , pdev );
0 commit comments