cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rdc321x-southbridge.c (2415B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * RDC321x MFD southbridge driver
      4 *
      5 * Copyright (C) 2007-2010 Florian Fainelli <florian@openwrt.org>
      6 * Copyright (C) 2010 Bernhard Loos <bernhardloos@googlemail.com>
      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
     15static struct rdc321x_wdt_pdata rdc321x_wdt_pdata;
     16
     17static const struct resource rdc321x_wdt_resource[] = {
     18	{
     19		.name	= "wdt-reg",
     20		.start	= RDC321X_WDT_CTRL,
     21		.end	= RDC321X_WDT_CTRL + 0x3,
     22		.flags	= IORESOURCE_IO,
     23	}
     24};
     25
     26static struct rdc321x_gpio_pdata rdc321x_gpio_pdata = {
     27	.max_gpios	= RDC321X_NUM_GPIO,
     28};
     29
     30static const struct resource rdc321x_gpio_resources[] = {
     31	{
     32		.name	= "gpio-reg1",
     33		.start	= RDC321X_GPIO_CTRL_REG1,
     34		.end	= RDC321X_GPIO_CTRL_REG1 + 0x7,
     35		.flags	= IORESOURCE_IO,
     36	}, {
     37		.name	= "gpio-reg2",
     38		.start	= RDC321X_GPIO_CTRL_REG2,
     39		.end	= RDC321X_GPIO_CTRL_REG2 + 0x7,
     40		.flags	= IORESOURCE_IO,
     41	}
     42};
     43
     44static const struct mfd_cell rdc321x_sb_cells[] = {
     45	{
     46		.name		= "rdc321x-wdt",
     47		.resources	= rdc321x_wdt_resource,
     48		.num_resources	= ARRAY_SIZE(rdc321x_wdt_resource),
     49		.platform_data	= &rdc321x_wdt_pdata,
     50		.pdata_size	= sizeof(rdc321x_wdt_pdata),
     51	}, {
     52		.name		= "rdc321x-gpio",
     53		.resources	= rdc321x_gpio_resources,
     54		.num_resources	= ARRAY_SIZE(rdc321x_gpio_resources),
     55		.platform_data	= &rdc321x_gpio_pdata,
     56		.pdata_size	= sizeof(rdc321x_gpio_pdata),
     57	},
     58};
     59
     60static int rdc321x_sb_probe(struct pci_dev *pdev,
     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
     74	return devm_mfd_add_devices(&pdev->dev, -1,
     75				    rdc321x_sb_cells,
     76				    ARRAY_SIZE(rdc321x_sb_cells),
     77				    NULL, 0, NULL);
     78}
     79
     80static const struct pci_device_id rdc321x_sb_table[] = {
     81	{ PCI_DEVICE(PCI_VENDOR_ID_RDC, PCI_DEVICE_ID_RDC_R6030) },
     82	{}
     83};
     84MODULE_DEVICE_TABLE(pci, rdc321x_sb_table);
     85
     86static struct pci_driver rdc321x_sb_driver = {
     87	.name		= "RDC321x Southbridge",
     88	.id_table	= rdc321x_sb_table,
     89	.probe		= rdc321x_sb_probe,
     90};
     91
     92module_pci_driver(rdc321x_sb_driver);
     93
     94MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>");
     95MODULE_LICENSE("GPL");
     96MODULE_DESCRIPTION("RDC R-321x MFD southbridge driver");