1/* 2 * platform_wdt.c: Watchdog platform library file 3 * 4 * (C) Copyright 2014 Intel Corporation 5 * Author: David Cohen <david.a.cohen@linux.intel.com> 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; version 2 10 * of the License. 11 */ 12 13#include <linux/init.h> 14#include <linux/interrupt.h> 15#include <linux/platform_device.h> 16#include <linux/platform_data/intel-mid_wdt.h> 17#include <asm/intel-mid.h> 18#include <asm/io_apic.h> 19 20#define TANGIER_EXT_TIMER0_MSI 15 21 22static struct platform_device wdt_dev = { 23 .name = "intel_mid_wdt", 24 .id = -1, 25}; 26 27static int tangier_probe(struct platform_device *pdev) 28{ 29 int ioapic; 30 int irq; 31 struct intel_mid_wdt_pdata *pdata = pdev->dev.platform_data; 32 struct io_apic_irq_attr irq_attr = { 0 }; 33 34 if (!pdata) 35 return -EINVAL; 36 37 irq = pdata->irq; 38 ioapic = mp_find_ioapic(irq); 39 if (ioapic >= 0) { 40 int ret; 41 irq_attr.ioapic = ioapic; 42 irq_attr.ioapic_pin = irq; 43 irq_attr.trigger = 1; 44 /* irq_attr.polarity = 0; -> Active high */ 45 ret = io_apic_set_pci_routing(NULL, irq, &irq_attr); 46 if (ret) 47 return ret; 48 } else { 49 dev_warn(&pdev->dev, "cannot find interrupt %d in ioapic\n", 50 irq); 51 return -EINVAL; 52 } 53 54 return 0; 55} 56 57static struct intel_mid_wdt_pdata tangier_pdata = { 58 .irq = TANGIER_EXT_TIMER0_MSI, 59 .probe = tangier_probe, 60}; 61 62static int __init register_mid_wdt(void) 63{ 64 if (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_TANGIER) { 65 wdt_dev.dev.platform_data = &tangier_pdata; 66 return platform_device_register(&wdt_dev); 67 } 68 69 return -ENODEV; 70} 71 72rootfs_initcall(register_mid_wdt); 73