Hi! > +#define AW2013_NAME "aw2013" That's.... not really useful define. Make it NAME? Drop it? > +#define AW2013_TIME_STEP 130 I'd add comment with /* units */. > +#define STATE_OFF 0 > +#define STATE_KEEP 1 > +#define STATE_ON 2 We should add enum into core for this... > +static int aw2013_chip_init(struct aw2013 *chip) > +{ > + int i, ret; > + > + ret = regmap_write(chip->regmap, AW2013_GCR, AW2013_GCR_ENABLE); > + if (ret) { > + dev_err(&chip->client->dev, "Failed to enable the chip: %d\n", > + ret); > + goto error; > + } > + > + for (i = 0; i < chip->num_leds; i++) { > + ret = regmap_update_bits(chip->regmap, > + AW2013_LCFG(chip->leds[i].num), > + AW2013_LCFG_IMAX_MASK, > + chip->leds[i].imax); > + if (ret) { > + dev_err(&chip->client->dev, > + "Failed to set maximum current for led %d: %d\n", > + chip->leds[i].num, ret); > + goto error; > + } > + } > + > +error: > + return ret; > +} No need for goto if you are just returning. > +static bool aw2013_chip_in_use(struct aw2013 *chip) > +{ > + int i; > + > + for (i = 0; i < chip->num_leds; i++) > + if (chip->leds[i].cdev.brightness) > + return true; > + > + return false; > +} How is this going to interact with ledstate == KEEP? > +static int aw2013_brightness_set(struct led_classdev *cdev, > + enum led_brightness brightness) > +{ > + struct aw2013_led *led = container_of(cdev, struct aw2013_led, cdev); > + int ret, num; > + > + mutex_lock(&led->chip->mutex); > + > + if (aw2013_chip_in_use(led->chip)) { > + ret = aw2013_chip_enable(led->chip); > + if (ret) > + return ret; > + } You are returning with mutex held. > + /* Never on - just set to off */ > + if (!*delay_on) > + return aw2013_brightness_set(&led->cdev, LED_OFF); > + > + /* Never off - just set to brightness */ > + if (!*delay_off) > + return aw2013_brightness_set(&led->cdev, led->cdev.brightness); Is this dance neccessary? Should we do it in the core somewhere? > + } else { > + led->imax = 1; // 5mA > + dev_info(&client->dev, > + "DT property led-max-microamp is missing!\n"); > + } Lets remove the exclamation mark. > + led->num = source; > + led->chip = chip; > + led->fwnode = of_fwnode_handle(child); > + > + if (!of_property_read_string(child, "default-state", &str)) { > + if (!strcmp(str, "on")) > + led->default_state = STATE_ON; > + else if (!strcmp(str, "keep")) > + led->default_state = STATE_KEEP; > + else > + led->default_state = STATE_OFF; > + } We should really have something in core for this. Should we support arbitrary brightness there? > +static void aw2013_read_current_state(struct aw2013 *chip) > +{ > + int i, led_on; > + > + regmap_read(chip->regmap, AW2013_LCTR, &led_on); > + > + for (i = 0; i < chip->num_leds; i++) { > + if (!(led_on & AW2013_LCTR_LE(chip->leds[i].num))) { > + chip->leds[i].cdev.brightness = LED_OFF; > + continue; > + } > + regmap_read(chip->regmap, AW2013_REG_PWM(chip->leds[i].num), > + &chip->leds[i].cdev.brightness); > + } > +} > + > +static void aw2013_init_default_state(struct aw2013_led *led) > +{ > + switch (led->default_state) { > + case STATE_ON: > + led->cdev.brightness = LED_FULL; > + break; > + case STATE_OFF: > + led->cdev.brightness = LED_OFF; > + } /* On keep - just set brightness that was retrieved previously */ > + > + aw2013_brightness_set(&led->cdev, led->cdev.brightness); > +} Aha; I guess this makes "keeping" the state to work. Do you really need that functionality? Pretty nice driver, thanks. Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Attachment:
signature.asc
Description: PGP signature