-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Andres Salomon
authored and
Samuel Ortiz
committed
Jan 14, 2011
1 parent
8a26585
commit 54c0e25
Showing
4 changed files
with
161 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: e1b88eb0e08335d2f6c00b35b67b4ffc78fd46d6 | ||
refs/heads/master: f71e1afdd588ec60fd799b1e5a6f0b2e6cf9605e |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,151 @@ | ||
/* | ||
* cs5535-mfd.c - core MFD driver for CS5535/CS5536 southbridges | ||
* | ||
* The CS5535 and CS5536 has an ISA bridge on the PCI bus that is | ||
* used for accessing GPIOs, MFGPTs, ACPI, etc. Each subdevice has | ||
* an IO range that's specified in a single BAR. The BAR order is | ||
* hardcoded in the CS553x specifications. | ||
* | ||
* Copyright (c) 2010 Andres Salomon <dilinger@queued.net> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
#include <linux/mfd/core.h> | ||
#include <linux/module.h> | ||
#include <linux/pci.h> | ||
|
||
#define DRV_NAME "cs5535-mfd" | ||
|
||
enum cs5535_mfd_bars { | ||
SMB_BAR = 0, | ||
GPIO_BAR = 1, | ||
MFGPT_BAR = 2, | ||
PMS_BAR = 4, | ||
ACPI_BAR = 5, | ||
NR_BARS, | ||
}; | ||
|
||
static __devinitdata struct resource cs5535_mfd_resources[NR_BARS]; | ||
|
||
static __devinitdata struct mfd_cell cs5535_mfd_cells[] = { | ||
{ | ||
.id = SMB_BAR, | ||
.name = "cs5535-smb", | ||
.num_resources = 1, | ||
.resources = &cs5535_mfd_resources[SMB_BAR], | ||
}, | ||
{ | ||
.id = GPIO_BAR, | ||
.name = "cs5535-gpio", | ||
.num_resources = 1, | ||
.resources = &cs5535_mfd_resources[GPIO_BAR], | ||
}, | ||
{ | ||
.id = MFGPT_BAR, | ||
.name = "cs5535-mfgpt", | ||
.num_resources = 1, | ||
.resources = &cs5535_mfd_resources[MFGPT_BAR], | ||
}, | ||
{ | ||
.id = PMS_BAR, | ||
.name = "cs5535-pms", | ||
.num_resources = 1, | ||
.resources = &cs5535_mfd_resources[PMS_BAR], | ||
}, | ||
{ | ||
.id = ACPI_BAR, | ||
.name = "cs5535-acpi", | ||
.num_resources = 1, | ||
.resources = &cs5535_mfd_resources[ACPI_BAR], | ||
}, | ||
}; | ||
|
||
static int __devinit cs5535_mfd_probe(struct pci_dev *pdev, | ||
const struct pci_device_id *id) | ||
{ | ||
int err, i; | ||
|
||
err = pci_enable_device(pdev); | ||
if (err) | ||
return err; | ||
|
||
/* fill in IO range for each cell; subdrivers handle the region */ | ||
for (i = 0; i < ARRAY_SIZE(cs5535_mfd_cells); i++) { | ||
int bar = cs5535_mfd_cells[i].id; | ||
struct resource *r = &cs5535_mfd_resources[bar]; | ||
|
||
r->flags = IORESOURCE_IO; | ||
r->start = pci_resource_start(pdev, bar); | ||
r->end = pci_resource_end(pdev, bar); | ||
|
||
/* id is used for temporarily storing BAR; unset it now */ | ||
cs5535_mfd_cells[i].id = 0; | ||
} | ||
|
||
err = mfd_add_devices(&pdev->dev, -1, cs5535_mfd_cells, | ||
ARRAY_SIZE(cs5535_mfd_cells), NULL, 0); | ||
if (err) { | ||
dev_err(&pdev->dev, "MFD add devices failed: %d\n", err); | ||
goto err_disable; | ||
} | ||
|
||
dev_info(&pdev->dev, "%d devices registered.\n", | ||
ARRAY_SIZE(cs5535_mfd_cells)); | ||
|
||
return 0; | ||
|
||
err_disable: | ||
pci_disable_device(pdev); | ||
return err; | ||
} | ||
|
||
static void __devexit cs5535_mfd_remove(struct pci_dev *pdev) | ||
{ | ||
mfd_remove_devices(&pdev->dev); | ||
pci_disable_device(pdev); | ||
} | ||
|
||
static struct pci_device_id cs5535_mfd_pci_tbl[] = { | ||
{ PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_ISA) }, | ||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA) }, | ||
{ 0, } | ||
}; | ||
MODULE_DEVICE_TABLE(pci, cs5535_mfd_pci_tbl); | ||
|
||
static struct pci_driver cs5535_mfd_drv = { | ||
.name = DRV_NAME, | ||
.id_table = cs5535_mfd_pci_tbl, | ||
.probe = cs5535_mfd_probe, | ||
.remove = __devexit_p(cs5535_mfd_remove), | ||
}; | ||
|
||
static int __init cs5535_mfd_init(void) | ||
{ | ||
return pci_register_driver(&cs5535_mfd_drv); | ||
} | ||
|
||
static void __exit cs5535_mfd_exit(void) | ||
{ | ||
pci_unregister_driver(&cs5535_mfd_drv); | ||
} | ||
|
||
module_init(cs5535_mfd_init); | ||
module_exit(cs5535_mfd_exit); | ||
|
||
MODULE_AUTHOR("Andres Salomon <dilinger@queued.net>"); | ||
MODULE_DESCRIPTION("MFD driver for CS5535/CS5536 southbridge's ISA PCI device"); | ||
MODULE_LICENSE("GPL"); |