linux/arch/x86/platform/intel-mid/device_libs/platform_wdt.c
<<
>>
Prefs
   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