Lines Matching refs:host

47 static int ufs_qcom_set_bus_vote(struct ufs_qcom_host *host, int vote);
48 static void ufs_qcom_get_default_testbus_cfg(struct ufs_qcom_host *host);
104 static void ufs_qcom_disable_lane_clks(struct ufs_qcom_host *host) in ufs_qcom_disable_lane_clks() argument
106 if (!host->is_lane_clks_enabled) in ufs_qcom_disable_lane_clks()
109 clk_disable_unprepare(host->tx_l1_sync_clk); in ufs_qcom_disable_lane_clks()
110 clk_disable_unprepare(host->tx_l0_sync_clk); in ufs_qcom_disable_lane_clks()
111 clk_disable_unprepare(host->rx_l1_sync_clk); in ufs_qcom_disable_lane_clks()
112 clk_disable_unprepare(host->rx_l0_sync_clk); in ufs_qcom_disable_lane_clks()
114 host->is_lane_clks_enabled = false; in ufs_qcom_disable_lane_clks()
117 static int ufs_qcom_enable_lane_clks(struct ufs_qcom_host *host) in ufs_qcom_enable_lane_clks() argument
120 struct device *dev = host->hba->dev; in ufs_qcom_enable_lane_clks()
122 if (host->is_lane_clks_enabled) in ufs_qcom_enable_lane_clks()
126 host->rx_l0_sync_clk); in ufs_qcom_enable_lane_clks()
131 host->tx_l0_sync_clk); in ufs_qcom_enable_lane_clks()
136 host->rx_l1_sync_clk); in ufs_qcom_enable_lane_clks()
141 host->tx_l1_sync_clk); in ufs_qcom_enable_lane_clks()
145 host->is_lane_clks_enabled = true; in ufs_qcom_enable_lane_clks()
149 clk_disable_unprepare(host->rx_l1_sync_clk); in ufs_qcom_enable_lane_clks()
151 clk_disable_unprepare(host->tx_l0_sync_clk); in ufs_qcom_enable_lane_clks()
153 clk_disable_unprepare(host->rx_l0_sync_clk); in ufs_qcom_enable_lane_clks()
158 static int ufs_qcom_init_lane_clks(struct ufs_qcom_host *host) in ufs_qcom_init_lane_clks() argument
161 struct device *dev = host->hba->dev; in ufs_qcom_init_lane_clks()
164 "rx_lane0_sync_clk", &host->rx_l0_sync_clk); in ufs_qcom_init_lane_clks()
169 "tx_lane0_sync_clk", &host->tx_l0_sync_clk); in ufs_qcom_init_lane_clks()
174 &host->rx_l1_sync_clk); in ufs_qcom_init_lane_clks()
179 &host->tx_l1_sync_clk); in ufs_qcom_init_lane_clks()
187 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_link_startup_post_change() local
188 struct phy *phy = host->generic_phy; in ufs_qcom_link_startup_post_change()
245 static void ufs_qcom_select_unipro_mode(struct ufs_qcom_host *host) in ufs_qcom_select_unipro_mode() argument
247 ufshcd_rmwl(host->hba, QUNIPRO_SEL, in ufs_qcom_select_unipro_mode()
248 ufs_qcom_cap_qunipro(host) ? QUNIPRO_SEL : 0, in ufs_qcom_select_unipro_mode()
256 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_power_up_sequence() local
257 struct phy *phy = host->generic_phy; in ufs_qcom_power_up_sequence()
297 ufs_qcom_select_unipro_mode(host); in ufs_qcom_power_up_sequence()
324 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_hce_enable_notify() local
335 err = ufs_qcom_enable_lane_clks(host); in ufs_qcom_hce_enable_notify()
358 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_cfg_timers() local
391 if (ufs_qcom_cap_qunipro(host) && !ufshcd_is_intr_aggr_allowed(hba)) in ufs_qcom_cfg_timers()
418 if (ufs_qcom_cap_qunipro(host)) in ufs_qcom_cfg_timers()
502 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_link_startup_notify() local
514 if (ufs_qcom_cap_qunipro(host)) in ufs_qcom_link_startup_notify()
536 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_suspend() local
537 struct phy *phy = host->generic_phy; in ufs_qcom_suspend()
546 ufs_qcom_disable_lane_clks(host); in ufs_qcom_suspend()
559 ufs_qcom_disable_lane_clks(host); in ufs_qcom_suspend()
569 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_resume() local
570 struct phy *phy = host->generic_phy; in ufs_qcom_resume()
580 err = ufs_qcom_enable_lane_clks(host); in ufs_qcom_resume()
689 static int ufs_qcom_get_bus_vote(struct ufs_qcom_host *host, in ufs_qcom_get_bus_vote() argument
692 struct device *dev = host->hba->dev; in ufs_qcom_get_bus_vote()
702 if (host->bus_vote.is_max_bw_needed && !!strcmp(speed_mode, "MIN")) in ufs_qcom_get_bus_vote()
742 static int ufs_qcom_set_bus_vote(struct ufs_qcom_host *host, int vote) in ufs_qcom_set_bus_vote() argument
746 if (vote != host->bus_vote.curr_vote) { in ufs_qcom_set_bus_vote()
748 host->bus_vote.client_handle, vote); in ufs_qcom_set_bus_vote()
750 dev_err(host->hba->dev, in ufs_qcom_set_bus_vote()
752 __func__, host->bus_vote.client_handle, in ufs_qcom_set_bus_vote()
757 host->bus_vote.curr_vote = vote; in ufs_qcom_set_bus_vote()
763 static int ufs_qcom_update_bus_bw_vote(struct ufs_qcom_host *host) in ufs_qcom_update_bus_bw_vote() argument
769 ufs_qcom_get_speed_mode(&host->dev_req_params, mode); in ufs_qcom_update_bus_bw_vote()
771 vote = ufs_qcom_get_bus_vote(host, mode); in ufs_qcom_update_bus_bw_vote()
773 err = ufs_qcom_set_bus_vote(host, vote); in ufs_qcom_update_bus_bw_vote()
778 dev_err(host->hba->dev, "%s: failed %d\n", __func__, err); in ufs_qcom_update_bus_bw_vote()
780 host->bus_vote.saved_vote = vote; in ufs_qcom_update_bus_bw_vote()
789 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in show_ufs_to_mem_max_bus_bw() local
792 host->bus_vote.is_max_bw_needed); in show_ufs_to_mem_max_bus_bw()
800 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in store_ufs_to_mem_max_bus_bw() local
804 host->bus_vote.is_max_bw_needed = !!value; in store_ufs_to_mem_max_bus_bw()
805 ufs_qcom_update_bus_bw_vote(host); in store_ufs_to_mem_max_bus_bw()
811 static int ufs_qcom_bus_register(struct ufs_qcom_host *host) in ufs_qcom_bus_register() argument
815 struct device *dev = host->hba->dev; in ufs_qcom_bus_register()
833 host->bus_vote.client_handle = msm_bus_scale_register_client(bus_pdata); in ufs_qcom_bus_register()
834 if (!host->bus_vote.client_handle) { in ufs_qcom_bus_register()
842 host->bus_vote.min_bw_vote = ufs_qcom_get_bus_vote(host, "MIN"); in ufs_qcom_bus_register()
843 host->bus_vote.max_bw_vote = ufs_qcom_get_bus_vote(host, "MAX"); in ufs_qcom_bus_register()
845 host->bus_vote.max_bus_bw.show = show_ufs_to_mem_max_bus_bw; in ufs_qcom_bus_register()
846 host->bus_vote.max_bus_bw.store = store_ufs_to_mem_max_bus_bw; in ufs_qcom_bus_register()
847 sysfs_attr_init(&host->bus_vote.max_bus_bw.attr); in ufs_qcom_bus_register()
848 host->bus_vote.max_bus_bw.attr.name = "max_bus_bw"; in ufs_qcom_bus_register()
849 host->bus_vote.max_bus_bw.attr.mode = S_IRUGO | S_IWUSR; in ufs_qcom_bus_register()
850 err = device_create_file(dev, &host->bus_vote.max_bus_bw); in ufs_qcom_bus_register()
855 static int ufs_qcom_update_bus_bw_vote(struct ufs_qcom_host *host) in ufs_qcom_update_bus_bw_vote() argument
860 static int ufs_qcom_set_bus_vote(struct ufs_qcom_host *host, int vote) in ufs_qcom_set_bus_vote() argument
865 static int ufs_qcom_bus_register(struct ufs_qcom_host *host) in ufs_qcom_bus_register() argument
871 static void ufs_qcom_dev_ref_clk_ctrl(struct ufs_qcom_host *host, bool enable) in ufs_qcom_dev_ref_clk_ctrl() argument
873 if (host->dev_ref_clk_ctrl_mmio && in ufs_qcom_dev_ref_clk_ctrl()
874 (enable ^ host->is_dev_ref_clk_enabled)) { in ufs_qcom_dev_ref_clk_ctrl()
875 u32 temp = readl_relaxed(host->dev_ref_clk_ctrl_mmio); in ufs_qcom_dev_ref_clk_ctrl()
878 temp |= host->dev_ref_clk_en_mask; in ufs_qcom_dev_ref_clk_ctrl()
880 temp &= ~host->dev_ref_clk_en_mask; in ufs_qcom_dev_ref_clk_ctrl()
891 writel_relaxed(temp, host->dev_ref_clk_ctrl_mmio); in ufs_qcom_dev_ref_clk_ctrl()
904 host->is_dev_ref_clk_enabled = enable; in ufs_qcom_dev_ref_clk_ctrl()
914 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_pwr_change_notify() local
915 struct phy *phy = host->generic_phy; in ufs_qcom_pwr_change_notify()
942 if (host->hw_ver.major == 0x1) { in ufs_qcom_pwr_change_notify()
989 memcpy(&host->dev_req_params, in ufs_qcom_pwr_change_notify()
991 ufs_qcom_update_bus_bw_vote(host); in ufs_qcom_pwr_change_notify()
1003 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_get_ufs_hci_version() local
1005 if (host->hw_ver.major == 0x1) in ufs_qcom_get_ufs_hci_version()
1022 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_advertise_quirks() local
1024 if (host->hw_ver.major == 0x01) { in ufs_qcom_advertise_quirks()
1029 if (host->hw_ver.minor == 0x0001 && host->hw_ver.step == 0x0001) in ufs_qcom_advertise_quirks()
1035 if (host->hw_ver.major >= 0x2) { in ufs_qcom_advertise_quirks()
1038 if (!ufs_qcom_cap_qunipro(host)) in ufs_qcom_advertise_quirks()
1048 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_set_caps() local
1054 if (host->hw_ver.major >= 0x2) { in ufs_qcom_set_caps()
1055 host->caps = UFS_QCOM_CAP_QUNIPRO | in ufs_qcom_set_caps()
1069 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_setup_clocks() local
1078 if (!host) in ufs_qcom_setup_clocks()
1082 err = ufs_qcom_phy_enable_iface_clk(host->generic_phy); in ufs_qcom_setup_clocks()
1086 err = ufs_qcom_phy_enable_ref_clk(host->generic_phy); in ufs_qcom_setup_clocks()
1090 ufs_qcom_phy_disable_iface_clk(host->generic_phy); in ufs_qcom_setup_clocks()
1093 vote = host->bus_vote.saved_vote; in ufs_qcom_setup_clocks()
1094 if (vote == host->bus_vote.min_bw_vote) in ufs_qcom_setup_clocks()
1095 ufs_qcom_update_bus_bw_vote(host); in ufs_qcom_setup_clocks()
1100 ufs_qcom_phy_disable_iface_clk(host->generic_phy); in ufs_qcom_setup_clocks()
1103 ufs_qcom_dev_ref_clk_ctrl(host, false); in ufs_qcom_setup_clocks()
1105 vote = host->bus_vote.min_bw_vote; in ufs_qcom_setup_clocks()
1108 err = ufs_qcom_set_bus_vote(host, vote); in ufs_qcom_setup_clocks()
1144 struct ufs_qcom_host *host; in ufs_qcom_init() local
1150 host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); in ufs_qcom_init()
1151 if (!host) { in ufs_qcom_init()
1158 host->hba = hba; in ufs_qcom_init()
1159 ufshcd_set_variant(hba, host); in ufs_qcom_init()
1166 host->generic_phy = devm_phy_get(dev, "ufsphy"); in ufs_qcom_init()
1168 if (IS_ERR(host->generic_phy)) { in ufs_qcom_init()
1169 err = PTR_ERR(host->generic_phy); in ufs_qcom_init()
1174 err = ufs_qcom_bus_register(host); in ufs_qcom_init()
1178 ufs_qcom_get_controller_revision(hba, &host->hw_ver.major, in ufs_qcom_init()
1179 &host->hw_ver.minor, &host->hw_ver.step); in ufs_qcom_init()
1185 if (host->hw_ver.major >= 0x02) { in ufs_qcom_init()
1186 host->dev_ref_clk_ctrl_mmio = hba->mmio_base + REG_UFS_CFG1; in ufs_qcom_init()
1187 host->dev_ref_clk_en_mask = BIT(26); in ufs_qcom_init()
1192 host->dev_ref_clk_ctrl_mmio = in ufs_qcom_init()
1194 if (IS_ERR(host->dev_ref_clk_ctrl_mmio)) { in ufs_qcom_init()
1198 PTR_ERR(host->dev_ref_clk_ctrl_mmio)); in ufs_qcom_init()
1199 host->dev_ref_clk_ctrl_mmio = NULL; in ufs_qcom_init()
1201 host->dev_ref_clk_en_mask = BIT(5); in ufs_qcom_init()
1206 ufs_qcom_phy_save_controller_version(host->generic_phy, in ufs_qcom_init()
1207 host->hw_ver.major, host->hw_ver.minor, host->hw_ver.step); in ufs_qcom_init()
1209 phy_init(host->generic_phy); in ufs_qcom_init()
1210 err = phy_power_on(host->generic_phy); in ufs_qcom_init()
1214 err = ufs_qcom_init_lane_clks(host); in ufs_qcom_init()
1224 ufs_qcom_hosts[hba->dev->id] = host; in ufs_qcom_init()
1226 host->dbg_print_en |= UFS_QCOM_DEFAULT_DBG_PRINT_EN; in ufs_qcom_init()
1227 ufs_qcom_get_default_testbus_cfg(host); in ufs_qcom_init()
1228 err = ufs_qcom_testbus_config(host); in ufs_qcom_init()
1238 phy_power_off(host->generic_phy); in ufs_qcom_init()
1240 phy_exit(host->generic_phy); in ufs_qcom_init()
1242 devm_kfree(dev, host); in ufs_qcom_init()
1250 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_exit() local
1252 ufs_qcom_disable_lane_clks(host); in ufs_qcom_exit()
1253 phy_power_off(host->generic_phy); in ufs_qcom_exit()
1292 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_clk_scale_up_post_change() local
1294 if (!ufs_qcom_cap_qunipro(host)) in ufs_qcom_clk_scale_up_post_change()
1303 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_clk_scale_down_pre_change() local
1307 if (!ufs_qcom_cap_qunipro(host)) in ufs_qcom_clk_scale_down_pre_change()
1328 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_clk_scale_down_post_change() local
1330 if (!ufs_qcom_cap_qunipro(host)) in ufs_qcom_clk_scale_down_post_change()
1340 struct ufs_qcom_host *host = ufshcd_get_variant(hba); in ufs_qcom_clk_scale_notify() local
1341 struct ufs_pa_layer_attr *dev_req_params = &host->dev_req_params; in ufs_qcom_clk_scale_notify()
1363 ufs_qcom_update_bus_bw_vote(host); in ufs_qcom_clk_scale_notify()
1370 static void ufs_qcom_get_default_testbus_cfg(struct ufs_qcom_host *host) in ufs_qcom_get_default_testbus_cfg() argument
1373 host->testbus.select_major = TSTBUS_UAWM; in ufs_qcom_get_default_testbus_cfg()
1374 host->testbus.select_minor = 1; in ufs_qcom_get_default_testbus_cfg()
1377 static bool ufs_qcom_testbus_cfg_is_ok(struct ufs_qcom_host *host) in ufs_qcom_testbus_cfg_is_ok() argument
1379 if (host->testbus.select_major >= TSTBUS_MAX) { in ufs_qcom_testbus_cfg_is_ok()
1380 dev_err(host->hba->dev, in ufs_qcom_testbus_cfg_is_ok()
1382 __func__, host->testbus.select_major); in ufs_qcom_testbus_cfg_is_ok()
1391 if (host->testbus.select_minor > 0x1F) { in ufs_qcom_testbus_cfg_is_ok()
1392 dev_err(host->hba->dev, in ufs_qcom_testbus_cfg_is_ok()
1394 __func__, host->testbus.select_minor); in ufs_qcom_testbus_cfg_is_ok()
1401 int ufs_qcom_testbus_config(struct ufs_qcom_host *host) in ufs_qcom_testbus_config() argument
1407 if (!host) in ufs_qcom_testbus_config()
1410 if (!ufs_qcom_testbus_cfg_is_ok(host)) in ufs_qcom_testbus_config()
1413 switch (host->testbus.select_major) { in ufs_qcom_testbus_config()
1470 pm_runtime_get_sync(host->hba->dev); in ufs_qcom_testbus_config()
1471 ufshcd_hold(host->hba, false); in ufs_qcom_testbus_config()
1472 ufshcd_rmwl(host->hba, TEST_BUS_SEL, in ufs_qcom_testbus_config()
1473 (u32)host->testbus.select_major << 19, in ufs_qcom_testbus_config()
1475 ufshcd_rmwl(host->hba, mask, in ufs_qcom_testbus_config()
1476 (u32)host->testbus.select_minor << offset, in ufs_qcom_testbus_config()
1478 ufshcd_release(host->hba); in ufs_qcom_testbus_config()
1479 pm_runtime_put_sync(host->hba->dev); in ufs_qcom_testbus_config()