msm: sdio_ctl: Add the CMUX channel id lookup table

Since the CMUX channels exported to user-space are getting
non-continuous add a lookup table to identify the channel ids.

Signed-off-by: Karthikeyan Ramasubramanian <kramasub@codeaurora.org>
diff --git a/arch/arm/mach-msm/sdio_ctl.c b/arch/arm/mach-msm/sdio_ctl.c
index 582fc69..2eb5f65 100644
--- a/arch/arm/mach-msm/sdio_ctl.c
+++ b/arch/arm/mach-msm/sdio_ctl.c
@@ -102,15 +102,45 @@
 #define D(x...) do {} while (0)
 #endif
 
+static uint32_t cmux_ch_id[] = {
+	SDIO_CMUX_DATA_CTL_0,
+	SDIO_CMUX_DATA_CTL_1,
+	SDIO_CMUX_DATA_CTL_2,
+	SDIO_CMUX_DATA_CTL_3,
+	SDIO_CMUX_DATA_CTL_4,
+	SDIO_CMUX_DATA_CTL_5,
+	SDIO_CMUX_DATA_CTL_6,
+	SDIO_CMUX_DATA_CTL_7,
+	SDIO_CMUX_USB_CTL_0
+};
+
+static int get_ctl_dev_index(int id)
+{
+	int dev_index;
+	for (dev_index = 0; dev_index < NUM_SDIO_CTL_PORTS; dev_index++) {
+		if (cmux_ch_id[dev_index] == id)
+			return dev_index;
+	}
+	return -ENODEV;
+}
+
 static void sdio_ctl_receive_cb(void *data, int size, void *priv)
 {
 	struct sdio_ctl_list_elem *list_elem = NULL;
 	int id = ((struct sdio_ctl_dev *)(priv))->id;
+	int dev_index;
 
-	if (id < 0 || id >= NUM_SDIO_CTL_PORTS)
+	if (id < 0 || id > cmux_ch_id[NUM_SDIO_CTL_PORTS - 1])
 		return;
+	dev_index = get_ctl_dev_index(id);
+	if (dev_index < 0) {
+		pr_err("%s: Ch%d is not exported to user-space\n",
+			__func__, id);
+		return;
+	}
+
 	if (!data || size <= 0) {
-		wake_up(&sdio_ctl_devp[id]->read_wait_queue);
+		wake_up(&sdio_ctl_devp[dev_index]->read_wait_queue);
 		return;
 	}
 
@@ -128,20 +158,27 @@
 	}
 	memcpy(list_elem->ctl_pkt.data, data, size);
 	list_elem->ctl_pkt.data_size = size;
-	mutex_lock(&sdio_ctl_devp[id]->rx_lock);
-	list_add_tail(&list_elem->list, &sdio_ctl_devp[id]->rx_list);
-	sdio_ctl_devp[id]->read_avail += size;
-	mutex_unlock(&sdio_ctl_devp[id]->rx_lock);
-	wake_up(&sdio_ctl_devp[id]->read_wait_queue);
+	mutex_lock(&sdio_ctl_devp[dev_index]->rx_lock);
+	list_add_tail(&list_elem->list, &sdio_ctl_devp[dev_index]->rx_list);
+	sdio_ctl_devp[dev_index]->read_avail += size;
+	mutex_unlock(&sdio_ctl_devp[dev_index]->rx_lock);
+	wake_up(&sdio_ctl_devp[dev_index]->read_wait_queue);
 }
 
 static void sdio_ctl_write_done(void *data, int size, void *priv)
 {
 	int id = ((struct sdio_ctl_dev *)(priv))->id;
-	if (id < 0 || id >= NUM_SDIO_CTL_PORTS)
+	int dev_index;
+	if (id < 0 || id > cmux_ch_id[NUM_SDIO_CTL_PORTS - 1])
 		return;
 
-	wake_up(&sdio_ctl_devp[id]->write_wait_queue);
+	dev_index = get_ctl_dev_index(id);
+	if (dev_index < 0) {
+		pr_err("%s: Ch%d is not exported to user-space\n",
+			__func__, id);
+		return;
+	}
+	wake_up(&sdio_ctl_devp[dev_index]->write_wait_queue);
 }
 
 static long sdio_ctl_ioctl(struct file *file, unsigned int cmd,
@@ -397,7 +434,7 @@
 			goto error0;
 		}
 
-		sdio_ctl_devp[i]->id = i;
+		sdio_ctl_devp[i]->id = cmux_ch_id[i];
 		sdio_ctl_devp[i]->ref_count = 0;
 
 		mutex_init(&sdio_ctl_devp[i]->dev_lock);
@@ -439,7 +476,7 @@
 		sdio_ctl_devp[i]->devicep =
 				device_create(sdio_ctl_classp, NULL,
 				      (sdio_ctl_number + i), NULL,
-				      DEVICE_NAME "%d", i);
+				      DEVICE_NAME "%d", cmux_ch_id[i]);
 
 		if (IS_ERR(sdio_ctl_devp[i]->devicep)) {
 			pr_err("%s: device_create() ENOMEM\n", __func__);