Blame view

drivers/mfd/rdc321x-southbridge.c 3.32 KB
e090d506c   Florian Fainelli   mfd: Add support ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  /*
   * RDC321x MFD southbrige driver
   *
   * Copyright (C) 2007-2010 Florian Fainelli <florian@openwrt.org>
   * Copyright (C) 2010 Bernhard Loos <bernhardloos@googlemail.com>
   *
   * 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 <linux/mfd/core.h>
  #include <linux/mfd/rdc321x.h>
  
  static struct rdc321x_wdt_pdata rdc321x_wdt_pdata;
  
  static struct resource rdc321x_wdt_resource[] = {
  	{
  		.name	= "wdt-reg",
  		.start	= RDC321X_WDT_CTRL,
  		.end	= RDC321X_WDT_CTRL + 0x3,
8deca39e5   Florian Fainelli   mfd: Change rdc32...
37
  		.flags	= IORESOURCE_IO,
e090d506c   Florian Fainelli   mfd: Add support ...
38
39
40
41
42
43
44
45
46
47
48
49
  	}
  };
  
  static struct rdc321x_gpio_pdata rdc321x_gpio_pdata = {
  	.max_gpios	= RDC321X_MAX_GPIO,
  };
  
  static struct resource rdc321x_gpio_resources[] = {
  	{
  		.name	= "gpio-reg1",
  		.start	= RDC321X_GPIO_CTRL_REG1,
  		.end	= RDC321X_GPIO_CTRL_REG1 + 0x7,
8deca39e5   Florian Fainelli   mfd: Change rdc32...
50
  		.flags	= IORESOURCE_IO,
e090d506c   Florian Fainelli   mfd: Add support ...
51
52
53
54
  	}, {
  		.name	= "gpio-reg2",
  		.start	= RDC321X_GPIO_CTRL_REG2,
  		.end	= RDC321X_GPIO_CTRL_REG2 + 0x7,
8deca39e5   Florian Fainelli   mfd: Change rdc32...
55
  		.flags	= IORESOURCE_IO,
e090d506c   Florian Fainelli   mfd: Add support ...
56
57
58
59
60
61
62
63
  	}
  };
  
  static struct mfd_cell rdc321x_sb_cells[] = {
  	{
  		.name		= "rdc321x-wdt",
  		.resources	= rdc321x_wdt_resource,
  		.num_resources	= ARRAY_SIZE(rdc321x_wdt_resource),
9abd768a8   Samuel Ortiz   mfd: Use mfd cell...
64
65
  		.platform_data	= &rdc321x_wdt_pdata,
  		.pdata_size	= sizeof(rdc321x_wdt_pdata),
e090d506c   Florian Fainelli   mfd: Add support ...
66
67
68
69
  	}, {
  		.name		= "rdc321x-gpio",
  		.resources	= rdc321x_gpio_resources,
  		.num_resources	= ARRAY_SIZE(rdc321x_gpio_resources),
9abd768a8   Samuel Ortiz   mfd: Use mfd cell...
70
71
  		.platform_data	= &rdc321x_gpio_pdata,
  		.pdata_size	= sizeof(rdc321x_gpio_pdata),
e090d506c   Florian Fainelli   mfd: Add support ...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  	},
  };
  
  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) {
  		dev_err(&pdev->dev, "failed to enable device
  ");
  		return err;
  	}
  
  	rdc321x_gpio_pdata.sb_pdev = pdev;
  	rdc321x_wdt_pdata.sb_pdev = pdev;
  
  	return mfd_add_devices(&pdev->dev, -1,
  		rdc321x_sb_cells, ARRAY_SIZE(rdc321x_sb_cells), NULL, 0);
  }
  
  static void __devexit rdc321x_sb_remove(struct pci_dev *pdev)
  {
  	mfd_remove_devices(&pdev->dev);
  }
  
  static DEFINE_PCI_DEVICE_TABLE(rdc321x_sb_table) = {
  	{ PCI_DEVICE(PCI_VENDOR_ID_RDC, PCI_DEVICE_ID_RDC_R6030) },
  	{}
  };
853754864   Axel Lin   mfd: Add MODULE_D...
103
  MODULE_DEVICE_TABLE(pci, rdc321x_sb_table);
e090d506c   Florian Fainelli   mfd: Add support ...
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  
  static struct pci_driver rdc321x_sb_driver = {
  	.name		= "RDC321x Southbridge",
  	.id_table	= rdc321x_sb_table,
  	.probe		= rdc321x_sb_probe,
  	.remove		= __devexit_p(rdc321x_sb_remove),
  };
  
  static int __init rdc321x_sb_init(void)
  {
  	return pci_register_driver(&rdc321x_sb_driver);
  }
  
  static void __exit rdc321x_sb_exit(void)
  {
  	pci_unregister_driver(&rdc321x_sb_driver);
  }
  
  module_init(rdc321x_sb_init);
  module_exit(rdc321x_sb_exit);
  
  MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>");
  MODULE_LICENSE("GPL");
  MODULE_DESCRIPTION("RDC R-321x MFD southbridge driver");