Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /* FSI device & driver interfaces
0003  *
0004  * Copyright (C) IBM Corporation 2016
0005  */
0006 
0007 #ifndef LINUX_FSI_H
0008 #define LINUX_FSI_H
0009 
0010 #include <linux/device.h>
0011 
0012 struct fsi_device {
0013     struct device       dev;
0014     u8          engine_type;
0015     u8          version;
0016     u8          unit;
0017     struct fsi_slave    *slave;
0018     uint32_t        addr;
0019     uint32_t        size;
0020 };
0021 
0022 extern int fsi_device_read(struct fsi_device *dev, uint32_t addr,
0023         void *val, size_t size);
0024 extern int fsi_device_write(struct fsi_device *dev, uint32_t addr,
0025         const void *val, size_t size);
0026 extern int fsi_device_peek(struct fsi_device *dev, void *val);
0027 
0028 struct fsi_device_id {
0029     u8  engine_type;
0030     u8  version;
0031 };
0032 
0033 #define FSI_VERSION_ANY     0
0034 
0035 #define FSI_DEVICE(t) \
0036     .engine_type = (t), .version = FSI_VERSION_ANY,
0037 
0038 #define FSI_DEVICE_VERSIONED(t, v) \
0039     .engine_type = (t), .version = (v),
0040 
0041 struct fsi_driver {
0042     struct device_driver        drv;
0043     const struct fsi_device_id  *id_table;
0044 };
0045 
0046 #define to_fsi_dev(devp) container_of(devp, struct fsi_device, dev)
0047 #define to_fsi_drv(drvp) container_of(drvp, struct fsi_driver, drv)
0048 
0049 extern int fsi_driver_register(struct fsi_driver *fsi_drv);
0050 extern void fsi_driver_unregister(struct fsi_driver *fsi_drv);
0051 
0052 /* module_fsi_driver() - Helper macro for drivers that don't do
0053  * anything special in module init/exit.  This eliminates a lot of
0054  * boilerplate.  Each module may only use this macro once, and
0055  * calling it replaces module_init() and module_exit()
0056  */
0057 #define module_fsi_driver(__fsi_driver) \
0058         module_driver(__fsi_driver, fsi_driver_register, \
0059                 fsi_driver_unregister)
0060 
0061 /* direct slave API */
0062 extern int fsi_slave_claim_range(struct fsi_slave *slave,
0063         uint32_t addr, uint32_t size);
0064 extern void fsi_slave_release_range(struct fsi_slave *slave,
0065         uint32_t addr, uint32_t size);
0066 extern int fsi_slave_read(struct fsi_slave *slave, uint32_t addr,
0067         void *val, size_t size);
0068 extern int fsi_slave_write(struct fsi_slave *slave, uint32_t addr,
0069         const void *val, size_t size);
0070 
0071 extern struct bus_type fsi_bus_type;
0072 extern const struct device_type fsi_cdev_type;
0073 
0074 enum fsi_dev_type {
0075     fsi_dev_cfam,
0076     fsi_dev_sbefifo,
0077     fsi_dev_scom,
0078     fsi_dev_occ
0079 };
0080 
0081 extern int fsi_get_new_minor(struct fsi_device *fdev, enum fsi_dev_type type,
0082                  dev_t *out_dev, int *out_index);
0083 extern void fsi_free_minor(dev_t dev);
0084 
0085 #endif /* LINUX_FSI_H */