2 * Copyright (c) 2013-2015, Linux Foundation. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
15 #include "phy-qcom-ufs-qmp-14nm.h"
17 #define UFS_PHY_NAME "ufs_phy_qmp_14nm"
18 #define UFS_PHY_VDDA_PHY_UV (925000)
21 int ufs_qcom_phy_qmp_14nm_phy_calibrate(struct ufs_qcom_phy
*ufs_qcom_phy
,
24 int tbl_size_A
= ARRAY_SIZE(phy_cal_table_rate_A
);
25 int tbl_size_B
= ARRAY_SIZE(phy_cal_table_rate_B
);
28 err
= ufs_qcom_phy_calibrate(ufs_qcom_phy
, phy_cal_table_rate_A
,
29 tbl_size_A
, phy_cal_table_rate_B
, tbl_size_B
, is_rate_B
);
32 dev_err(ufs_qcom_phy
->dev
,
33 "%s: ufs_qcom_phy_calibrate() failed %d\n",
39 void ufs_qcom_phy_qmp_14nm_advertise_quirks(struct ufs_qcom_phy
*phy_common
)
42 UFS_QCOM_PHY_QUIRK_HIBERN8_EXIT_AFTER_PHY_PWR_COLLAPSE
;
45 static int ufs_qcom_phy_qmp_14nm_init(struct phy
*generic_phy
)
47 struct ufs_qcom_phy_qmp_14nm
*phy
= phy_get_drvdata(generic_phy
);
48 struct ufs_qcom_phy
*phy_common
= &phy
->common_cfg
;
51 err
= ufs_qcom_phy_init_clks(generic_phy
, phy_common
);
53 dev_err(phy_common
->dev
, "%s: ufs_qcom_phy_init_clks() failed %d\n",
58 err
= ufs_qcom_phy_init_vregulators(generic_phy
, phy_common
);
60 dev_err(phy_common
->dev
, "%s: ufs_qcom_phy_init_vregulators() failed %d\n",
64 phy_common
->vdda_phy
.max_uV
= UFS_PHY_VDDA_PHY_UV
;
65 phy_common
->vdda_phy
.min_uV
= UFS_PHY_VDDA_PHY_UV
;
67 ufs_qcom_phy_qmp_14nm_advertise_quirks(phy_common
);
74 void ufs_qcom_phy_qmp_14nm_power_control(struct ufs_qcom_phy
*phy
, bool val
)
76 writel_relaxed(val
? 0x1 : 0x0, phy
->mmio
+ UFS_PHY_POWER_DOWN_CONTROL
);
78 * Before any transactions involving PHY, ensure PHY knows
79 * that it's analog rail is powered ON (or OFF).
85 void ufs_qcom_phy_qmp_14nm_set_tx_lane_enable(struct ufs_qcom_phy
*phy
, u32 val
)
88 * 14nm PHY does not have TX_LANE_ENABLE register.
89 * Implement this function so as not to propagate error to caller.
93 static inline void ufs_qcom_phy_qmp_14nm_start_serdes(struct ufs_qcom_phy
*phy
)
97 tmp
= readl_relaxed(phy
->mmio
+ UFS_PHY_PHY_START
);
98 tmp
&= ~MASK_SERDES_START
;
99 tmp
|= (1 << OFFSET_SERDES_START
);
100 writel_relaxed(tmp
, phy
->mmio
+ UFS_PHY_PHY_START
);
101 /* Ensure register value is committed */
105 static int ufs_qcom_phy_qmp_14nm_is_pcs_ready(struct ufs_qcom_phy
*phy_common
)
110 err
= readl_poll_timeout(phy_common
->mmio
+ UFS_PHY_PCS_READY_STATUS
,
111 val
, (val
& MASK_PCS_READY
), 10, 1000000);
113 dev_err(phy_common
->dev
, "%s: poll for pcs failed err = %d\n",
118 static const struct phy_ops ufs_qcom_phy_qmp_14nm_phy_ops
= {
119 .init
= ufs_qcom_phy_qmp_14nm_init
,
120 .exit
= ufs_qcom_phy_exit
,
121 .power_on
= ufs_qcom_phy_power_on
,
122 .power_off
= ufs_qcom_phy_power_off
,
123 .owner
= THIS_MODULE
,
126 static struct ufs_qcom_phy_specific_ops phy_14nm_ops
= {
127 .calibrate_phy
= ufs_qcom_phy_qmp_14nm_phy_calibrate
,
128 .start_serdes
= ufs_qcom_phy_qmp_14nm_start_serdes
,
129 .is_physical_coding_sublayer_ready
= ufs_qcom_phy_qmp_14nm_is_pcs_ready
,
130 .set_tx_lane_enable
= ufs_qcom_phy_qmp_14nm_set_tx_lane_enable
,
131 .power_control
= ufs_qcom_phy_qmp_14nm_power_control
,
134 static int ufs_qcom_phy_qmp_14nm_probe(struct platform_device
*pdev
)
136 struct device
*dev
= &pdev
->dev
;
137 struct phy
*generic_phy
;
138 struct ufs_qcom_phy_qmp_14nm
*phy
;
141 phy
= devm_kzalloc(dev
, sizeof(*phy
), GFP_KERNEL
);
147 generic_phy
= ufs_qcom_phy_generic_probe(pdev
, &phy
->common_cfg
,
148 &ufs_qcom_phy_qmp_14nm_phy_ops
, &phy_14nm_ops
);
151 dev_err(dev
, "%s: ufs_qcom_phy_generic_probe() failed\n",
157 phy_set_drvdata(generic_phy
, phy
);
159 strlcpy(phy
->common_cfg
.name
, UFS_PHY_NAME
,
160 sizeof(phy
->common_cfg
.name
));
166 static int ufs_qcom_phy_qmp_14nm_remove(struct platform_device
*pdev
)
168 struct device
*dev
= &pdev
->dev
;
169 struct phy
*generic_phy
= to_phy(dev
);
170 struct ufs_qcom_phy
*ufs_qcom_phy
= get_ufs_qcom_phy(generic_phy
);
173 err
= ufs_qcom_phy_remove(generic_phy
, ufs_qcom_phy
);
175 dev_err(dev
, "%s: ufs_qcom_phy_remove failed = %d\n",
181 static const struct of_device_id ufs_qcom_phy_qmp_14nm_of_match
[] = {
182 {.compatible
= "qcom,ufs-phy-qmp-14nm"},
185 MODULE_DEVICE_TABLE(of
, ufs_qcom_phy_qmp_14nm_of_match
);
187 static struct platform_driver ufs_qcom_phy_qmp_14nm_driver
= {
188 .probe
= ufs_qcom_phy_qmp_14nm_probe
,
189 .remove
= ufs_qcom_phy_qmp_14nm_remove
,
191 .of_match_table
= ufs_qcom_phy_qmp_14nm_of_match
,
192 .name
= "ufs_qcom_phy_qmp_14nm",
196 module_platform_driver(ufs_qcom_phy_qmp_14nm_driver
);
198 MODULE_DESCRIPTION("Universal Flash Storage (UFS) QCOM PHY QMP 14nm");
199 MODULE_LICENSE("GPL v2");