OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [pnp/] [system.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * system.c - a driver for reserving pnp system resources
3
 *
4
 * Some code is based on pnpbios_core.c
5
 * Copyright 2002 Adam Belay <ambx1@neo.rr.com>
6
 * (c) Copyright 2007 Hewlett-Packard Development Company, L.P.
7
 *      Bjorn Helgaas <bjorn.helgaas@hp.com>
8
 */
9
 
10
#include <linux/pnp.h>
11
#include <linux/device.h>
12
#include <linux/init.h>
13
#include <linux/slab.h>
14
#include <linux/kernel.h>
15
#include <linux/ioport.h>
16
 
17
static const struct pnp_device_id pnp_dev_table[] = {
18
        /* General ID for reserving resources */
19
        {"PNP0c02", 0},
20
        /* memory controller */
21
        {"PNP0c01", 0},
22
        {"", 0}
23
};
24
 
25
static void reserve_range(struct pnp_dev *dev, resource_size_t start,
26
                          resource_size_t end, int port)
27
{
28
        char *regionid;
29
        const char *pnpid = dev->dev.bus_id;
30
        struct resource *res;
31
 
32
        regionid = kmalloc(16, GFP_KERNEL);
33
        if (!regionid)
34
                return;
35
 
36
        snprintf(regionid, 16, "pnp %s", pnpid);
37
        if (port)
38
                res = request_region(start, end - start + 1, regionid);
39
        else
40
                res = request_mem_region(start, end - start + 1, regionid);
41
        if (res)
42
                res->flags &= ~IORESOURCE_BUSY;
43
        else
44
                kfree(regionid);
45
 
46
        /*
47
         * Failures at this point are usually harmless. pci quirks for
48
         * example do reserve stuff they know about too, so we may well
49
         * have double reservations.
50
         */
51
        dev_info(&dev->dev, "%s range 0x%llx-0x%llx %s reserved\n",
52
                port ? "ioport" : "iomem",
53
                (unsigned long long) start, (unsigned long long) end,
54
                res ? "has been" : "could not be");
55
}
56
 
57
static void reserve_resources_of_dev(struct pnp_dev *dev)
58
{
59
        int i;
60
 
61
        for (i = 0; i < PNP_MAX_PORT; i++) {
62
                if (!pnp_port_valid(dev, i))
63
                        continue;
64
                if (pnp_port_start(dev, i) == 0)
65
                        continue;       /* disabled */
66
                if (pnp_port_start(dev, i) < 0x100)
67
                        /*
68
                         * Below 0x100 is only standard PC hardware
69
                         * (pics, kbd, timer, dma, ...)
70
                         * We should not get resource conflicts there,
71
                         * and the kernel reserves these anyway
72
                         * (see arch/i386/kernel/setup.c).
73
                         * So, do nothing
74
                         */
75
                        continue;
76
                if (pnp_port_end(dev, i) < pnp_port_start(dev, i))
77
                        continue;       /* invalid */
78
 
79
                reserve_range(dev, pnp_port_start(dev, i),
80
                              pnp_port_end(dev, i), 1);
81
        }
82
 
83
        for (i = 0; i < PNP_MAX_MEM; i++) {
84
                if (!pnp_mem_valid(dev, i))
85
                        continue;
86
 
87
                reserve_range(dev, pnp_mem_start(dev, i),
88
                              pnp_mem_end(dev, i), 0);
89
        }
90
}
91
 
92
static int system_pnp_probe(struct pnp_dev *dev,
93
                            const struct pnp_device_id *dev_id)
94
{
95
        reserve_resources_of_dev(dev);
96
        return 0;
97
}
98
 
99
static struct pnp_driver system_pnp_driver = {
100
        .name     = "system",
101
        .id_table = pnp_dev_table,
102
        .flags    = PNP_DRIVER_RES_DO_NOT_CHANGE,
103
        .probe    = system_pnp_probe,
104
};
105
 
106
static int __init pnp_system_init(void)
107
{
108
        return pnp_register_driver(&system_pnp_driver);
109
}
110
 
111
/**
112
 * Reserve motherboard resources after PCI claim BARs,
113
 * but before PCI assign resources for uninitialized PCI devices
114
 */
115
fs_initcall(pnp_system_init);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.