Lines Matching +full:pwm +full:- +full:leds
2 * pca9532.c - 16-bit Led dimmer
18 #include <linux/leds.h>
22 #include <linux/leds-pca9532.h>
43 struct pca9532_led leds[16]; member
51 u8 pwm[2]; member
105 .name = "leds-pca953x",
113 /* We have two pwm/blinkers, but 16 possible leds to drive. Additionally,
114 * the clever Thecus people are using one pwm to drive the beeper. So,
115 * as a compromise we average one pwm to the values requested by all
116 * leds that are not ON/OFF.
118 static int pca9532_calcpwm(struct i2c_client *client, int pwm, int blink, in pca9532_calcpwm() argument
123 for (i = 0; i < data->chip_info->num_leds; i++) { in pca9532_calcpwm()
124 if (data->leds[i].type == PCA9532_TYPE_LED && in pca9532_calcpwm()
125 data->leds[i].state == PCA9532_PWM0+pwm) { in pca9532_calcpwm()
127 b += data->leds[i].ldev.brightness; in pca9532_calcpwm()
131 dev_err(&client->dev, in pca9532_calcpwm()
134 return -EINVAL; in pca9532_calcpwm()
138 return -EINVAL; in pca9532_calcpwm()
139 data->pwm[pwm] = b; in pca9532_calcpwm()
140 data->psc[pwm] = blink; in pca9532_calcpwm()
144 static int pca9532_setpwm(struct i2c_client *client, int pwm) in pca9532_setpwm() argument
147 u8 maxleds = data->chip_info->num_leds; in pca9532_setpwm()
149 mutex_lock(&data->update_lock); in pca9532_setpwm()
150 i2c_smbus_write_byte_data(client, PCA9532_REG_PWM(maxleds, pwm), in pca9532_setpwm()
151 data->pwm[pwm]); in pca9532_setpwm()
152 i2c_smbus_write_byte_data(client, PCA9532_REG_PSC(maxleds, pwm), in pca9532_setpwm()
153 data->psc[pwm]); in pca9532_setpwm()
154 mutex_unlock(&data->update_lock); in pca9532_setpwm()
161 struct i2c_client *client = led->client; in pca9532_setled()
163 u8 maxleds = data->chip_info->num_leds; in pca9532_setled()
166 mutex_lock(&data->update_lock); in pca9532_setled()
167 reg = i2c_smbus_read_byte_data(client, LED_REG(maxleds, led->id)); in pca9532_setled()
169 reg = reg & ~(0x3<<LED_NUM(led->id)*2); in pca9532_setled()
171 reg = reg | (led->state << LED_NUM(led->id)*2); in pca9532_setled()
172 i2c_smbus_write_byte_data(client, LED_REG(maxleds, led->id), reg); in pca9532_setled()
173 mutex_unlock(&data->update_lock); in pca9532_setled()
183 led->state = PCA9532_OFF; in pca9532_set_brightness()
185 led->state = PCA9532_ON; in pca9532_set_brightness()
187 led->state = PCA9532_PWM0; /* Thecus: hardcode one pwm */ in pca9532_set_brightness()
188 err = pca9532_calcpwm(led->client, 0, 0, value); in pca9532_set_brightness()
192 if (led->state == PCA9532_PWM0) in pca9532_set_brightness()
193 pca9532_setpwm(led->client, 0); in pca9532_set_brightness()
202 struct i2c_client *client = led->client; in pca9532_set_blink()
212 return -EINVAL; in pca9532_set_blink()
214 /* Thecus specific: only use PSC/PWM 0 */ in pca9532_set_blink()
215 psc = (*delay_on * 152-1)/1000; in pca9532_set_blink()
216 err = pca9532_calcpwm(client, 0, psc, led_cdev->brightness); in pca9532_set_blink()
219 if (led->state == PCA9532_PWM0) in pca9532_set_blink()
220 pca9532_setpwm(led->client, 0); in pca9532_set_blink()
232 return -1; in pca9532_event()
234 /* XXX: allow different kind of beeps with psc/pwm modifications */ in pca9532_event()
236 data->pwm[1] = 127; in pca9532_event()
238 data->pwm[1] = 0; in pca9532_event()
240 schedule_work(&data->work); in pca9532_event()
249 u8 maxleds = data->chip_info->num_leds; in pca9532_input_work()
251 mutex_lock(&data->update_lock); in pca9532_input_work()
252 i2c_smbus_write_byte_data(data->client, PCA9532_REG_PWM(maxleds, 1), in pca9532_input_work()
253 data->pwm[1]); in pca9532_input_work()
254 mutex_unlock(&data->update_lock); in pca9532_input_work()
259 struct i2c_client *client = led->client; in pca9532_getled()
261 u8 maxleds = data->chip_info->num_leds; in pca9532_getled()
265 mutex_lock(&data->update_lock); in pca9532_getled()
266 reg = i2c_smbus_read_byte_data(client, LED_REG(maxleds, led->id)); in pca9532_getled()
267 ret = reg >> LED_NUM(led->id)/2; in pca9532_getled()
268 mutex_unlock(&data->update_lock); in pca9532_getled()
276 struct pca9532_led *led = &data->leds[offset]; in pca9532_gpio_request_pin()
278 if (led->type == PCA9532_TYPE_GPIO) in pca9532_gpio_request_pin()
281 return -EBUSY; in pca9532_gpio_request_pin()
287 struct pca9532_led *led = &data->leds[offset]; in pca9532_gpio_set_value()
290 led->state = PCA9532_ON; in pca9532_gpio_set_value()
292 led->state = PCA9532_OFF; in pca9532_gpio_set_value()
302 reg = i2c_smbus_read_byte_data(data->client, PCA9532_REG_INPUT(offset)); in pca9532_gpio_get_value()
328 return -EINVAL; in pca9532_destroy_devices()
330 while (--i >= 0) { in pca9532_destroy_devices()
331 switch (data->leds[i].type) { in pca9532_destroy_devices()
336 led_classdev_unregister(&data->leds[i].ldev); in pca9532_destroy_devices()
339 if (data->idev != NULL) { in pca9532_destroy_devices()
340 cancel_work_sync(&data->work); in pca9532_destroy_devices()
341 data->idev = NULL; in pca9532_destroy_devices()
348 if (data->gpio.parent) in pca9532_destroy_devices()
349 gpiochip_remove(&data->gpio); in pca9532_destroy_devices()
360 u8 maxleds = data->chip_info->num_leds; in pca9532_configure()
363 data->pwm[i] = pdata->pwm[i]; in pca9532_configure()
364 data->psc[i] = pdata->psc[i]; in pca9532_configure()
366 data->pwm[i]); in pca9532_configure()
368 data->psc[i]); in pca9532_configure()
371 for (i = 0; i < data->chip_info->num_leds; i++) { in pca9532_configure()
372 struct pca9532_led *led = &data->leds[i]; in pca9532_configure()
373 struct pca9532_led *pled = &pdata->leds[i]; in pca9532_configure()
374 led->client = client; in pca9532_configure()
375 led->id = i; in pca9532_configure()
376 led->type = pled->type; in pca9532_configure()
377 switch (led->type) { in pca9532_configure()
384 if (pled->state == PCA9532_KEEP) in pca9532_configure()
385 led->state = pca9532_getled(led); in pca9532_configure()
387 led->state = pled->state; in pca9532_configure()
388 led->name = pled->name; in pca9532_configure()
389 led->ldev.name = led->name; in pca9532_configure()
390 led->ldev.default_trigger = pled->default_trigger; in pca9532_configure()
391 led->ldev.brightness = LED_OFF; in pca9532_configure()
392 led->ldev.brightness_set_blocking = in pca9532_configure()
394 led->ldev.blink_set = pca9532_set_blink; in pca9532_configure()
395 err = led_classdev_register(&client->dev, &led->ldev); in pca9532_configure()
397 dev_err(&client->dev, in pca9532_configure()
399 led->name); in pca9532_configure()
405 BUG_ON(data->idev); in pca9532_configure()
406 led->state = PCA9532_PWM1; in pca9532_configure()
408 data->idev = devm_input_allocate_device(&client->dev); in pca9532_configure()
409 if (data->idev == NULL) { in pca9532_configure()
410 err = -ENOMEM; in pca9532_configure()
413 data->idev->name = pled->name; in pca9532_configure()
414 data->idev->phys = "i2c/pca9532"; in pca9532_configure()
415 data->idev->id.bustype = BUS_HOST; in pca9532_configure()
416 data->idev->id.vendor = 0x001f; in pca9532_configure()
417 data->idev->id.product = 0x0001; in pca9532_configure()
418 data->idev->id.version = 0x0100; in pca9532_configure()
419 data->idev->evbit[0] = BIT_MASK(EV_SND); in pca9532_configure()
420 data->idev->sndbit[0] = BIT_MASK(SND_BELL) | in pca9532_configure()
422 data->idev->event = pca9532_event; in pca9532_configure()
423 input_set_drvdata(data->idev, data); in pca9532_configure()
424 INIT_WORK(&data->work, pca9532_input_work); in pca9532_configure()
425 err = input_register_device(data->idev); in pca9532_configure()
427 cancel_work_sync(&data->work); in pca9532_configure()
428 data->idev = NULL; in pca9532_configure()
437 data->gpio.label = "gpio-pca9532"; in pca9532_configure()
438 data->gpio.direction_input = pca9532_gpio_direction_input; in pca9532_configure()
439 data->gpio.direction_output = pca9532_gpio_direction_output; in pca9532_configure()
440 data->gpio.set = pca9532_gpio_set_value; in pca9532_configure()
441 data->gpio.get = pca9532_gpio_get_value; in pca9532_configure()
442 data->gpio.request = pca9532_gpio_request_pin; in pca9532_configure()
443 data->gpio.can_sleep = 1; in pca9532_configure()
444 data->gpio.base = pdata->gpio_base; in pca9532_configure()
445 data->gpio.ngpio = data->chip_info->num_leds; in pca9532_configure()
446 data->gpio.parent = &client->dev; in pca9532_configure()
447 data->gpio.owner = THIS_MODULE; in pca9532_configure()
449 err = gpiochip_add_data(&data->gpio, data); in pca9532_configure()
451 /* Use data->gpio.dev as a flag for freeing gpiochip */ in pca9532_configure()
452 data->gpio.parent = NULL; in pca9532_configure()
453 dev_warn(&client->dev, "could not add gpiochip\n"); in pca9532_configure()
455 dev_info(&client->dev, "gpios %i...%i\n", in pca9532_configure()
456 data->gpio.base, data->gpio.base + in pca9532_configure()
457 data->gpio.ngpio - 1); in pca9532_configure()
481 return ERR_PTR(-ENODEV); in pca9532_of_populate_pdata()
483 devid = (int)(uintptr_t)match->data; in pca9532_of_populate_pdata()
488 return ERR_PTR(-ENOMEM); in pca9532_of_populate_pdata()
492 &pdata->leds[i].name)) in pca9532_of_populate_pdata()
493 pdata->leds[i].name = child->name; in pca9532_of_populate_pdata()
494 of_property_read_u32(child, "type", &pdata->leds[i].type); in pca9532_of_populate_pdata()
495 of_property_read_string(child, "linux,default-trigger", in pca9532_of_populate_pdata()
496 &pdata->leds[i].default_trigger); in pca9532_of_populate_pdata()
497 if (!of_property_read_string(child, "default-state", &state)) { in pca9532_of_populate_pdata()
499 pdata->leds[i].state = PCA9532_ON; in pca9532_of_populate_pdata()
501 pdata->leds[i].state = PCA9532_KEEP; in pca9532_of_populate_pdata()
519 dev_get_platdata(&client->dev); in pca9532_probe()
520 struct device_node *np = client->dev.of_node; in pca9532_probe()
525 pca9532_of_populate_pdata(&client->dev, np); in pca9532_probe()
529 dev_err(&client->dev, "no platform data\n"); in pca9532_probe()
530 return -EINVAL; in pca9532_probe()
533 &client->dev); in pca9532_probe()
535 return -EINVAL; in pca9532_probe()
536 devid = (int)(uintptr_t) of_id->data; in pca9532_probe()
538 devid = id->driver_data; in pca9532_probe()
541 if (!i2c_check_functionality(client->adapter, in pca9532_probe()
543 return -EIO; in pca9532_probe()
545 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); in pca9532_probe()
547 return -ENOMEM; in pca9532_probe()
549 data->chip_info = &pca9532_chip_info_tbl[devid]; in pca9532_probe()
551 dev_info(&client->dev, "setting platform data\n"); in pca9532_probe()
553 data->client = client; in pca9532_probe()
554 mutex_init(&data->update_lock); in pca9532_probe()
564 err = pca9532_destroy_devices(data, data->chip_info->num_leds); in pca9532_remove()