451-gpio-74x164-improve-platform-device-support.patch 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. --- a/drivers/gpio/gpio-74x164.c
  2. +++ b/drivers/gpio/gpio-74x164.c
  3. @@ -109,10 +109,14 @@ static int gen_74x164_probe(struct spi_d
  4. {
  5. struct gen_74x164_chip *chip;
  6. struct gen_74x164_chip_platform_data *pdata;
  7. + struct device_node *np;
  8. int ret;
  9. - if (!spi->dev.of_node) {
  10. - dev_err(&spi->dev, "No device tree data available.\n");
  11. + pdata = spi->dev.platform_data;
  12. + np = spi->dev.of_node;
  13. +
  14. + if (!np && !pdata) {
  15. + dev_err(&spi->dev, "No configuration data available.\n");
  16. return -EINVAL;
  17. }
  18. @@ -129,7 +133,6 @@ static int gen_74x164_probe(struct spi_d
  19. if (!chip)
  20. return -ENOMEM;
  21. - pdata = spi->dev.platform_data;
  22. if (pdata && pdata->base)
  23. chip->gpio_chip.base = pdata->base;
  24. else
  25. @@ -146,12 +149,19 @@ static int gen_74x164_probe(struct spi_d
  26. chip->gpio_chip.get = gen_74x164_get_value;
  27. chip->gpio_chip.set = gen_74x164_set_value;
  28. - if (of_property_read_u32(spi->dev.of_node, "registers-number", &chip->registers)) {
  29. - dev_err(&spi->dev, "Missing registers-number property in the DT.\n");
  30. - ret = -EINVAL;
  31. - goto exit_destroy;
  32. + if (np) {
  33. + if (of_property_read_u32(spi->dev.of_node, "registers-number", &chip->registers)) {
  34. + dev_err(&spi->dev, "Missing registers-number property in the DT.\n");
  35. + ret = -EINVAL;
  36. + goto exit_destroy;
  37. + }
  38. + } else if (pdata) {
  39. + chip->registers = pdata->num_registers;
  40. }
  41. + if (!chip->registers)
  42. + chip->registers = 1;
  43. +
  44. chip->gpio_chip.ngpio = GEN_74X164_NUMBER_GPIOS * chip->registers;
  45. chip->buffer = devm_kzalloc(&spi->dev, chip->registers, GFP_KERNEL);
  46. if (!chip->buffer) {
  47. @@ -159,6 +169,9 @@ static int gen_74x164_probe(struct spi_d
  48. goto exit_destroy;
  49. }
  50. + if (pdata && pdata->init_data)
  51. + memcpy(chip->buffer, pdata->init_data, chip->registers);
  52. +
  53. chip->gpio_chip.can_sleep = 1;
  54. chip->gpio_chip.dev = &spi->dev;
  55. chip->gpio_chip.owner = THIS_MODULE;
  56. --- a/include/linux/spi/74x164.h
  57. +++ b/include/linux/spi/74x164.h
  58. @@ -4,6 +4,10 @@
  59. struct gen_74x164_chip_platform_data {
  60. /* number assigned to the first GPIO */
  61. unsigned base;
  62. + /* number of chained registers */
  63. + unsigned num_registers;
  64. + /* address of a buffer containing initial data */
  65. + u8 *init_data;
  66. };
  67. #endif