[PATCH 2/2] phy: samsung-ufs: support exynosauto ufs phy driver
From: Chanho Park <hidden>
Date: 2021-07-05 10:24:24
Subsystem:
generic phy framework, open firmware and flattened device tree bindings, the rest · Maintainers:
Vinod Koul, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Linus Torvalds
This patch adds to support phy-exynosauto-ufs driver for ExynosAuto v9 series SoCs. The patch adds "samsung,exynosauto-ufs-phy" compatible. Unlike previous exynos ufs phy, the chip uses 0x50 offset as PHY_TRSV_REG_CFG_OFFSET. Change-Id: I4ea333d4565af537c26a8876d1b27144eea3c3c6 Signed-off-by: Chanho Park <redacted> --- .../bindings/phy/samsung,ufs-phy.yaml | 1 + drivers/phy/samsung/phy-exynosauto-ufs.h | 70 +++++++++++++++++++ drivers/phy/samsung/phy-samsung-ufs.c | 3 + drivers/phy/samsung/phy-samsung-ufs.h | 1 + 4 files changed, 75 insertions(+) create mode 100644 drivers/phy/samsung/phy-exynosauto-ufs.h
diff --git a/Documentation/devicetree/bindings/phy/samsung,ufs-phy.yaml b/Documentation/devicetree/bindings/phy/samsung,ufs-phy.yaml
index 636cc501b54f..8e13f8cec6a7 100644
--- a/Documentation/devicetree/bindings/phy/samsung,ufs-phy.yaml
+++ b/Documentation/devicetree/bindings/phy/samsung,ufs-phy.yaml@@ -16,6 +16,7 @@ properties: compatible: enum: - samsung,exynos7-ufs-phy + - samsung,exynosauto-ufs-phy reg: maxItems: 1
diff --git a/drivers/phy/samsung/phy-exynosauto-ufs.h b/drivers/phy/samsung/phy-exynosauto-ufs.h
new file mode 100644
index 000000000000..3e7d7bb7f0e6
--- /dev/null
+++ b/drivers/phy/samsung/phy-exynosauto-ufs.h@@ -0,0 +1,70 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * UFS PHY driver data for Samsung EXYNOSAUTO SoC + * + * Copyright (C) 2021 Samsung Electronics Co., Ltd. + */ +#ifndef _PHY_EXYNOSAUTO_UFS_H_ +#define _PHY_EXYNOSAUTO_UFS_H_ + +#include "phy-samsung-ufs.h" + +#define EXYNOSAUTO_EMBEDDED_COMBO_PHY_CTRL 0x728 +#define EXYNOSAUTO_EMBEDDED_COMBO_PHY_CTRL_MASK 0x1 +#define EXYNOSAUTO_EMBEDDED_COMBO_PHY_CTRL_EN BIT(0) + +#define PHY_TRSV_REG_CFG_AUTO(o, v, d) PHY_TRSV_REG_CFG_OFFSET(o, v, d, 0x50) + +/* Calibration for phy initialization */ +static const struct samsung_ufs_phy_cfg exynosauto_pre_init_cfg[] = { + PHY_COMN_REG_CFG(0x023, 0x80, PWR_MODE_ANY), + PHY_COMN_REG_CFG(0x01d, 0x10, PWR_MODE_ANY), + + PHY_TRSV_REG_CFG_AUTO(0x044, 0xb5, PWR_MODE_ANY), + PHY_TRSV_REG_CFG_AUTO(0x04d, 0x43, PWR_MODE_ANY), + PHY_TRSV_REG_CFG_AUTO(0x05b, 0x20, PWR_MODE_ANY), + PHY_TRSV_REG_CFG_AUTO(0x05e, 0xc0, PWR_MODE_ANY), + PHY_TRSV_REG_CFG_AUTO(0x038, 0x12, PWR_MODE_ANY), + PHY_TRSV_REG_CFG_AUTO(0x059, 0x58, PWR_MODE_ANY), + PHY_TRSV_REG_CFG_AUTO(0x06c, 0x18, PWR_MODE_ANY), + PHY_TRSV_REG_CFG_AUTO(0x06d, 0x02, PWR_MODE_ANY), + + PHY_COMN_REG_CFG(0x023, 0xc0, PWR_MODE_ANY), + PHY_COMN_REG_CFG(0x023, 0x00, PWR_MODE_ANY), + + PHY_TRSV_REG_CFG(0x042, 0x5d, PWR_MODE_ANY), + PHY_TRSV_REG_CFG(0x043, 0x80, PWR_MODE_ANY), + + END_UFS_PHY_CFG, +}; + +/* Calibration for HS mode series A/B */ +static const struct samsung_ufs_phy_cfg exynosauto_pre_pwr_hs_cfg[] = { + PHY_TRSV_REG_CFG(0x032, 0xbc, PWR_MODE_HS_ANY), + PHY_TRSV_REG_CFG(0x03c, 0x7f, PWR_MODE_HS_ANY), + PHY_TRSV_REG_CFG(0x048, 0xc0, PWR_MODE_HS_ANY), + + PHY_TRSV_REG_CFG(0x04a, 0x00, PWR_MODE_HS_G3_SER_B), + PHY_TRSV_REG_CFG(0x04b, 0x10, PWR_MODE_HS_G1_SER_B | + PWR_MODE_HS_G3_SER_B), + PHY_TRSV_REG_CFG(0x04d, 0x63, PWR_MODE_HS_G3_SER_B), + + END_UFS_PHY_CFG, +}; + +static const struct samsung_ufs_phy_cfg *exynosauto_ufs_phy_cfgs[CFG_TAG_MAX] = { + [CFG_PRE_INIT] = exynosauto_pre_init_cfg, + [CFG_PRE_PWR_HS] = exynosauto_pre_pwr_hs_cfg, +}; + +static struct samsung_ufs_phy_drvdata exynosauto_ufs_phy = { + .cfg = exynosauto_ufs_phy_cfgs, + .isol = { + .offset = EXYNOSAUTO_EMBEDDED_COMBO_PHY_CTRL, + .mask = EXYNOSAUTO_EMBEDDED_COMBO_PHY_CTRL_MASK, + .en = EXYNOSAUTO_EMBEDDED_COMBO_PHY_CTRL_EN, + }, + .has_symbol_clk = 0, +}; + +#endif /* _PHY_EXYNOSAUTO_UFS_H_ */
diff --git a/drivers/phy/samsung/phy-samsung-ufs.c b/drivers/phy/samsung/phy-samsung-ufs.c
index dd9ab1519d83..ae58db9228b8 100644
--- a/drivers/phy/samsung/phy-samsung-ufs.c
+++ b/drivers/phy/samsung/phy-samsung-ufs.c@@ -347,6 +347,9 @@ static const struct of_device_id samsung_ufs_phy_match[] = { { .compatible = "samsung,exynos7-ufs-phy", .data = &exynos7_ufs_phy, + }, { + .compatible = "samsung,exynosauto-ufs-phy", + .data = &exynosauto_ufs_phy, }, {}, };
diff --git a/drivers/phy/samsung/phy-samsung-ufs.h b/drivers/phy/samsung/phy-samsung-ufs.h
index ea1ac38889c1..357876f541b0 100644
--- a/drivers/phy/samsung/phy-samsung-ufs.h
+++ b/drivers/phy/samsung/phy-samsung-ufs.h@@ -138,5 +138,6 @@ static inline void samsung_ufs_phy_ctrl_isol( } #include "phy-exynos7-ufs.h" +#include "phy-exynosauto-ufs.h" #endif /* _PHY_SAMSUNG_UFS_ */
--
2.32.0
--
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy