1515
1616#include <dt-bindings/reset/starfive-jh7100.h>
1717
18+ #include "reset-starfive-jh7100.h"
19+
1820/* register offsets */
1921#define JH7100_RESET_ASSERT0 0x00
2022#define JH7100_RESET_ASSERT1 0x04
@@ -51,7 +53,9 @@ struct jh7100_reset {
5153 struct reset_controller_dev rcdev ;
5254 /* protect registers against concurrent read-modify-write */
5355 spinlock_t lock ;
54- void __iomem * base ;
56+ void __iomem * assert ;
57+ void __iomem * status ;
58+ const u32 * asserted ;
5559};
5660
5761static inline struct jh7100_reset *
@@ -66,9 +70,9 @@ static int jh7100_reset_update(struct reset_controller_dev *rcdev,
6670 struct jh7100_reset * data = jh7100_reset_from (rcdev );
6771 unsigned long offset = id / 32 ;
6872 u32 mask = BIT (id % 32 );
69- void __iomem * reg_assert = data -> base + JH7100_RESET_ASSERT0 + offset * sizeof (u32 );
70- void __iomem * reg_status = data -> base + JH7100_RESET_STATUS0 + offset * sizeof (u32 );
71- u32 done = jh7100_reset_asserted [offset ] & mask ;
73+ void __iomem * reg_assert = data -> assert + offset * sizeof (u32 );
74+ void __iomem * reg_status = data -> status + offset * sizeof (u32 );
75+ u32 done = data -> asserted [offset ] & mask ;
7276 u32 value ;
7377 unsigned long flags ;
7478 int ret ;
@@ -122,10 +126,10 @@ static int jh7100_reset_status(struct reset_controller_dev *rcdev,
122126 struct jh7100_reset * data = jh7100_reset_from (rcdev );
123127 unsigned long offset = id / 32 ;
124128 u32 mask = BIT (id % 32 );
125- void __iomem * reg_status = data -> base + JH7100_RESET_STATUS0 + offset * sizeof (u32 );
129+ void __iomem * reg_status = data -> status + offset * sizeof (u32 );
126130 u32 value = readl (reg_status );
127131
128- return !((value ^ jh7100_reset_asserted [offset ]) & mask );
132+ return !((value ^ data -> asserted [offset ]) & mask );
129133}
130134
131135static const struct reset_control_ops jh7100_reset_ops = {
@@ -135,27 +139,38 @@ static const struct reset_control_ops jh7100_reset_ops = {
135139 .status = jh7100_reset_status ,
136140};
137141
138- static int __init jh7100_reset_probe (struct platform_device * pdev )
142+ int reset_starfive_jh7100_generic_probe (struct platform_device * pdev , const u32 * asserted ,
143+ unsigned int status_offset , unsigned int nr_resets )
139144{
140145 struct jh7100_reset * data ;
141146
142147 data = devm_kzalloc (& pdev -> dev , sizeof (* data ), GFP_KERNEL );
143148 if (!data )
144149 return - ENOMEM ;
145150
146- data -> base = devm_platform_ioremap_resource (pdev , 0 );
147- if (IS_ERR (data -> base ))
148- return PTR_ERR (data -> base );
151+ data -> assert = devm_platform_ioremap_resource (pdev , 0 );
152+ if (IS_ERR (data -> assert ))
153+ return PTR_ERR (data -> assert );
149154
150155 data -> rcdev .ops = & jh7100_reset_ops ;
151156 data -> rcdev .owner = THIS_MODULE ;
152- data -> rcdev .nr_resets = JH7100_RSTN_END ;
157+ data -> rcdev .nr_resets = nr_resets ;
153158 data -> rcdev .dev = & pdev -> dev ;
154159 data -> rcdev .of_node = pdev -> dev .of_node ;
160+
155161 spin_lock_init (& data -> lock );
162+ data -> status = data -> assert + status_offset ;
163+ data -> asserted = asserted ;
156164
157165 return devm_reset_controller_register (& pdev -> dev , & data -> rcdev );
158166}
167+ EXPORT_SYMBOL_GPL (reset_starfive_jh7100_generic_probe );
168+
169+ static int __init jh7100_reset_probe (struct platform_device * pdev )
170+ {
171+ return reset_starfive_jh7100_generic_probe (pdev , jh7100_reset_asserted ,
172+ JH7100_RESET_STATUS0 , JH7100_RSTN_END );
173+ }
159174
160175static const struct of_device_id jh7100_reset_dt_ids [] = {
161176 { .compatible = "starfive,jh7100-reset" },
0 commit comments