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__);