Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2011-2016 Synaptics Incorporated * Copyright (c) 2011 Unixphere */ #ifndef _RMI_BUS_H #define _RMI_BUS_H #include <linux/rmi.h> struct rmi_device; /* * The interrupt source count in the function descriptor can represent up to * 6 interrupt sources in the normal manner. */ #define RMI_FN_MAX_IRQS 6 /** * struct rmi_function - represents the implementation of an RMI4 * function for a particular device (basically, a driver for that RMI4 function) * * @fd: The function descriptor of the RMI function * @rmi_dev: Pointer to the RMI device associated with this function container * @dev: The device associated with this particular function. * * @num_of_irqs: The number of irqs needed by this function * @irq_pos: The position in the irq bitfield this function holds * @irq_mask: For convenience, can be used to mask IRQ bits off during ATTN * interrupt handling. * @irqs: assigned virq numbers (up to num_of_irqs) * * @node: entry in device's list of functions */ struct rmi_function { struct rmi_function_descriptor fd; struct rmi_device *rmi_dev; struct device dev; struct list_head node; unsigned int num_of_irqs; int irq[RMI_FN_MAX_IRQS]; unsigned int irq_pos; unsigned long irq_mask[]; }; #define to_rmi_function(d) container_of(d, struct rmi_function, dev) bool rmi_is_function_device(struct device *dev); int __must_check rmi_register_function(struct rmi_function *); void rmi_unregister_function(struct rmi_function *); /** * struct rmi_function_handler - driver routines for a particular RMI function. * * @func: The RMI function number * @reset: Called when a reset of the touch sensor is detected. The routine * should perform any out-of-the-ordinary reset handling that might be * necessary. Restoring of touch sensor configuration registers should be * handled in the config() callback, below. * @config: Called when the function container is first initialized, and * after a reset is detected. This routine should write any necessary * configuration settings to the device. * @attention: Called when the IRQ(s) for the function are set by the touch * sensor. * @suspend: Should perform any required operations to suspend the particular * function. * @resume: Should perform any required operations to resume the particular * function. * * All callbacks are expected to return 0 on success, error code on failure. */ struct rmi_function_handler { struct device_driver driver; u8 func; int (*probe)(struct rmi_function *fn); void (*remove)(struct rmi_function *fn); int (*config)(struct rmi_function *fn); int (*reset)(struct rmi_function *fn); irqreturn_t (*attention)(int irq, void *ctx); int (*suspend)(struct rmi_function *fn); int (*resume)(struct rmi_function *fn); }; #define to_rmi_function_handler(d) \ container_of(d, struct rmi_function_handler, driver) int __must_check __rmi_register_function_handler(struct rmi_function_handler *, struct module *, const char *); #define rmi_register_function_handler(handler) \ __rmi_register_function_handler(handler, THIS_MODULE, KBUILD_MODNAME) void rmi_unregister_function_handler(struct rmi_function_handler *); #define to_rmi_driver(d) \ container_of(d, struct rmi_driver, driver) #define to_rmi_device(d) container_of(d, struct rmi_device, dev) static inline struct rmi_device_platform_data * rmi_get_platform_data(struct rmi_device *d) { return &d->xport->pdata; } bool rmi_is_physical_device(struct device *dev); /** * rmi_reset - reset a RMI4 device * @d: Pointer to an RMI device * * Calls for a reset of each function implemented by a specific device. * Returns 0 on success or a negative error code. */ static inline int rmi_reset(struct rmi_device *d) { return d->driver->reset_handler(d); } /** * rmi_read - read a single byte * @d: Pointer to an RMI device * @addr: The address to read from * @buf: The read buffer * * Reads a single byte of data using the underlying transport protocol * into memory pointed by @buf. It returns 0 on success or a negative * error code. */ static inline int rmi_read(struct rmi_device *d, u16 addr, u8 *buf) { return d->xport->ops->read_block(d->xport, addr, buf, 1); } /** * rmi_read_block - read a block of bytes * @d: Pointer to an RMI device * @addr: The start address to read from * @buf: The read buffer * @len: Length of the read buffer * * Reads a block of byte data using the underlying transport protocol * into memory pointed by @buf. It returns 0 on success or a negative * error code. */ static inline int rmi_read_block(struct rmi_device *d, u16 addr, void *buf, size_t len) { return d->xport->ops->read_block(d->xport, addr, buf, len); } /** * rmi_write - write a single byte * @d: Pointer to an RMI device * @addr: The address to write to * @data: The data to write * * Writes a single byte using the underlying transport protocol. It * returns zero on success or a negative error code. */ static inline int rmi_write(struct rmi_device *d, u16 addr, u8 data) { return d->xport->ops->write_block(d->xport, addr, &data, 1); } /** * rmi_write_block - write a block of bytes * @d: Pointer to an RMI device * @addr: The start address to write to * @buf: The write buffer * @len: Length of the write buffer * * Writes a block of byte data from buf using the underlaying transport * protocol. It returns the amount of bytes written or a negative error code. */ static inline int rmi_write_block(struct rmi_device *d, u16 addr, const void *buf, size_t len) { return d->xport->ops->write_block(d->xport, addr, buf, len); } int rmi_for_each_dev(void *data, int (*func)(struct device *dev, void *data)); extern struct bus_type rmi_bus_type; int rmi_of_property_read_u32(struct device *dev, u32 *result, const char *prop, bool optional); #define RMI_DEBUG_CORE BIT(0) #define RMI_DEBUG_XPORT BIT(1) #define RMI_DEBUG_FN BIT(2) #define RMI_DEBUG_2D_SENSOR BIT(3) void rmi_dbg(int flags, struct device *dev, const char *fmt, ...); #endif |