alistair23-linux/drivers/staging/fieldbus/anybuss/anybuss-client.h
Sven Van Asbroeck 9cc05ed4df staging: fieldbus: move "offline mode" definition to fieldbus core
anybus-s cards use the "offline mode" property to determine if
process memory should be clear, set, or frozen when the card
is offline.

Move this property to the fieldbus core, so that it can become
part of the future fieldbus config interface.

Signed-off-by: Sven Van Asbroeck <TheSven73@gmail.com>
Link: https://lore.kernel.org/r/20190918183552.28959-3-TheSven73@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-09-30 21:58:03 +02:00

100 lines
2.6 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Anybus-S client adapter definitions
*
* Copyright 2018 Arcx Inc
*/
#ifndef __LINUX_ANYBUSS_CLIENT_H__
#define __LINUX_ANYBUSS_CLIENT_H__
#include <linux/device.h>
#include <linux/types.h>
#include <linux/poll.h>
/* move to <linux/fieldbus_dev.h> when taking this out of staging */
#include "../fieldbus_dev.h"
struct anybuss_host;
struct anybuss_client {
struct device dev;
struct anybuss_host *host;
__be16 anybus_id;
/*
* these can be optionally set by the client to receive event
* notifications from the host.
*/
void (*on_area_updated)(struct anybuss_client *client);
void (*on_online_changed)(struct anybuss_client *client, bool online);
};
struct anybuss_client_driver {
struct device_driver driver;
int (*probe)(struct anybuss_client *adev);
int (*remove)(struct anybuss_client *adev);
u16 anybus_id;
};
int anybuss_client_driver_register(struct anybuss_client_driver *drv);
void anybuss_client_driver_unregister(struct anybuss_client_driver *drv);
static inline struct anybuss_client *to_anybuss_client(struct device *dev)
{
return container_of(dev, struct anybuss_client, dev);
}
static inline struct anybuss_client_driver *
to_anybuss_client_driver(struct device_driver *drv)
{
return container_of(drv, struct anybuss_client_driver, driver);
}
static inline void *
anybuss_get_drvdata(const struct anybuss_client *client)
{
return dev_get_drvdata(&client->dev);
}
static inline void
anybuss_set_drvdata(struct anybuss_client *client, void *data)
{
dev_set_drvdata(&client->dev, data);
}
int anybuss_set_power(struct anybuss_client *client, bool power_on);
struct anybuss_memcfg {
u16 input_io;
u16 input_dpram;
u16 input_total;
u16 output_io;
u16 output_dpram;
u16 output_total;
enum fieldbus_dev_offl_mode offl_mode;
};
int anybuss_start_init(struct anybuss_client *client,
const struct anybuss_memcfg *cfg);
int anybuss_finish_init(struct anybuss_client *client);
int anybuss_read_fbctrl(struct anybuss_client *client, u16 addr,
void *buf, size_t count);
int anybuss_send_msg(struct anybuss_client *client, u16 cmd_num,
const void *buf, size_t count);
int anybuss_send_ext(struct anybuss_client *client, u16 cmd_num,
const void *buf, size_t count);
int anybuss_recv_msg(struct anybuss_client *client, u16 cmd_num,
void *buf, size_t count);
/* these help clients make a struct file_operations */
int anybuss_write_input(struct anybuss_client *client,
const char __user *buf, size_t size,
loff_t *offset);
int anybuss_read_output(struct anybuss_client *client,
char __user *buf, size_t size,
loff_t *offset);
#endif /* __LINUX_ANYBUSS_CLIENT_H__ */