diff options
Diffstat (limited to 'drivers/spi')
-rw-r--r-- | drivers/spi/spi-tegra20-slink.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c index 80490cc11ce5..b2fb115df027 100644 --- a/drivers/spi/spi-tegra20-slink.c +++ b/drivers/spi/spi-tegra20-slink.c | |||
@@ -824,6 +824,20 @@ static int tegra_slink_setup(struct spi_device *spi) | |||
824 | return 0; | 824 | return 0; |
825 | } | 825 | } |
826 | 826 | ||
827 | static int tegra_slink_prepare_transfer(struct spi_master *spi) | ||
828 | { | ||
829 | struct tegra_slink_data *tspi = spi_master_get_devdata(spi); | ||
830 | int ret; | ||
831 | |||
832 | ret = pm_runtime_get_sync(tspi->dev); | ||
833 | if (ret < 0) { | ||
834 | dev_err(tspi->dev, "runtime PM get failed: %d\n", ret); | ||
835 | return ret; | ||
836 | } | ||
837 | |||
838 | return ret; | ||
839 | } | ||
840 | |||
827 | static int tegra_slink_transfer_one_message(struct spi_master *master, | 841 | static int tegra_slink_transfer_one_message(struct spi_master *master, |
828 | struct spi_message *msg) | 842 | struct spi_message *msg) |
829 | { | 843 | { |
@@ -836,11 +850,6 @@ static int tegra_slink_transfer_one_message(struct spi_master *master, | |||
836 | 850 | ||
837 | msg->status = 0; | 851 | msg->status = 0; |
838 | msg->actual_length = 0; | 852 | msg->actual_length = 0; |
839 | ret = pm_runtime_get_sync(tspi->dev); | ||
840 | if (ret < 0) { | ||
841 | dev_err(tspi->dev, "runtime get failed: %d\n", ret); | ||
842 | goto done; | ||
843 | } | ||
844 | 853 | ||
845 | single_xfer = list_is_singular(&msg->transfers); | 854 | single_xfer = list_is_singular(&msg->transfers); |
846 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { | 855 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { |
@@ -878,13 +887,20 @@ static int tegra_slink_transfer_one_message(struct spi_master *master, | |||
878 | exit: | 887 | exit: |
879 | tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND); | 888 | tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND); |
880 | tegra_slink_writel(tspi, tspi->def_command2_reg, SLINK_COMMAND2); | 889 | tegra_slink_writel(tspi, tspi->def_command2_reg, SLINK_COMMAND2); |
881 | pm_runtime_put(tspi->dev); | ||
882 | done: | ||
883 | msg->status = ret; | 890 | msg->status = ret; |
884 | spi_finalize_current_message(master); | 891 | spi_finalize_current_message(master); |
885 | return ret; | 892 | return ret; |
886 | } | 893 | } |
887 | 894 | ||
895 | static int tegra_slink_unprepare_transfer(struct spi_master *spi) | ||
896 | { | ||
897 | struct tegra_slink_data *tspi = spi_master_get_devdata(spi); | ||
898 | |||
899 | pm_runtime_put(tspi->dev); | ||
900 | |||
901 | return 0; | ||
902 | } | ||
903 | |||
888 | static irqreturn_t handle_cpu_based_xfer(struct tegra_slink_data *tspi) | 904 | static irqreturn_t handle_cpu_based_xfer(struct tegra_slink_data *tspi) |
889 | { | 905 | { |
890 | struct spi_transfer *t = tspi->curr_xfer; | 906 | struct spi_transfer *t = tspi->curr_xfer; |
@@ -1085,7 +1101,9 @@ static int tegra_slink_probe(struct platform_device *pdev) | |||
1085 | /* the spi->mode bits understood by this driver: */ | 1101 | /* the spi->mode bits understood by this driver: */ |
1086 | master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; | 1102 | master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; |
1087 | master->setup = tegra_slink_setup; | 1103 | master->setup = tegra_slink_setup; |
1104 | master->prepare_transfer_hardware = tegra_slink_prepare_transfer; | ||
1088 | master->transfer_one_message = tegra_slink_transfer_one_message; | 1105 | master->transfer_one_message = tegra_slink_transfer_one_message; |
1106 | master->unprepare_transfer_hardware = tegra_slink_unprepare_transfer; | ||
1089 | master->num_chipselect = MAX_CHIP_SELECT; | 1107 | master->num_chipselect = MAX_CHIP_SELECT; |
1090 | master->bus_num = -1; | 1108 | master->bus_num = -1; |
1091 | 1109 | ||