spi: Update speed/mode on change
The spi_get_bus_and_cs() may be called on the same bus and chipselect with different frequency or mode. This is valid usecase, but the code fails to notify the controller of such a configuration change. Call spi_set_speed_mode() in case bus frequency or bus mode changed to let the controller update the configuration. The problem can easily be triggered using the sspi command: => sspi 0:0@1000 => sspi 0:0@2000 Without this patch, both transfers happen at 1000 Hz. With this patch, the later transfer happens correctly at 2000 Hz. Signed-off-by: Marek Vasut <marex@denx.de> Cc: Jagan Teki <jagan@amarulasolutions.com> Cc: Patrick Delaunay <patrick.delaunay@foss.st.com>
This commit is contained in:
		
							parent
							
								
									605cbcb0a4
								
							
						
					
					
						commit
						e2e95e5e25
					
				|  | @ -391,6 +391,8 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode, | ||||||
| 	} else if (ret) { | 	} else if (ret) { | ||||||
| 		dev_err(bus, "Invalid chip select %d:%d (err=%d)\n", busnum, cs, ret); | 		dev_err(bus, "Invalid chip select %d:%d (err=%d)\n", busnum, cs, ret); | ||||||
| 		return ret; | 		return ret; | ||||||
|  | 	} else if (dev) { | ||||||
|  | 		plat = dev_get_parent_plat(dev); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (!device_active(dev)) { | 	if (!device_active(dev)) { | ||||||
|  | @ -416,12 +418,22 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode, | ||||||
| 			goto err; | 			goto err; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/* In case bus frequency or mode changed, update it. */ | ||||||
|  | 	if ((speed && bus_data->speed && bus_data->speed != speed) || | ||||||
|  | 	    (plat && plat->mode != mode)) { | ||||||
|  | 		ret = spi_set_speed_mode(bus, speed, mode); | ||||||
|  | 		if (ret) | ||||||
|  | 			goto err_speed_mode; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	*busp = bus; | 	*busp = bus; | ||||||
| 	*devp = slave; | 	*devp = slave; | ||||||
| 	log_debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp); | 	log_debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp); | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| 
 | 
 | ||||||
|  | err_speed_mode: | ||||||
|  | 	spi_release_bus(slave); | ||||||
| err: | err: | ||||||
| 	log_debug("%s: Error path, created=%d, device '%s'\n", __func__, | 	log_debug("%s: Error path, created=%d, device '%s'\n", __func__, | ||||||
| 		  created, dev->name); | 		  created, dev->name); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue