Lines Matching full:p

70 #define TCOBASE(p)	((p)->tco_res->start)  argument
72 #define SMI_EN(p) ((p)->smi_res->start) argument
74 #define TCO_RLD(p) (TCOBASE(p) + 0x00) /* TCO Timer Reload/Curr. Value */ argument
75 #define TCOv1_TMR(p) (TCOBASE(p) + 0x01) /* TCOv1 Timer Initial Value*/ argument
76 #define TCO_DAT_IN(p) (TCOBASE(p) + 0x02) /* TCO Data In Register */ argument
77 #define TCO_DAT_OUT(p) (TCOBASE(p) + 0x03) /* TCO Data Out Register */ argument
78 #define TCO1_STS(p) (TCOBASE(p) + 0x04) /* TCO1 Status Register */ argument
79 #define TCO2_STS(p) (TCOBASE(p) + 0x06) /* TCO2 Status Register */ argument
80 #define TCO1_CNT(p) (TCOBASE(p) + 0x08) /* TCO1 Control Register */ argument
81 #define TCO2_CNT(p) (TCOBASE(p) + 0x0a) /* TCO2 Control Register */ argument
82 #define TCOv2_TMR(p) (TCOBASE(p) + 0x12) /* TCOv2 Timer Initial Value*/ argument
111 int (*update_no_reboot_bit)(void *p, bool set);
142 static inline unsigned int seconds_to_ticks(struct iTCO_wdt_private *p, in seconds_to_ticks() argument
145 return p->iTCO_version == 3 ? secs : (secs * 10) / 6; in seconds_to_ticks()
148 static inline unsigned int ticks_to_seconds(struct iTCO_wdt_private *p, in ticks_to_seconds() argument
151 return p->iTCO_version == 3 ? ticks : (ticks * 6) / 10; in ticks_to_seconds()
154 static inline u32 no_reboot_bit(struct iTCO_wdt_private *p) in no_reboot_bit() argument
158 switch (p->iTCO_version) { in no_reboot_bit()
183 struct iTCO_wdt_private *p = priv; in update_no_reboot_bit_pci() local
186 pci_read_config_dword(p->pci_dev, 0xd4, &val32); in update_no_reboot_bit_pci()
188 val32 |= no_reboot_bit(p); in update_no_reboot_bit_pci()
190 val32 &= ~no_reboot_bit(p); in update_no_reboot_bit_pci()
191 pci_write_config_dword(p->pci_dev, 0xd4, val32); in update_no_reboot_bit_pci()
192 pci_read_config_dword(p->pci_dev, 0xd4, &newval32); in update_no_reboot_bit_pci()
203 struct iTCO_wdt_private *p = priv; in update_no_reboot_bit_mem() local
206 val32 = readl(p->gcs_pmc); in update_no_reboot_bit_mem()
208 val32 |= no_reboot_bit(p); in update_no_reboot_bit_mem()
210 val32 &= ~no_reboot_bit(p); in update_no_reboot_bit_mem()
211 writel(val32, p->gcs_pmc); in update_no_reboot_bit_mem()
212 newval32 = readl(p->gcs_pmc); in update_no_reboot_bit_mem()
223 struct iTCO_wdt_private *p = priv; in update_no_reboot_bit_cnt() local
236 val = inw(TCO1_CNT(p)) & ~NMI_NOW; in update_no_reboot_bit_cnt()
241 outw(val, TCO1_CNT(p)); in update_no_reboot_bit_cnt()
242 newval = inw(TCO1_CNT(p)) & ~NMI_NOW; in update_no_reboot_bit_cnt()
257 static void iTCO_wdt_no_reboot_bit_setup(struct iTCO_wdt_private *p, in iTCO_wdt_no_reboot_bit_setup() argument
264 p->update_no_reboot_bit = update_no_reboot_bit_pmc; in iTCO_wdt_no_reboot_bit_setup()
265 p->no_reboot_priv = pmc; in iTCO_wdt_no_reboot_bit_setup()
269 if (p->iTCO_version >= 6) in iTCO_wdt_no_reboot_bit_setup()
270 p->update_no_reboot_bit = update_no_reboot_bit_cnt; in iTCO_wdt_no_reboot_bit_setup()
271 else if (p->iTCO_version >= 2) in iTCO_wdt_no_reboot_bit_setup()
272 p->update_no_reboot_bit = update_no_reboot_bit_mem; in iTCO_wdt_no_reboot_bit_setup()
273 else if (p->iTCO_version == 1) in iTCO_wdt_no_reboot_bit_setup()
274 p->update_no_reboot_bit = update_no_reboot_bit_pci; in iTCO_wdt_no_reboot_bit_setup()
276 p->update_no_reboot_bit = update_no_reboot_bit_def; in iTCO_wdt_no_reboot_bit_setup()
278 p->no_reboot_priv = p; in iTCO_wdt_no_reboot_bit_setup()
283 struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev); in iTCO_wdt_start() local
286 iTCO_vendor_pre_start(p->smi_res, wd_dev->timeout); in iTCO_wdt_start()
289 if (p->update_no_reboot_bit(p->no_reboot_priv, false)) { in iTCO_wdt_start()
296 if (p->iTCO_version >= 2) in iTCO_wdt_start()
297 outw(0x01, TCO_RLD(p)); in iTCO_wdt_start()
298 else if (p->iTCO_version == 1) in iTCO_wdt_start()
299 outb(0x01, TCO_RLD(p)); in iTCO_wdt_start()
302 val = inw(TCO1_CNT(p)); in iTCO_wdt_start()
304 outw(val, TCO1_CNT(p)); in iTCO_wdt_start()
305 val = inw(TCO1_CNT(p)); in iTCO_wdt_start()
314 struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev); in iTCO_wdt_stop() local
317 iTCO_vendor_pre_stop(p->smi_res); in iTCO_wdt_stop()
320 val = inw(TCO1_CNT(p)); in iTCO_wdt_stop()
322 outw(val, TCO1_CNT(p)); in iTCO_wdt_stop()
323 val = inw(TCO1_CNT(p)); in iTCO_wdt_stop()
326 p->update_no_reboot_bit(p->no_reboot_priv, true); in iTCO_wdt_stop()
335 struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev); in iTCO_wdt_ping() local
338 if (p->iTCO_version >= 2) { in iTCO_wdt_ping()
339 outw(0x01, TCO_RLD(p)); in iTCO_wdt_ping()
340 } else if (p->iTCO_version == 1) { in iTCO_wdt_ping()
343 outw(0x0008, TCO1_STS(p)); /* write 1 to clear bit */ in iTCO_wdt_ping()
345 outb(0x01, TCO_RLD(p)); in iTCO_wdt_ping()
353 struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev); in iTCO_wdt_set_timeout() local
358 tmrval = seconds_to_ticks(p, t); in iTCO_wdt_set_timeout()
361 if (p->iTCO_version == 1) in iTCO_wdt_set_timeout()
368 if ((p->iTCO_version >= 2 && tmrval > 0x3ff) || in iTCO_wdt_set_timeout()
369 (p->iTCO_version == 1 && tmrval > 0x03f)) in iTCO_wdt_set_timeout()
373 if (p->iTCO_version >= 2) { in iTCO_wdt_set_timeout()
374 val16 = inw(TCOv2_TMR(p)); in iTCO_wdt_set_timeout()
377 outw(val16, TCOv2_TMR(p)); in iTCO_wdt_set_timeout()
378 val16 = inw(TCOv2_TMR(p)); in iTCO_wdt_set_timeout()
382 } else if (p->iTCO_version == 1) { in iTCO_wdt_set_timeout()
383 val8 = inb(TCOv1_TMR(p)); in iTCO_wdt_set_timeout()
386 outb(val8, TCOv1_TMR(p)); in iTCO_wdt_set_timeout()
387 val8 = inb(TCOv1_TMR(p)); in iTCO_wdt_set_timeout()
399 struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev); in iTCO_wdt_get_timeleft() local
405 if (p->iTCO_version >= 2) { in iTCO_wdt_get_timeleft()
406 val16 = inw(TCO_RLD(p)); in iTCO_wdt_get_timeleft()
409 time_left = ticks_to_seconds(p, val16); in iTCO_wdt_get_timeleft()
410 } else if (p->iTCO_version == 1) { in iTCO_wdt_get_timeleft()
411 val8 = inb(TCO_RLD(p)); in iTCO_wdt_get_timeleft()
413 if (!(inw(TCO1_STS(p)) & 0x0008)) in iTCO_wdt_get_timeleft()
414 val8 += (inb(TCOv1_TMR(p)) & 0x3f); in iTCO_wdt_get_timeleft()
416 time_left = ticks_to_seconds(p, val8); in iTCO_wdt_get_timeleft()
422 static bool iTCO_wdt_set_running(struct iTCO_wdt_private *p) in iTCO_wdt_set_running() argument
427 val = inw(TCO1_CNT(p)); in iTCO_wdt_set_running()
429 set_bit(WDOG_HW_RUNNING, &p->wddev.status); in iTCO_wdt_set_running()
463 struct iTCO_wdt_private *p; in iTCO_wdt_probe() local
470 p = devm_kzalloc(dev, sizeof(*p), GFP_KERNEL); in iTCO_wdt_probe()
471 if (!p) in iTCO_wdt_probe()
474 p->tco_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_TCO); in iTCO_wdt_probe()
475 if (!p->tco_res) in iTCO_wdt_probe()
478 p->iTCO_version = pdata->version; in iTCO_wdt_probe()
479 p->pci_dev = to_pci_dev(dev->parent); in iTCO_wdt_probe()
481 p->smi_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_SMI); in iTCO_wdt_probe()
482 if (p->smi_res) { in iTCO_wdt_probe()
484 if (!devm_request_region(dev, p->smi_res->start, in iTCO_wdt_probe()
485 resource_size(p->smi_res), in iTCO_wdt_probe()
488 (u64)SMI_EN(p)); in iTCO_wdt_probe()
492 turn_SMI_watchdog_clear_off >= p->iTCO_version) { in iTCO_wdt_probe()
497 iTCO_wdt_no_reboot_bit_setup(p, pdev, pdata); in iTCO_wdt_probe()
503 if (p->iTCO_version >= 2 && p->iTCO_version < 6 && in iTCO_wdt_probe()
505 p->gcs_pmc = devm_platform_ioremap_resource(pdev, ICH_RES_MEM_GCS_PMC); in iTCO_wdt_probe()
506 if (IS_ERR(p->gcs_pmc)) in iTCO_wdt_probe()
507 return PTR_ERR(p->gcs_pmc); in iTCO_wdt_probe()
511 if (p->update_no_reboot_bit(p->no_reboot_priv, false) && in iTCO_wdt_probe()
517 if (turn_SMI_watchdog_clear_off >= p->iTCO_version) { in iTCO_wdt_probe()
522 val32 = inl(SMI_EN(p)); in iTCO_wdt_probe()
524 outl(val32, SMI_EN(p)); in iTCO_wdt_probe()
527 if (!devm_request_region(dev, p->tco_res->start, in iTCO_wdt_probe()
528 resource_size(p->tco_res), in iTCO_wdt_probe()
531 (u64)TCOBASE(p)); in iTCO_wdt_probe()
536 pdata->name, pdata->version, (u64)TCOBASE(p)); in iTCO_wdt_probe()
539 switch (p->iTCO_version) { in iTCO_wdt_probe()
543 outw(0x0008, TCO1_STS(p)); /* Clear the Time Out Status bit */ in iTCO_wdt_probe()
544 outw(0x0002, TCO2_STS(p)); /* Clear SECOND_TO_STS bit */ in iTCO_wdt_probe()
547 outl(0x20008, TCO1_STS(p)); in iTCO_wdt_probe()
552 outw(0x0008, TCO1_STS(p)); /* Clear the Time Out Status bit */ in iTCO_wdt_probe()
553 outw(0x0002, TCO2_STS(p)); /* Clear SECOND_TO_STS bit */ in iTCO_wdt_probe()
554 outw(0x0004, TCO2_STS(p)); /* Clear BOOT_STS bit */ in iTCO_wdt_probe()
558 ident.firmware_version = p->iTCO_version; in iTCO_wdt_probe()
559 p->wddev.info = &ident; in iTCO_wdt_probe()
560 p->wddev.ops = &iTCO_wdt_ops; in iTCO_wdt_probe()
561 p->wddev.bootstatus = 0; in iTCO_wdt_probe()
562 p->wddev.timeout = WATCHDOG_TIMEOUT; in iTCO_wdt_probe()
563 watchdog_set_nowayout(&p->wddev, nowayout); in iTCO_wdt_probe()
564 p->wddev.parent = dev; in iTCO_wdt_probe()
566 watchdog_set_drvdata(&p->wddev, p); in iTCO_wdt_probe()
567 platform_set_drvdata(pdev, p); in iTCO_wdt_probe()
569 if (!iTCO_wdt_set_running(p)) { in iTCO_wdt_probe()
574 p->update_no_reboot_bit(p->no_reboot_priv, true); in iTCO_wdt_probe()
579 if (iTCO_wdt_set_timeout(&p->wddev, heartbeat)) { in iTCO_wdt_probe()
580 ret = iTCO_wdt_set_timeout(&p->wddev, WATCHDOG_TIMEOUT); in iTCO_wdt_probe()
590 watchdog_stop_on_reboot(&p->wddev); in iTCO_wdt_probe()
591 watchdog_stop_on_unregister(&p->wddev); in iTCO_wdt_probe()
592 ret = devm_watchdog_register_device(dev, &p->wddev); in iTCO_wdt_probe()
619 struct iTCO_wdt_private *p = dev_get_drvdata(dev); in iTCO_wdt_suspend_noirq() local
622 p->suspended = false; in iTCO_wdt_suspend_noirq()
623 if (watchdog_active(&p->wddev) && need_suspend()) { in iTCO_wdt_suspend_noirq()
624 ret = iTCO_wdt_stop(&p->wddev); in iTCO_wdt_suspend_noirq()
626 p->suspended = true; in iTCO_wdt_suspend_noirq()
633 struct iTCO_wdt_private *p = dev_get_drvdata(dev); in iTCO_wdt_resume_noirq() local
635 if (p->suspended) in iTCO_wdt_resume_noirq()
636 iTCO_wdt_start(&p->wddev); in iTCO_wdt_resume_noirq()