summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Gromm <christian.gromm@microchip.com>2016-09-09 13:25:38 (GMT)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-09-12 07:47:15 (GMT)
commita747b42c8cd70bffe96862479aa1358553a0ab8f (patch)
treedd03d029a951e4359b5484c5d96b09f55371ac13
parent1296bd62b0dcbdc8fd66908eb2d72dc4c3dba219 (diff)
downloadlinux-a747b42c8cd70bffe96862479aa1358553a0ab8f.tar.xz
staging: most: hdm-usb: replace if-else branches with lookup table
This patch removes a series of if-else-if conditions with a lookup table. Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/staging/most/hdm-usb/hdm_usb.c93
1 files changed, 47 insertions, 46 deletions
diff --git a/drivers/staging/most/hdm-usb/hdm_usb.c b/drivers/staging/most/hdm-usb/hdm_usb.c
index 5d62d1b..c82b8c1 100644
--- a/drivers/staging/most/hdm-usb/hdm_usb.c
+++ b/drivers/staging/most/hdm-usb/hdm_usb.c
@@ -1030,6 +1030,46 @@ static void most_dci_release(struct kobject *kobj)
kfree(dci_obj);
}
+struct regs {
+ const char *name;
+ u16 reg;
+};
+
+static const struct regs ro_regs[] = {
+ { "ni_state", DRCI_REG_NI_STATE },
+ { "packet_bandwidth", DRCI_REG_PACKET_BW },
+ { "node_address", DRCI_REG_NODE_ADDR },
+ { "node_position", DRCI_REG_NODE_POS },
+};
+
+static const struct regs rw_regs[] = {
+ { "mep_filter", DRCI_REG_MEP_FILTER },
+ { "mep_hash0", DRCI_REG_HASH_TBL0 },
+ { "mep_hash1", DRCI_REG_HASH_TBL1 },
+ { "mep_hash2", DRCI_REG_HASH_TBL2 },
+ { "mep_hash3", DRCI_REG_HASH_TBL3 },
+ { "mep_eui48_hi", DRCI_REG_HW_ADDR_HI },
+ { "mep_eui48_mi", DRCI_REG_HW_ADDR_MI },
+ { "mep_eui48_lo", DRCI_REG_HW_ADDR_LO },
+};
+
+static int get_stat_reg_addr(const struct regs *regs, int size,
+ const char *name, u16 *reg_addr)
+{
+ int i;
+
+ for (i = 0; i < size; i++) {
+ if (!strcmp(name, regs[i].name)) {
+ *reg_addr = regs[i].reg;
+ return 0;
+ }
+ }
+ return -EFAULT;
+}
+
+#define get_static_reg_addr(regs, name, reg_addr) \
+ get_stat_reg_addr(regs, ARRAY_SIZE(regs), name, reg_addr)
+
static ssize_t show_value(struct most_dci_obj *dci_obj,
struct most_dci_attribute *attr, char *buf)
{
@@ -1039,34 +1079,10 @@ static ssize_t show_value(struct most_dci_obj *dci_obj,
if (!strcmp(attr->attr.name, "arb_address"))
return snprintf(buf, PAGE_SIZE, "%04x\n", dci_obj->reg_addr);
-
- if (!strcmp(attr->attr.name, "ni_state"))
- reg_addr = DRCI_REG_NI_STATE;
- else if (!strcmp(attr->attr.name, "packet_bandwidth"))
- reg_addr = DRCI_REG_PACKET_BW;
- else if (!strcmp(attr->attr.name, "node_address"))
- reg_addr = DRCI_REG_NODE_ADDR;
- else if (!strcmp(attr->attr.name, "node_position"))
- reg_addr = DRCI_REG_NODE_POS;
- else if (!strcmp(attr->attr.name, "mep_filter"))
- reg_addr = DRCI_REG_MEP_FILTER;
- else if (!strcmp(attr->attr.name, "mep_hash0"))
- reg_addr = DRCI_REG_HASH_TBL0;
- else if (!strcmp(attr->attr.name, "mep_hash1"))
- reg_addr = DRCI_REG_HASH_TBL1;
- else if (!strcmp(attr->attr.name, "mep_hash2"))
- reg_addr = DRCI_REG_HASH_TBL2;
- else if (!strcmp(attr->attr.name, "mep_hash3"))
- reg_addr = DRCI_REG_HASH_TBL3;
- else if (!strcmp(attr->attr.name, "mep_eui48_hi"))
- reg_addr = DRCI_REG_HW_ADDR_HI;
- else if (!strcmp(attr->attr.name, "mep_eui48_mi"))
- reg_addr = DRCI_REG_HW_ADDR_MI;
- else if (!strcmp(attr->attr.name, "mep_eui48_lo"))
- reg_addr = DRCI_REG_HW_ADDR_LO;
- else if (!strcmp(attr->attr.name, "arb_value"))
+ if (!strcmp(attr->attr.name, "arb_value"))
reg_addr = dci_obj->reg_addr;
- else
+ else if (get_static_reg_addr(ro_regs, attr->attr.name, &reg_addr) &&
+ get_static_reg_addr(rw_regs, attr->attr.name, &reg_addr))
return -EIO;
err = drci_rd_reg(dci_obj->usb_device, reg_addr, &tmp_val);
@@ -1092,31 +1108,16 @@ static ssize_t store_value(struct most_dci_obj *dci_obj,
dci_obj->reg_addr = val;
return count;
}
- if (!strcmp(attr->attr.name, "mep_filter"))
- reg_addr = DRCI_REG_MEP_FILTER;
- else if (!strcmp(attr->attr.name, "mep_hash0"))
- reg_addr = DRCI_REG_HASH_TBL0;
- else if (!strcmp(attr->attr.name, "mep_hash1"))
- reg_addr = DRCI_REG_HASH_TBL1;
- else if (!strcmp(attr->attr.name, "mep_hash2"))
- reg_addr = DRCI_REG_HASH_TBL2;
- else if (!strcmp(attr->attr.name, "mep_hash3"))
- reg_addr = DRCI_REG_HASH_TBL3;
- else if (!strcmp(attr->attr.name, "mep_eui48_hi"))
- reg_addr = DRCI_REG_HW_ADDR_HI;
- else if (!strcmp(attr->attr.name, "mep_eui48_mi"))
- reg_addr = DRCI_REG_HW_ADDR_MI;
- else if (!strcmp(attr->attr.name, "mep_eui48_lo"))
- reg_addr = DRCI_REG_HW_ADDR_LO;
- else if (!strcmp(attr->attr.name, "arb_value"))
+ if (!strcmp(attr->attr.name, "arb_value")) {
reg_addr = dci_obj->reg_addr;
- else if (!strcmp(attr->attr.name, "sync_ep")) {
+ } else if (!strcmp(attr->attr.name, "sync_ep")) {
u16 ep = val;
reg_addr = DRCI_REG_BASE + DRCI_COMMAND + ep * 16;
val = 1;
- } else
+ } else if (get_static_reg_addr(ro_regs, attr->attr.name, &reg_addr)) {
return -EFAULT;
+ }
err = drci_wr_reg(dci_obj->usb_device, reg_addr, val);
if (err < 0)