Skip to content

Commit

Permalink
ipc: Added platform data structure
Browse files Browse the repository at this point in the history
Since the same ipc driver can be used by many platforms, using
macros for defining ipc_base and i2c_base addresses is not
a scalable approach. So added a platform data structure to pass
this information.

Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Acked-by: Alan Cox <gnomes@lxorguk.ukuu.org.uk>
Cc: David Cohen <david.a.cohen@linux.intel.com>
Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
  • Loading branch information
Kuppuswamy Sathyanarayanan authored and Matthew Garrett committed Nov 20, 2013
1 parent cab6661 commit e97a1c9
Showing 1 changed file with 29 additions and 8 deletions.
37 changes: 29 additions & 8 deletions drivers/platform/x86/intel_scu_ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit e97a1c9

Please sign in to comment.