mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-28 21:35:13 -04:00
The .driver_data member of the various struct pci_device_id arrays were initialized by list expressions. This isn't easily readable if you're not into PCI. Using named initializers is more explicit and thus easier to parse. Also skip explicit assignments of 0 (which the compiler then takes care of). This change doesn't introduce changes to the compiled pci_device_id arrays. Tested on x86 and arm64. Signed-off-by: Uwe Kleine-König (The Capable Hub) <u.kleine-koenig@baylibre.com> Link: https://patch.msgid.link/20260504142117.2116978-2-u.kleine-koenig@baylibre.com Signed-off-by: Mark Brown <broonie@kernel.org>
118 lines
4.3 KiB
C
118 lines
4.3 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Intel PCH/PCU SPI flash PCI driver.
|
|
*
|
|
* Copyright (C) 2016 - 2022, Intel Corporation
|
|
* Author: Mika Westerberg <mika.westerberg@linux.intel.com>
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/pci.h>
|
|
|
|
#include "spi-intel.h"
|
|
|
|
#define BCR 0xdc
|
|
#define BCR_WPD BIT(0)
|
|
|
|
static bool intel_spi_pci_set_writeable(void __iomem *base, void *data)
|
|
{
|
|
struct pci_dev *pdev = data;
|
|
u32 bcr;
|
|
|
|
/* Try to make the chip read/write */
|
|
pci_read_config_dword(pdev, BCR, &bcr);
|
|
if (!(bcr & BCR_WPD)) {
|
|
bcr |= BCR_WPD;
|
|
pci_write_config_dword(pdev, BCR, bcr);
|
|
pci_read_config_dword(pdev, BCR, &bcr);
|
|
}
|
|
|
|
return bcr & BCR_WPD;
|
|
}
|
|
|
|
static const struct intel_spi_boardinfo bxt_info = {
|
|
.type = INTEL_SPI_BXT,
|
|
.set_writeable = intel_spi_pci_set_writeable,
|
|
};
|
|
|
|
static const struct intel_spi_boardinfo cnl_info = {
|
|
.type = INTEL_SPI_CNL,
|
|
.set_writeable = intel_spi_pci_set_writeable,
|
|
};
|
|
|
|
static int intel_spi_pci_probe(struct pci_dev *pdev,
|
|
const struct pci_device_id *id)
|
|
{
|
|
struct intel_spi_boardinfo *info;
|
|
void __iomem *base;
|
|
int ret;
|
|
|
|
ret = pcim_enable_device(pdev);
|
|
if (ret)
|
|
return ret;
|
|
|
|
info = devm_kmemdup(&pdev->dev, (void *)id->driver_data, sizeof(*info),
|
|
GFP_KERNEL);
|
|
if (!info)
|
|
return -ENOMEM;
|
|
|
|
info->data = pdev;
|
|
|
|
base = pcim_iomap_region(pdev, 0, KBUILD_MODNAME);
|
|
if (IS_ERR(base))
|
|
return PTR_ERR(base);
|
|
|
|
return intel_spi_probe(&pdev->dev, base, info);
|
|
}
|
|
|
|
static const struct pci_device_id intel_spi_pci_ids[] = {
|
|
{ PCI_VDEVICE(INTEL, 0x02a4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x06a4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x18e0), .driver_data = (unsigned long)&bxt_info },
|
|
{ PCI_VDEVICE(INTEL, 0x19e0), .driver_data = (unsigned long)&bxt_info },
|
|
{ PCI_VDEVICE(INTEL, 0x1bca), .driver_data = (unsigned long)&bxt_info },
|
|
{ PCI_VDEVICE(INTEL, 0x34a4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x38a4), .driver_data = (unsigned long)&bxt_info },
|
|
{ PCI_VDEVICE(INTEL, 0x43a4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x4b24), .driver_data = (unsigned long)&bxt_info },
|
|
{ PCI_VDEVICE(INTEL, 0x4d23), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x4da4), .driver_data = (unsigned long)&bxt_info },
|
|
{ PCI_VDEVICE(INTEL, 0x51a4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x54a4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x5794), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x5825), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x6e24), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x7723), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x7a24), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x7aa4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x7e23), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x7f24), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x9d24), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0x9da4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0xa0a4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0xa1a4), .driver_data = (unsigned long)&bxt_info },
|
|
{ PCI_VDEVICE(INTEL, 0xa224), .driver_data = (unsigned long)&bxt_info },
|
|
{ PCI_VDEVICE(INTEL, 0xa2a4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0xa324), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0xa3a4), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0xa823), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0xd323), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0xe323), .driver_data = (unsigned long)&cnl_info },
|
|
{ PCI_VDEVICE(INTEL, 0xe423), .driver_data = (unsigned long)&cnl_info },
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(pci, intel_spi_pci_ids);
|
|
|
|
static struct pci_driver intel_spi_pci_driver = {
|
|
.name = "intel-spi",
|
|
.id_table = intel_spi_pci_ids,
|
|
.probe = intel_spi_pci_probe,
|
|
.dev_groups = intel_spi_groups,
|
|
};
|
|
|
|
module_pci_driver(intel_spi_pci_driver);
|
|
|
|
MODULE_DESCRIPTION("Intel PCH/PCU SPI flash PCI driver");
|
|
MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
|
|
MODULE_LICENSE("GPL v2");
|