• Home
  • Raw
  • Download

Lines Matching +full:nxp +full:- +full:i

5  * Author: Peter Meerwald <p.meerwald@bct-electronic.com>
8 * Based on leds-pca955x.c
14 * LED driver for the PCA9633 I2C LED driver (7-bit slave address 0x62)
15 * LED driver for the PCA9634/5 I2C LED driver (7-bit slave address set by hw.)
25 * or by adding the 'nxp,hw-blink' property to the DTS.
38 #include <linux/platform_data/leds-pca963x.h>
46 #define PCA963X_MODE2_OUTDRV 0x04 /* Open-drain or totem pole */
133 u8 ledout_addr = pca963x->chip->chipdef->ledout_base in pca963x_brightness()
134 + (pca963x->led_num / 4); in pca963x_brightness()
136 int shift = 2 * (pca963x->led_num % 4); in pca963x_brightness()
140 ledout = i2c_smbus_read_byte_data(pca963x->chip->client, ledout_addr); in pca963x_brightness()
143 ret = i2c_smbus_write_byte_data(pca963x->chip->client, in pca963x_brightness()
148 ret = i2c_smbus_write_byte_data(pca963x->chip->client, in pca963x_brightness()
152 ret = i2c_smbus_write_byte_data(pca963x->chip->client, in pca963x_brightness()
153 PCA963X_PWM_BASE + pca963x->led_num, in pca963x_brightness()
157 ret = i2c_smbus_write_byte_data(pca963x->chip->client, in pca963x_brightness()
168 u8 ledout_addr = pca963x->chip->chipdef->ledout_base + in pca963x_blink()
169 (pca963x->led_num / 4); in pca963x_blink()
171 u8 mode2 = i2c_smbus_read_byte_data(pca963x->chip->client, in pca963x_blink()
173 int shift = 2 * (pca963x->led_num % 4); in pca963x_blink()
176 i2c_smbus_write_byte_data(pca963x->chip->client, in pca963x_blink()
177 pca963x->chip->chipdef->grppwm, pca963x->gdc); in pca963x_blink()
179 i2c_smbus_write_byte_data(pca963x->chip->client, in pca963x_blink()
180 pca963x->chip->chipdef->grpfreq, pca963x->gfrq); in pca963x_blink()
183 i2c_smbus_write_byte_data(pca963x->chip->client, PCA963X_MODE2, in pca963x_blink()
186 mutex_lock(&pca963x->chip->mutex); in pca963x_blink()
187 ledout = i2c_smbus_read_byte_data(pca963x->chip->client, ledout_addr); in pca963x_blink()
189 i2c_smbus_write_byte_data(pca963x->chip->client, ledout_addr, in pca963x_blink()
191 mutex_unlock(&pca963x->chip->mutex); in pca963x_blink()
196 unsigned long *leds_on = &pca963x->chip->leds_on; in pca963x_power_state()
197 unsigned long cached_leds = pca963x->chip->leds_on; in pca963x_power_state()
199 if (pca963x->led_cdev.brightness) in pca963x_power_state()
200 set_bit(pca963x->led_num, leds_on); in pca963x_power_state()
202 clear_bit(pca963x->led_num, leds_on); in pca963x_power_state()
205 return i2c_smbus_write_byte_data(pca963x->chip->client, in pca963x_power_state()
219 mutex_lock(&pca963x->chip->mutex); in pca963x_led_set()
227 mutex_unlock(&pca963x->chip->mutex); in pca963x_led_set()
234 unsigned int scaling = pca963x->chip->chipdef->scaling; in pca963x_period_scale()
268 * From manual: duty cycle = (GDC / 256) -> in pca963x_blink_set()
269 * (time_on / period) = (GDC / 256) -> in pca963x_blink_set()
276 * So, period (in ms) = (((GFRQ + 1) / 24) * 1000) -> in pca963x_blink_set()
277 * GFRQ = ((period * 24 / 1000) - 1) in pca963x_blink_set()
279 gfrq = (period * 24 / 1000) - 1; in pca963x_blink_set()
281 pca963x->gdc = gdc; in pca963x_blink_set()
282 pca963x->gfrq = gfrq; in pca963x_blink_set()
296 struct device_node *np = client->dev.of_node, *child; in pca963x_dt_init()
302 if (!count || count > chip->n_leds) in pca963x_dt_init()
303 return ERR_PTR(-ENODEV); in pca963x_dt_init()
305 pca963x_leds = devm_kcalloc(&client->dev, in pca963x_dt_init()
306 chip->n_leds, sizeof(struct led_info), GFP_KERNEL); in pca963x_dt_init()
308 return ERR_PTR(-ENOMEM); in pca963x_dt_init()
316 if ((res != 0) || (reg >= chip->n_leds)) in pca963x_dt_init()
319 of_get_property(child, "label", NULL) ? : child->name; in pca963x_dt_init()
321 of_get_property(child, "linux,default-trigger", NULL); in pca963x_dt_init()
324 pdata = devm_kzalloc(&client->dev, in pca963x_dt_init()
327 return ERR_PTR(-ENOMEM); in pca963x_dt_init()
329 pdata->leds.leds = pca963x_leds; in pca963x_dt_init()
330 pdata->leds.num_leds = chip->n_leds; in pca963x_dt_init()
332 /* default to open-drain unless totem pole (push-pull) is specified */ in pca963x_dt_init()
333 if (of_property_read_bool(np, "nxp,totem-pole")) in pca963x_dt_init()
334 pdata->outdrv = PCA963X_TOTEM_POLE; in pca963x_dt_init()
336 pdata->outdrv = PCA963X_OPEN_DRAIN; in pca963x_dt_init()
339 if (of_property_read_bool(np, "nxp,hw-blink")) in pca963x_dt_init()
340 pdata->blink_type = PCA963X_HW_BLINK; in pca963x_dt_init()
342 pdata->blink_type = PCA963X_SW_BLINK; in pca963x_dt_init()
344 if (of_property_read_u32(np, "nxp,period-scale", &chip->scaling)) in pca963x_dt_init()
345 chip->scaling = 1000; in pca963x_dt_init()
347 /* default to non-inverted output, unless inverted is specified */ in pca963x_dt_init()
348 if (of_property_read_bool(np, "nxp,inverted-out")) in pca963x_dt_init()
349 pdata->dir = PCA963X_INVERTED; in pca963x_dt_init()
351 pdata->dir = PCA963X_NORMAL; in pca963x_dt_init()
357 { .compatible = "nxp,pca9632", },
358 { .compatible = "nxp,pca9633", },
359 { .compatible = "nxp,pca9634", },
360 { .compatible = "nxp,pca9635", },
368 return ERR_PTR(-ENODEV); in pca963x_dt_init()
379 int i, err; in pca963x_probe() local
382 chip = &pca963x_chipdefs[id->driver_data]; in pca963x_probe()
386 acpi_id = acpi_match_device(pca963x_acpi_ids, &client->dev); in pca963x_probe()
388 return -ENODEV; in pca963x_probe()
389 chip = &pca963x_chipdefs[acpi_id->driver_data]; in pca963x_probe()
391 pdata = dev_get_platdata(&client->dev); in pca963x_probe()
396 dev_warn(&client->dev, "could not parse configuration\n"); in pca963x_probe()
401 if (pdata && (pdata->leds.num_leds < 1 || in pca963x_probe()
402 pdata->leds.num_leds > chip->n_leds)) { in pca963x_probe()
403 dev_err(&client->dev, "board info must claim 1-%d LEDs", in pca963x_probe()
404 chip->n_leds); in pca963x_probe()
405 return -EINVAL; in pca963x_probe()
408 pca963x_chip = devm_kzalloc(&client->dev, sizeof(*pca963x_chip), in pca963x_probe()
411 return -ENOMEM; in pca963x_probe()
412 pca963x = devm_kcalloc(&client->dev, chip->n_leds, sizeof(*pca963x), in pca963x_probe()
415 return -ENOMEM; in pca963x_probe()
419 mutex_init(&pca963x_chip->mutex); in pca963x_probe()
420 pca963x_chip->chipdef = chip; in pca963x_probe()
421 pca963x_chip->client = client; in pca963x_probe()
422 pca963x_chip->leds = pca963x; in pca963x_probe()
425 for (i = 0; i < chip->n_leds / 4; i++) in pca963x_probe()
426 i2c_smbus_write_byte_data(client, chip->ledout_base + i, 0x00); in pca963x_probe()
428 for (i = 0; i < chip->n_leds; i++) { in pca963x_probe()
429 pca963x[i].led_num = i; in pca963x_probe()
430 pca963x[i].chip = pca963x_chip; in pca963x_probe()
433 if (pdata && i < pdata->leds.num_leds) { in pca963x_probe()
434 if (pdata->leds.leds[i].name) in pca963x_probe()
435 snprintf(pca963x[i].name, in pca963x_probe()
436 sizeof(pca963x[i].name), "pca963x:%s", in pca963x_probe()
437 pdata->leds.leds[i].name); in pca963x_probe()
438 if (pdata->leds.leds[i].default_trigger) in pca963x_probe()
439 pca963x[i].led_cdev.default_trigger = in pca963x_probe()
440 pdata->leds.leds[i].default_trigger; in pca963x_probe()
442 if (!pdata || i >= pdata->leds.num_leds || in pca963x_probe()
443 !pdata->leds.leds[i].name) in pca963x_probe()
444 snprintf(pca963x[i].name, sizeof(pca963x[i].name), in pca963x_probe()
445 "pca963x:%d:%.2x:%d", client->adapter->nr, in pca963x_probe()
446 client->addr, i); in pca963x_probe()
448 pca963x[i].led_cdev.name = pca963x[i].name; in pca963x_probe()
449 pca963x[i].led_cdev.brightness_set_blocking = pca963x_led_set; in pca963x_probe()
451 if (pdata && pdata->blink_type == PCA963X_HW_BLINK) in pca963x_probe()
452 pca963x[i].led_cdev.blink_set = pca963x_blink_set; in pca963x_probe()
454 err = led_classdev_register(&client->dev, &pca963x[i].led_cdev); in pca963x_probe()
459 /* Disable LED all-call address, and power down initially */ in pca963x_probe()
463 u8 mode2 = i2c_smbus_read_byte_data(pca963x->chip->client, in pca963x_probe()
465 /* Configure output: open-drain or totem pole (push-pull) */ in pca963x_probe()
466 if (pdata->outdrv == PCA963X_OPEN_DRAIN) in pca963x_probe()
471 if (pdata->dir == PCA963X_INVERTED) in pca963x_probe()
473 i2c_smbus_write_byte_data(pca963x->chip->client, PCA963X_MODE2, in pca963x_probe()
480 while (i--) in pca963x_probe()
481 led_classdev_unregister(&pca963x[i].led_cdev); in pca963x_probe()
489 int i; in pca963x_remove() local
491 for (i = 0; i < pca963x->chipdef->n_leds; i++) in pca963x_remove()
492 led_classdev_unregister(&pca963x->leds[i].led_cdev); in pca963x_remove()
499 .name = "leds-pca963x",
510 MODULE_AUTHOR("Peter Meerwald <p.meerwald@bct-electronic.com>");