#include <linux/err.h>
#include <linux/kernel.h>
#include <linux/reboot.h>
#include <linux/platform_data/emif_plat.h>
#include <linux/io.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
#include <linux/module.h>
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/pm.h>
#include "emif.h"
#include "jedec_ddr.h"
#include "of_memory.h"
struct emif_data { … };
static struct emif_data *emif1;
static DEFINE_SPINLOCK(emif_lock);
static unsigned long irq_state;
static LIST_HEAD(device_list);
static void do_emif_regdump_show(struct seq_file *s, struct emif_data *emif,
struct emif_regs *regs)
{ … }
static int emif_regdump_show(struct seq_file *s, void *unused)
{ … }
DEFINE_SHOW_ATTRIBUTE(…);
static int emif_mr4_show(struct seq_file *s, void *unused)
{ … }
DEFINE_SHOW_ATTRIBUTE(…);
static void emif_debugfs_init(struct emif_data *emif)
{ … }
static void emif_debugfs_exit(struct emif_data *emif)
{ … }
static u32 get_emif_bus_width(struct emif_data *emif)
{ … }
static void set_lpmode(struct emif_data *emif, u8 lpmode)
{ … }
static void do_freq_update(void)
{ … }
static const struct lpddr2_addressing *get_addressing_table(
const struct ddr_device_info *device_info)
{ … }
static u32 get_zq_config_reg(const struct lpddr2_addressing *addressing,
bool cs1_used, bool cal_resistors_per_cs)
{ … }
static u32 get_temp_alert_config(const struct lpddr2_addressing *addressing,
const struct emif_custom_configs *custom_configs, bool cs1_used,
u32 sdram_io_width, u32 emif_bus_width)
{ … }
static u32 get_pwr_mgmt_ctrl(u32 freq, struct emif_data *emif, u32 ip_rev)
{ … }
static void get_temperature_level(struct emif_data *emif)
{ … }
static void setup_temperature_sensitive_regs(struct emif_data *emif,
struct emif_regs *regs)
{ … }
static irqreturn_t handle_temp_alert(void __iomem *base, struct emif_data *emif)
{ … }
static irqreturn_t emif_interrupt_handler(int irq, void *dev_id)
{ … }
static irqreturn_t emif_threaded_isr(int irq, void *dev_id)
{ … }
static void clear_all_interrupts(struct emif_data *emif)
{ … }
static void disable_and_clear_all_interrupts(struct emif_data *emif)
{ … }
static int setup_interrupts(struct emif_data *emif, u32 irq)
{ … }
static void emif_onetime_settings(struct emif_data *emif)
{ … }
static void get_default_timings(struct emif_data *emif)
{ … }
static int is_dev_data_valid(u32 type, u32 density, u32 io_width, u32 phy_type,
u32 ip_rev, struct device *dev)
{ … }
static int is_custom_config_valid(struct emif_custom_configs *cust_cfgs,
struct device *dev)
{ … }
static void of_get_custom_configs(struct device_node *np_emif,
struct emif_data *emif)
{ … }
static void of_get_ddr_info(struct device_node *np_emif,
struct device_node *np_ddr,
struct ddr_device_info *dev_info)
{ … }
static struct emif_data *of_get_memory_device_details(
struct device_node *np_emif, struct device *dev)
{ … }
static struct emif_data *get_device_details(
struct platform_device *pdev)
{ … }
static int emif_probe(struct platform_device *pdev)
{ … }
static void emif_remove(struct platform_device *pdev)
{ … }
static void emif_shutdown(struct platform_device *pdev)
{ … }
#if defined(CONFIG_OF)
static const struct of_device_id emif_of_match[] = …;
MODULE_DEVICE_TABLE(of, emif_of_match);
#endif
static struct platform_driver emif_driver = …;
module_platform_driver(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
MODULE_ALIAS(…) …;
MODULE_AUTHOR(…) …;