diff options
Diffstat (limited to 'arch/arm/mach-exynos/board-c1vzw-modems.c')
-rw-r--r-- | arch/arm/mach-exynos/board-c1vzw-modems.c | 1930 |
1 files changed, 0 insertions, 1930 deletions
diff --git a/arch/arm/mach-exynos/board-c1vzw-modems.c b/arch/arm/mach-exynos/board-c1vzw-modems.c deleted file mode 100644 index 6eb0509..0000000 --- a/arch/arm/mach-exynos/board-c1vzw-modems.c +++ /dev/null @@ -1,1930 +0,0 @@ -/* linux/arch/arm/mach-xxxx/board-c1vzw-modems.c - * Copyright (C) 2010 Samsung Electronics. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/gpio.h> -#include <linux/irq.h> -#include <linux/interrupt.h> -#include <linux/regulator/consumer.h> -#include <linux/err.h> -#include <linux/io.h> -#include <linux/delay.h> -#include <linux/clk.h> - -/* inlcude platform specific file */ -#include <linux/platform_data/modem.h> -#include <mach/sec_modem.h> -#include <mach/gpio.h> -#include <mach/gpio-exynos4.h> -#include <plat/gpio-cfg.h> -#include <mach/regs-mem.h> -#include <plat/regs-srom.h> - -#ifdef CONFIG_USBHUB_USB3503 -#include <linux/i2c.h> -#include <linux/i2c-gpio.h> -#include <linux/platform_data/usb3503.h> -#include <mach/cpufreq.h> -#include <plat/usb-phy.h> -#endif -#include <plat/devs.h> -#include <plat/ehci.h> - -#define SROM_CS0_BASE 0x04000000 -#define SROM_WIDTH 0x01000000 -#define SROM_NUM_ADDR_BITS 14 - -/* For "bus width and wait control (BW)" register */ -enum sromc_attr { - SROMC_DATA_16 = 0x1, /* 16-bit data bus */ - SROMC_BYTE_ADDR = 0x2, /* Byte base address */ - SROMC_WAIT_EN = 0x4, /* Wait enabled */ - SROMC_BYTE_EN = 0x8, /* Byte access enabled */ - SROMC_MASK = 0xF -}; - -/* DPRAM configuration */ -struct sromc_cfg { - enum sromc_attr attr; - unsigned size; - unsigned csn; /* CSn # */ - unsigned addr; /* Start address (physical) */ - unsigned end; /* End address (physical) */ -}; - -/* DPRAM access timing configuration */ -struct sromc_access_cfg { - u32 tacs; /* Address set-up before CSn */ - u32 tcos; /* Chip selection set-up before OEn */ - u32 tacc; /* Access cycle */ - u32 tcoh; /* Chip selection hold on OEn */ - u32 tcah; /* Address holding time after CSn */ - u32 tacp; /* Page mode access cycle at Page mode */ - u32 pmc; /* Page Mode config */ -}; - -/* For CMC221 IDPRAM (Internal DPRAM) */ -#define CMC_IDPRAM_SIZE 0x4000 /* 16 KB */ - -/* FOR CMC221 SFR for IDPRAM */ -#define CMC_INT2CP_REG 0x10 /* Interrupt to CP */ -#define CMC_INT2AP_REG 0x50 -#define CMC_CLR_INT_REG 0x28 /* Clear Interrupt to AP */ -#define CMC_RESET_REG 0x3C -#define CMC_PUT_REG 0x40 /* AP->CP reg for hostbooting */ -#define CMC_GET_REG 0x50 /* CP->AP reg for hostbooting */ - -/* For CBP7.2 EDPRAM (External DPRAM) */ -#define CBP_EDPRAM_SIZE 0x4000 /* 16 KB */ - -#define INT_MASK_REQ_ACK_F 0x0020 -#define INT_MASK_REQ_ACK_R 0x0010 -#define INT_MASK_RES_ACK_F 0x0008 -#define INT_MASK_RES_ACK_R 0x0004 -#define INT_MASK_SEND_F 0x0002 -#define INT_MASK_SEND_R 0x0001 - -#define INT_MASK_REQ_ACK_RFS 0x0400 /* Request RES_ACK_RFS */ -#define INT_MASK_RES_ACK_RFS 0x0200 /* Response of REQ_ACK_RFS */ -#define INT_MASK_SEND_RFS 0x0100 /* Indicate sending RFS data */ - - -/* Function prototypes */ -static void config_dpram_port_gpio(void); -static void init_sromc(void); -static void setup_sromc(unsigned csn, struct sromc_cfg *cfg, - struct sromc_access_cfg *acc_cfg); -static void setup_dpram_speed(unsigned csn, struct sromc_access_cfg *acc_cfg); -static int __init init_modem(void); - -#ifdef CONFIG_USBHUB_USB3503 -static int host_port_enable(int port, int enable); -#else -static int host_port_enable(int port, int enable) -{ - return s5p_ehci_port_control(&s5p_device_ehci, port, enable); -} -#endif - -#ifdef CONFIG_LTE_MODEM_CMC221 -static struct sromc_cfg cmc_idpram_cfg = { - .attr = SROMC_DATA_16, - .size = CMC_IDPRAM_SIZE, -}; - -static struct sromc_access_cfg cmc_idpram_access_cfg[] = { - [DPRAM_SPEED_LOW] = { - /* for 33 MHz clock, 64 cycles */ - .tacs = 0x08 << 28, - .tcos = 0x08 << 24, - .tacc = 0x1F << 16, - .tcoh = 0x08 << 12, - .tcah = 0x08 << 8, - .tacp = 0x00 << 4, - .pmc = 0x00 << 0, - }, - [DPRAM_SPEED_MID] = { - /* for 66 MHz clock, 32 cycles */ - .tacs = 0x01 << 28, - .tcos = 0x01 << 24, - .tacc = 0x1B << 16, - .tcoh = 0x01 << 12, - .tcah = 0x01 << 8, - .tacp = 0x00 << 4, - .pmc = 0x00 << 0, - }, - [DPRAM_SPEED_HIGH] = { - /* for 133 MHz clock, 16 cycles */ - .tacs = 0x01 << 28, - .tcos = 0x01 << 24, - .tacc = 0x0B << 16, - .tcoh = 0x01 << 12, - .tcah = 0x01 << 8, - .tacp = 0x00 << 4, - .pmc = 0x00 << 0, - }, -}; - -/* - magic_code + - access_enable + - fmt_tx_head + fmt_tx_tail + fmt_tx_buff + - raw_tx_head + raw_tx_tail + raw_tx_buff + - fmt_rx_head + fmt_rx_tail + fmt_rx_buff + - raw_rx_head + raw_rx_tail + raw_rx_buff + - mbx_cp2ap + - mbx_ap2cp - = 2 + - 2 + - 2 + 2 + 1336 + - 2 + 2 + 4564 + - 2 + 2 + 1336 + - 2 + 2 + 9124 + - 2 + - 2 - = 16384 -*/ - -#define DP_FMT_TX_BUFF_SZ 1336 -#define DP_RAW_TX_BUFF_SZ 4564 -#define DP_FMT_RX_BUFF_SZ 1336 -#define DP_RAW_RX_BUFF_SZ 9124 - -#define MAX_CMC_IDPRAM_IPC_DEV (IPC_RAW + 1) /* FMT, RAW */ - -struct dpram_ipc_cfg { - u16 magic; - u16 access; - - u16 fmt_tx_head; - u16 fmt_tx_tail; - u8 fmt_tx_buff[DP_FMT_TX_BUFF_SZ]; - - u16 raw_tx_head; - u16 raw_tx_tail; - u8 raw_tx_buff[DP_RAW_TX_BUFF_SZ]; - - u16 fmt_rx_head; - u16 fmt_rx_tail; - u8 fmt_rx_buff[DP_FMT_RX_BUFF_SZ]; - - u16 raw_rx_head; - u16 raw_rx_tail; - u8 raw_rx_buff[DP_RAW_RX_BUFF_SZ]; - - u16 mbx_cp2ap; - u16 mbx_ap2cp; -}; - -struct cmc221_idpram_sfr { - u16 __iomem *int2cp; - u16 __iomem *int2ap; - u16 __iomem *clr_int2ap; - u16 __iomem *reset; - u16 __iomem *msg2cp; - u16 __iomem *msg2ap; -}; - -static struct dpram_ipc_map cmc_ipc_map; -static u8 *cmc_sfr_base; -static struct cmc221_idpram_sfr cmc_sfr; - -/* Function prototypes */ -static void cmc_idpram_reset(void); -static void cmc_idpram_setup_speed(enum dpram_speed); -static int cmc_idpram_wakeup(void); -static void cmc_idpram_sleep(void); -static void cmc_idpram_clr_intr(void); -static u16 cmc_idpram_recv_intr(void); -static void cmc_idpram_send_intr(u16 irq_mask); -static u16 cmc_idpram_recv_msg(void); -static void cmc_idpram_send_msg(u16 msg); - -static u16 cmc_idpram_get_magic(void); -static void cmc_idpram_set_magic(u16 value); -static u16 cmc_idpram_get_access(void); -static void cmc_idpram_set_access(u16 value); - -static u32 cmc_idpram_get_tx_head(int dev_id); -static u32 cmc_idpram_get_tx_tail(int dev_id); -static void cmc_idpram_set_tx_head(int dev_id, u32 head); -static void cmc_idpram_set_tx_tail(int dev_id, u32 tail); -static u8 __iomem *cmc_idpram_get_tx_buff(int dev_id); -static u32 cmc_idpram_get_tx_buff_size(int dev_id); - -static u32 cmc_idpram_get_rx_head(int dev_id); -static u32 cmc_idpram_get_rx_tail(int dev_id); -static void cmc_idpram_set_rx_head(int dev_id, u32 head); -static void cmc_idpram_set_rx_tail(int dev_id, u32 tail); -static u8 __iomem *cmc_idpram_get_rx_buff(int dev_id); -static u32 cmc_idpram_get_rx_buff_size(int dev_id); - -static u16 cmc_idpram_get_mask_req_ack(int dev_id); -static u16 cmc_idpram_get_mask_res_ack(int dev_id); -static u16 cmc_idpram_get_mask_send(int dev_id); - -static struct modemlink_dpram_control cmc_idpram_ctrl = { - .reset = cmc_idpram_reset, - - .setup_speed = cmc_idpram_setup_speed, - - .wakeup = cmc_idpram_wakeup, - .sleep = cmc_idpram_sleep, - - .clear_intr = cmc_idpram_clr_intr, - .recv_intr = cmc_idpram_recv_intr, - .send_intr = cmc_idpram_send_intr, - .recv_msg = cmc_idpram_recv_msg, - .send_msg = cmc_idpram_send_msg, - - .get_magic = cmc_idpram_get_magic, - .set_magic = cmc_idpram_set_magic, - .get_access = cmc_idpram_get_access, - .set_access = cmc_idpram_set_access, - - .get_tx_head = cmc_idpram_get_tx_head, - .get_tx_tail = cmc_idpram_get_tx_tail, - .set_tx_head = cmc_idpram_set_tx_head, - .set_tx_tail = cmc_idpram_set_tx_tail, - .get_tx_buff = cmc_idpram_get_tx_buff, - .get_tx_buff_size = cmc_idpram_get_tx_buff_size, - - .get_rx_head = cmc_idpram_get_rx_head, - .get_rx_tail = cmc_idpram_get_rx_tail, - .set_rx_head = cmc_idpram_set_rx_head, - .set_rx_tail = cmc_idpram_set_rx_tail, - .get_rx_buff = cmc_idpram_get_rx_buff, - .get_rx_buff_size = cmc_idpram_get_rx_buff_size, - - .get_mask_req_ack = cmc_idpram_get_mask_req_ack, - .get_mask_res_ack = cmc_idpram_get_mask_res_ack, - .get_mask_send = cmc_idpram_get_mask_send, - - .dp_base = NULL, - .dp_size = 0, - .dp_type = CP_IDPRAM, - .aligned = 1, - - .dpram_irq = CMC_IDPRAM_INT_IRQ_00, - .dpram_irq_flags = (IRQF_NO_SUSPEND | IRQF_TRIGGER_RISING), - .dpram_irq_name = "CMC221_IDPRAM_IRQ", - .dpram_wlock_name = "CMC221_IDPRAM_WLOCK", - - .max_ipc_dev = MAX_CMC_IDPRAM_IPC_DEV, -}; - -/* -** UMTS target platform data -*/ -static struct modem_io_t umts_io_devices[] = { - [0] = { - .name = "umts_boot0", - .id = 0, - .format = IPC_BOOT, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [1] = { - .name = "umts_ipc0", - .id = 235, - .format = IPC_FMT, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [2] = { - .name = "umts_rfs0", - .id = 245, - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [3] = { - .name = "lte_multipdp", - .id = 0, - .format = IPC_MULTI_RAW, - .io_type = IODEV_DUMMY, - .links = LINKTYPE(LINKDEV_DPRAM) | LINKTYPE(LINKDEV_USB), - .tx_link = LINKDEV_DPRAM, - }, - [4] = { - .name = "lte_rmnet0", - .id = 10, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM) | LINKTYPE(LINKDEV_USB), - .tx_link = LINKDEV_DPRAM, - }, - [5] = { - .name = "lte_rmnet1", - .id = 11, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM) | LINKTYPE(LINKDEV_USB), - .tx_link = LINKDEV_DPRAM, - }, - [6] = { - .name = "lte_rmnet2", - .id = 12, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM) | LINKTYPE(LINKDEV_USB), - .tx_link = LINKDEV_DPRAM, - }, - [7] = { - .name = "lte_rmnet3", - .id = 13, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM) | LINKTYPE(LINKDEV_USB), - .tx_link = LINKDEV_DPRAM, - }, - [8] = { - .name = "umts_csd", /* CS Video Telephony */ - .id = 1, - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [9] = { - .name = "umts_router", /* AT Iface & Dial-up */ - .id = 25, - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [10] = { - .name = "umts_dm0", /* DM Port */ - .id = 28, - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [11] = { - .name = "umts_loopback_ap2cp", - .id = 30, - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [12] = { - .name = "umts_loopback_cp2ap", - .id = 31, - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [13] = { - .name = "umts_ramdump0", - .id = 0, - .format = IPC_RAMDUMP, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [14] = { - .name = "lte_ipc0", - .id = 235, - .format = IPC_FMT, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_USB), - }, -}; - -static int exynos_cpu_frequency_lock(void); -static int exynos_cpu_frequency_unlock(void); - -static struct modemlink_pm_data umts_link_pm_data = { - .name = "umts_link_pm", - - .gpio_link_enable = 0, - .gpio_link_active = GPIO_ACTIVE_STATE, - .gpio_link_hostwake = GPIO_IPC_HOST_WAKEUP, - .gpio_link_slavewake = GPIO_IPC_SLAVE_WAKEUP, - - .port_enable = host_port_enable, -/* - .link_reconnect = umts_link_reconnect, -*/ - .freqlock = ATOMIC_INIT(0), - .cpufreq_lock = exynos_cpu_frequency_lock, - .cpufreq_unlock = exynos_cpu_frequency_unlock, - - .autosuspend_delay_ms = 2000, - - .has_usbhub = true, -}; - -static struct modem_data umts_modem_data = { - .name = "cmc221", - - .gpio_cp_on = CP_CMC221_PMIC_PWRON, - .gpio_cp_reset = CP_CMC221_CPU_RST, - .gpio_phone_active = GPIO_LTE_ACTIVE, - - .gpio_dpram_int = GPIO_CMC_IDPRAM_INT_00, - .gpio_dpram_status = GPIO_CMC_IDPRAM_STATUS, - .gpio_dpram_wakeup = GPIO_CMC_IDPRAM_WAKEUP, - - .gpio_slave_wakeup = GPIO_IPC_SLAVE_WAKEUP, - .gpio_host_active = GPIO_ACTIVE_STATE, - .gpio_host_wakeup = GPIO_IPC_HOST_WAKEUP, - - .modem_net = UMTS_NETWORK, - .modem_type = SEC_CMC221, - .link_types = LINKTYPE(LINKDEV_DPRAM) | LINKTYPE(LINKDEV_USB), - .link_name = "cmc221_idpram", - .dpram_ctl = &cmc_idpram_ctrl, - - .num_iodevs = ARRAY_SIZE(umts_io_devices), - .iodevs = umts_io_devices, - - .link_pm_data = &umts_link_pm_data, - - .use_handover = true, - - .ipc_version = SIPC_VER_50, - .use_mif_log = true, -}; - -static struct resource umts_modem_res[] = { - [0] = { - .name = "cp_active_irq", - .start = LTE_ACTIVE_IRQ, - .end = LTE_ACTIVE_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device umts_modem = { - .name = "mif_sipc5", - .id = 1, - .num_resources = ARRAY_SIZE(umts_modem_res), - .resource = umts_modem_res, - .dev = { - .platform_data = &umts_modem_data, - }, -}; - -#define HUB_STATE_OFF 0 -void set_hsic_lpa_states(int states) -{ - int val = gpio_get_value(umts_modem_data.gpio_cp_reset); - - mif_trace("\n"); - - if (val && states == STATE_HSIC_LPA_ENTER) { - mif_info("usb3503: hub off - lpa\n"); - host_port_enable(2, 0); - *(umts_link_pm_data.p_hub_status) = HUB_STATE_OFF; - } -} - -int get_cp_active_state(void) -{ - return gpio_get_value(umts_modem_data.gpio_phone_active); -} - -static void cmc_idpram_reset(void) -{ - iowrite16(1, cmc_sfr.reset); -} - -static void cmc_idpram_setup_speed(enum dpram_speed speed) -{ - setup_dpram_speed(cmc_idpram_cfg.csn, &cmc_idpram_access_cfg[speed]); -} - -static int cmc_idpram_wakeup(void) -{ - int cnt = 0; - - gpio_set_value(umts_modem_data.gpio_dpram_wakeup, 1); - - while (!gpio_get_value(umts_modem_data.gpio_dpram_status)) { - if (cnt++ > 10) { - mif_err("ERR: gpio_dpram_status == 0\n"); - return -EAGAIN; - } - - if (in_interrupt()) - mdelay(1); - else - msleep_interruptible(1); - } - - return 0; -} - -static void cmc_idpram_sleep(void) -{ - gpio_set_value(umts_modem_data.gpio_dpram_wakeup, 0); -} - -static void cmc_idpram_clr_intr(void) -{ - iowrite16(0xFFFF, cmc_sfr.clr_int2ap); - iowrite16(0, cmc_sfr.int2ap); -} - -static u16 cmc_idpram_recv_intr(void) -{ - return ioread16(cmc_sfr.int2ap); -} - -static void cmc_idpram_send_intr(u16 irq_mask) -{ - iowrite16(irq_mask, cmc_sfr.int2cp); -} - -static u16 cmc_idpram_recv_msg(void) -{ - return ioread16(cmc_sfr.msg2ap); -} - -static void cmc_idpram_send_msg(u16 msg) -{ - iowrite16(msg, cmc_sfr.msg2cp); -} - -static u16 cmc_idpram_get_magic(void) -{ - return ioread16(cmc_ipc_map.magic); -} - -static void cmc_idpram_set_magic(u16 value) -{ - iowrite16(value, cmc_ipc_map.magic); -} - -static u16 cmc_idpram_get_access(void) -{ - return ioread16(cmc_ipc_map.access); -} - -static void cmc_idpram_set_access(u16 value) -{ - iowrite16(value, cmc_ipc_map.access); -} - -static u32 cmc_idpram_get_tx_head(int dev_id) -{ - return ioread16(cmc_ipc_map.dev[dev_id].txq.head); -} - -static u32 cmc_idpram_get_tx_tail(int dev_id) -{ - return ioread16(cmc_ipc_map.dev[dev_id].txq.tail); -} - -static void cmc_idpram_set_tx_head(int dev_id, u32 head) -{ - int cnt = 100; - u32 val = 0; - - iowrite16((u16)head, cmc_ipc_map.dev[dev_id].txq.head); - - do { - /* Check head value written */ - val = ioread16(cmc_ipc_map.dev[dev_id].txq.head); - if (val == head) - break; - - mif_err("ERR: txq.head(%d) != head(%d)\n", val, head); - - /* Write head value again */ - iowrite16((u16)head, cmc_ipc_map.dev[dev_id].txq.head); - } while (cnt--); -} - -static void cmc_idpram_set_tx_tail(int dev_id, u32 tail) -{ - int cnt = 100; - u32 val = 0; - - iowrite16((u16)tail, cmc_ipc_map.dev[dev_id].txq.tail); - - do { - /* Check tail value written */ - val = ioread16(cmc_ipc_map.dev[dev_id].txq.tail); - if (val == tail) - break; - - mif_err("ERR: txq.tail(%d) != tail(%d)\n", val, tail); - - /* Write tail value again */ - iowrite16((u16)tail, cmc_ipc_map.dev[dev_id].txq.tail); - } while (cnt--); -} - -static u8 __iomem *cmc_idpram_get_tx_buff(int dev_id) -{ - return cmc_ipc_map.dev[dev_id].txq.buff; -} - -static u32 cmc_idpram_get_tx_buff_size(int dev_id) -{ - return cmc_ipc_map.dev[dev_id].txq.size; -} - -static u32 cmc_idpram_get_rx_head(int dev_id) -{ - return ioread16(cmc_ipc_map.dev[dev_id].rxq.head); -} - -static u32 cmc_idpram_get_rx_tail(int dev_id) -{ - return ioread16(cmc_ipc_map.dev[dev_id].rxq.tail); -} - -static void cmc_idpram_set_rx_head(int dev_id, u32 head) -{ - int cnt = 100; - u32 val = 0; - - iowrite16((u16)head, cmc_ipc_map.dev[dev_id].rxq.head); - - do { - /* Check head value written */ - val = ioread16(cmc_ipc_map.dev[dev_id].rxq.head); - if (val == head) - break; - - mif_err("ERR: rxq.head(%d) != head(%d)\n", val, head); - - /* Write head value again */ - iowrite16((u16)head, cmc_ipc_map.dev[dev_id].rxq.head); - } while (cnt--); -} - -static void cmc_idpram_set_rx_tail(int dev_id, u32 tail) -{ - int cnt = 100; - u32 val = 0; - - iowrite16((u16)tail, cmc_ipc_map.dev[dev_id].rxq.tail); - - do { - /* Check tail value written */ - val = ioread16(cmc_ipc_map.dev[dev_id].rxq.tail); - if (val == tail) - break; - - mif_err("ERR: rxq.tail(%d) != tail(%d)\n", val, tail); - - /* Write tail value again */ - iowrite16((u16)tail, cmc_ipc_map.dev[dev_id].rxq.tail); - } while (cnt--); -} - -static u8 __iomem *cmc_idpram_get_rx_buff(int dev_id) -{ - return cmc_ipc_map.dev[dev_id].rxq.buff; -} - -static u32 cmc_idpram_get_rx_buff_size(int dev_id) -{ - return cmc_ipc_map.dev[dev_id].rxq.size; -} - -static u16 cmc_idpram_get_mask_req_ack(int dev_id) -{ - return cmc_ipc_map.dev[dev_id].mask_req_ack; -} - -static u16 cmc_idpram_get_mask_res_ack(int dev_id) -{ - return cmc_ipc_map.dev[dev_id].mask_res_ack; -} - -static u16 cmc_idpram_get_mask_send(int dev_id) -{ - return cmc_ipc_map.dev[dev_id].mask_send; -} - -/* Set dynamic environment for a modem */ -static void setup_umts_modem_env(void) -{ - /* - ** Config DPRAM control structure - */ - if (system_rev == 1 || system_rev >= 4) - cmc_idpram_cfg.csn = 0; - else - cmc_idpram_cfg.csn = 1; - - cmc_idpram_cfg.addr = SROM_CS0_BASE + (SROM_WIDTH * cmc_idpram_cfg.csn); - cmc_idpram_cfg.end = cmc_idpram_cfg.addr + cmc_idpram_cfg.size - 1; - - if (system_rev == 1 || system_rev >= 4) { - umts_modem_data.gpio_dpram_int = GPIO_CMC_IDPRAM_INT_01; - cmc_idpram_ctrl.dpram_irq = CMC_IDPRAM_INT_IRQ_01; - } -} - -static void config_umts_modem_gpio(void) -{ - int err; - unsigned gpio_cp_on = umts_modem_data.gpio_cp_on; - unsigned gpio_cp_rst = umts_modem_data.gpio_cp_reset; - unsigned gpio_pda_active = umts_modem_data.gpio_pda_active; - unsigned gpio_phone_active = umts_modem_data.gpio_phone_active; - unsigned gpio_active_state = umts_modem_data.gpio_host_active; - unsigned gpio_host_wakeup = umts_modem_data.gpio_host_wakeup; - unsigned gpio_slave_wakeup = umts_modem_data.gpio_slave_wakeup; - unsigned gpio_dpram_int = umts_modem_data.gpio_dpram_int; - unsigned gpio_dpram_status = umts_modem_data.gpio_dpram_status; - unsigned gpio_dpram_wakeup = umts_modem_data.gpio_dpram_wakeup; - - if (gpio_cp_on) { - err = gpio_request(gpio_cp_on, "CMC_ON"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", "CMC_ON"); - } else { - gpio_direction_output(gpio_cp_on, 0); - s3c_gpio_setpull(gpio_cp_on, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_cp_rst) { - err = gpio_request(gpio_cp_rst, "CMC_RST"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", "CMC_RST"); - } else { - gpio_direction_output(gpio_cp_rst, 0); - s3c_gpio_setpull(gpio_cp_rst, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_pda_active) { - err = gpio_request(gpio_pda_active, "PDA_ACTIVE"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", "PDA_ACTIVE"); - } else { - gpio_direction_output(gpio_pda_active, 0); - s3c_gpio_setpull(gpio_pda_active, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_phone_active) { - err = gpio_request(gpio_phone_active, "CMC_ACTIVE"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", "CMC_ACTIVE"); - } else { - /* Configure as a wake-up source */ - gpio_direction_input(gpio_phone_active); - s3c_gpio_setpull(gpio_phone_active, S3C_GPIO_PULL_DOWN); - s3c_gpio_cfgpin(gpio_phone_active, S3C_GPIO_SFN(0xF)); - } - } - - if (gpio_active_state) { - err = gpio_request(gpio_active_state, "CMC_ACTIVE_STATE"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", - "CMC_ACTIVE_STATE"); - } else { - gpio_direction_output(gpio_active_state, 0); - s3c_gpio_setpull(gpio_active_state, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_slave_wakeup) { - err = gpio_request(gpio_slave_wakeup, "CMC_SLAVE_WAKEUP"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", - "CMC_SLAVE_WAKEUP"); - } else { - gpio_direction_output(gpio_slave_wakeup, 0); - s3c_gpio_setpull(gpio_slave_wakeup, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_host_wakeup) { - err = gpio_request(gpio_host_wakeup, "CMC_HOST_WAKEUP"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", - "CMC_HOST_WAKEUP"); - } else { - /* Configure as a wake-up source */ - gpio_direction_input(gpio_host_wakeup); - s3c_gpio_setpull(gpio_host_wakeup, S3C_GPIO_PULL_DOWN); - s3c_gpio_cfgpin(gpio_host_wakeup, S3C_GPIO_SFN(0xF)); - } - } - - if (gpio_dpram_int) { - err = gpio_request(gpio_dpram_int, "CMC_DPRAM_INT"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", - "CMC_DPRAM_INT"); - } else { - /* Configure as a wake-up source */ - gpio_direction_input(gpio_dpram_int); - s3c_gpio_setpull(gpio_dpram_int, S3C_GPIO_PULL_NONE); - s3c_gpio_cfgpin(gpio_dpram_int, S3C_GPIO_SFN(0xF)); - } - } - - if (gpio_dpram_status) { - err = gpio_request(gpio_dpram_status, "CMC_DPRAM_STATUS"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", - "CMC_DPRAM_STATUS"); - } else { - gpio_direction_input(gpio_dpram_status); - s3c_gpio_setpull(gpio_dpram_status, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_dpram_wakeup) { - err = gpio_request(gpio_dpram_wakeup, "CMC_DPRAM_WAKEUP"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", - "CMC_DPRAM_WAKEUP"); - } else { - gpio_direction_output(gpio_dpram_wakeup, 1); - s3c_gpio_setpull(gpio_dpram_wakeup, S3C_GPIO_PULL_NONE); - } - } -} - -static u8 *cmc_idpram_remap_mem_region(struct sromc_cfg *cfg) -{ - int dp_addr = cfg->addr; - int dp_size = cfg->size; - u8 __iomem *dp_base; - struct dpram_ipc_cfg *ipc_map; - struct dpram_ipc_device *dev; - - /* Remap DPRAM memory region */ - dp_base = (u8 __iomem *)ioremap_nocache(dp_addr, dp_size); - if (!dp_base) { - mif_err("ERR: ioremap_nocache for dp_base fail\n"); - return NULL; - } - mif_err("DPRAM VA=0x%08X\n", (int)dp_base); - - /* Remap DPRAM SFR region */ - dp_addr += dp_size; - cmc_sfr_base = (u8 __iomem *)ioremap_nocache(dp_addr, dp_size); - if (cmc_sfr_base == NULL) { - iounmap(dp_base); - mif_err("ERR: ioremap_nocache for cmc_sfr_base fail\n"); - return NULL; - } - - cmc_sfr.int2cp = (u16 __iomem *)(cmc_sfr_base + CMC_INT2CP_REG); - cmc_sfr.int2ap = (u16 __iomem *)(cmc_sfr_base + CMC_INT2AP_REG); - cmc_sfr.clr_int2ap = (u16 __iomem *)(cmc_sfr_base + CMC_CLR_INT_REG); - cmc_sfr.reset = (u16 __iomem *)(cmc_sfr_base + CMC_RESET_REG); - cmc_sfr.msg2cp = (u16 __iomem *)(cmc_sfr_base + CMC_PUT_REG); - cmc_sfr.msg2ap = (u16 __iomem *)(cmc_sfr_base + CMC_GET_REG); - - cmc_idpram_ctrl.dp_base = (u8 __iomem *)dp_base; - cmc_idpram_ctrl.dp_size = dp_size; - - /* Map for IPC */ - ipc_map = (struct dpram_ipc_cfg *)dp_base; - - /* Magic code and access enable fields */ - cmc_ipc_map.magic = (u16 __iomem *)&ipc_map->magic; - cmc_ipc_map.access = (u16 __iomem *)&ipc_map->access; - - /* FMT */ - dev = &cmc_ipc_map.dev[IPC_FMT]; - - strcpy(dev->name, "FMT"); - dev->id = IPC_FMT; - - dev->txq.head = (u16 __iomem *)&ipc_map->fmt_tx_head; - dev->txq.tail = (u16 __iomem *)&ipc_map->fmt_tx_tail; - dev->txq.buff = (u8 __iomem *)&ipc_map->fmt_tx_buff[0]; - dev->txq.size = DP_FMT_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&ipc_map->fmt_rx_head; - dev->rxq.tail = (u16 __iomem *)&ipc_map->fmt_rx_tail; - dev->rxq.buff = (u8 __iomem *)&ipc_map->fmt_rx_buff[0]; - dev->rxq.size = DP_FMT_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_F; - dev->mask_res_ack = INT_MASK_RES_ACK_F; - dev->mask_send = INT_MASK_SEND_F; - - /* RAW */ - dev = &cmc_ipc_map.dev[IPC_RAW]; - - strcpy(dev->name, "RAW"); - dev->id = IPC_RAW; - - dev->txq.head = (u16 __iomem *)&ipc_map->raw_tx_head; - dev->txq.tail = (u16 __iomem *)&ipc_map->raw_tx_tail; - dev->txq.buff = (u8 __iomem *)&ipc_map->raw_tx_buff[0]; - dev->txq.size = DP_RAW_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&ipc_map->raw_rx_head; - dev->rxq.tail = (u16 __iomem *)&ipc_map->raw_rx_tail; - dev->rxq.buff = (u8 __iomem *)&ipc_map->raw_rx_buff[0]; - dev->rxq.size = DP_RAW_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_R; - dev->mask_res_ack = INT_MASK_RES_ACK_R; - dev->mask_send = INT_MASK_SEND_R; - - return dp_base; -} -#endif - -#ifdef CONFIG_CDMA_MODEM_CBP72 -static struct sromc_cfg cbp_edpram_cfg = { - .attr = SROMC_DATA_16 | SROMC_BYTE_EN, - .size = CBP_EDPRAM_SIZE, -}; - -static struct sromc_access_cfg cbp_edpram_access_cfg[] = { - [DPRAM_SPEED_LOW] = { - .tacs = 0x00 << 28, - .tcos = 0x00 << 24, - .tacc = 0x0F << 16, - .tcoh = 0x00 << 12, - .tcah = 0x00 << 8, - .tacp = 0x00 << 4, - .pmc = 0x00 << 0, - }, -}; - -/* - magic_code + - access_enable + - fmt_tx_head + fmt_tx_tail + fmt_tx_buff + - raw_tx_head + raw_tx_tail + raw_tx_buff + - fmt_rx_head + fmt_rx_tail + fmt_rx_buff + - raw_rx_head + raw_rx_tail + raw_rx_buff + - mbx_cp2ap + - mbx_ap2cp - = 2 + - 2 + - 2 + 2 + 1336 + - 2 + 2 + 4564 + - 2 + 2 + 1336 + - 2 + 2 + 9124 + - 2 + - 2 - = 16384 -*/ - -#define CBP_DP_FMT_TX_BUFF_SZ 1336 -#define CBP_DP_RAW_TX_BUFF_SZ 4564 -#define CBP_DP_FMT_RX_BUFF_SZ 1336 -#define CBP_DP_RAW_RX_BUFF_SZ 9124 - -#define MAX_CBP_EDPRAM_IPC_DEV (IPC_RAW + 1) /* FMT, RAW */ - -struct cbp_edpram_ipc_cfg { - u16 magic; - u16 access; - - u16 fmt_tx_head; - u16 fmt_tx_tail; - u8 fmt_tx_buff[CBP_DP_FMT_TX_BUFF_SZ]; - - u16 raw_tx_head; - u16 raw_tx_tail; - u8 raw_tx_buff[CBP_DP_RAW_TX_BUFF_SZ]; - - u16 fmt_rx_head; - u16 fmt_rx_tail; - u8 fmt_rx_buff[CBP_DP_FMT_RX_BUFF_SZ]; - - u16 raw_rx_head; - u16 raw_rx_tail; - u8 raw_rx_buff[CBP_DP_RAW_RX_BUFF_SZ]; - - u16 mbx_cp2ap; - u16 mbx_ap2cp; -}; - -static struct dpram_ipc_map cbp_ipc_map; - -static void cbp_edpram_reset(void); -static void cbp_edpram_clr_intr(void); -static u16 cbp_edpram_recv_intr(void); -static void cbp_edpram_send_intr(u16 irq_mask); -static u16 cbp_edpram_recv_msg(void); -static void cbp_edpram_send_msg(u16 msg); - -static u16 cbp_edpram_get_magic(void); -static void cbp_edpram_set_magic(u16 value); -static u16 cbp_edpram_get_access(void); -static void cbp_edpram_set_access(u16 value); - -static u32 cbp_edpram_get_tx_head(int dev_id); -static u32 cbp_edpram_get_tx_tail(int dev_id); -static void cbp_edpram_set_tx_head(int dev_id, u32 head); -static void cbp_edpram_set_tx_tail(int dev_id, u32 tail); -static u8 __iomem *cbp_edpram_get_tx_buff(int dev_id); -static u32 cbp_edpram_get_tx_buff_size(int dev_id); - -static u32 cbp_edpram_get_rx_head(int dev_id); -static u32 cbp_edpram_get_rx_tail(int dev_id); -static void cbp_edpram_set_rx_head(int dev_id, u32 head); -static void cbp_edpram_set_rx_tail(int dev_id, u32 tail); -static u8 __iomem *cbp_edpram_get_rx_buff(int dev_id); -static u32 cbp_edpram_get_rx_buff_size(int dev_id); - -static u16 cbp_edpram_get_mask_req_ack(int dev_id); -static u16 cbp_edpram_get_mask_res_ack(int dev_id); -static u16 cbp_edpram_get_mask_send(int dev_id); - -static struct modemlink_dpram_control cbp_edpram_ctrl = { - .reset = cbp_edpram_reset, - - .clear_intr = cbp_edpram_clr_intr, - .recv_intr = cbp_edpram_recv_intr, - .send_intr = cbp_edpram_send_intr, - .recv_msg = cbp_edpram_recv_msg, - .send_msg = cbp_edpram_send_msg, - - .get_magic = cbp_edpram_get_magic, - .set_magic = cbp_edpram_set_magic, - .get_access = cbp_edpram_get_access, - .set_access = cbp_edpram_set_access, - - .get_tx_head = cbp_edpram_get_tx_head, - .get_tx_tail = cbp_edpram_get_tx_tail, - .set_tx_head = cbp_edpram_set_tx_head, - .set_tx_tail = cbp_edpram_set_tx_tail, - .get_tx_buff = cbp_edpram_get_tx_buff, - .get_tx_buff_size = cbp_edpram_get_tx_buff_size, - - .get_rx_head = cbp_edpram_get_rx_head, - .get_rx_tail = cbp_edpram_get_rx_tail, - .set_rx_head = cbp_edpram_set_rx_head, - .set_rx_tail = cbp_edpram_set_rx_tail, - .get_rx_buff = cbp_edpram_get_rx_buff, - .get_rx_buff_size = cbp_edpram_get_rx_buff_size, - - .get_mask_req_ack = cbp_edpram_get_mask_req_ack, - .get_mask_res_ack = cbp_edpram_get_mask_res_ack, - .get_mask_send = cbp_edpram_get_mask_send, - - .dp_base = NULL, - .dp_size = 0, - .dp_type = EXT_DPRAM, - .aligned = 1, - - .dpram_irq = CBP_DPRAM_INT_IRQ_00, - .dpram_irq_flags = (IRQF_NO_SUSPEND | IRQF_TRIGGER_FALLING), - .dpram_irq_name = "CBP72_EDPRAM_IRQ", - .dpram_wlock_name = "CBP72_EDPRAM_WLOCK", - - .max_ipc_dev = MAX_CBP_EDPRAM_IPC_DEV, -}; - -/* -** CDMA target platform data -*/ -static struct modem_io_t cdma_io_devices[] = { - [0] = { - .name = "cdma_boot0", - .id = 0, - .format = IPC_BOOT, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [1] = { - .name = "cdma_ipc0", - .id = 235, - .format = IPC_FMT, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [2] = { - .name = "cdma_rfs0", - .id = 245, - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [3] = { - .name = "cdma_multipdp", - .id = 0, - .format = IPC_MULTI_RAW, - .io_type = IODEV_DUMMY, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [4] = { - .name = "cdma_rmnet0", - .id = 10, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [5] = { - .name = "cdma_rmnet1", - .id = 11, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [6] = { - .name = "cdma_rmnet2", - .id = 12, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [7] = { - .name = "cdma_rmnet3", - .id = 13, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [8] = { - .name = "cdma_rmnet4", - .id = 7, - .format = IPC_RAW, - .io_type = IODEV_NET, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [9] = { - .name = "cdma_rmnet5", /* DM Port IO device */ - .id = 26, - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [10] = { - .name = "cdma_rmnet6", /* AT CMD IO device */ - .id = 17, - .format = IPC_RAW, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, - [11] = { - .name = "cdma_ramdump0", - .id = 0, - .format = IPC_RAMDUMP, - .io_type = IODEV_MISC, - .links = LINKTYPE(LINKDEV_DPRAM), - }, -}; - -static struct modem_data cdma_modem_data = { - .name = "cbp7.2", - - .gpio_cp_on = GPIO_CBP_PMIC_PWRON, - .gpio_cp_off = GPIO_CBP_PS_HOLD_OFF, - .gpio_cp_reset = GPIO_CBP_CP_RST, - .gpio_pda_active = GPIO_PDA_ACTIVE, - .gpio_phone_active = GPIO_CBP_PHONE_ACTIVE, - - .gpio_dpram_int = GPIO_CBP_DPRAM_INT_00, - - .modem_net = CDMA_NETWORK, - .modem_type = VIA_CBP72, - .link_types = LINKTYPE(LINKDEV_DPRAM), - .link_name = "cbp72_edpram", - .dpram_ctl = &cbp_edpram_ctrl, - - .num_iodevs = ARRAY_SIZE(cdma_io_devices), - .iodevs = cdma_io_devices, - - .use_handover = true, - - .ipc_version = SIPC_VER_50, -}; - -static struct resource cdma_modem_res[] = { - [0] = { - .name = "cp_active_irq", - .start = CBP_PHONE_ACTIVE_IRQ, - .end = CBP_PHONE_ACTIVE_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device cdma_modem = { - .name = "mif_sipc5", - .id = 2, - .num_resources = ARRAY_SIZE(cdma_modem_res), - .resource = cdma_modem_res, - .dev = { - .platform_data = &cdma_modem_data, - }, -}; - -static void cbp_edpram_reset(void) -{ - return; -} - -static void cbp_edpram_clr_intr(void) -{ - ioread16(cbp_ipc_map.mbx_cp2ap); -} - -static u16 cbp_edpram_recv_intr(void) -{ - return ioread16(cbp_ipc_map.mbx_cp2ap); -} - -static void cbp_edpram_send_intr(u16 irq_mask) -{ - iowrite16(irq_mask, cbp_ipc_map.mbx_ap2cp); -} - -static u16 cbp_edpram_recv_msg(void) -{ - return ioread16(cbp_ipc_map.mbx_cp2ap); -} - -static void cbp_edpram_send_msg(u16 msg) -{ - iowrite16(msg, cbp_ipc_map.mbx_ap2cp); -} - -static u16 cbp_edpram_get_magic(void) -{ - return ioread16(cbp_ipc_map.magic); -} - -static void cbp_edpram_set_magic(u16 value) -{ - iowrite16(value, cbp_ipc_map.magic); -} - -static u16 cbp_edpram_get_access(void) -{ - return ioread16(cbp_ipc_map.access); -} - -static void cbp_edpram_set_access(u16 value) -{ - iowrite16(value, cbp_ipc_map.access); -} - -static u32 cbp_edpram_get_tx_head(int dev_id) -{ - return ioread16(cbp_ipc_map.dev[dev_id].txq.head); -} - -static u32 cbp_edpram_get_tx_tail(int dev_id) -{ - return ioread16(cbp_ipc_map.dev[dev_id].txq.tail); -} - -static void cbp_edpram_set_tx_head(int dev_id, u32 head) -{ - iowrite16((u16)head, cbp_ipc_map.dev[dev_id].txq.head); -} - -static void cbp_edpram_set_tx_tail(int dev_id, u32 tail) -{ - iowrite16((u16)tail, cbp_ipc_map.dev[dev_id].txq.tail); -} - -static u8 __iomem *cbp_edpram_get_tx_buff(int dev_id) -{ - return cbp_ipc_map.dev[dev_id].txq.buff; -} - -static u32 cbp_edpram_get_tx_buff_size(int dev_id) -{ - return cbp_ipc_map.dev[dev_id].txq.size; -} - -static u32 cbp_edpram_get_rx_head(int dev_id) -{ - return ioread16(cbp_ipc_map.dev[dev_id].rxq.head); -} - -static u32 cbp_edpram_get_rx_tail(int dev_id) -{ - return ioread16(cbp_ipc_map.dev[dev_id].rxq.tail); -} - -static void cbp_edpram_set_rx_head(int dev_id, u32 head) -{ - return iowrite16((u16)head, cbp_ipc_map.dev[dev_id].rxq.head); -} - -static void cbp_edpram_set_rx_tail(int dev_id, u32 tail) -{ - return iowrite16((u16)tail, cbp_ipc_map.dev[dev_id].rxq.tail); -} - -static u8 __iomem *cbp_edpram_get_rx_buff(int dev_id) -{ - return cbp_ipc_map.dev[dev_id].rxq.buff; -} - -static u32 cbp_edpram_get_rx_buff_size(int dev_id) -{ - return cbp_ipc_map.dev[dev_id].rxq.size; -} - -static u16 cbp_edpram_get_mask_req_ack(int dev_id) -{ - return cbp_ipc_map.dev[dev_id].mask_req_ack; -} - -static u16 cbp_edpram_get_mask_res_ack(int dev_id) -{ - return cbp_ipc_map.dev[dev_id].mask_res_ack; -} - -static u16 cbp_edpram_get_mask_send(int dev_id) -{ - return cbp_ipc_map.dev[dev_id].mask_send; -} - -/* Set dynamic environment for a modem */ -static void setup_cdma_modem_env(void) -{ - /* - ** Config DPRAM control structure - */ - if (system_rev == 1 || system_rev >= 4) - cbp_edpram_cfg.csn = 1; - else - cbp_edpram_cfg.csn = 0; - - cbp_edpram_cfg.addr = SROM_CS0_BASE + (SROM_WIDTH * cbp_edpram_cfg.csn); - cbp_edpram_cfg.end = cbp_edpram_cfg.addr + cbp_edpram_cfg.size - 1; - - if (system_rev == 1 || system_rev >= 4) { - cdma_modem_data.gpio_dpram_int = GPIO_CBP_DPRAM_INT_01; - cbp_edpram_ctrl.dpram_irq = CBP_DPRAM_INT_IRQ_01; - } -} - -static void config_cdma_modem_gpio(void) -{ - int err; - unsigned gpio_boot_sel = GPIO_CBP_BOOT_SEL; - unsigned gpio_cp_on = cdma_modem_data.gpio_cp_on; - unsigned gpio_cp_off = cdma_modem_data.gpio_cp_off; - unsigned gpio_cp_rst = cdma_modem_data.gpio_cp_reset; - unsigned gpio_pda_active = cdma_modem_data.gpio_pda_active; - unsigned gpio_phone_active = cdma_modem_data.gpio_phone_active; - unsigned gpio_dpram_int = cdma_modem_data.gpio_dpram_int; - - pr_info("[MDM] <%s>\n", __func__); - - if (gpio_boot_sel) { - err = gpio_request(gpio_boot_sel, "CBP_BOOT_SEL"); - if (err) { - pr_err("fail to request gpio %s\n", "CBP_BOOT_SEL"); - } else { - gpio_direction_output(gpio_boot_sel, 0); - s3c_gpio_setpull(gpio_boot_sel, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_cp_on) { - err = gpio_request(gpio_cp_on, "CBP_ON"); - if (err) { - pr_err("fail to request gpio %s\n", "CBP_ON"); - } else { - gpio_direction_output(gpio_cp_on, 0); - s3c_gpio_setpull(gpio_cp_on, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_cp_off) { - err = gpio_request(gpio_cp_off, "CBP_OFF"); - if (err) { - pr_err("fail to request gpio %s\n", "CBP_OFF"); - } else { - gpio_direction_output(gpio_cp_off, 1); - s3c_gpio_setpull(gpio_cp_off, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_cp_rst) { - err = gpio_request(gpio_cp_rst, "CBP_RST"); - if (err) { - pr_err("fail to request gpio %s\n", "CBP_RST"); - } else { - gpio_direction_output(gpio_cp_rst, 0); - s3c_gpio_setpull(gpio_cp_rst, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_pda_active) { - err = gpio_request(gpio_pda_active, "PDA_ACTIVE"); - if (err) { - pr_err("fail to request gpio %s\n", "PDA_ACTIVE"); - } else { - gpio_direction_output(gpio_pda_active, 0); - s3c_gpio_setpull(gpio_pda_active, S3C_GPIO_PULL_NONE); - } - } - - if (gpio_phone_active) { - err = gpio_request(gpio_phone_active, "CBP_ACTIVE"); - if (err) { - pr_err("fail to request gpio %s\n", "CBP_ACTIVE"); - } else { - /* Configure as a wake-up source */ - gpio_direction_input(gpio_phone_active); - s3c_gpio_setpull(gpio_phone_active, S3C_GPIO_PULL_NONE); - s3c_gpio_cfgpin(gpio_phone_active, S3C_GPIO_SFN(0xF)); - } - } - - if (gpio_dpram_int) { - err = gpio_request(gpio_dpram_int, "CBP_DPRAM_INT"); - if (err) { - pr_err("fail to request gpio %s\n", "CBP_DPRAM_INT"); - } else { - /* Configure as a wake-up source */ - gpio_direction_input(gpio_dpram_int); - s3c_gpio_setpull(gpio_dpram_int, S3C_GPIO_PULL_NONE); - s3c_gpio_cfgpin(gpio_dpram_int, S3C_GPIO_SFN(0xF)); - } - } - - /* set low unused gpios between AP and CP */ - err = gpio_request(GPIO_FLM_RXD, "FLM_RXD"); - if (err) - pr_err(LOG_TAG "fail to request gpio %s : %d\n", "FLM_RXD", - err); - else { - gpio_direction_input(GPIO_FLM_RXD); - s3c_gpio_setpull(GPIO_FLM_RXD, S3C_GPIO_PULL_UP); - s3c_gpio_cfgpin(GPIO_FLM_RXD, S3C_GPIO_SFN(2)); - } - - err = gpio_request(GPIO_FLM_TXD, "FLM_TXD"); - if (err) - pr_err(LOG_TAG "fail to request gpio %s : %d\n", "FLM_TXD", - err); - else { - gpio_direction_input(GPIO_FLM_TXD); - s3c_gpio_setpull(GPIO_FLM_TXD, S3C_GPIO_PULL_NONE); - s3c_gpio_cfgpin(GPIO_FLM_TXD, S3C_GPIO_SFN(2)); - } -} - -static u8 *cbp_edpram_remap_mem_region(struct sromc_cfg *cfg) -{ - int dp_addr = 0; - int dp_size = 0; - u8 __iomem *dp_base = NULL; - struct cbp_edpram_ipc_cfg *ipc_map = NULL; - struct dpram_ipc_device *dev = NULL; - - dp_addr = cfg->addr; - dp_size = cfg->size; - dp_base = (u8 *)ioremap_nocache(dp_addr, dp_size); - if (!dp_base) { - pr_err("[MDM] <%s> dpram base ioremap fail\n", __func__); - return NULL; - } - pr_info("[MDM] <%s> DPRAM VA=0x%08X\n", __func__, (int)dp_base); - - cbp_edpram_ctrl.dp_base = (u8 __iomem *)dp_base; - cbp_edpram_ctrl.dp_size = dp_size; - - /* Map for IPC */ - ipc_map = (struct cbp_edpram_ipc_cfg *)dp_base; - - /* Magic code and access enable fields */ - cbp_ipc_map.magic = (u16 __iomem *)&ipc_map->magic; - cbp_ipc_map.access = (u16 __iomem *)&ipc_map->access; - - /* FMT */ - dev = &cbp_ipc_map.dev[IPC_FMT]; - - strcpy(dev->name, "FMT"); - dev->id = IPC_FMT; - - dev->txq.head = (u16 __iomem *)&ipc_map->fmt_tx_head; - dev->txq.tail = (u16 __iomem *)&ipc_map->fmt_tx_tail; - dev->txq.buff = (u8 __iomem *)&ipc_map->fmt_tx_buff[0]; - dev->txq.size = CBP_DP_FMT_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&ipc_map->fmt_rx_head; - dev->rxq.tail = (u16 __iomem *)&ipc_map->fmt_rx_tail; - dev->rxq.buff = (u8 __iomem *)&ipc_map->fmt_rx_buff[0]; - dev->rxq.size = CBP_DP_FMT_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_F; - dev->mask_res_ack = INT_MASK_RES_ACK_F; - dev->mask_send = INT_MASK_SEND_F; - - /* RAW */ - dev = &cbp_ipc_map.dev[IPC_RAW]; - - strcpy(dev->name, "RAW"); - dev->id = IPC_RAW; - - dev->txq.head = (u16 __iomem *)&ipc_map->raw_tx_head; - dev->txq.tail = (u16 __iomem *)&ipc_map->raw_tx_tail; - dev->txq.buff = (u8 __iomem *)&ipc_map->raw_tx_buff[0]; - dev->txq.size = CBP_DP_RAW_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&ipc_map->raw_rx_head; - dev->rxq.tail = (u16 __iomem *)&ipc_map->raw_rx_tail; - dev->rxq.buff = (u8 __iomem *)&ipc_map->raw_rx_buff[0]; - dev->rxq.size = CBP_DP_RAW_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_R; - dev->mask_res_ack = INT_MASK_RES_ACK_R; - dev->mask_send = INT_MASK_SEND_R; - - /* Mailboxes */ - cbp_ipc_map.mbx_ap2cp = (u16 __iomem *)&ipc_map->mbx_ap2cp; - cbp_ipc_map.mbx_cp2ap = (u16 __iomem *)&ipc_map->mbx_cp2ap; - - return dp_base; -} -#endif - -/** - * DPRAM GPIO settings - * - * SROM_NUM_ADDR_BITS value indicate the address line number or - * the mux/demux dpram type. if you want to set mux mode, define the - * SROM_NUM_ADDR_BITS to zero. - * - * for CMC22x - * CMC22x has 16KB + a SFR register address. - * It used 14 bits (13bits for 16KB word address and 1 bit for SFR - * register) - */ -static void config_dpram_port_gpio(void) -{ - int addr_bits = SROM_NUM_ADDR_BITS; - - mif_info("address line = %d bits\n", addr_bits); - - /* - ** Config DPRAM address/data GPIO pins - */ - - /* Set GPIO for address bus (13 ~ 14 bits) */ - switch (addr_bits) { - case 0: - break; - - case 13 ... 14: - s3c_gpio_cfgrange_nopull(GPIO_SROM_ADDR_BUS_LOW, - EXYNOS4_GPIO_Y3_NR, S3C_GPIO_SFN(2)); - s3c_gpio_cfgrange_nopull(GPIO_SROM_ADDR_BUS_HIGH, - (addr_bits - EXYNOS4_GPIO_Y3_NR), S3C_GPIO_SFN(2)); - break; - - default: - mif_err("ERR: invalid addr_bits!!!\n"); - return; - } - - /* Set GPIO for data bus (16 bits) */ - s3c_gpio_cfgrange_nopull(GPIO_SROM_DATA_BUS_LOW, 8, S3C_GPIO_SFN(2)); - s3c_gpio_cfgrange_nopull(GPIO_SROM_DATA_BUS_HIGH, 8, S3C_GPIO_SFN(2)); - - /* Setup SROMC CSn pins */ - s3c_gpio_cfgpin(GPIO_DPRAM_CSN0, S3C_GPIO_SFN(2)); - s3c_gpio_cfgpin((GPIO_DPRAM_CSN0 + 1), S3C_GPIO_SFN(2)); - - /* Config OEn, WEn */ - s3c_gpio_cfgpin(GPIO_DPRAM_REN, S3C_GPIO_SFN(2)); - s3c_gpio_cfgpin(GPIO_DPRAM_WEN, S3C_GPIO_SFN(2)); - - /* Config LBn, UBn */ - s3c_gpio_cfgpin(GPIO_DPRAM_LBN, S3C_GPIO_SFN(2)); - s3c_gpio_cfgpin(GPIO_DPRAM_UBN, S3C_GPIO_SFN(2)); -} - -static void init_sromc(void) -{ - struct clk *clk = NULL; - - /* SROMC clk enable */ - clk = clk_get(NULL, "sromc"); - if (!clk) { - mif_err("ERR: SROMC clock gate fail\n"); - return; - } - clk_enable(clk); -} - -static void setup_sromc -( - unsigned csn, - struct sromc_cfg *cfg, - struct sromc_access_cfg *acc_cfg -) -{ - unsigned bw = 0; /* Bus width and wait control */ - unsigned bc = 0; /* Vank control */ - void __iomem *bank_sfr = S5P_SROM_BC0 + (4 * csn); - - mif_err("SROMC settings for CS%d...\n", csn); - - bw = __raw_readl(S5P_SROM_BW); - bc = __raw_readl(bank_sfr); - mif_err("Old SROMC settings = BW(0x%08X) BC%d(0x%08X)\n", bw, csn, bc); - - /* Set the BW control field for the CSn */ - bw &= ~(SROMC_MASK << (csn << 2)); - bw |= (cfg->attr << (csn << 2)); - writel(bw, S5P_SROM_BW); - - /* Set SROMC memory access timing for the CSn */ - bc = acc_cfg->tacs | acc_cfg->tcos | acc_cfg->tacc | - acc_cfg->tcoh | acc_cfg->tcah | acc_cfg->tacp | acc_cfg->pmc; - - writel(bc, bank_sfr); - - /* Verify SROMC settings */ - bw = __raw_readl(S5P_SROM_BW); - bc = __raw_readl(bank_sfr); - mif_err("New SROMC settings = BW(0x%08X) BC%d(0x%08X)\n", bw, csn, bc); -} - -static void setup_dpram_speed(unsigned csn, struct sromc_access_cfg *acc_cfg) -{ - void __iomem *bank_sfr = S5P_SROM_BC0 + (4 * csn); - unsigned bc = 0; - - bc = __raw_readl(bank_sfr); - mif_info("Old CS%d setting = 0x%08X\n", csn, bc); - - /* SROMC memory access timing setting */ - bc = acc_cfg->tacs | acc_cfg->tcos | acc_cfg->tacc | - acc_cfg->tcoh | acc_cfg->tcah | acc_cfg->tacp | acc_cfg->pmc; - writel(bc, bank_sfr); - - bc = __raw_readl(bank_sfr); - mif_info("New CS%d setting = 0x%08X\n", csn, bc); -} - -static int __init init_modem(void) -{ - struct sromc_cfg *cfg = NULL; - struct sromc_access_cfg *acc_cfg = NULL; - - mif_err("System Revision = %d\n", system_rev); - - setup_umts_modem_env(); - setup_cdma_modem_env(); - - config_dpram_port_gpio(); - - config_umts_modem_gpio(); - config_cdma_modem_gpio(); - - init_sromc(); - - cfg = &cmc_idpram_cfg; - acc_cfg = &cmc_idpram_access_cfg[DPRAM_SPEED_LOW]; - setup_sromc(cfg->csn, cfg, acc_cfg); - - cfg = &cbp_edpram_cfg; - acc_cfg = &cbp_edpram_access_cfg[DPRAM_SPEED_LOW]; - setup_sromc(cfg->csn, cfg, acc_cfg); - - if (!cmc_idpram_remap_mem_region(&cmc_idpram_cfg)) - return -1; - platform_device_register(&umts_modem); - - if (!cbp_edpram_remap_mem_region(&cbp_edpram_cfg)) - return -1; - platform_device_register(&cdma_modem); - - return 0; -} -late_initcall(init_modem); -/*device_initcall(init_modem);*/ - -#ifdef CONFIG_USBHUB_USB3503 -static int (*usbhub_set_mode)(struct usb3503_hubctl *, int); -static struct usb3503_hubctl *usbhub_ctl; - -#ifdef CONFIG_EXYNOS4_CPUFREQ -static int exynos_cpu_frequency_lock(void) -{ - unsigned int level, freq = 700; - - if (atomic_read(&umts_link_pm_data.freqlock) == 0) { - if (exynos_cpufreq_get_level(freq * 1000, &level)) { - mif_err("ERR: exynos_cpufreq_get_level fail\n"); - return -EINVAL; - } - - if (exynos_cpufreq_lock(DVFS_LOCK_ID_USB_IF, level)) { - mif_err("ERR: exynos_cpufreq_lock fail\n"); - return -EINVAL; - } - - atomic_set(&umts_link_pm_data.freqlock, 1); - mif_debug("<%d> %d MHz\n", level, freq); - } - return 0; -} - -static int exynos_cpu_frequency_unlock(void) -{ - if (atomic_read(&umts_link_pm_data.freqlock) == 1) { - exynos_cpufreq_lock_free(DVFS_LOCK_ID_USB_IF); - atomic_set(&umts_link_pm_data.freqlock, 0); - mif_debug("\n"); - } - return 0; -} -#else -static int exynos_cpu_frequency_lock(void) -{ - return 0; -} - -static int exynos_cpu_frequency_unlock(void) -{ - return 0; -} -#endif - -void set_host_states(struct platform_device *pdev, int type) -{ -} - -static int usb3503_hub_handler(void (*set_mode)(void), void *ctl) -{ - if (!set_mode || !ctl) - return -EINVAL; - - usbhub_set_mode = (int (*)(struct usb3503_hubctl *, int))set_mode; - usbhub_ctl = (struct usb3503_hubctl *)ctl; - - mif_info("set_mode(%pF)\n", set_mode); - - return 0; -} - -static int usb3503_hw_config(void) -{ - int err; - - err = gpio_request(GPIO_USB_HUB_RST, "HUB_RST"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", "HUB_RST"); - } else { - gpio_direction_output(GPIO_USB_HUB_RST, 0); - s3c_gpio_setpull(GPIO_USB_HUB_RST, S3C_GPIO_PULL_NONE); - } - s5p_gpio_set_drvstr(GPIO_USB_HUB_RST, S5P_GPIO_DRVSTR_LV1); - /* need to check drvstr 1 or 2 */ - - /* for USB3503 26Mhz Reference clock setting */ - err = gpio_request(GPIO_USB_HUB_INT, "HUB_INT"); - if (err) { - mif_err("ERR: fail to request gpio %s\n", "HUB_INT"); - } else { - gpio_direction_output(GPIO_USB_HUB_INT, 1); - s3c_gpio_setpull(GPIO_USB_HUB_INT, S3C_GPIO_PULL_NONE); - } - - return 0; -} - -static int usb3503_reset_n(int val) -{ - gpio_set_value(GPIO_USB_HUB_RST, 0); - - /* hub off from cpuidle(LPA), skip the msleep schedule*/ - if (val) { - msleep(20); - mif_info("val = %d\n", gpio_get_value(GPIO_USB_HUB_RST)); - - gpio_set_value(GPIO_USB_HUB_RST, !!val); - - mif_info("val = %d\n", gpio_get_value(GPIO_USB_HUB_RST)); - udelay(5); /* need it ?*/ - } - return 0; -} - -static struct usb3503_platform_data usb3503_pdata = { - .initial_mode = USB3503_MODE_STANDBY, - .reset_n = usb3503_reset_n, - .register_hub_handler = usb3503_hub_handler, - .port_enable = host_port_enable, -}; - -static struct i2c_board_info i2c_devs20_emul[] __initdata = { - { - I2C_BOARD_INFO(USB3503_I2C_NAME, 0x08), - .platform_data = &usb3503_pdata, - }, -}; - -/* I2C20_EMUL */ -static struct i2c_gpio_platform_data i2c20_platdata = { - .sda_pin = GPIO_USB_HUB_SDA, - .scl_pin = GPIO_USB_HUB_SCL, - /*FIXME: need to timming tunning... */ - .udelay = 20, -}; - -static struct platform_device s3c_device_i2c20 = { - .name = "i2c-gpio", - .id = 20, - .dev.platform_data = &i2c20_platdata, -}; - -static int __init init_usbhub(void) -{ - usb3503_hw_config(); - i2c_register_board_info(20, i2c_devs20_emul, - ARRAY_SIZE(i2c_devs20_emul)); - - platform_device_register(&s3c_device_i2c20); - return 0; -} - -device_initcall(init_usbhub); - -static int host_port_enable(int port, int enable) -{ - int err; - - mif_info("port(%d) control(%d)\n", port, enable); - - if (enable) { - err = usbhub_set_mode(usbhub_ctl, USB3503_MODE_HUB); - if (err < 0) { - mif_err("ERR: hub on fail\n"); - goto exit; - } - err = s5p_ehci_port_control(&s5p_device_ehci, port, 1); - if (err < 0) { - mif_err("ERR: port(%d) enable fail\n", port); - goto exit; - } - } else { - err = s5p_ehci_port_control(&s5p_device_ehci, port, 0); - if (err < 0) { - mif_err("ERR: port(%d) enable fail\n", port); - goto exit; - } - err = usbhub_set_mode(usbhub_ctl, USB3503_MODE_STANDBY); - if (err < 0) { - mif_err("ERR: hub off fail\n"); - goto exit; - } - } - - err = gpio_direction_output(umts_modem_data.gpio_host_active, enable); - mif_info("active state err(%d), en(%d), level(%d)\n", - err, enable, gpio_get_value(umts_modem_data.gpio_host_active)); - -exit: - return err; -} -#else -void set_host_states(struct platform_device *pdev, int type) -{ - if (active_ctl.gpio_initialized) { - mif_err("<%s> Active States =%d, %s\n", pdev->name, type); - gpio_direction_output(umts_link_pm_data.gpio_link_active, type); - } else { - active_ctl.gpio_request_host_active = 1; - } -} -#endif - |