0001
0002
0003
0004
0005
0006
0007
0008
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
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
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
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
0312
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
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
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
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
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
0363
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
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
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
0397
0398
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
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
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
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
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");