fsi.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /* FSI device & driver interfaces
  3. *
  4. * Copyright (C) IBM Corporation 2016
  5. */
  6. #ifndef LINUX_FSI_H
  7. #define LINUX_FSI_H
  8. #include <linux/device.h>
  9. struct fsi_device {
  10. struct device dev;
  11. u8 engine_type;
  12. u8 version;
  13. u8 unit;
  14. struct fsi_slave *slave;
  15. uint32_t addr;
  16. uint32_t size;
  17. };
  18. extern int fsi_device_read(struct fsi_device *dev, uint32_t addr,
  19. void *val, size_t size);
  20. extern int fsi_device_write(struct fsi_device *dev, uint32_t addr,
  21. const void *val, size_t size);
  22. extern int fsi_device_peek(struct fsi_device *dev, void *val);
  23. struct fsi_device_id {
  24. u8 engine_type;
  25. u8 version;
  26. };
  27. #define FSI_VERSION_ANY 0
  28. #define FSI_DEVICE(t) \
  29. .engine_type = (t), .version = FSI_VERSION_ANY,
  30. #define FSI_DEVICE_VERSIONED(t, v) \
  31. .engine_type = (t), .version = (v),
  32. struct fsi_driver {
  33. struct device_driver drv;
  34. const struct fsi_device_id *id_table;
  35. };
  36. #define to_fsi_dev(devp) container_of(devp, struct fsi_device, dev)
  37. #define to_fsi_drv(drvp) container_of(drvp, struct fsi_driver, drv)
  38. extern int fsi_driver_register(struct fsi_driver *fsi_drv);
  39. extern void fsi_driver_unregister(struct fsi_driver *fsi_drv);
  40. /* module_fsi_driver() - Helper macro for drivers that don't do
  41. * anything special in module init/exit. This eliminates a lot of
  42. * boilerplate. Each module may only use this macro once, and
  43. * calling it replaces module_init() and module_exit()
  44. */
  45. #define module_fsi_driver(__fsi_driver) \
  46. module_driver(__fsi_driver, fsi_driver_register, \
  47. fsi_driver_unregister)
  48. /* direct slave API */
  49. extern int fsi_slave_claim_range(struct fsi_slave *slave,
  50. uint32_t addr, uint32_t size);
  51. extern void fsi_slave_release_range(struct fsi_slave *slave,
  52. uint32_t addr, uint32_t size);
  53. extern int fsi_slave_read(struct fsi_slave *slave, uint32_t addr,
  54. void *val, size_t size);
  55. extern int fsi_slave_write(struct fsi_slave *slave, uint32_t addr,
  56. const void *val, size_t size);
  57. extern struct bus_type fsi_bus_type;
  58. extern const struct device_type fsi_cdev_type;
  59. enum fsi_dev_type {
  60. fsi_dev_cfam,
  61. fsi_dev_sbefifo,
  62. fsi_dev_scom,
  63. fsi_dev_occ
  64. };
  65. extern int fsi_get_new_minor(struct fsi_device *fdev, enum fsi_dev_type type,
  66. dev_t *out_dev, int *out_index);
  67. extern void fsi_free_minor(dev_t dev);
  68. #endif /* LINUX_FSI_H */