Skip to content

Commit 30500c2

Browse files
Gabriel-Fernandzbebarino
authored andcommitted
clk: stm32mp1: use stm32mp13 reset driver
STM32MP15 is now using the same reset driver as STM32MP13 as they have the same binding requirement. Signed-off-by: Gabriel Fernandez <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Stephen Boyd <[email protected]>
1 parent 3ac7ca5 commit 30500c2

File tree

7 files changed

+42
-128
lines changed

7 files changed

+42
-128
lines changed

drivers/clk/stm32/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
obj-$(CONFIG_COMMON_CLK_STM32MP135) += clk-stm32mp13.o clk-stm32-core.o reset-stm32.o
2-
obj-$(CONFIG_COMMON_CLK_STM32MP157) += clk-stm32mp1.o
2+
obj-$(CONFIG_COMMON_CLK_STM32MP157) += clk-stm32mp1.o reset-stm32.o

drivers/clk/stm32/clk-stm32-core.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ static int stm32_rcc_clock_init(struct device *dev,
7070
int stm32_rcc_init(struct device *dev, const struct of_device_id *match_data,
7171
void __iomem *base)
7272
{
73+
const struct stm32_rcc_match_data *rcc_match_data;
7374
const struct of_device_id *match;
7475
int err;
7576

@@ -79,8 +80,10 @@ int stm32_rcc_init(struct device *dev, const struct of_device_id *match_data,
7980
return -ENODEV;
8081
}
8182

83+
rcc_match_data = match->data;
84+
8285
/* RCC Reset Configuration */
83-
err = stm32_rcc_reset_init(dev, match, base);
86+
err = stm32_rcc_reset_init(dev, rcc_match_data->reset_data, base);
8487
if (err) {
8588
pr_err("stm32 reset failed to initialize\n");
8689
return err;

drivers/clk/stm32/clk-stm32-core.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,12 @@ struct stm32_rcc_match_data {
7070
const struct clock_config *tab_clocks;
7171
unsigned int maxbinding;
7272
struct clk_stm32_clock_data *clock_data;
73-
u32 clear_offset;
73+
struct clk_stm32_reset_data *reset_data;
7474
int (*check_security)(void __iomem *base,
7575
const struct clock_config *cfg);
7676
int (*multi_mux)(void __iomem *base, const struct clock_config *cfg);
7777
};
7878

79-
int stm32_rcc_reset_init(struct device *dev, const struct of_device_id *match,
80-
void __iomem *base);
81-
8279
int stm32_rcc_init(struct device *dev, const struct of_device_id *match_data,
8380
void __iomem *base);
8481

drivers/clk/stm32/clk-stm32mp1.c

Lines changed: 16 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
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+
2327
static 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+
21442153
static 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

21512160
static 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-
23032205
static 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,
23422244
static 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;

drivers/clk/stm32/clk-stm32mp13.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
#include <linux/platform_device.h>
1111
#include <dt-bindings/clock/stm32mp13-clks.h>
1212
#include "clk-stm32-core.h"
13+
#include "reset-stm32.h"
1314
#include "stm32mp13_rcc.h"
1415

16+
#define STM32MP1_RESET_ID_MASK GENMASK(15, 0)
1517
#define RCC_CLR_OFFSET 0x4
1618

1719
/* STM32 Gates definition */
@@ -1511,13 +1513,18 @@ static struct clk_stm32_clock_data stm32mp13_clock_data = {
15111513
.is_multi_mux = stm32mp13_is_multi_mux,
15121514
};
15131515

1516+
static struct clk_stm32_reset_data stm32mp13_reset_data = {
1517+
.nr_lines = STM32MP1_RESET_ID_MASK,
1518+
.clear_offset = RCC_CLR_OFFSET,
1519+
};
1520+
15141521
static const struct stm32_rcc_match_data stm32mp13_data = {
15151522
.tab_clocks = stm32mp13_clock_cfg,
15161523
.num_clocks = ARRAY_SIZE(stm32mp13_clock_cfg),
15171524
.clock_data = &stm32mp13_clock_data,
15181525
.check_security = &stm32mp13_clock_is_provided_by_secure,
15191526
.maxbinding = STM32MP1_LAST_CLK,
1520-
.clear_offset = RCC_CLR_OFFSET,
1527+
.reset_data = &stm32mp13_reset_data,
15211528
};
15221529

15231530
static const struct of_device_id stm32mp13_match_data[] = {

drivers/clk/stm32/reset-stm32.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111
#include <linux/slab.h>
1212
#include <linux/spinlock.h>
1313

14-
#include "clk-stm32-core.h"
15-
16-
#define STM32_RESET_ID_MASK GENMASK(15, 0)
14+
#include "reset-stm32.h"
1715

1816
struct stm32_reset_data {
1917
/* reset lock */
@@ -99,24 +97,22 @@ static const struct reset_control_ops stm32_reset_ops = {
9997
.status = stm32_reset_status,
10098
};
10199

102-
int stm32_rcc_reset_init(struct device *dev, const struct of_device_id *match,
100+
int stm32_rcc_reset_init(struct device *dev, struct clk_stm32_reset_data *data,
103101
void __iomem *base)
104102
{
105-
const struct stm32_rcc_match_data *data = match->data;
106-
struct stm32_reset_data *reset_data = NULL;
107-
108-
data = match->data;
103+
struct stm32_reset_data *reset_data;
109104

110105
reset_data = kzalloc(sizeof(*reset_data), GFP_KERNEL);
111106
if (!reset_data)
112107
return -ENOMEM;
113108

114109
spin_lock_init(&reset_data->lock);
110+
115111
reset_data->membase = base;
116112
reset_data->rcdev.owner = THIS_MODULE;
117113
reset_data->rcdev.ops = &stm32_reset_ops;
118114
reset_data->rcdev.of_node = dev_of_node(dev);
119-
reset_data->rcdev.nr_resets = STM32_RESET_ID_MASK;
115+
reset_data->rcdev.nr_resets = data->nr_lines;
120116
reset_data->clear_offset = data->clear_offset;
121117

122118
return reset_controller_register(&reset_data->rcdev);

drivers/clk/stm32/reset-stm32.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,11 @@
44
* Author: Gabriel Fernandez <[email protected]> for STMicroelectronics.
55
*/
66

7-
int stm32_rcc_reset_init(struct device *dev, const struct of_device_id *match,
7+
struct clk_stm32_reset_data {
8+
const struct reset_control_ops *ops;
9+
unsigned int nr_lines;
10+
u32 clear_offset;
11+
};
12+
13+
int stm32_rcc_reset_init(struct device *dev, struct clk_stm32_reset_data *data,
814
void __iomem *base);

0 commit comments

Comments
 (0)