2019-06-04 10:11:33 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2017-06-29 14:45:42 +03:00
/*
* Intel PCH / PCU SPI flash PCI driver .
*
2022-02-09 15:27:05 +03:00
* Copyright ( C ) 2016 - 2022 , Intel Corporation
2017-06-29 14:45:42 +03:00
* Author : Mika Westerberg < mika . westerberg @ linux . intel . com >
*/
# include <linux/module.h>
# include <linux/pci.h>
2022-02-09 15:27:05 +03:00
# include "spi-intel.h"
2017-06-29 14:45:42 +03:00
# define BCR 0xdc
# define BCR_WPD BIT(0)
2022-02-09 15:27:04 +03:00
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 ;
}
2017-06-29 14:45:42 +03:00
static const struct intel_spi_boardinfo bxt_info = {
. type = INTEL_SPI_BXT ,
2022-02-09 15:27:04 +03:00
. set_writeable = intel_spi_pci_set_writeable ,
2017-06-29 14:45:42 +03:00
} ;
2019-09-04 01:15:24 +00:00
static const struct intel_spi_boardinfo cnl_info = {
. type = INTEL_SPI_CNL ,
2022-02-09 15:27:04 +03:00
. set_writeable = intel_spi_pci_set_writeable ,
2019-09-04 01:15:24 +00:00
} ;
2017-06-29 14:45:42 +03:00
static int intel_spi_pci_probe ( struct pci_dev * pdev ,
const struct pci_device_id * id )
{
struct intel_spi_boardinfo * info ;
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 ;
2022-02-09 15:27:04 +03:00
info - > data = pdev ;
2022-02-09 15:27:05 +03:00
return intel_spi_probe ( & pdev - > dev , & pdev - > resource [ 0 ] , info ) ;
2017-06-29 14:45:42 +03:00
}
static const struct pci_device_id intel_spi_pci_ids [ ] = {
2023-02-01 17:54:54 -03:00
{ PCI_VDEVICE ( INTEL , 0x02a4 ) , ( unsigned long ) & cnl_info } ,
{ PCI_VDEVICE ( INTEL , 0x06a4 ) , ( unsigned long ) & cnl_info } ,
2017-09-21 16:19:46 +03:00
{ PCI_VDEVICE ( INTEL , 0x18e0 ) , ( unsigned long ) & bxt_info } ,
2017-06-29 14:45:42 +03:00
{ PCI_VDEVICE ( INTEL , 0x19e0 ) , ( unsigned long ) & bxt_info } ,
2020-06-15 18:57:48 +03:00
{ PCI_VDEVICE ( INTEL , 0x1bca ) , ( unsigned long ) & bxt_info } ,
2023-02-01 17:54:54 -03:00
{ PCI_VDEVICE ( INTEL , 0x34a4 ) , ( unsigned long ) & cnl_info } ,
2022-02-15 15:51:39 +02:00
{ PCI_VDEVICE ( INTEL , 0x38a4 ) , ( unsigned long ) & bxt_info } ,
2020-06-24 22:21:03 +03:00
{ PCI_VDEVICE ( INTEL , 0x43a4 ) , ( unsigned long ) & cnl_info } ,
2019-06-20 15:26:28 +03:00
{ PCI_VDEVICE ( INTEL , 0x4b24 ) , ( unsigned long ) & bxt_info } ,
2019-12-10 12:11:11 +03:00
{ PCI_VDEVICE ( INTEL , 0x4da4 ) , ( unsigned long ) & bxt_info } ,
2021-01-13 13:15:45 +03:00
{ PCI_VDEVICE ( INTEL , 0x51a4 ) , ( unsigned long ) & cnl_info } ,
2021-04-15 13:11:38 +03:00
{ PCI_VDEVICE ( INTEL , 0x54a4 ) , ( unsigned long ) & cnl_info } ,
2022-04-11 14:21:16 +03:00
{ PCI_VDEVICE ( INTEL , 0x7a24 ) , ( unsigned long ) & cnl_info } ,
2020-09-25 12:51:09 +03:00
{ PCI_VDEVICE ( INTEL , 0x7aa4 ) , ( unsigned long ) & cnl_info } ,
2022-06-29 14:34:03 +03:00
{ PCI_VDEVICE ( INTEL , 0x7e23 ) , ( unsigned long ) & cnl_info } ,
2023-02-01 17:54:55 -03:00
{ PCI_VDEVICE ( INTEL , 0x9d24 ) , ( unsigned long ) & cnl_info } ,
{ PCI_VDEVICE ( INTEL , 0x9da4 ) , ( unsigned long ) & cnl_info } ,
2023-02-01 17:54:54 -03:00
{ PCI_VDEVICE ( INTEL , 0xa0a4 ) , ( unsigned long ) & cnl_info } ,
2017-09-21 16:19:45 +03:00
{ PCI_VDEVICE ( INTEL , 0xa1a4 ) , ( unsigned long ) & bxt_info } ,
2017-10-29 15:17:35 -07:00
{ PCI_VDEVICE ( INTEL , 0xa224 ) , ( unsigned long ) & bxt_info } ,
2023-02-01 17:54:55 -03:00
{ PCI_VDEVICE ( INTEL , 0xa2a4 ) , ( unsigned long ) & cnl_info } ,
2019-09-04 01:15:24 +00:00
{ PCI_VDEVICE ( INTEL , 0xa324 ) , ( unsigned long ) & cnl_info } ,
2023-02-01 17:54:54 -03:00
{ PCI_VDEVICE ( INTEL , 0xa3a4 ) , ( unsigned long ) & cnl_info } ,
2023-03-31 08:28:12 +03:00
{ PCI_VDEVICE ( INTEL , 0xae23 ) , ( unsigned long ) & cnl_info } ,
2017-06-29 14:45:42 +03:00
{ } ,
} ;
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 ,
} ;
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 " ) ;