mpc8xxx_spi: put max_cs to use
Currently, max_cs is write-only; it's just set in mpc8xxx_spi_ofdata_to_platdata and not otherwise used. My mpc8309 was always resetting during an "sf probe 0". It turns out dm_gpio_set_dir_flags() was being called with garbage, since nothing had initialized priv->gpios[0] - our device tree used "cs-gpios" rather than "gpios", so gpio_request_list_by_name() had returned 0. That would have been a lot easier to figure out if the chip select index was sanity checked, so rename max_cs to cs_count, and reject a xfer with a too large cs index. Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
This commit is contained in:
		
							parent
							
								
									96e68c1621
								
							
						
					
					
						commit
						1a7b462dee
					
				|  | @ -35,7 +35,7 @@ enum { | ||||||
| struct mpc8xxx_priv { | struct mpc8xxx_priv { | ||||||
| 	spi8xxx_t *spi; | 	spi8xxx_t *spi; | ||||||
| 	struct gpio_desc gpios[16]; | 	struct gpio_desc gpios[16]; | ||||||
| 	int max_cs; | 	int cs_count; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static inline u32 to_prescale_mod(u32 val) | static inline u32 to_prescale_mod(u32 val) | ||||||
|  | @ -74,7 +74,7 @@ static int mpc8xxx_spi_ofdata_to_platdata(struct udevice *dev) | ||||||
| 	if (ret < 0) | 	if (ret < 0) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	priv->max_cs = ret; | 	priv->cs_count = ret; | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | @ -131,6 +131,11 @@ static int mpc8xxx_spi_xfer(struct udevice *dev, uint bitlen, | ||||||
| 
 | 
 | ||||||
| 	debug("%s: slave %s:%u dout %08X din %08X bitlen %u\n", __func__, | 	debug("%s: slave %s:%u dout %08X din %08X bitlen %u\n", __func__, | ||||||
| 	      bus->name, platdata->cs, *(uint *)dout, *(uint *)din, bitlen); | 	      bus->name, platdata->cs, *(uint *)dout, *(uint *)din, bitlen); | ||||||
|  | 	if (platdata->cs >= priv->cs_count) { | ||||||
|  | 		dev_err(dev, "chip select index %d too large (cs_count=%d)\n", | ||||||
|  | 			platdata->cs, priv->cs_count); | ||||||
|  | 		return -EINVAL; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if (flags & SPI_XFER_BEGIN) | 	if (flags & SPI_XFER_BEGIN) | ||||||
| 		mpc8xxx_spi_cs_activate(dev); | 		mpc8xxx_spi_cs_activate(dev); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue