forked from mirrors/linux
		
	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) | 		if (msg->status != -EINPROGRESS) | ||||||
| 			goto out; | 			goto out; | ||||||
| 
 | 
 | ||||||
| 		if (xfer->delay_usecs) | 		spi_transfer_delay_exec(xfer); | ||||||
| 			_spi_transfer_delay_ns(xfer->delay_usecs * 1000); |  | ||||||
| 
 | 
 | ||||||
| 		if (xfer->cs_change) { | 		if (xfer->cs_change) { | ||||||
| 			if (list_is_last(&xfer->transfer_list, | 			if (list_is_last(&xfer->transfer_list, | ||||||
|  | @ -3026,10 +3025,11 @@ struct spi_replaced_transfers *spi_replace_transfers( | ||||||
| 		/* add to list */ | 		/* add to list */ | ||||||
| 		list_add(&xfer->transfer_list, rxfer->replaced_after); | 		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) { | 		if (i) { | ||||||
| 			xfer->cs_change = false; | 			xfer->cs_change = false; | ||||||
| 			xfer->delay_usecs = 0; | 			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: affects chipselect after this transfer completes | ||||||
|  * @cs_change_delay: delay between cs deassert and assert when |  * @cs_change_delay: delay between cs deassert and assert when | ||||||
|  *      @cs_change is set and @spi_transfer is not the last in @spi_message |  *      @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 |  * @delay_usecs: microseconds to delay after this transfer before | ||||||
|  *	(optionally) changing the chipselect status, then starting |  *	(optionally) changing the chipselect status, then starting | ||||||
|  *	the next transfer or completing this @spi_message. |  *	the next transfer or completing this @spi_message. | ||||||
|  | @ -896,6 +899,7 @@ struct spi_transfer { | ||||||
| #define	SPI_NBITS_QUAD		0x04 /* 4bits transfer */ | #define	SPI_NBITS_QUAD		0x04 /* 4bits transfer */ | ||||||
| 	u8		bits_per_word; | 	u8		bits_per_word; | ||||||
| 	u16		delay_usecs; | 	u16		delay_usecs; | ||||||
|  | 	struct spi_delay	delay; | ||||||
| 	struct spi_delay	cs_change_delay; | 	struct spi_delay	cs_change_delay; | ||||||
| 	struct spi_delay	word_delay; | 	struct spi_delay	word_delay; | ||||||
| 	u32		speed_hz; | 	u32		speed_hz; | ||||||
|  | @ -1003,6 +1007,20 @@ spi_transfer_del(struct spi_transfer *t) | ||||||
| 	list_del(&t->transfer_list); | 	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 |  * spi_message_init_with_transfers - Initialize spi_message and append transfers | ||||||
|  * @m: spi_message to be initialized |  * @m: spi_message to be initialized | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Alexandru Ardelean
						Alexandru Ardelean