|
@@ -1148,41 +1148,6 @@ static void s3c64xx_spi_hwinit(struct s3c64xx_spi_driver_data *sdd, int channel)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_OF
|
|
|
-static int s3c64xx_spi_parse_dt_gpio(struct s3c64xx_spi_driver_data *sdd)
|
|
|
-{
|
|
|
- struct device *dev = &sdd->pdev->dev;
|
|
|
- int idx, gpio, ret;
|
|
|
-
|
|
|
- /* find gpios for mosi, miso and clock lines */
|
|
|
- for (idx = 0; idx < 3; idx++) {
|
|
|
- gpio = of_get_gpio(dev->of_node, idx);
|
|
|
- if (!gpio_is_valid(gpio)) {
|
|
|
- dev_err(dev, "invalid gpio[%d]: %d\n", idx, gpio);
|
|
|
- goto free_gpio;
|
|
|
- }
|
|
|
- sdd->gpios[idx] = gpio;
|
|
|
- ret = gpio_request(gpio, "spi-bus");
|
|
|
- if (ret) {
|
|
|
- dev_err(dev, "gpio [%d] request failed: %d\n",
|
|
|
- gpio, ret);
|
|
|
- goto free_gpio;
|
|
|
- }
|
|
|
- }
|
|
|
- return 0;
|
|
|
-
|
|
|
-free_gpio:
|
|
|
- while (--idx >= 0)
|
|
|
- gpio_free(sdd->gpios[idx]);
|
|
|
- return -EINVAL;
|
|
|
-}
|
|
|
-
|
|
|
-static void s3c64xx_spi_dt_gpio_free(struct s3c64xx_spi_driver_data *sdd)
|
|
|
-{
|
|
|
- unsigned int idx;
|
|
|
- for (idx = 0; idx < 3; idx++)
|
|
|
- gpio_free(sdd->gpios[idx]);
|
|
|
-}
|
|
|
-
|
|
|
static struct s3c64xx_spi_info *s3c64xx_spi_parse_dt(struct device *dev)
|
|
|
{
|
|
|
struct s3c64xx_spi_info *sci;
|
|
@@ -1215,15 +1180,6 @@ static struct s3c64xx_spi_info *s3c64xx_spi_parse_dt(struct device *dev)
|
|
|
{
|
|
|
return dev->platform_data;
|
|
|
}
|
|
|
-
|
|
|
-static int s3c64xx_spi_parse_dt_gpio(struct s3c64xx_spi_driver_data *sdd)
|
|
|
-{
|
|
|
- return -EINVAL;
|
|
|
-}
|
|
|
-
|
|
|
-static void s3c64xx_spi_dt_gpio_free(struct s3c64xx_spi_driver_data *sdd)
|
|
|
-{
|
|
|
-}
|
|
|
#endif
|
|
|
|
|
|
static const struct of_device_id s3c64xx_spi_dt_match[];
|
|
@@ -1344,10 +1300,7 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
|
|
|
goto err0;
|
|
|
}
|
|
|
|
|
|
- if (!sci->cfg_gpio && pdev->dev.of_node) {
|
|
|
- if (s3c64xx_spi_parse_dt_gpio(sdd))
|
|
|
- return -EBUSY;
|
|
|
- } else if (sci->cfg_gpio == NULL || sci->cfg_gpio()) {
|
|
|
+ if (sci->cfg_gpio && sci->cfg_gpio()) {
|
|
|
dev_err(&pdev->dev, "Unable to config gpio\n");
|
|
|
ret = -EBUSY;
|
|
|
goto err0;
|
|
@@ -1358,13 +1311,13 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
|
|
|
if (IS_ERR(sdd->clk)) {
|
|
|
dev_err(&pdev->dev, "Unable to acquire clock 'spi'\n");
|
|
|
ret = PTR_ERR(sdd->clk);
|
|
|
- goto err1;
|
|
|
+ goto err0;
|
|
|
}
|
|
|
|
|
|
if (clk_prepare_enable(sdd->clk)) {
|
|
|
dev_err(&pdev->dev, "Couldn't enable clock 'spi'\n");
|
|
|
ret = -EBUSY;
|
|
|
- goto err1;
|
|
|
+ goto err0;
|
|
|
}
|
|
|
|
|
|
sprintf(clk_name, "spi_busclk%d", sci->src_clk_nr);
|
|
@@ -1421,9 +1374,6 @@ err3:
|
|
|
clk_disable_unprepare(sdd->src_clk);
|
|
|
err2:
|
|
|
clk_disable_unprepare(sdd->clk);
|
|
|
-err1:
|
|
|
- if (!sdd->cntrlr_info->cfg_gpio && pdev->dev.of_node)
|
|
|
- s3c64xx_spi_dt_gpio_free(sdd);
|
|
|
err0:
|
|
|
platform_set_drvdata(pdev, NULL);
|
|
|
spi_master_put(master);
|
|
@@ -1446,9 +1396,6 @@ static int s3c64xx_spi_remove(struct platform_device *pdev)
|
|
|
|
|
|
clk_disable_unprepare(sdd->clk);
|
|
|
|
|
|
- if (!sdd->cntrlr_info->cfg_gpio && pdev->dev.of_node)
|
|
|
- s3c64xx_spi_dt_gpio_free(sdd);
|
|
|
-
|
|
|
platform_set_drvdata(pdev, NULL);
|
|
|
spi_master_put(master);
|
|
|
|
|
@@ -1467,9 +1414,6 @@ static int s3c64xx_spi_suspend(struct device *dev)
|
|
|
clk_disable_unprepare(sdd->src_clk);
|
|
|
clk_disable_unprepare(sdd->clk);
|
|
|
|
|
|
- if (!sdd->cntrlr_info->cfg_gpio && dev->of_node)
|
|
|
- s3c64xx_spi_dt_gpio_free(sdd);
|
|
|
-
|
|
|
sdd->cur_speed = 0; /* Output Clock is stopped */
|
|
|
|
|
|
return 0;
|
|
@@ -1481,9 +1425,7 @@ static int s3c64xx_spi_resume(struct device *dev)
|
|
|
struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
|
|
|
struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
|
|
|
|
|
|
- if (!sci->cfg_gpio && dev->of_node)
|
|
|
- s3c64xx_spi_parse_dt_gpio(sdd);
|
|
|
- else
|
|
|
+ if (sci->cfg_gpio)
|
|
|
sci->cfg_gpio();
|
|
|
|
|
|
/* Enable the clock */
|