1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * PCI Endpoint *Function* (EPF) library
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2017 Texas Instruments
6*4882a593Smuzhiyun * Author: Kishon Vijay Abraham I <kishon@ti.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/device.h>
10*4882a593Smuzhiyun #include <linux/dma-mapping.h>
11*4882a593Smuzhiyun #include <linux/slab.h>
12*4882a593Smuzhiyun #include <linux/module.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #include <linux/pci-epc.h>
15*4882a593Smuzhiyun #include <linux/pci-epf.h>
16*4882a593Smuzhiyun #include <linux/pci-ep-cfs.h>
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun static DEFINE_MUTEX(pci_epf_mutex);
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun static struct bus_type pci_epf_bus_type;
21*4882a593Smuzhiyun static const struct device_type pci_epf_type;
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun /**
24*4882a593Smuzhiyun * pci_epf_unbind() - Notify the function driver that the binding between the
25*4882a593Smuzhiyun * EPF device and EPC device has been lost
26*4882a593Smuzhiyun * @epf: the EPF device which has lost the binding with the EPC device
27*4882a593Smuzhiyun *
28*4882a593Smuzhiyun * Invoke to notify the function driver that the binding between the EPF device
29*4882a593Smuzhiyun * and EPC device has been lost.
30*4882a593Smuzhiyun */
pci_epf_unbind(struct pci_epf * epf)31*4882a593Smuzhiyun void pci_epf_unbind(struct pci_epf *epf)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun if (!epf->driver) {
34*4882a593Smuzhiyun dev_WARN(&epf->dev, "epf device not bound to driver\n");
35*4882a593Smuzhiyun return;
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun mutex_lock(&epf->lock);
39*4882a593Smuzhiyun epf->driver->ops->unbind(epf);
40*4882a593Smuzhiyun mutex_unlock(&epf->lock);
41*4882a593Smuzhiyun module_put(epf->driver->owner);
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pci_epf_unbind);
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun /**
46*4882a593Smuzhiyun * pci_epf_bind() - Notify the function driver that the EPF device has been
47*4882a593Smuzhiyun * bound to a EPC device
48*4882a593Smuzhiyun * @epf: the EPF device which has been bound to the EPC device
49*4882a593Smuzhiyun *
50*4882a593Smuzhiyun * Invoke to notify the function driver that it has been bound to a EPC device
51*4882a593Smuzhiyun */
pci_epf_bind(struct pci_epf * epf)52*4882a593Smuzhiyun int pci_epf_bind(struct pci_epf *epf)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun int ret;
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun if (!epf->driver) {
57*4882a593Smuzhiyun dev_WARN(&epf->dev, "epf device not bound to driver\n");
58*4882a593Smuzhiyun return -EINVAL;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun if (!try_module_get(epf->driver->owner))
62*4882a593Smuzhiyun return -EAGAIN;
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun mutex_lock(&epf->lock);
65*4882a593Smuzhiyun ret = epf->driver->ops->bind(epf);
66*4882a593Smuzhiyun mutex_unlock(&epf->lock);
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun return ret;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pci_epf_bind);
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun /**
73*4882a593Smuzhiyun * pci_epf_free_space() - free the allocated PCI EPF register space
74*4882a593Smuzhiyun * @epf: the EPF device from whom to free the memory
75*4882a593Smuzhiyun * @addr: the virtual address of the PCI EPF register space
76*4882a593Smuzhiyun * @bar: the BAR number corresponding to the register space
77*4882a593Smuzhiyun *
78*4882a593Smuzhiyun * Invoke to free the allocated PCI EPF register space.
79*4882a593Smuzhiyun */
pci_epf_free_space(struct pci_epf * epf,void * addr,enum pci_barno bar)80*4882a593Smuzhiyun void pci_epf_free_space(struct pci_epf *epf, void *addr, enum pci_barno bar)
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun struct device *dev = epf->epc->dev.parent;
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun if (!addr)
85*4882a593Smuzhiyun return;
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun dma_free_coherent(dev, epf->bar[bar].size, addr,
88*4882a593Smuzhiyun epf->bar[bar].phys_addr);
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun epf->bar[bar].phys_addr = 0;
91*4882a593Smuzhiyun epf->bar[bar].addr = NULL;
92*4882a593Smuzhiyun epf->bar[bar].size = 0;
93*4882a593Smuzhiyun epf->bar[bar].barno = 0;
94*4882a593Smuzhiyun epf->bar[bar].flags = 0;
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pci_epf_free_space);
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun /**
99*4882a593Smuzhiyun * pci_epf_alloc_space() - allocate memory for the PCI EPF register space
100*4882a593Smuzhiyun * @epf: the EPF device to whom allocate the memory
101*4882a593Smuzhiyun * @size: the size of the memory that has to be allocated
102*4882a593Smuzhiyun * @bar: the BAR number corresponding to the allocated register space
103*4882a593Smuzhiyun * @align: alignment size for the allocation region
104*4882a593Smuzhiyun *
105*4882a593Smuzhiyun * Invoke to allocate memory for the PCI EPF register space.
106*4882a593Smuzhiyun */
pci_epf_alloc_space(struct pci_epf * epf,size_t size,enum pci_barno bar,size_t align)107*4882a593Smuzhiyun void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar,
108*4882a593Smuzhiyun size_t align)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun void *space;
111*4882a593Smuzhiyun struct device *dev = epf->epc->dev.parent;
112*4882a593Smuzhiyun dma_addr_t phys_addr;
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun if (size < 128)
115*4882a593Smuzhiyun size = 128;
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun if (align)
118*4882a593Smuzhiyun size = ALIGN(size, align);
119*4882a593Smuzhiyun else
120*4882a593Smuzhiyun size = roundup_pow_of_two(size);
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun space = dma_alloc_coherent(dev, size, &phys_addr, GFP_KERNEL);
123*4882a593Smuzhiyun if (!space) {
124*4882a593Smuzhiyun dev_err(dev, "failed to allocate mem space\n");
125*4882a593Smuzhiyun return NULL;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun epf->bar[bar].phys_addr = phys_addr;
129*4882a593Smuzhiyun epf->bar[bar].addr = space;
130*4882a593Smuzhiyun epf->bar[bar].size = size;
131*4882a593Smuzhiyun epf->bar[bar].barno = bar;
132*4882a593Smuzhiyun epf->bar[bar].flags |= upper_32_bits(size) ?
133*4882a593Smuzhiyun PCI_BASE_ADDRESS_MEM_TYPE_64 :
134*4882a593Smuzhiyun PCI_BASE_ADDRESS_MEM_TYPE_32;
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun return space;
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pci_epf_alloc_space);
139*4882a593Smuzhiyun
pci_epf_remove_cfs(struct pci_epf_driver * driver)140*4882a593Smuzhiyun static void pci_epf_remove_cfs(struct pci_epf_driver *driver)
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun struct config_group *group, *tmp;
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun if (!IS_ENABLED(CONFIG_PCI_ENDPOINT_CONFIGFS))
145*4882a593Smuzhiyun return;
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun mutex_lock(&pci_epf_mutex);
148*4882a593Smuzhiyun list_for_each_entry_safe(group, tmp, &driver->epf_group, group_entry)
149*4882a593Smuzhiyun pci_ep_cfs_remove_epf_group(group);
150*4882a593Smuzhiyun list_del(&driver->epf_group);
151*4882a593Smuzhiyun mutex_unlock(&pci_epf_mutex);
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun /**
155*4882a593Smuzhiyun * pci_epf_unregister_driver() - unregister the PCI EPF driver
156*4882a593Smuzhiyun * @driver: the PCI EPF driver that has to be unregistered
157*4882a593Smuzhiyun *
158*4882a593Smuzhiyun * Invoke to unregister the PCI EPF driver.
159*4882a593Smuzhiyun */
pci_epf_unregister_driver(struct pci_epf_driver * driver)160*4882a593Smuzhiyun void pci_epf_unregister_driver(struct pci_epf_driver *driver)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun pci_epf_remove_cfs(driver);
163*4882a593Smuzhiyun driver_unregister(&driver->driver);
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pci_epf_unregister_driver);
166*4882a593Smuzhiyun
pci_epf_add_cfs(struct pci_epf_driver * driver)167*4882a593Smuzhiyun static int pci_epf_add_cfs(struct pci_epf_driver *driver)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun struct config_group *group;
170*4882a593Smuzhiyun const struct pci_epf_device_id *id;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun if (!IS_ENABLED(CONFIG_PCI_ENDPOINT_CONFIGFS))
173*4882a593Smuzhiyun return 0;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun INIT_LIST_HEAD(&driver->epf_group);
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun id = driver->id_table;
178*4882a593Smuzhiyun while (id->name[0]) {
179*4882a593Smuzhiyun group = pci_ep_cfs_add_epf_group(id->name);
180*4882a593Smuzhiyun if (IS_ERR(group)) {
181*4882a593Smuzhiyun pci_epf_remove_cfs(driver);
182*4882a593Smuzhiyun return PTR_ERR(group);
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun mutex_lock(&pci_epf_mutex);
186*4882a593Smuzhiyun list_add_tail(&group->group_entry, &driver->epf_group);
187*4882a593Smuzhiyun mutex_unlock(&pci_epf_mutex);
188*4882a593Smuzhiyun id++;
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun return 0;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun /**
195*4882a593Smuzhiyun * __pci_epf_register_driver() - register a new PCI EPF driver
196*4882a593Smuzhiyun * @driver: structure representing PCI EPF driver
197*4882a593Smuzhiyun * @owner: the owner of the module that registers the PCI EPF driver
198*4882a593Smuzhiyun *
199*4882a593Smuzhiyun * Invoke to register a new PCI EPF driver.
200*4882a593Smuzhiyun */
__pci_epf_register_driver(struct pci_epf_driver * driver,struct module * owner)201*4882a593Smuzhiyun int __pci_epf_register_driver(struct pci_epf_driver *driver,
202*4882a593Smuzhiyun struct module *owner)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun int ret;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun if (!driver->ops)
207*4882a593Smuzhiyun return -EINVAL;
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun if (!driver->ops->bind || !driver->ops->unbind)
210*4882a593Smuzhiyun return -EINVAL;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun driver->driver.bus = &pci_epf_bus_type;
213*4882a593Smuzhiyun driver->driver.owner = owner;
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun ret = driver_register(&driver->driver);
216*4882a593Smuzhiyun if (ret)
217*4882a593Smuzhiyun return ret;
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun pci_epf_add_cfs(driver);
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun return 0;
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__pci_epf_register_driver);
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun /**
226*4882a593Smuzhiyun * pci_epf_destroy() - destroy the created PCI EPF device
227*4882a593Smuzhiyun * @epf: the PCI EPF device that has to be destroyed.
228*4882a593Smuzhiyun *
229*4882a593Smuzhiyun * Invoke to destroy the PCI EPF device created by invoking pci_epf_create().
230*4882a593Smuzhiyun */
pci_epf_destroy(struct pci_epf * epf)231*4882a593Smuzhiyun void pci_epf_destroy(struct pci_epf *epf)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun device_unregister(&epf->dev);
234*4882a593Smuzhiyun }
235*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pci_epf_destroy);
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun /**
238*4882a593Smuzhiyun * pci_epf_create() - create a new PCI EPF device
239*4882a593Smuzhiyun * @name: the name of the PCI EPF device. This name will be used to bind the
240*4882a593Smuzhiyun * the EPF device to a EPF driver
241*4882a593Smuzhiyun *
242*4882a593Smuzhiyun * Invoke to create a new PCI EPF device by providing the name of the function
243*4882a593Smuzhiyun * device.
244*4882a593Smuzhiyun */
pci_epf_create(const char * name)245*4882a593Smuzhiyun struct pci_epf *pci_epf_create(const char *name)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun int ret;
248*4882a593Smuzhiyun struct pci_epf *epf;
249*4882a593Smuzhiyun struct device *dev;
250*4882a593Smuzhiyun int len;
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun epf = kzalloc(sizeof(*epf), GFP_KERNEL);
253*4882a593Smuzhiyun if (!epf)
254*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun len = strchrnul(name, '.') - name;
257*4882a593Smuzhiyun epf->name = kstrndup(name, len, GFP_KERNEL);
258*4882a593Smuzhiyun if (!epf->name) {
259*4882a593Smuzhiyun kfree(epf);
260*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun dev = &epf->dev;
264*4882a593Smuzhiyun device_initialize(dev);
265*4882a593Smuzhiyun dev->bus = &pci_epf_bus_type;
266*4882a593Smuzhiyun dev->type = &pci_epf_type;
267*4882a593Smuzhiyun mutex_init(&epf->lock);
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun ret = dev_set_name(dev, "%s", name);
270*4882a593Smuzhiyun if (ret) {
271*4882a593Smuzhiyun put_device(dev);
272*4882a593Smuzhiyun return ERR_PTR(ret);
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun ret = device_add(dev);
276*4882a593Smuzhiyun if (ret) {
277*4882a593Smuzhiyun put_device(dev);
278*4882a593Smuzhiyun return ERR_PTR(ret);
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun return epf;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pci_epf_create);
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun const struct pci_epf_device_id *
pci_epf_match_device(const struct pci_epf_device_id * id,struct pci_epf * epf)286*4882a593Smuzhiyun pci_epf_match_device(const struct pci_epf_device_id *id, struct pci_epf *epf)
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun if (!id || !epf)
289*4882a593Smuzhiyun return NULL;
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun while (*id->name) {
292*4882a593Smuzhiyun if (strcmp(epf->name, id->name) == 0)
293*4882a593Smuzhiyun return id;
294*4882a593Smuzhiyun id++;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun return NULL;
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pci_epf_match_device);
300*4882a593Smuzhiyun
pci_epf_dev_release(struct device * dev)301*4882a593Smuzhiyun static void pci_epf_dev_release(struct device *dev)
302*4882a593Smuzhiyun {
303*4882a593Smuzhiyun struct pci_epf *epf = to_pci_epf(dev);
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun kfree(epf->name);
306*4882a593Smuzhiyun kfree(epf);
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun static const struct device_type pci_epf_type = {
310*4882a593Smuzhiyun .release = pci_epf_dev_release,
311*4882a593Smuzhiyun };
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun static int
pci_epf_match_id(const struct pci_epf_device_id * id,const struct pci_epf * epf)314*4882a593Smuzhiyun pci_epf_match_id(const struct pci_epf_device_id *id, const struct pci_epf *epf)
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun while (id->name[0]) {
317*4882a593Smuzhiyun if (strcmp(epf->name, id->name) == 0)
318*4882a593Smuzhiyun return true;
319*4882a593Smuzhiyun id++;
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun return false;
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
pci_epf_device_match(struct device * dev,struct device_driver * drv)325*4882a593Smuzhiyun static int pci_epf_device_match(struct device *dev, struct device_driver *drv)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun struct pci_epf *epf = to_pci_epf(dev);
328*4882a593Smuzhiyun struct pci_epf_driver *driver = to_pci_epf_driver(drv);
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun if (driver->id_table)
331*4882a593Smuzhiyun return pci_epf_match_id(driver->id_table, epf);
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun return !strcmp(epf->name, drv->name);
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun
pci_epf_device_probe(struct device * dev)336*4882a593Smuzhiyun static int pci_epf_device_probe(struct device *dev)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun struct pci_epf *epf = to_pci_epf(dev);
339*4882a593Smuzhiyun struct pci_epf_driver *driver = to_pci_epf_driver(dev->driver);
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun if (!driver->probe)
342*4882a593Smuzhiyun return -ENODEV;
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun epf->driver = driver;
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun return driver->probe(epf);
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun
pci_epf_device_remove(struct device * dev)349*4882a593Smuzhiyun static int pci_epf_device_remove(struct device *dev)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun int ret = 0;
352*4882a593Smuzhiyun struct pci_epf *epf = to_pci_epf(dev);
353*4882a593Smuzhiyun struct pci_epf_driver *driver = to_pci_epf_driver(dev->driver);
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun if (driver->remove)
356*4882a593Smuzhiyun ret = driver->remove(epf);
357*4882a593Smuzhiyun epf->driver = NULL;
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun return ret;
360*4882a593Smuzhiyun }
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun static struct bus_type pci_epf_bus_type = {
363*4882a593Smuzhiyun .name = "pci-epf",
364*4882a593Smuzhiyun .match = pci_epf_device_match,
365*4882a593Smuzhiyun .probe = pci_epf_device_probe,
366*4882a593Smuzhiyun .remove = pci_epf_device_remove,
367*4882a593Smuzhiyun };
368*4882a593Smuzhiyun
pci_epf_init(void)369*4882a593Smuzhiyun static int __init pci_epf_init(void)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun int ret;
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun ret = bus_register(&pci_epf_bus_type);
374*4882a593Smuzhiyun if (ret) {
375*4882a593Smuzhiyun pr_err("failed to register pci epf bus --> %d\n", ret);
376*4882a593Smuzhiyun return ret;
377*4882a593Smuzhiyun }
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun return 0;
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun module_init(pci_epf_init);
382*4882a593Smuzhiyun
pci_epf_exit(void)383*4882a593Smuzhiyun static void __exit pci_epf_exit(void)
384*4882a593Smuzhiyun {
385*4882a593Smuzhiyun bus_unregister(&pci_epf_bus_type);
386*4882a593Smuzhiyun }
387*4882a593Smuzhiyun module_exit(pci_epf_exit);
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun MODULE_DESCRIPTION("PCI EPF Library");
390*4882a593Smuzhiyun MODULE_AUTHOR("Kishon Vijay Abraham I <kishon@ti.com>");
391*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
392