1
0
Fork 0

otgcontrol: cleanup sysfs code and fix ugly bug causing unregister to fail

pull/10/head
Steinar Bakkemo 2019-08-20 21:13:47 +02:00
parent 8317515b62
commit 33efe1a268
1 changed files with 34 additions and 28 deletions

View File

@ -27,7 +27,7 @@ static struct attribute *control_attrs[CONTROL_GROUP_ATTRIBUTE_COUNT + 1] = {
NULL
};
struct attribute_group control_attr_group = {
static struct attribute_group control_attr_group = {
.attrs = control_attrs,
.name = "control"
};
@ -40,7 +40,7 @@ struct attribute *status_attrs[STATUS_GROUP_ATTRIBUTE_COUNT + 1] = {
NULL
};
struct attribute_group status_attr_group = {
static struct attribute_group status_attr_group = {
.attrs = status_attrs,
.name = "status"
};
@ -108,8 +108,7 @@ static ssize_t attribute_show(struct kobject *kobj,
var = otgc_data->otg1_pinctrlstate;
}
else {
dev_dbg(otgc_data->dev,
"%s: Invalid attribute name (%s), returning 0\n",
pr_err("%s: Invalid attribute name (%s), returning 0\n",
__func__,
attr->attr.name);
@ -205,11 +204,7 @@ void otgcontrol_create_kobj_property(struct kobj_attribute *attr,
int otgcontrol_init_sysfs_nodes(struct rm_otgcontrol_data *otgc_data)
{
struct kobject *otgcontrol_kobj;
int retval;
dev_dbg(otgc_data->dev,
"%s: Creating control properties (R/W)\n",
__func__);
int ret;
otgcontrol_create_kobj_property(&otgc_data->otg1_dr_mode_attribute,
"otg1_dr_mode",
@ -241,10 +236,6 @@ int otgcontrol_init_sysfs_nodes(struct rm_otgcontrol_data *otgc_data)
control_attrs[3] = &otgc_data->otg1_pinctrlstate_attribute.attr;
control_attrs[4] = NULL; /* NULL termination of the list */
dev_dbg(otgc_data->dev,
"%s: Creating status properties (R)\n",
__func__);
otgcontrol_create_kobj_property(&otgc_data->otg1_device_connected_attribute,
"otg1_device_connected",
S_IRUGO,
@ -256,29 +247,44 @@ int otgcontrol_init_sysfs_nodes(struct rm_otgcontrol_data *otgc_data)
otgcontrol_kobj = kobject_create_and_add(SYSFS_NODE_NAME,
SYSFS_PARENT_NODE);
if (!otgcontrol_kobj)
if (!otgcontrol_kobj) {
dev_err(otgc_data->dev,
"%s: Failed to create 'otgcontrol' kobject\n",
__func__);
return -ENOMEM;
/* Create the files associated with this kobject */
retval = sysfs_create_group(otgcontrol_kobj,
&control_attr_group);
retval = sysfs_create_group(otgcontrol_kobj,
&status_attr_group);
if (retval) {
otgc_data->kobject = otgcontrol_kobj;
}
ret = sysfs_create_group(otgcontrol_kobj,
&control_attr_group);
if (ret != 0) {
dev_err(otgc_data->dev,
"%s: Failed to create 'control' attribute group\n",
__func__);
goto error_1;
}
ret = sysfs_create_group(otgcontrol_kobj,
&status_attr_group);
if (ret != 0) {
dev_err(otgc_data->dev,
"%s: Failed to create 'status' attribute group\n",
__func__);
goto error_2;
}
otgc_data->kobject = otgcontrol_kobj;
return ret;
error_2:
sysfs_remove_group(otgc_data->kobject, &control_attr_group);
error_1:
kobject_put(otgc_data->kobject);
return retval;
return ret;
}
void otgcontrol_uninit_sysfs_nodes(struct rm_otgcontrol_data *otgc_data)
{
dev_dbg(otgc_data->dev,
"%s: Decrementing kobject refcount\n",
__func__);
if((otgc_data->kobject != NULL) && !IS_ERR(otgc_data->kobject)) {
sysfs_remove_group(otgc_data->kobject, &control_attr_group);
sysfs_remove_group(otgc_data->kobject, &status_attr_group);