pinctrl-sx150x.c (6489677f86c330404ae47703bf59d30ec4c46de9) | pinctrl-sx150x.c (d977a876c655f176d9faf87fe55148ca2676d3fb) |
---|---|
1/* 2 * Copyright (c) 2016, BayLibre, SAS. All rights reserved. 3 * Author: Neil Armstrong <narmstrong@baylibre.com> 4 * 5 * Copyright (c) 2010, Code Aurora Forum. All rights reserved. 6 * 7 * Driver for Semtech SX150X I2C GPIO Expanders 8 * --- 329 unchanged lines hidden (view full) --- 338 int ret; 339 340 switch (mode) { 341 case LINE_MODE_PUSH_PULL: 342 if (pctl->data->model != SX150X_789 || 343 sx150x_pin_is_oscio(pctl, offset)) 344 return 0; 345 | 1/* 2 * Copyright (c) 2016, BayLibre, SAS. All rights reserved. 3 * Author: Neil Armstrong <narmstrong@baylibre.com> 4 * 5 * Copyright (c) 2010, Code Aurora Forum. All rights reserved. 6 * 7 * Driver for Semtech SX150X I2C GPIO Expanders 8 * --- 329 unchanged lines hidden (view full) --- 338 int ret; 339 340 switch (mode) { 341 case LINE_MODE_PUSH_PULL: 342 if (pctl->data->model != SX150X_789 || 343 sx150x_pin_is_oscio(pctl, offset)) 344 return 0; 345 |
346 mutex_lock(&pctl->lock); | |
347 ret = regmap_write_bits(pctl->regmap, 348 pctl->data->pri.x789.reg_drain, 349 BIT(offset), 0); | 346 ret = regmap_write_bits(pctl->regmap, 347 pctl->data->pri.x789.reg_drain, 348 BIT(offset), 0); |
350 mutex_unlock(&pctl->lock); 351 if (ret < 0) 352 return ret; | |
353 break; 354 355 case LINE_MODE_OPEN_DRAIN: 356 if (pctl->data->model != SX150X_789 || 357 sx150x_pin_is_oscio(pctl, offset)) 358 return -ENOTSUPP; 359 | 349 break; 350 351 case LINE_MODE_OPEN_DRAIN: 352 if (pctl->data->model != SX150X_789 || 353 sx150x_pin_is_oscio(pctl, offset)) 354 return -ENOTSUPP; 355 |
360 mutex_lock(&pctl->lock); | |
361 ret = regmap_write_bits(pctl->regmap, 362 pctl->data->pri.x789.reg_drain, 363 BIT(offset), BIT(offset)); | 356 ret = regmap_write_bits(pctl->regmap, 357 pctl->data->pri.x789.reg_drain, 358 BIT(offset), BIT(offset)); |
364 mutex_unlock(&pctl->lock); 365 if (ret < 0) 366 return ret; | |
367 break; | 359 break; |
368 | |
369 default: | 360 default: |
370 return -ENOTSUPP; | 361 ret = -ENOTSUPP; 362 break; |
371 } 372 | 363 } 364 |
373 return 0; | 365 return ret; |
374} 375 376static int __sx150x_gpio_set(struct sx150x_pinctrl *pctl, unsigned int offset, 377 int value) 378{ 379 return regmap_write_bits(pctl->regmap, pctl->data->reg_data, 380 BIT(offset), value ? BIT(offset) : 0); 381} 382 383static void sx150x_gpio_set(struct gpio_chip *chip, unsigned int offset, 384 int value) 385{ 386 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); 387 | 366} 367 368static int __sx150x_gpio_set(struct sx150x_pinctrl *pctl, unsigned int offset, 369 int value) 370{ 371 return regmap_write_bits(pctl->regmap, pctl->data->reg_data, 372 BIT(offset), value ? BIT(offset) : 0); 373} 374 375static void sx150x_gpio_set(struct gpio_chip *chip, unsigned int offset, 376 int value) 377{ 378 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); 379 |
388 if (sx150x_pin_is_oscio(pctl, offset)) { 389 mutex_lock(&pctl->lock); | 380 if (sx150x_pin_is_oscio(pctl, offset)) |
390 regmap_write(pctl->regmap, 391 pctl->data->pri.x789.reg_clock, 392 (value ? 0x1f : 0x10)); | 381 regmap_write(pctl->regmap, 382 pctl->data->pri.x789.reg_clock, 383 (value ? 0x1f : 0x10)); |
393 mutex_unlock(&pctl->lock); 394 } else { 395 mutex_lock(&pctl->lock); | 384 else |
396 __sx150x_gpio_set(pctl, offset, value); | 385 __sx150x_gpio_set(pctl, offset, value); |
397 mutex_unlock(&pctl->lock); 398 } | 386 |
399} 400 401static int sx150x_gpio_direction_input(struct gpio_chip *chip, 402 unsigned int offset) 403{ 404 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); | 387} 388 389static int sx150x_gpio_direction_input(struct gpio_chip *chip, 390 unsigned int offset) 391{ 392 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); |
405 int ret; | |
406 407 if (sx150x_pin_is_oscio(pctl, offset)) 408 return -EINVAL; 409 | 393 394 if (sx150x_pin_is_oscio(pctl, offset)) 395 return -EINVAL; 396 |
410 mutex_lock(&pctl->lock); 411 ret = regmap_write_bits(pctl->regmap, 412 pctl->data->reg_dir, 413 BIT(offset), BIT(offset)); 414 mutex_unlock(&pctl->lock); 415 416 return ret; | 397 return regmap_write_bits(pctl->regmap, 398 pctl->data->reg_dir, 399 BIT(offset), BIT(offset)); |
417} 418 419static int sx150x_gpio_direction_output(struct gpio_chip *chip, 420 unsigned int offset, int value) 421{ 422 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); | 400} 401 402static int sx150x_gpio_direction_output(struct gpio_chip *chip, 403 unsigned int offset, int value) 404{ 405 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); |
423 int status; | 406 int ret; |
424 425 if (sx150x_pin_is_oscio(pctl, offset)) { 426 sx150x_gpio_set(chip, offset, value); 427 return 0; 428 } 429 | 407 408 if (sx150x_pin_is_oscio(pctl, offset)) { 409 sx150x_gpio_set(chip, offset, value); 410 return 0; 411 } 412 |
430 mutex_lock(&pctl->lock); 431 status = __sx150x_gpio_set(pctl, offset, value); 432 if (status >= 0) 433 status = regmap_write_bits(pctl->regmap, 434 pctl->data->reg_dir, 435 BIT(offset), 0); 436 mutex_unlock(&pctl->lock); | 413 ret = __sx150x_gpio_set(pctl, offset, value); 414 if (ret < 0) 415 return ret; |
437 | 416 |
438 return status; | 417 return regmap_write_bits(pctl->regmap, 418 pctl->data->reg_dir, 419 BIT(offset), 0); |
439} 440 441static void sx150x_irq_mask(struct irq_data *d) 442{ 443 struct sx150x_pinctrl *pctl = 444 gpiochip_get_data(irq_data_get_irq_chip_data(d)); 445 unsigned int n = d->hwirq; 446 --- 84 unchanged lines hidden (view full) --- 531 int ret; 532 u32 arg; 533 unsigned int data; 534 535 if (sx150x_pin_is_oscio(pctl, pin)) { 536 switch (param) { 537 case PIN_CONFIG_DRIVE_PUSH_PULL: 538 case PIN_CONFIG_OUTPUT: | 420} 421 422static void sx150x_irq_mask(struct irq_data *d) 423{ 424 struct sx150x_pinctrl *pctl = 425 gpiochip_get_data(irq_data_get_irq_chip_data(d)); 426 unsigned int n = d->hwirq; 427 --- 84 unchanged lines hidden (view full) --- 512 int ret; 513 u32 arg; 514 unsigned int data; 515 516 if (sx150x_pin_is_oscio(pctl, pin)) { 517 switch (param) { 518 case PIN_CONFIG_DRIVE_PUSH_PULL: 519 case PIN_CONFIG_OUTPUT: |
539 mutex_lock(&pctl->lock); | |
540 ret = regmap_read(pctl->regmap, 541 pctl->data->pri.x789.reg_clock, 542 &data); | 520 ret = regmap_read(pctl->regmap, 521 pctl->data->pri.x789.reg_clock, 522 &data); |
543 mutex_unlock(&pctl->lock); 544 | |
545 if (ret < 0) 546 return ret; 547 548 if (param == PIN_CONFIG_DRIVE_PUSH_PULL) 549 arg = (data & 0x1f) ? 1 : 0; 550 else { 551 if ((data & 0x1f) == 0x1f) 552 arg = 1; --- 8 unchanged lines hidden (view full) --- 561 return -ENOTSUPP; 562 } 563 564 goto out; 565 } 566 567 switch (param) { 568 case PIN_CONFIG_BIAS_PULL_DOWN: | 523 if (ret < 0) 524 return ret; 525 526 if (param == PIN_CONFIG_DRIVE_PUSH_PULL) 527 arg = (data & 0x1f) ? 1 : 0; 528 else { 529 if ((data & 0x1f) == 0x1f) 530 arg = 1; --- 8 unchanged lines hidden (view full) --- 539 return -ENOTSUPP; 540 } 541 542 goto out; 543 } 544 545 switch (param) { 546 case PIN_CONFIG_BIAS_PULL_DOWN: |
569 mutex_lock(&pctl->lock); | |
570 ret = regmap_read(pctl->regmap, 571 pctl->data->reg_pulldn, 572 &data); 573 data &= BIT(pin); | 547 ret = regmap_read(pctl->regmap, 548 pctl->data->reg_pulldn, 549 &data); 550 data &= BIT(pin); |
574 mutex_unlock(&pctl->lock); | |
575 576 if (ret < 0) 577 return ret; 578 579 if (!ret) 580 return -EINVAL; 581 582 arg = 1; 583 break; 584 585 case PIN_CONFIG_BIAS_PULL_UP: | 551 552 if (ret < 0) 553 return ret; 554 555 if (!ret) 556 return -EINVAL; 557 558 arg = 1; 559 break; 560 561 case PIN_CONFIG_BIAS_PULL_UP: |
586 mutex_lock(&pctl->lock); | |
587 ret = regmap_read(pctl->regmap, 588 pctl->data->reg_pullup, 589 &data); 590 data &= BIT(pin); | 562 ret = regmap_read(pctl->regmap, 563 pctl->data->reg_pullup, 564 &data); 565 data &= BIT(pin); |
591 mutex_unlock(&pctl->lock); | |
592 593 if (ret < 0) 594 return ret; 595 596 if (!ret) 597 return -EINVAL; 598 599 arg = 1; 600 break; 601 602 case PIN_CONFIG_DRIVE_OPEN_DRAIN: 603 if (pctl->data->model != SX150X_789) 604 return -ENOTSUPP; 605 | 566 567 if (ret < 0) 568 return ret; 569 570 if (!ret) 571 return -EINVAL; 572 573 arg = 1; 574 break; 575 576 case PIN_CONFIG_DRIVE_OPEN_DRAIN: 577 if (pctl->data->model != SX150X_789) 578 return -ENOTSUPP; 579 |
606 mutex_lock(&pctl->lock); | |
607 ret = regmap_read(pctl->regmap, 608 pctl->data->pri.x789.reg_drain, 609 &data); 610 data &= BIT(pin); | 580 ret = regmap_read(pctl->regmap, 581 pctl->data->pri.x789.reg_drain, 582 &data); 583 data &= BIT(pin); |
611 mutex_unlock(&pctl->lock); | |
612 613 if (ret < 0) 614 return ret; 615 616 if (!data) 617 return -EINVAL; 618 619 arg = 1; 620 break; 621 622 case PIN_CONFIG_DRIVE_PUSH_PULL: 623 if (pctl->data->model != SX150X_789) 624 arg = true; 625 else { | 584 585 if (ret < 0) 586 return ret; 587 588 if (!data) 589 return -EINVAL; 590 591 arg = 1; 592 break; 593 594 case PIN_CONFIG_DRIVE_PUSH_PULL: 595 if (pctl->data->model != SX150X_789) 596 arg = true; 597 else { |
626 mutex_lock(&pctl->lock); | |
627 ret = regmap_read(pctl->regmap, 628 pctl->data->pri.x789.reg_drain, 629 &data); 630 data &= BIT(pin); | 598 ret = regmap_read(pctl->regmap, 599 pctl->data->pri.x789.reg_drain, 600 &data); 601 data &= BIT(pin); |
631 mutex_unlock(&pctl->lock); | |
632 633 if (ret < 0) 634 return ret; 635 636 if (data) 637 return -EINVAL; 638 639 arg = 1; --- 48 unchanged lines hidden (view full) --- 688 continue; 689 } else 690 return -ENOTSUPP; 691 } 692 693 switch (param) { 694 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 695 case PIN_CONFIG_BIAS_DISABLE: | 602 603 if (ret < 0) 604 return ret; 605 606 if (data) 607 return -EINVAL; 608 609 arg = 1; --- 48 unchanged lines hidden (view full) --- 658 continue; 659 } else 660 return -ENOTSUPP; 661 } 662 663 switch (param) { 664 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 665 case PIN_CONFIG_BIAS_DISABLE: |
696 mutex_lock(&pctl->lock); | |
697 ret = regmap_write_bits(pctl->regmap, 698 pctl->data->reg_pulldn, 699 BIT(pin), 0); | 666 ret = regmap_write_bits(pctl->regmap, 667 pctl->data->reg_pulldn, 668 BIT(pin), 0); |
700 mutex_unlock(&pctl->lock); | |
701 if (ret < 0) 702 return ret; 703 | 669 if (ret < 0) 670 return ret; 671 |
704 mutex_lock(&pctl->lock); | |
705 ret = regmap_write_bits(pctl->regmap, 706 pctl->data->reg_pullup, 707 BIT(pin), 0); | 672 ret = regmap_write_bits(pctl->regmap, 673 pctl->data->reg_pullup, 674 BIT(pin), 0); |
708 mutex_unlock(&pctl->lock); | |
709 if (ret < 0) 710 return ret; 711 712 break; 713 714 case PIN_CONFIG_BIAS_PULL_UP: | 675 if (ret < 0) 676 return ret; 677 678 break; 679 680 case PIN_CONFIG_BIAS_PULL_UP: |
715 mutex_lock(&pctl->lock); | |
716 ret = regmap_write_bits(pctl->regmap, 717 pctl->data->reg_pullup, 718 BIT(pin), BIT(pin)); | 681 ret = regmap_write_bits(pctl->regmap, 682 pctl->data->reg_pullup, 683 BIT(pin), BIT(pin)); |
719 mutex_unlock(&pctl->lock); | |
720 if (ret < 0) 721 return ret; 722 723 break; 724 725 case PIN_CONFIG_BIAS_PULL_DOWN: | 684 if (ret < 0) 685 return ret; 686 687 break; 688 689 case PIN_CONFIG_BIAS_PULL_DOWN: |
726 mutex_lock(&pctl->lock); | |
727 ret = regmap_write_bits(pctl->regmap, 728 pctl->data->reg_pulldn, 729 BIT(pin), BIT(pin)); | 690 ret = regmap_write_bits(pctl->regmap, 691 pctl->data->reg_pulldn, 692 BIT(pin), BIT(pin)); |
730 mutex_unlock(&pctl->lock); | |
731 if (ret < 0) 732 return ret; 733 734 break; 735 736 case PIN_CONFIG_DRIVE_OPEN_DRAIN: 737 ret = sx150x_gpio_set_single_ended(&pctl->gpio, 738 pin, LINE_MODE_OPEN_DRAIN); --- 429 unchanged lines hidden --- | 693 if (ret < 0) 694 return ret; 695 696 break; 697 698 case PIN_CONFIG_DRIVE_OPEN_DRAIN: 699 ret = sx150x_gpio_set_single_ended(&pctl->gpio, 700 pin, LINE_MODE_OPEN_DRAIN); --- 429 unchanged lines hidden --- |