msm: bam_dmux: consolidate callback functions
Consolidate the multiple client callback function into a single callback
that is able to handle multiple event types. This minimizes API changes
for future event types.
Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
diff --git a/arch/arm/mach-msm/bam_dmux.c b/arch/arm/mach-msm/bam_dmux.c
index 667016d..62a3dded 100644
--- a/arch/arm/mach-msm/bam_dmux.c
+++ b/arch/arm/mach-msm/bam_dmux.c
@@ -87,8 +87,7 @@
struct bam_ch_info {
uint32_t status;
- void (*receive_cb)(void *, struct sk_buff *);
- void (*write_done)(void *, struct sk_buff *);
+ void (*notify)(void *, int, unsigned long);
void *priv;
spinlock_t lock;
};
@@ -188,6 +187,7 @@
{
unsigned long flags;
struct bam_mux_hdr *rx_hdr;
+ unsigned long event_data;
rx_hdr = (struct bam_mux_hdr *)rx_skb->data;
@@ -195,10 +195,13 @@
rx_skb->tail = rx_skb->data + rx_hdr->pkt_len;
rx_skb->len = rx_hdr->pkt_len;
+ event_data = (unsigned long)(rx_skb);
+
spin_lock_irqsave(&bam_ch[rx_hdr->ch_id].lock, flags);
- if (bam_ch[rx_hdr->ch_id].receive_cb)
- bam_ch[rx_hdr->ch_id].receive_cb(bam_ch[rx_hdr->ch_id].priv,
- rx_skb);
+ if (bam_ch[rx_hdr->ch_id].notify)
+ bam_ch[rx_hdr->ch_id].notify(
+ bam_ch[rx_hdr->ch_id].priv, BAM_DMUX_RECEIVE,
+ event_data);
else
dev_kfree_skb_any(rx_skb);
spin_unlock_irqrestore(&bam_ch[rx_hdr->ch_id].lock, flags);
@@ -302,15 +305,18 @@
struct sk_buff *skb;
struct bam_mux_hdr *hdr;
struct tx_pkt_info *info;
+ unsigned long event_data;
info = container_of(work, struct tx_pkt_info, work);
skb = info->skb;
kfree(info);
hdr = (struct bam_mux_hdr *)skb->data;
DBG_INC_WRITE_CNT(skb->data_len);
- if (bam_ch[hdr->ch_id].write_done)
- bam_ch[hdr->ch_id].write_done(
- bam_ch[hdr->ch_id].priv, skb);
+ event_data = (unsigned long)(skb);
+ if (bam_ch[hdr->ch_id].notify)
+ bam_ch[hdr->ch_id].notify(
+ bam_ch[hdr->ch_id].priv, BAM_DMUX_WRITE_DONE,
+ event_data);
else
dev_kfree_skb_any(skb);
}
@@ -400,8 +406,7 @@
}
int msm_bam_dmux_open(uint32_t id, void *priv,
- void (*receive_cb)(void *, struct sk_buff *),
- void (*write_done)(void *, struct sk_buff *))
+ void (*notify)(void *, int, unsigned long))
{
struct bam_mux_hdr *hdr;
unsigned long flags;
@@ -412,6 +417,8 @@
return -ENODEV;
if (id >= BAM_DMUX_NUM_CHANNELS)
return -EINVAL;
+ if (notify == NULL)
+ return -EINVAL;
hdr = kmalloc(sizeof(struct bam_mux_hdr), GFP_KERNEL);
if (hdr == NULL) {
@@ -433,8 +440,7 @@
goto open_done;
}
- bam_ch[id].receive_cb = receive_cb;
- bam_ch[id].write_done = write_done;
+ bam_ch[id].notify = notify;
bam_ch[id].priv = priv;
bam_ch[id].status |= BAM_CH_LOCAL_OPEN;
spin_unlock_irqrestore(&bam_ch[id].lock, flags);
@@ -466,8 +472,7 @@
return -ENODEV;
spin_lock_irqsave(&bam_ch[id].lock, flags);
- bam_ch[id].write_done = NULL;
- bam_ch[id].receive_cb = NULL;
+ bam_ch[id].notify = NULL;
bam_ch[id].priv = NULL;
bam_ch[id].status &= ~BAM_CH_LOCAL_OPEN;
spin_unlock_irqrestore(&bam_ch[id].lock, flags);