mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 04:34:08 +08:00
phy fixes for 6.6
- Driver fixes for - mapphone-mdm6600 runtime pm & pinctrl handling fixes - Qualcomm qmp usb pcs register fixes, qmp pcie register size warning fix, m31 fixes for wrong pointer in PTR_ERR and dropping wrong vreg check, qmp combo fix for 8550 power config register - realtek usb fix for debugfs_create_dir() and kconfig dependency -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+vs47OPLdNbVcHzyfBQHDyUjg0cFAmU1VYIACgkQfBQHDyUj g0fhAw/+I2F51l+SJ5Y2UKnr4BE2aaVjd1CisnoGKFZ2QCMt76mWHRaZZ1YEYAYR NK77rBuR80LXUj9mMoHVdIWleH/tlvDJ8LFpA9H+fvDoKkjjK4g66fCG9GU0V3qv oWerSiwaAVGb/yLokJ4KwEaumcMukCsGf6P3SWk/XeFwaxySixcD4nwFzpAalX0z ZXot62Xq1cLEriH6yJslU3iySWGfpAL12ygYOFVuaW02tUEmIH+zM7L4jNDgldHD gr45T8wbh5M2r8uE9x7thMafk7mcKEjiyV5Er2SLgTwh9fRXa3gOw1I+NHcGM8sM YnIXlB+hDZ4SuJKWDxsQn+Y3N/+byvHrYMiKvuN32ysZRA8aIvkqdUMPJyZBYk3j ecp4TH8YJ3iEVVDbUsv5v/uBH/drlBdJNLEdc71RiJfppsxI+97okdOGXQBT04Lu alifV/ehLaZamJrVzpD1wFlYaZnAc0DnwqxZlepOMghzfiA7qQgV70wlMAkL81DX R4da2kgmVWlXcjEmOfDUSFsEaLHiZ9ArZabru0kdq1TYOt8/oVnl9t9T/qqB6qs3 JioLTLXUry5hFpaGjuGTJeRhkJRnOjSAYuCLiyJGd0tcgA05dHXNHOwIIrJTVi4K ksz/x2G+lwQP8EnKpctEkY4v5KKGmJPspymzHTXsAcUFdZr7F4w= =ugiS -----END PGP SIGNATURE----- Merge tag 'phy-fixes-6.6' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy Pull phy fixes from Vinod Koul: - mapphone-mdm6600 runtime pm & pinctrl handling fixes - Qualcomm qmp usb pcs register fixes, qmp pcie register size warning fix, m31 fixes for wrong pointer in PTR_ERR and dropping wrong vreg check, qmp combo fix for 8550 power config register - realtek usb fix for debugfs_create_dir() and kconfig dependency * tag 'phy-fixes-6.6' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy: phy: realtek: Realtek PHYs should depend on ARCH_REALTEK phy: qualcomm: Fix typos in comments phy: qcom-qmp-combo: initialize PCS_USB registers phy: qcom-qmp-combo: Square out 8550 POWER_STATE_CONFIG1 phy: qcom: m31: Remove unwanted qphy->vreg is NULL check phy: realtek: usb: Drop unnecessary error check for debugfs_create_dir() phy: qcom: phy-qcom-m31: change m31_ipq5332_regs to static phy: qcom: phy-qcom-m31: fix wrong pointer pass to PTR_ERR() dt-bindings: phy: qcom,ipq8074-qmp-pcie: fix warning regarding reg size phy: qcom-qmp-usb: split PCS_USB init table for sc8280xp and sa8775p phy: qcom-qmp-usb: initialize PCS_USB registers phy: mapphone-mdm6600: Fix pinctrl_pm handling for sleep pins phy: mapphone-mdm6600: Fix runtime PM for remove phy: mapphone-mdm6600: Fix runtime disable on probe
This commit is contained in:
commit
fe3cfe869d
@ -70,7 +70,7 @@ examples:
|
|||||||
|
|
||||||
phy@84000 {
|
phy@84000 {
|
||||||
compatible = "qcom,ipq6018-qmp-pcie-phy";
|
compatible = "qcom,ipq6018-qmp-pcie-phy";
|
||||||
reg = <0x0 0x00084000 0x0 0x1000>;
|
reg = <0x00084000 0x1000>;
|
||||||
|
|
||||||
clocks = <&gcc GCC_PCIE0_AUX_CLK>,
|
clocks = <&gcc GCC_PCIE0_AUX_CLK>,
|
||||||
<&gcc GCC_PCIE0_AHB_CLK>,
|
<&gcc GCC_PCIE0_AHB_CLK>,
|
||||||
|
@ -122,16 +122,10 @@ static int phy_mdm6600_power_on(struct phy *x)
|
|||||||
{
|
{
|
||||||
struct phy_mdm6600 *ddata = phy_get_drvdata(x);
|
struct phy_mdm6600 *ddata = phy_get_drvdata(x);
|
||||||
struct gpio_desc *enable_gpio = ddata->ctrl_gpios[PHY_MDM6600_ENABLE];
|
struct gpio_desc *enable_gpio = ddata->ctrl_gpios[PHY_MDM6600_ENABLE];
|
||||||
int error;
|
|
||||||
|
|
||||||
if (!ddata->enabled)
|
if (!ddata->enabled)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
error = pinctrl_pm_select_default_state(ddata->dev);
|
|
||||||
if (error)
|
|
||||||
dev_warn(ddata->dev, "%s: error with default_state: %i\n",
|
|
||||||
__func__, error);
|
|
||||||
|
|
||||||
gpiod_set_value_cansleep(enable_gpio, 1);
|
gpiod_set_value_cansleep(enable_gpio, 1);
|
||||||
|
|
||||||
/* Allow aggressive PM for USB, it's only needed for n_gsm port */
|
/* Allow aggressive PM for USB, it's only needed for n_gsm port */
|
||||||
@ -160,11 +154,6 @@ static int phy_mdm6600_power_off(struct phy *x)
|
|||||||
|
|
||||||
gpiod_set_value_cansleep(enable_gpio, 0);
|
gpiod_set_value_cansleep(enable_gpio, 0);
|
||||||
|
|
||||||
error = pinctrl_pm_select_sleep_state(ddata->dev);
|
|
||||||
if (error)
|
|
||||||
dev_warn(ddata->dev, "%s: error with sleep_state: %i\n",
|
|
||||||
__func__, error);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -456,6 +445,7 @@ static void phy_mdm6600_device_power_off(struct phy_mdm6600 *ddata)
|
|||||||
{
|
{
|
||||||
struct gpio_desc *reset_gpio =
|
struct gpio_desc *reset_gpio =
|
||||||
ddata->ctrl_gpios[PHY_MDM6600_RESET];
|
ddata->ctrl_gpios[PHY_MDM6600_RESET];
|
||||||
|
int error;
|
||||||
|
|
||||||
ddata->enabled = false;
|
ddata->enabled = false;
|
||||||
phy_mdm6600_cmd(ddata, PHY_MDM6600_CMD_BP_SHUTDOWN_REQ);
|
phy_mdm6600_cmd(ddata, PHY_MDM6600_CMD_BP_SHUTDOWN_REQ);
|
||||||
@ -471,6 +461,17 @@ static void phy_mdm6600_device_power_off(struct phy_mdm6600 *ddata)
|
|||||||
} else {
|
} else {
|
||||||
dev_err(ddata->dev, "Timed out powering down\n");
|
dev_err(ddata->dev, "Timed out powering down\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keep reset gpio high with padconf internal pull-up resistor to
|
||||||
|
* prevent modem from waking up during deeper SoC idle states. The
|
||||||
|
* gpio bank lines can have glitches if not in the always-on wkup
|
||||||
|
* domain.
|
||||||
|
*/
|
||||||
|
error = pinctrl_pm_select_sleep_state(ddata->dev);
|
||||||
|
if (error)
|
||||||
|
dev_warn(ddata->dev, "%s: error with sleep_state: %i\n",
|
||||||
|
__func__, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void phy_mdm6600_deferred_power_on(struct work_struct *work)
|
static void phy_mdm6600_deferred_power_on(struct work_struct *work)
|
||||||
@ -571,12 +572,6 @@ static int phy_mdm6600_probe(struct platform_device *pdev)
|
|||||||
ddata->dev = &pdev->dev;
|
ddata->dev = &pdev->dev;
|
||||||
platform_set_drvdata(pdev, ddata);
|
platform_set_drvdata(pdev, ddata);
|
||||||
|
|
||||||
/* Active state selected in phy_mdm6600_power_on() */
|
|
||||||
error = pinctrl_pm_select_sleep_state(ddata->dev);
|
|
||||||
if (error)
|
|
||||||
dev_warn(ddata->dev, "%s: error with sleep_state: %i\n",
|
|
||||||
__func__, error);
|
|
||||||
|
|
||||||
error = phy_mdm6600_init_lines(ddata);
|
error = phy_mdm6600_init_lines(ddata);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
@ -627,10 +622,12 @@ idle:
|
|||||||
pm_runtime_put_autosuspend(ddata->dev);
|
pm_runtime_put_autosuspend(ddata->dev);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if (error < 0)
|
if (error < 0) {
|
||||||
phy_mdm6600_device_power_off(ddata);
|
phy_mdm6600_device_power_off(ddata);
|
||||||
pm_runtime_disable(ddata->dev);
|
pm_runtime_disable(ddata->dev);
|
||||||
pm_runtime_dont_use_autosuspend(ddata->dev);
|
pm_runtime_dont_use_autosuspend(ddata->dev);
|
||||||
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -639,6 +636,7 @@ static void phy_mdm6600_remove(struct platform_device *pdev)
|
|||||||
struct phy_mdm6600 *ddata = platform_get_drvdata(pdev);
|
struct phy_mdm6600 *ddata = platform_get_drvdata(pdev);
|
||||||
struct gpio_desc *reset_gpio = ddata->ctrl_gpios[PHY_MDM6600_RESET];
|
struct gpio_desc *reset_gpio = ddata->ctrl_gpios[PHY_MDM6600_RESET];
|
||||||
|
|
||||||
|
pm_runtime_get_noresume(ddata->dev);
|
||||||
pm_runtime_dont_use_autosuspend(ddata->dev);
|
pm_runtime_dont_use_autosuspend(ddata->dev);
|
||||||
pm_runtime_put_sync(ddata->dev);
|
pm_runtime_put_sync(ddata->dev);
|
||||||
pm_runtime_disable(ddata->dev);
|
pm_runtime_disable(ddata->dev);
|
||||||
|
@ -152,7 +152,7 @@ static int qcom_apq8064_sata_phy_init(struct phy *generic_phy)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SATA phy calibrated succesfully, power up to functional mode */
|
/* SATA phy calibrated successfully, power up to functional mode */
|
||||||
writel_relaxed(0x3E, base + SATA_PHY_POW_DWN_CTRL1);
|
writel_relaxed(0x3E, base + SATA_PHY_POW_DWN_CTRL1);
|
||||||
writel_relaxed(0x01, base + SATA_PHY_RX_IMCAL0);
|
writel_relaxed(0x01, base + SATA_PHY_RX_IMCAL0);
|
||||||
writel_relaxed(0x01, base + SATA_PHY_TX_IMCAL0);
|
writel_relaxed(0x01, base + SATA_PHY_TX_IMCAL0);
|
||||||
|
@ -82,7 +82,7 @@ struct m31_priv_data {
|
|||||||
unsigned int nregs;
|
unsigned int nregs;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct m31_phy_regs m31_ipq5332_regs[] = {
|
static struct m31_phy_regs m31_ipq5332_regs[] = {
|
||||||
{
|
{
|
||||||
USB_PHY_CFG0,
|
USB_PHY_CFG0,
|
||||||
UTMI_PHY_OVERRIDE_EN,
|
UTMI_PHY_OVERRIDE_EN,
|
||||||
@ -172,8 +172,7 @@ static int m31usb_phy_init(struct phy *phy)
|
|||||||
|
|
||||||
ret = clk_prepare_enable(qphy->clk);
|
ret = clk_prepare_enable(qphy->clk);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (qphy->vreg)
|
regulator_disable(qphy->vreg);
|
||||||
regulator_disable(qphy->vreg);
|
|
||||||
dev_err(&phy->dev, "failed to enable cfg ahb clock, %d\n", ret);
|
dev_err(&phy->dev, "failed to enable cfg ahb clock, %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -256,7 +255,7 @@ static int m31usb_phy_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
qphy->vreg = devm_regulator_get(dev, "vdda-phy");
|
qphy->vreg = devm_regulator_get(dev, "vdda-phy");
|
||||||
if (IS_ERR(qphy->vreg))
|
if (IS_ERR(qphy->vreg))
|
||||||
return dev_err_probe(dev, PTR_ERR(qphy->phy),
|
return dev_err_probe(dev, PTR_ERR(qphy->vreg),
|
||||||
"failed to get vreg\n");
|
"failed to get vreg\n");
|
||||||
|
|
||||||
phy_set_drvdata(qphy->phy, qphy);
|
phy_set_drvdata(qphy->phy, qphy);
|
||||||
|
@ -859,10 +859,10 @@ static const struct qmp_phy_init_tbl sm8550_usb3_pcs_tbl[] = {
|
|||||||
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_PCS_TX_RX_CONFIG, 0x0c),
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_PCS_TX_RX_CONFIG, 0x0c),
|
||||||
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG1, 0x4b),
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG1, 0x4b),
|
||||||
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG5, 0x10),
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG5, 0x10),
|
||||||
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1, 0x68),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl sm8550_usb3_pcs_usb_tbl[] = {
|
static const struct qmp_phy_init_tbl sm8550_usb3_pcs_usb_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1, 0x68),
|
||||||
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
|
||||||
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
|
||||||
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40),
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40),
|
||||||
@ -2555,6 +2555,7 @@ static int qmp_combo_usb_power_on(struct phy *phy)
|
|||||||
void __iomem *tx2 = qmp->tx2;
|
void __iomem *tx2 = qmp->tx2;
|
||||||
void __iomem *rx2 = qmp->rx2;
|
void __iomem *rx2 = qmp->rx2;
|
||||||
void __iomem *pcs = qmp->pcs;
|
void __iomem *pcs = qmp->pcs;
|
||||||
|
void __iomem *pcs_usb = qmp->pcs_usb;
|
||||||
void __iomem *status;
|
void __iomem *status;
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
int ret;
|
int ret;
|
||||||
@ -2576,6 +2577,9 @@ static int qmp_combo_usb_power_on(struct phy *phy)
|
|||||||
|
|
||||||
qmp_combo_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);
|
qmp_combo_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);
|
||||||
|
|
||||||
|
if (pcs_usb)
|
||||||
|
qmp_combo_configure(pcs_usb, cfg->pcs_usb_tbl, cfg->pcs_usb_tbl_num);
|
||||||
|
|
||||||
if (cfg->has_pwrdn_delay)
|
if (cfg->has_pwrdn_delay)
|
||||||
usleep_range(10, 20);
|
usleep_range(10, 20);
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#define QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG3 0xcc
|
#define QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG3 0xcc
|
||||||
#define QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG6 0xd8
|
#define QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG6 0xd8
|
||||||
#define QPHY_USB_V6_PCS_REFGEN_REQ_CONFIG1 0xdc
|
#define QPHY_USB_V6_PCS_REFGEN_REQ_CONFIG1 0xdc
|
||||||
#define QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1 0x90
|
#define QPHY_USB_V6_PCS_POWER_STATE_CONFIG1 0x90
|
||||||
#define QPHY_USB_V6_PCS_RX_SIGDET_LVL 0x188
|
#define QPHY_USB_V6_PCS_RX_SIGDET_LVL 0x188
|
||||||
#define QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_L 0x190
|
#define QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_L 0x190
|
||||||
#define QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_H 0x194
|
#define QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_H 0x194
|
||||||
@ -23,6 +23,7 @@
|
|||||||
#define QPHY_USB_V6_PCS_EQ_CONFIG1 0x1dc
|
#define QPHY_USB_V6_PCS_EQ_CONFIG1 0x1dc
|
||||||
#define QPHY_USB_V6_PCS_EQ_CONFIG5 0x1ec
|
#define QPHY_USB_V6_PCS_EQ_CONFIG5 0x1ec
|
||||||
|
|
||||||
|
#define QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1 0x00
|
||||||
#define QPHY_USB_V6_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL 0x18
|
#define QPHY_USB_V6_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL 0x18
|
||||||
#define QPHY_USB_V6_PCS_USB3_RXEQTRAINING_DFE_TIME_S2 0x3c
|
#define QPHY_USB_V6_PCS_USB3_RXEQTRAINING_DFE_TIME_S2 0x3c
|
||||||
#define QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_L 0x40
|
#define QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_L 0x40
|
||||||
|
@ -1112,8 +1112,6 @@ static const struct qmp_phy_init_tbl sc8280xp_usb3_uniphy_pcs_tbl[] = {
|
|||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_SIGDET_LVL, 0xaa),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_SIGDET_LVL, 0xaa),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCS_TX_RX_CONFIG, 0x0c),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCS_TX_RX_CONFIG, 0x0c),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
|
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
|
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_CDR_RESET_TIME, 0x0a),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_CDR_RESET_TIME, 0x0a),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG1, 0x88),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG1, 0x88),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG2, 0x13),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG2, 0x13),
|
||||||
@ -1122,6 +1120,11 @@ static const struct qmp_phy_init_tbl sc8280xp_usb3_uniphy_pcs_tbl[] = {
|
|||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_REFGEN_REQ_CONFIG1, 0x21),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_REFGEN_REQ_CONFIG1, 0x21),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sc8280xp_usb3_uniphy_pcs_usb_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl sa8775p_usb3_uniphy_pcs_tbl[] = {
|
static const struct qmp_phy_init_tbl sa8775p_usb3_uniphy_pcs_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG1, 0xc4),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG1, 0xc4),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG2, 0x89),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG2, 0x89),
|
||||||
@ -1131,9 +1134,6 @@ static const struct qmp_phy_init_tbl sa8775p_usb3_uniphy_pcs_tbl[] = {
|
|||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_SIGDET_LVL, 0xaa),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_SIGDET_LVL, 0xaa),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCS_TX_RX_CONFIG, 0x0c),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCS_TX_RX_CONFIG, 0x0c),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
|
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
|
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_POWER_STATE_CONFIG1, 0x6f),
|
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_CDR_RESET_TIME, 0x0a),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_CDR_RESET_TIME, 0x0a),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG1, 0x88),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG1, 0x88),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG2, 0x13),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG2, 0x13),
|
||||||
@ -1142,6 +1142,12 @@ static const struct qmp_phy_init_tbl sa8775p_usb3_uniphy_pcs_tbl[] = {
|
|||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_REFGEN_REQ_CONFIG1, 0x21),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_REFGEN_REQ_CONFIG1, 0x21),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sa8775p_usb3_uniphy_pcs_usb_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_POWER_STATE_CONFIG1, 0x6f),
|
||||||
|
};
|
||||||
|
|
||||||
struct qmp_usb_offsets {
|
struct qmp_usb_offsets {
|
||||||
u16 serdes;
|
u16 serdes;
|
||||||
u16 pcs;
|
u16 pcs;
|
||||||
@ -1383,6 +1389,8 @@ static const struct qmp_phy_cfg sa8775p_usb3_uniphy_cfg = {
|
|||||||
.rx_tbl_num = ARRAY_SIZE(sc8280xp_usb3_uniphy_rx_tbl),
|
.rx_tbl_num = ARRAY_SIZE(sc8280xp_usb3_uniphy_rx_tbl),
|
||||||
.pcs_tbl = sa8775p_usb3_uniphy_pcs_tbl,
|
.pcs_tbl = sa8775p_usb3_uniphy_pcs_tbl,
|
||||||
.pcs_tbl_num = ARRAY_SIZE(sa8775p_usb3_uniphy_pcs_tbl),
|
.pcs_tbl_num = ARRAY_SIZE(sa8775p_usb3_uniphy_pcs_tbl),
|
||||||
|
.pcs_usb_tbl = sa8775p_usb3_uniphy_pcs_usb_tbl,
|
||||||
|
.pcs_usb_tbl_num = ARRAY_SIZE(sa8775p_usb3_uniphy_pcs_usb_tbl),
|
||||||
.clk_list = qmp_v4_phy_clk_l,
|
.clk_list = qmp_v4_phy_clk_l,
|
||||||
.num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
|
.num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
|
||||||
.reset_list = qcm2290_usb3phy_reset_l,
|
.reset_list = qcm2290_usb3phy_reset_l,
|
||||||
@ -1405,6 +1413,8 @@ static const struct qmp_phy_cfg sc8280xp_usb3_uniphy_cfg = {
|
|||||||
.rx_tbl_num = ARRAY_SIZE(sc8280xp_usb3_uniphy_rx_tbl),
|
.rx_tbl_num = ARRAY_SIZE(sc8280xp_usb3_uniphy_rx_tbl),
|
||||||
.pcs_tbl = sc8280xp_usb3_uniphy_pcs_tbl,
|
.pcs_tbl = sc8280xp_usb3_uniphy_pcs_tbl,
|
||||||
.pcs_tbl_num = ARRAY_SIZE(sc8280xp_usb3_uniphy_pcs_tbl),
|
.pcs_tbl_num = ARRAY_SIZE(sc8280xp_usb3_uniphy_pcs_tbl),
|
||||||
|
.pcs_usb_tbl = sc8280xp_usb3_uniphy_pcs_usb_tbl,
|
||||||
|
.pcs_usb_tbl_num = ARRAY_SIZE(sc8280xp_usb3_uniphy_pcs_usb_tbl),
|
||||||
.clk_list = qmp_v4_phy_clk_l,
|
.clk_list = qmp_v4_phy_clk_l,
|
||||||
.num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
|
.num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
|
||||||
.reset_list = qcm2290_usb3phy_reset_l,
|
.reset_list = qcm2290_usb3phy_reset_l,
|
||||||
@ -1703,6 +1713,7 @@ static int qmp_usb_power_on(struct phy *phy)
|
|||||||
void __iomem *tx = qmp->tx;
|
void __iomem *tx = qmp->tx;
|
||||||
void __iomem *rx = qmp->rx;
|
void __iomem *rx = qmp->rx;
|
||||||
void __iomem *pcs = qmp->pcs;
|
void __iomem *pcs = qmp->pcs;
|
||||||
|
void __iomem *pcs_usb = qmp->pcs_usb;
|
||||||
void __iomem *status;
|
void __iomem *status;
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
int ret;
|
int ret;
|
||||||
@ -1726,6 +1737,9 @@ static int qmp_usb_power_on(struct phy *phy)
|
|||||||
|
|
||||||
qmp_usb_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);
|
qmp_usb_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);
|
||||||
|
|
||||||
|
if (pcs_usb)
|
||||||
|
qmp_usb_configure(pcs_usb, cfg->pcs_usb_tbl, cfg->pcs_usb_tbl_num);
|
||||||
|
|
||||||
if (cfg->has_pwrdn_delay)
|
if (cfg->has_pwrdn_delay)
|
||||||
usleep_range(10, 20);
|
usleep_range(10, 20);
|
||||||
|
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
#
|
#
|
||||||
# Phy drivers for Realtek platforms
|
# Phy drivers for Realtek platforms
|
||||||
#
|
#
|
||||||
|
|
||||||
|
if ARCH_REALTEK || COMPILE_TEST
|
||||||
|
|
||||||
config PHY_RTK_RTD_USB2PHY
|
config PHY_RTK_RTD_USB2PHY
|
||||||
tristate "Realtek RTD USB2 PHY Transceiver Driver"
|
tristate "Realtek RTD USB2 PHY Transceiver Driver"
|
||||||
depends on USB_SUPPORT
|
depends on USB_SUPPORT
|
||||||
@ -25,3 +28,5 @@ config PHY_RTK_RTD_USB3PHY
|
|||||||
The DHC (digital home center) RTD series SoCs used the Synopsys
|
The DHC (digital home center) RTD series SoCs used the Synopsys
|
||||||
DWC3 USB IP. This driver will do the PHY initialization
|
DWC3 USB IP. This driver will do the PHY initialization
|
||||||
of the parameters.
|
of the parameters.
|
||||||
|
|
||||||
|
endif # ARCH_REALTEK || COMPILE_TEST
|
||||||
|
@ -853,17 +853,11 @@ static inline void create_debug_files(struct rtk_phy *rtk_phy)
|
|||||||
|
|
||||||
rtk_phy->debug_dir = debugfs_create_dir(dev_name(rtk_phy->dev),
|
rtk_phy->debug_dir = debugfs_create_dir(dev_name(rtk_phy->dev),
|
||||||
phy_debug_root);
|
phy_debug_root);
|
||||||
if (!rtk_phy->debug_dir)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!debugfs_create_file("parameter", 0444, rtk_phy->debug_dir, rtk_phy,
|
debugfs_create_file("parameter", 0444, rtk_phy->debug_dir, rtk_phy,
|
||||||
&rtk_usb2_parameter_fops))
|
&rtk_usb2_parameter_fops);
|
||||||
goto file_error;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
file_error:
|
|
||||||
debugfs_remove_recursive(rtk_phy->debug_dir);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void remove_debug_files(struct rtk_phy *rtk_phy)
|
static inline void remove_debug_files(struct rtk_phy *rtk_phy)
|
||||||
|
@ -416,17 +416,11 @@ static inline void create_debug_files(struct rtk_phy *rtk_phy)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
rtk_phy->debug_dir = debugfs_create_dir(dev_name(rtk_phy->dev), phy_debug_root);
|
rtk_phy->debug_dir = debugfs_create_dir(dev_name(rtk_phy->dev), phy_debug_root);
|
||||||
if (!rtk_phy->debug_dir)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!debugfs_create_file("parameter", 0444, rtk_phy->debug_dir, rtk_phy,
|
debugfs_create_file("parameter", 0444, rtk_phy->debug_dir, rtk_phy,
|
||||||
&rtk_usb3_parameter_fops))
|
&rtk_usb3_parameter_fops);
|
||||||
goto file_error;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
file_error:
|
|
||||||
debugfs_remove_recursive(rtk_phy->debug_dir);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void remove_debug_files(struct rtk_phy *rtk_phy)
|
static inline void remove_debug_files(struct rtk_phy *rtk_phy)
|
||||||
|
Loading…
Reference in New Issue
Block a user