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