Lines Matching refs:pca955x

125 struct pca955x {  struct
139 struct pca955x *pca955x; argument
186 static int pca955x_write_psc(struct pca955x *pca955x, int n, u8 val) in pca955x_write_psc() argument
188 u8 cmd = pca955x_num_input_regs(pca955x->chipdef->bits) + (2 * n); in pca955x_write_psc()
191 ret = i2c_smbus_write_byte_data(pca955x->client, cmd, val); in pca955x_write_psc()
193 dev_err(&pca955x->client->dev, "%s: reg 0x%x, val 0x%x, err %d\n", __func__, n, in pca955x_write_psc()
205 static int pca955x_write_pwm(struct pca955x *pca955x, int n, u8 val) in pca955x_write_pwm() argument
207 u8 cmd = pca955x_num_input_regs(pca955x->chipdef->bits) + 1 + (2 * n); in pca955x_write_pwm()
210 ret = i2c_smbus_write_byte_data(pca955x->client, cmd, val); in pca955x_write_pwm()
212 dev_err(&pca955x->client->dev, "%s: reg 0x%x, val 0x%x, err %d\n", __func__, n, in pca955x_write_pwm()
221 static int pca955x_write_ls(struct pca955x *pca955x, int n, u8 val) in pca955x_write_ls() argument
223 u8 cmd = pca955x_num_input_regs(pca955x->chipdef->bits) + 4 + n; in pca955x_write_ls()
226 ret = i2c_smbus_write_byte_data(pca955x->client, cmd, val); in pca955x_write_ls()
228 dev_err(&pca955x->client->dev, "%s: reg 0x%x, val 0x%x, err %d\n", __func__, n, in pca955x_write_ls()
237 static int pca955x_read_ls(struct pca955x *pca955x, int n, u8 *val) in pca955x_read_ls() argument
239 u8 cmd = pca955x_num_input_regs(pca955x->chipdef->bits) + 4 + n; in pca955x_read_ls()
242 ret = i2c_smbus_read_byte_data(pca955x->client, cmd); in pca955x_read_ls()
244 dev_err(&pca955x->client->dev, "%s: reg 0x%x, err %d\n", __func__, n, ret); in pca955x_read_ls()
251 static int pca955x_read_pwm(struct pca955x *pca955x, int n, u8 *val) in pca955x_read_pwm() argument
253 u8 cmd = pca955x_num_input_regs(pca955x->chipdef->bits) + 1 + (2 * n); in pca955x_read_pwm()
256 ret = i2c_smbus_read_byte_data(pca955x->client, cmd); in pca955x_read_pwm()
258 dev_err(&pca955x->client->dev, "%s: reg 0x%x, err %d\n", __func__, n, ret); in pca955x_read_pwm()
265 static int pca955x_read_psc(struct pca955x *pca955x, int n, u8 *val) in pca955x_read_psc() argument
267 u8 cmd = pca955x_num_input_regs(pca955x->chipdef->bits) + (2 * n); in pca955x_read_psc()
270 ret = i2c_smbus_read_byte_data(pca955x->client, cmd); in pca955x_read_psc()
272 dev_err(&pca955x->client->dev, "%s: reg 0x%x, err %d\n", __func__, n, ret); in pca955x_read_psc()
282 struct pca955x *pca955x = pca955x_led->pca955x; in pca955x_led_get() local
286 ret = pca955x_read_ls(pca955x, pca955x_led->led_num / 4, &ls); in pca955x_led_get()
299 ret = pca955x_read_pwm(pca955x, 1, &pwm); in pca955x_led_get()
313 struct pca955x *pca955x = pca955x_led->pca955x; in pca955x_led_set() local
319 mutex_lock(&pca955x->lock); in pca955x_led_set()
321 ret = pca955x_read_ls(pca955x, reg, &ls); in pca955x_led_set()
325 if (test_bit(pca955x_led->led_num, &pca955x->active_blink)) { in pca955x_led_set()
327 clear_bit(pca955x_led->led_num, &pca955x->active_blink); in pca955x_led_set()
349 ret = pca955x_write_pwm(pca955x, 1, 255 - value); in pca955x_led_set()
357 ret = pca955x_write_ls(pca955x, reg, ls); in pca955x_led_set()
360 mutex_unlock(&pca955x->lock); in pca955x_led_set()
365 static u8 pca955x_period_to_psc(struct pca955x *pca955x, unsigned long p) in pca955x_period_to_psc() argument
367 p *= pca955x->chipdef->blink_div; in pca955x_period_to_psc()
374 static unsigned long pca955x_psc_to_period(struct pca955x *pca955x, u8 psc) in pca955x_psc_to_period() argument
380 p /= pca955x->chipdef->blink_div; in pca955x_psc_to_period()
389 struct pca955x *pca955x = pca955x_led->pca955x; in pca955x_led_blink() local
393 mutex_lock(&pca955x->lock); in pca955x_led_blink()
401 if (p < pca955x_psc_to_period(pca955x, 0) || in pca955x_led_blink()
402 p > pca955x_psc_to_period(pca955x, 0xff)) { in pca955x_led_blink()
407 p = pca955x->active_blink ? pca955x->blink_period : in pca955x_led_blink()
411 if (!pca955x->active_blink || in pca955x_led_blink()
412 pca955x->active_blink == BIT(pca955x_led->led_num) || in pca955x_led_blink()
413 pca955x->blink_period == p) { in pca955x_led_blink()
414 u8 psc = pca955x_period_to_psc(pca955x, p); in pca955x_led_blink()
417 &pca955x->active_blink)) { in pca955x_led_blink()
422 ret = pca955x_read_ls(pca955x, reg, &ls); in pca955x_led_blink()
427 ret = pca955x_write_ls(pca955x, reg, ls); in pca955x_led_blink()
435 ret = pca955x_write_pwm(pca955x, 0, 128); in pca955x_led_blink()
440 if (pca955x->blink_period != p) { in pca955x_led_blink()
441 pca955x->blink_period = p; in pca955x_led_blink()
442 ret = pca955x_write_psc(pca955x, 0, psc); in pca955x_led_blink()
447 p = pca955x_psc_to_period(pca955x, psc); in pca955x_led_blink()
456 mutex_unlock(&pca955x->lock); in pca955x_led_blink()
481 struct pca955x *pca955x = gpiochip_get_data(gc); in pca955x_gpio_request_pin() local
483 return test_and_set_bit(offset, &pca955x->active_pins) ? -EBUSY : 0; in pca955x_gpio_request_pin()
488 struct pca955x *pca955x = gpiochip_get_data(gc); in pca955x_gpio_free_pin() local
490 clear_bit(offset, &pca955x->active_pins); in pca955x_gpio_free_pin()
496 struct pca955x *pca955x = gpiochip_get_data(gc); in pca955x_set_value() local
497 struct pca955x_led *led = &pca955x->leds[offset]; in pca955x_set_value()
513 struct pca955x *pca955x = gpiochip_get_data(gc); in pca955x_gpio_get_value() local
514 struct pca955x_led *led = &pca955x->leds[offset]; in pca955x_gpio_get_value()
518 pca955x_read_input(pca955x->client, led->led_num / 8, &reg); in pca955x_gpio_get_value()
526 struct pca955x *pca955x = gpiochip_get_data(gc); in pca955x_gpio_direction_input() local
527 struct pca955x_led *led = &pca955x->leds[offset]; in pca955x_gpio_direction_input()
595 struct pca955x *pca955x; in pca955x_probe() local
657 pca955x = devm_kzalloc(&client->dev, sizeof(*pca955x), GFP_KERNEL); in pca955x_probe()
658 if (!pca955x) in pca955x_probe()
661 pca955x->leds = devm_kcalloc(&client->dev, chip->bits, in pca955x_probe()
663 if (!pca955x->leds) in pca955x_probe()
666 i2c_set_clientdata(client, pca955x); in pca955x_probe()
668 mutex_init(&pca955x->lock); in pca955x_probe()
669 pca955x->client = client; in pca955x_probe()
670 pca955x->chipdef = chip; in pca955x_probe()
671 pca955x->blink_period = PCA955X_BLINK_DEFAULT_MS; in pca955x_probe()
688 pca955x_led = &pca955x->leds[i]; in pca955x_probe()
690 pca955x_led->pca955x = pca955x; in pca955x_probe()
711 set_bit(i, &pca955x->active_blink); in pca955x_probe()
739 set_bit(i, &pca955x->active_pins); in pca955x_probe()
745 err = pca955x_write_ls(pca955x, i, ls2[i]); in pca955x_probe()
752 err = pca955x_read_psc(pca955x, 0, &psc0); in pca955x_probe()
754 psc0 = pca955x_period_to_psc(pca955x, pca955x->blink_period); in pca955x_probe()
755 err = pca955x_write_psc(pca955x, 0, psc0); in pca955x_probe()
761 pca955x->blink_period = pca955x_psc_to_period(pca955x, psc0); in pca955x_probe()
764 err = pca955x_write_psc(pca955x, 1, 0); in pca955x_probe()
769 pca955x->gpio.label = "gpio-pca955x"; in pca955x_probe()
770 pca955x->gpio.direction_input = pca955x_gpio_direction_input; in pca955x_probe()
771 pca955x->gpio.direction_output = pca955x_gpio_direction_output; in pca955x_probe()
772 pca955x->gpio.set = pca955x_gpio_set_value; in pca955x_probe()
773 pca955x->gpio.get = pca955x_gpio_get_value; in pca955x_probe()
774 pca955x->gpio.request = pca955x_gpio_request_pin; in pca955x_probe()
775 pca955x->gpio.free = pca955x_gpio_free_pin; in pca955x_probe()
776 pca955x->gpio.can_sleep = 1; in pca955x_probe()
777 pca955x->gpio.base = -1; in pca955x_probe()
778 pca955x->gpio.ngpio = chip->bits; in pca955x_probe()
779 pca955x->gpio.parent = &client->dev; in pca955x_probe()
780 pca955x->gpio.owner = THIS_MODULE; in pca955x_probe()
782 err = devm_gpiochip_add_data(&client->dev, &pca955x->gpio, in pca955x_probe()
783 pca955x); in pca955x_probe()
786 pca955x->gpio.parent = NULL; in pca955x_probe()
791 pca955x->gpio.base, pca955x->gpio.base + in pca955x_probe()
792 pca955x->gpio.ngpio - 1); in pca955x_probe()