40a96d54ee
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>
114 lines
3.1 KiB
C
114 lines
3.1 KiB
C
/*
|
|
* intel-mid.h: Intel MID specific setup code
|
|
*
|
|
* (C) Copyright 2009 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.
|
|
*/
|
|
#ifndef _ASM_X86_INTEL_MID_H
|
|
#define _ASM_X86_INTEL_MID_H
|
|
|
|
#include <linux/sfi.h>
|
|
#include <linux/platform_device.h>
|
|
|
|
extern int intel_mid_pci_init(void);
|
|
extern int get_gpio_by_name(const char *name);
|
|
extern void intel_scu_device_register(struct platform_device *pdev);
|
|
extern int __init sfi_parse_mrtc(struct sfi_table_header *table);
|
|
extern int __init sfi_parse_mtmr(struct sfi_table_header *table);
|
|
extern int sfi_mrtc_num;
|
|
extern struct sfi_rtc_table_entry sfi_mrtc_array[];
|
|
|
|
/*
|
|
* Here defines the array of devices platform data that IAFW would export
|
|
* through SFI "DEVS" table, we use name and type to match the device and
|
|
* its platform data.
|
|
*/
|
|
struct devs_id {
|
|
char name[SFI_NAME_LEN + 1];
|
|
u8 type;
|
|
u8 delay;
|
|
void *(*get_platform_data)(void *info);
|
|
/* Custom handler for devices */
|
|
void (*device_handler)(struct sfi_device_table_entry *pentry,
|
|
struct devs_id *dev);
|
|
};
|
|
|
|
#define sfi_device(i) \
|
|
static const struct devs_id *const __intel_mid_sfi_##i##_dev __used \
|
|
__attribute__((__section__(".x86_intel_mid_dev.init"))) = &i
|
|
|
|
/*
|
|
* 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
|
|
* timers. Medfield is the platform name, and the chip name is called Penwell
|
|
* we treat Medfield/Penwell as a variant of Moorestown. Penwell can be
|
|
* identified via MSRs.
|
|
*/
|
|
enum intel_mid_cpu_type {
|
|
/* 1 was Moorestown */
|
|
INTEL_MID_CPU_CHIP_PENWELL = 2,
|
|
};
|
|
|
|
extern enum intel_mid_cpu_type __intel_mid_cpu_chip;
|
|
|
|
#ifdef CONFIG_X86_INTEL_MID
|
|
|
|
static inline enum intel_mid_cpu_type intel_mid_identify_cpu(void)
|
|
{
|
|
return __intel_mid_cpu_chip;
|
|
}
|
|
|
|
static inline bool intel_mid_has_msic(void)
|
|
{
|
|
return (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_PENWELL);
|
|
}
|
|
|
|
#else /* !CONFIG_X86_INTEL_MID */
|
|
|
|
#define intel_mid_identify_cpu() (0)
|
|
#define intel_mid_has_msic() (0)
|
|
|
|
#endif /* !CONFIG_X86_INTEL_MID */
|
|
|
|
enum intel_mid_timer_options {
|
|
INTEL_MID_TIMER_DEFAULT,
|
|
INTEL_MID_TIMER_APBT_ONLY,
|
|
INTEL_MID_TIMER_LAPIC_APBT,
|
|
};
|
|
|
|
extern enum intel_mid_timer_options intel_mid_timer_options;
|
|
|
|
/*
|
|
* Penwell uses spread spectrum clock, so the freq number is not exactly
|
|
* the same as reported by MSR based on SDM.
|
|
*/
|
|
#define PENWELL_FSB_FREQ_83SKU 83200
|
|
#define PENWELL_FSB_FREQ_100SKU 99840
|
|
|
|
#define SFI_MTMR_MAX_NUM 8
|
|
#define SFI_MRTC_MAX 8
|
|
|
|
extern struct console early_mrst_console;
|
|
extern void mrst_early_console_init(void);
|
|
|
|
extern struct console early_hsu_console;
|
|
extern void hsu_early_console_init(const char *);
|
|
|
|
extern void intel_scu_devices_create(void);
|
|
extern void intel_scu_devices_destroy(void);
|
|
|
|
/* VRTC timer */
|
|
#define MRST_VRTC_MAP_SZ (1024)
|
|
/*#define MRST_VRTC_PGOFFSET (0xc00) */
|
|
|
|
extern void intel_mid_rtc_init(void);
|
|
|
|
/* the offset for the mapping of global gpio pin to irq */
|
|
#define INTEL_MID_IRQ_OFFSET 0x100
|
|
|
|
#endif /* _ASM_X86_INTEL_MID_H */
|