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 gsi; 30 struct intel_mid_wdt_pdata *pdata = pdev->dev.platform_data; 31 32 if (!pdata) 33 return -EINVAL; 34 35 /* IOAPIC builds identity mapping between GSI and IRQ on MID */ 36 gsi = pdata->irq; 37 if (mp_set_gsi_attr(gsi, 1, 0, cpu_to_node(0)) || 38 mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC) <= 0) { 39 dev_warn(&pdev->dev, "cannot find interrupt %d in ioapic\n", 40 gsi); 41 return -EINVAL; 42 } 43 44 return 0; 45} 46 47static struct intel_mid_wdt_pdata tangier_pdata = { 48 .irq = TANGIER_EXT_TIMER0_MSI, 49 .probe = tangier_probe, 50}; 51 52static int __init register_mid_wdt(void) 53{ 54 if (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_TANGIER) { 55 wdt_dev.dev.platform_data = &tangier_pdata; 56 return platform_device_register(&wdt_dev); 57 } 58 59 return -ENODEV; 60} 61 62rootfs_initcall(register_mid_wdt); 63