aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/spi/spi-s3c64xx.c37
1 files changed, 11 insertions, 26 deletions
diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
index 75a56968b14c..b1e26f00cd05 100644
--- a/drivers/spi/spi-s3c64xx.c
+++ b/drivers/spi/spi-s3c64xx.c
@@ -197,7 +197,6 @@ struct s3c64xx_spi_driver_data {
197 struct s3c64xx_spi_dma_data tx_dma; 197 struct s3c64xx_spi_dma_data tx_dma;
198 struct s3c64xx_spi_port_config *port_conf; 198 struct s3c64xx_spi_port_config *port_conf;
199 unsigned int port_id; 199 unsigned int port_id;
200 bool cs_gpio;
201}; 200};
202 201
203static void flush_fifo(struct s3c64xx_spi_driver_data *sdd) 202static void flush_fifo(struct s3c64xx_spi_driver_data *sdd)
@@ -754,10 +753,8 @@ static struct s3c64xx_spi_csinfo *s3c64xx_get_slave_ctrldata(
754{ 753{
755 struct s3c64xx_spi_csinfo *cs; 754 struct s3c64xx_spi_csinfo *cs;
756 struct device_node *slave_np, *data_np = NULL; 755 struct device_node *slave_np, *data_np = NULL;
757 struct s3c64xx_spi_driver_data *sdd;
758 u32 fb_delay = 0; 756 u32 fb_delay = 0;
759 757
760 sdd = spi_master_get_devdata(spi->master);
761 slave_np = spi->dev.of_node; 758 slave_np = spi->dev.of_node;
762 if (!slave_np) { 759 if (!slave_np) {
763 dev_err(&spi->dev, "device node not found\n"); 760 dev_err(&spi->dev, "device node not found\n");
@@ -776,10 +773,7 @@ static struct s3c64xx_spi_csinfo *s3c64xx_get_slave_ctrldata(
776 return ERR_PTR(-ENOMEM); 773 return ERR_PTR(-ENOMEM);
777 } 774 }
778 775
779 /* The CS line is asserted/deasserted by the gpio pin */ 776 cs->line = of_get_named_gpio(data_np, "cs-gpio", 0);
780 if (sdd->cs_gpio)
781 cs->line = of_get_named_gpio(data_np, "cs-gpio", 0);
782
783 if (!gpio_is_valid(cs->line)) { 777 if (!gpio_is_valid(cs->line)) {
784 dev_err(&spi->dev, "chip select gpio is not specified or invalid\n"); 778 dev_err(&spi->dev, "chip select gpio is not specified or invalid\n");
785 kfree(cs); 779 kfree(cs);
@@ -818,20 +812,17 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
818 } 812 }
819 813
820 if (!spi_get_ctldata(spi)) { 814 if (!spi_get_ctldata(spi)) {
821 /* Request gpio only if cs line is asserted by gpio pins */ 815 err = gpio_request_one(cs->line, GPIOF_OUT_INIT_HIGH,
822 if (sdd->cs_gpio) { 816 dev_name(&spi->dev));
823 err = gpio_request_one(cs->line, GPIOF_OUT_INIT_HIGH, 817 if (err) {
824 dev_name(&spi->dev)); 818 dev_err(&spi->dev,
825 if (err) { 819 "Failed to get /CS gpio [%d]: %d\n",
826 dev_err(&spi->dev, 820 cs->line, err);
827 "Failed to get /CS gpio [%d]: %d\n", 821 goto err_gpio_req;
828 cs->line, err);
829 goto err_gpio_req;
830 }
831
832 spi->cs_gpio = cs->line;
833 } 822 }
834 823
824 spi->cs_gpio = cs->line;
825
835 spi_set_ctldata(spi, cs); 826 spi_set_ctldata(spi, cs);
836 } 827 }
837 828
@@ -897,10 +888,8 @@ err_gpio_req:
897static void s3c64xx_spi_cleanup(struct spi_device *spi) 888static void s3c64xx_spi_cleanup(struct spi_device *spi)
898{ 889{
899 struct s3c64xx_spi_csinfo *cs = spi_get_ctldata(spi); 890 struct s3c64xx_spi_csinfo *cs = spi_get_ctldata(spi);
900 struct s3c64xx_spi_driver_data *sdd;
901 891
902 sdd = spi_master_get_devdata(spi->master); 892 if (cs) {
903 if (spi->cs_gpio) {
904 gpio_free(spi->cs_gpio); 893 gpio_free(spi->cs_gpio);
905 if (spi->dev.of_node) 894 if (spi->dev.of_node)
906 kfree(cs); 895 kfree(cs);
@@ -1075,11 +1064,7 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
1075 sdd->cntrlr_info = sci; 1064 sdd->cntrlr_info = sci;
1076 sdd->pdev = pdev; 1065 sdd->pdev = pdev;
1077 sdd->sfr_start = mem_res->start; 1066 sdd->sfr_start = mem_res->start;
1078 sdd->cs_gpio = true;
1079 if (pdev->dev.of_node) { 1067 if (pdev->dev.of_node) {
1080 if (!of_find_property(pdev->dev.of_node, "cs-gpio", NULL))
1081 sdd->cs_gpio = false;
1082
1083 ret = of_alias_get_id(pdev->dev.of_node, "spi"); 1068 ret = of_alias_get_id(pdev->dev.of_node, "spi");
1084 if (ret < 0) { 1069 if (ret < 0) {
1085 dev_err(&pdev->dev, "failed to get alias id, errno %d\n", 1070 dev_err(&pdev->dev, "failed to get alias id, errno %d\n",