Commit | Line | Data |
---|---|---|
74ba9207 | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
e090d506 | 2 | /* |
5a4432b9 | 3 | * RDC321x MFD southbridge driver |
e090d506 FF |
4 | * |
5 | * Copyright (C) 2007-2010 Florian Fainelli <florian@openwrt.org> | |
6 | * Copyright (C) 2010 Bernhard Loos <bernhardloos@googlemail.com> | |
e090d506 | 7 | */ |
e090d506 FF |
8 | #include <linux/module.h> |
9 | #include <linux/kernel.h> | |
10 | #include <linux/platform_device.h> | |
11 | #include <linux/pci.h> | |
12 | #include <linux/mfd/core.h> | |
13 | #include <linux/mfd/rdc321x.h> | |
14 | ||
15 | static struct rdc321x_wdt_pdata rdc321x_wdt_pdata; | |
16 | ||
17 | static struct resource rdc321x_wdt_resource[] = { | |
18 | { | |
19 | .name = "wdt-reg", | |
20 | .start = RDC321X_WDT_CTRL, | |
21 | .end = RDC321X_WDT_CTRL + 0x3, | |
8deca39e | 22 | .flags = IORESOURCE_IO, |
e090d506 FF |
23 | } |
24 | }; | |
25 | ||
26 | static struct rdc321x_gpio_pdata rdc321x_gpio_pdata = { | |
1ec93b9b | 27 | .max_gpios = RDC321X_NUM_GPIO, |
e090d506 FF |
28 | }; |
29 | ||
30 | static struct resource rdc321x_gpio_resources[] = { | |
31 | { | |
32 | .name = "gpio-reg1", | |
33 | .start = RDC321X_GPIO_CTRL_REG1, | |
34 | .end = RDC321X_GPIO_CTRL_REG1 + 0x7, | |
8deca39e | 35 | .flags = IORESOURCE_IO, |
e090d506 FF |
36 | }, { |
37 | .name = "gpio-reg2", | |
38 | .start = RDC321X_GPIO_CTRL_REG2, | |
39 | .end = RDC321X_GPIO_CTRL_REG2 + 0x7, | |
8deca39e | 40 | .flags = IORESOURCE_IO, |
e090d506 FF |
41 | } |
42 | }; | |
43 | ||
5ac98553 | 44 | static const struct mfd_cell rdc321x_sb_cells[] = { |
e090d506 FF |
45 | { |
46 | .name = "rdc321x-wdt", | |
47 | .resources = rdc321x_wdt_resource, | |
48 | .num_resources = ARRAY_SIZE(rdc321x_wdt_resource), | |
9abd768a SO |
49 | .platform_data = &rdc321x_wdt_pdata, |
50 | .pdata_size = sizeof(rdc321x_wdt_pdata), | |
e090d506 FF |
51 | }, { |
52 | .name = "rdc321x-gpio", | |
53 | .resources = rdc321x_gpio_resources, | |
54 | .num_resources = ARRAY_SIZE(rdc321x_gpio_resources), | |
9abd768a SO |
55 | .platform_data = &rdc321x_gpio_pdata, |
56 | .pdata_size = sizeof(rdc321x_gpio_pdata), | |
e090d506 FF |
57 | }, |
58 | }; | |
59 | ||
f791be49 | 60 | static int rdc321x_sb_probe(struct pci_dev *pdev, |
e090d506 FF |
61 | const struct pci_device_id *ent) |
62 | { | |
63 | int err; | |
64 | ||
65 | err = pci_enable_device(pdev); | |
66 | if (err) { | |
67 | dev_err(&pdev->dev, "failed to enable device\n"); | |
68 | return err; | |
69 | } | |
70 | ||
71 | rdc321x_gpio_pdata.sb_pdev = pdev; | |
72 | rdc321x_wdt_pdata.sb_pdev = pdev; | |
73 | ||
7360544c LD |
74 | return devm_mfd_add_devices(&pdev->dev, -1, |
75 | rdc321x_sb_cells, | |
76 | ARRAY_SIZE(rdc321x_sb_cells), | |
77 | NULL, 0, NULL); | |
e090d506 FF |
78 | } |
79 | ||
36fcd06c | 80 | static const struct pci_device_id rdc321x_sb_table[] = { |
e090d506 FF |
81 | { PCI_DEVICE(PCI_VENDOR_ID_RDC, PCI_DEVICE_ID_RDC_R6030) }, |
82 | {} | |
83 | }; | |
85375486 | 84 | MODULE_DEVICE_TABLE(pci, rdc321x_sb_table); |
e090d506 FF |
85 | |
86 | static struct pci_driver rdc321x_sb_driver = { | |
87 | .name = "RDC321x Southbridge", | |
88 | .id_table = rdc321x_sb_table, | |
89 | .probe = rdc321x_sb_probe, | |
e090d506 FF |
90 | }; |
91 | ||
38a36f5a | 92 | module_pci_driver(rdc321x_sb_driver); |
e090d506 FF |
93 | |
94 | MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>"); | |
95 | MODULE_LICENSE("GPL"); | |
96 | MODULE_DESCRIPTION("RDC R-321x MFD southbridge driver"); |