1cd6484e1SRob Herring /* 2cd6484e1SRob Herring * Copyright (C) 2016-2017 Linaro Ltd., Rob Herring <[email protected]> 3cd6484e1SRob Herring * 4cd6484e1SRob Herring * This program is free software; you can redistribute it and/or modify 5cd6484e1SRob Herring * it under the terms of the GNU General Public License version 2 and 6cd6484e1SRob Herring * only version 2 as published by the Free Software Foundation. 7cd6484e1SRob Herring * 8cd6484e1SRob Herring * This program is distributed in the hope that it will be useful, 9cd6484e1SRob Herring * but WITHOUT ANY WARRANTY; without even the implied warranty of 10cd6484e1SRob Herring * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11cd6484e1SRob Herring * GNU General Public License for more details. 12cd6484e1SRob Herring */ 13cd6484e1SRob Herring #ifndef _LINUX_SERDEV_H 14cd6484e1SRob Herring #define _LINUX_SERDEV_H 15cd6484e1SRob Herring 16cd6484e1SRob Herring #include <linux/types.h> 17cd6484e1SRob Herring #include <linux/device.h> 18cd6484e1SRob Herring 19cd6484e1SRob Herring struct serdev_controller; 20cd6484e1SRob Herring struct serdev_device; 21cd6484e1SRob Herring 22cd6484e1SRob Herring /* 23cd6484e1SRob Herring * serdev device structures 24cd6484e1SRob Herring */ 25cd6484e1SRob Herring 26cd6484e1SRob Herring /** 27cd6484e1SRob Herring * struct serdev_device_ops - Callback operations for a serdev device 28cd6484e1SRob Herring * @receive_buf: Function called with data received from device. 29cd6484e1SRob Herring * @write_wakeup: Function called when ready to transmit more data. 30cd6484e1SRob Herring */ 31cd6484e1SRob Herring struct serdev_device_ops { 32cd6484e1SRob Herring int (*receive_buf)(struct serdev_device *, const unsigned char *, size_t); 33cd6484e1SRob Herring void (*write_wakeup)(struct serdev_device *); 34cd6484e1SRob Herring }; 35cd6484e1SRob Herring 36cd6484e1SRob Herring /** 37cd6484e1SRob Herring * struct serdev_device - Basic representation of an serdev device 38cd6484e1SRob Herring * @dev: Driver model representation of the device. 39cd6484e1SRob Herring * @nr: Device number on serdev bus. 40cd6484e1SRob Herring * @ctrl: serdev controller managing this device. 41cd6484e1SRob Herring * @ops: Device operations. 42cd6484e1SRob Herring */ 43cd6484e1SRob Herring struct serdev_device { 44cd6484e1SRob Herring struct device dev; 45cd6484e1SRob Herring int nr; 46cd6484e1SRob Herring struct serdev_controller *ctrl; 47cd6484e1SRob Herring const struct serdev_device_ops *ops; 48cd6484e1SRob Herring }; 49cd6484e1SRob Herring 50cd6484e1SRob Herring static inline struct serdev_device *to_serdev_device(struct device *d) 51cd6484e1SRob Herring { 52cd6484e1SRob Herring return container_of(d, struct serdev_device, dev); 53cd6484e1SRob Herring } 54cd6484e1SRob Herring 55cd6484e1SRob Herring /** 56cd6484e1SRob Herring * struct serdev_device_driver - serdev slave device driver 57cd6484e1SRob Herring * @driver: serdev device drivers should initialize name field of this 58cd6484e1SRob Herring * structure. 59cd6484e1SRob Herring * @probe: binds this driver to a serdev device. 60cd6484e1SRob Herring * @remove: unbinds this driver from the serdev device. 61cd6484e1SRob Herring */ 62cd6484e1SRob Herring struct serdev_device_driver { 63cd6484e1SRob Herring struct device_driver driver; 64cd6484e1SRob Herring int (*probe)(struct serdev_device *); 65cd6484e1SRob Herring void (*remove)(struct serdev_device *); 66cd6484e1SRob Herring }; 67cd6484e1SRob Herring 68cd6484e1SRob Herring static inline struct serdev_device_driver *to_serdev_device_driver(struct device_driver *d) 69cd6484e1SRob Herring { 70cd6484e1SRob Herring return container_of(d, struct serdev_device_driver, driver); 71cd6484e1SRob Herring } 72cd6484e1SRob Herring 73cd6484e1SRob Herring /* 74cd6484e1SRob Herring * serdev controller structures 75cd6484e1SRob Herring */ 76cd6484e1SRob Herring struct serdev_controller_ops { 77cd6484e1SRob Herring int (*write_buf)(struct serdev_controller *, const unsigned char *, size_t); 78cd6484e1SRob Herring void (*write_flush)(struct serdev_controller *); 79cd6484e1SRob Herring int (*write_room)(struct serdev_controller *); 80cd6484e1SRob Herring int (*open)(struct serdev_controller *); 81cd6484e1SRob Herring void (*close)(struct serdev_controller *); 82cd6484e1SRob Herring void (*set_flow_control)(struct serdev_controller *, bool); 83cd6484e1SRob Herring unsigned int (*set_baudrate)(struct serdev_controller *, unsigned int); 84*b3f80c8fSSebastian Reichel void (*wait_until_sent)(struct serdev_controller *, long); 85cd6484e1SRob Herring }; 86cd6484e1SRob Herring 87cd6484e1SRob Herring /** 88cd6484e1SRob Herring * struct serdev_controller - interface to the serdev controller 89cd6484e1SRob Herring * @dev: Driver model representation of the device. 90cd6484e1SRob Herring * @nr: number identifier for this controller/bus. 91cd6484e1SRob Herring * @serdev: Pointer to slave device for this controller. 92cd6484e1SRob Herring * @ops: Controller operations. 93cd6484e1SRob Herring */ 94cd6484e1SRob Herring struct serdev_controller { 95cd6484e1SRob Herring struct device dev; 96cd6484e1SRob Herring unsigned int nr; 97cd6484e1SRob Herring struct serdev_device *serdev; 98cd6484e1SRob Herring const struct serdev_controller_ops *ops; 99cd6484e1SRob Herring }; 100cd6484e1SRob Herring 101cd6484e1SRob Herring static inline struct serdev_controller *to_serdev_controller(struct device *d) 102cd6484e1SRob Herring { 103cd6484e1SRob Herring return container_of(d, struct serdev_controller, dev); 104cd6484e1SRob Herring } 105cd6484e1SRob Herring 106cd6484e1SRob Herring static inline void *serdev_device_get_drvdata(const struct serdev_device *serdev) 107cd6484e1SRob Herring { 108cd6484e1SRob Herring return dev_get_drvdata(&serdev->dev); 109cd6484e1SRob Herring } 110cd6484e1SRob Herring 111cd6484e1SRob Herring static inline void serdev_device_set_drvdata(struct serdev_device *serdev, void *data) 112cd6484e1SRob Herring { 113cd6484e1SRob Herring dev_set_drvdata(&serdev->dev, data); 114cd6484e1SRob Herring } 115cd6484e1SRob Herring 116cd6484e1SRob Herring /** 117cd6484e1SRob Herring * serdev_device_put() - decrement serdev device refcount 118cd6484e1SRob Herring * @serdev serdev device. 119cd6484e1SRob Herring */ 120cd6484e1SRob Herring static inline void serdev_device_put(struct serdev_device *serdev) 121cd6484e1SRob Herring { 122cd6484e1SRob Herring if (serdev) 123cd6484e1SRob Herring put_device(&serdev->dev); 124cd6484e1SRob Herring } 125cd6484e1SRob Herring 126cd6484e1SRob Herring static inline void serdev_device_set_client_ops(struct serdev_device *serdev, 127cd6484e1SRob Herring const struct serdev_device_ops *ops) 128cd6484e1SRob Herring { 129cd6484e1SRob Herring serdev->ops = ops; 130cd6484e1SRob Herring } 131cd6484e1SRob Herring 132cd6484e1SRob Herring static inline 133cd6484e1SRob Herring void *serdev_controller_get_drvdata(const struct serdev_controller *ctrl) 134cd6484e1SRob Herring { 135cd6484e1SRob Herring return ctrl ? dev_get_drvdata(&ctrl->dev) : NULL; 136cd6484e1SRob Herring } 137cd6484e1SRob Herring 138cd6484e1SRob Herring static inline void serdev_controller_set_drvdata(struct serdev_controller *ctrl, 139cd6484e1SRob Herring void *data) 140cd6484e1SRob Herring { 141cd6484e1SRob Herring dev_set_drvdata(&ctrl->dev, data); 142cd6484e1SRob Herring } 143cd6484e1SRob Herring 144cd6484e1SRob Herring /** 145cd6484e1SRob Herring * serdev_controller_put() - decrement controller refcount 146cd6484e1SRob Herring * @ctrl serdev controller. 147cd6484e1SRob Herring */ 148cd6484e1SRob Herring static inline void serdev_controller_put(struct serdev_controller *ctrl) 149cd6484e1SRob Herring { 150cd6484e1SRob Herring if (ctrl) 151cd6484e1SRob Herring put_device(&ctrl->dev); 152cd6484e1SRob Herring } 153cd6484e1SRob Herring 154cd6484e1SRob Herring struct serdev_device *serdev_device_alloc(struct serdev_controller *); 155cd6484e1SRob Herring int serdev_device_add(struct serdev_device *); 156cd6484e1SRob Herring void serdev_device_remove(struct serdev_device *); 157cd6484e1SRob Herring 158cd6484e1SRob Herring struct serdev_controller *serdev_controller_alloc(struct device *, size_t); 159cd6484e1SRob Herring int serdev_controller_add(struct serdev_controller *); 160cd6484e1SRob Herring void serdev_controller_remove(struct serdev_controller *); 161cd6484e1SRob Herring 162cd6484e1SRob Herring static inline void serdev_controller_write_wakeup(struct serdev_controller *ctrl) 163cd6484e1SRob Herring { 164cd6484e1SRob Herring struct serdev_device *serdev = ctrl->serdev; 165cd6484e1SRob Herring 166cd6484e1SRob Herring if (!serdev || !serdev->ops->write_wakeup) 167cd6484e1SRob Herring return; 168cd6484e1SRob Herring 169cd6484e1SRob Herring serdev->ops->write_wakeup(ctrl->serdev); 170cd6484e1SRob Herring } 171cd6484e1SRob Herring 172cd6484e1SRob Herring static inline int serdev_controller_receive_buf(struct serdev_controller *ctrl, 173cd6484e1SRob Herring const unsigned char *data, 174cd6484e1SRob Herring size_t count) 175cd6484e1SRob Herring { 176cd6484e1SRob Herring struct serdev_device *serdev = ctrl->serdev; 177cd6484e1SRob Herring 178cd6484e1SRob Herring if (!serdev || !serdev->ops->receive_buf) 179cd6484e1SRob Herring return -EINVAL; 180cd6484e1SRob Herring 181cd6484e1SRob Herring return serdev->ops->receive_buf(ctrl->serdev, data, count); 182cd6484e1SRob Herring } 183cd6484e1SRob Herring 184cd6484e1SRob Herring #if IS_ENABLED(CONFIG_SERIAL_DEV_BUS) 185cd6484e1SRob Herring 186cd6484e1SRob Herring int serdev_device_open(struct serdev_device *); 187cd6484e1SRob Herring void serdev_device_close(struct serdev_device *); 188cd6484e1SRob Herring unsigned int serdev_device_set_baudrate(struct serdev_device *, unsigned int); 189cd6484e1SRob Herring void serdev_device_set_flow_control(struct serdev_device *, bool); 190*b3f80c8fSSebastian Reichel void serdev_device_wait_until_sent(struct serdev_device *, long); 191cd6484e1SRob Herring int serdev_device_write_buf(struct serdev_device *, const unsigned char *, size_t); 192cd6484e1SRob Herring void serdev_device_write_flush(struct serdev_device *); 193cd6484e1SRob Herring int serdev_device_write_room(struct serdev_device *); 194cd6484e1SRob Herring 195cd6484e1SRob Herring /* 196cd6484e1SRob Herring * serdev device driver functions 197cd6484e1SRob Herring */ 198cd6484e1SRob Herring int __serdev_device_driver_register(struct serdev_device_driver *, struct module *); 199cd6484e1SRob Herring #define serdev_device_driver_register(sdrv) \ 200cd6484e1SRob Herring __serdev_device_driver_register(sdrv, THIS_MODULE) 201cd6484e1SRob Herring 202cd6484e1SRob Herring /** 203cd6484e1SRob Herring * serdev_device_driver_unregister() - unregister an serdev client driver 204cd6484e1SRob Herring * @sdrv: the driver to unregister 205cd6484e1SRob Herring */ 206cd6484e1SRob Herring static inline void serdev_device_driver_unregister(struct serdev_device_driver *sdrv) 207cd6484e1SRob Herring { 208cd6484e1SRob Herring if (sdrv) 209cd6484e1SRob Herring driver_unregister(&sdrv->driver); 210cd6484e1SRob Herring } 211cd6484e1SRob Herring 212cd6484e1SRob Herring #define module_serdev_device_driver(__serdev_device_driver) \ 213cd6484e1SRob Herring module_driver(__serdev_device_driver, serdev_device_driver_register, \ 214cd6484e1SRob Herring serdev_device_driver_unregister) 215cd6484e1SRob Herring 216cd6484e1SRob Herring #else 217cd6484e1SRob Herring 218cd6484e1SRob Herring static inline int serdev_device_open(struct serdev_device *sdev) 219cd6484e1SRob Herring { 220cd6484e1SRob Herring return -ENODEV; 221cd6484e1SRob Herring } 222cd6484e1SRob Herring static inline void serdev_device_close(struct serdev_device *sdev) {} 223cd6484e1SRob Herring static inline unsigned int serdev_device_set_baudrate(struct serdev_device *sdev, unsigned int baudrate) 224cd6484e1SRob Herring { 225cd6484e1SRob Herring return 0; 226cd6484e1SRob Herring } 227cd6484e1SRob Herring static inline void serdev_device_set_flow_control(struct serdev_device *sdev, bool enable) {} 228*b3f80c8fSSebastian Reichel static inline void serdev_device_wait_until_sent(struct serdev_device *sdev, long timeout) {} 229cd6484e1SRob Herring static inline int serdev_device_write_buf(struct serdev_device *sdev, const unsigned char *buf, size_t count) 230cd6484e1SRob Herring { 231cd6484e1SRob Herring return -ENODEV; 232cd6484e1SRob Herring } 233cd6484e1SRob Herring static inline void serdev_device_write_flush(struct serdev_device *sdev) {} 234cd6484e1SRob Herring static inline int serdev_device_write_room(struct serdev_device *sdev) 235cd6484e1SRob Herring { 236cd6484e1SRob Herring return 0; 237cd6484e1SRob Herring } 238cd6484e1SRob Herring 239cd6484e1SRob Herring #define serdev_device_driver_register(x) 240cd6484e1SRob Herring #define serdev_device_driver_unregister(x) 241cd6484e1SRob Herring 242cd6484e1SRob Herring #endif /* CONFIG_SERIAL_DEV_BUS */ 243cd6484e1SRob Herring 244bed35c6dSRob Herring /* 245bed35c6dSRob Herring * serdev hooks into TTY core 246bed35c6dSRob Herring */ 247bed35c6dSRob Herring struct tty_port; 248bed35c6dSRob Herring struct tty_driver; 249bed35c6dSRob Herring 250bed35c6dSRob Herring #ifdef CONFIG_SERIAL_DEV_CTRL_TTYPORT 251bed35c6dSRob Herring struct device *serdev_tty_port_register(struct tty_port *port, 252bed35c6dSRob Herring struct device *parent, 253bed35c6dSRob Herring struct tty_driver *drv, int idx); 254bed35c6dSRob Herring void serdev_tty_port_unregister(struct tty_port *port); 255bed35c6dSRob Herring #else 256bed35c6dSRob Herring static inline struct device *serdev_tty_port_register(struct tty_port *port, 257bed35c6dSRob Herring struct device *parent, 258bed35c6dSRob Herring struct tty_driver *drv, int idx) 259bed35c6dSRob Herring { 260bed35c6dSRob Herring return ERR_PTR(-ENODEV); 261bed35c6dSRob Herring } 262bed35c6dSRob Herring static inline void serdev_tty_port_unregister(struct tty_port *port) {} 263bed35c6dSRob Herring #endif /* CONFIG_SERIAL_DEV_CTRL_TTYPORT */ 264bed35c6dSRob Herring 265cd6484e1SRob Herring #endif /*_LINUX_SERDEV_H */ 266