Skip to content

Commit 67e1409

Browse files
committed
WIP: Add clocks and resets to the Rockchip UFS driver
Signed-off-by: Alexey Charkov <alchark@gmail.com>
1 parent 9c03d74 commit 67e1409

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

drivers/ufs/ufs-rockchip.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* Copyright (C) 2025 Rockchip Electronics Co.Ltd.
66
*/
77

8+
#include <asm/gpio.h>
89
#include <asm/io.h>
910
#include <clk.h>
1011
#include <dm.h>
@@ -19,6 +20,13 @@
1920
#include "unipro.h"
2021
#include "ufs-rockchip.h"
2122

23+
static void ufs_rockchip_controller_reset(struct ufs_rockchip_host *host)
24+
{
25+
reset_assert_bulk(&host->rsts);
26+
udelay(1);
27+
reset_deassert_bulk(&host->rsts);
28+
}
29+
2230
static int ufs_rockchip_hce_enable_notify(struct ufs_hba *hba,
2331
enum ufs_notify_change_status status)
2432
{
@@ -153,11 +161,53 @@ static int ufs_rockchip_common_init(struct ufs_hba *hba)
153161
return err;
154162
}
155163

164+
ufs_rockchip_controller_reset(host);
165+
166+
err = clk_get_by_name(dev, "ref_out", &host->ref_out_clk);
167+
if (err) {
168+
dev_err(dev, "cannot get ref_out_clk: %d\n", err);
169+
return err;
170+
}
171+
172+
err = gpio_request_by_name(dev, "reset-gpios", 0, &host->device_reset,
173+
GPIOD_IS_OUT | GPIOD_ACTIVE_LOW);
174+
if (err) {
175+
dev_err(dev, "Warning: cannot get reset GPIO\n");
176+
}
177+
178+
err = clk_get_bulk(dev, &host->clks);
179+
if (err) {
180+
dev_err(dev, "cannot get clocks: %d\n", err);
181+
return err;
182+
}
183+
184+
err = clk_enable_bulk(&host->clks);
185+
if (err) {
186+
dev_err(dev, "cannot enable clocks: %d\n", err);
187+
return err;
188+
}
189+
156190
host->hba = hba;
157191

158192
return 0;
159193
}
160194

195+
static int ufs_rockchip_device_reset(struct ufs_hba *hba)
196+
{
197+
struct ufs_rockchip_host *host = dev_get_priv(hba->dev);
198+
199+
if (!dm_gpio_is_valid(&host->device_reset))
200+
return 0;
201+
202+
dm_gpio_set_value(&host->device_reset, true);
203+
udelay(20);
204+
205+
dm_gpio_set_value(&host->device_reset, false);
206+
udelay(20);
207+
208+
return 0;
209+
}
210+
161211
static int ufs_rockchip_rk3576_init(struct ufs_hba *hba)
162212
{
163213
int ret = 0;
@@ -175,6 +225,7 @@ static struct ufs_hba_ops ufs_hba_rk3576_vops = {
175225
.init = ufs_rockchip_rk3576_init,
176226
.phy_initialization = ufs_rockchip_rk3576_phy_init,
177227
.hce_enable_notify = ufs_rockchip_hce_enable_notify,
228+
.device_reset = ufs_rockchip_device_reset,
178229
};
179230

180231
static const struct udevice_id ufs_rockchip_of_match[] = {

drivers/ufs/ufs-rockchip.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ struct ufs_rockchip_host {
7272
void __iomem *ufs_sys_ctrl;
7373
void __iomem *mphy_base;
7474
struct reset_ctl_bulk rsts;
75+
struct gpio_desc device_reset;
7576
struct clk ref_out_clk;
77+
struct clk_bulk clks;
7678
uint64_t caps;
7779
uint32_t phy_config_mode;
7880
};

0 commit comments

Comments
 (0)