~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise-security

« back to all changes in this revision

Viewing changes to drivers/watchdog/pc87413_wdt.c

  • Committer: Package Import Robot
  • Author(s): Paolo Pisati, Paolo Pisati
  • Date: 2011-12-06 15:56:07 UTC
  • Revision ID: package-import@ubuntu.com-20111206155607-pcf44kv5fmhk564f
Tags: 3.2.0-1401.1
[ Paolo Pisati ]

* Rebased on top of Ubuntu-3.2.0-3.8
* Tilt-tracking @ ef2487af4bb15bdd0689631774b5a5e3a59f74e2
* Delete debian.ti-omap4/control, it shoudln't be tracked
* Fix architecture spelling (s/armel/armhf/)
* [Config] Update configs following 3.2 import
* [Config] Fix compilation: disable CODA and ARCH_OMAP3
* [Config] Fix compilation: disable Ethernet Faraday
* Update series to precise

Show diffs side-by-side

added added

removed removed

Lines of Context:
56
56
#define IO_DEFAULT      0x2E            /* Address used on Portwell Boards */
57
57
 
58
58
static int io = IO_DEFAULT;
 
59
static int swc_base_addr = -1;
59
60
 
60
61
static int timeout = DEFAULT_TIMEOUT;   /* timeout value */
61
62
static unsigned long timer_enabled;     /* is the timer enabled? */
116
117
 
117
118
/* Read SWC I/O base address */
118
119
 
119
 
static inline unsigned int pc87413_get_swc_base(void)
 
120
static void pc87413_get_swc_base_addr(void)
120
121
{
121
 
        unsigned int  swc_base_addr = 0;
122
122
        unsigned char addr_l, addr_h = 0;
123
123
 
124
124
        /* Step 3: Read SWC I/O Base Address */
136
136
                "Read SWC I/O Base Address: low %d, high %d, res %d\n",
137
137
                                                addr_l, addr_h, swc_base_addr);
138
138
#endif
139
 
        return swc_base_addr;
140
139
}
141
140
 
142
141
/* Select Bank 3 of SWC */
143
142
 
144
 
static inline void pc87413_swc_bank3(unsigned int swc_base_addr)
 
