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 .
*
* Copyright ( C ) 2016 , Intel Corporation
* Author : Mika Westerberg < mika . westerberg @ linux . intel . com >
*/
# include <linux/ioport.h>
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/pci.h>
# include "intel-spi.h"
# define BCR 0xdc
# define BCR_WPD BIT(0)
static const struct intel_spi_boardinfo bxt_info = {
. type = INTEL_SPI_BXT ,
} ;
2019-09-04 01:15:24 +00:00
static const struct intel_spi_boardinfo cnl_info = {
. type = INTEL_SPI_CNL ,
} ;
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 ;
struct intel_spi * ispi ;
u32 bcr ;
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 ;
/* 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 ) ;
}
info - > writeable = ! ! ( bcr & BCR_WPD ) ;
ispi = intel_spi_probe ( & pdev - > dev , & pdev - > resource [ 0 ] , info ) ;
if ( IS_ERR ( ispi ) )
return PTR_ERR ( ispi ) ;
pci_set_drvdata ( pdev , ispi ) ;
return 0 ;
}
static void intel_spi_pci_remove ( struct pci_dev * pdev )
{
intel_spi_remove ( pci_get_drvdata ( pdev ) ) ;
}
static const struct pci_device_id intel_spi_pci_ids [ ] = {
2019-04-16 12:11:10 +03:00
{ PCI_VDEVICE ( INTEL , 0x02a4 ) , ( unsigned long ) & bxt_info } ,
2019-10-23 17:51:40 +03:00
{ PCI_VDEVICE ( INTEL , 0x06a4 ) , ( unsigned long ) & bxt_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 } ,
2018-08-30 11:42:57 +03:00
{ PCI_VDEVICE ( INTEL , 0x34a4 ) , ( 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 } ,
2020-09-25 12:51:09 +03:00
{ PCI_VDEVICE ( INTEL , 0x7aa4 ) , ( unsigned long ) & cnl_info } ,
2019-08-12 17:03:54 +03:00
{ PCI_VDEVICE ( INTEL , 0xa0a4 ) , ( unsigned long ) & bxt_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 } ,
2019-09-04 01:15:24 +00:00
{ PCI_VDEVICE ( INTEL , 0xa324 ) , ( unsigned long ) & cnl_info } ,
2020-01-09 15:14:02 +03:00
{ PCI_VDEVICE ( INTEL , 0xa3a4 ) , ( unsigned long ) & bxt_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 ,
. remove = intel_spi_pci_remove ,
} ;
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 " ) ;