root/drivers/ata/ahci_tegra.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. tegra_ahci_handle_quirks
  2. tegra124_ahci_init
  3. tegra_ahci_power_on
  4. tegra_ahci_power_off
  5. tegra_ahci_controller_init
  6. tegra_ahci_controller_deinit
  7. tegra_ahci_host_stop
  8. tegra_ahci_probe

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * drivers/ata/ahci_tegra.c
   4  *
   5  * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
   6  *
   7  * Author:
   8  *      Mikko Perttunen <mperttunen@nvidia.com>
   9  */
  10 
  11 #include <linux/ahci_platform.h>
  12 #include <linux/errno.h>
  13 #include <linux/kernel.h>
  14 #include <linux/module.h>
  15 #include <linux/of_device.h>
  16 #include <linux/platform_device.h>
  17 #include <linux/regulator/consumer.h>
  18 #include <linux/reset.h>
  19 
  20 #include <soc/tegra/fuse.h>
  21 #include <soc/tegra/pmc.h>
  22 
  23 #include "ahci.h"
  24 
  25 #define DRV_NAME "tegra-ahci"
  26 
  27 #define SATA_CONFIGURATION_0                            0x180
  28 #define SATA_CONFIGURATION_0_EN_FPCI                    BIT(0)
  29 #define SATA_CONFIGURATION_0_CLK_OVERRIDE                       BIT(31)
  30 
  31 #define SCFG_OFFSET                                     0x1000
  32 
  33 #define T_SATA0_CFG_1                                   0x04
  34 #define T_SATA0_CFG_1_IO_SPACE                          BIT(0)
  35 #define T_SATA0_CFG_1_MEMORY_SPACE                      BIT(1)
  36 #define T_SATA0_CFG_1_BUS_MASTER                        BIT(2)
  37 #define T_SATA0_CFG_1_SERR                              BIT(8)
  38 
  39 #define T_SATA0_CFG_9                                   0x24
  40 #define T_SATA0_CFG_9_BASE_ADDRESS                      0x40020000
  41 
  42 #define SATA_FPCI_BAR5                                  0x94
  43 #define SATA_FPCI_BAR5_START_MASK                       (0xfffffff << 4)
  44 #define SATA_FPCI_BAR5_START                            (0x0040020 << 4)
  45 #define SATA_FPCI_BAR5_ACCESS_TYPE                      (0x1)
  46 
  47 #define SATA_INTR_MASK                                  0x188
  48 #define SATA_INTR_MASK_IP_INT_MASK                      BIT(16)
  49 
  50 #define T_SATA0_CFG_35                                  0x94
  51 #define T_SATA0_CFG_35_IDP_INDEX_MASK                   (0x7ff << 2)
  52 #define T_SATA0_CFG_35_IDP_INDEX                        (0x2a << 2)
  53 
  54 #define T_SATA0_AHCI_IDP1                               0x98
  55 #define T_SATA0_AHCI_IDP1_DATA                          (0x400040)
  56 
  57 #define T_SATA0_CFG_PHY_1                               0x12c
  58 #define T_SATA0_CFG_PHY_1_PADS_IDDQ_EN                  BIT(23)
  59 #define T_SATA0_CFG_PHY_1_PAD_PLL_IDDQ_EN               BIT(22)
  60 
  61 #define T_SATA0_NVOOB                                   0x114
  62 #define T_SATA0_NVOOB_COMMA_CNT_MASK                    (0xff << 16)
  63 #define T_SATA0_NVOOB_COMMA_CNT                         (0x07 << 16)
  64 #define T_SATA0_NVOOB_SQUELCH_FILTER_MODE_MASK          (0x3 << 24)
  65 #define T_SATA0_NVOOB_SQUELCH_FILTER_MODE               (0x1 << 24)
  66 #define T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH_MASK        (0x3 << 26)
  67 #define T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH             (0x3 << 26)
  68 
  69 #define T_SATA_CFG_PHY_0                                0x120
  70 #define T_SATA_CFG_PHY_0_USE_7BIT_ALIGN_DET_FOR_SPD     BIT(11)
  71 #define T_SATA_CFG_PHY_0_MASK_SQUELCH                   BIT(24)
  72 
  73 #define T_SATA0_CFG2NVOOB_2                             0x134
  74 #define T_SATA0_CFG2NVOOB_2_COMWAKE_IDLE_CNT_LOW_MASK   (0x1ff << 18)
  75 #define T_SATA0_CFG2NVOOB_2_COMWAKE_IDLE_CNT_LOW        (0xc << 18)
  76 
  77 #define T_SATA0_AHCI_HBA_CAP_BKDR                       0x300
  78 #define T_SATA0_AHCI_HBA_CAP_BKDR_PARTIAL_ST_CAP        BIT(13)
  79 #define T_SATA0_AHCI_HBA_CAP_BKDR_SLUMBER_ST_CAP        BIT(14)
  80 #define T_SATA0_AHCI_HBA_CAP_BKDR_SALP                  BIT(26)
  81 #define T_SATA0_AHCI_HBA_CAP_BKDR_SUPP_PM               BIT(17)
  82 #define T_SATA0_AHCI_HBA_CAP_BKDR_SNCQ                  BIT(30)
  83 
  84 #define T_SATA0_BKDOOR_CC                               0x4a4
  85 #define T_SATA0_BKDOOR_CC_CLASS_CODE_MASK               (0xffff << 16)
  86 #define T_SATA0_BKDOOR_CC_CLASS_CODE                    (0x0106 << 16)
  87 #define T_SATA0_BKDOOR_CC_PROG_IF_MASK                  (0xff << 8)
  88 #define T_SATA0_BKDOOR_CC_PROG_IF                       (0x01 << 8)
  89 
  90 #define T_SATA0_CFG_SATA                                0x54c
  91 #define T_SATA0_CFG_SATA_BACKDOOR_PROG_IF_EN            BIT(12)
  92 
  93 #define T_SATA0_CFG_MISC                                0x550
  94 
  95 #define T_SATA0_INDEX                                   0x680
  96 
  97 #define T_SATA0_CHX_PHY_CTRL1_GEN1                      0x690
  98 #define T_SATA0_CHX_PHY_CTRL1_GEN1_TX_AMP_MASK          0xff
  99 #define T_SATA0_CHX_PHY_CTRL1_GEN1_TX_AMP_SHIFT         0
 100 #define T_SATA0_CHX_PHY_CTRL1_GEN1_TX_PEAK_MASK         (0xff << 8)
 101 #define T_SATA0_CHX_PHY_CTRL1_GEN1_TX_PEAK_SHIFT        8
 102 
 103 #define T_SATA0_CHX_PHY_CTRL1_GEN2                      0x694
 104 #define T_SATA0_CHX_PHY_CTRL1_GEN2_TX_AMP_MASK          0xff
 105 #define T_SATA0_CHX_PHY_CTRL1_GEN2_TX_AMP_SHIFT         0
 106 #define T_SATA0_CHX_PHY_CTRL1_GEN2_TX_PEAK_MASK         (0xff << 12)
 107 #define T_SATA0_CHX_PHY_CTRL1_GEN2_TX_PEAK_SHIFT        12
 108 
 109 #define T_SATA0_CHX_PHY_CTRL2                           0x69c
 110 #define T_SATA0_CHX_PHY_CTRL2_CDR_CNTL_GEN1             0x23
 111 
 112 #define T_SATA0_CHX_PHY_CTRL11                          0x6d0
 113 #define T_SATA0_CHX_PHY_CTRL11_GEN2_RX_EQ               (0x2800 << 16)
 114 
 115 #define T_SATA0_CHX_PHY_CTRL17_0                        0x6e8
 116 #define T_SATA0_CHX_PHY_CTRL17_0_RX_EQ_CTRL_L_GEN1      0x55010000
 117 #define T_SATA0_CHX_PHY_CTRL18_0                        0x6ec
 118 #define T_SATA0_CHX_PHY_CTRL18_0_RX_EQ_CTRL_L_GEN2      0x55010000
 119 #define T_SATA0_CHX_PHY_CTRL20_0                        0x6f4
 120 #define T_SATA0_CHX_PHY_CTRL20_0_RX_EQ_CTRL_H_GEN1      0x1
 121 #define T_SATA0_CHX_PHY_CTRL21_0                        0x6f8
 122 #define T_SATA0_CHX_PHY_CTRL21_0_RX_EQ_CTRL_H_GEN2      0x1
 123 
 124 /* AUX Registers */
 125 #define SATA_AUX_MISC_CNTL_1_0                          0x8
 126 #define SATA_AUX_MISC_CNTL_1_0_DEVSLP_OVERRIDE          BIT(17)
 127 #define SATA_AUX_MISC_CNTL_1_0_SDS_SUPPORT              BIT(13)
 128 #define SATA_AUX_MISC_CNTL_1_0_DESO_SUPPORT             BIT(15)
 129 
 130 #define SATA_AUX_RX_STAT_INT_0                          0xc
 131 #define SATA_AUX_RX_STAT_INT_0_SATA_DEVSLP              BIT(7)
 132 
 133 #define SATA_AUX_SPARE_CFG0_0                           0x18
 134 #define SATA_AUX_SPARE_CFG0_0_MDAT_TIMER_AFTER_PG_VALID BIT(14)
 135 
 136 #define FUSE_SATA_CALIB                                 0x124
 137 #define FUSE_SATA_CALIB_MASK                            0x3
 138 
 139 struct sata_pad_calibration {
 140         u8 gen1_tx_amp;
 141         u8 gen1_tx_peak;
 142         u8 gen2_tx_amp;
 143         u8 gen2_tx_peak;
 144 };
 145 
 146 static const struct sata_pad_calibration tegra124_pad_calibration[] = {
 147         {0x18, 0x04, 0x18, 0x0a},
 148         {0x0e, 0x04, 0x14, 0x0a},
 149         {0x0e, 0x07, 0x1a, 0x0e},
 150         {0x14, 0x0e, 0x1a, 0x0e},
 151 };
 152 
 153 struct tegra_ahci_ops {
 154         int (*init)(struct ahci_host_priv *hpriv);
 155 };
 156 
 157 struct tegra_ahci_soc {
 158         const char *const               *supply_names;
 159         u32                             num_supplies;
 160         bool                            supports_devslp;
 161         const struct tegra_ahci_ops     *ops;
 162 };
 163 
 164 struct tegra_ahci_priv {
 165         struct platform_device     *pdev;
 166         void __iomem               *sata_regs;
 167         void __iomem               *sata_aux_regs;
 168         struct reset_control       *sata_rst;
 169         struct reset_control       *sata_oob_rst;
 170         struct reset_control       *sata_cold_rst;
 171         /* Needs special handling, cannot use ahci_platform */
 172         struct clk                 *sata_clk;
 173         struct regulator_bulk_data *supplies;
 174         const struct tegra_ahci_soc *soc;
 175 };
 176 
 177 static void tegra_ahci_handle_quirks(struct ahci_host_priv *hpriv)
 178 {
 179         struct tegra_ahci_priv *tegra = hpriv->plat_data;
 180         u32 val;
 181 
 182         if (tegra->sata_aux_regs && !tegra->soc->supports_devslp) {
 183                 val = readl(tegra->sata_aux_regs + SATA_AUX_MISC_CNTL_1_0);
 184                 val &= ~SATA_AUX_MISC_CNTL_1_0_SDS_SUPPORT;
 185                 writel(val, tegra->sata_aux_regs + SATA_AUX_MISC_CNTL_1_0);
 186         }
 187 }
 188 
 189 static int tegra124_ahci_init(struct ahci_host_priv *hpriv)
 190 {
 191         struct tegra_ahci_priv *tegra = hpriv->plat_data;
 192         struct sata_pad_calibration calib;
 193         int ret;
 194         u32 val;
 195 
 196         /* Pad calibration */
 197         ret = tegra_fuse_readl(FUSE_SATA_CALIB, &val);
 198         if (ret)
 199                 return ret;
 200 
 201         calib = tegra124_pad_calibration[val & FUSE_SATA_CALIB_MASK];
 202 
 203         writel(BIT(0), tegra->sata_regs + SCFG_OFFSET + T_SATA0_INDEX);
 204 
 205         val = readl(tegra->sata_regs +
 206                     SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL1_GEN1);
 207         val &= ~T_SATA0_CHX_PHY_CTRL1_GEN1_TX_AMP_MASK;
 208         val &= ~T_SATA0_CHX_PHY_CTRL1_GEN1_TX_PEAK_MASK;
 209         val |= calib.gen1_tx_amp << T_SATA0_CHX_PHY_CTRL1_GEN1_TX_AMP_SHIFT;
 210         val |= calib.gen1_tx_peak << T_SATA0_CHX_PHY_CTRL1_GEN1_TX_PEAK_SHIFT;
 211         writel(val, tegra->sata_regs + SCFG_OFFSET +
 212                T_SATA0_CHX_PHY_CTRL1_GEN1);
 213 
 214         val = readl(tegra->sata_regs +
 215                     SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL1_GEN2);
 216         val &= ~T_SATA0_CHX_PHY_CTRL1_GEN2_TX_AMP_MASK;
 217         val &= ~T_SATA0_CHX_PHY_CTRL1_GEN2_TX_PEAK_MASK;
 218         val |= calib.gen2_tx_amp << T_SATA0_CHX_PHY_CTRL1_GEN1_TX_AMP_SHIFT;
 219         val |= calib.gen2_tx_peak << T_SATA0_CHX_PHY_CTRL1_GEN1_TX_PEAK_SHIFT;
 220         writel(val, tegra->sata_regs + SCFG_OFFSET +
 221                T_SATA0_CHX_PHY_CTRL1_GEN2);
 222 
 223         writel(T_SATA0_CHX_PHY_CTRL11_GEN2_RX_EQ,
 224                tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL11);
 225         writel(T_SATA0_CHX_PHY_CTRL2_CDR_CNTL_GEN1,
 226                tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL2);
 227 
 228         writel(0, tegra->sata_regs + SCFG_OFFSET + T_SATA0_INDEX);
 229 
 230         return 0;
 231 }
 232 
 233 static int tegra_ahci_power_on(struct ahci_host_priv *hpriv)
 234 {
 235         struct tegra_ahci_priv *tegra = hpriv->plat_data;
 236         int ret;
 237 
 238         ret = regulator_bulk_enable(tegra->soc->num_supplies,
 239                                     tegra->supplies);
 240         if (ret)
 241                 return ret;
 242 
 243         ret = tegra_powergate_sequence_power_up(TEGRA_POWERGATE_SATA,
 244                                                 tegra->sata_clk,
 245                                                 tegra->sata_rst);
 246         if (ret)
 247                 goto disable_regulators;
 248 
 249         reset_control_assert(tegra->sata_oob_rst);
 250         reset_control_assert(tegra->sata_cold_rst);
 251 
 252         ret = ahci_platform_enable_resources(hpriv);
 253         if (ret)
 254                 goto disable_power;
 255 
 256         reset_control_deassert(tegra->sata_cold_rst);
 257         reset_control_deassert(tegra->sata_oob_rst);
 258 
 259         return 0;
 260 
 261 disable_power:
 262         clk_disable_unprepare(tegra->sata_clk);
 263 
 264         tegra_powergate_power_off(TEGRA_POWERGATE_SATA);
 265 
 266 disable_regulators:
 267         regulator_bulk_disable(tegra->soc->num_supplies, tegra->supplies);
 268 
 269         return ret;
 270 }
 271 
 272 static void tegra_ahci_power_off(struct ahci_host_priv *hpriv)
 273 {
 274         struct tegra_ahci_priv *tegra = hpriv->plat_data;
 275 
 276         ahci_platform_disable_resources(hpriv);
 277 
 278         reset_control_assert(tegra->sata_rst);
 279         reset_control_assert(tegra->sata_oob_rst);
 280         reset_control_assert(tegra->sata_cold_rst);
 281 
 282         clk_disable_unprepare(tegra->sata_clk);
 283         tegra_powergate_power_off(TEGRA_POWERGATE_SATA);
 284 
 285         regulator_bulk_disable(tegra->soc->num_supplies, tegra->supplies);
 286 }
 287 
 288 static int tegra_ahci_controller_init(struct ahci_host_priv *hpriv)
 289 {
 290         struct tegra_ahci_priv *tegra = hpriv->plat_data;
 291         int ret;
 292         u32 val;
 293 
 294         ret = tegra_ahci_power_on(hpriv);
 295         if (ret) {
 296                 dev_err(&tegra->pdev->dev,
 297                         "failed to power on AHCI controller: %d\n", ret);
 298                 return ret;
 299         }
 300 
 301         /*
 302          * Program the following SATA IPFS registers to allow SW accesses to
 303          * SATA's MMIO register range.
 304          */
 305         val = readl(tegra->sata_regs + SATA_FPCI_BAR5);
 306         val &= ~(SATA_FPCI_BAR5_START_MASK | SATA_FPCI_BAR5_ACCESS_TYPE);
 307         val |= SATA_FPCI_BAR5_START | SATA_FPCI_BAR5_ACCESS_TYPE;
 308         writel(val, tegra->sata_regs + SATA_FPCI_BAR5);
 309 
 310         /* Program the following SATA IPFS register to enable the SATA */
 311         val = readl(tegra->sata_regs + SATA_CONFIGURATION_0);
 312         val |= SATA_CONFIGURATION_0_EN_FPCI;
 313         writel(val, tegra->sata_regs + SATA_CONFIGURATION_0);
 314 
 315         /* Electrical settings for better link stability */
 316         val = T_SATA0_CHX_PHY_CTRL17_0_RX_EQ_CTRL_L_GEN1;
 317         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL17_0);
 318         val = T_SATA0_CHX_PHY_CTRL18_0_RX_EQ_CTRL_L_GEN2;
 319         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL18_0);
 320         val = T_SATA0_CHX_PHY_CTRL20_0_RX_EQ_CTRL_H_GEN1;
 321         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL20_0);
 322         val = T_SATA0_CHX_PHY_CTRL21_0_RX_EQ_CTRL_H_GEN2;
 323         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CHX_PHY_CTRL21_0);
 324 
 325         /* For SQUELCH Filter & Gen3 drive getting detected as Gen1 drive */
 326 
 327         val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA_CFG_PHY_0);
 328         val |= T_SATA_CFG_PHY_0_MASK_SQUELCH;
 329         val &= ~T_SATA_CFG_PHY_0_USE_7BIT_ALIGN_DET_FOR_SPD;
 330         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA_CFG_PHY_0);
 331 
 332         val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_NVOOB);
 333         val &= ~(T_SATA0_NVOOB_COMMA_CNT_MASK |
 334                  T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH_MASK |
 335                  T_SATA0_NVOOB_SQUELCH_FILTER_MODE_MASK);
 336         val |= (T_SATA0_NVOOB_COMMA_CNT |
 337                 T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH |
 338                 T_SATA0_NVOOB_SQUELCH_FILTER_MODE);
 339         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_NVOOB);
 340 
 341         /*
 342          * Change CFG2NVOOB_2_COMWAKE_IDLE_CNT_LOW from 83.3 ns to 58.8ns
 343          */
 344         val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG2NVOOB_2);
 345         val &= ~T_SATA0_CFG2NVOOB_2_COMWAKE_IDLE_CNT_LOW_MASK;
 346         val |= T_SATA0_CFG2NVOOB_2_COMWAKE_IDLE_CNT_LOW;
 347         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG2NVOOB_2);
 348 
 349         if (tegra->soc->ops && tegra->soc->ops->init)
 350                 tegra->soc->ops->init(hpriv);
 351 
 352         /*
 353          * Program the following SATA configuration registers to
 354          * initialize SATA
 355          */
 356         val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_1);
 357         val |= (T_SATA0_CFG_1_IO_SPACE | T_SATA0_CFG_1_MEMORY_SPACE |
 358                 T_SATA0_CFG_1_BUS_MASTER | T_SATA0_CFG_1_SERR);
 359         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_1);
 360         val = T_SATA0_CFG_9_BASE_ADDRESS;
 361         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_9);
 362 
 363         /* Program Class Code and Programming interface for SATA */
 364         val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_SATA);
 365         val |= T_SATA0_CFG_SATA_BACKDOOR_PROG_IF_EN;
 366         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_SATA);
 367 
 368         val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_BKDOOR_CC);
 369         val &=
 370             ~(T_SATA0_BKDOOR_CC_CLASS_CODE_MASK |
 371               T_SATA0_BKDOOR_CC_PROG_IF_MASK);
 372         val |= T_SATA0_BKDOOR_CC_CLASS_CODE | T_SATA0_BKDOOR_CC_PROG_IF;
 373         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_BKDOOR_CC);
 374 
 375         val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_SATA);
 376         val &= ~T_SATA0_CFG_SATA_BACKDOOR_PROG_IF_EN;
 377         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_SATA);
 378 
 379         /* Enabling LPM capabilities through Backdoor Programming */
 380         val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_AHCI_HBA_CAP_BKDR);
 381         val |= (T_SATA0_AHCI_HBA_CAP_BKDR_PARTIAL_ST_CAP |
 382                 T_SATA0_AHCI_HBA_CAP_BKDR_SLUMBER_ST_CAP |
 383                 T_SATA0_AHCI_HBA_CAP_BKDR_SALP |
 384                 T_SATA0_AHCI_HBA_CAP_BKDR_SUPP_PM);
 385         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_AHCI_HBA_CAP_BKDR);
 386 
 387         /* SATA Second Level Clock Gating configuration
 388          * Enabling Gating of Tx/Rx clocks and driving Pad IDDQ and Lane
 389          * IDDQ Signals
 390          */
 391         val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_35);
 392         val &= ~T_SATA0_CFG_35_IDP_INDEX_MASK;
 393         val |= T_SATA0_CFG_35_IDP_INDEX;
 394         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_35);
 395 
 396         val = T_SATA0_AHCI_IDP1_DATA;
 397         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_AHCI_IDP1);
 398 
 399         val = readl(tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_PHY_1);
 400         val |= (T_SATA0_CFG_PHY_1_PADS_IDDQ_EN |
 401                 T_SATA0_CFG_PHY_1_PAD_PLL_IDDQ_EN);
 402         writel(val, tegra->sata_regs + SCFG_OFFSET + T_SATA0_CFG_PHY_1);
 403 
 404         /* Enabling IPFS Clock Gating */
 405         val = readl(tegra->sata_regs + SATA_CONFIGURATION_0);
 406         val &= ~SATA_CONFIGURATION_0_CLK_OVERRIDE;
 407         writel(val, tegra->sata_regs + SATA_CONFIGURATION_0);
 408 
 409         tegra_ahci_handle_quirks(hpriv);
 410 
 411         /* Unmask SATA interrupts */
 412 
 413         val = readl(tegra->sata_regs + SATA_INTR_MASK);
 414         val |= SATA_INTR_MASK_IP_INT_MASK;
 415         writel(val, tegra->sata_regs + SATA_INTR_MASK);
 416 
 417         return 0;
 418 }
 419 
 420 static void tegra_ahci_controller_deinit(struct ahci_host_priv *hpriv)
 421 {
 422         tegra_ahci_power_off(hpriv);
 423 }
 424 
 425 static void tegra_ahci_host_stop(struct ata_host *host)
 426 {
 427         struct ahci_host_priv *hpriv = host->private_data;
 428 
 429         tegra_ahci_controller_deinit(hpriv);
 430 }
 431 
 432 static struct ata_port_operations ahci_tegra_port_ops = {
 433         .inherits       = &ahci_ops,
 434         .host_stop      = tegra_ahci_host_stop,
 435 };
 436 
 437 static const struct ata_port_info ahci_tegra_port_info = {
 438         .flags          = AHCI_FLAG_COMMON | ATA_FLAG_NO_DIPM,
 439         .pio_mask       = ATA_PIO4,
 440         .udma_mask      = ATA_UDMA6,
 441         .port_ops       = &ahci_tegra_port_ops,
 442 };
 443 
 444 static const char *const tegra124_supply_names[] = {
 445         "avdd", "hvdd", "vddio", "target-5v", "target-12v"
 446 };
 447 
 448 static const struct tegra_ahci_ops tegra124_ahci_ops = {
 449         .init = tegra124_ahci_init,
 450 };
 451 
 452 static const struct tegra_ahci_soc tegra124_ahci_soc = {
 453         .supply_names = tegra124_supply_names,
 454         .num_supplies = ARRAY_SIZE(tegra124_supply_names),
 455         .supports_devslp = false,
 456         .ops = &tegra124_ahci_ops,
 457 };
 458 
 459 static const struct tegra_ahci_soc tegra210_ahci_soc = {
 460         .supports_devslp = false,
 461 };
 462 
 463 static const struct of_device_id tegra_ahci_of_match[] = {
 464         {
 465                 .compatible = "nvidia,tegra124-ahci",
 466                 .data = &tegra124_ahci_soc
 467         },
 468         {
 469                 .compatible = "nvidia,tegra210-ahci",
 470                 .data = &tegra210_ahci_soc
 471         },
 472         {}
 473 };
 474 MODULE_DEVICE_TABLE(of, tegra_ahci_of_match);
 475 
 476 static struct scsi_host_template ahci_platform_sht = {
 477         AHCI_SHT(DRV_NAME),
 478 };
 479 
 480 static int tegra_ahci_probe(struct platform_device *pdev)
 481 {
 482         struct ahci_host_priv *hpriv;
 483         struct tegra_ahci_priv *tegra;
 484         struct resource *res;
 485         int ret;
 486         unsigned int i;
 487 
 488         hpriv = ahci_platform_get_resources(pdev, 0);
 489         if (IS_ERR(hpriv))
 490                 return PTR_ERR(hpriv);
 491 
 492         tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL);
 493         if (!tegra)
 494                 return -ENOMEM;
 495 
 496         hpriv->plat_data = tegra;
 497 
 498         tegra->pdev = pdev;
 499         tegra->soc = of_device_get_match_data(&pdev->dev);
 500 
 501         res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
 502         tegra->sata_regs = devm_ioremap_resource(&pdev->dev, res);
 503         if (IS_ERR(tegra->sata_regs))
 504                 return PTR_ERR(tegra->sata_regs);
 505 
 506         /*
 507          * AUX registers is optional.
 508          */
 509         res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
 510         if (res) {
 511                 tegra->sata_aux_regs = devm_ioremap_resource(&pdev->dev, res);
 512                 if (IS_ERR(tegra->sata_aux_regs))
 513                         return PTR_ERR(tegra->sata_aux_regs);
 514         }
 515 
 516         tegra->sata_rst = devm_reset_control_get(&pdev->dev, "sata");
 517         if (IS_ERR(tegra->sata_rst)) {
 518                 dev_err(&pdev->dev, "Failed to get sata reset\n");
 519                 return PTR_ERR(tegra->sata_rst);
 520         }
 521 
 522         tegra->sata_oob_rst = devm_reset_control_get(&pdev->dev, "sata-oob");
 523         if (IS_ERR(tegra->sata_oob_rst)) {
 524                 dev_err(&pdev->dev, "Failed to get sata-oob reset\n");
 525                 return PTR_ERR(tegra->sata_oob_rst);
 526         }
 527 
 528         tegra->sata_cold_rst = devm_reset_control_get(&pdev->dev, "sata-cold");
 529         if (IS_ERR(tegra->sata_cold_rst)) {
 530                 dev_err(&pdev->dev, "Failed to get sata-cold reset\n");
 531                 return PTR_ERR(tegra->sata_cold_rst);
 532         }
 533 
 534         tegra->sata_clk = devm_clk_get(&pdev->dev, "sata");
 535         if (IS_ERR(tegra->sata_clk)) {
 536                 dev_err(&pdev->dev, "Failed to get sata clock\n");
 537                 return PTR_ERR(tegra->sata_clk);
 538         }
 539 
 540         tegra->supplies = devm_kcalloc(&pdev->dev,
 541                                        tegra->soc->num_supplies,
 542                                        sizeof(*tegra->supplies), GFP_KERNEL);
 543         if (!tegra->supplies)
 544                 return -ENOMEM;
 545 
 546         for (i = 0; i < tegra->soc->num_supplies; i++)
 547                 tegra->supplies[i].supply = tegra->soc->supply_names[i];
 548 
 549         ret = devm_regulator_bulk_get(&pdev->dev,
 550                                       tegra->soc->num_supplies,
 551                                       tegra->supplies);
 552         if (ret) {
 553                 dev_err(&pdev->dev, "Failed to get regulators\n");
 554                 return ret;
 555         }
 556 
 557         ret = tegra_ahci_controller_init(hpriv);
 558         if (ret)
 559                 return ret;
 560 
 561         ret = ahci_platform_init_host(pdev, hpriv, &ahci_tegra_port_info,
 562                                       &ahci_platform_sht);
 563         if (ret)
 564                 goto deinit_controller;
 565 
 566         return 0;
 567 
 568 deinit_controller:
 569         tegra_ahci_controller_deinit(hpriv);
 570 
 571         return ret;
 572 };
 573 
 574 static struct platform_driver tegra_ahci_driver = {
 575         .probe = tegra_ahci_probe,
 576         .remove = ata_platform_remove_one,
 577         .driver = {
 578                 .name = DRV_NAME,
 579                 .of_match_table = tegra_ahci_of_match,
 580         },
 581         /* LP0 suspend support not implemented */
 582 };
 583 module_platform_driver(tegra_ahci_driver);
 584 
 585 MODULE_AUTHOR("Mikko Perttunen <mperttunen@nvidia.com>");
 586 MODULE_DESCRIPTION("Tegra AHCI SATA driver");
 587 MODULE_LICENSE("GPL v2");

/* [<][>][^][v][top][bottom][index][help] */