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 <andriy.shevchenko@linux.intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1468322192-62080-1-git-send-email-andriy.shevchenko@linux.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Andy Shevchenko 2016-07-12 14:16:32 +03:00 коммит произвёл Ingo Molnar
Родитель 707a605b5a
Коммит 05f310e26f
3 изменённых файлов: 45 добавлений и 0 удалений

Просмотреть файл

@ -49,6 +49,21 @@ struct devs_id {
static const struct devs_id *const __intel_mid_sfi_##i##_dev __used \ static const struct devs_id *const __intel_mid_sfi_##i##_dev __used \
__attribute__((__section__(".x86_intel_mid_dev.init"))) = &i __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 * 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 * one. Other than that it also added always-on and constant tsc and lapic

Просмотреть файл

@ -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); 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[], extern struct devs_id *const __x86_intel_mid_dev_start[],
*const __x86_intel_mid_dev_end[]; *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: case SFI_DEV_TYPE_I2C:
sfi_handle_i2c_dev(pentry, dev); sfi_handle_i2c_dev(pentry, dev);
break; break;
case SFI_DEV_TYPE_SD:
sfi_handle_sd_dev(pentry, dev);
break;
case SFI_DEV_TYPE_UART: case SFI_DEV_TYPE_UART:
case SFI_DEV_TYPE_HSI: case SFI_DEV_TYPE_HSI:
default: default:

Просмотреть файл

@ -156,6 +156,7 @@ struct sfi_device_table_entry {
#define SFI_DEV_TYPE_UART 2 #define SFI_DEV_TYPE_UART 2
#define SFI_DEV_TYPE_HSI 3 #define SFI_DEV_TYPE_HSI 3
#define SFI_DEV_TYPE_IPC 4 #define SFI_DEV_TYPE_IPC 4
#define SFI_DEV_TYPE_SD 5
u8 host_num; /* attached to host 0, 1...*/ u8 host_num; /* attached to host 0, 1...*/
u16 addr; u16 addr;