]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - arch/arm/mach-msm/smd.c
arm: msm: smd: convert unsigned addr to unsigned long
[net-next-2.6.git] / arch / arm / mach-msm / smd.c
index 3fbba444e99cba2720ca10869ea253313265cd1a..2e32d9ab3609a273149c93c5cdbd72afc54fa92c 100644 (file)
@@ -69,24 +69,32 @@ static void smd_diag(void);
 
 static unsigned last_heap_free = 0xffffffff;
 
-#define MSM_A2M_INT(n) (MSM_CSR_BASE + 0x400 + (n) * 4)
+static inline void msm_a2m_int(uint32_t irq)
+{
+#if defined(CONFIG_ARCH_MSM7X30)
+       writel(1 << irq, MSM_GCC_BASE + 0x8);
+#else
+       writel(1, MSM_CSR_BASE + 0x400 + (irq * 4));
+#endif
+}
+
 
 static inline void notify_other_smsm(void)
 {
-       writel(1, MSM_A2M_INT(5));
+       msm_a2m_int(5);
 #ifdef CONFIG_QDSP6
-       writel(1, MSM_A2M_INT(8));
+       msm_a2m_int(8);
 #endif
 }
 
 static inline void notify_modem_smd(void)
 {
-       writel(1, MSM_A2M_INT(0));
+       msm_a2m_int(0);
 }
 
 static inline void notify_dsp_smd(void)
 {
-       writel(1, MSM_A2M_INT(8));
+       msm_a2m_int(8);
 }
 
 static void smd_diag(void)
@@ -115,8 +123,6 @@ static void handle_modem_crash(void)
                ;
 }
 
-extern int (*msm_check_for_modem_crash)(void);
-
 uint32_t raw_smsm_get_state(enum smsm_state_item item)
 {
        return readl(smd_info.state + item * 4);
@@ -153,7 +159,7 @@ LIST_HEAD(smd_ch_list_dsp);
 static unsigned char smd_ch_allocated[64];
 static struct work_struct probe_work;
 
-static void smd_alloc_channel(const char *name, uint32_t cid, uint32_t type);
+static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type);
 
 static void smd_channel_probe_worker(struct work_struct *work)
 {
@@ -186,8 +192,8 @@ static void smd_channel_probe_worker(struct work_struct *work)
                type = shared[n].ctype & SMD_TYPE_MASK;
                if ((type == SMD_TYPE_APPS_MODEM) ||
                    (type == SMD_TYPE_APPS_DSP))
-                       smd_alloc_channel(shared[n].name, shared[n].cid, ctype);
-               smd_ch_allocated[n] = 1;
+                       if (!smd_alloc_channel(shared[n].name, shared[n].cid, ctype))
+                               smd_ch_allocated[n] = 1;
        }
 }
 
@@ -599,62 +605,20 @@ static int smd_packet_read(smd_channel_t *ch, void *data, int len)
        return r;
 }
 
-static int smd_alloc_v2(struct smd_channel *ch)
-{
-       struct smd_shared_v2 *shared2;
-       void *buffer;
-       unsigned buffer_sz;
-
-       shared2 = smem_alloc(SMEM_SMD_BASE_ID + ch->n, sizeof(*shared2));
-       buffer = smem_item(SMEM_SMD_FIFO_BASE_ID + ch->n, &buffer_sz);
-
-       if (!buffer)
-               return -1;
-
-       /* buffer must be a power-of-two size */
-       if (buffer_sz & (buffer_sz - 1))
-               return -1;
-
-       buffer_sz /= 2;
-       ch->send = &shared2->ch0;
-       ch->recv = &shared2->ch1;
-       ch->send_data = buffer;
-       ch->recv_data = buffer + buffer_sz;
-       ch->fifo_size = buffer_sz;
-       return 0;
-}
-
-static int smd_alloc_v1(struct smd_channel *ch)
-{
-       struct smd_shared_v1 *shared1;
-       shared1 = smem_alloc(ID_SMD_CHANNELS + ch->n, sizeof(*shared1));
-       if (!shared1) {
-               pr_err("smd_alloc_channel() cid %d does not exist\n", ch->n);
-               return -1;
-       }
-       ch->send = &shared1->ch0;
-       ch->recv = &shared1->ch1;
-       ch->send_data = shared1->data0;
-       ch->recv_data = shared1->data1;
-       ch->fifo_size = SMD_BUF_SIZE;
-       return 0;
-}
-
-
-static void smd_alloc_channel(const char *name, uint32_t cid, uint32_t type)
+static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type)
 {
        struct smd_channel *ch;
 
        ch = kzalloc(sizeof(struct smd_channel), GFP_KERNEL);
        if (ch == 0) {
                pr_err("smd_alloc_channel() out of memory\n");
-               return;
+               return -1;
        }
        ch->n = cid;
 
-       if (smd_alloc_v2(ch) && smd_alloc_v1(ch)) {
+       if (_smd_alloc_channel(ch)) {
                kfree(ch);
-               return;
+               return -1;
        }
 
        ch->fifo_mask = ch->fifo_size - 1;
@@ -696,6 +660,7 @@ static void smd_alloc_channel(const char *name, uint32_t cid, uint32_t type)
        mutex_unlock(&smd_creation_mutex);
 
        platform_device_register(&ch->pdev);
+       return 0;
 }
 
 static void do_nothing_notify(void *priv, unsigned flags)
@@ -803,6 +768,16 @@ int smd_write(smd_channel_t *ch, const void *data, int len)
        return ch->write(ch, data, len);
 }
 
+int smd_write_atomic(smd_channel_t *ch, const void *data, int len)
+{
+       unsigned long flags;
+       int res;
+       spin_lock_irqsave(&smd_lock, flags);
+       res = ch->write(ch, data, len);
+       spin_unlock_irqrestore(&smd_lock, flags);
+       return res;
+}
+
 int smd_read_avail(smd_channel_t *ch)
 {
        return ch->read_avail(ch);
@@ -885,9 +860,9 @@ static irqreturn_t smsm_irq_handler(int irq, void *data)
 
        if (msm_smd_debug_mask & MSM_SMSM_DEBUG)
                pr_info("<SM %08x %08x>\n", apps, modm);
-       if (modm & SMSM_RESET) {
+       if (modm & SMSM_RESET)
                handle_modem_crash();
-       }
+
        do_smd_probe();
 
        spin_unlock_irqrestore(&smem_lock, flags);
@@ -897,9 +872,9 @@ static irqreturn_t smsm_irq_handler(int irq, void *data)
 int smsm_change_state(enum smsm_state_item item,
                      uint32_t clear_mask, uint32_t set_mask)
 {
+       unsigned long addr = smd_info.state + item * 4;
        unsigned long flags;
        unsigned state;
-       unsigned addr = smd_info.state + item * 4;
 
        if (!smd_info.ready)
                return -EIO;
@@ -1052,6 +1027,8 @@ static int __init msm_smd_probe(struct platform_device *pdev)
 
        msm_check_for_modem_crash = check_for_modem_crash;
 
+       msm_init_last_radio_log(THIS_MODULE);
+
        smd_initialized = 1;
 
        return 0;