|
@@ -58,12 +58,29 @@
|
|
|
* message handler is called within firmware.
|
|
|
*/
|
|
|
|
|
|
-#define IPC_BASE_ADDR 0xFF11C000 /* IPC1 base register address */
|
|
|
-#define IPC_MAX_ADDR 0x100 /* Maximum IPC regisers */
|
|
|
#define IPC_WWBUF_SIZE 20 /* IPC Write buffer Size */
|
|
|
#define IPC_RWBUF_SIZE 20 /* IPC Read buffer Size */
|
|
|
-#define IPC_I2C_BASE 0xFF12B000 /* I2C control register base address */
|
|
|
-#define IPC_I2C_MAX_ADDR 0x10 /* Maximum I2C regisers */
|
|
|
+
|
|
|
+enum {
|
|
|
+ SCU_IPC_LINCROFT,
|
|
|
+};
|
|
|
+
|
|
|
+/* intel scu ipc driver data*/
|
|
|
+struct intel_scu_ipc_pdata_t {
|
|
|
+ u32 ipc_base;
|
|
|
+ u32 i2c_base;
|
|
|
+ u32 ipc_len;
|
|
|
+ u32 i2c_len;
|
|
|
+};
|
|
|
+
|
|
|
+static struct intel_scu_ipc_pdata_t intel_scu_ipc_pdata[] = {
|
|
|
+ [SCU_IPC_LINCROFT] = {
|
|
|
+ .ipc_base = 0xff11c000,
|
|
|
+ .i2c_base = 0xff12b000,
|
|
|
+ .ipc_len = 0x100,
|
|
|
+ .i2c_len = 0x10,
|
|
|
+ },
|
|
|
+};
|
|
|
|
|
|
static int ipc_probe(struct pci_dev *dev, const struct pci_device_id *id);
|
|
|
static void ipc_remove(struct pci_dev *pdev);
|
|
@@ -504,12 +521,16 @@ static irqreturn_t ioc(int irq, void *dev_id)
|
|
|
*/
|
|
|
static int ipc_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|
|
{
|
|
|
- int err;
|
|
|
+ int err, pid;
|
|
|
+ struct intel_scu_ipc_pdata_t *pdata;
|
|
|
resource_size_t pci_resource;
|
|
|
|
|
|
if (ipcdev.pdev) /* We support only one SCU */
|
|
|
return -EBUSY;
|
|
|
|
|
|
+ pid = id->driver_data;
|
|
|
+ pdata = &intel_scu_ipc_pdata[pid];
|
|
|
+
|
|
|
ipcdev.pdev = pci_dev_get(dev);
|
|
|
|
|
|
err = pci_enable_device(dev);
|
|
@@ -527,11 +548,11 @@ static int ipc_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|
|
if (request_irq(dev->irq, ioc, 0, "intel_scu_ipc", &ipcdev))
|
|
|
return -EBUSY;
|
|
|
|
|
|
- ipcdev.ipc_base = ioremap_nocache(IPC_BASE_ADDR, IPC_MAX_ADDR);
|
|
|
+ ipcdev.ipc_base = ioremap_nocache(pdata->ipc_base, pdata->ipc_len);
|
|
|
if (!ipcdev.ipc_base)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- ipcdev.i2c_base = ioremap_nocache(IPC_I2C_BASE, IPC_I2C_MAX_ADDR);
|
|
|
+ ipcdev.i2c_base = ioremap_nocache(pdata->i2c_base, pdata->i2c_len);
|
|
|
if (!ipcdev.i2c_base) {
|
|
|
iounmap(ipcdev.ipc_base);
|
|
|
return -ENOMEM;
|
|
@@ -564,7 +585,7 @@ static void ipc_remove(struct pci_dev *pdev)
|
|
|
}
|
|
|
|
|
|
static DEFINE_PCI_DEVICE_TABLE(pci_ids) = {
|
|
|
- {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x082a)},
|
|
|
+ {PCI_VDEVICE(INTEL, 0x082a), SCU_IPC_LINCROFT},
|
|
|
{ 0,}
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(pci, pci_ids);
|