1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Universal Flash Storage Host controller Platform bus based glue driver
4 * Copyright (C) 2011-2013 Samsung India Software Operations
7 * Santosh Yaraganavi <santosh.sy@samsung.com>
8 * Vinayak Holikatti <h.vinayak@samsung.com>
11 #include <linux/clk.h>
12 #include <linux/module.h>
13 #include <linux/platform_device.h>
14 #include <linux/pm_opp.h>
15 #include <linux/pm_runtime.h>
18 #include <ufs/ufshcd.h>
19 #include "ufshcd-pltfrm.h"
20 #include <ufs/unipro.h>
22 #define UFSHCD_DEFAULT_LANES_PER_DIRECTION 2
24 static int ufshcd_parse_clock_info(struct ufs_hba
*hba
)
29 struct device
*dev
= hba
->dev
;
30 struct device_node
*np
= dev
->of_node
;
33 struct ufs_clk_info
*clki
;
39 cnt
= of_property_count_strings(np
, "clock-names");
40 if (!cnt
|| (cnt
== -EINVAL
)) {
41 dev_info(dev
, "%s: Unable to find clocks, assuming enabled\n",
44 dev_err(dev
, "%s: count clock strings failed, err %d\n",
52 sz
= of_property_count_u32_elems(np
, "freq-table-hz");
54 dev_info(dev
, "freq-table-hz property not specified\n");
59 dev_err(dev
, "%s len mismatch\n", "freq-table-hz");
64 clkfreq
= devm_kcalloc(dev
, sz
, sizeof(*clkfreq
),
71 ret
= of_property_read_u32_array(np
, "freq-table-hz",
73 if (ret
&& (ret
!= -EINVAL
)) {
74 dev_err(dev
, "%s: error reading array %d\n",
75 "freq-table-hz", ret
);
79 for (i
= 0; i
< sz
; i
+= 2) {
80 ret
= of_property_read_string_index(np
, "clock-names", i
/2,
85 clki
= devm_kzalloc(dev
, sizeof(*clki
), GFP_KERNEL
);
91 clki
->min_freq
= clkfreq
[i
];
92 clki
->max_freq
= clkfreq
[i
+1];
93 clki
->name
= devm_kstrdup(dev
, name
, GFP_KERNEL
);
99 if (!strcmp(name
, "ref_clk"))
100 clki
->keep_link_active
= true;
101 dev_dbg(dev
, "%s: min %u max %u name %s\n", "freq-table-hz",
102 clki
->min_freq
, clki
->max_freq
, clki
->name
);
103 list_add_tail(&clki
->list
, &hba
->clk_list_head
);
109 static bool phandle_exists(const struct device_node
*np
,
110 const char *phandle_name
, int index
)
112 struct device_node
*parse_np
= of_parse_phandle(np
, phandle_name
, index
);
115 of_node_put(parse_np
);
117 return parse_np
!= NULL
;
120 #define MAX_PROP_SIZE 32
121 int ufshcd_populate_vreg(struct device
*dev
, const char *name
,
122 struct ufs_vreg
**out_vreg
, bool skip_current
)
124 char prop_name
[MAX_PROP_SIZE
];
125 struct ufs_vreg
*vreg
= NULL
;
126 struct device_node
*np
= dev
->of_node
;
129 dev_err(dev
, "%s: non DT initialization\n", __func__
);
133 snprintf(prop_name
, MAX_PROP_SIZE
, "%s-supply", name
);
134 if (!phandle_exists(np
, prop_name
, 0)) {
135 dev_info(dev
, "%s: Unable to find %s regulator, assuming enabled\n",
136 __func__
, prop_name
);
140 vreg
= devm_kzalloc(dev
, sizeof(*vreg
), GFP_KERNEL
);
144 vreg
->name
= devm_kstrdup(dev
, name
, GFP_KERNEL
);
153 snprintf(prop_name
, MAX_PROP_SIZE
, "%s-max-microamp", name
);
154 if (of_property_read_u32(np
, prop_name
, &vreg
->max_uA
)) {
155 dev_info(dev
, "%s: unable to find %s\n", __func__
, prop_name
);
162 EXPORT_SYMBOL_GPL(ufshcd_populate_vreg
);
165 * ufshcd_parse_regulator_info - get regulator info from device tree
166 * @hba: per adapter instance
168 * Get regulator info from device tree for vcc, vccq, vccq2 power supplies.
169 * If any of the supplies are not defined it is assumed that they are always-on
170 * and hence return zero. If the property is defined but parsing is failed
171 * then return corresponding error.
173 * Return: 0 upon success; < 0 upon failure.
175 static int ufshcd_parse_regulator_info(struct ufs_hba
*hba
)
178 struct device
*dev
= hba
->dev
;
179 struct ufs_vreg_info
*info
= &hba
->vreg_info
;
181 err
= ufshcd_populate_vreg(dev
, "vdd-hba", &info
->vdd_hba
, true);
185 err
= ufshcd_populate_vreg(dev
, "vcc", &info
->vcc
, false);
189 err
= ufshcd_populate_vreg(dev
, "vccq", &info
->vccq
, false);
193 err
= ufshcd_populate_vreg(dev
, "vccq2", &info
->vccq2
, false);
198 static void ufshcd_init_lanes_per_dir(struct ufs_hba
*hba
)
200 struct device
*dev
= hba
->dev
;
203 ret
= of_property_read_u32(dev
->of_node
, "lanes-per-direction",
204 &hba
->lanes_per_direction
);
207 "%s: failed to read lanes-per-direction, ret=%d\n",
209 hba
->lanes_per_direction
= UFSHCD_DEFAULT_LANES_PER_DIRECTION
;
214 * ufshcd_parse_clock_min_max_freq - Parse MIN and MAX clocks freq
215 * @hba: per adapter instance
217 * This function parses MIN and MAX frequencies of all clocks required
218 * by the host drivers.
220 * Returns 0 for success and non-zero for failure
222 static int ufshcd_parse_clock_min_max_freq(struct ufs_hba
*hba
)
224 struct list_head
*head
= &hba
->clk_list_head
;
225 struct ufs_clk_info
*clki
;
226 struct dev_pm_opp
*opp
;
230 list_for_each_entry(clki
, head
, list
) {
234 clki
->clk
= devm_clk_get(hba
->dev
, clki
->name
);
235 if (IS_ERR(clki
->clk
))
240 opp
= dev_pm_opp_find_freq_floor_indexed(hba
->dev
, &freq
, idx
);
242 dev_err(hba
->dev
, "Failed to find OPP for MAX frequency\n");
245 clki
->max_freq
= dev_pm_opp_get_freq_indexed(opp
, idx
);
250 opp
= dev_pm_opp_find_freq_ceil_indexed(hba
->dev
, &freq
, idx
);
252 dev_err(hba
->dev
, "Failed to find OPP for MIN frequency\n");
255 clki
->min_freq
= dev_pm_opp_get_freq_indexed(opp
, idx
++);
262 static int ufshcd_parse_operating_points(struct ufs_hba
*hba
)
264 struct device
*dev
= hba
->dev
;
265 struct device_node
*np
= dev
->of_node
;
266 struct dev_pm_opp_config config
= {};
267 struct ufs_clk_info
*clki
;
268 const char **clk_names
;
271 if (!of_property_present(np
, "operating-points-v2"))
274 if (of_property_present(np
, "freq-table-hz")) {
275 dev_err(dev
, "%s: operating-points and freq-table-hz are incompatible\n",
280 cnt
= of_property_count_strings(np
, "clock-names");
282 dev_err(dev
, "%s: Missing clock-names\n", __func__
);
286 /* OPP expects clk_names to be NULL terminated */
287 clk_names
= devm_kcalloc(dev
, cnt
+ 1, sizeof(*clk_names
), GFP_KERNEL
);
292 * We still need to get reference to all clocks as the UFS core uses
295 for (i
= 0; i
< cnt
; i
++) {
296 ret
= of_property_read_string_index(np
, "clock-names", i
,
301 clki
= devm_kzalloc(dev
, sizeof(*clki
), GFP_KERNEL
);
305 clki
->name
= devm_kstrdup(dev
, clk_names
[i
], GFP_KERNEL
);
309 if (!strcmp(clk_names
[i
], "ref_clk"))
310 clki
->keep_link_active
= true;
312 list_add_tail(&clki
->list
, &hba
->clk_list_head
);
315 config
.clk_names
= clk_names
,
316 config
.config_clks
= ufshcd_opp_config_clks
;
318 ret
= devm_pm_opp_set_config(dev
, &config
);
322 ret
= devm_pm_opp_of_add_table(dev
);
324 dev_err(dev
, "Failed to add OPP table: %d\n", ret
);
328 ret
= ufshcd_parse_clock_min_max_freq(hba
);
332 hba
->use_pm_opp
= true;
338 * ufshcd_negotiate_pwr_params - find power mode settings that are supported by
339 * both the controller and the device
340 * @host_params: pointer to host parameters
341 * @dev_max: pointer to device attributes
342 * @agreed_pwr: returned agreed attributes
344 * Return: 0 on success, non-zero value on failure.
346 int ufshcd_negotiate_pwr_params(const struct ufs_host_params
*host_params
,
347 const struct ufs_pa_layer_attr
*dev_max
,
348 struct ufs_pa_layer_attr
*agreed_pwr
)
352 bool is_dev_sup_hs
= false;
353 bool is_host_max_hs
= false;
355 if (dev_max
->pwr_rx
== FAST_MODE
)
356 is_dev_sup_hs
= true;
358 if (host_params
->desired_working_mode
== UFS_HS_MODE
) {
359 is_host_max_hs
= true;
360 min_host_gear
= min_t(u32
, host_params
->hs_rx_gear
,
361 host_params
->hs_tx_gear
);
363 min_host_gear
= min_t(u32
, host_params
->pwm_rx_gear
,
364 host_params
->pwm_tx_gear
);
368 * device doesn't support HS but host_params->desired_working_mode is HS,
369 * thus device and host_params don't agree
371 if (!is_dev_sup_hs
&& is_host_max_hs
) {
372 pr_info("%s: device doesn't support HS\n",
375 } else if (is_dev_sup_hs
&& is_host_max_hs
) {
377 * since device supports HS, it supports FAST_MODE.
378 * since host_params->desired_working_mode is also HS
379 * then final decision (FAST/FASTAUTO) is done according
380 * to pltfrm_params as it is the restricting factor
382 agreed_pwr
->pwr_rx
= host_params
->rx_pwr_hs
;
383 agreed_pwr
->pwr_tx
= agreed_pwr
->pwr_rx
;
386 * here host_params->desired_working_mode is PWM.
387 * it doesn't matter whether device supports HS or PWM,
388 * in both cases host_params->desired_working_mode will
391 agreed_pwr
->pwr_rx
= host_params
->rx_pwr_pwm
;
392 agreed_pwr
->pwr_tx
= agreed_pwr
->pwr_rx
;
396 * we would like tx to work in the minimum number of lanes
397 * between device capability and vendor preferences.
398 * the same decision will be made for rx
400 agreed_pwr
->lane_tx
= min_t(u32
, dev_max
->lane_tx
,
401 host_params
->tx_lanes
);
402 agreed_pwr
->lane_rx
= min_t(u32
, dev_max
->lane_rx
,
403 host_params
->rx_lanes
);
405 /* device maximum gear is the minimum between device rx and tx gears */
406 min_dev_gear
= min_t(u32
, dev_max
->gear_rx
, dev_max
->gear_tx
);
409 * if both device capabilities and vendor pre-defined preferences are
410 * both HS or both PWM then set the minimum gear to be the chosen
412 * if one is PWM and one is HS then the one that is PWM get to decide
413 * what is the gear, as it is the one that also decided previously what
414 * pwr the device will be configured to.
416 if ((is_dev_sup_hs
&& is_host_max_hs
) ||
417 (!is_dev_sup_hs
&& !is_host_max_hs
)) {
418 agreed_pwr
->gear_rx
=
419 min_t(u32
, min_dev_gear
, min_host_gear
);
420 } else if (!is_dev_sup_hs
) {
421 agreed_pwr
->gear_rx
= min_dev_gear
;
423 agreed_pwr
->gear_rx
= min_host_gear
;
425 agreed_pwr
->gear_tx
= agreed_pwr
->gear_rx
;
427 agreed_pwr
->hs_rate
= host_params
->hs_rate
;
431 EXPORT_SYMBOL_GPL(ufshcd_negotiate_pwr_params
);
433 void ufshcd_init_host_params(struct ufs_host_params
*host_params
)
435 *host_params
= (struct ufs_host_params
){
436 .tx_lanes
= UFS_LANE_2
,
437 .rx_lanes
= UFS_LANE_2
,
438 .hs_rx_gear
= UFS_HS_G3
,
439 .hs_tx_gear
= UFS_HS_G3
,
440 .pwm_rx_gear
= UFS_PWM_G4
,
441 .pwm_tx_gear
= UFS_PWM_G4
,
442 .rx_pwr_pwm
= SLOW_MODE
,
443 .tx_pwr_pwm
= SLOW_MODE
,
444 .rx_pwr_hs
= FAST_MODE
,
445 .tx_pwr_hs
= FAST_MODE
,
446 .hs_rate
= PA_HS_MODE_B
,
447 .desired_working_mode
= UFS_HS_MODE
,
450 EXPORT_SYMBOL_GPL(ufshcd_init_host_params
);
453 * ufshcd_pltfrm_init - probe routine of the driver
454 * @pdev: pointer to Platform device handle
455 * @vops: pointer to variant ops
457 * Return: 0 on success, non-zero value on failure.
459 int ufshcd_pltfrm_init(struct platform_device
*pdev
,
460 const struct ufs_hba_variant_ops
*vops
)
463 void __iomem
*mmio_base
;
465 struct device
*dev
= &pdev
->dev
;
467 mmio_base
= devm_platform_ioremap_resource(pdev
, 0);
468 if (IS_ERR(mmio_base
)) {
469 err
= PTR_ERR(mmio_base
);
473 irq
= platform_get_irq(pdev
, 0);
479 err
= ufshcd_alloc_host(dev
, &hba
);
481 dev_err(dev
, "Allocation failed\n");
487 err
= ufshcd_parse_clock_info(hba
);
489 dev_err(dev
, "%s: clock parse failed %d\n",
493 err
= ufshcd_parse_regulator_info(hba
);
495 dev_err(dev
, "%s: regulator init failed %d\n",
500 ufshcd_init_lanes_per_dir(hba
);
502 err
= ufshcd_parse_operating_points(hba
);
504 dev_err(dev
, "%s: OPP parse failed %d\n", __func__
, err
);
508 err
= ufshcd_init(hba
, mmio_base
, irq
);
510 dev_err_probe(dev
, err
, "Initialization failed with error %d\n",
515 pm_runtime_set_active(dev
);
516 pm_runtime_enable(dev
);
521 ufshcd_dealloc_host(hba
);
525 EXPORT_SYMBOL_GPL(ufshcd_pltfrm_init
);
527 MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>");
528 MODULE_AUTHOR("Vinayak Holikatti <h.vinayak@samsung.com>");
529 MODULE_DESCRIPTION("UFS host controller Platform bus based glue driver");
530 MODULE_LICENSE("GPL");