diff options
| author | Ashutosh Patel <ashutoshp@nvidia.com> | 2015-11-26 05:55:54 -0500 |
|---|---|---|
| committer | Sandeep Trasi <strasi@nvidia.com> | 2015-11-30 04:30:27 -0500 |
| commit | 08a17723d8c736af91c48c6666cb34a0c3ddda9c (patch) | |
| tree | cf007aba45bd5d36531d353ee9a51f8329eea4ab /drivers/spi | |
| parent | b85b7c9593359541871b533d511a6ebddd821676 (diff) | |
driver: qspi : Add qspi_out clock
Changes:
- qspi_out clock is added to control sdr and ddr
- Removed clk_source register write
bug 200133422
Change-Id: I9e18b9bd11ed2030b69feb30ef75fc139c06147d
Signed-off-by: Ashutosh Patel <ashutoshp@nvidia.com>
Reviewed-on: http://git-master/r/836458
Reviewed-by: Amlan Kundu <akundu@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Sandeep Trasi <strasi@nvidia.com>
Diffstat (limited to 'drivers/spi')
| -rw-r--r-- | drivers/spi/spi-tegra186-qspi.c | 118 |
1 files changed, 69 insertions, 49 deletions
diff --git a/drivers/spi/spi-tegra186-qspi.c b/drivers/spi/spi-tegra186-qspi.c index f25a9f687..535f054dc 100644 --- a/drivers/spi/spi-tegra186-qspi.c +++ b/drivers/spi/spi-tegra186-qspi.c | |||
| @@ -190,7 +190,6 @@ | |||
| 190 | #define CMD_TRANSFER 0 | 190 | #define CMD_TRANSFER 0 |
| 191 | #define ADDR_TRANSFER 1 | 191 | #define ADDR_TRANSFER 1 |
| 192 | #define DATA_TRANSFER 2 | 192 | #define DATA_TRANSFER 2 |
| 193 | #define CLK_SRC_QSPI 0x55C3000 | ||
| 194 | 193 | ||
| 195 | struct tegra_qspi_data { | 194 | struct tegra_qspi_data { |
| 196 | struct device *dev; | 195 | struct device *dev; |
| @@ -198,12 +197,14 @@ struct tegra_qspi_data { | |||
| 198 | spinlock_t lock; | 197 | spinlock_t lock; |
| 199 | 198 | ||
| 200 | struct clk *clk; | 199 | struct clk *clk; |
| 201 | struct reset_control *rstc; | 200 | struct clk *sdr_ddr_clk; |
| 201 | struct reset_control *rstc; | ||
| 202 | void __iomem *base; | 202 | void __iomem *base; |
| 203 | phys_addr_t phys; | 203 | phys_addr_t phys; |
| 204 | unsigned irq; | 204 | unsigned irq; |
| 205 | int dma_req_sel; | 205 | int dma_req_sel; |
| 206 | bool clock_always_on; | 206 | bool clock_always_on; |
| 207 | bool is_ddr_mode; | ||
| 207 | u32 qspi_max_frequency; | 208 | u32 qspi_max_frequency; |
| 208 | u32 cur_speed; | 209 | u32 cur_speed; |
| 209 | u8 qspi_num_dummy_cycle; | 210 | u8 qspi_num_dummy_cycle; |
| @@ -223,7 +224,7 @@ struct tegra_qspi_data { | |||
| 223 | unsigned max_buf_size; | 224 | unsigned max_buf_size; |
| 224 | bool is_curr_dma_xfer; | 225 | bool is_curr_dma_xfer; |
| 225 | bool is_hw_based_cs; | 226 | bool is_hw_based_cs; |
| 226 | bool dcycle_non_cmbseq_mode; | 227 | bool dcycle_non_cmbseq_mode; |
| 227 | 228 | ||
| 228 | struct completion rx_dma_complete; | 229 | struct completion rx_dma_complete; |
| 229 | struct completion tx_dma_complete; | 230 | struct completion tx_dma_complete; |
| @@ -965,7 +966,8 @@ static int tegra_qspi_start_transfer_one(struct spi_device *spi, | |||
| 965 | bool is_single_xfer) | 966 | bool is_single_xfer) |
| 966 | { | 967 | { |
| 967 | struct tegra_qspi_data *tqspi = spi_master_get_devdata(spi->master); | 968 | struct tegra_qspi_data *tqspi = spi_master_get_devdata(spi->master); |
| 968 | u32 speed, qspi_cs_timing2 = 0, clk_val = 0; | 969 | u32 speed, qspi_cs_timing2 = 0; |
| 970 | u32 actual_speed = 0; | ||
| 969 | u8 bits_per_word; | 971 | u8 bits_per_word; |
| 970 | unsigned total_fifo_words; | 972 | unsigned total_fifo_words; |
| 971 | int ret; | 973 | int ret; |
| @@ -974,7 +976,6 @@ static int tegra_qspi_start_transfer_one(struct spi_device *spi, | |||
| 974 | u8 bus_width = X1, num_dummy_cycles = 0; | 976 | u8 bus_width = X1, num_dummy_cycles = 0; |
| 975 | bool is_ddr = false; | 977 | bool is_ddr = false; |
| 976 | struct tegra_qspi_device_controller_data *cdata = spi->controller_data; | 978 | struct tegra_qspi_device_controller_data *cdata = spi->controller_data; |
| 977 | void __iomem *clk_base; | ||
| 978 | bits_per_word = t->bits_per_word; | 979 | bits_per_word = t->bits_per_word; |
| 979 | tqspi->cur_qspi = spi; | 980 | tqspi->cur_qspi = spi; |
| 980 | tqspi->cur_pos = 0; | 981 | tqspi->cur_pos = 0; |
| @@ -1010,37 +1011,6 @@ static int tegra_qspi_start_transfer_one(struct spi_device *spi, | |||
| 1010 | */ | 1011 | */ |
| 1011 | is_ddr = get_sdr_ddr(t->delay_usecs); | 1012 | is_ddr = get_sdr_ddr(t->delay_usecs); |
| 1012 | bus_width = get_bus_width(t->delay_usecs); | 1013 | bus_width = get_bus_width(t->delay_usecs); |
| 1013 | |||
| 1014 | #ifndef QSPI_BRINGUP_BUILD | ||
| 1015 | if (is_ddr) { | ||
| 1016 | ret = tegra_clk_cfg_ex(tqspi->clk, TEGRA_CLK_QSPI_DIV2_ENB, 1); | ||
| 1017 | if (ret) { | ||
| 1018 | dev_err(tqspi->dev, "Failed to set clk DIV2 %d\n", ret); | ||
| 1019 | return -EINVAL; | ||
| 1020 | } | ||
| 1021 | } else if (!cdata->ifddr_div2_sdr) { | ||
| 1022 | ret = tegra_clk_cfg_ex(tqspi->clk, TEGRA_CLK_QSPI_DIV2_ENB, 0); | ||
| 1023 | if (ret) { | ||
| 1024 | dev_err(tqspi->dev, "Failed to reset clk DIV2\n"); | ||
| 1025 | return -EINVAL; | ||
| 1026 | } | ||
| 1027 | } | ||
| 1028 | #else | ||
| 1029 | clk_base = ioremap(CLK_SRC_QSPI, 0x4); | ||
| 1030 | /* FixMe Add BPMP FW based APIS | ||
| 1031 | instead of Register based programming */ | ||
| 1032 | if (is_ddr) { | ||
| 1033 | clk_val = readl(clk_base); | ||
| 1034 | clk_val |= 0x100; | ||
| 1035 | writel(clk_val, clk_base); | ||
| 1036 | } else { | ||
| 1037 | clk_val = readl(clk_base); | ||
| 1038 | clk_val &= 0xFFFFFEFF; | ||
| 1039 | writel(clk_val, clk_base); | ||
| 1040 | } | ||
| 1041 | udelay(10); | ||
| 1042 | iounmap(clk_base); | ||
| 1043 | #endif | ||
| 1044 | ret = tegra_qspi_validate_request(spi, tqspi, t, is_ddr); | 1014 | ret = tegra_qspi_validate_request(spi, tqspi, t, is_ddr); |
| 1045 | if (ret) | 1015 | if (ret) |
| 1046 | return ret; | 1016 | return ret; |
| @@ -1049,12 +1019,27 @@ static int tegra_qspi_start_transfer_one(struct spi_device *spi, | |||
| 1049 | if (speed != tqspi->cur_speed) { | 1019 | if (speed != tqspi->cur_speed) { |
| 1050 | ret = clk_set_rate(tqspi->clk, speed); | 1020 | ret = clk_set_rate(tqspi->clk, speed); |
| 1051 | if (ret) { | 1021 | if (ret) { |
| 1052 | dev_err(tqspi->dev, "Failed to set clk freq %d\n", ret); | 1022 | dev_err(tqspi->dev, |
| 1023 | "Failed to set qspi clk freq %d\n", ret); | ||
| 1053 | return -EINVAL; | 1024 | return -EINVAL; |
| 1054 | } | 1025 | } |
| 1055 | tqspi->cur_speed = speed; | 1026 | tqspi->cur_speed = speed; |
| 1056 | } | 1027 | } |
| 1057 | 1028 | if (is_ddr != tqspi->is_ddr_mode) { | |
| 1029 | actual_speed = clk_get_rate(tqspi->clk); | ||
| 1030 | if (is_ddr) | ||
| 1031 | ret = clk_set_rate(tqspi->sdr_ddr_clk, | ||
| 1032 | (actual_speed>>1)); | ||
| 1033 | else | ||
| 1034 | ret = clk_set_rate(tqspi->sdr_ddr_clk, actual_speed); | ||
| 1035 | if (ret) { | ||
| 1036 | dev_err(tqspi->dev, | ||
| 1037 | "Failed to set qspi_out clk freq %d\n" | ||
| 1038 | , ret); | ||
| 1039 | return -EINVAL; | ||
| 1040 | } | ||
| 1041 | tqspi->is_ddr_mode = is_ddr; | ||
| 1042 | } | ||
| 1058 | if (is_first_of_msg) { | 1043 | if (is_first_of_msg) { |
| 1059 | tegra_qspi_clear_status(tqspi); | 1044 | tegra_qspi_clear_status(tqspi); |
| 1060 | 1045 | ||
| @@ -1111,15 +1096,15 @@ static int tegra_qspi_start_transfer_one(struct spi_device *spi, | |||
| 1111 | int rx_tap_delay; | 1096 | int rx_tap_delay; |
| 1112 | int tx_tap_delay; | 1097 | int tx_tap_delay; |
| 1113 | 1098 | ||
| 1114 | if(cdata->rx_tap_delay) { | 1099 | if (cdata->rx_tap_delay) { |
| 1115 | rx_tap_delay = min(cdata->tx_clk_tap_delay, 63); | 1100 | rx_tap_delay = min(cdata->tx_clk_tap_delay, 63); |
| 1116 | command2_reg = QSPI_RX_TAP_DELAY(rx_tap_delay); | 1101 | command2_reg = QSPI_RX_TAP_DELAY(rx_tap_delay); |
| 1117 | } | 1102 | } |
| 1118 | if(cdata->tx_tap_delay) { | 1103 | if (cdata->tx_tap_delay) { |
| 1119 | tx_tap_delay = min(cdata->tx_clk_tap_delay, 63); | 1104 | tx_tap_delay = min(cdata->tx_clk_tap_delay, 63); |
| 1120 | command2_reg |= QSPI_TX_TAP_DELAY(tx_tap_delay); | 1105 | command2_reg |= QSPI_TX_TAP_DELAY(tx_tap_delay); |
| 1121 | } | 1106 | } |
| 1122 | if((cdata->rx_tap_delay) || (cdata->tx_tap_delay)) | 1107 | if ((cdata->rx_tap_delay) || (cdata->tx_tap_delay)) |
| 1123 | tegra_qspi_writel(tqspi, command2_reg, QSPI_COMMAND2); | 1108 | tegra_qspi_writel(tqspi, command2_reg, QSPI_COMMAND2); |
| 1124 | } | 1109 | } |
| 1125 | 1110 | ||
| @@ -1803,6 +1788,14 @@ static int tegra_qspi_probe(struct platform_device *pdev) | |||
| 1803 | goto exit_free_irq; | 1788 | goto exit_free_irq; |
| 1804 | } | 1789 | } |
| 1805 | 1790 | ||
| 1791 | tqspi->sdr_ddr_clk = devm_clk_get(&pdev->dev, "qspi_out"); | ||
| 1792 | if (IS_ERR(tqspi->sdr_ddr_clk)) { | ||
| 1793 | dev_err(&pdev->dev, "can not get clock\n"); | ||
| 1794 | ret = PTR_ERR(tqspi->sdr_ddr_clk); | ||
| 1795 | goto exit_free_irq; | ||
| 1796 | } | ||
| 1797 | /* Set default mode to SDR */ | ||
| 1798 | tqspi->is_ddr_mode = false; | ||
| 1806 | tqspi->max_buf_size = QSPI_FIFO_DEPTH << 2; | 1799 | tqspi->max_buf_size = QSPI_FIFO_DEPTH << 2; |
| 1807 | tqspi->dma_buf_size = DEFAULT_SPI_DMA_BUF_LEN; | 1800 | tqspi->dma_buf_size = DEFAULT_SPI_DMA_BUF_LEN; |
| 1808 | tqspi->qspi_max_frequency = pdata->qspi_max_frequency; | 1801 | tqspi->qspi_max_frequency = pdata->qspi_max_frequency; |
| @@ -1829,9 +1822,17 @@ static int tegra_qspi_probe(struct platform_device *pdev) | |||
| 1829 | if (tqspi->clock_always_on) { | 1822 | if (tqspi->clock_always_on) { |
| 1830 | ret = clk_prepare_enable(tqspi->clk); | 1823 | ret = clk_prepare_enable(tqspi->clk); |
| 1831 | if (ret < 0) { | 1824 | if (ret < 0) { |
| 1832 | dev_err(tqspi->dev, "clk_prepare failed: %d\n", ret); | 1825 | dev_err(tqspi->dev, "clk_prepare failed qspi clk: %d\n" |
| 1826 | , ret); | ||
| 1827 | goto exit_deinit_dma; | ||
| 1828 | } | ||
| 1829 | ret = clk_prepare_enable(tqspi->sdr_ddr_clk); | ||
| 1830 | if (ret < 0) { | ||
| 1831 | dev_err(tqspi->dev, "clk_prepare failed for qspi_out clk: %d\n" | ||
| 1832 | , ret); | ||
| 1833 | goto exit_deinit_dma; | 1833 | goto exit_deinit_dma; |
| 1834 | } | 1834 | } |
| 1835 | |||
| 1835 | } | 1836 | } |
| 1836 | 1837 | ||
| 1837 | pm_runtime_enable(&pdev->dev); | 1838 | pm_runtime_enable(&pdev->dev); |
| @@ -1880,8 +1881,10 @@ exit_pm_disable: | |||
| 1880 | pm_runtime_disable(&pdev->dev); | 1881 | pm_runtime_disable(&pdev->dev); |
| 1881 | if (!pm_runtime_status_suspended(&pdev->dev)) | 1882 | if (!pm_runtime_status_suspended(&pdev->dev)) |
| 1882 | tegra_qspi_runtime_suspend(&pdev->dev); | 1883 | tegra_qspi_runtime_suspend(&pdev->dev); |
| 1883 | if (tqspi->clock_always_on) | 1884 | if (tqspi->clock_always_on) { |
| 1885 | clk_disable_unprepare(tqspi->sdr_ddr_clk); | ||
| 1884 | clk_disable_unprepare(tqspi->clk); | 1886 | clk_disable_unprepare(tqspi->clk); |
| 1887 | } | ||
| 1885 | exit_deinit_dma: | 1888 | exit_deinit_dma: |
| 1886 | tegra_qspi_deinit_dma_param(tqspi, false); | 1889 | tegra_qspi_deinit_dma_param(tqspi, false); |
| 1887 | exit_rx_dma_free: | 1890 | exit_rx_dma_free: |
| @@ -1913,8 +1916,10 @@ static int tegra_qspi_remove(struct platform_device *pdev) | |||
| 1913 | if (!pm_runtime_status_suspended(&pdev->dev)) | 1916 | if (!pm_runtime_status_suspended(&pdev->dev)) |
| 1914 | tegra_qspi_runtime_suspend(&pdev->dev); | 1917 | tegra_qspi_runtime_suspend(&pdev->dev); |
| 1915 | 1918 | ||
| 1916 | if (tqspi->clock_always_on) | 1919 | if (tqspi->clock_always_on) { |
| 1920 | clk_disable_unprepare(tqspi->sdr_ddr_clk); | ||
| 1917 | clk_disable_unprepare(tqspi->clk); | 1921 | clk_disable_unprepare(tqspi->clk); |
| 1922 | } | ||
| 1918 | return 0; | 1923 | return 0; |
| 1919 | } | 1924 | } |
| 1920 | #ifdef CONFIG_PM_SLEEP | 1925 | #ifdef CONFIG_PM_SLEEP |
| @@ -1926,9 +1931,10 @@ static int tegra_qspi_suspend(struct device *dev) | |||
| 1926 | 1931 | ||
| 1927 | ret = spi_master_suspend(master); | 1932 | ret = spi_master_suspend(master); |
| 1928 | 1933 | ||
| 1929 | if (tqspi->clock_always_on) | 1934 | if (tqspi->clock_always_on) { |
| 1935 | clk_disable_unprepare(tqspi->sdr_ddr_clk); | ||
| 1930 | clk_disable_unprepare(tqspi->clk); | 1936 | clk_disable_unprepare(tqspi->clk); |
| 1931 | 1937 | } | |
| 1932 | return ret; | 1938 | return ret; |
| 1933 | } | 1939 | } |
| 1934 | 1940 | ||
| @@ -1941,11 +1947,17 @@ static int tegra_qspi_resume(struct device *dev) | |||
| 1941 | if (tqspi->clock_always_on) { | 1947 | if (tqspi->clock_always_on) { |
| 1942 | ret = clk_prepare_enable(tqspi->clk); | 1948 | ret = clk_prepare_enable(tqspi->clk); |
| 1943 | if (ret < 0) { | 1949 | if (ret < 0) { |
| 1944 | dev_err(tqspi->dev, "clk_prepare failed: %d\n", ret); | 1950 | dev_err(tqspi->dev, "clk_prepare failed for qspi clk: %d\n" |
| 1951 | , ret); | ||
| 1952 | return ret; | ||
| 1953 | } | ||
| 1954 | ret = clk_prepare_enable(tqspi->sdr_ddr_clk); | ||
| 1955 | if (ret < 0) { | ||
| 1956 | dev_err(tqspi->dev, "clk_prepare failed for qspi_out clk: %d\n" | ||
| 1957 | , ret); | ||
| 1945 | return ret; | 1958 | return ret; |
| 1946 | } | 1959 | } |
| 1947 | } | 1960 | } |
| 1948 | |||
| 1949 | ret = pm_runtime_get_sync(dev); | 1961 | ret = pm_runtime_get_sync(dev); |
| 1950 | if (ret < 0) { | 1962 | if (ret < 0) { |
| 1951 | dev_err(dev, "pm runtime failed, e = %d\n", ret); | 1963 | dev_err(dev, "pm runtime failed, e = %d\n", ret); |
| @@ -1966,6 +1978,7 @@ static int tegra_qspi_runtime_suspend(struct device *dev) | |||
| 1966 | /* Flush all write which are in PPSB queue by reading back */ | 1978 | /* Flush all write which are in PPSB queue by reading back */ |
| 1967 | tegra_qspi_readl(tqspi, QSPI_COMMAND1); | 1979 | tegra_qspi_readl(tqspi, QSPI_COMMAND1); |
| 1968 | 1980 | ||
| 1981 | clk_disable_unprepare(tqspi->sdr_ddr_clk); | ||
| 1969 | clk_disable_unprepare(tqspi->clk); | 1982 | clk_disable_unprepare(tqspi->clk); |
| 1970 | return 0; | 1983 | return 0; |
| 1971 | } | 1984 | } |
| @@ -1978,7 +1991,14 @@ static int tegra_qspi_runtime_resume(struct device *dev) | |||
| 1978 | 1991 | ||
| 1979 | ret = clk_prepare_enable(tqspi->clk); | 1992 | ret = clk_prepare_enable(tqspi->clk); |
| 1980 | if (ret < 0) { | 1993 | if (ret < 0) { |
| 1981 | dev_err(tqspi->dev, "clk_prepare failed: %d\n", ret); | 1994 | dev_err(tqspi->dev, "clk_prepare failed for qspi clk: %d\n" |
| 1995 | , ret); | ||
| 1996 | return ret; | ||
| 1997 | } | ||
| 1998 | ret = clk_prepare_enable(tqspi->sdr_ddr_clk); | ||
| 1999 | if (ret < 0) { | ||
| 2000 | dev_err(tqspi->dev, "clk_prepare failed for qspi_out clk: %d\n" | ||
| 2001 | , ret); | ||
| 1982 | return ret; | 2002 | return ret; |
| 1983 | } | 2003 | } |
| 1984 | return 0; | 2004 | return 0; |
