uboot/drivers/ata/dwc_ahci.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * DWC SATA platform driver
   4 *
   5 * (C) Copyright 2016
   6 *     Texas Instruments Incorporated, <www.ti.com>
   7 *
   8 * Author: Mugunthan V N <mugunthanvnm@ti.com>
   9 */
  10
  11#include <common.h>
  12#include <dm.h>
  13#include <ahci.h>
  14#include <scsi.h>
  15#include <sata.h>
  16#include <asm/arch/sata.h>
  17#include <asm/io.h>
  18#include <generic-phy.h>
  19
  20struct dwc_ahci_priv {
  21        void *base;
  22        void *wrapper_base;
  23};
  24
  25static int dwc_ahci_bind(struct udevice *dev)
  26{
  27        struct udevice *scsi_dev;
  28
  29        return ahci_bind_scsi(dev, &scsi_dev);
  30}
  31
  32static int dwc_ahci_ofdata_to_platdata(struct udevice *dev)
  33{
  34        struct dwc_ahci_priv *priv = dev_get_priv(dev);
  35        fdt_addr_t addr;
  36
  37        priv->base = map_physmem(devfdt_get_addr(dev), sizeof(void *),
  38                                 MAP_NOCACHE);
  39
  40        addr = devfdt_get_addr_index(dev, 1);
  41        if (addr != FDT_ADDR_T_NONE) {
  42                priv->wrapper_base = map_physmem(addr, sizeof(void *),
  43                                                 MAP_NOCACHE);
  44        } else {
  45                priv->wrapper_base = NULL;
  46        }
  47
  48        return 0;
  49}
  50
  51static int dwc_ahci_probe(struct udevice *dev)
  52{
  53        struct dwc_ahci_priv *priv = dev_get_priv(dev);
  54        int ret;
  55        struct phy phy;
  56
  57        ret = generic_phy_get_by_name(dev, "sata-phy", &phy);
  58        if (ret) {
  59                pr_err("can't get the phy from DT\n");
  60                return ret;
  61        }
  62
  63        ret = generic_phy_init(&phy);
  64        if (ret) {
  65                pr_err("unable to initialize the sata phy\n");
  66                return ret;
  67        }
  68
  69        ret = generic_phy_power_on(&phy);
  70        if (ret) {
  71                pr_err("unable to power on the sata phy\n");
  72                return ret;
  73        }
  74
  75        if (priv->wrapper_base) {
  76                u32 val = TI_SATA_IDLE_NO | TI_SATA_STANDBY_NO;
  77
  78                /* Enable SATA module, No Idle, No Standby */
  79                writel(val, priv->wrapper_base + TI_SATA_SYSCONFIG);
  80        }
  81
  82        return ahci_probe_scsi(dev, (ulong)priv->base);
  83}
  84
  85static const struct udevice_id dwc_ahci_ids[] = {
  86        { .compatible = "snps,dwc-ahci" },
  87        { }
  88};
  89
  90U_BOOT_DRIVER(dwc_ahci) = {
  91        .name   = "dwc_ahci",
  92        .id     = UCLASS_AHCI,
  93        .of_match = dwc_ahci_ids,
  94        .bind   = dwc_ahci_bind,
  95        .ofdata_to_platdata = dwc_ahci_ofdata_to_platdata,
  96        .ops    = &scsi_ops,
  97        .probe  = dwc_ahci_probe,
  98        .priv_auto_alloc_size = sizeof(struct dwc_ahci_priv),
  99};
 100