143
static inline void pc87413_swc_bank3(void)
145
144
{
146
145
        /* Step 4: Select Bank3 of SWC */
147
146
        outb_p(inb(swc_base_addr + 0x0f) | 0x03, swc_base_addr + 0x0f);
152
151
 
153
152
/* Set watchdog timeout to x minutes */
154
153
 
155
 
static inline void pc87413_programm_wdto(unsigned int swc_base_addr,
156
 
                                         char pc87413_time)
 
154
static inline void pc87413_programm_wdto(char pc87413_time)
157
155
{
158
156
        /* Step 5: Programm WDTO, Twd. */
159
157
        outb_p(pc87413_time, swc_base_addr + WDTO);
164
162
 
165
163
/* Enable WDEN */
166
164
 
167
 
static inline void pc87413_enable_wden(unsigned int swc_base_addr)
 
165
static inline void pc87413_enable_wden(void)
168
166
{
169
167
        /* Step 6: Enable WDEN */
170
168
        outb_p(inb(swc_base_addr + WDCTL) | 0x01, swc_base_addr + WDCTL);
174
172
}
175
173
 
176
174
/* Enable SW_WD_TREN */
177
 
static inline void pc87413_enable_sw_wd_tren(unsigned int swc_base_addr)
 
175
static inline void pc87413_enable_sw_wd_tren(void)
178
176
{
179
177
        /* Enable SW_WD_TREN */
180
178
        outb_p(inb(swc_base_addr + WDCFG) | 0x80, swc_base_addr + WDCFG);
185
183
 
186
184
/* Disable SW_WD_TREN */
187
185
 
188
 
static inline void pc87413_disable_sw_wd_tren(unsigned int swc_base_addr)
 
186
static inline void pc87413_disable_sw_wd_tren(void)
189
187
{
190
188
        /* Disable SW_WD_TREN */
191
189
        outb_p(inb(swc_base_addr + WDCFG) & 0x7f, swc_base_addr + WDCFG);
196
194
 
197
195
/* Enable SW_WD_TRG */
198
196
 
199
 
static inline void pc87413_enable_sw_wd_trg(unsigned int swc_base_addr)
 
197
static inline void pc87413_enable_sw_wd_trg(void)
200
198
{
201
199
        /* Enable SW_WD_TRG */
202
200
        outb_p(inb(swc_base_addr + WDCTL) | 0x80, swc_base_addr + WDCTL);
207
205
 
208
206
/* Disable SW_WD_TRG */
209
207
 
210
 
static inline void pc87413_disable_sw_wd_trg(unsigned int swc_base_addr)
 
208
static inline void pc87413_disable_sw_wd_trg(void)
211
209
{
212
210
        /* Disable SW_WD_TRG */
213
211
        outb_p(inb(swc_base_addr + WDCTL) & 0x7f, swc_base_addr + WDCTL);
222
220
 
223
221
static void pc87413_enable(void)
224
222
{
225
 
        unsigned int swc_base_addr;
226
 
 
227
223
        spin_lock(&io_lock);
228
224
 
229
 
        pc87413_select_wdt_out();
230
 
        pc87413_enable_swc();
231
 
        swc_base_addr = pc87413_get_swc_base();
232
 
        pc87413_swc_bank3(swc_base_addr);
233
 
        pc87413_programm_wdto(swc_base_addr, timeout);
234
 
        pc87413_enable_wden(swc_base_addr);
235
 
        pc87413_enable_sw_wd_tren(swc_base_addr);
236
 
        pc87413_enable_sw_wd_trg(swc_base_addr);
 
225
        pc87413_swc_bank3();
 
226
        pc87413_programm_wdto(timeout);
 
227
        pc87413_enable_wden();
 
228
        pc87413_enable_sw_wd_tren();
 
229
        pc87413_enable_sw_wd_trg();
237
230
 
238
231
        spin_unlock(&io_lock);
239
232
}
242
235
 
243
236
static void pc87413_disable(void)
244
237
{
245
 
        unsigned int swc_base_addr;
246
 
 
247
238
        spin_lock(&io_lock);
248
239
 
249
 
        pc87413_select_wdt_out();
250
 
        pc87413_enable_swc();
251
 
        swc_base_addr = pc87413_get_swc_base();
252
 
        pc87413_swc_bank3(swc_base_addr);
253
 
        pc87413_disable_sw_wd_tren(swc_base_addr);
254
 
        pc87413_disable_sw_wd_trg(swc_base_addr);
255
 
        pc87413_programm_wdto(swc_base_addr, 0);
 
240
        pc87413_swc_bank3();
 
241
        pc87413_disable_sw_wd_tren();
 
242
        pc87413_disable_sw_wd_trg();
 
243
        pc87413_programm_wdto(0);
256
244
 
257
245
        spin_unlock(&io_lock);
258
246
}
261
249
 
262
250
static void pc87413_refresh(void)
263
251
{
264
 
        unsigned int swc_base_addr;
265
 
 
266
252
        spin_lock(&io_lock);
267
253
 
268
 
        pc87413_select_wdt_out();
269
 
        pc87413_enable_swc();
270
 
        swc_base_addr = pc87413_get_swc_base();
271
 
        pc87413_swc_bank3(swc_base_addr);
272
 
        pc87413_disable_sw_wd_tren(swc_base_addr);
273
 
        pc87413_disable_sw_wd_trg(swc_base_addr);
274
 
        pc87413_programm_wdto(swc_base_addr, timeout);
275
 
        pc87413_enable_wden(swc_base_addr);
276
 
        pc87413_enable_sw_wd_tren(swc_base_addr);
277
 
        pc87413_enable_sw_wd_trg(swc_base_addr);
 
254
        pc87413_swc_bank3();
 
255
        pc87413_disable_sw_wd_tren();
 
256
        pc87413_disable_sw_wd_trg();
 
257
        pc87413_programm_wdto(timeout);
 
258
        pc87413_enable_wden();
 
259
        pc87413_enable_sw_wd_tren();
 
260
        pc87413_enable_sw_wd_trg();
278
261
 
279
262
        spin_unlock(&io_lock);
280
263
}
528
511
        printk(KERN_INFO PFX "Version " VERSION " at io 0x%X\n",
529
512
                                                        WDT_INDEX_IO_PORT);
530
513
 
531
 
        /* request_region(io, 2, "pc87413"); */
 
514
        if (!request_muxed_region(io, 2, MODNAME))
 
515
                return -EBUSY;
532
516
 
533
517
        ret = register_reboot_notifier(&pc87413_notifier);
534
518
        if (ret != 0) {
541
525
                printk(KERN_ERR PFX
542
526
                        "cannot register miscdev on minor=%d (err=%d)\n",
543
527
                        WATCHDOG_MINOR, ret);
544
 
                unregister_reboot_notifier(&pc87413_notifier);
545
 
                return ret;
 
528
                goto reboot_unreg;
546
529
        }
547
530
        printk(KERN_INFO PFX "initialized. timeout=%d min \n", timeout);
 
531
 
 
532
        pc87413_select_wdt_out();
 
533
        pc87413_enable_swc();
 
534
        pc87413_get_swc_base_addr();
 
535
 
 
536
        if (!request_region(swc_base_addr, 0x20, MODNAME)) {
 
537
                printk(KERN_ERR PFX
 
538
                        "cannot request SWC region at 0x%x\n", swc_base_addr);
 
539
                ret = -EBUSY;
 
540
                goto misc_unreg;
 
541
        }
 
542
 
548
543
        pc87413_enable();
 
544
 
 
545
        release_region(io, 2);
549
546
        return 0;
 
547
 
 
548
misc_unreg:
 
549
        misc_deregister(&pc87413_miscdev);
 
550
reboot_unreg:
 
551
        unregister_reboot_notifier(&pc87413_notifier);
 
552
        release_region(io, 2);
 
553
        return ret;
550
554
}
551
555
 
552
556
/**
569
573
 
570
574
        misc_deregister(&pc87413_miscdev);
571
575
        unregister_reboot_notifier(&pc87413_notifier);
572
 
        /* release_region(io, 2); */
 
576
        release_region(swc_base_addr, 0x20);
573
577
 
574
578
        printk(KERN_INFO MODNAME " watchdog component driver removed.\n");
575
579
}