linux/drivers/staging/fieldbus/fieldbus_dev.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Fieldbus Device Driver Core
   4 *
   5 */
   6
   7#ifndef __FIELDBUS_DEV_H
   8#define __FIELDBUS_DEV_H
   9
  10#include <linux/cdev.h>
  11#include <linux/wait.h>
  12
  13enum fieldbus_dev_type {
  14        FIELDBUS_DEV_TYPE_UNKNOWN = 0,
  15        FIELDBUS_DEV_TYPE_PROFINET,
  16};
  17
  18/**
  19 * struct fieldbus_dev - Fieldbus device
  20 * @read_area:          [DRIVER] function to read the process data area of the
  21 *                               device. same parameters/return values as
  22 *                               the read function in struct file_operations
  23 * @write_area:         [DRIVER] function to write to the process data area of
  24 *                               the device. same parameters/return values as
  25 *                               the write function in struct file_operations
  26 * @write_area_sz       [DRIVER] size of the writable process data area
  27 * @read_area_sz        [DRIVER] size of the readable process data area
  28 * @card_name           [DRIVER] name of the card, e.g. "ACME Inc. profinet"
  29 * @fieldbus_type       [DRIVER] fieldbus type of this device, e.g.
  30 *                                      FIELDBUS_DEV_TYPE_PROFINET
  31 * @enable_get          [DRIVER] function which returns true if the card
  32 *                               is enabled, false otherwise
  33 * @fieldbus_id_get     [DRIVER] function to retrieve the unique fieldbus id
  34 *                               by which this device can be identified;
  35 *                               return value follows the snprintf convention
  36 * @simple_enable_set   [DRIVER] (optional) function to enable the device
  37 *                               according to its default settings
  38 * @parent              [DRIVER] (optional) the device's parent device
  39 */
  40struct fieldbus_dev {
  41        ssize_t (*read_area)(struct fieldbus_dev *fbdev, char __user *buf,
  42                             size_t size, loff_t *offset);
  43        ssize_t (*write_area)(struct fieldbus_dev *fbdev,
  44                              const char __user *buf, size_t size,
  45                              loff_t *offset);
  46        size_t write_area_sz, read_area_sz;
  47        const char *card_name;
  48        enum fieldbus_dev_type fieldbus_type;
  49        bool (*enable_get)(struct fieldbus_dev *fbdev);
  50        int (*fieldbus_id_get)(struct fieldbus_dev *fbdev, char *buf,
  51                               size_t max_size);
  52        int (*simple_enable_set)(struct fieldbus_dev *fbdev, bool enable);
  53        struct device *parent;
  54
  55        /* private data */
  56        int id;
  57        struct cdev cdev;
  58        struct device *dev;
  59        int dc_event;
  60        wait_queue_head_t dc_wq;
  61        bool online;
  62};
  63
  64#if IS_ENABLED(CONFIG_FIELDBUS_DEV)
  65
  66/**
  67 * fieldbus_dev_unregister()
  68 *      - unregister a previously registered fieldbus device
  69 * @fb:         Device structure previously registered
  70 **/
  71void fieldbus_dev_unregister(struct fieldbus_dev *fb);
  72
  73/**
  74 * fieldbus_dev_register()
  75 *      - register a device with the fieldbus device subsystem
  76 * @fb:         Device structure filled by the device driver
  77 **/
  78int __must_check fieldbus_dev_register(struct fieldbus_dev *fb);
  79
  80/**
  81 * fieldbus_dev_area_updated()
  82 *      - notify the subsystem that an external fieldbus controller updated
  83 *                      the process data area
  84 * @fb:         Device structure
  85 **/
  86void fieldbus_dev_area_updated(struct fieldbus_dev *fb);
  87
  88/**
  89 * fieldbus_dev_online_changed()
  90 *      - notify the subsystem that the fieldbus online status changed
  91 * @fb:         Device structure
  92 **/
  93void fieldbus_dev_online_changed(struct fieldbus_dev *fb, bool online);
  94
  95#else /* IS_ENABLED(CONFIG_FIELDBUS_DEV) */
  96
  97static inline void fieldbus_dev_unregister(struct fieldbus_dev *fb) {}
  98static inline int __must_check fieldbus_dev_register(struct fieldbus_dev *fb)
  99{
 100        return -ENOTSUPP;
 101}
 102
 103static inline void fieldbus_dev_area_updated(struct fieldbus_dev *fb) {}
 104static inline void fieldbus_dev_online_changed(struct fieldbus_dev *fb,
 105                                               bool online) {}
 106
 107#endif /* IS_ENABLED(CONFIG_FIELDBUS_DEV) */
 108#endif /* __FIELDBUS_DEV_H */
 109