/* VM Individual Macro Register */
 #define VM_COM_REG_SIZE        0x200
-#define VM_SDIF_DONE(n)        (VM_COM_REG_SIZE + 0x34 + 0x200 * (n))
-#define VM_SDIF_DATA(n)        (VM_COM_REG_SIZE + 0x40 + 0x200 * (n))
+#define VM_SDIF_DONE(vm)       (VM_COM_REG_SIZE + 0x34 + 0x200 * (vm))
+#define VM_SDIF_DATA(vm, ch)   \
+       (VM_COM_REG_SIZE + 0x40 + 0x200 * (vm) + 0x4 * (ch))
 
 /* SDA Slave Register */
 #define IP_CTRL                        0x00
        u32                     t_num;
        u32                     p_num;
        u32                     v_num;
+       u32                     c_num;
        u32                     ip_freq;
        u8                      *vm_idx;
 };
 {
        struct pvt_device *pvt = dev_get_drvdata(dev);
        struct regmap *v_map = pvt->v_map;
+       u8 vm_idx, ch_idx;
        u32 n, stat;
-       u8 vm_idx;
        int ret;
 
-       if (channel >= pvt->v_num)
+       if (channel >= pvt->v_num * pvt->c_num)
                return -EINVAL;
 
-       vm_idx = pvt->vm_idx[channel];
+       vm_idx = pvt->vm_idx[channel / pvt->c_num];
+       ch_idx = channel % pvt->c_num;
 
        switch (attr) {
        case hwmon_in_input:
                if (ret)
                        return ret;
 
-               ret = regmap_read(v_map, VM_SDIF_DATA(vm_idx), &n);
+               ret = regmap_read(v_map, VM_SDIF_DATA(vm_idx, ch_idx), &n);
                if(ret < 0)
                        return ret;
 
 
 static int mr75203_probe(struct platform_device *pdev)
 {
+       u32 ts_num, vm_num, pd_num, ch_num, val, index, i;
        const struct hwmon_channel_info **pvt_info;
-       u32 ts_num, vm_num, pd_num, val, index, i;
        struct device *dev = &pdev->dev;
        u32 *temp_config, *in_config;
        struct device *hwmon_dev;
        ts_num = (val & TS_NUM_MSK) >> TS_NUM_SFT;
        pd_num = (val & PD_NUM_MSK) >> PD_NUM_SFT;
        vm_num = (val & VM_NUM_MSK) >> VM_NUM_SFT;
+       ch_num = (val & CH_NUM_MSK) >> CH_NUM_SFT;
        pvt->t_num = ts_num;
        pvt->p_num = pd_num;
        pvt->v_num = vm_num;
+       pvt->c_num = ch_num;
        val = 0;
        if (ts_num)
                val++;
        }
 
        if (vm_num) {
-               u32 num = vm_num;
+               u32 total_ch;
 
                ret = pvt_get_regmap(pdev, "vm", pvt);
                if (ret)
                        for (i = 0; i < vm_num; i++)
                                if (pvt->vm_idx[i] >= vm_num ||
                                    pvt->vm_idx[i] == 0xff) {
-                                       num = i;
                                        pvt->v_num = i;
                                        vm_num = i;
                                        break;
                                }
                }
 
-               in_config = devm_kcalloc(dev, num + 1,
+               total_ch = ch_num * vm_num;
+               in_config = devm_kcalloc(dev, total_ch + 1,
                                         sizeof(*in_config), GFP_KERNEL);
                if (!in_config)
                        return -ENOMEM;
 
-               memset32(in_config, HWMON_I_INPUT, num);
-               in_config[num] = 0;
+               memset32(in_config, HWMON_I_INPUT, total_ch);
+               in_config[total_ch] = 0;
                pvt_in.config = in_config;
 
                pvt_info[index++] = &pvt_in;