瀏覽代碼

spi/imx: copy gpio number passed by platform data into driver private data

It copies gpio number passed via platform data embedded pointer into
driver private data, so that we do not need to refer to this embedded
pointer passed by platform data after probe function exits.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Shawn Guo 14 年之前
父節點
當前提交
c2387cb9e5
共有 1 個文件被更改,包括 7 次插入5 次删除
  1. 7 5
      drivers/spi/spi-imx.c

+ 7 - 5
drivers/spi/spi-imx.c

@@ -84,7 +84,6 @@ struct spi_imx_data {
 	int irq;
 	int irq;
 	struct clk *clk;
 	struct clk *clk;
 	unsigned long spi_clk;
 	unsigned long spi_clk;
-	int *chipselect;
 
 
 	unsigned int count;
 	unsigned int count;
 	void (*tx)(struct spi_imx_data *);
 	void (*tx)(struct spi_imx_data *);
@@ -94,6 +93,7 @@ struct spi_imx_data {
 	unsigned int txfifo; /* number of words pushed in tx FIFO */
 	unsigned int txfifo; /* number of words pushed in tx FIFO */
 
 
 	struct spi_imx_devtype_data *devtype_data;
 	struct spi_imx_devtype_data *devtype_data;
+	int chipselect[0];
 };
 };
 
 
 static inline int is_imx27_cspi(struct spi_imx_data *d)
 static inline int is_imx27_cspi(struct spi_imx_data *d)
@@ -741,7 +741,7 @@ static int __devinit spi_imx_probe(struct platform_device *pdev)
 	struct spi_master *master;
 	struct spi_master *master;
 	struct spi_imx_data *spi_imx;
 	struct spi_imx_data *spi_imx;
 	struct resource *res;
 	struct resource *res;
-	int i, ret;
+	int i, ret, num_cs;
 
 
 	mxc_platform_info = dev_get_platdata(&pdev->dev);
 	mxc_platform_info = dev_get_platdata(&pdev->dev);
 	if (!mxc_platform_info) {
 	if (!mxc_platform_info) {
@@ -749,20 +749,22 @@ static int __devinit spi_imx_probe(struct platform_device *pdev)
 		return -EINVAL;
 		return -EINVAL;
 	}
 	}
 
 
-	master = spi_alloc_master(&pdev->dev, sizeof(struct spi_imx_data));
+	num_cs = mxc_platform_info->num_chipselect;
+	master = spi_alloc_master(&pdev->dev,
+			sizeof(struct spi_imx_data) + sizeof(int) * num_cs);
 	if (!master)
 	if (!master)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	platform_set_drvdata(pdev, master);
 	platform_set_drvdata(pdev, master);
 
 
 	master->bus_num = pdev->id;
 	master->bus_num = pdev->id;
-	master->num_chipselect = mxc_platform_info->num_chipselect;
+	master->num_chipselect = num_cs;
 
 
 	spi_imx = spi_master_get_devdata(master);
 	spi_imx = spi_master_get_devdata(master);
 	spi_imx->bitbang.master = spi_master_get(master);
 	spi_imx->bitbang.master = spi_master_get(master);
-	spi_imx->chipselect = mxc_platform_info->chipselect;
 
 
 	for (i = 0; i < master->num_chipselect; i++) {
 	for (i = 0; i < master->num_chipselect; i++) {
+		spi_imx->chipselect[i] = mxc_platform_info->chipselect[i];
 		if (spi_imx->chipselect[i] < 0)
 		if (spi_imx->chipselect[i] < 0)
 			continue;
 			continue;
 		ret = gpio_request(spi_imx->chipselect[i], DRIVER_NAME);
 		ret = gpio_request(spi_imx->chipselect[i], DRIVER_NAME);