gpio-ds4520.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2023 Analog Devices, Inc.
  4. * Driver for the DS4520 I/O Expander
  5. */
  6. #include <linux/device.h>
  7. #include <linux/gpio/driver.h>
  8. #include <linux/gpio/regmap.h>
  9. #include <linux/i2c.h>
  10. #include <linux/property.h>
  11. #include <linux/regmap.h>
  12. #define DS4520_PULLUP0 0xF0
  13. #define DS4520_IO_CONTROL0 0xF2
  14. #define DS4520_IO_STATUS0 0xF8
  15. static const struct regmap_config ds4520_regmap_config = {
  16. .reg_bits = 8,
  17. .val_bits = 8,
  18. };
  19. static int ds4520_gpio_probe(struct i2c_client *client)
  20. {
  21. struct gpio_regmap_config config = { };
  22. struct device *dev = &client->dev;
  23. struct regmap *regmap;
  24. u32 ngpio;
  25. u32 base;
  26. int ret;
  27. ret = device_property_read_u32(dev, "reg", &base);
  28. if (ret)
  29. return dev_err_probe(dev, ret, "Missing 'reg' property.\n");
  30. ret = device_property_read_u32(dev, "ngpios", &ngpio);
  31. if (ret)
  32. return dev_err_probe(dev, ret, "Missing 'ngpios' property.\n");
  33. regmap = devm_regmap_init_i2c(client, &ds4520_regmap_config);
  34. if (IS_ERR(regmap))
  35. return dev_err_probe(dev, PTR_ERR(regmap),
  36. "Failed to allocate register map\n");
  37. config.regmap = regmap;
  38. config.parent = dev;
  39. config.ngpio = ngpio;
  40. config.reg_dat_base = base + DS4520_IO_STATUS0;
  41. config.reg_set_base = base + DS4520_PULLUP0;
  42. config.reg_dir_out_base = base + DS4520_IO_CONTROL0;
  43. return PTR_ERR_OR_ZERO(devm_gpio_regmap_register(dev, &config));
  44. }
  45. static const struct of_device_id ds4520_gpio_of_match_table[] = {
  46. { .compatible = "adi,ds4520-gpio" },
  47. { }
  48. };
  49. MODULE_DEVICE_TABLE(of, ds4520_gpio_of_match_table);
  50. static const struct i2c_device_id ds4520_gpio_id_table[] = {
  51. { "ds4520-gpio" },
  52. { }
  53. };
  54. MODULE_DEVICE_TABLE(i2c, ds4520_gpio_id_table);
  55. static struct i2c_driver ds4520_gpio_driver = {
  56. .driver = {
  57. .name = "ds4520-gpio",
  58. .of_match_table = ds4520_gpio_of_match_table,
  59. },
  60. .probe = ds4520_gpio_probe,
  61. .id_table = ds4520_gpio_id_table,
  62. };
  63. module_i2c_driver(ds4520_gpio_driver);
  64. MODULE_DESCRIPTION("DS4520 I/O Expander");
  65. MODULE_AUTHOR("Okan Sahin <okan.sahin@analog.com>");
  66. MODULE_LICENSE("GPL");