diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/watchdog/wdrtas.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/watchdog/wdrtas.c b/drivers/watchdog/wdrtas.c index 5d3b1a8e28b0..a38fa4907c92 100644 --- a/drivers/watchdog/wdrtas.c +++ b/drivers/watchdog/wdrtas.c | |||
@@ -106,6 +106,8 @@ static int wdrtas_set_interval(int interval) | |||
106 | return result; | 106 | return result; |
107 | } | 107 | } |
108 | 108 | ||
109 | #define WDRTAS_SP_SPI_LEN 4 | ||
110 | |||
109 | /** | 111 | /** |
110 | * wdrtas_get_interval - returns the current watchdog interval | 112 | * wdrtas_get_interval - returns the current watchdog interval |
111 | * @fallback_value: value (in seconds) to use, if the RTAS call fails | 113 | * @fallback_value: value (in seconds) to use, if the RTAS call fails |
@@ -119,10 +121,17 @@ static int wdrtas_set_interval(int interval) | |||
119 | static int wdrtas_get_interval(int fallback_value) | 121 | static int wdrtas_get_interval(int fallback_value) |
120 | { | 122 | { |
121 | long result; | 123 | long result; |
122 | char value[4]; | 124 | char value[WDRTAS_SP_SPI_LEN]; |
123 | 125 | ||
126 | spin_lock(&rtas_data_buf_lock); | ||
127 | memset(rtas_data_buf, 0, WDRTAS_SP_SPI_LEN); | ||
124 | result = rtas_call(wdrtas_token_get_sp, 3, 1, NULL, | 128 | result = rtas_call(wdrtas_token_get_sp, 3, 1, NULL, |
125 | WDRTAS_SP_SPI, (void *)__pa(&value), 4); | 129 | WDRTAS_SP_SPI, __pa(rtas_data_buf), |
130 | WDRTAS_SP_SPI_LEN); | ||
131 | |||
132 | memcpy(value, rtas_data_buf, WDRTAS_SP_SPI_LEN); | ||
133 | spin_unlock(&rtas_data_buf_lock); | ||
134 | |||
126 | if (value[0] != 0 || value[1] != 2 || value[3] != 0 || result < 0) { | 135 | if (value[0] != 0 || value[1] != 2 || value[3] != 0 || result < 0) { |
127 | printk(KERN_WARNING "wdrtas: could not get sp_spi watchdog " | 136 | printk(KERN_WARNING "wdrtas: could not get sp_spi watchdog " |
128 | "timeout (%li). Continuing\n", result); | 137 | "timeout (%li). Continuing\n", result); |