Commit-ID:  05f310e26fe9d97fec0ce1752edc16bf1ea55a2d
Gitweb:     http://git.kernel.org/tip/05f310e26fe9d97fec0ce1752edc16bf1ea55a2d
Author:     Andy Shevchenko <[email protected]>
AuthorDate: Tue, 12 Jul 2016 14:16:32 +0300
Committer:  Ingo Molnar <[email protected]>
CommitDate: Wed, 13 Jul 2016 09:24:51 +0200

x86/sfi: Enable enumeration of SD devices

SFI specification v0.8.2 defines type of devices which are connected to
SD bus. In particularly WiFi dongle is a such.

Add a callback to enumerate the devices connected to SD bus.

Signed-off-by: Andy Shevchenko <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Link: 
http://lkml.kernel.org/r/1468322192-62080-1-git-send-email-andriy.shevche...@linux.intel.com
Signed-off-by: Ingo Molnar <[email protected]>
---
 arch/x86/include/asm/intel-mid.h  | 15 +++++++++++++++
 arch/x86/platform/intel-mid/sfi.c | 29 +++++++++++++++++++++++++++++
 include/linux/sfi.h               |  1 +
 3 files changed, 45 insertions(+)

diff --git a/arch/x86/include/asm/intel-mid.h b/arch/x86/include/asm/intel-mid.h
index 59013a2..9d6b097 100644
--- a/arch/x86/include/asm/intel-mid.h
+++ b/arch/x86/include/asm/intel-mid.h
@@ -49,6 +49,21 @@ struct devs_id {
        static const struct devs_id *const __intel_mid_sfi_##i##_dev __used     
\
        __attribute__((__section__(".x86_intel_mid_dev.init"))) = &i
 
+/**
+* struct mid_sd_board_info - template for SD device creation
+* @name:               identifies the driver
+* @bus_num:            board-specific identifier for a given SD controller
+* @max_clk:            the maximum frequency device supports
+* @platform_data:      the particular data stored there is driver-specific
+*/
+struct mid_sd_board_info {
+       char            name[SFI_NAME_LEN];
+       int             bus_num;
+       unsigned short  addr;
+       u32             max_clk;
+       void            *platform_data;
+};
+
 /*
  * Medfield is the follow-up of Moorestown, it combines two chip solution into
  * one. Other than that it also added always-on and constant tsc and lapic
diff --git a/arch/x86/platform/intel-mid/sfi.c 
b/arch/x86/platform/intel-mid/sfi.c
index 5ee360a..1555672 100644
--- a/arch/x86/platform/intel-mid/sfi.c
+++ b/arch/x86/platform/intel-mid/sfi.c
@@ -407,6 +407,32 @@ static void __init sfi_handle_i2c_dev(struct 
sfi_device_table_entry *pentry,
                i2c_register_board_info(pentry->host_num, &i2c_info, 1);
 }
 
+static void __init sfi_handle_sd_dev(struct sfi_device_table_entry *pentry,
+                                       struct devs_id *dev)
+{
+       struct mid_sd_board_info sd_info;
+       void *pdata;
+
+       memset(&sd_info, 0, sizeof(sd_info));
+       strncpy(sd_info.name, pentry->name, SFI_NAME_LEN);
+       sd_info.bus_num = pentry->host_num;
+       sd_info.max_clk = pentry->max_freq;
+       sd_info.addr = pentry->addr;
+       pr_debug("SD bus = %d, name = %16.16s, max_clk = %d, addr = 0x%x\n",
+                sd_info.bus_num,
+                sd_info.name,
+                sd_info.max_clk,
+                sd_info.addr);
+       pdata = intel_mid_sfi_get_pdata(dev, &sd_info);
+       if (IS_ERR(pdata))
+               return;
+
+       /* Nothing we can do with this for now */
+       sd_info.platform_data = pdata;
+
+       pr_debug("Successfully registered %16.16s", sd_info.name);
+}
+
 extern struct devs_id *const __x86_intel_mid_dev_start[],
                      *const __x86_intel_mid_dev_end[];
 
@@ -490,6 +516,9 @@ static int __init sfi_parse_devs(struct sfi_table_header 
*table)
                        case SFI_DEV_TYPE_I2C:
                                sfi_handle_i2c_dev(pentry, dev);
                                break;
+                       case SFI_DEV_TYPE_SD:
+                               sfi_handle_sd_dev(pentry, dev);
+                               break;
                        case SFI_DEV_TYPE_UART:
                        case SFI_DEV_TYPE_HSI:
                        default:
diff --git a/include/linux/sfi.h b/include/linux/sfi.h
index d9b436f..e0e1597 100644
--- a/include/linux/sfi.h
+++ b/include/linux/sfi.h
@@ -156,6 +156,7 @@ struct sfi_device_table_entry {
 #define SFI_DEV_TYPE_UART      2
 #define SFI_DEV_TYPE_HSI       3
 #define SFI_DEV_TYPE_IPC       4
+#define SFI_DEV_TYPE_SD                5
 
        u8      host_num;       /* attached to host 0, 1...*/
        u16     addr;

Reply via email to