linux/drivers/acpi/hed.c
<<
>>
Prefs
   1/*
   2 * ACPI Hardware Error Device (PNP0C33) Driver
   3 *
   4 * Copyright (C) 2010, Intel Corp.
   5 *      Author: Huang Ying <ying.huang@intel.com>
   6 *
   7 * ACPI Hardware Error Device is used to report some hardware errors
   8 * notified via SCI, mainly the corrected errors.
   9 *
  10 * This program is free software; you can redistribute it and/or
  11 * modify it under the terms of the GNU General Public License version
  12 * 2 as published by the Free Software Foundation;
  13 *
  14 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 */
  19
  20#include <linux/kernel.h>
  21#include <linux/module.h>
  22#include <linux/init.h>
  23#include <linux/acpi.h>
  24#include <acpi/hed.h>
  25
  26static const struct acpi_device_id acpi_hed_ids[] = {
  27        {"PNP0C33", 0},
  28        {"", 0},
  29};
  30MODULE_DEVICE_TABLE(acpi, acpi_hed_ids);
  31
  32static acpi_handle hed_handle;
  33
  34static BLOCKING_NOTIFIER_HEAD(acpi_hed_notify_list);
  35
  36int register_acpi_hed_notifier(struct notifier_block *nb)
  37{
  38        return blocking_notifier_chain_register(&acpi_hed_notify_list, nb);
  39}
  40EXPORT_SYMBOL_GPL(register_acpi_hed_notifier);
  41
  42void unregister_acpi_hed_notifier(struct notifier_block *nb)
  43{
  44        blocking_notifier_chain_unregister(&acpi_hed_notify_list, nb);
  45}
  46EXPORT_SYMBOL_GPL(unregister_acpi_hed_notifier);
  47
  48/*
  49 * SCI to report hardware error is forwarded to the listeners of HED,
  50 * it is used by HEST Generic Hardware Error Source with notify type
  51 * SCI.
  52 */
  53static void acpi_hed_notify(struct acpi_device *device, u32 event)
  54{
  55        blocking_notifier_call_chain(&acpi_hed_notify_list, 0, NULL);
  56}
  57
  58static int acpi_hed_add(struct acpi_device *device)
  59{
  60        /* Only one hardware error device */
  61        if (hed_handle)
  62                return -EINVAL;
  63        hed_handle = device->handle;
  64        return 0;
  65}
  66
  67static int acpi_hed_remove(struct acpi_device *device)
  68{
  69        hed_handle = NULL;
  70        return 0;
  71}
  72
  73static struct acpi_driver acpi_hed_driver = {
  74        .name = "hardware_error_device",
  75        .class = "hardware_error",
  76        .ids = acpi_hed_ids,
  77        .ops = {
  78                .add = acpi_hed_add,
  79                .remove = acpi_hed_remove,
  80                .notify = acpi_hed_notify,
  81        },
  82};
  83module_acpi_driver(acpi_hed_driver);
  84
  85ACPI_MODULE_NAME("hed");
  86MODULE_AUTHOR("Huang Ying");
  87MODULE_DESCRIPTION("ACPI Hardware Error Device Driver");
  88MODULE_LICENSE("GPL");
  89