forked from mirrors/linux
		
	spi: spi-omap2-mcspi.c: Toggle CS after each word
This patch allows the board code to define SPI devices which needs to toggle the chip select after every word send. This is needed to get a better resolution reading e.g. an ADC data stream. Apart from that, as in the normal code CS is controlled by software, a transfer is done much faster. Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
		
							parent
							
								
									18dd6199fa
								
							
						
					
					
						commit
						5cbc7ca987
					
				
					 2 changed files with 21 additions and 0 deletions
				
			
		|  | @ -927,6 +927,7 @@ static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m) | |||
| 
 | ||||
| 	struct spi_device		*spi; | ||||
| 	struct spi_transfer		*t = NULL; | ||||
| 	struct spi_master		*master; | ||||
| 	int				cs_active = 0; | ||||
| 	struct omap2_mcspi_cs		*cs; | ||||
| 	struct omap2_mcspi_device_config *cd; | ||||
|  | @ -935,6 +936,7 @@ static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m) | |||
| 	u32				chconf; | ||||
| 
 | ||||
| 	spi = m->spi; | ||||
| 	master = spi->master; | ||||
| 	cs = spi->controller_state; | ||||
| 	cd = spi->controller_data; | ||||
| 
 | ||||
|  | @ -952,6 +954,14 @@ static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m) | |||
| 			if (!t->speed_hz && !t->bits_per_word) | ||||
| 				par_override = 0; | ||||
| 		} | ||||
| 		if (cd && cd->cs_per_word) { | ||||
| 			chconf = mcspi->ctx.modulctrl; | ||||
| 			chconf &= ~OMAP2_MCSPI_MODULCTRL_SINGLE; | ||||
| 			mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, chconf); | ||||
| 			mcspi->ctx.modulctrl = | ||||
| 				mcspi_read_cs_reg(spi, OMAP2_MCSPI_MODULCTRL); | ||||
| 		} | ||||
| 
 | ||||
| 
 | ||||
| 		if (!cs_active) { | ||||
| 			omap2_mcspi_force_cs(spi, 1); | ||||
|  | @ -1013,6 +1023,14 @@ static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m) | |||
| 	if (cs_active) | ||||
| 		omap2_mcspi_force_cs(spi, 0); | ||||
| 
 | ||||
| 	if (cd && cd->cs_per_word) { | ||||
| 		chconf = mcspi->ctx.modulctrl; | ||||
| 		chconf |= OMAP2_MCSPI_MODULCTRL_SINGLE; | ||||
| 		mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, chconf); | ||||
| 		mcspi->ctx.modulctrl = | ||||
| 			mcspi_read_cs_reg(spi, OMAP2_MCSPI_MODULCTRL); | ||||
| 	} | ||||
| 
 | ||||
| 	omap2_mcspi_set_enable(spi, 0); | ||||
| 
 | ||||
| 	m->status = status; | ||||
|  |  | |||
|  | @ -22,6 +22,9 @@ struct omap2_mcspi_dev_attr { | |||
| 
 | ||||
| struct omap2_mcspi_device_config { | ||||
| 	unsigned turbo_mode:1; | ||||
| 
 | ||||
| 	/* toggle chip select after every word */ | ||||
| 	unsigned cs_per_word:1; | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Matthias Brugger
						Matthias Brugger