Exemplo n.º 1
0
int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env)
{
    struct power_supply *psy = dev_get_drvdata(dev);
    int ret = 0, j;
    char *prop_buf;
    char *attrname;

    dev_dbg(dev, "uevent\n");

    if (!psy || !psy->dev) {
        dev_dbg(dev, "No power supply yet\n");
        return ret;
    }

    dev_dbg(dev, "POWER_SUPPLY_NAME=%s\n", psy->name);

    ret = add_uevent_var(env, "POWER_SUPPLY_NAME=%s", psy->name);
    if (ret)
        return ret;

    prop_buf = (char *)get_zeroed_page(GFP_KERNEL);
    if (!prop_buf)
        return -ENOMEM;

    for (j = 0; j < ARRAY_SIZE(power_supply_static_attrs); j++) {
        struct device_attribute *attr;
        char *line;

        attr = &power_supply_static_attrs[j];

        ret = power_supply_show_static_attrs(dev, attr, prop_buf);
        if (ret < 0)
            goto out;

        line = strchr(prop_buf, '\n');
        if (line)
            *line = 0;

        attrname = kstruprdup(attr->attr.name, GFP_KERNEL);
        if (!attrname) {
            ret = -ENOMEM;
            goto out;
        }

        dev_dbg(dev, "Static prop %s=%s\n", attrname, prop_buf);

        ret = add_uevent_var(env, "POWER_SUPPLY_%s=%s", attrname, prop_buf);
        kfree(attrname);
        if (ret)
            goto out;
    }

    dev_dbg(dev, "%zd dynamic props\n", psy->num_properties);

    for (j = 0; j < psy->num_properties; j++) {
        struct device_attribute *attr;
        char *line;

        attr = &power_supply_attrs[psy->properties[j]];

        ret = power_supply_show_property(dev, attr, prop_buf);
        if (ret == -ENODEV) {
            /* When a battery is absent, we expect -ENODEV. Don't abort;
               send the uevent with at least the the PRESENT=0 property */
            ret = 0;
            continue;
        }

        if (ret < 0)
            goto out;

        line = strchr(prop_buf, '\n');
        if (line)
            *line = 0;

        attrname = kstruprdup(attr->attr.name, GFP_KERNEL);
        if (!attrname) {
            ret = -ENOMEM;
            goto out;
        }

        dev_dbg(dev, "prop %s=%s\n", attrname, prop_buf);

        ret = add_uevent_var(env, "POWER_SUPPLY_%s=%s", attrname, prop_buf);
        kfree(attrname);
        if (ret)
            goto out;
    }

out:
    free_page((unsigned long)prop_buf);

    return ret;
}
Exemplo n.º 2
0
int power_supply_uevent(struct device *dev, char **envp, int num_envp,
                        char *buffer, int buffer_size)
{
	struct power_supply *psy = dev_get_drvdata(dev);
	int i = 0, length = 0, ret = 0, j;
	char *prop_buf;
	char *attrname;

	dev_dbg(dev, "uevent\n");

	if (!psy) {
		dev_dbg(dev, "No power supply yet\n");
		return ret;
	}

	dev_dbg(dev, "POWER_SUPPLY_NAME=%s\n", psy->name);

	ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size,
	                     &length, "POWER_SUPPLY_NAME=%s", psy->name);
	if (ret)
		return ret;

	prop_buf = (char *)get_zeroed_page(GFP_KERNEL);
	if (!prop_buf)
		return -ENOMEM;

	for (j = 0; j < ARRAY_SIZE(power_supply_static_attrs); j++) {
		struct device_attribute *attr;
		char *line;

		attr = &power_supply_static_attrs[j];

		ret = power_supply_show_static_attrs(dev, attr, prop_buf);
		if (ret < 0)
			goto out;

		line = strchr(prop_buf, '\n');
		if (line)
			*line = 0;

		attrname = kstruprdup(attr->attr.name, GFP_KERNEL);
		if (!attrname) {
			ret = -ENOMEM;
			goto out;
		}

		dev_dbg(dev, "Static prop %s=%s\n", attrname, prop_buf);

		ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size,
		                     &length, "POWER_SUPPLY_%s=%s",
		                     attrname, prop_buf);
		kfree(attrname);
		if (ret)
			goto out;
	}

	dev_dbg(dev, "%zd dynamic props\n", psy->num_properties);

	for (j = 0; j < psy->num_properties; j++) {
		struct device_attribute *attr;
		char *line;

		attr = &power_supply_attrs[psy->properties[j]];

		ret = power_supply_show_property(dev, attr, prop_buf);
		if (ret < 0)
			goto out;

		line = strchr(prop_buf, '\n');
		if (line)
			*line = 0;

		attrname = kstruprdup(attr->attr.name, GFP_KERNEL);
		if (!attrname) {
			ret = -ENOMEM;
			goto out;
		}

		dev_dbg(dev, "prop %s=%s\n", attrname, prop_buf);

		ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size,
		                     &length, "POWER_SUPPLY_%s=%s",
		                     attrname, prop_buf);
		kfree(attrname);
		if (ret)
			goto out;
	}

out:
	free_page((unsigned long)prop_buf);

	return ret;
}