Commit 1da4b1c6 authored by Feng Tang's avatar Feng Tang Committed by Thomas Gleixner

x86/mrst: Add SFI platform device parsing code

SFI provides a series of tables. These describe the platform devices present
including SPI and I²C devices, as well as various sensors, keypads and other
glue as well as interfaces provided via the SCU IPC mechanism (intel_scu_ipc.c)

This patch is a merge of the core elements and relevant fixes from the
Intel development code by Feng, Alek, myself into a single coherent patch
for upstream submission.

It provides the needed infrastructure to register I2C, SPI and platform devices
described by the tables, as well as handlers for some of the hardware already
supported in kernel. The 0.8 firmware also provides GPIO tables.

Devices are created at boot time or if they are SCU dependant at the point an
SCU is discovered. The existing Linux device mechanisms will then handle the
device binding. At an abstract level this is an SFI to Linux device translator.

Device/platform specific setup/glue is in this file. This is done so that the
drivers for the generic I²C and SPI bus devices remain cross platform as they
should.

(Updated from RFC version to correct the emc1403 name used by the firmware
 and a wrongly used #define)
Signed-off-by: default avatarAlek Du <alek.du@linux.intel.com>
LKML-Reference: <20101109112158.20013.6158.stgit@localhost.localdomain>
[Clean ups, removal of 0.7 support]
Signed-off-by: default avatarFeng Tang <feng.tang@linux.intel.com>
[Clean ups]
Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 814ce252
...@@ -385,6 +385,8 @@ config X86_MRST ...@@ -385,6 +385,8 @@ config X86_MRST
depends on X86_EXTENDED_PLATFORM depends on X86_EXTENDED_PLATFORM
depends on X86_IO_APIC depends on X86_IO_APIC
select APB_TIMER select APB_TIMER
select I2C
select SPI
---help--- ---help---
Moorestown is Intel's Low Power Intel Architecture (LPIA) based Moblin Moorestown is Intel's Low Power Intel Architecture (LPIA) based Moblin
Internet Device(MID) platform. Moorestown consists of two chips: Internet Device(MID) platform. Moorestown consists of two chips:
......
...@@ -50,4 +50,8 @@ extern void mrst_early_console_init(void); ...@@ -50,4 +50,8 @@ extern void mrst_early_console_init(void);
extern struct console early_hsu_console; extern struct console early_hsu_console;
extern void hsu_early_console_init(void); extern void hsu_early_console_init(void);
extern void intel_scu_devices_create(void);
extern void intel_scu_devices_destroy(void);
#endif /* _ASM_X86_MRST_H */ #endif /* _ASM_X86_MRST_H */
This diff is collapsed.
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/sfi.h> #include <linux/sfi.h>
#include <asm/mrst.h> #include <asm/mrst.h>
#include <asm/intel_scu_ipc.h> #include <asm/intel_scu_ipc.h>
#include <asm/mrst.h>
/* IPC defines the following message types */ /* IPC defines the following message types */
#define IPCMSG_WATCHDOG_TIMER 0xF8 /* Set Kernel Watchdog Threshold */ #define IPCMSG_WATCHDOG_TIMER 0xF8 /* Set Kernel Watchdog Threshold */
...@@ -699,6 +700,9 @@ static int ipc_probe(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -699,6 +700,9 @@ static int ipc_probe(struct pci_dev *dev, const struct pci_device_id *id)
iounmap(ipcdev.ipc_base); iounmap(ipcdev.ipc_base);
return -ENOMEM; return -ENOMEM;
} }
intel_scu_devices_create();
return 0; return 0;
} }
...@@ -720,6 +724,7 @@ static void ipc_remove(struct pci_dev *pdev) ...@@ -720,6 +724,7 @@ static void ipc_remove(struct pci_dev *pdev)
iounmap(ipcdev.ipc_base); iounmap(ipcdev.ipc_base);
iounmap(ipcdev.i2c_base); iounmap(ipcdev.i2c_base);
ipcdev.pdev = NULL; ipcdev.pdev = NULL;
intel_scu_devices_destroy();
} }
static const struct pci_device_id pci_ids[] = { static const struct pci_device_id pci_ids[] = {
......
...@@ -77,6 +77,8 @@ ...@@ -77,6 +77,8 @@
#define SFI_OEM_ID_SIZE 6 #define SFI_OEM_ID_SIZE 6
#define SFI_OEM_TABLE_ID_SIZE 8 #define SFI_OEM_TABLE_ID_SIZE 8
#define SFI_NAME_LEN 16
#define SFI_SYST_SEARCH_BEGIN 0x000E0000 #define SFI_SYST_SEARCH_BEGIN 0x000E0000
#define SFI_SYST_SEARCH_END 0x000FFFFF #define SFI_SYST_SEARCH_END 0x000FFFFF
...@@ -156,13 +158,13 @@ struct sfi_device_table_entry { ...@@ -156,13 +158,13 @@ struct sfi_device_table_entry {
u16 addr; u16 addr;
u8 irq; u8 irq;
u32 max_freq; u32 max_freq;
char name[16]; char name[SFI_NAME_LEN];
} __packed; } __packed;
struct sfi_gpio_table_entry { struct sfi_gpio_table_entry {
char controller_name[16]; char controller_name[SFI_NAME_LEN];
u16 pin_no; u16 pin_no;
char pin_name[16]; char pin_name[SFI_NAME_LEN];
} __packed; } __packed;
typedef int (*sfi_table_handler) (struct sfi_table_header *table); typedef int (*sfi_table_handler) (struct sfi_table_header *table);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment