Lines Matching full:p
71 #define TCOBASE(p) ((p)->tco_res->start) argument
73 #define SMI_EN(p) ((p)->smi_res->start) argument
75 #define TCO_RLD(p) (TCOBASE(p) + 0x00) /* TCO Timer Reload/Curr. Value */ argument
76 #define TCOv1_TMR(p) (TCOBASE(p) + 0x01) /* TCOv1 Timer Initial Value*/ argument
77 #define TCO_DAT_IN(p) (TCOBASE(p) + 0x02) /* TCO Data In Register */ argument
78 #define TCO_DAT_OUT(p) (TCOBASE(p) + 0x03) /* TCO Data Out Register */ argument
79 #define TCO1_STS(p) (TCOBASE(p) + 0x04) /* TCO1 Status Register */ argument
80 #define TCO2_STS(p) (TCOBASE(p) + 0x06) /* TCO2 Status Register */ argument
81 #define TCO1_CNT(p) (TCOBASE(p) + 0x08) /* TCO1 Control Register */ argument
82 #define TCO2_CNT(p) (TCOBASE(p) + 0x0a) /* TCO2 Control Register */ argument
83 #define TCOv2_TMR(p) (TCOBASE(p) + 0x12) /* TCOv2 Timer Initial Value*/ argument
114 int (*update_no_reboot_bit)(void *p, bool set);
145 static inline unsigned int seconds_to_ticks(struct iTCO_wdt_private *p, in seconds_to_ticks() argument
148 return p->iTCO_version == 3 ? secs : (secs * 10) / 6; in seconds_to_ticks()
151 static inline unsigned int ticks_to_seconds(struct iTCO_wdt_private *p, in ticks_to_seconds() argument
154 return p->iTCO_version == 3 ? ticks : (ticks * 6) / 10; in ticks_to_seconds()
157 static inline u32 no_reboot_bit(struct iTCO_wdt_private *p) in no_reboot_bit() argument
161 switch (p->iTCO_version) { in no_reboot_bit()
186 struct iTCO_wdt_private *p = priv; in update_no_reboot_bit_pci() local
189 pci_read_config_dword(p->pci_dev, 0xd4, &val32); in update_no_reboot_bit_pci()
191 val32 |= no_reboot_bit(p); in update_no_reboot_bit_pci()
193 val32 &= ~no_reboot_bit(p); in update_no_reboot_bit_pci()
194 pci_write_config_dword(p->pci_dev, 0xd4, val32); in update_no_reboot_bit_pci()
195 pci_read_config_dword(p->pci_dev, 0xd4, &newval32); in update_no_reboot_bit_pci()
206 struct iTCO_wdt_private *p = priv; in update_no_reboot_bit_mem() local
209 val32 = readl(p->gcs_pmc); in update_no_reboot_bit_mem()
211 val32 |= no_reboot_bit(p); in update_no_reboot_bit_mem()
213 val32 &= ~no_reboot_bit(p); in update_no_reboot_bit_mem()
214 writel(val32, p->gcs_pmc); in update_no_reboot_bit_mem()
215 newval32 = readl(p->gcs_pmc); in update_no_reboot_bit_mem()
226 struct iTCO_wdt_private *p = priv; in update_no_reboot_bit_cnt() local
239 val = inw(TCO1_CNT(p)) & ~NMI_NOW; in update_no_reboot_bit_cnt()
244 outw(val, TCO1_CNT(p)); in update_no_reboot_bit_cnt()
245 newval = inw(TCO1_CNT(p)) & ~NMI_NOW; in update_no_reboot_bit_cnt()
260 static void iTCO_wdt_no_reboot_bit_setup(struct iTCO_wdt_private *p, in iTCO_wdt_no_reboot_bit_setup() argument
267 p->update_no_reboot_bit = update_no_reboot_bit_pmc; in iTCO_wdt_no_reboot_bit_setup()
268 p->no_reboot_priv = pmc; in iTCO_wdt_no_reboot_bit_setup()
272 if (p->iTCO_version >= 6) in iTCO_wdt_no_reboot_bit_setup()
273 p->update_no_reboot_bit = update_no_reboot_bit_cnt; in iTCO_wdt_no_reboot_bit_setup()
274 else if (p->iTCO_version >= 2) in iTCO_wdt_no_reboot_bit_setup()
275 p->update_no_reboot_bit = update_no_reboot_bit_mem; in iTCO_wdt_no_reboot_bit_setup()
276 else if (p->iTCO_version == 1) in iTCO_wdt_no_reboot_bit_setup()
277 p->update_no_reboot_bit = update_no_reboot_bit_pci; in iTCO_wdt_no_reboot_bit_setup()
279 p->update_no_reboot_bit = update_no_reboot_bit_def; in iTCO_wdt_no_reboot_bit_setup()
281 p->no_reboot_priv = p; in iTCO_wdt_no_reboot_bit_setup()
286 struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev); in iTCO_wdt_start() local
289 spin_lock(&p->io_lock); in iTCO_wdt_start()
291 iTCO_vendor_pre_start(p->smi_res, wd_dev->timeout); in iTCO_wdt_start()
294 if (p->update_no_reboot_bit(p->no_reboot_priv, false)) { in iTCO_wdt_start()
295 spin_unlock(&p->io_lock); in iTCO_wdt_start()
302 if (p->iTCO_version >= 2) in iTCO_wdt_start()
303 outw(0x01, TCO_RLD(p)); in iTCO_wdt_start()
304 else if (p->iTCO_version == 1) in iTCO_wdt_start()
305 outb(0x01, TCO_RLD(p)); in iTCO_wdt_start()
308 val = inw(TCO1_CNT(p)); in iTCO_wdt_start()
310 outw(val, TCO1_CNT(p)); in iTCO_wdt_start()
311 val = inw(TCO1_CNT(p)); in iTCO_wdt_start()
312 spin_unlock(&p->io_lock); in iTCO_wdt_start()
321 struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev); in iTCO_wdt_stop() local
324 spin_lock(&p->io_lock); in iTCO_wdt_stop()
326 iTCO_vendor_pre_stop(p->smi_res); in iTCO_wdt_stop()
329 val = inw(TCO1_CNT(p)); in iTCO_wdt_stop()
331 outw(val, TCO1_CNT(p)); in iTCO_wdt_stop()
332 val = inw(TCO1_CNT(p)); in iTCO_wdt_stop()
335 p->update_no_reboot_bit(p->no_reboot_priv, true); in iTCO_wdt_stop()
337 spin_unlock(&p->io_lock); in iTCO_wdt_stop()
346 struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev); in iTCO_wdt_ping() local
348 spin_lock(&p->io_lock); in iTCO_wdt_ping()
351 if (p->iTCO_version >= 2) { in iTCO_wdt_ping()
352 outw(0x01, TCO_RLD(p)); in iTCO_wdt_ping()
353 } else if (p->iTCO_version == 1) { in iTCO_wdt_ping()
356 outw(0x0008, TCO1_STS(p)); /* write 1 to clear bit */ in iTCO_wdt_ping()
358 outb(0x01, TCO_RLD(p)); in iTCO_wdt_ping()
361 spin_unlock(&p->io_lock); in iTCO_wdt_ping()
367 struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev); in iTCO_wdt_set_timeout() local
372 tmrval = seconds_to_ticks(p, t); in iTCO_wdt_set_timeout()
375 if (p->iTCO_version == 1) in iTCO_wdt_set_timeout()
382 if ((p->iTCO_version >= 2 && tmrval > 0x3ff) || in iTCO_wdt_set_timeout()
383 (p->iTCO_version == 1 && tmrval > 0x03f)) in iTCO_wdt_set_timeout()
387 if (p->iTCO_version >= 2) { in iTCO_wdt_set_timeout()
388 spin_lock(&p->io_lock); in iTCO_wdt_set_timeout()
389 val16 = inw(TCOv2_TMR(p)); in iTCO_wdt_set_timeout()
392 outw(val16, TCOv2_TMR(p)); in iTCO_wdt_set_timeout()
393 val16 = inw(TCOv2_TMR(p)); in iTCO_wdt_set_timeout()
394 spin_unlock(&p->io_lock); in iTCO_wdt_set_timeout()
398 } else if (p->iTCO_version == 1) { in iTCO_wdt_set_timeout()
399 spin_lock(&p->io_lock); in iTCO_wdt_set_timeout()
400 val8 = inb(TCOv1_TMR(p)); in iTCO_wdt_set_timeout()
403 outb(val8, TCOv1_TMR(p)); in iTCO_wdt_set_timeout()
404 val8 = inb(TCOv1_TMR(p)); in iTCO_wdt_set_timeout()
405 spin_unlock(&p->io_lock); in iTCO_wdt_set_timeout()
417 struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev); in iTCO_wdt_get_timeleft() local
423 if (p->iTCO_version >= 2) { in iTCO_wdt_get_timeleft()
424 spin_lock(&p->io_lock); in iTCO_wdt_get_timeleft()
425 val16 = inw(TCO_RLD(p)); in iTCO_wdt_get_timeleft()
427 spin_unlock(&p->io_lock); in iTCO_wdt_get_timeleft()
429 time_left = ticks_to_seconds(p, val16); in iTCO_wdt_get_timeleft()
430 } else if (p->iTCO_version == 1) { in iTCO_wdt_get_timeleft()
431 spin_lock(&p->io_lock); in iTCO_wdt_get_timeleft()
432 val8 = inb(TCO_RLD(p)); in iTCO_wdt_get_timeleft()
434 if (!(inw(TCO1_STS(p)) & 0x0008)) in iTCO_wdt_get_timeleft()
435 val8 += (inb(TCOv1_TMR(p)) & 0x3f); in iTCO_wdt_get_timeleft()
436 spin_unlock(&p->io_lock); in iTCO_wdt_get_timeleft()
438 time_left = ticks_to_seconds(p, val8); in iTCO_wdt_get_timeleft()
444 static bool iTCO_wdt_set_running(struct iTCO_wdt_private *p) in iTCO_wdt_set_running() argument
449 val = inw(TCO1_CNT(p)); in iTCO_wdt_set_running()
451 set_bit(WDOG_HW_RUNNING, &p->wddev.status); in iTCO_wdt_set_running()
485 struct iTCO_wdt_private *p; in iTCO_wdt_probe() local
492 p = devm_kzalloc(dev, sizeof(*p), GFP_KERNEL); in iTCO_wdt_probe()
493 if (!p) in iTCO_wdt_probe()
496 spin_lock_init(&p->io_lock); in iTCO_wdt_probe()
498 p->tco_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_TCO); in iTCO_wdt_probe()
499 if (!p->tco_res) in iTCO_wdt_probe()
502 p->iTCO_version = pdata->version; in iTCO_wdt_probe()
503 p->pci_dev = to_pci_dev(dev->parent); in iTCO_wdt_probe()
505 p->smi_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_SMI); in iTCO_wdt_probe()
506 if (p->smi_res) { in iTCO_wdt_probe()
508 if (!devm_request_region(dev, p->smi_res->start, in iTCO_wdt_probe()
509 resource_size(p->smi_res), in iTCO_wdt_probe()
512 (u64)SMI_EN(p)); in iTCO_wdt_probe()
516 turn_SMI_watchdog_clear_off >= p->iTCO_version) { in iTCO_wdt_probe()
521 iTCO_wdt_no_reboot_bit_setup(p, pdev, pdata); in iTCO_wdt_probe()
527 if (p->iTCO_version >= 2 && p->iTCO_version < 6 && in iTCO_wdt_probe()
529 p->gcs_pmc = devm_platform_ioremap_resource(pdev, ICH_RES_MEM_GCS_PMC); in iTCO_wdt_probe()
530 if (IS_ERR(p->gcs_pmc)) in iTCO_wdt_probe()
531 return PTR_ERR(p->gcs_pmc); in iTCO_wdt_probe()
535 if (p->update_no_reboot_bit(p->no_reboot_priv, false) && in iTCO_wdt_probe()
541 if (turn_SMI_watchdog_clear_off >= p->iTCO_version) { in iTCO_wdt_probe()
546 val32 = inl(SMI_EN(p)); in iTCO_wdt_probe()
548 outl(val32, SMI_EN(p)); in iTCO_wdt_probe()
551 if (!devm_request_region(dev, p->tco_res->start, in iTCO_wdt_probe()
552 resource_size(p->tco_res), in iTCO_wdt_probe()
555 (u64)TCOBASE(p)); in iTCO_wdt_probe()
560 pdata->name, pdata->version, (u64)TCOBASE(p)); in iTCO_wdt_probe()
563 switch (p->iTCO_version) { in iTCO_wdt_probe()
567 outw(0x0008, TCO1_STS(p)); /* Clear the Time Out Status bit */ in iTCO_wdt_probe()
568 outw(0x0002, TCO2_STS(p)); /* Clear SECOND_TO_STS bit */ in iTCO_wdt_probe()
571 outl(0x20008, TCO1_STS(p)); in iTCO_wdt_probe()
576 outw(0x0008, TCO1_STS(p)); /* Clear the Time Out Status bit */ in iTCO_wdt_probe()
577 outw(0x0002, TCO2_STS(p)); /* Clear SECOND_TO_STS bit */ in iTCO_wdt_probe()
578 outw(0x0004, TCO2_STS(p)); /* Clear BOOT_STS bit */ in iTCO_wdt_probe()
582 ident.firmware_version = p->iTCO_version; in iTCO_wdt_probe()
583 p->wddev.info = &ident; in iTCO_wdt_probe()
584 p->wddev.ops = &iTCO_wdt_ops; in iTCO_wdt_probe()
585 p->wddev.bootstatus = 0; in iTCO_wdt_probe()
586 p->wddev.timeout = WATCHDOG_TIMEOUT; in iTCO_wdt_probe()
587 watchdog_set_nowayout(&p->wddev, nowayout); in iTCO_wdt_probe()
588 p->wddev.parent = dev; in iTCO_wdt_probe()
590 watchdog_set_drvdata(&p->wddev, p); in iTCO_wdt_probe()
591 platform_set_drvdata(pdev, p); in iTCO_wdt_probe()
593 if (!iTCO_wdt_set_running(p)) { in iTCO_wdt_probe()
598 p->update_no_reboot_bit(p->no_reboot_priv, true); in iTCO_wdt_probe()
603 if (iTCO_wdt_set_timeout(&p->wddev, heartbeat)) { in iTCO_wdt_probe()
604 iTCO_wdt_set_timeout(&p->wddev, WATCHDOG_TIMEOUT); in iTCO_wdt_probe()
609 watchdog_stop_on_reboot(&p->wddev); in iTCO_wdt_probe()
610 watchdog_stop_on_unregister(&p->wddev); in iTCO_wdt_probe()
611 ret = devm_watchdog_register_device(dev, &p->wddev); in iTCO_wdt_probe()
638 struct iTCO_wdt_private *p = dev_get_drvdata(dev); in iTCO_wdt_suspend_noirq() local
641 p->suspended = false; in iTCO_wdt_suspend_noirq()
642 if (watchdog_active(&p->wddev) && need_suspend()) { in iTCO_wdt_suspend_noirq()
643 ret = iTCO_wdt_stop(&p->wddev); in iTCO_wdt_suspend_noirq()
645 p->suspended = true; in iTCO_wdt_suspend_noirq()
652 struct iTCO_wdt_private *p = dev_get_drvdata(dev); in iTCO_wdt_resume_noirq() local
654 if (p->suspended) in iTCO_wdt_resume_noirq()
655 iTCO_wdt_start(&p->wddev); in iTCO_wdt_resume_noirq()