1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Anybus-S client adapter definitions 4 * 5 * Copyright 2018 Arcx Inc 6 */ 7 8 #ifndef __LINUX_ANYBUSS_CLIENT_H__ 9 #define __LINUX_ANYBUSS_CLIENT_H__ 10 11 #include <linux/device.h> 12 #include <linux/types.h> 13 #include <linux/poll.h> 14 15 struct anybuss_host; 16 17 struct anybuss_client { 18 struct device dev; 19 struct anybuss_host *host; 20 __be16 anybus_id; 21 /* 22 * these can be optionally set by the client to receive event 23 * notifications from the host. 24 */ 25 void (*on_area_updated)(struct anybuss_client *client); 26 void (*on_online_changed)(struct anybuss_client *client, bool online); 27 }; 28 29 struct anybuss_client_driver { 30 struct device_driver driver; 31 int (*probe)(struct anybuss_client *adev); 32 int (*remove)(struct anybuss_client *adev); 33 u16 anybus_id; 34 }; 35 36 int anybuss_client_driver_register(struct anybuss_client_driver *drv); 37 void anybuss_client_driver_unregister(struct anybuss_client_driver *drv); 38 39 static inline struct anybuss_client *to_anybuss_client(struct device *dev) 40 { 41 return container_of(dev, struct anybuss_client, dev); 42 } 43 44 static inline struct anybuss_client_driver * 45 to_anybuss_client_driver(struct device_driver *drv) 46 { 47 return container_of(drv, struct anybuss_client_driver, driver); 48 } 49 50 static inline void * 51 anybuss_get_drvdata(const struct anybuss_client *client) 52 { 53 return dev_get_drvdata(&client->dev); 54 } 55 56 static inline void 57 anybuss_set_drvdata(struct anybuss_client *client, void *data) 58 { 59 dev_set_drvdata(&client->dev, data); 60 } 61 62 int anybuss_set_power(struct anybuss_client *client, bool power_on); 63 64 enum anybuss_offl_mode { 65 AB_OFFL_MODE_CLEAR = 0, 66 AB_OFFL_MODE_FREEZE, 67 AB_OFFL_MODE_SET 68 }; 69 70 struct anybuss_memcfg { 71 u16 input_io; 72 u16 input_dpram; 73 u16 input_total; 74 75 u16 output_io; 76 u16 output_dpram; 77 u16 output_total; 78 79 enum anybuss_offl_mode offl_mode; 80 }; 81 82 int anybuss_start_init(struct anybuss_client *client, 83 const struct anybuss_memcfg *cfg); 84 int anybuss_finish_init(struct anybuss_client *client); 85 int anybuss_read_fbctrl(struct anybuss_client *client, u16 addr, 86 void *buf, size_t count); 87 int anybuss_send_msg(struct anybuss_client *client, u16 cmd_num, 88 const void *buf, size_t count); 89 int anybuss_send_ext(struct anybuss_client *client, u16 cmd_num, 90 const void *buf, size_t count); 91 int anybuss_recv_msg(struct anybuss_client *client, u16 cmd_num, 92 void *buf, size_t count); 93 94 /* these help clients make a struct file_operations */ 95 int anybuss_write_input(struct anybuss_client *client, 96 const char __user *buf, size_t size, 97 loff_t *offset); 98 int anybuss_read_output(struct anybuss_client *client, 99 char __user *buf, size_t size, 100 loff_t *offset); 101 102 #endif /* __LINUX_ANYBUSS_CLIENT_H__ */ 103