rdc321x-southbridge.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * RDC321x MFD southbridge driver
  4. *
  5. * Copyright (C) 2007-2010 Florian Fainelli <[email protected]>
  6. * Copyright (C) 2010 Bernhard Loos <[email protected]>
  7. */
  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. static struct rdc321x_wdt_pdata rdc321x_wdt_pdata;
  15. static const struct resource rdc321x_wdt_resource[] = {
  16. {
  17. .name = "wdt-reg",
  18. .start = RDC321X_WDT_CTRL,
  19. .end = RDC321X_WDT_CTRL + 0x3,
  20. .flags = IORESOURCE_IO,
  21. }
  22. };
  23. static struct rdc321x_gpio_pdata rdc321x_gpio_pdata = {
  24. .max_gpios = RDC321X_NUM_GPIO,
  25. };
  26. static const struct resource rdc321x_gpio_resources[] = {
  27. {
  28. .name = "gpio-reg1",
  29. .start = RDC321X_GPIO_CTRL_REG1,
  30. .end = RDC321X_GPIO_CTRL_REG1 + 0x7,
  31. .flags = IORESOURCE_IO,
  32. }, {
  33. .name = "gpio-reg2",
  34. .start = RDC321X_GPIO_CTRL_REG2,
  35. .end = RDC321X_GPIO_CTRL_REG2 + 0x7,
  36. .flags = IORESOURCE_IO,
  37. }
  38. };
  39. static const struct mfd_cell rdc321x_sb_cells[] = {
  40. {
  41. .name = "rdc321x-wdt",
  42. .resources = rdc321x_wdt_resource,
  43. .num_resources = ARRAY_SIZE(rdc321x_wdt_resource),
  44. .platform_data = &rdc321x_wdt_pdata,
  45. .pdata_size = sizeof(rdc321x_wdt_pdata),
  46. }, {
  47. .name = "rdc321x-gpio",
  48. .resources = rdc321x_gpio_resources,
  49. .num_resources = ARRAY_SIZE(rdc321x_gpio_resources),
  50. .platform_data = &rdc321x_gpio_pdata,
  51. .pdata_size = sizeof(rdc321x_gpio_pdata),
  52. },
  53. };
  54. static int rdc321x_sb_probe(struct pci_dev *pdev,
  55. const struct pci_device_id *ent)
  56. {
  57. int err;
  58. err = pci_enable_device(pdev);
  59. if (err) {
  60. dev_err(&pdev->dev, "failed to enable device\n");
  61. return err;
  62. }
  63. rdc321x_gpio_pdata.sb_pdev = pdev;
  64. rdc321x_wdt_pdata.sb_pdev = pdev;
  65. return devm_mfd_add_devices(&pdev->dev, -1,
  66. rdc321x_sb_cells,
  67. ARRAY_SIZE(rdc321x_sb_cells),
  68. NULL, 0, NULL);
  69. }
  70. static const struct pci_device_id rdc321x_sb_table[] = {
  71. { PCI_DEVICE(PCI_VENDOR_ID_RDC, PCI_DEVICE_ID_RDC_R6030) },
  72. {}
  73. };
  74. MODULE_DEVICE_TABLE(pci, rdc321x_sb_table);
  75. static struct pci_driver rdc321x_sb_driver = {
  76. .name = "RDC321x Southbridge",
  77. .id_table = rdc321x_sb_table,
  78. .probe = rdc321x_sb_probe,
  79. };
  80. module_pci_driver(rdc321x_sb_driver);
  81. MODULE_AUTHOR("Florian Fainelli <[email protected]>");
  82. MODULE_LICENSE("GPL");
  83. MODULE_DESCRIPTION("RDC R-321x MFD southbridge driver");