diff --git a/common/state/state.c b/common/state/state.c index 266d211..98a7db3 100644 --- a/common/state/state.c +++ b/common/state/state.c @@ -246,7 +246,7 @@ } if (conv == STATE_CONVERT_FROM_NODE_CREATE) { - sv = vtype->create(state, name, node); + sv = vtype->create(state, name, node, vtype); if (IS_ERR(sv)) { ret = PTR_ERR(sv); dev_err(&state->dev, "failed to create %s: %s\n", name, diff --git a/common/state/state.h b/common/state/state.h index 81aaec2..7dd163c 100644 --- a/common/state/state.h +++ b/common/state/state.h @@ -123,15 +123,17 @@ int (*export) (struct state_variable *, struct device_node *, enum state_convert); int (*import) (struct state_variable *, struct device_node *); - struct state_variable *(*create) (struct state * state, - const char *name, - struct device_node *); + struct state_variable *(*create) (struct state *, + const char *, + struct device_node *, + const struct variable_type *); }; /* instance of a single variable */ struct state_variable { struct state *state; struct list_head list; + const struct variable_type *type; const char *name; unsigned int start; unsigned int size; diff --git a/common/state/state_variables.c b/common/state/state_variables.c index 56bcd95..688467d 100644 --- a/common/state/state_variables.c +++ b/common/state/state_variables.c @@ -101,7 +101,8 @@ static struct state_variable *state_uint8_create(struct state *state, const char *name, - struct device_node *node) + struct device_node *node, + const struct variable_type *vtype) { struct state_uint32 *su32; struct param_d *param; @@ -116,6 +117,7 @@ } su32->param = param; + su32->var.type = vtype; su32->var.size = sizeof(uint8_t); #ifdef __LITTLE_ENDIAN su32->var.raw = &su32->value; @@ -129,7 +131,8 @@ static struct state_variable *state_uint32_create(struct state *state, const char *name, - struct device_node *node) + struct device_node *node, + const struct variable_type *vtype) { struct state_uint32 *su32; struct param_d *param; @@ -144,6 +147,7 @@ } su32->param = param; + su32->var.type = vtype; su32->var.size = sizeof(uint32_t); su32->var.raw = &su32->value; su32->var.state = state; @@ -218,7 +222,8 @@ static struct state_variable *state_enum32_create(struct state *state, const char *name, - struct device_node *node) + struct device_node *node, + const struct variable_type *vtype) { struct state_enum32 *enum32; int ret, i, num_names; @@ -234,6 +239,7 @@ enum32->names = xzalloc(sizeof(char *) * num_names); enum32->num_names = num_names; + enum32->var.type = vtype; enum32->var.size = sizeof(uint32_t); enum32->var.raw = &enum32->value; enum32->var.state = state; @@ -300,13 +306,15 @@ static struct state_variable *state_mac_create(struct state *state, const char *name, - struct device_node *node) + struct device_node *node, + const struct variable_type *vtype) { struct state_mac *mac; int ret; mac = xzalloc(sizeof(*mac)); + mac->var.type = vtype; mac->var.size = ARRAY_SIZE(mac->value); mac->var.raw = mac->value; mac->var.state = state; @@ -402,7 +410,8 @@ static struct state_variable *state_string_create(struct state *state, const char *name, - struct device_node *node) + struct device_node *node, + const struct variable_type *vtype) { struct state_string *string; uint32_t start_size[2]; @@ -420,6 +429,7 @@ return ERR_PTR(-EILSEQ); string = xzalloc(sizeof(*string) + start_size[1]); + string->var.type = vtype; string->var.size = start_size[1]; string->var.raw = &string->raw; string->var.state = state;