forked from mirrors/linux
		
	i3c: master: svc: Add Silvaco I3C master driver
Add support for Silvaco I3C dual-role IP. The master role is supported in SDR mode only. I2C transfers have not been tested but are shared because they are very close to the I3C transfers in terms of register configuration. The IBI processing follows this logic: - When a slave advertizes an interrupt (SDA pulled low) an interrupt gets generated by the master. This time is unbounded and may be deferred. - The IRQ handler itself does not process anything: it only queues a work that will be run in non-atomic context. This is needed because short wait periods must be experienced. - The IBI job is divided in two parts: the first one is "critical" in the sense that it may not support getting interrupted. If this happens, after this first section the driver checks the master error register and depending on its content either flushes everything and errors out, or ends the processing (this second section may be interrupted). - If the critical section got interrupted, the slave will automatically respin it's IBI request when it will be allowed to. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Link: https://lore.kernel.org/r/20210121101808.14654-6-miquel.raynal@bootlin.com
This commit is contained in:
		
							parent
							
								
									b8b0446f1f
								
							
						
					
					
						commit
						dd3c52846d
					
				
					 3 changed files with 1487 additions and 0 deletions
				
			
		| 
						 | 
					@ -22,6 +22,14 @@ config DW_I3C_MASTER
 | 
				
			||||||
	  This driver can also be built as a module.  If so, the module
 | 
						  This driver can also be built as a module.  If so, the module
 | 
				
			||||||
	  will be called dw-i3c-master.
 | 
						  will be called dw-i3c-master.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config SVC_I3C_MASTER
 | 
				
			||||||
 | 
						tristate "Silvaco I3C Dual-Role Master driver"
 | 
				
			||||||
 | 
						depends on I3C
 | 
				
			||||||
 | 
						depends on HAS_IOMEM
 | 
				
			||||||
 | 
						depends on !(ALPHA || PARISC)
 | 
				
			||||||
 | 
						help
 | 
				
			||||||
 | 
						  Support for Silvaco I3C Dual-Role Master Controller.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config MIPI_I3C_HCI
 | 
					config MIPI_I3C_HCI
 | 
				
			||||||
	tristate "MIPI I3C Host Controller Interface driver (EXPERIMENTAL)"
 | 
						tristate "MIPI I3C Host Controller Interface driver (EXPERIMENTAL)"
 | 
				
			||||||
	depends on I3C
 | 
						depends on I3C
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
# SPDX-License-Identifier: GPL-2.0-only
 | 
					# SPDX-License-Identifier: GPL-2.0-only
 | 
				
			||||||
obj-$(CONFIG_CDNS_I3C_MASTER)		+= i3c-master-cdns.o
 | 
					obj-$(CONFIG_CDNS_I3C_MASTER)		+= i3c-master-cdns.o
 | 
				
			||||||
obj-$(CONFIG_DW_I3C_MASTER)		+= dw-i3c-master.o
 | 
					obj-$(CONFIG_DW_I3C_MASTER)		+= dw-i3c-master.o
 | 
				
			||||||
 | 
					obj-$(CONFIG_SVC_I3C_MASTER)		+= svc-i3c-master.o
 | 
				
			||||||
obj-$(CONFIG_MIPI_I3C_HCI)		+= mipi-i3c-hci/
 | 
					obj-$(CONFIG_MIPI_I3C_HCI)		+= mipi-i3c-hci/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1478
									
								
								drivers/i3c/master/svc-i3c-master.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1478
									
								
								drivers/i3c/master/svc-i3c-master.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
		Reference in a new issue