5
5
*/
6
6
7
7
#include <linux/mfd/ingenic-tcu.h>
8
+ #include <linux/mfd/syscon.h>
8
9
#include <linux/module.h>
9
10
#include <linux/moduleparam.h>
10
11
#include <linux/types.h>
17
18
#include <linux/slab.h>
18
19
#include <linux/err.h>
19
20
#include <linux/of.h>
21
+ #include <linux/regmap.h>
20
22
21
23
#define DEFAULT_HEARTBEAT 5
22
24
#define MAX_HEARTBEAT 2048
@@ -36,7 +38,7 @@ MODULE_PARM_DESC(heartbeat,
36
38
37
39
struct jz4740_wdt_drvdata {
38
40
struct watchdog_device wdt ;
39
- void __iomem * base ;
41
+ struct regmap * map ;
40
42
struct clk * clk ;
41
43
unsigned long clk_rate ;
42
44
};
@@ -45,7 +47,8 @@ static int jz4740_wdt_ping(struct watchdog_device *wdt_dev)
45
47
{
46
48
struct jz4740_wdt_drvdata * drvdata = watchdog_get_drvdata (wdt_dev );
47
49
48
- writew (0x0 , drvdata -> base + TCU_REG_WDT_TCNT );
50
+ regmap_write (drvdata -> map , TCU_REG_WDT_TCNT , 0 );
51
+
49
52
return 0 ;
50
53
}
51
54
@@ -54,16 +57,16 @@ static int jz4740_wdt_set_timeout(struct watchdog_device *wdt_dev,
54
57
{
55
58
struct jz4740_wdt_drvdata * drvdata = watchdog_get_drvdata (wdt_dev );
56
59
u16 timeout_value = (u16 )(drvdata -> clk_rate * new_timeout );
57
- u8 tcer ;
60
+ unsigned int tcer ;
58
61
59
- tcer = readb (drvdata -> base + TCU_REG_WDT_TCER );
60
- writeb ( 0x0 , drvdata -> base + TCU_REG_WDT_TCER );
62
+ regmap_read (drvdata -> map , TCU_REG_WDT_TCER , & tcer );
63
+ regmap_write ( drvdata -> map , TCU_REG_WDT_TCER , 0 );
61
64
62
- writew (( u16 ) timeout_value , drvdata -> base + TCU_REG_WDT_TDR );
63
- writew ( 0x0 , drvdata -> base + TCU_REG_WDT_TCNT );
65
+ regmap_write ( drvdata -> map , TCU_REG_WDT_TDR , timeout_value );
66
+ regmap_write ( drvdata -> map , TCU_REG_WDT_TCNT , 0 );
64
67
65
68
if (tcer & TCU_WDT_TCER_TCEN )
66
- writeb ( TCU_WDT_TCER_TCEN , drvdata -> base + TCU_REG_WDT_TCER );
69
+ regmap_write ( drvdata -> map , TCU_REG_WDT_TCER , TCU_WDT_TCER_TCEN );
67
70
68
71
wdt_dev -> timeout = new_timeout ;
69
72
return 0 ;
@@ -72,20 +75,20 @@ static int jz4740_wdt_set_timeout(struct watchdog_device *wdt_dev,
72
75
static int jz4740_wdt_start (struct watchdog_device * wdt_dev )
73
76
{
74
77
struct jz4740_wdt_drvdata * drvdata = watchdog_get_drvdata (wdt_dev );
78
+ unsigned int tcer ;
75
79
int ret ;
76
- u8 tcer ;
77
80
78
81
ret = clk_prepare_enable (drvdata -> clk );
79
82
if (ret )
80
83
return ret ;
81
84
82
- tcer = readb (drvdata -> base + TCU_REG_WDT_TCER );
85
+ regmap_read (drvdata -> map , TCU_REG_WDT_TCER , & tcer );
83
86
84
87
jz4740_wdt_set_timeout (wdt_dev , wdt_dev -> timeout );
85
88
86
89
/* Start watchdog if it wasn't started already */
87
90
if (!(tcer & TCU_WDT_TCER_TCEN ))
88
- writeb ( TCU_WDT_TCER_TCEN , drvdata -> base + TCU_REG_WDT_TCER );
91
+ regmap_write ( drvdata -> map , TCU_REG_WDT_TCER , TCU_WDT_TCER_TCEN );
89
92
90
93
return 0 ;
91
94
}
@@ -94,7 +97,7 @@ static int jz4740_wdt_stop(struct watchdog_device *wdt_dev)
94
97
{
95
98
struct jz4740_wdt_drvdata * drvdata = watchdog_get_drvdata (wdt_dev );
96
99
97
- writeb ( 0x0 , drvdata -> base + TCU_REG_WDT_TCER );
100
+ regmap_write ( drvdata -> map , TCU_REG_WDT_TCER , 0 );
98
101
clk_disable_unprepare (drvdata -> clk );
99
102
100
103
return 0 ;
@@ -172,9 +175,11 @@ static int jz4740_wdt_probe(struct platform_device *pdev)
172
175
watchdog_set_nowayout (jz4740_wdt , nowayout );
173
176
watchdog_set_drvdata (jz4740_wdt , drvdata );
174
177
175
- drvdata -> base = devm_platform_ioremap_resource (pdev , 0 );
176
- if (IS_ERR (drvdata -> base ))
177
- return PTR_ERR (drvdata -> base );
178
+ drvdata -> map = device_node_to_regmap (dev -> parent -> of_node );
179
+ if (!drvdata -> map ) {
180
+ dev_err (dev , "regmap not found\n" );
181
+ return - EINVAL ;
182
+ }
178
183
179
184
return devm_watchdog_register_device (dev , & drvdata -> wdt );
180
185
}
0 commit comments