Commit | Line | Data |
---|---|---|
22c21003 WZ |
1 | /* |
2 | * read/write operation to the PCI config space of CS5536 | |
3 | * | |
4 | * Copyright (C) 2007 Lemote, Inc. | |
5 | * Author : jlliu, liujl@lemote.com | |
6 | * | |
7 | * Copyright (C) 2009 Lemote, Inc. | |
f7a904df | 8 | * Author: Wu Zhangjin, wuzhangjin@gmail.com |
22c21003 WZ |
9 | * |
10 | * This program is free software; you can redistribute it and/or modify it | |
11 | * under the terms of the GNU General Public License as published by the | |
12 | * Free Software Foundation; either version 2 of the License, or (at your | |
13 | * option) any later version. | |
14 | * | |
15 | * the Virtual Support Module(VSM) for virtulizing the PCI | |
16 | * configure space are defined in cs5536_modulename.c respectively, | |
17 | * | |
18 | * after this virtulizing, user can access the PCI configure space | |
19 | * directly as a normal multi-function PCI device which follows | |
20 | * the PCI-2.2 spec. | |
21 | */ | |
22 | ||
23 | #include <linux/types.h> | |
24 | #include <cs5536/cs5536_vsm.h> | |
25 | ||
26 | enum { | |
27 | CS5536_FUNC_START = -1, | |
28 | CS5536_ISA_FUNC, | |
29 | reserved_func, | |
30 | CS5536_IDE_FUNC, | |
31 | CS5536_ACC_FUNC, | |
32 | CS5536_OHCI_FUNC, | |
33 | CS5536_EHCI_FUNC, | |
34 | CS5536_FUNC_END, | |
35 | }; | |
36 | ||
37 | static const cs5536_pci_vsm_write vsm_conf_write[] = { | |
38 | [CS5536_ISA_FUNC] pci_isa_write_reg, | |
39 | [reserved_func] NULL, | |
40 | [CS5536_IDE_FUNC] pci_ide_write_reg, | |
41 | [CS5536_ACC_FUNC] pci_acc_write_reg, | |
42 | [CS5536_OHCI_FUNC] pci_ohci_write_reg, | |
43 | [CS5536_EHCI_FUNC] pci_ehci_write_reg, | |
44 | }; | |
45 | ||
46 | static const cs5536_pci_vsm_read vsm_conf_read[] = { | |
47 | [CS5536_ISA_FUNC] pci_isa_read_reg, | |
48 | [reserved_func] NULL, | |
49 | [CS5536_IDE_FUNC] pci_ide_read_reg, | |
50 | [CS5536_ACC_FUNC] pci_acc_read_reg, | |
51 | [CS5536_OHCI_FUNC] pci_ohci_read_reg, | |
52 | [CS5536_EHCI_FUNC] pci_ehci_read_reg, | |
53 | }; | |
54 | ||
55 | /* | |
56 | * write to PCI config space and transfer it to MSR write. | |
57 | */ | |
58 | void cs5536_pci_conf_write4(int function, int reg, u32 value) | |
59 | { | |
60 | if ((function <= CS5536_FUNC_START) || (function >= CS5536_FUNC_END)) | |
61 | return; | |
62 | if ((reg < 0) || (reg > 0x100) || ((reg & 0x03) != 0)) | |
63 | return; | |
64 | ||
65 | if (vsm_conf_write[function] != NULL) | |
66 | vsm_conf_write[function](reg, value); | |
67 | } | |
68 | ||
69 | /* | |
70 | * read PCI config space and transfer it to MSR access. | |
71 | */ | |
72 | u32 cs5536_pci_conf_read4(int function, int reg) | |
73 | { | |
74 | u32 data = 0; | |
75 | ||
76 | if ((function <= CS5536_FUNC_START) || (function >= CS5536_FUNC_END)) | |
77 | return 0; | |
78 | if ((reg < 0) || ((reg & 0x03) != 0)) | |
79 | return 0; | |
80 | if (reg > 0x100) | |
81 | return 0xffffffff; | |
82 | ||
83 | if (vsm_conf_read[function] != NULL) | |
84 | data = vsm_conf_read[function](reg); | |
85 | ||
86 | return data; | |
87 | } |