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>
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+
2230static 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+
161211static 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
180231static const struct udevice_id ufs_rockchip_of_match [] = {
0 commit comments