Esempio n. 1
0
static struct device_t * led_pwm_bl_probe(struct driver_t * drv, struct dtnode_t * n)
{
	struct led_pwm_bl_pdata_t * pdat;
	struct pwm_t * pwm;
	struct led_t * led;
	struct device_t * dev;

	if(!(pwm = search_pwm(dt_read_string(n, "pwm-name", NULL))))
		return NULL;

	pdat = malloc(sizeof(struct led_pwm_bl_pdata_t));
	if(!pdat)
		return NULL;

	led = malloc(sizeof(struct led_t));
	if(!led)
	{
		free(pdat);
		return NULL;
	}

	pdat->pwm = pwm;
	pdat->regulator = strdup(dt_read_string(n, "regulator-name", NULL));
	pdat->period = dt_read_int(n, "pwm-period-ns", 1000 * 1000);
	pdat->polarity = dt_read_bool(n, "pwm-polarity", 0);
	pdat->from = dt_read_int(n, "pwm-percent-from", 0) * pdat->period / 100;
	pdat->to = dt_read_int(n, "pwm-percent-to", 100) * pdat->period / 100;
	pdat->brightness = dt_read_int(n, "default-brightness", 0);

	led->name = alloc_device_name(dt_read_name(n), dt_read_id(n));
	led->set = led_pwm_bl_set,
	led->get = led_pwm_bl_get,
	led->priv = pdat;

	if(pdat->brightness > 0)
		regulator_enable(pdat->regulator);
	else
		regulator_disable(pdat->regulator);
	led_pwm_bl_set_brightness(pdat, pdat->brightness);

	if(!register_led(&dev, led))
	{
		regulator_disable(pdat->regulator);
		led_pwm_bl_set_brightness(pdat, 0);
		if(pdat->regulator)
			free(pdat->regulator);

		free_device_name(led->name);
		free(led->priv);
		free(led);
		return NULL;
	}
	dev->driver = drv;

	return dev;
}
Esempio n. 2
0
static bool_t led_pwm_register_led(struct resource_t * res)
{
	struct led_pwm_data_t * rdat = (struct led_pwm_data_t *)res->data;
	struct led_pwm_private_data_t * dat;
	struct led_t * led;
	struct pwm_t * pwm;
	char name[64];

	pwm = search_pwm(rdat->pwm);
	if(!pwm)
		return FALSE;

	dat = malloc(sizeof(struct led_pwm_private_data_t));
	if(!dat)
		return FALSE;

	led = malloc(sizeof(struct led_t));
	if(!led)
	{
		free(dat);
		return FALSE;
	}

	snprintf(name, sizeof(name), "%s.%d", res->name, res->id);

	dat->brightness = 0;
	dat->pwm = pwm;
	dat->rdat = rdat;

	led->name = strdup(name);
	led->init = led_pwm_init;
	led->exit = led_pwm_exit;
	led->set = led_pwm_set,
	led->get = led_pwm_get,
	led->suspend = led_pwm_suspend,
	led->resume = led_pwm_resume,
	led->priv = dat;

	if(register_led(led))
		return TRUE;

	free(led->priv);
	free(led->name);
	free(led);
	return FALSE;
}
Esempio n. 3
0
static bool_t sandbox_register_led(struct resource_t * res)
{
	struct sandbox_led_data_t * rdat = (struct sandbox_led_data_t *)res->data;
	struct sandbox_led_pdata_t * pdat;
	struct led_t * led;
	char name[64];

	pdat = malloc(sizeof(struct sandbox_led_pdata_t));
	if(!pdat)
		return FALSE;

	led = malloc(sizeof(struct led_t));
	if(!led)
	{
		free(pdat);
		return FALSE;
	}

	snprintf(name, sizeof(name), "%s.%d", res->name, res->id);

	pdat->brightness = 0;
	pdat->path = strdup(rdat->path);

	led->name = strdup(name);
	led->init = sandbox_led_init;
	led->exit = sandbox_led_exit;
	led->set = sandbox_led_set,
	led->get = sandbox_led_get,
	led->suspend = sandbox_led_suspend,
	led->resume	= sandbox_led_resume,
	led->priv = pdat;

	if(register_led(led))
		return TRUE;

	free(led->priv);
	free(led->name);
	free(led);
	return FALSE;
}