Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * drivers/ata/ahci_tegra.c
0004  *
0005  * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
0006  *
0007  * Author:
0008  *  Mikko Perttunen <mperttunen@nvidia.com>
0009  */
0010 
0011 #include <linux/ahci_platform.h>
0012 #include <linux/errno.h>
0013 #include <linux/kernel.h>
0014 #include <linux/module.h>
0015 #include <linux/of_device.h>
0016 #include <linux/platform_device.h>
0017 #include <linux/regulator/consumer.h>
0018 #include <linux/reset.h>
0019 
0020 #include <soc/tegra/fuse.h>
0021 #include <soc/tegra/pmc.h>
0022 
0023 #include "ahci.h"
0024 
0025 #define DRV_NAME "tegra-ahci"
0026 
0027 #define SATA_CONFIGURATION_0                0x180
0028 #define SATA_CONFIGURATION_0_EN_FPCI            BIT(0)
0029 #define SATA_CONFIGURATION_0_CLK_OVERRIDE           BIT(31)
0030 
0031 #define SCFG_OFFSET                 0x1000
0032 
0033 #define T_SATA0_CFG_1                   0x04
0034 #define T_SATA0_CFG_1_IO_SPACE              BIT(0)
0035 #define T_SATA0_CFG_1_MEMORY_SPACE          BIT(1)
0036 #define T_SATA0_CFG_1_BUS_MASTER            BIT(2)
0037 #define T_SATA0_CFG_1_SERR              BIT(8)
0038 
0039 #define T_SATA0_CFG_9                   0x24
0040 #define T_SATA0_CFG_9_BASE_ADDRESS          0x40020000
0041 
0042 #define SATA_FPCI_BAR5                  0x94
0043 #define SATA_FPCI_BAR5_START_MASK           (0xfffffff << 4)
0044 #define SATA_FPCI_BAR5_START                (0x0040020 << 4)
0045 #define SATA_FPCI_BAR5_ACCESS_TYPE          (0x1)
0046 
0047 #define SATA_INTR_MASK                  0x188
0048 #define SATA_INTR_MASK_IP_INT_MASK          BIT(16)
0049 
0050 #define T_SATA0_CFG_35                  0x94
0051 #define T_SATA0_CFG_35_IDP_INDEX_MASK           (0x7ff << 2)
0052 #define T_SATA0_CFG_35_IDP_INDEX            (0x2a << 2)
0053 
0054 #define T_SATA0_AHCI_IDP1               0x98
0055 #define T_SATA0_AHCI_IDP1_DATA              (0x400040)
0056 
0057 #define T_SATA0_CFG_PHY_1               0x12c
0058 #define T_SATA0_CFG_PHY_1_PADS_IDDQ_EN          BIT(23)
0059 #define T_SATA0_CFG_PHY_1_PAD_PLL_IDDQ_EN       BIT(22)
0060 
0061 #define T_SATA0_NVOOB                                   0x114
0062 #define T_SATA0_NVOOB_SQUELCH_FILTER_MODE_MASK          (0x3 << 24)
0063 #define T_SATA0_NVOOB_SQUELCH_FILTER_MODE               (0x1 << 24)
0064 #define T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH_MASK        (0x3 << 26)
0065 #define T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH             (0x3 << 26)
0066 
0067 #define T_SATA_CFG_PHY_0                                0x120
0068 #define T_SATA_CFG_PHY_0_USE_7BIT_ALIGN_DET_FOR_SPD     BIT(11)
0069 #define T_SATA_CFG_PHY_0_MASK_SQUELCH                   BIT(24)
0070 
0071 #define T_SATA0_CFG2NVOOB_2             0x134
0072 #define T_SATA0_CFG2NVOOB_2_COMWAKE_IDLE_CNT_LOW_MASK   (0x1ff << 18)
0073 #define T_SATA0_CFG2NVOOB_2_COMWAKE_IDLE_CNT_LOW    (0xc << 18)
0074 
0075 #define T_SATA0_AHCI_HBA_CAP_BKDR           0x300
0076 #define T_SATA0_AHCI_HBA_CAP_BKDR_PARTIAL_ST_CAP    BIT(13)
0077 #define T_SATA0_AHCI_HBA_CAP_BKDR_SLUMBER_ST_CAP    BIT(14)
0078 #define T_SATA0_AHCI_HBA_CAP_BKDR_SALP          BIT(26)
0079 #define T_SATA0_AHCI_HBA_CAP_BKDR_SUPP_PM       BIT(17)
0080 #define T_SATA0_AHCI_HBA_CAP_BKDR_SNCQ          BIT(30)
0081 
0082 #define T_SATA0_BKDOOR_CC               0x4a4
0083 #define T_SATA0_BKDOOR_CC_CLASS_CODE_MASK       (0xffff << 16)
0084 #define T_SATA0_BKDOOR_CC_CLASS_CODE            (0x0106 << 16)
0085 #define T_SATA0_BKDOOR_CC_PROG_IF_MASK          (0xff << 8)
0086 #define T_SATA0_BKDOOR_CC_PROG_IF           (0x01 << 8)
0087 
0088 #define T_SATA0_CFG_SATA                0x54c
0089 #define T_SATA0_CFG_SATA_BACKDOOR_PROG_IF_EN        BIT(12)
0090 
0091 #define T_SATA0_CFG_MISC                0x550
0092 
0093 #define T_SATA0_INDEX                   0x680
0094 
0095 #define T_SATA0_CHX_PHY_CTRL1_GEN1          0x690
0096 #define T_SATA0_CHX_PHY_CTRL1_GEN1_TX_AMP_MASK      0xff
0097 #define T_SATA0_CHX_PHY_CTRL1_GEN1_TX_AMP_SHIFT     0
0098 #define T_SATA0_CHX_PHY_CTRL1_GEN1_TX_PEAK_MASK     (0xff << 8)
0099 #define T_SATA0_CHX_PHY_CTRL1_GEN1_TX_PEAK_SHIFT    8
0100 
0101 #define T_SATA0_CHX_PHY_CTRL1_GEN2          0x694
0102 #define T_SATA0_CHX_PHY_CTRL1_GEN2_TX_AMP_MASK      0xff
0103 #define T_SATA0_CHX_PHY_CTRL1_GEN2_TX_AMP_SHIFT     0
0104 #define T_SATA0_CHX_PHY_CTRL1_GEN2_TX_PEAK_MASK     (0xff << 12)
0105 #define T_SATA0_CHX_PHY_CTRL1_GEN2_TX_PEAK_SHIFT    12
0106 
0107 #define T_SATA0_CHX_PHY_CTRL2               0x69c
0108 #define T_SATA0_CHX_PHY_CTRL2_CDR_CNTL_GEN1     0x23
0109 
0110 #define T_SATA0_CHX_PHY_CTRL11              0x6d0
0111 #define T_SATA0_CHX_PHY_CTRL11_GEN2_RX_EQ       (0x2800 << 16)
0112 
0113 #define T_SATA0_CHX_PHY_CTRL17_0            0x6e8
0114 #define T_SATA0_CHX_PHY_CTRL17_0_RX_EQ_CTRL_L_GEN1  0x55010000
0115 #define T_SATA0_CHX_PHY_CTRL18_0            0x6ec
0116 #define T_SATA0_CHX_PHY_CTRL18_0_RX_EQ_CTRL_L_GEN2  0x55010000
0117 #define T_SATA0_CHX_PHY_CTRL20_0            0x6f4
0118 #define T_SATA0_CHX_PHY_CTRL20_0_RX_EQ_CTRL_H_GEN1  0x1
0119 #define T_SATA0_CHX_PHY_CTRL21_0            0x6f8
0120 #define T_SATA0_CHX_PHY_CTRL21_0_RX_EQ_CTRL_H_GEN2  0x1
0121 
0122 /* AUX Registers */
0123 #define SATA_AUX_MISC_CNTL_1_0              0x8
0124 #define SATA_AUX_MISC_CNTL_1_0_DEVSLP_OVERRIDE      BIT(17)
0125 #define SATA_AUX_MISC_CNTL_1_0_SDS_SUPPORT      BIT(13)
0126 #define SATA_AUX_MISC_CNTL_1_0_DESO_SUPPORT     BIT(15)
0127 
0128 #define SATA_AUX_RX_STAT_INT_0              0xc
0129 #define SATA_AUX_RX_STAT_INT_0_SATA_DEVSLP      BIT(7)
0130 
0131 #define SATA_AUX_SPARE_CFG0_0               0x18
0132 #define SATA_AUX_SPARE_CFG0_0_MDAT_TIMER_AFTER_PG_VALID BIT(14)
0133 
0134 #define FUSE_SATA_CALIB                 0x124
0135 #define FUSE_SATA_CALIB_MASK                0x3
0136 
0137 struct sata_pad_calibration {
0138     u8 gen1_tx_amp;
0139     u8 gen1_tx_peak;
0140     u8 gen2_tx_amp;
0141     u8 gen2_tx_peak;
0142 };
0143 
0144 static const struct sata_pad_calibration tegra124_pad_calibration[] = {
0145     {0x18, 0x04, 0x18, 0x0a},
0146     {0x0e, 0x04, 0x14, 0x0a},
0147     {0x0e, 0x07, 0x1a, 0x0e},
0148     {0x14, 0x0e, 0x1a, 0x0e},
0149 };
0150 
0151 struct tegra_ahci_ops {
0152     int (*init)(struct ahci_host_priv *hpriv);
0153 };
0154 
0155 struct tegra_ahci_regs {
0156     unsigned int nvoob_comma_cnt_mask;
0157     unsigned int nvoob_comma_cnt_val;
0158 };
0159 
0160 struct tegra_ahci_soc {
0161     const char *const       *supply_names;
0162     u32             num_supplies;
0163     bool                supports_devslp;
0164     bool                has_sata_oob_rst;
0165     const struct tegra_ahci_ops *ops;
0166     const struct tegra_ahci_regs    *regs;
0167 };
0168 
0169 struct tegra_ahci_priv {
0170     struct platform_device     *pdev;
0171     void __iomem           *sata_regs;
0172     void __iomem           *sata_aux_regs;
0173     struct reset_control       *sata_rst;
0174     struct reset_control       *sata_oob_rst;
0175     struct reset_control       *sata_cold_rst;
0176     /* Needs special handling, cannot use ahci_platform */
0177     struct clk         *sata_clk;
0178     struct regulator_bulk_data *supplies;
0179     const struct tegra_ahci_soc *soc;
0180 };
0181 
0182 static void tegra_ahci_handle_quirks(struct ahci_host_priv *hpriv)
0183 {
0184     struct tegra_ahci_priv *tegra = hpriv->plat_data;
0185     u32 val;
0186 
0187     if (tegra->sata_aux_regs && !tegra->soc->supports_devslp) {
0188         val = readl(tegra->sata_aux_regs + SATA_AUX_MISC_CNTL_1_0);
0189         val &= ~SATA_AUX_MISC_CNTL_1_0_SDS_SUPPORT;
0190         writel(val, tegra->sata_aux_regs + SATA_AUX_MISC_CNTL_1_0);
0191     }
0192 }
0193 
0194 static int tegra124_ahci_init(struct ahci_host_priv *hpriv)
0195 {
0196     struct tegra_ahci_priv *tegra = hpriv->plat_data;
0197     struct sata_pad_calibration calib;
0198     int ret;
0199     u32 val;
0200 
0201     /* Pad calibration */
0202     ret = tegra_fuse_readl(FUSE_SATA_CALIB, &val);
0203     if (ret)
0204         return ret;
0205 
0206     calib = tegra124_pad_calibration[val & FUSE_SATA_CALIB_MASK];
0207 
0208     writel(BIT(0), tegra->sata_regs + SCFG_OFFSET + T_SATA0_INDEX);
0209 
0210     val = readl(tegra->sata_regs +
0211             SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL1_GEN1);
0212     val &= ~T_SATA0_CHX_PHY_CTRL1_GEN1_TX_AMP_MASK;
0213     val &= ~T_SATA0_CHX_PHY_CTRL1_GEN1_TX_PEAK_MASK;
0214     val |= calib.gen1_tx_amp << T_SATA0_CHX_PHY_CTRL1_GEN1_TX_AMP_SHIFT;
0215     val |= calib.gen1_tx_peak << T_SATA0_CHX_PHY_CTRL1_GEN1_TX_PEAK_SHIFT;
0216     writel(val, tegra->sata_regs + SCFG_OFFSET +
0217            T_SATA0_CHX_PHY_CTRL1_GEN1);
0218 
0219     val = readl(tegra->sata_regs +
0220             SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL1_GEN2);
0221     val &= ~T_SATA0_CHX_PHY_CTRL1_GEN2_TX_AMP_MASK;
0222     val &= ~T_SATA0_CHX_PHY_CTRL1_GEN2_TX_PEAK_MASK;
0223     val |= calib.gen2_tx_amp << T_SATA0_CHX_PHY_CTRL1_GEN1_TX_AMP_SHIFT;
0224     val |= calib.gen2_tx_peak << T_SATA0_CHX_PHY_CTRL1_GEN1_TX_PEAK_SHIFT;
0225     writel(val, tegra->sata_regs + SCFG_OFFSET +
0226            T_SATA0_CHX_PHY_CTRL1_GEN2);
0227 
0228     writel(T_SATA0_CHX_PHY_CTRL11_GEN2_RX_EQ,
0229            tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL11);
0230     writel(T_SATA0_CHX_PHY_CTRL2_CDR_CNTL_GEN1,
0231            tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL2);
0232 
0233     writel(0, tegra->sata_regs + SCFG_OFFSET + T_SATA0_INDEX);
0234 
0235     return 0;
0236 }
0237 
0238 static int tegra_ahci_power_on(struct ahci_host_priv *hpriv)
0239 {
0240     struct tegra_ahci_priv *tegra = hpriv->plat_data;
0241     int ret;
0242 
0243     ret = regulator_bulk_enable(tegra->soc->num_supplies,
0244                     tegra->supplies);
0245     if (ret)
0246         return ret;
0247 
0248     if (!tegra->pdev->dev.pm_domain) {
0249         ret = tegra_powergate_sequence_power_up(TEGRA_POWERGATE_SATA,
0250                             tegra->sata_clk,
0251                             tegra->sata_rst);
0252         if (ret)
0253             goto disable_regulators;
0254     }
0255 
0256     reset_control_assert(tegra->sata_oob_rst);
0257     reset_control_assert(tegra->sata_cold_rst);
0258 
0259     ret = ahci_platform_enable_resources(hpriv);
0260     if (ret)
0261         goto disable_power;
0262 
0263     reset_control_deassert(tegra->sata_cold_rst);
0264     reset_control_deassert(tegra->sata_oob_rst);
0265 
0266     return 0;
0267 
0268 disable_power:
0269     clk_disable_unprepare(tegra->sata_clk);
0270 
0271     if (!tegra->pdev->dev.pm_domain)
0272         tegra_powergate_power_off(TEGRA_POWERGATE_SATA);
0273 
0274 disable_regulators:
0275     regulator_bulk_disable(tegra->soc->num_supplies, tegra->supplies);
0276 
0277     return ret;
0278 }
0279 
0280 static void tegra_ahci_power_off(struct ahci_host_priv *hpriv)
0281 {
0282     struct tegra_ahci_priv *tegra = hpriv->plat_data;
0283 
0284     ahci_platform_disable_resources(hpriv);
0285 
0286     reset_control_assert(tegra->sata_rst);
0287     reset_control_assert(tegra->sata_oob_rst);
0288     reset_control_assert(tegra->sata_cold_rst);
0289 
0290     clk_disable_unprepare(tegra->sata_clk);
0291     if (!tegra->pdev->dev.pm_domain)
0292         tegra_powergate_power_off(TEGRA_POWERGATE_SATA);
0293 
0294     regulator_bulk_disable(tegra->soc->num_supplies, tegra->supplies);
0295 }
0296 
0297 static int tegra_ahci_controller_init(struct ahci_host_priv *hpriv)
0298 {
0299     struct tegra_ahci_priv *tegra = hpriv->plat_data;
0300     int ret;
0301     u32 val;
0302 
0303     ret = tegra_ahci_power_on(hpriv);
0304     if (ret) {
0305         dev_err(&tegra->pdev->dev,
0306             "failed to power on AHCI controller: %d\n", ret);
0307         return ret;
0308     }
0309 
0310     /*
0311      * Program the following SATA IPFS registers to allow SW accesses to
0312      * SATA's MMIO register range.
0313      */
0314     val = readl(tegra->sata_regs + SATA_FPCI_BAR5);
0315     val &= ~(SATA_FPCI_BAR5_START_MASK | SATA_FPCI_BAR5_ACCESS_TYPE);
0316     val |= SATA_FPCI_BAR5_START | SATA_FPCI_BAR5_ACCESS_TYPE;
0317     writel(val, tegra->sata_regs + SATA_FPCI_BAR5);
0318 
0319     /* Program the following SATA IPFS register to enable the SATA */
0320     val = readl(tegra->sata_regs + SATA_CONFIGURATION_0);
0321     val |= SATA_CONFIGURATION_0_EN_FPCI;
0322     writel(val, tegra->sata_regs + SATA_CONFIGURATION_0);
0323 
0324     /* Electrical settings for better link stability */
0325     val = T_SATA0_CHX_PHY_CTRL17_0_RX_EQ_CTRL_L_GEN1;
0326     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL17_0);
0327     val = T_SATA0_CHX_PHY_CTRL18_0_RX_EQ_CTRL_L_GEN2;
0328     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL18_0);
0329     val = T_SATA0_CHX_PHY_CTRL20_0_RX_EQ_CTRL_H_GEN1;
0330     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL20_0);
0331     val = T_SATA0_CHX_PHY_CTRL21_0_RX_EQ_CTRL_H_GEN2;
0332     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL21_0);
0333 
0334     /* For SQUELCH Filter & Gen3 drive getting detected as Gen1 drive */
0335 
0336     val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA_CFG_PHY_0);
0337     val |= T_SATA_CFG_PHY_0_MASK_SQUELCH;
0338     val &= ~T_SATA_CFG_PHY_0_USE_7BIT_ALIGN_DET_FOR_SPD;
0339     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA_CFG_PHY_0);
0340 
0341     val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_NVOOB);
0342     val &= ~(tegra->soc->regs->nvoob_comma_cnt_mask |
0343          T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH_MASK |
0344          T_SATA0_NVOOB_SQUELCH_FILTER_MODE_MASK);
0345     val |= (tegra->soc->regs->nvoob_comma_cnt_val |
0346         T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH |
0347         T_SATA0_NVOOB_SQUELCH_FILTER_MODE);
0348     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_NVOOB);
0349 
0350     /*
0351      * Change CFG2NVOOB_2_COMWAKE_IDLE_CNT_LOW from 83.3 ns to 58.8ns
0352      */
0353     val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG2NVOOB_2);
0354     val &= ~T_SATA0_CFG2NVOOB_2_COMWAKE_IDLE_CNT_LOW_MASK;
0355     val |= T_SATA0_CFG2NVOOB_2_COMWAKE_IDLE_CNT_LOW;
0356     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG2NVOOB_2);
0357 
0358     if (tegra->soc->ops && tegra->soc->ops->init)
0359         tegra->soc->ops->init(hpriv);
0360 
0361     /*
0362      * Program the following SATA configuration registers to
0363      * initialize SATA
0364      */
0365     val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_1);
0366     val |= (T_SATA0_CFG_1_IO_SPACE | T_SATA0_CFG_1_MEMORY_SPACE |
0367         T_SATA0_CFG_1_BUS_MASTER | T_SATA0_CFG_1_SERR);
0368     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_1);
0369     val = T_SATA0_CFG_9_BASE_ADDRESS;
0370     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_9);
0371 
0372     /* Program Class Code and Programming interface for SATA */
0373     val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_SATA);
0374     val |= T_SATA0_CFG_SATA_BACKDOOR_PROG_IF_EN;
0375     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_SATA);
0376 
0377     val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_BKDOOR_CC);
0378     val &=
0379         ~(T_SATA0_BKDOOR_CC_CLASS_CODE_MASK |
0380           T_SATA0_BKDOOR_CC_PROG_IF_MASK);
0381     val |= T_SATA0_BKDOOR_CC_CLASS_CODE | T_SATA0_BKDOOR_CC_PROG_IF;
0382     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_BKDOOR_CC);
0383 
0384     val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_SATA);
0385     val &= ~T_SATA0_CFG_SATA_BACKDOOR_PROG_IF_EN;
0386     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_SATA);
0387 
0388     /* Enabling LPM capabilities through Backdoor Programming */
0389     val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_AHCI_HBA_CAP_BKDR);
0390     val |= (T_SATA0_AHCI_HBA_CAP_BKDR_PARTIAL_ST_CAP |
0391         T_SATA0_AHCI_HBA_CAP_BKDR_SLUMBER_ST_CAP |
0392         T_SATA0_AHCI_HBA_CAP_BKDR_SALP |
0393         T_SATA0_AHCI_HBA_CAP_BKDR_SUPP_PM);
0394     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_AHCI_HBA_CAP_BKDR);
0395 
0396     /* SATA Second Level Clock Gating configuration
0397      * Enabling Gating of Tx/Rx clocks and driving Pad IDDQ and Lane
0398      * IDDQ Signals
0399      */
0400     val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_35);
0401     val &= ~T_SATA0_CFG_35_IDP_INDEX_MASK;
0402     val |= T_SATA0_CFG_35_IDP_INDEX;
0403     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_35);
0404 
0405     val = T_SATA0_AHCI_IDP1_DATA;
0406     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_AHCI_IDP1);
0407 
0408     val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_PHY_1);
0409     val |= (T_SATA0_CFG_PHY_1_PADS_IDDQ_EN |
0410         T_SATA0_CFG_PHY_1_PAD_PLL_IDDQ_EN);
0411     writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_PHY_1);
0412 
0413     /* Enabling IPFS Clock Gating */
0414     val = readl(tegra->sata_regs + SATA_CONFIGURATION_0);
0415     val &= ~SATA_CONFIGURATION_0_CLK_OVERRIDE;
0416     writel(val, tegra->sata_regs + SATA_CONFIGURATION_0);
0417 
0418     tegra_ahci_handle_quirks(hpriv);
0419 
0420     /* Unmask SATA interrupts */
0421 
0422     val = readl(tegra->sata_regs + SATA_INTR_MASK);
0423     val |= SATA_INTR_MASK_IP_INT_MASK;
0424     writel(val, tegra->sata_regs + SATA_INTR_MASK);
0425 
0426     return 0;
0427 }
0428 
0429 static void tegra_ahci_controller_deinit(struct ahci_host_priv *hpriv)
0430 {
0431     tegra_ahci_power_off(hpriv);
0432 }
0433 
0434 static void tegra_ahci_host_stop(struct ata_host *host)
0435 {
0436     struct ahci_host_priv *hpriv = host->private_data;
0437 
0438     tegra_ahci_controller_deinit(hpriv);
0439 }
0440 
0441 static struct ata_port_operations ahci_tegra_port_ops = {
0442     .inherits   = &ahci_ops,
0443     .host_stop  = tegra_ahci_host_stop,
0444 };
0445 
0446 static const struct ata_port_info ahci_tegra_port_info = {
0447     .flags      = AHCI_FLAG_COMMON | ATA_FLAG_NO_DIPM,
0448     .pio_mask   = ATA_PIO4,
0449     .udma_mask  = ATA_UDMA6,
0450     .port_ops   = &ahci_tegra_port_ops,
0451 };
0452 
0453 static const char *const tegra124_supply_names[] = {
0454     "avdd", "hvdd", "vddio", "target-5v", "target-12v"
0455 };
0456 
0457 static const struct tegra_ahci_ops tegra124_ahci_ops = {
0458     .init = tegra124_ahci_init,
0459 };
0460 
0461 static const struct tegra_ahci_regs tegra124_ahci_regs = {
0462     .nvoob_comma_cnt_mask = GENMASK(30, 28),
0463     .nvoob_comma_cnt_val = (7 << 28),
0464 };
0465 
0466 static const struct tegra_ahci_soc tegra124_ahci_soc = {
0467     .supply_names = tegra124_supply_names,
0468     .num_supplies = ARRAY_SIZE(tegra124_supply_names),
0469     .supports_devslp = false,
0470     .has_sata_oob_rst = true,
0471     .ops = &tegra124_ahci_ops,
0472     .regs = &tegra124_ahci_regs,
0473 };
0474 
0475 static const struct tegra_ahci_soc tegra210_ahci_soc = {
0476     .supports_devslp = false,
0477     .has_sata_oob_rst = true,
0478     .regs = &tegra124_ahci_regs,
0479 };
0480 
0481 static const struct tegra_ahci_regs tegra186_ahci_regs = {
0482     .nvoob_comma_cnt_mask = GENMASK(23, 16),
0483     .nvoob_comma_cnt_val = (7 << 16),
0484 };
0485 
0486 static const struct tegra_ahci_soc tegra186_ahci_soc = {
0487     .supports_devslp = false,
0488     .has_sata_oob_rst = false,
0489     .regs = &tegra186_ahci_regs,
0490 };
0491 
0492 static const struct of_device_id tegra_ahci_of_match[] = {
0493     {
0494         .compatible = "nvidia,tegra124-ahci",
0495         .data = &tegra124_ahci_soc
0496     },
0497     {
0498         .compatible = "nvidia,tegra210-ahci",
0499         .data = &tegra210_ahci_soc
0500     },
0501     {
0502         .compatible = "nvidia,tegra186-ahci",
0503         .data = &tegra186_ahci_soc
0504     },
0505     {}
0506 };
0507 MODULE_DEVICE_TABLE(of, tegra_ahci_of_match);
0508 
0509 static struct scsi_host_template ahci_platform_sht = {
0510     AHCI_SHT(DRV_NAME),
0511 };
0512 
0513 static int tegra_ahci_probe(struct platform_device *pdev)
0514 {
0515     struct ahci_host_priv *hpriv;
0516     struct tegra_ahci_priv *tegra;
0517     struct resource *res;
0518     int ret;
0519 
0520     hpriv = ahci_platform_get_resources(pdev, 0);
0521     if (IS_ERR(hpriv))
0522         return PTR_ERR(hpriv);
0523 
0524     tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL);
0525     if (!tegra)
0526         return -ENOMEM;
0527 
0528     hpriv->plat_data = tegra;
0529 
0530     tegra->pdev = pdev;
0531     tegra->soc = of_device_get_match_data(&pdev->dev);
0532 
0533     res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
0534     tegra->sata_regs = devm_ioremap_resource(&pdev->dev, res);
0535     if (IS_ERR(tegra->sata_regs))
0536         return PTR_ERR(tegra->sata_regs);
0537 
0538     /*
0539      * AUX registers is optional.
0540      */
0541     res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
0542     if (res) {
0543         tegra->sata_aux_regs = devm_ioremap_resource(&pdev->dev, res);
0544         if (IS_ERR(tegra->sata_aux_regs))
0545             return PTR_ERR(tegra->sata_aux_regs);
0546     }
0547 
0548     tegra->sata_rst = devm_reset_control_get(&pdev->dev, "sata");
0549     if (IS_ERR(tegra->sata_rst)) {
0550         dev_err(&pdev->dev, "Failed to get sata reset\n");
0551         return PTR_ERR(tegra->sata_rst);
0552     }
0553 
0554     if (tegra->soc->has_sata_oob_rst) {
0555         tegra->sata_oob_rst = devm_reset_control_get(&pdev->dev,
0556                                  "sata-oob");
0557         if (IS_ERR(tegra->sata_oob_rst)) {
0558             dev_err(&pdev->dev, "Failed to get sata-oob reset\n");
0559             return PTR_ERR(tegra->sata_oob_rst);
0560         }
0561     }
0562 
0563     tegra->sata_cold_rst = devm_reset_control_get(&pdev->dev, "sata-cold");
0564     if (IS_ERR(tegra->sata_cold_rst)) {
0565         dev_err(&pdev->dev, "Failed to get sata-cold reset\n");
0566         return PTR_ERR(tegra->sata_cold_rst);
0567     }
0568 
0569     tegra->sata_clk = devm_clk_get(&pdev->dev, "sata");
0570     if (IS_ERR(tegra->sata_clk)) {
0571         dev_err(&pdev->dev, "Failed to get sata clock\n");
0572         return PTR_ERR(tegra->sata_clk);
0573     }
0574 
0575     tegra->supplies = devm_kcalloc(&pdev->dev,
0576                        tegra->soc->num_supplies,
0577                        sizeof(*tegra->supplies), GFP_KERNEL);
0578     if (!tegra->supplies)
0579         return -ENOMEM;
0580 
0581     regulator_bulk_set_supply_names(tegra->supplies,
0582                     tegra->soc->supply_names,
0583                     tegra->soc->num_supplies);
0584 
0585     ret = devm_regulator_bulk_get(&pdev->dev,
0586                       tegra->soc->num_supplies,
0587                       tegra->supplies);
0588     if (ret) {
0589         dev_err(&pdev->dev, "Failed to get regulators\n");
0590         return ret;
0591     }
0592 
0593     ret = tegra_ahci_controller_init(hpriv);
0594     if (ret)
0595         return ret;
0596 
0597     ret = ahci_platform_init_host(pdev, hpriv, &ahci_tegra_port_info,
0598                       &ahci_platform_sht);
0599     if (ret)
0600         goto deinit_controller;
0601 
0602     return 0;
0603 
0604 deinit_controller:
0605     tegra_ahci_controller_deinit(hpriv);
0606 
0607     return ret;
0608 };
0609 
0610 static struct platform_driver tegra_ahci_driver = {
0611     .probe = tegra_ahci_probe,
0612     .remove = ata_platform_remove_one,
0613     .driver = {
0614         .name = DRV_NAME,
0615         .of_match_table = tegra_ahci_of_match,
0616     },
0617     /* LP0 suspend support not implemented */
0618 };
0619 module_platform_driver(tegra_ahci_driver);
0620 
0621 MODULE_AUTHOR("Mikko Perttunen <mperttunen@nvidia.com>");
0622 MODULE_DESCRIPTION("Tegra AHCI SATA driver");
0623 MODULE_LICENSE("GPL v2");