mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 20:42:39 +00:00 
			
		
		
		
	 d29389de0b
			
		
	
	
		d29389de0b
		
	
	
	
	
		
			
			Generalize the old at91rm9200 "bootstrap" bitbanging SPI master driver as "spi_gpio", so it works with arbitrary GPIOs and can be configured through platform_data. Such SPI masters support: - any number of bus instances (bus_num is the platform_device.id) - any number of chipselects (one GPIO per spi_device) - all four SPI_MODE values, and SPI_CS_HIGH - i/o word sizes from 1 to 32 bits; - devices configured as with any other spi_master controller When configured using platform_data, this provides relatively low clock rates. On platforms that support inlined GPIO calls, significantly improved transfer speeds are also possible with a semi-custom driver. (It's still painful when accessing flash memory, but less so.) Sanity checked by using this version to replace both native controllers on a board with six different SPI slaves, relying on three different SPI_MODE_* values and both SPI_CS_HIGH settings for correct operation. [akpm@linux-foundation.org: cleanups] Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Acked-by: Magnus Damm <damm@igel.co.jp> Tested-by: Magnus Damm <damm@igel.co.jp> Cc: Torgil Svensson <torgil.svensson@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			61 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __LINUX_SPI_GPIO_H
 | |
| #define __LINUX_SPI_GPIO_H
 | |
| 
 | |
| /*
 | |
|  * For each bitbanged SPI bus, set up a platform_device node with:
 | |
|  *   - name "spi_gpio"
 | |
|  *   - id the same as the SPI bus number it implements
 | |
|  *   - dev.platform data pointing to a struct spi_gpio_platform_data
 | |
|  *
 | |
|  * Or, see the driver code for information about speedups that are
 | |
|  * possible on platforms that support inlined access for GPIOs (no
 | |
|  * spi_gpio_platform_data is used).
 | |
|  *
 | |
|  * Use spi_board_info with these busses in the usual way, being sure
 | |
|  * that the controller_data being the GPIO used for each device's
 | |
|  * chipselect:
 | |
|  *
 | |
|  *	static struct spi_board_info ... [] = {
 | |
|  *	...
 | |
|  *		// this slave uses GPIO 42 for its chipselect
 | |
|  *		.controller_data = (void *) 42,
 | |
|  *	...
 | |
|  *		// this one uses GPIO 86 for its chipselect
 | |
|  *		.controller_data = (void *) 86,
 | |
|  *	...
 | |
|  *	};
 | |
|  *
 | |
|  * If the bitbanged bus is later switched to a "native" controller,
 | |
|  * that platform_device and controller_data should be removed.
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * struct spi_gpio_platform_data - parameter for bitbanged SPI master
 | |
|  * @sck: number of the GPIO used for clock output
 | |
|  * @mosi: number of the GPIO used for Master Output, Slave In (MOSI) data
 | |
|  * @miso: number of the GPIO used for Master Input, Slave Output (MISO) data
 | |
|  * @num_chipselect: how many slaves to allow
 | |
|  *
 | |
|  * All GPIO signals used with the SPI bus managed through this driver
 | |
|  * (chipselects, MOSI, MISO, SCK) must be configured as GPIOs, instead
 | |
|  * of some alternate function.
 | |
|  *
 | |
|  * It can be convenient to use this driver with pins that have alternate
 | |
|  * functions associated with a "native" SPI controller if a driver for that
 | |
|  * controller is not available, or is missing important functionality.
 | |
|  *
 | |
|  * On platforms which can do so, configure MISO with a weak pullup unless
 | |
|  * there's an external pullup on that signal.  That saves power by avoiding
 | |
|  * floating signals.  (A weak pulldown would save power too, but many
 | |
|  * drivers expect to see all-ones data as the no slave "response".)
 | |
|  */
 | |
| struct spi_gpio_platform_data {
 | |
| 	unsigned	sck;
 | |
| 	unsigned	mosi;
 | |
| 	unsigned	miso;
 | |
| 
 | |
| 	u16		num_chipselect;
 | |
| };
 | |
| 
 | |
| #endif /* __LINUX_SPI_GPIO_H */
 |