blob: 09c3534f1fac6b4e24f5e0eb85da7b5ee5fc3114 [file] [log] [blame]
/*
* sata_brcmstb.h - Broadcom SATA3 AHCI Controller Driver
*
* Copyright (C) 2009 - 2013 Broadcom Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __SATA_BRCMSTB_H__
#define __SATA_BRCMSTB_H__
#ifdef __BIG_ENDIAN
#define DATA_ENDIAN 2 /* AHCI->DDR inbound accesses */
#define MMIO_ENDIAN 2 /* CPU->AHCI outbound accesses */
#else
#define DATA_ENDIAN 0
#define MMIO_ENDIAN 0
#endif
#define MAX_PORTS 32
#define SATA_MDIO_BANK_OFFSET 0x23c
#define SATA_MDIO_REG_OFFSET(ofs) ((ofs) * 4)
#define SATA_MDIO_REG_SPACE_SIZE 0x1000
#define SATA_MDIO_REG_LENGTH 0x1f00
/* The older SATA PHY registers duplicated per port registers within the map,
* rather than having a separate map per port. */
#define SATA_MDIO_REG_LEGACY_BANK_OFS 0x10
#define SPD_SETTING_WIDTH 4
#define SPD_SETTING_PER_U32 (32 / SPD_SETTING_WIDTH)
#define SPD_SETTING_MASK 0xf
#define SPD_SETTING_SHIFT(port) \
(((port) % SPD_SETTING_PER_U32) * SPD_SETTING_WIDTH)
#define MAX_PHY_CTRL_PORTS 2
#define SATA_TOP_CTRL_REG_LENGTH 0x24
#define SATA_TOP_CTRL_BUS_CTRL 0x4
#define SATA_TOP_CTRL_PHY_CTRL_OFS 0xc
#define SATA_TOP_CTRL_PHY_CTRL_LEN 0x8
#define SATA_TOP_CTRL_PHY_CTRL_1 0x0
#define SATA_TOP_CTRL_PHY_CTRL_2 0x4
#define SATA_TOP_CTRL_REGS_PER_PORT 2
#define SATA_TOP_CTRL_BUS_CTRL_OVERRIDE_HWINIT BIT(16)
#define SATA_TOP_CTRL_2_SW_RST_MDIOREG BIT(0)
#define SATA_TOP_CTRL_2_SW_RST_OOB BIT(1)
#define SATA_TOP_CTRL_2_SW_RST_RX BIT(2)
#define SATA_TOP_CTRL_2_SW_RST_TX BIT(3)
#define SATA_TOP_CTRL_2_PHY_GLOBAL_RESET BIT(14)
#define SATA_TOP_CTRL_1_PHY_DEFAULT_POWER_STATE BIT(14)
enum sata_mdio_phy_regs_28nm {
PLL_REG_BANK_0 = 0x50,
PLL_REG_BANK_0_PLLCONTROL_0 = 0x81,
TXPMD_REG_BANK = 0x1a0,
TXPMD_CONTROL1 = 0x81,
TXPMD_CONTROL1_TX_SSC_EN_FRC = BIT(0),
TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL = BIT(1),
TXPMD_TX_FREQ_CTRL_CONTROL1 = 0x82,
TXPMD_TX_FREQ_CTRL_CONTROL2 = 0x83,
TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK = 0x3ff,
TXPMD_TX_FREQ_CTRL_CONTROL3 = 0x84,
TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK = 0x3ff,
};
enum sata_mdio_phy_regs_legacy {
TXPMD_REG_BANK_LEGACY = 0x1a0,
};
/**
* struct pdev_map - Doubly-linked list used to associate a struct device
* its associated platform devices.
* @node: Forward/reverse links
* @key: A pointer to a device struct
* @brcm_pdev: The Broadcom SATA AHCI platform_device associated with the key
* @ahci_pdev: The AHCI platform_device associated with the key
*/
struct pdev_map {
struct list_head node;
struct device *key;
struct platform_device *brcm_pdev;
struct platform_device *ahci_pdev;
};
/*
* struct sata_brcm_pdata - Platform data for the Broadcom SATA AHCI driver
*
* These fields are defined in the driver's DT binding documentation.
*/
struct sata_brcm_pdata {
struct platform_device *ahci_pdev;
u32 phy_generation;
u32 phy_base_addr;
u32 phy_enable_ssc_mask;
u32 phy_force_spd[MAX_PORTS / SPD_SETTING_PER_U32];
u32 top_ctrl_base_addr;
u32 quirks;
struct clk *sata_clk;
};
struct sata_phy_cfg_ops {
void (*cfg_ssc)(void __iomem *base, int port, int ssc_en);
};
enum sata_phy_mdio_gen {
SATA_PHY_MDIO_LEGACY = 0,
SATA_PHY_MDIO_28NM,
SATA_PHY_MDIO_END,
};
int brcm_sata3_phy_spd_get(const struct sata_brcm_pdata *pdata, int port);
void brcm_sata3_phy_spd_set(struct sata_brcm_pdata *pdata, int port, int val);
void brcm_sata3_phy_cfg(const struct sata_brcm_pdata *pdata, int port,
int enable);
#endif /* __SATA_BRCMSTB_H__ */