mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-01 00:58:39 +02:00 
			
		
		
		
	spi: introduce delay field for spi_transfer + spi_transfer_delay_exec()
				
					
				
			The change introduces the `delay` field to the `spi_transfer` struct as an `struct spi_delay` type. This intends to eventually replace `delay_usecs`. But, since there are many users of `delay_usecs`, this needs some intermediate work. A helper called `spi_transfer_delay_exec()` is also added, which maintains backwards compatibility with `delay_usecs`, by assigning the value to `delay` if non-zero. This should maintain backwards compatibility with current users of `udelay_usecs`. Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com> Link: https://lore.kernel.org/r/20190926105147.7839-9-alexandru.ardelean@analog.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
		
							parent
							
								
									6c613f68aa
								
							
						
					
					
						commit
						bebcfd272d
					
				
					 2 changed files with 21 additions and 3 deletions
				
			
		|  | @ -1248,8 +1248,7 @@ static int spi_transfer_one_message(struct spi_controller *ctlr, | |||
| 		if (msg->status != -EINPROGRESS) | ||||
| 			goto out; | ||||
| 
 | ||||
| 		if (xfer->delay_usecs) | ||||
| 			_spi_transfer_delay_ns(xfer->delay_usecs * 1000); | ||||
| 		spi_transfer_delay_exec(xfer); | ||||
| 
 | ||||
| 		if (xfer->cs_change) { | ||||
| 			if (list_is_last(&xfer->transfer_list, | ||||
|  | @ -3026,10 +3025,11 @@ struct spi_replaced_transfers *spi_replace_transfers( | |||
| 		/* add to list */ | ||||
| 		list_add(&xfer->transfer_list, rxfer->replaced_after); | ||||
| 
 | ||||
| 		/* clear cs_change and delay_usecs for all but the last */ | ||||
| 		/* clear cs_change and delay for all but the last */ | ||||
| 		if (i) { | ||||
| 			xfer->cs_change = false; | ||||
| 			xfer->delay_usecs = 0; | ||||
| 			xfer->delay.value = 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -778,6 +778,9 @@ extern void spi_res_release(struct spi_controller *ctlr, | |||
|  * @cs_change: affects chipselect after this transfer completes | ||||
|  * @cs_change_delay: delay between cs deassert and assert when | ||||
|  *      @cs_change is set and @spi_transfer is not the last in @spi_message | ||||
|  * @delay: delay to be introduced after this transfer before | ||||
|  *	(optionally) changing the chipselect status, then starting | ||||
|  *	the next transfer or completing this @spi_message. | ||||
|  * @delay_usecs: microseconds to delay after this transfer before | ||||
|  *	(optionally) changing the chipselect status, then starting | ||||
|  *	the next transfer or completing this @spi_message. | ||||
|  | @ -896,6 +899,7 @@ struct spi_transfer { | |||
| #define	SPI_NBITS_QUAD		0x04 /* 4bits transfer */ | ||||
| 	u8		bits_per_word; | ||||
| 	u16		delay_usecs; | ||||
| 	struct spi_delay	delay; | ||||
| 	struct spi_delay	cs_change_delay; | ||||
| 	struct spi_delay	word_delay; | ||||
| 	u32		speed_hz; | ||||
|  | @ -1003,6 +1007,20 @@ spi_transfer_del(struct spi_transfer *t) | |||
| 	list_del(&t->transfer_list); | ||||
| } | ||||
| 
 | ||||
| static inline int | ||||
| spi_transfer_delay_exec(struct spi_transfer *t) | ||||
| { | ||||
| 	struct spi_delay d; | ||||
| 
 | ||||
| 	if (t->delay_usecs) { | ||||
| 		d.value = t->delay_usecs; | ||||
| 		d.unit = SPI_DELAY_UNIT_USECS; | ||||
| 		return spi_delay_exec(&d, NULL); | ||||
| 	} | ||||
| 
 | ||||
| 	return spi_delay_exec(&t->delay, t); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * spi_message_init_with_transfers - Initialize spi_message and append transfers | ||||
|  * @m: spi_message to be initialized | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Alexandru Ardelean
						Alexandru Ardelean