diff options
Diffstat (limited to 'drivers/spi/spi.c')
| -rw-r--r-- | drivers/spi/spi.c | 19 | 
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index b33a727a0158..7b213faa0a2b 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -779,8 +779,14 @@ static int spi_map_buf(struct spi_controller *ctlr, struct device *dev,  	for (i = 0; i < sgs; i++) {  		if (vmalloced_buf || kmap_buf) { -			min = min_t(size_t, -				    len, desc_len - offset_in_page(buf)); +			/* +			 * Next scatterlist entry size is the minimum between +			 * the desc_len and the remaining buffer length that +			 * fits in a page. +			 */ +			min = min_t(size_t, desc_len, +				    min_t(size_t, len, +					  PAGE_SIZE - offset_in_page(buf)));  			if (vmalloced_buf)  				vm_page = vmalloc_to_page(buf);  			else @@ -2254,12 +2260,6 @@ void spi_unregister_controller(struct spi_controller *ctlr)  	mutex_lock(&board_lock);  	found = idr_find(&spi_master_idr, id);  	mutex_unlock(&board_lock); -	if (found != ctlr) { -		dev_dbg(&ctlr->dev, -			"attempting to delete unregistered controller [%s]\n", -			dev_name(&ctlr->dev)); -		return; -	}  	if (ctlr->queued) {  		if (spi_destroy_queue(ctlr))  			dev_err(&ctlr->dev, "queue remove failed\n"); @@ -2272,7 +2272,8 @@ void spi_unregister_controller(struct spi_controller *ctlr)  	device_unregister(&ctlr->dev);  	/* free bus id */  	mutex_lock(&board_lock); -	idr_remove(&spi_master_idr, id); +	if (found == ctlr) +		idr_remove(&spi_master_idr, id);  	mutex_unlock(&board_lock);  }  EXPORT_SYMBOL_GPL(spi_unregister_controller);  | 
