xref: /OK3568_Linux_fs/kernel/drivers/input/rmi4/rmi_bus.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2011-2016 Synaptics Incorporated
4*4882a593Smuzhiyun  * Copyright (c) 2011 Unixphere
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/kernel.h>
8*4882a593Smuzhiyun #include <linux/device.h>
9*4882a593Smuzhiyun #include <linux/irq.h>
10*4882a593Smuzhiyun #include <linux/irqdomain.h>
11*4882a593Smuzhiyun #include <linux/list.h>
12*4882a593Smuzhiyun #include <linux/pm.h>
13*4882a593Smuzhiyun #include <linux/rmi.h>
14*4882a593Smuzhiyun #include <linux/slab.h>
15*4882a593Smuzhiyun #include <linux/types.h>
16*4882a593Smuzhiyun #include <linux/of.h>
17*4882a593Smuzhiyun #include "rmi_bus.h"
18*4882a593Smuzhiyun #include "rmi_driver.h"
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun static int debug_flags;
21*4882a593Smuzhiyun module_param(debug_flags, int, 0644);
22*4882a593Smuzhiyun MODULE_PARM_DESC(debug_flags, "control debugging information");
23*4882a593Smuzhiyun 
rmi_dbg(int flags,struct device * dev,const char * fmt,...)24*4882a593Smuzhiyun void rmi_dbg(int flags, struct device *dev, const char *fmt, ...)
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun 	struct va_format vaf;
27*4882a593Smuzhiyun 	va_list args;
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	if (flags & debug_flags) {
30*4882a593Smuzhiyun 		va_start(args, fmt);
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 		vaf.fmt = fmt;
33*4882a593Smuzhiyun 		vaf.va = &args;
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 		dev_printk(KERN_DEBUG, dev, "%pV", &vaf);
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 		va_end(args);
38*4882a593Smuzhiyun 	}
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rmi_dbg);
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /*
43*4882a593Smuzhiyun  * RMI Physical devices
44*4882a593Smuzhiyun  *
45*4882a593Smuzhiyun  * Physical RMI device consists of several functions serving particular
46*4882a593Smuzhiyun  * purpose. For example F11 is a 2D touch sensor while F01 is a generic
47*4882a593Smuzhiyun  * function present in every RMI device.
48*4882a593Smuzhiyun  */
49*4882a593Smuzhiyun 
rmi_release_device(struct device * dev)50*4882a593Smuzhiyun static void rmi_release_device(struct device *dev)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun 	struct rmi_device *rmi_dev = to_rmi_device(dev);
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	kfree(rmi_dev);
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun static const struct device_type rmi_device_type = {
58*4882a593Smuzhiyun 	.name		= "rmi4_sensor",
59*4882a593Smuzhiyun 	.release	= rmi_release_device,
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun 
rmi_is_physical_device(struct device * dev)62*4882a593Smuzhiyun bool rmi_is_physical_device(struct device *dev)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	return dev->type == &rmi_device_type;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun /**
68*4882a593Smuzhiyun  * rmi_register_transport_device - register a transport device connection
69*4882a593Smuzhiyun  * on the RMI bus.  Transport drivers provide communication from the devices
70*4882a593Smuzhiyun  * on a bus (such as SPI, I2C, and so on) to the RMI4 sensor.
71*4882a593Smuzhiyun  *
72*4882a593Smuzhiyun  * @xport: the transport device to register
73*4882a593Smuzhiyun  */
rmi_register_transport_device(struct rmi_transport_dev * xport)74*4882a593Smuzhiyun int rmi_register_transport_device(struct rmi_transport_dev *xport)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun 	static atomic_t transport_device_count = ATOMIC_INIT(0);
77*4882a593Smuzhiyun 	struct rmi_device *rmi_dev;
78*4882a593Smuzhiyun 	int error;
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	rmi_dev = kzalloc(sizeof(struct rmi_device), GFP_KERNEL);
81*4882a593Smuzhiyun 	if (!rmi_dev)
82*4882a593Smuzhiyun 		return -ENOMEM;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	device_initialize(&rmi_dev->dev);
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	rmi_dev->xport = xport;
87*4882a593Smuzhiyun 	rmi_dev->number = atomic_inc_return(&transport_device_count) - 1;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	dev_set_name(&rmi_dev->dev, "rmi4-%02d", rmi_dev->number);
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	rmi_dev->dev.bus = &rmi_bus_type;
92*4882a593Smuzhiyun 	rmi_dev->dev.type = &rmi_device_type;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	xport->rmi_dev = rmi_dev;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	error = device_add(&rmi_dev->dev);
97*4882a593Smuzhiyun 	if (error)
98*4882a593Smuzhiyun 		goto err_put_device;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	rmi_dbg(RMI_DEBUG_CORE, xport->dev,
101*4882a593Smuzhiyun 		"%s: Registered %s as %s.\n", __func__,
102*4882a593Smuzhiyun 		dev_name(rmi_dev->xport->dev), dev_name(&rmi_dev->dev));
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	return 0;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun err_put_device:
107*4882a593Smuzhiyun 	put_device(&rmi_dev->dev);
108*4882a593Smuzhiyun 	return error;
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rmi_register_transport_device);
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /**
113*4882a593Smuzhiyun  * rmi_unregister_transport_device - unregister a transport device connection
114*4882a593Smuzhiyun  * @xport: the transport driver to unregister
115*4882a593Smuzhiyun  *
116*4882a593Smuzhiyun  */
rmi_unregister_transport_device(struct rmi_transport_dev * xport)117*4882a593Smuzhiyun void rmi_unregister_transport_device(struct rmi_transport_dev *xport)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun 	struct rmi_device *rmi_dev = xport->rmi_dev;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	device_del(&rmi_dev->dev);
122*4882a593Smuzhiyun 	put_device(&rmi_dev->dev);
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun EXPORT_SYMBOL(rmi_unregister_transport_device);
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /* Function specific stuff */
128*4882a593Smuzhiyun 
rmi_release_function(struct device * dev)129*4882a593Smuzhiyun static void rmi_release_function(struct device *dev)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun 	struct rmi_function *fn = to_rmi_function(dev);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	kfree(fn);
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun static const struct device_type rmi_function_type = {
137*4882a593Smuzhiyun 	.name		= "rmi4_function",
138*4882a593Smuzhiyun 	.release	= rmi_release_function,
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun 
rmi_is_function_device(struct device * dev)141*4882a593Smuzhiyun bool rmi_is_function_device(struct device *dev)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun 	return dev->type == &rmi_function_type;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun 
rmi_function_match(struct device * dev,struct device_driver * drv)146*4882a593Smuzhiyun static int rmi_function_match(struct device *dev, struct device_driver *drv)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun 	struct rmi_function_handler *handler = to_rmi_function_handler(drv);
149*4882a593Smuzhiyun 	struct rmi_function *fn = to_rmi_function(dev);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	return fn->fd.function_number == handler->func;
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #ifdef CONFIG_OF
rmi_function_of_probe(struct rmi_function * fn)155*4882a593Smuzhiyun static void rmi_function_of_probe(struct rmi_function *fn)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun 	char of_name[9];
158*4882a593Smuzhiyun 	struct device_node *node = fn->rmi_dev->xport->dev->of_node;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	snprintf(of_name, sizeof(of_name), "rmi4-f%02x",
161*4882a593Smuzhiyun 		fn->fd.function_number);
162*4882a593Smuzhiyun 	fn->dev.of_node = of_get_child_by_name(node, of_name);
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun #else
rmi_function_of_probe(struct rmi_function * fn)165*4882a593Smuzhiyun static inline void rmi_function_of_probe(struct rmi_function *fn)
166*4882a593Smuzhiyun {}
167*4882a593Smuzhiyun #endif
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun static struct irq_chip rmi_irq_chip = {
170*4882a593Smuzhiyun 	.name = "rmi4",
171*4882a593Smuzhiyun };
172*4882a593Smuzhiyun 
rmi_create_function_irq(struct rmi_function * fn,struct rmi_function_handler * handler)173*4882a593Smuzhiyun static int rmi_create_function_irq(struct rmi_function *fn,
174*4882a593Smuzhiyun 				   struct rmi_function_handler *handler)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun 	struct rmi_driver_data *drvdata = dev_get_drvdata(&fn->rmi_dev->dev);
177*4882a593Smuzhiyun 	int i, error;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	for (i = 0; i < fn->num_of_irqs; i++) {
180*4882a593Smuzhiyun 		set_bit(fn->irq_pos + i, fn->irq_mask);
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 		fn->irq[i] = irq_create_mapping(drvdata->irqdomain,
183*4882a593Smuzhiyun 						fn->irq_pos + i);
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 		irq_set_chip_data(fn->irq[i], fn);
186*4882a593Smuzhiyun 		irq_set_chip_and_handler(fn->irq[i], &rmi_irq_chip,
187*4882a593Smuzhiyun 					 handle_simple_irq);
188*4882a593Smuzhiyun 		irq_set_nested_thread(fn->irq[i], 1);
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 		error = devm_request_threaded_irq(&fn->dev, fn->irq[i], NULL,
191*4882a593Smuzhiyun 					handler->attention, IRQF_ONESHOT,
192*4882a593Smuzhiyun 					dev_name(&fn->dev), fn);
193*4882a593Smuzhiyun 		if (error) {
194*4882a593Smuzhiyun 			dev_err(&fn->dev, "Error %d registering IRQ\n", error);
195*4882a593Smuzhiyun 			return error;
196*4882a593Smuzhiyun 		}
197*4882a593Smuzhiyun 	}
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	return 0;
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun 
rmi_function_probe(struct device * dev)202*4882a593Smuzhiyun static int rmi_function_probe(struct device *dev)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun 	struct rmi_function *fn = to_rmi_function(dev);
205*4882a593Smuzhiyun 	struct rmi_function_handler *handler =
206*4882a593Smuzhiyun 					to_rmi_function_handler(dev->driver);
207*4882a593Smuzhiyun 	int error;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	rmi_function_of_probe(fn);
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	if (handler->probe) {
212*4882a593Smuzhiyun 		error = handler->probe(fn);
213*4882a593Smuzhiyun 		if (error)
214*4882a593Smuzhiyun 			return error;
215*4882a593Smuzhiyun 	}
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	if (fn->num_of_irqs && handler->attention) {
218*4882a593Smuzhiyun 		error = rmi_create_function_irq(fn, handler);
219*4882a593Smuzhiyun 		if (error)
220*4882a593Smuzhiyun 			return error;
221*4882a593Smuzhiyun 	}
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	return 0;
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun 
rmi_function_remove(struct device * dev)226*4882a593Smuzhiyun static int rmi_function_remove(struct device *dev)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun 	struct rmi_function *fn = to_rmi_function(dev);
229*4882a593Smuzhiyun 	struct rmi_function_handler *handler =
230*4882a593Smuzhiyun 					to_rmi_function_handler(dev->driver);
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	if (handler->remove)
233*4882a593Smuzhiyun 		handler->remove(fn);
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	return 0;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun 
rmi_register_function(struct rmi_function * fn)238*4882a593Smuzhiyun int rmi_register_function(struct rmi_function *fn)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun 	struct rmi_device *rmi_dev = fn->rmi_dev;
241*4882a593Smuzhiyun 	int error;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	device_initialize(&fn->dev);
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun 	dev_set_name(&fn->dev, "%s.fn%02x",
246*4882a593Smuzhiyun 		     dev_name(&rmi_dev->dev), fn->fd.function_number);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	fn->dev.parent = &rmi_dev->dev;
249*4882a593Smuzhiyun 	fn->dev.type = &rmi_function_type;
250*4882a593Smuzhiyun 	fn->dev.bus = &rmi_bus_type;
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun 	error = device_add(&fn->dev);
253*4882a593Smuzhiyun 	if (error) {
254*4882a593Smuzhiyun 		dev_err(&rmi_dev->dev,
255*4882a593Smuzhiyun 			"Failed device_register function device %s\n",
256*4882a593Smuzhiyun 			dev_name(&fn->dev));
257*4882a593Smuzhiyun 		goto err_put_device;
258*4882a593Smuzhiyun 	}
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, "Registered F%02X.\n",
261*4882a593Smuzhiyun 			fn->fd.function_number);
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	return 0;
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun err_put_device:
266*4882a593Smuzhiyun 	put_device(&fn->dev);
267*4882a593Smuzhiyun 	return error;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun 
rmi_unregister_function(struct rmi_function * fn)270*4882a593Smuzhiyun void rmi_unregister_function(struct rmi_function *fn)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun 	int i;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	rmi_dbg(RMI_DEBUG_CORE, &fn->dev, "Unregistering F%02X.\n",
275*4882a593Smuzhiyun 			fn->fd.function_number);
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	device_del(&fn->dev);
278*4882a593Smuzhiyun 	of_node_put(fn->dev.of_node);
279*4882a593Smuzhiyun 	put_device(&fn->dev);
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 	for (i = 0; i < fn->num_of_irqs; i++)
282*4882a593Smuzhiyun 		irq_dispose_mapping(fn->irq[i]);
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun /**
287*4882a593Smuzhiyun  * rmi_register_function_handler - register a handler for an RMI function
288*4882a593Smuzhiyun  * @handler: RMI handler that should be registered.
289*4882a593Smuzhiyun  * @module: pointer to module that implements the handler
290*4882a593Smuzhiyun  * @mod_name: name of the module implementing the handler
291*4882a593Smuzhiyun  *
292*4882a593Smuzhiyun  * This function performs additional setup of RMI function handler and
293*4882a593Smuzhiyun  * registers it with the RMI core so that it can be bound to
294*4882a593Smuzhiyun  * RMI function devices.
295*4882a593Smuzhiyun  */
__rmi_register_function_handler(struct rmi_function_handler * handler,struct module * owner,const char * mod_name)296*4882a593Smuzhiyun int __rmi_register_function_handler(struct rmi_function_handler *handler,
297*4882a593Smuzhiyun 				     struct module *owner,
298*4882a593Smuzhiyun 				     const char *mod_name)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun 	struct device_driver *driver = &handler->driver;
301*4882a593Smuzhiyun 	int error;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	driver->bus = &rmi_bus_type;
304*4882a593Smuzhiyun 	driver->owner = owner;
305*4882a593Smuzhiyun 	driver->mod_name = mod_name;
306*4882a593Smuzhiyun 	driver->probe = rmi_function_probe;
307*4882a593Smuzhiyun 	driver->remove = rmi_function_remove;
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 	error = driver_register(driver);
310*4882a593Smuzhiyun 	if (error) {
311*4882a593Smuzhiyun 		pr_err("driver_register() failed for %s, error: %d\n",
312*4882a593Smuzhiyun 			driver->name, error);
313*4882a593Smuzhiyun 		return error;
314*4882a593Smuzhiyun 	}
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	return 0;
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__rmi_register_function_handler);
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun /**
321*4882a593Smuzhiyun  * rmi_unregister_function_handler - unregister given RMI function handler
322*4882a593Smuzhiyun  * @handler: RMI handler that should be unregistered.
323*4882a593Smuzhiyun  *
324*4882a593Smuzhiyun  * This function unregisters given function handler from RMI core which
325*4882a593Smuzhiyun  * causes it to be unbound from the function devices.
326*4882a593Smuzhiyun  */
rmi_unregister_function_handler(struct rmi_function_handler * handler)327*4882a593Smuzhiyun void rmi_unregister_function_handler(struct rmi_function_handler *handler)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun 	driver_unregister(&handler->driver);
330*4882a593Smuzhiyun }
331*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rmi_unregister_function_handler);
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun /* Bus specific stuff */
334*4882a593Smuzhiyun 
rmi_bus_match(struct device * dev,struct device_driver * drv)335*4882a593Smuzhiyun static int rmi_bus_match(struct device *dev, struct device_driver *drv)
336*4882a593Smuzhiyun {
337*4882a593Smuzhiyun 	bool physical = rmi_is_physical_device(dev);
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	/* First see if types are not compatible */
340*4882a593Smuzhiyun 	if (physical != rmi_is_physical_driver(drv))
341*4882a593Smuzhiyun 		return 0;
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	return physical || rmi_function_match(dev, drv);
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun struct bus_type rmi_bus_type = {
347*4882a593Smuzhiyun 	.match		= rmi_bus_match,
348*4882a593Smuzhiyun 	.name		= "rmi4",
349*4882a593Smuzhiyun };
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun static struct rmi_function_handler *fn_handlers[] = {
352*4882a593Smuzhiyun 	&rmi_f01_handler,
353*4882a593Smuzhiyun #ifdef CONFIG_RMI4_F03
354*4882a593Smuzhiyun 	&rmi_f03_handler,
355*4882a593Smuzhiyun #endif
356*4882a593Smuzhiyun #ifdef CONFIG_RMI4_F11
357*4882a593Smuzhiyun 	&rmi_f11_handler,
358*4882a593Smuzhiyun #endif
359*4882a593Smuzhiyun #ifdef CONFIG_RMI4_F12
360*4882a593Smuzhiyun 	&rmi_f12_handler,
361*4882a593Smuzhiyun #endif
362*4882a593Smuzhiyun #ifdef CONFIG_RMI4_F30
363*4882a593Smuzhiyun 	&rmi_f30_handler,
364*4882a593Smuzhiyun #endif
365*4882a593Smuzhiyun #ifdef CONFIG_RMI4_F34
366*4882a593Smuzhiyun 	&rmi_f34_handler,
367*4882a593Smuzhiyun #endif
368*4882a593Smuzhiyun #ifdef CONFIG_RMI4_F3A
369*4882a593Smuzhiyun 	&rmi_f3a_handler,
370*4882a593Smuzhiyun #endif
371*4882a593Smuzhiyun #ifdef CONFIG_RMI4_F54
372*4882a593Smuzhiyun 	&rmi_f54_handler,
373*4882a593Smuzhiyun #endif
374*4882a593Smuzhiyun #ifdef CONFIG_RMI4_F55
375*4882a593Smuzhiyun 	&rmi_f55_handler,
376*4882a593Smuzhiyun #endif
377*4882a593Smuzhiyun };
378*4882a593Smuzhiyun 
__rmi_unregister_function_handlers(int start_idx)379*4882a593Smuzhiyun static void __rmi_unregister_function_handlers(int start_idx)
380*4882a593Smuzhiyun {
381*4882a593Smuzhiyun 	int i;
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun 	for (i = start_idx; i >= 0; i--)
384*4882a593Smuzhiyun 		rmi_unregister_function_handler(fn_handlers[i]);
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun 
rmi_unregister_function_handlers(void)387*4882a593Smuzhiyun static void rmi_unregister_function_handlers(void)
388*4882a593Smuzhiyun {
389*4882a593Smuzhiyun 	__rmi_unregister_function_handlers(ARRAY_SIZE(fn_handlers) - 1);
390*4882a593Smuzhiyun }
391*4882a593Smuzhiyun 
rmi_register_function_handlers(void)392*4882a593Smuzhiyun static int rmi_register_function_handlers(void)
393*4882a593Smuzhiyun {
394*4882a593Smuzhiyun 	int ret;
395*4882a593Smuzhiyun 	int i;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(fn_handlers); i++)	{
398*4882a593Smuzhiyun 		ret = rmi_register_function_handler(fn_handlers[i]);
399*4882a593Smuzhiyun 		if (ret) {
400*4882a593Smuzhiyun 			pr_err("%s: error registering the RMI F%02x handler: %d\n",
401*4882a593Smuzhiyun 				__func__, fn_handlers[i]->func, ret);
402*4882a593Smuzhiyun 			goto err_unregister_function_handlers;
403*4882a593Smuzhiyun 		}
404*4882a593Smuzhiyun 	}
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun 	return 0;
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun err_unregister_function_handlers:
409*4882a593Smuzhiyun 	__rmi_unregister_function_handlers(i - 1);
410*4882a593Smuzhiyun 	return ret;
411*4882a593Smuzhiyun }
412*4882a593Smuzhiyun 
rmi_of_property_read_u32(struct device * dev,u32 * result,const char * prop,bool optional)413*4882a593Smuzhiyun int rmi_of_property_read_u32(struct device *dev, u32 *result,
414*4882a593Smuzhiyun 				const char *prop, bool optional)
415*4882a593Smuzhiyun {
416*4882a593Smuzhiyun 	int retval;
417*4882a593Smuzhiyun 	u32 val = 0;
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	retval = of_property_read_u32(dev->of_node, prop, &val);
420*4882a593Smuzhiyun 	if (retval && (!optional && retval == -EINVAL)) {
421*4882a593Smuzhiyun 		dev_err(dev, "Failed to get %s value: %d\n",
422*4882a593Smuzhiyun 			prop, retval);
423*4882a593Smuzhiyun 		return retval;
424*4882a593Smuzhiyun 	}
425*4882a593Smuzhiyun 	*result = val;
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	return 0;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rmi_of_property_read_u32);
430*4882a593Smuzhiyun 
rmi_bus_init(void)431*4882a593Smuzhiyun static int __init rmi_bus_init(void)
432*4882a593Smuzhiyun {
433*4882a593Smuzhiyun 	int error;
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun 	error = bus_register(&rmi_bus_type);
436*4882a593Smuzhiyun 	if (error) {
437*4882a593Smuzhiyun 		pr_err("%s: error registering the RMI bus: %d\n",
438*4882a593Smuzhiyun 			__func__, error);
439*4882a593Smuzhiyun 		return error;
440*4882a593Smuzhiyun 	}
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 	error = rmi_register_function_handlers();
443*4882a593Smuzhiyun 	if (error)
444*4882a593Smuzhiyun 		goto err_unregister_bus;
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	error = rmi_register_physical_driver();
447*4882a593Smuzhiyun 	if (error) {
448*4882a593Smuzhiyun 		pr_err("%s: error registering the RMI physical driver: %d\n",
449*4882a593Smuzhiyun 			__func__, error);
450*4882a593Smuzhiyun 		goto err_unregister_bus;
451*4882a593Smuzhiyun 	}
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	return 0;
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun err_unregister_bus:
456*4882a593Smuzhiyun 	bus_unregister(&rmi_bus_type);
457*4882a593Smuzhiyun 	return error;
458*4882a593Smuzhiyun }
459*4882a593Smuzhiyun module_init(rmi_bus_init);
460*4882a593Smuzhiyun 
rmi_bus_exit(void)461*4882a593Smuzhiyun static void __exit rmi_bus_exit(void)
462*4882a593Smuzhiyun {
463*4882a593Smuzhiyun 	/*
464*4882a593Smuzhiyun 	 * We should only ever get here if all drivers are unloaded, so
465*4882a593Smuzhiyun 	 * all we have to do at this point is unregister ourselves.
466*4882a593Smuzhiyun 	 */
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 	rmi_unregister_physical_driver();
469*4882a593Smuzhiyun 	rmi_unregister_function_handlers();
470*4882a593Smuzhiyun 	bus_unregister(&rmi_bus_type);
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun module_exit(rmi_bus_exit);
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun MODULE_AUTHOR("Christopher Heiny <cheiny@synaptics.com");
475*4882a593Smuzhiyun MODULE_AUTHOR("Andrew Duggan <aduggan@synaptics.com");
476*4882a593Smuzhiyun MODULE_DESCRIPTION("RMI bus");
477*4882a593Smuzhiyun MODULE_LICENSE("GPL");
478