-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
intel_mid: Move platform device setups to their own platform_<device>…
….* files As Intel rolling out more SoC's after Moorestown, we need to re-structure the code in a way that is backward compatible and easy to expand. This patch implements a flexible way to support multiple boards and devices. This patch does not add any new functional support. It just refactors the existing code to increase the modularity and decrease the code duplication for supporting multiple soc's and boards. Currently intel-mid.c has both board and soc related code in one file. This patch moves the board related code to new files and let linker script to create SFI devite table following this: 1. Move the SFI device specific code to arch/x86/platform/intel-mid/device-libs/platform_<device>.* A new device file is added for every supported device. This code will get conditionally compiled by using corresponding device driver CONFIG option. 2. Move the device_ids location to .x86_intel_mid_dev.init section by using new sfi_device() macro. This patch was based on previous code from Sathyanarayanan Kuppuswamy. Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Link: http://lkml.kernel.org/r/1382049336-21316-13-git-send-email-david.a.cohen@linux.intel.com Signed-off-by: David Cohen <david.a.cohen@linux.intel.com> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
- Loading branch information
David Cohen
authored and
H. Peter Anvin
committed
Oct 17, 2013
1 parent
66ac501
commit 40a96d5
Showing
26 changed files
with
978 additions
and
429 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,7 @@ | ||
obj-$(CONFIG_X86_INTEL_MID) += intel-mid.o | ||
obj-$(CONFIG_X86_INTEL_MID) += intel_mid_vrtc.o | ||
obj-$(CONFIG_EARLY_PRINTK_INTEL_MID) += early_printk_intel_mid.o | ||
obj-$(CONFIG_X86_INTEL_MID) += intel_mid_vrtc.o | ||
obj-$(CONFIG_EARLY_PRINTK_INTEL_MID) += early_printk_intel_mid.o | ||
# SFI specific code | ||
obj-$(CONFIG_SFI) += sfi.o | ||
ifdef CONFIG_X86_INTEL_MID | ||
obj-$(CONFIG_SFI) += sfi.o device_libs/ | ||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
# IPC Devices | ||
obj-y += platform_ipc.o | ||
obj-$(subst m,y,$(CONFIG_MFD_INTEL_MSIC)) += platform_msic.o | ||
obj-$(subst m,y,$(CONFIG_SND_MFLD_MACHINE)) += platform_msic_audio.o | ||
obj-$(subst m,y,$(CONFIG_GPIO_MSIC)) += platform_msic_gpio.o | ||
obj-$(subst m,y,$(CONFIG_MFD_INTEL_MSIC)) += platform_msic_ocd.o | ||
obj-$(subst m,y,$(CONFIG_MFD_INTEL_MSIC)) += platform_msic_battery.o | ||
obj-$(subst m,y,$(CONFIG_INTEL_MID_POWER_BUTTON)) += platform_msic_power_btn.o | ||
obj-$(subst m,y,$(CONFIG_GPIO_INTEL_PMIC)) += platform_pmic_gpio.o | ||
obj-$(subst m,y,$(CONFIG_INTEL_MFLD_THERMAL)) += platform_msic_thermal.o | ||
# I2C Devices | ||
obj-$(subst m,y,$(CONFIG_SENSORS_EMC1403)) += platform_emc1403.o | ||
obj-$(subst m,y,$(CONFIG_SENSORS_LIS3LV02D)) += platform_lis331.o | ||
obj-$(subst m,y,$(CONFIG_GPIO_PCA953X)) += platform_max7315.o | ||
obj-$(subst m,y,$(CONFIG_INPUT_MPU3050)) += platform_mpu3050.o | ||
obj-$(subst m,y,$(CONFIG_INPUT_BMA150)) += platform_bma023.o | ||
obj-$(subst m,y,$(CONFIG_GPIO_PCA953X)) += platform_tca6416.o | ||
obj-$(subst m,y,$(CONFIG_DRM_MEDFIELD)) += platform_tc35876x.o | ||
# SPI Devices | ||
obj-$(subst m,y,$(CONFIG_SERIAL_MRST_MAX3110)) += platform_max3111.o | ||
# MISC Devices | ||
obj-$(subst m,y,$(CONFIG_KEYBOARD_GPIO)) += platform_gpio_keys.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* | ||
* platform_bma023.c: bma023 platform data initilization file | ||
* | ||
* (C) Copyright 2013 Intel Corporation | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; version 2 | ||
* of the License. | ||
*/ | ||
|
||
#include <asm/intel-mid.h> | ||
|
||
static const struct devs_id bma023_dev_id __initconst = { | ||
.name = "bma023", | ||
.type = SFI_DEV_TYPE_I2C, | ||
.delay = 1, | ||
}; | ||
|
||
sfi_device(bma023_dev_id); |
41 changes: 41 additions & 0 deletions
41
arch/x86/platform/intel-mid/device_libs/platform_emc1403.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* | ||
* platform_emc1403.c: emc1403 platform data initilization file | ||
* | ||
* (C) Copyright 2013 Intel Corporation | ||
* Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; version 2 | ||
* of the License. | ||
*/ | ||
|
||
#include <linux/init.h> | ||
#include <linux/gpio.h> | ||
#include <linux/i2c.h> | ||
#include <asm/intel-mid.h> | ||
|
||
static void __init *emc1403_platform_data(void *info) | ||
{ | ||
static short intr2nd_pdata; | ||
struct i2c_board_info *i2c_info = info; | ||
int intr = get_gpio_by_name("thermal_int"); | ||
int intr2nd = get_gpio_by_name("thermal_alert"); | ||
|
||
if (intr == -1 || intr2nd == -1) | ||
return NULL; | ||
|
||
i2c_info->irq = intr + INTEL_MID_IRQ_OFFSET; | ||
intr2nd_pdata = intr2nd + INTEL_MID_IRQ_OFFSET; | ||
|
||
return &intr2nd_pdata; | ||
} | ||
|
||
static const struct devs_id emc1403_dev_id __initconst = { | ||
.name = "emc1403", | ||
.type = SFI_DEV_TYPE_I2C, | ||
.delay = 1, | ||
.get_platform_data = &emc1403_platform_data, | ||
}; | ||
|
||
sfi_device(emc1403_dev_id); |
83 changes: 83 additions & 0 deletions
83
arch/x86/platform/intel-mid/device_libs/platform_gpio_keys.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
/* | ||
* platform_gpio_keys.c: gpio_keys platform data initilization file | ||
* | ||
* (C) Copyright 2013 Intel Corporation | ||
* Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; version 2 | ||
* of the License. | ||
*/ | ||
|
||
#include <linux/input.h> | ||
#include <linux/init.h> | ||
#include <linux/kernel.h> | ||
#include <linux/gpio.h> | ||
#include <linux/gpio_keys.h> | ||
#include <linux/platform_device.h> | ||
#include <asm/intel-mid.h> | ||
|
||
#define DEVICE_NAME "gpio-keys" | ||
|
||
/* | ||
* we will search these buttons in SFI GPIO table (by name) | ||
* and register them dynamically. Please add all possible | ||
* buttons here, we will shrink them if no GPIO found. | ||
*/ | ||
static struct gpio_keys_button gpio_button[] = { | ||
{KEY_POWER, -1, 1, "power_btn", EV_KEY, 0, 3000}, | ||
{KEY_PROG1, -1, 1, "prog_btn1", EV_KEY, 0, 20}, | ||
{KEY_PROG2, -1, 1, "prog_btn2", EV_KEY, 0, 20}, | ||
{SW_LID, -1, 1, "lid_switch", EV_SW, 0, 20}, | ||
{KEY_VOLUMEUP, -1, 1, "vol_up", EV_KEY, 0, 20}, | ||
{KEY_VOLUMEDOWN, -1, 1, "vol_down", EV_KEY, 0, 20}, | ||
{KEY_CAMERA, -1, 1, "camera_full", EV_KEY, 0, 20}, | ||
{KEY_CAMERA_FOCUS, -1, 1, "camera_half", EV_KEY, 0, 20}, | ||
{SW_KEYPAD_SLIDE, -1, 1, "MagSw1", EV_SW, 0, 20}, | ||
{SW_KEYPAD_SLIDE, -1, 1, "MagSw2", EV_SW, 0, 20}, | ||
}; | ||
|
||
static struct gpio_keys_platform_data gpio_keys = { | ||
.buttons = gpio_button, | ||
.rep = 1, | ||
.nbuttons = -1, /* will fill it after search */ | ||
}; | ||
|
||
static struct platform_device pb_device = { | ||
.name = DEVICE_NAME, | ||
.id = -1, | ||
.dev = { | ||
.platform_data = &gpio_keys, | ||
}, | ||
}; | ||
|
||
/* | ||
* Shrink the non-existent buttons, register the gpio button | ||
* device if there is some | ||
*/ | ||
static int __init pb_keys_init(void) | ||
{ | ||
struct gpio_keys_button *gb = gpio_button; | ||
int i, num, good = 0; | ||
|
||
num = sizeof(gpio_button) / sizeof(struct gpio_keys_button); | ||
for (i = 0; i < num; i++) { | ||
gb[i].gpio = get_gpio_by_name(gb[i].desc); | ||
pr_debug("info[%2d]: name = %s, gpio = %d\n", i, gb[i].desc, | ||
gb[i].gpio); | ||
if (gb[i].gpio == -1) | ||
continue; | ||
|
||
if (i != good) | ||
gb[good] = gb[i]; | ||
good++; | ||
} | ||
|
||
if (good) { | ||
gpio_keys.nbuttons = good; | ||
return platform_device_register(&pb_device); | ||
} | ||
return 0; | ||
} | ||
late_initcall(pb_keys_init); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
/* | ||
* platform_ipc.c: IPC platform library file | ||
* | ||
* (C) Copyright 2013 Intel Corporation | ||
* Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; version 2 | ||
* of the License. | ||
*/ | ||
|
||
#include <linux/init.h> | ||
#include <linux/kernel.h> | ||
#include <linux/interrupt.h> | ||
#include <linux/sfi.h> | ||
#include <linux/gpio.h> | ||
#include <asm/intel-mid.h> | ||
#include "platform_ipc.h" | ||
|
||
void __init ipc_device_handler(struct sfi_device_table_entry *pentry, | ||
struct devs_id *dev) | ||
{ | ||
struct platform_device *pdev; | ||
void *pdata = NULL; | ||
static struct resource res __initdata = { | ||
.name = "IRQ", | ||
.flags = IORESOURCE_IRQ, | ||
}; | ||
|
||
pr_debug("IPC bus, name = %16.16s, irq = 0x%2x\n", | ||
pentry->name, pentry->irq); | ||
|
||
/* | ||
* We need to call platform init of IPC devices to fill misc_pdata | ||
* structure. It will be used in msic_init for initialization. | ||
*/ | ||
if (dev != NULL) | ||
pdata = dev->get_platform_data(pentry); | ||
|
||
/* | ||
* On Medfield the platform device creation is handled by the MSIC | ||
* MFD driver so we don't need to do it here. | ||
*/ | ||
if (intel_mid_has_msic()) | ||
return; | ||
|
||
pdev = platform_device_alloc(pentry->name, 0); | ||
if (pdev == NULL) { | ||
pr_err("out of memory for SFI platform device '%s'.\n", | ||
pentry->name); | ||
return; | ||
} | ||
res.start = pentry->irq; | ||
platform_device_add_resources(pdev, &res, 1); | ||
|
||
pdev->dev.platform_data = pdata; | ||
intel_scu_device_register(pdev); | ||
} | ||
|
||
static const struct devs_id pmic_audio_dev_id __initconst = { | ||
.name = "pmic_audio", | ||
.type = SFI_DEV_TYPE_IPC, | ||
.delay = 1, | ||
.device_handler = &ipc_device_handler, | ||
}; | ||
|
||
sfi_device(pmic_audio_dev_id); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
/* | ||
* platform_ipc.h: IPC platform library header file | ||
* | ||
* (C) Copyright 2013 Intel Corporation | ||
* Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; version 2 | ||
* of the License. | ||
*/ | ||
#ifndef _PLATFORM_IPC_H_ | ||
#define _PLATFORM_IPC_H_ | ||
|
||
extern void __init ipc_device_handler(struct sfi_device_table_entry *pentry, | ||
struct devs_id *dev) __attribute__((weak)); | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
/* | ||
* platform_lis331.c: lis331 platform data initilization file | ||
* | ||
* (C) Copyright 2013 Intel Corporation | ||
* Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; version 2 | ||
* of the License. | ||
*/ | ||
|
||
#include <linux/i2c.h> | ||
#include <linux/gpio.h> | ||
#include <asm/intel-mid.h> | ||
|
||
static void __init *lis331dl_platform_data(void *info) | ||
{ | ||
static short intr2nd_pdata; | ||
struct i2c_board_info *i2c_info = info; | ||
int intr = get_gpio_by_name("accel_int"); | ||
int intr2nd = get_gpio_by_name("accel_2"); | ||
|
||
if (intr == -1 || intr2nd == -1) | ||
return NULL; | ||
|
||
i2c_info->irq = intr + INTEL_MID_IRQ_OFFSET; | ||
intr2nd_pdata = intr2nd + INTEL_MID_IRQ_OFFSET; | ||
|
||
return &intr2nd_pdata; | ||
} | ||
|
||
static const struct devs_id lis331dl_dev_id __initconst = { | ||
.name = "i2c_accel", | ||
.type = SFI_DEV_TYPE_I2C, | ||
.get_platform_data = &lis331dl_platform_data, | ||
}; | ||
|
||
sfi_device(lis331dl_dev_id); |
35 changes: 35 additions & 0 deletions
35
arch/x86/platform/intel-mid/device_libs/platform_max3111.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* | ||
* platform_max3111.c: max3111 platform data initilization file | ||
* | ||
* (C) Copyright 2013 Intel Corporation | ||
* Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; version 2 | ||
* of the License. | ||
*/ | ||
|
||
#include <linux/gpio.h> | ||
#include <linux/spi/spi.h> | ||
#include <asm/intel-mid.h> | ||
|
||
static void __init *max3111_platform_data(void *info) | ||
{ | ||
struct spi_board_info *spi_info = info; | ||
int intr = get_gpio_by_name("max3111_int"); | ||
|
||
spi_info->mode = SPI_MODE_0; | ||
if (intr == -1) | ||
return NULL; | ||
spi_info->irq = intr + INTEL_MID_IRQ_OFFSET; | ||
return NULL; | ||
} | ||
|
||
static const struct devs_id max3111_dev_id __initconst = { | ||
.name = "spi_max3111", | ||
.type = SFI_DEV_TYPE_SPI, | ||
.get_platform_data = &max3111_platform_data, | ||
}; | ||
|
||
sfi_device(max3111_dev_id); |
Oops, something went wrong.