File Index
Files and directories
Sign in
FILE

spi-intel-pci.c

File preview with syntax highlighting.

linux-6.19.14/drivers/spi/spi-intel-pci.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Intel PCH/PCU SPI flash PCI driver.
  4 *
  5 * Copyright (C) 2016 - 2022, Intel Corporation
  6 * Author: Mika Westerberg <mika.westerberg@linux.intel.com>
  7 */
  8
  9#include <linux/module.h>
 10#include <linux/pci.h>
 11
 12#include "spi-intel.h"
 13
 14#define BCR		0xdc
 15#define BCR_WPD		BIT(0)
 16
 17static bool intel_spi_pci_set_writeable(void __iomem *base, void *data)
 18{
 19	struct pci_dev *pdev = data;
 20	u32 bcr;
 21
 22	/* Try to make the chip read/write */
 23	pci_read_config_dword(pdev, BCR, &bcr);
 24	if (!(bcr & BCR_WPD)) {
 25		bcr |= BCR_WPD;
 26		pci_write_config_dword(pdev, BCR, bcr);
 27		pci_read_config_dword(pdev, BCR, &bcr);
 28	}
 29
 30	return bcr & BCR_WPD;
 31}
 32
 33static const struct intel_spi_boardinfo bxt_info = {
 34	.type = INTEL_SPI_BXT,
 35	.set_writeable = intel_spi_pci_set_writeable,
 36};
 37
 38static const struct intel_spi_boardinfo cnl_info = {
 39	.type = INTEL_SPI_CNL,
 40	.set_writeable = intel_spi_pci_set_writeable,
 41};
 42
 43static int intel_spi_pci_probe(struct pci_dev *pdev,
 44			       const struct pci_device_id *id)
 45{
 46	struct intel_spi_boardinfo *info;
 47	void __iomem *base;
 48	int ret;
 49
 50	ret = pcim_enable_device(pdev);
 51	if (ret)
 52		return ret;
 53
 54	info = devm_kmemdup(&pdev->dev, (void *)id->driver_data, sizeof(*info),
 55			    GFP_KERNEL);
 56	if (!info)
 57		return -ENOMEM;
 58
 59	info->data = pdev;
 60
 61	base = pcim_iomap_region(pdev, 0, KBUILD_MODNAME);
 62	if (IS_ERR(base))
 63		return PTR_ERR(base);
 64
 65	return intel_spi_probe(&pdev->dev, base, info);
 66}
 67
 68static const struct pci_device_id intel_spi_pci_ids[] = {
 69	{ PCI_VDEVICE(INTEL, 0x02a4), (unsigned long)&cnl_info },
 70	{ PCI_VDEVICE(INTEL, 0x06a4), (unsigned long)&cnl_info },
 71	{ PCI_VDEVICE(INTEL, 0x18e0), (unsigned long)&bxt_info },
 72	{ PCI_VDEVICE(INTEL, 0x19e0), (unsigned long)&bxt_info },
 73	{ PCI_VDEVICE(INTEL, 0x1bca), (unsigned long)&bxt_info },
 74	{ PCI_VDEVICE(INTEL, 0x34a4), (unsigned long)&cnl_info },
 75	{ PCI_VDEVICE(INTEL, 0x38a4), (unsigned long)&bxt_info },
 76	{ PCI_VDEVICE(INTEL, 0x43a4), (unsigned long)&cnl_info },
 77	{ PCI_VDEVICE(INTEL, 0x4b24), (unsigned long)&bxt_info },
 78	{ PCI_VDEVICE(INTEL, 0x4d23), (unsigned long)&cnl_info },
 79	{ PCI_VDEVICE(INTEL, 0x4da4), (unsigned long)&bxt_info },
 80	{ PCI_VDEVICE(INTEL, 0x51a4), (unsigned long)&cnl_info },
 81	{ PCI_VDEVICE(INTEL, 0x54a4), (unsigned long)&cnl_info },
 82	{ PCI_VDEVICE(INTEL, 0x5794), (unsigned long)&cnl_info },
 83	{ PCI_VDEVICE(INTEL, 0x5825), (unsigned long)&cnl_info },
 84	{ PCI_VDEVICE(INTEL, 0x6e24), (unsigned long)&cnl_info },
 85	{ PCI_VDEVICE(INTEL, 0x7723), (unsigned long)&cnl_info },
 86	{ PCI_VDEVICE(INTEL, 0x7a24), (unsigned long)&cnl_info },
 87	{ PCI_VDEVICE(INTEL, 0x7aa4), (unsigned long)&cnl_info },
 88	{ PCI_VDEVICE(INTEL, 0x7e23), (unsigned long)&cnl_info },
 89	{ PCI_VDEVICE(INTEL, 0x7f24), (unsigned long)&cnl_info },
 90	{ PCI_VDEVICE(INTEL, 0x9d24), (unsigned long)&cnl_info },
 91	{ PCI_VDEVICE(INTEL, 0x9da4), (unsigned long)&cnl_info },
 92	{ PCI_VDEVICE(INTEL, 0xa0a4), (unsigned long)&cnl_info },
 93	{ PCI_VDEVICE(INTEL, 0xa1a4), (unsigned long)&bxt_info },
 94	{ PCI_VDEVICE(INTEL, 0xa224), (unsigned long)&bxt_info },
 95	{ PCI_VDEVICE(INTEL, 0xa2a4), (unsigned long)&cnl_info },
 96	{ PCI_VDEVICE(INTEL, 0xa324), (unsigned long)&cnl_info },
 97	{ PCI_VDEVICE(INTEL, 0xa3a4), (unsigned long)&cnl_info },
 98	{ PCI_VDEVICE(INTEL, 0xa823), (unsigned long)&cnl_info },
 99	{ PCI_VDEVICE(INTEL, 0xd323), (unsigned long)&cnl_info },
100	{ PCI_VDEVICE(INTEL, 0xe323), (unsigned long)&cnl_info },
101	{ PCI_VDEVICE(INTEL, 0xe423), (unsigned long)&cnl_info },
102	{ },
103};
104MODULE_DEVICE_TABLE(pci, intel_spi_pci_ids);
105
106static struct pci_driver intel_spi_pci_driver = {
107	.name = "intel-spi",
108	.id_table = intel_spi_pci_ids,
109	.probe = intel_spi_pci_probe,
110	.dev_groups = intel_spi_groups,
111};
112
113module_pci_driver(intel_spi_pci_driver);
114
115MODULE_DESCRIPTION("Intel PCH/PCU SPI flash PCI driver");
116MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
117MODULE_LICENSE("GPL v2");
~/ Read-only file preview.