diff options
Diffstat (limited to 'target/linux/rdc/files-2.6.30/arch/x86/mach-rdc321x/pci.c')
-rw-r--r-- | target/linux/rdc/files-2.6.30/arch/x86/mach-rdc321x/pci.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/target/linux/rdc/files-2.6.30/arch/x86/mach-rdc321x/pci.c b/target/linux/rdc/files-2.6.30/arch/x86/mach-rdc321x/pci.c new file mode 100644 index 000000000..0281485c5 --- /dev/null +++ b/target/linux/rdc/files-2.6.30/arch/x86/mach-rdc321x/pci.c @@ -0,0 +1,110 @@ +/* + * RDC321x southbrige driver + * + * Copyright (C) 2007-2010 Florian Fainelli <florian@openwrt.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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/init.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include <linux/pci.h> + +#include <asm/rdc321x_defs.h> + +static struct pci_dev *rdc321x_sb_pdev; + +/* + * Unlocked PCI configuration space accessors + */ +int rdc321x_pci_read(int reg, u32 *val) +{ + int err; + + err = pci_read_config_dword(rdc321x_sb_pdev, reg, val); + if (err) + return err; + + return err; +} +EXPORT_SYMBOL(rdc321x_pci_read); + +int rdc321x_pci_write(int reg, u32 val) +{ + int err; + + err = pci_write_config_dword(rdc321x_sb_pdev, reg, val); + if (err) + return err; + + return err; +} +EXPORT_SYMBOL(rdc321x_pci_write); + +static struct platform_device rdc321x_wdt_device = { + .name = "rdc321x-wdt" +}; + +static struct platform_device rdc321x_gpio_device = { + .name = "rdc321x-gpio" +}; + +static int __devinit rdc321x_sb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +{ + int err; + + err = pci_enable_device(pdev); + if (err) { + printk(KERN_ERR "failed to enable device\n"); + return err; + } + + rdc321x_sb_pdev = pdev; + + err = platform_device_register(&rdc321x_wdt_device); + if (err) { + dev_err(&pdev->dev, "failed to register watchdog\n"); + return err; + } + + err = platform_device_register(&rdc321x_gpio_device); + if (err) { + dev_err(&pdev->dev, "failed to register gpiochip\n"); + return err; + } + dev_info(&rdc321x_sb_pdev->dev, "RDC321x southhridge registered\n"); + + return err; +} + +static struct pci_device_id rdc321x_sb_table[] = { + { PCI_DEVICE(PCI_VENDOR_ID_RDC, PCI_DEVICE_ID_RDC_R6030) }, + {} +}; + +static struct pci_driver rdc321x_sb_driver = { + .name = "RDC3210 Southbridge", + .id_table = rdc321x_sb_table, + .probe = rdc321x_sb_probe +}; + +static int __init rdc321x_sb_init(void) +{ + return pci_register_driver(&rdc321x_sb_driver); +} + +device_initcall(rdc321x_sb_init); |