diff options
Diffstat (limited to 'drivers/spi/spi-efm32.c')
| -rw-r--r-- | drivers/spi/spi-efm32.c | 46 | 
1 files changed, 17 insertions, 29 deletions
diff --git a/drivers/spi/spi-efm32.c b/drivers/spi/spi-efm32.c index d4d3cc534792..be44a3eeb5e8 100644 --- a/drivers/spi/spi-efm32.c +++ b/drivers/spi/spi-efm32.c @@ -198,7 +198,7 @@ static int efm32_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)  	efm32_spi_filltx(ddata); -	init_completion(&ddata->done); +	reinit_completion(&ddata->done);  	efm32_spi_write32(ddata, REG_IF_TXBL | REG_IF_RXDATAV, REG_IEN); @@ -287,17 +287,17 @@ static u32 efm32_spi_get_configured_location(struct efm32_spi_ddata *ddata)  	return (reg & REG_ROUTE_LOCATION__MASK) >> __ffs(REG_ROUTE_LOCATION__MASK);  } -static int efm32_spi_probe_dt(struct platform_device *pdev, +static void efm32_spi_probe_dt(struct platform_device *pdev,  		struct spi_master *master, struct efm32_spi_ddata *ddata)  {  	struct device_node *np = pdev->dev.of_node;  	u32 location;  	int ret; -	if (!np) -		return 1; - -	ret = of_property_read_u32(np, "location", &location); +	ret = of_property_read_u32(np, "efm32,location", &location); +	if (ret) +		/* fall back to old and (wrongly) generic property "location" */ +		ret = of_property_read_u32(np, "location", &location);  	if (!ret) {  		dev_dbg(&pdev->dev, "using location %u\n", location);  	} else { @@ -308,11 +308,6 @@ static int efm32_spi_probe_dt(struct platform_device *pdev,  	}  	ddata->pdata.location = location; - -	/* spi core takes care about the bus number using an alias */ -	master->bus_num = -1; - -	return 0;  }  static int efm32_spi_probe(struct platform_device *pdev) @@ -322,9 +317,14 @@ static int efm32_spi_probe(struct platform_device *pdev)  	int ret;  	struct spi_master *master;  	struct device_node *np = pdev->dev.of_node; -	unsigned int num_cs, i; +	int num_cs, i; + +	if (!np) +		return -EINVAL;  	num_cs = of_gpio_named_count(np, "cs-gpios"); +	if (num_cs < 0) +		return num_cs;  	master = spi_alloc_master(&pdev->dev,  			sizeof(*ddata) + num_cs * sizeof(unsigned)); @@ -349,6 +349,7 @@ static int efm32_spi_probe(struct platform_device *pdev)  	ddata->bitbang.txrx_bufs = efm32_spi_txrx_bufs;  	spin_lock_init(&ddata->lock); +	init_completion(&ddata->done);  	ddata->clk = devm_clk_get(&pdev->dev, NULL);  	if (IS_ERR(ddata->clk)) { @@ -415,23 +416,7 @@ static int efm32_spi_probe(struct platform_device *pdev)  		goto err;  	} -	ret = efm32_spi_probe_dt(pdev, master, ddata); -	if (ret > 0) { -		/* not created by device tree */ -		const struct efm32_spi_pdata *pdata = -			dev_get_platdata(&pdev->dev); - -		if (pdata) -			ddata->pdata = *pdata; -		else -			ddata->pdata.location = -				efm32_spi_get_configured_location(ddata); - -		master->bus_num = pdev->id; - -	} else if (ret < 0) { -		goto err_disable_clk; -	} +	efm32_spi_probe_dt(pdev, master, ddata);  	efm32_spi_write32(ddata, 0, REG_IEN);  	efm32_spi_write32(ddata, REG_ROUTE_TXPEN | REG_ROUTE_RXPEN | @@ -487,6 +472,9 @@ static int efm32_spi_remove(struct platform_device *pdev)  static const struct of_device_id efm32_spi_dt_ids[] = {  	{ +		.compatible = "energymicro,efm32-spi", +	}, { +		/* doesn't follow the "vendor,device" scheme, don't use */  		.compatible = "efm32,spi",  	}, {  		/* sentinel */  | 
