linux/include/linux/fsi.h
<<
>>
Prefs
   1/* FSI device & driver interfaces
   2 *
   3 * Copyright (C) IBM Corporation 2016
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License version 2 as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 */
  14
  15#ifndef LINUX_FSI_H
  16#define LINUX_FSI_H
  17
  18#include <linux/device.h>
  19
  20struct fsi_device {
  21        struct device           dev;
  22        u8                      engine_type;
  23        u8                      version;
  24        u8                      unit;
  25        struct fsi_slave        *slave;
  26        uint32_t                addr;
  27        uint32_t                size;
  28};
  29
  30extern int fsi_device_read(struct fsi_device *dev, uint32_t addr,
  31                void *val, size_t size);
  32extern int fsi_device_write(struct fsi_device *dev, uint32_t addr,
  33                const void *val, size_t size);
  34extern int fsi_device_peek(struct fsi_device *dev, void *val);
  35
  36struct fsi_device_id {
  37        u8      engine_type;
  38        u8      version;
  39};
  40
  41#define FSI_VERSION_ANY         0
  42
  43#define FSI_DEVICE(t) \
  44        .engine_type = (t), .version = FSI_VERSION_ANY,
  45
  46#define FSI_DEVICE_VERSIONED(t, v) \
  47        .engine_type = (t), .version = (v),
  48
  49struct fsi_driver {
  50        struct device_driver            drv;
  51        const struct fsi_device_id      *id_table;
  52};
  53
  54#define to_fsi_dev(devp) container_of(devp, struct fsi_device, dev)
  55#define to_fsi_drv(drvp) container_of(drvp, struct fsi_driver, drv)
  56
  57extern int fsi_driver_register(struct fsi_driver *fsi_drv);
  58extern void fsi_driver_unregister(struct fsi_driver *fsi_drv);
  59
  60/* module_fsi_driver() - Helper macro for drivers that don't do
  61 * anything special in module init/exit.  This eliminates a lot of
  62 * boilerplate.  Each module may only use this macro once, and
  63 * calling it replaces module_init() and module_exit()
  64 */
  65#define module_fsi_driver(__fsi_driver) \
  66                module_driver(__fsi_driver, fsi_driver_register, \
  67                                fsi_driver_unregister)
  68
  69/* direct slave API */
  70extern int fsi_slave_claim_range(struct fsi_slave *slave,
  71                uint32_t addr, uint32_t size);
  72extern void fsi_slave_release_range(struct fsi_slave *slave,
  73                uint32_t addr, uint32_t size);
  74extern int fsi_slave_read(struct fsi_slave *slave, uint32_t addr,
  75                void *val, size_t size);
  76extern int fsi_slave_write(struct fsi_slave *slave, uint32_t addr,
  77                const void *val, size_t size);
  78
  79extern struct bus_type fsi_bus_type;
  80extern const struct device_type fsi_cdev_type;
  81
  82enum fsi_dev_type {
  83        fsi_dev_cfam,
  84        fsi_dev_sbefifo,
  85        fsi_dev_scom,
  86        fsi_dev_occ
  87};
  88
  89extern int fsi_get_new_minor(struct fsi_device *fdev, enum fsi_dev_type type,
  90                             dev_t *out_dev, int *out_index);
  91extern void fsi_free_minor(dev_t dev);
  92
  93#endif /* LINUX_FSI_H */
  94