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; }
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; }
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; }