18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * intel-mid.h: Intel MID specific setup code
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * (C) Copyright 2009 Intel Corporation
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci#ifndef _ASM_X86_INTEL_MID_H
88c2ecf20Sopenharmony_ci#define _ASM_X86_INTEL_MID_H
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/sfi.h>
118c2ecf20Sopenharmony_ci#include <linux/pci.h>
128c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ciextern int intel_mid_pci_init(void);
158c2ecf20Sopenharmony_ciextern int intel_mid_pci_set_power_state(struct pci_dev *pdev, pci_power_t state);
168c2ecf20Sopenharmony_ciextern pci_power_t intel_mid_pci_get_power_state(struct pci_dev *pdev);
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ciextern void intel_mid_pwr_power_off(void);
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#define INTEL_MID_PWR_LSS_OFFSET	4
218c2ecf20Sopenharmony_ci#define INTEL_MID_PWR_LSS_TYPE		(1 << 7)
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ciextern int intel_mid_pwr_get_lss_id(struct pci_dev *pdev);
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ciextern int get_gpio_by_name(const char *name);
268c2ecf20Sopenharmony_ciextern int __init sfi_parse_mrtc(struct sfi_table_header *table);
278c2ecf20Sopenharmony_ciextern int __init sfi_parse_mtmr(struct sfi_table_header *table);
288c2ecf20Sopenharmony_ciextern int sfi_mrtc_num;
298c2ecf20Sopenharmony_ciextern struct sfi_rtc_table_entry sfi_mrtc_array[];
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci/*
328c2ecf20Sopenharmony_ci * Here defines the array of devices platform data that IAFW would export
338c2ecf20Sopenharmony_ci * through SFI "DEVS" table, we use name and type to match the device and
348c2ecf20Sopenharmony_ci * its platform data.
358c2ecf20Sopenharmony_ci */
368c2ecf20Sopenharmony_cistruct devs_id {
378c2ecf20Sopenharmony_ci	char name[SFI_NAME_LEN + 1];
388c2ecf20Sopenharmony_ci	u8 type;
398c2ecf20Sopenharmony_ci	u8 delay;
408c2ecf20Sopenharmony_ci	u8 msic;
418c2ecf20Sopenharmony_ci	void *(*get_platform_data)(void *info);
428c2ecf20Sopenharmony_ci};
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#define sfi_device(i)								\
458c2ecf20Sopenharmony_ci	static const struct devs_id *const __intel_mid_sfi_##i##_dev __used	\
468c2ecf20Sopenharmony_ci	__section(".x86_intel_mid_dev.init") = &i
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci/**
498c2ecf20Sopenharmony_ci* struct mid_sd_board_info - template for SD device creation
508c2ecf20Sopenharmony_ci* @name:		identifies the driver
518c2ecf20Sopenharmony_ci* @bus_num:		board-specific identifier for a given SD controller
528c2ecf20Sopenharmony_ci* @max_clk:		the maximum frequency device supports
538c2ecf20Sopenharmony_ci* @platform_data:	the particular data stored there is driver-specific
548c2ecf20Sopenharmony_ci*/
558c2ecf20Sopenharmony_cistruct mid_sd_board_info {
568c2ecf20Sopenharmony_ci	char		name[SFI_NAME_LEN];
578c2ecf20Sopenharmony_ci	int		bus_num;
588c2ecf20Sopenharmony_ci	unsigned short	addr;
598c2ecf20Sopenharmony_ci	u32		max_clk;
608c2ecf20Sopenharmony_ci	void		*platform_data;
618c2ecf20Sopenharmony_ci};
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci/*
648c2ecf20Sopenharmony_ci * Medfield is the follow-up of Moorestown, it combines two chip solution into
658c2ecf20Sopenharmony_ci * one. Other than that it also added always-on and constant tsc and lapic
668c2ecf20Sopenharmony_ci * timers. Medfield is the platform name, and the chip name is called Penwell
678c2ecf20Sopenharmony_ci * we treat Medfield/Penwell as a variant of Moorestown. Penwell can be
688c2ecf20Sopenharmony_ci * identified via MSRs.
698c2ecf20Sopenharmony_ci */
708c2ecf20Sopenharmony_cienum intel_mid_cpu_type {
718c2ecf20Sopenharmony_ci	/* 1 was Moorestown */
728c2ecf20Sopenharmony_ci	INTEL_MID_CPU_CHIP_PENWELL = 2,
738c2ecf20Sopenharmony_ci	INTEL_MID_CPU_CHIP_CLOVERVIEW,
748c2ecf20Sopenharmony_ci	INTEL_MID_CPU_CHIP_TANGIER,
758c2ecf20Sopenharmony_ci};
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ciextern enum intel_mid_cpu_type __intel_mid_cpu_chip;
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_INTEL_MID
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cistatic inline enum intel_mid_cpu_type intel_mid_identify_cpu(void)
828c2ecf20Sopenharmony_ci{
838c2ecf20Sopenharmony_ci	return __intel_mid_cpu_chip;
848c2ecf20Sopenharmony_ci}
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_cistatic inline bool intel_mid_has_msic(void)
878c2ecf20Sopenharmony_ci{
888c2ecf20Sopenharmony_ci	return (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_PENWELL);
898c2ecf20Sopenharmony_ci}
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ciextern void intel_scu_devices_create(void);
928c2ecf20Sopenharmony_ciextern void intel_scu_devices_destroy(void);
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci#else /* !CONFIG_X86_INTEL_MID */
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci#define intel_mid_identify_cpu()	0
978c2ecf20Sopenharmony_ci#define intel_mid_has_msic()		0
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_cistatic inline void intel_scu_devices_create(void) { }
1008c2ecf20Sopenharmony_cistatic inline void intel_scu_devices_destroy(void) { }
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci#endif /* !CONFIG_X86_INTEL_MID */
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_cienum intel_mid_timer_options {
1058c2ecf20Sopenharmony_ci	INTEL_MID_TIMER_DEFAULT,
1068c2ecf20Sopenharmony_ci	INTEL_MID_TIMER_APBT_ONLY,
1078c2ecf20Sopenharmony_ci	INTEL_MID_TIMER_LAPIC_APBT,
1088c2ecf20Sopenharmony_ci};
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ciextern enum intel_mid_timer_options intel_mid_timer_options;
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci/* Bus Select SoC Fuse value */
1138c2ecf20Sopenharmony_ci#define BSEL_SOC_FUSE_MASK		0x7
1148c2ecf20Sopenharmony_ci/* FSB 133MHz */
1158c2ecf20Sopenharmony_ci#define BSEL_SOC_FUSE_001		0x1
1168c2ecf20Sopenharmony_ci/* FSB 100MHz */
1178c2ecf20Sopenharmony_ci#define BSEL_SOC_FUSE_101		0x5
1188c2ecf20Sopenharmony_ci/* FSB 83MHz */
1198c2ecf20Sopenharmony_ci#define BSEL_SOC_FUSE_111		0x7
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci#define SFI_MTMR_MAX_NUM		8
1228c2ecf20Sopenharmony_ci#define SFI_MRTC_MAX			8
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci/* VRTC timer */
1258c2ecf20Sopenharmony_ci#define MRST_VRTC_MAP_SZ		1024
1268c2ecf20Sopenharmony_ci/* #define MRST_VRTC_PGOFFSET		0xc00 */
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ciextern void intel_mid_rtc_init(void);
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ci/* The offset for the mapping of global gpio pin to irq */
1318c2ecf20Sopenharmony_ci#define INTEL_MID_IRQ_OFFSET		0x100
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci#endif /* _ASM_X86_INTEL_MID_H */
134