2020
2121#include <dt-bindings/clock/stm32mp1-clks.h>
2222
23+ #include "reset-stm32.h"
24+
25+ #define STM32MP1_RESET_ID_MASK GENMASK(15, 0)
26+
2327static DEFINE_SPINLOCK (rlock );
2428
2529#define RCC_OCENSETR 0x0C
@@ -2137,22 +2141,27 @@ struct stm32_rcc_match_data {
21372141 const struct clock_config * cfg ;
21382142 unsigned int num ;
21392143 unsigned int maxbinding ;
2140- u32 clear_offset ;
2144+ struct clk_stm32_reset_data * reset_data ;
21412145 bool (* check_security )(const struct clock_config * cfg );
21422146};
21432147
2148+ static struct clk_stm32_reset_data stm32mp1_reset_data = {
2149+ .nr_lines = STM32MP1_RESET_ID_MASK ,
2150+ .clear_offset = RCC_CLR ,
2151+ };
2152+
21442153static struct stm32_rcc_match_data stm32mp1_data = {
21452154 .cfg = stm32mp1_clock_cfg ,
21462155 .num = ARRAY_SIZE (stm32mp1_clock_cfg ),
21472156 .maxbinding = STM32MP1_LAST_CLK ,
2148- .clear_offset = RCC_CLR ,
2157+ .reset_data = & stm32mp1_reset_data ,
21492158};
21502159
21512160static struct stm32_rcc_match_data stm32mp1_data_secure = {
21522161 .cfg = stm32mp1_clock_cfg ,
21532162 .num = ARRAY_SIZE (stm32mp1_clock_cfg ),
21542163 .maxbinding = STM32MP1_LAST_CLK ,
2155- .clear_offset = RCC_CLR ,
2164+ .reset_data = & stm32mp1_reset_data ,
21562165 .check_security = & stm32_check_security
21572166};
21582167
@@ -2193,113 +2202,6 @@ static int stm32_register_hw_clk(struct device *dev,
21932202 return 0 ;
21942203}
21952204
2196- #define STM32_RESET_ID_MASK GENMASK(15, 0)
2197-
2198- struct stm32_reset_data {
2199- /* reset lock */
2200- spinlock_t lock ;
2201- struct reset_controller_dev rcdev ;
2202- void __iomem * membase ;
2203- u32 clear_offset ;
2204- };
2205-
2206- static inline struct stm32_reset_data *
2207- to_stm32_reset_data (struct reset_controller_dev * rcdev )
2208- {
2209- return container_of (rcdev , struct stm32_reset_data , rcdev );
2210- }
2211-
2212- static int stm32_reset_update (struct reset_controller_dev * rcdev ,
2213- unsigned long id , bool assert )
2214- {
2215- struct stm32_reset_data * data = to_stm32_reset_data (rcdev );
2216- int reg_width = sizeof (u32 );
2217- int bank = id / (reg_width * BITS_PER_BYTE );
2218- int offset = id % (reg_width * BITS_PER_BYTE );
2219-
2220- if (data -> clear_offset ) {
2221- void __iomem * addr ;
2222-
2223- addr = data -> membase + (bank * reg_width );
2224- if (!assert )
2225- addr += data -> clear_offset ;
2226-
2227- writel (BIT (offset ), addr );
2228-
2229- } else {
2230- unsigned long flags ;
2231- u32 reg ;
2232-
2233- spin_lock_irqsave (& data -> lock , flags );
2234-
2235- reg = readl (data -> membase + (bank * reg_width ));
2236-
2237- if (assert )
2238- reg |= BIT (offset );
2239- else
2240- reg &= ~BIT (offset );
2241-
2242- writel (reg , data -> membase + (bank * reg_width ));
2243-
2244- spin_unlock_irqrestore (& data -> lock , flags );
2245- }
2246-
2247- return 0 ;
2248- }
2249-
2250- static int stm32_reset_assert (struct reset_controller_dev * rcdev ,
2251- unsigned long id )
2252- {
2253- return stm32_reset_update (rcdev , id , true);
2254- }
2255-
2256- static int stm32_reset_deassert (struct reset_controller_dev * rcdev ,
2257- unsigned long id )
2258- {
2259- return stm32_reset_update (rcdev , id , false);
2260- }
2261-
2262- static int stm32_reset_status (struct reset_controller_dev * rcdev ,
2263- unsigned long id )
2264- {
2265- struct stm32_reset_data * data = to_stm32_reset_data (rcdev );
2266- int reg_width = sizeof (u32 );
2267- int bank = id / (reg_width * BITS_PER_BYTE );
2268- int offset = id % (reg_width * BITS_PER_BYTE );
2269- u32 reg ;
2270-
2271- reg = readl (data -> membase + (bank * reg_width ));
2272-
2273- return !!(reg & BIT (offset ));
2274- }
2275-
2276- static const struct reset_control_ops stm32_reset_ops = {
2277- .assert = stm32_reset_assert ,
2278- .deassert = stm32_reset_deassert ,
2279- .status = stm32_reset_status ,
2280- };
2281-
2282- static int stm32_rcc_reset_init (struct device * dev , void __iomem * base ,
2283- const struct of_device_id * match )
2284- {
2285- const struct stm32_rcc_match_data * data = match -> data ;
2286- struct stm32_reset_data * reset_data = NULL ;
2287-
2288- reset_data = kzalloc (sizeof (* reset_data ), GFP_KERNEL );
2289- if (!reset_data )
2290- return - ENOMEM ;
2291-
2292- spin_lock_init (& reset_data -> lock );
2293- reset_data -> membase = base ;
2294- reset_data -> rcdev .owner = THIS_MODULE ;
2295- reset_data -> rcdev .ops = & stm32_reset_ops ;
2296- reset_data -> rcdev .of_node = dev_of_node (dev );
2297- reset_data -> rcdev .nr_resets = STM32_RESET_ID_MASK ;
2298- reset_data -> clear_offset = data -> clear_offset ;
2299-
2300- return reset_controller_register (& reset_data -> rcdev );
2301- }
2302-
23032205static int stm32_rcc_clock_init (struct device * dev , void __iomem * base ,
23042206 const struct of_device_id * match )
23052207{
@@ -2342,6 +2244,7 @@ static int stm32_rcc_clock_init(struct device *dev, void __iomem *base,
23422244static int stm32_rcc_init (struct device * dev , void __iomem * base ,
23432245 const struct of_device_id * match_data )
23442246{
2247+ const struct stm32_rcc_match_data * rcc_match_data ;
23452248 const struct of_device_id * match ;
23462249 int err ;
23472250
@@ -2351,8 +2254,10 @@ static int stm32_rcc_init(struct device *dev, void __iomem *base,
23512254 return - ENODEV ;
23522255 }
23532256
2257+ rcc_match_data = match -> data ;
2258+
23542259 /* RCC Reset Configuration */
2355- err = stm32_rcc_reset_init (dev , base , match );
2260+ err = stm32_rcc_reset_init (dev , rcc_match_data -> reset_data , base );
23562261 if (err ) {
23572262 pr_err ("stm32mp1 reset failed to initialize\n" );
23582263 return err ;
0 commit comments