satip-axe/kernel/include/linux/stm/platform.h
2015-03-26 17:24:57 +01:00

508 lines
12 KiB
C

/*
* (c) 2010 STMicroelectronics Limited
*
* Author: Pawel Moll <pawel.moll@st.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __LINUX_STM_PLATFORM_H
#define __LINUX_STM_PLATFORM_H
#include <linux/gpio.h>
#include <linux/lirc.h>
#include <linux/device.h>
#include <linux/gpio.h>
#include <linux/spi/spi.h>
#include <linux/stm/pad.h>
#include <linux/stm/nand.h>
#include <linux/stmmac.h>
#include <linux/mmc/sdhci.h>
#include <linux/sdhci-pltfm.h>
#include <linux/stm/miphy.h>
/*** Platform definition helpers ***/
#define STM_PLAT_RESOURCE_MEM(_start, _size) \
{ \
.start = (_start), \
.end = (_start) + (_size) - 1, \
.flags = IORESOURCE_MEM, \
}
#define STM_PLAT_RESOURCE_MEM_NAMED(_name, _start, _size) \
{ \
.start = (_start), \
.end = (_start) + (_size) - 1, \
.name = (_name), \
.flags = IORESOURCE_MEM, \
}
#if defined(CONFIG_CPU_SUBTYPE_ST40)
#define STM_PLAT_RESOURCE_IRQ(_st40, _st200) \
{ \
.start = (_st40), \
.end = (_st40), \
.flags = IORESOURCE_IRQ, \
}
#define STM_PLAT_RESOURCE_IRQ_NAMED(_name, _st40, _st200) \
{ \
.start = (_st40), \
.end = (_st40), \
.name = (_name), \
.flags = IORESOURCE_IRQ, \
}
#else
#error Unknown architecture
#endif
#define STM_PLAT_RESOURCE_DMA(_req_line) \
{ \
.start = (_req_line), \
.end = (_req_line), \
.flags = IORESOURCE_DMA, \
}
#define STM_PLAT_RESOURCE_DMA_NAMED(_name, _req_line) \
{ \
.start = (_req_line), \
.end = (_req_line), \
.name = (_name), \
.flags = IORESOURCE_DMA, \
}
/*** ASC platform data ***/
struct stm_plat_asc_data {
int hw_flow_control:1;
int txfifo_bug:1;
struct stm_pad_config *pad_config;
};
extern int stm_asc_console_device;
extern unsigned int stm_asc_configured_devices_num;
extern struct platform_device *stm_asc_configured_devices[];
/*** LPC platform data ***/
struct stm_plat_rtc_lpc {
unsigned int no_hw_req:1; /* iomem in sys/serv 5197 */
unsigned int need_wdt_reset:1; /* W/A on 7141 */
unsigned char irq_edge_level;
char *clk_id;
};
/*** SSC platform data ***/
struct stm_plat_ssc_data {
struct stm_pad_config *pad_config;
void (*spi_chipselect)(struct spi_device *, int);
};
/*** LiRC platform data ***/
struct stm_plat_lirc_data {
unsigned int irbclock; /* IRB block clock
* (set to 0 for auto) */
unsigned int irbclkdiv; /* IRB block clock divison
* (set to 0 for auto) */
unsigned int irbperiodmult; /* manual setting period multiplier */
unsigned int irbperioddiv; /* manual setting period divisor */
unsigned int irbontimemult; /* manual setting pulse period
* multiplier */
unsigned int irbontimediv; /* manual setting pulse period
* divisor */
unsigned int irbrxmaxperiod; /* maximum rx period in uS */
unsigned int irbversion; /* IRB version type (1,2 or 3) */
unsigned int sysclkdiv; /* factor to divide system bus
clock by */
unsigned int rxpolarity; /* flag to set gpio rx polarity
* (usually set to 1) */
unsigned int subcarrwidth; /* Subcarrier width in percent - this
* is used to make the subcarrier
* waveform square after passing
* through the 555-based threshold
* detector on ST boards */
struct stm_pad_config *pads; /* pads to be claimed */
unsigned int rxuhfmode:1; /* RX UHF mode enabled */
unsigned int txenabled:1; /* TX operation is possible */
};
/*** PWM platform data ***/
/* Private data for the PWM driver */
struct stm_plat_pwm_data {
int channel_enabled[2];
struct stm_pad_config *channel_pad_config[2];
};
/*** Temperature sensor data ***/
struct plat_stm_temp_data {
struct {
int group, num, lsb, msb;
} dcorrect, overflow, data;
struct stm_device_config *device_config;
int calibrated:1;
int calibration_value;
void (*custom_set_dcorrect)(void *priv);
unsigned long (*custom_get_data)(void *priv);
void *custom_priv;
};
/*** USB platform data ***/
#define STM_PLAT_USB_FLAGS_STRAP_8BIT (1<<0)
#define STM_PLAT_USB_FLAGS_STRAP_16BIT (2<<0)
#define STM_PLAT_USB_FLAGS_STRAP_PLL (1<<2)
#define STM_PLAT_USB_FLAGS_OPC_MSGSIZE_CHUNKSIZE (1<<3)
#define STM_PLAT_USB_FLAGS_STBUS_CONFIG_THRESHOLD128 (1<<4)
#define STM_PLAT_USB_FLAGS_STBUS_CONFIG_THRESHOLD256 (2<<4)
struct stm_plat_usb_data {
unsigned long flags;
struct stm_device_config *device_config;
};
/*** TAP platform data ***/
struct tap_sysconf_field {
u8 group, num;
u8 lsb, msb;
enum {POL_NORMAL, POL_INVERTED} pol;
};
struct stm_tap_sysconf {
struct tap_sysconf_field tms;
struct tap_sysconf_field tck;
struct tap_sysconf_field tdi;
struct tap_sysconf_field tdo;
struct tap_sysconf_field tap_en;
struct tap_sysconf_field trstn;
int tap_en_pol;
int trstn_pol;
};
struct stm_plat_tap_data {
int miphy_first, miphy_count;
enum miphy_mode *miphy_modes;
struct stm_tap_sysconf *tap_sysconf;
};
/*** PCIE-MP platform data ***/
struct stm_plat_pcie_mp_data {
int miphy_first, miphy_count;
enum miphy_mode *miphy_modes;
void (*mp_select)(int port);
};
/*** MiPHY dummy platform data ***/
struct stm_plat_miphy_dummy_data {
int miphy_first, miphy_count;
enum miphy_mode *miphy_modes;
};
/*** SATA platform data ***/
struct stm_plat_sata_data {
unsigned long phy_init;
unsigned long pc_glue_logic_init;
unsigned int only_32bit;
unsigned int oob_wa;
struct stm_device_config *device_config;
void (*host_restart)(int port);
int port_num;
int miphy_num;
};
/*** PIO platform data ***/
struct stm_plat_pio_irqmux_data {
int port_first;
int ports_num;
};
/*** Sysconf block platform data ***/
#define PLAT_SYSCONF_GROUP(_id, _offset) \
{ \
.group = _id, \
.offset = _offset, \
.name = #_id \
}
struct stm_plat_sysconf_group {
int group;
unsigned long offset;
const char *name;
const char *(*reg_name)(int num);
};
struct stm_plat_sysconf_data {
int groups_num;
struct stm_plat_sysconf_group *groups;
};
/*** NAND flash platform data ***/
struct stm_plat_nand_flex_data {
unsigned int nr_banks;
struct stm_nand_bank_data *banks;
unsigned int flex_rbn_connected:1;
};
struct stm_plat_nand_emi_data {
unsigned int nr_banks;
struct stm_nand_bank_data *banks;
int emi_rbn_gpio;
};
struct stm_nand_config {
enum {
stm_nand_emi,
stm_nand_flex,
stm_nand_afm
} driver;
int nr_banks;
struct stm_nand_bank_data *banks;
union {
int emi_gpio;
int flex_connected;
} rbn;
};
/*** STM SPI FSM Serial Flash data ***/
struct stm_plat_spifsm_data {
char *name;
struct mtd_partition *parts;
unsigned int nr_parts;
unsigned int max_freq;
};
/*** FDMA platform data ***/
struct stm_plat_fdma_slim_regs {
unsigned long id;
unsigned long ver;
unsigned long en;
unsigned long clk_gate;
};
struct stm_plat_fdma_periph_regs {
unsigned long sync_reg;
unsigned long cmd_sta;
unsigned long cmd_set;
unsigned long cmd_clr;
unsigned long cmd_mask;
unsigned long int_sta;
unsigned long int_set;
unsigned long int_clr;
unsigned long int_mask;
};
struct stm_plat_fdma_ram {
unsigned long offset;
unsigned long size;
};
struct stm_plat_fdma_hw {
struct stm_plat_fdma_slim_regs slim_regs;
struct stm_plat_fdma_ram dmem;
struct stm_plat_fdma_periph_regs periph_regs;
struct stm_plat_fdma_ram imem;
};
struct stm_plat_fdma_fw_regs {
unsigned long rev_id;
unsigned long cmd_statn;
unsigned long req_ctln;
unsigned long ptrn;
unsigned long cntn;
unsigned long saddrn;
unsigned long daddrn;
};
struct stm_plat_fdma_data {
struct stm_plat_fdma_hw *hw;
struct stm_plat_fdma_fw_regs *fw;
};
/*** PCI platform data ***/
#define PCI_PIN_ALTERNATIVE -3 /* Use alternative PIO rather than default */
#define PCI_PIN_DEFAULT -2 /* Use whatever the default is for that pin */
#define PCI_PIN_UNUSED -1 /* Pin not in use */
/* In the board setup, you can pass in the external interrupt numbers instead
* if you have wired up your board that way. It has the advantage that the PIO
* pins freed up can then be used for something else. */
struct stm_plat_pci_config {
/* PCI_PIN_DEFAULT/PCI_PIN_UNUSED. Other IRQ can be passed in */
int pci_irq[4];
/* As above for SERR */
int serr_irq;
/* Lowest address line connected to an idsel - slot 0 */
char idsel_lo;
/* Highest address line connected to an idsel - slot n */
char idsel_hi;
/* Set to PCI_PIN_DEFAULT if the corresponding req/gnt lines are
* in use */
char req_gnt[4];
/* PCI clock in Hz. If zero default to 33MHz */
unsigned long pci_clk;
/* If you supply a pci_reset() function, that will be used to reset
* the PCI bus. Otherwise it is assumed that the reset is done via
* PIO, the number is specified here. Specify -EINVAL if no PIO reset
* is required either, for example if the PCI reset is done as part
* of power on reset. */
unsigned pci_reset_gpio;
void (*pci_reset)(void);
/* You may define a PCI clock name. If NULL it will fall
* back to "pci" */
const char *clk_name;
/* Various PCI tuning parameters. Set by SOC layer. You don't have
* to specify these as the defaults are usually fine. However, if
* you need to change them, you can set ad_override_default and
* plug in your own values. */
unsigned ad_threshold:4;
unsigned ad_chunks_in_msg:5;
unsigned ad_pcks_in_chunk:5;
unsigned ad_trigger_mode:1;
unsigned ad_posted:1;
unsigned ad_max_opcode:4;
unsigned ad_read_ahead:1;
/* Set to override default values for your board */
unsigned ad_override_default:1;
/* Some SOCs have req0 pin connected to req3 signal to work around
* some problems with NAND. These bits will be set by the chip layer,
* the board layer should NOT touch this.
*/
unsigned req0_to_req3:1;
};
/* How these are done vary considerable from SOC to SOC. Sometimes
* they are wired up to sysconfig bits, other times they are simply
* memory mapped registers.
*/
struct stm_plat_pcie_ops {
void (*init)(void *handle);
void (*enable_ltssm)(void *handle);
void (*disable_ltssm)(void *handle);
};
/* PCIe platform data */
struct stm_plat_pcie_config {
/* Which PIO the PERST# signal is on.
* If it is not connected, and you rely on the autonomous reset,
* then specifiy -EINVAL here
*/
unsigned reset_gpio;
/* If you have a really wierd way of wanging PERST# (unlikely),
* then do it here. Given PCI express is defined in such a way
* that autonomous reset should work it is OK to not connect it at
* all.
*/
void (*reset)(void);
/* Magic number to shove into the amba bus bridge. The AHB driver will
* be commoned up at some point in the future so this will change
*/
unsigned long ahb_val;
/* Which miphy this pcie is using */
int miphy_num;
/* Magic handle to pass through to the ops */
void *ops_handle;
struct stm_plat_pcie_ops *ops;
};
/*** ILC platform data ***/
struct stm_plat_ilc3_data {
unsigned short inputs_num;
unsigned short outputs_num;
unsigned short first_irq;
/*
* The ILC supports the wakeup capability but on some chip when enabled
* the system is unstable during the resume from suspend, so disable
* it.
*/
int disable_wakeup:1;
};
/*** To claim Ethernet PAD resources from thr platform ***/
static inline int stmmac_claim_resource(struct platform_device *pdev)
{
int ret = 0;
struct plat_stmmacenet_data *plat_dat = pdev->dev.platform_data;
if (!(devm_stm_pad_claim(&pdev->dev,
(struct stm_pad_config *) plat_dat->custom_cfg,
dev_name(&pdev->dev)))) {
pr_err("%s: failed to request pads!\n", __func__);
ret = -ENODEV;
}
return ret;
}
/* Mali specific */
struct stm_mali_resource {
resource_size_t start;
resource_size_t end;
const char *name;
};
struct stm_mali_config {
/* Memory allocated by Linux kernel and
Memory regions managed by mali driver */
int num_mem_resources;
struct stm_mali_resource *mem;
/* Access to other regions of memory to directly render */
int num_ext_resources;
struct stm_mali_resource *ext_mem;
};
#endif /* __LINUX_STM_PLATFORM_H */