aboutsummaryrefslogtreecommitdiffstats
path: root/framework
AgeCommit message (Collapse)AuthorFilesLines
2015-12-01onos commit hash c2999f30c69e50df905a9d175ef80b3f23a98514Ashlee Young1049-4634/+92591
Change-Id: I2bb8562c4942b6d6a6d60b663db2e17540477b81 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-30created broader test category under scriptsAshlee Young23-0/+0
Change-Id: I3b8a39b7512594ae2c9aa7ab0e59cf6e2d31f7a2 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-30renamed file to ml2.xlsx to remove spaceAshlee Young1-0/+0
Change-Id: I13498e737b358633e3a9655b7d92e424053e9f87 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-30renamed file to ml3.xlsx to remove spaceAshlee Young1-0/+0
Change-Id: I62f06ec46c55bb261b8208e7e8643fbaee5ad508 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-30adding apis submodule from https://github.com/onosfw/apisAshlee Young1-0/+0
Change-Id: Icebfe5f5e9cdfb1d7738fd958d8bdd9cfba8fc89 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-30restructuring docsAshlee Young1-0/+1
Change-Id: I6714f35a85fa7a5fb1862be5e90c335f32e65812 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-30restructuring docsAshlee Young2-1/+2
Change-Id: I28db98f123c4c586a8c3a08b3f6e588837a21fbc Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-30Merge "write ovsdb connection related scripts"Tim Zhao6-0/+560
2015-11-30Merge "Update testcases of ML2/ML3 for onosfw"Tim Zhao2-0/+0
2015-11-29v2.4.4 audit sourcesAshlee Young386-0/+89190
Change-Id: I9315a7408817db51edf084fb4d27fbb492785084 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-28Update testcases of ML2/ML3 for onosfwlanqinglong2-0/+0
1.Update ML2 test documents 2.Update ML3 test documents Change-Id: I80421126240a0a1e7ee89e508bace40b76e794fa Signed-off-by: lanqinglong <lanqinglong@huawei.com>
2015-11-24Added apache 2 license verbageAshlee Young82-1498/+3123
Change-Id: I6a0b484496f7f3ba77c3584f5ab5a1acf353b298 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-22Removed patch path since changes have been merged upstream to a different ↵Ashlee Young554-65539/+3717
path. Updated README with directions. Change-Id: Ie419abd2d3d3ef7315de9f607dcd757a78190995 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-14ONOS commit 4832784ed4032361f4c776b79a1de9c013c41226Ashlee Young3-7/+36
Change-Id: I710a23a1485c08f006d3ead26f5281c2d1a986e4 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-13ONOS commit d9df7bd278935c3d72ac6eeb0ff44efe1edde567Ashlee Young36-233/+228
Change-Id: I319f3a3765db55034b894238fb9391eee56c6dd4 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-13ONOS commit id 710293f3afa03540a1fd3be038da0ea6a488765cAshlee Young45-233/+2230
Change-Id: I66c2370960d7597bdbaf7bf58defca3e864c4215 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-13ONOS commit 14c0436b3fc6758177a877901dbfecfae3d3d6ffAshlee Young2-20/+146
Change-Id: Iada9f5f9d74438c914aab3f659c9e8d85bafc632 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-12ONOS update to commit id "761f0040f3ce4f33a38377c7f737145b603aa334Ashlee Young23-67/+368
Change-Id: Ib76e3935c50fc275f803f17cffbc511e0a91f5d1 Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-12Updating onos src up to commit id fdb426e7ca9232692b0b6c335c79fc9c5a4e341fAshlee Young12-5/+835
Change-Id: I78f29f15b39f965b61154d5f8d576ed1a9481b9b Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-11 Updating onos src to commit id ec0425c18cbe49d368c600160f033acf9fe344caAshlee Young70-454/+2340
Change-Id: Iec2815bf7771080f25272842b852bd9d33f908ff Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-07Updated ONOS sources to commit ID 3f28c6803193d493b636dd3c43e08a3e6b35accaAshlee Young104-685/+2184
Change-Id: I08d1eb7ee31b38491b046933c502894d133b2a2d Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-05Updates ONOS tree to checkin id ca9cc8e28eba18da77f4fa021fb7c3a3f76e5d44Ashlee Young233-1479/+5829
upstream. Change-Id: I49f8e41733afea8101ec50c0102213c8d18949ae Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-05Backed out DefaultFlowClassifier.java DefaultPortPair.java due to buildAshlee Young3-619/+0
errors. Change-Id: Ibac1cbd606f31da59107b5f537b6e5b612c5804b Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-05write ovsdb connection related scriptszhanghaoyu76-0/+560
JIRA:ONOSFW-64 1.ovsdb connection scripts Change-Id: Id51cf1eb3e7545c35ef64156b7dc7618cc69073f
2015-11-03This updates ONOS src tree to commit idAshlee Young372-2349/+17306
03fa5e571cabbd001ddb1598847e1150b11c7333 Change-Id: I13b554026d6f902933e35887d29bd5fdb669c0bd Signed-off-by: Ashlee Young <ashlee@wildernessvoice.com>
2015-11-02Write NBI-virtualport related scriptslanqinglong1-0/+184
JIRA:ONOSFW-66 1.Delete subnets 2.Post Virtual-port Change-Id: I13d14f430daa1bfdf30e406dfefb7c7213e34014 Signed-off-by: lanqinglong <lanqinglong@huawei.com>
2015-10-30New ML2/L3 plugin to support SFCAshlee Young53-0/+2780
Change-Id: Ie778a2b2e09a29972e28d70c8eedee407b1d8eb6 Signed-off-by: Ashlee Young <ashlee@onosfw.com>
2015-10-30Removing submodule.Ashlee Young3-162/+0
Change-Id: I4262e92adfa55e5de121a8b0915328770b2ec594 Signed-off-by: Ashlee Young <ashlee@onosfw.com>
2015-10-28Write NBI-subnet related scriptslanqinglong1-1/+110
JIRA:ONOSFW-66 1、Update subnets Change-Id: Ia9a1be9aca710b417b7194612f0a25764a92a60d Signed-off-by: lanqinglong <lanqinglong@huawei.com>
2015-10-27Write NBI-subnet related scriptslanqinglong1-1/+90
JIRA:ONOSFW-66 1、create subnets Change-Id: Ie32e8c0720ba1b9cd5f4cadcd26440c2feb23173 Signed-off-by: lanqinglong <lanqinglong@huawei.com>
2015-10-26Merge "write NBI-network related scripts"Ashlee Young6-0/+723
2015-10-26write NBI-network related scriptslanqinglong6-0/+723
JIRA:ONOSFW-65 the script include: 1、create networks 2、update networks 3、delete networks 4、show networks Change-Id: I7159219f7dad70b7e724ed232b230b089e92e000 Signed-off-by: lanqinglong <lanqinglong@huawei.com>
2015-10-26Use a Client driver to run test scriptslanqinglong1-0/+69
JIRA:ONOSFW-141 Use a Client driver to run test scripts Change-Id: If2828dea09ae3c21bde195982bb02023e0a4d224 Signed-off-by: lanqinglong <lanqinglong@huawei.com>
2015-10-23Removing sources to replace with download links instead.Ashlee Young4133-576666/+0
Change-Id: Ie28789a725051aec0d1b04dd291b7690a7898668 Signed-off-by: Ashlee Young <ashlee@onosfw.com>
2015-10-23Adding maven and ant source treesAshlee Young4133-0/+576666
Change-Id: I0a39b9add833a31b9c3f98d193983ae2f3a5a445 Signed-off-by: Ashlee Young <ashlee@onosfw.com>
2015-10-23Update ONOS src to commit id 69b36d5d11e81e28e56b46ba44e4b8cd701c5867Ashlee Young106-1097/+2617
Change-Id: I9c13045711dbf9c0181106b66a6bf22c72bcf330 Signed-off-by: Ashlee Young <ashlee@onosfw.com>
2015-10-23Moving new files to patches to avoid being overwritten when we updateAshlee Young7-0/+0
the onos tree Change-Id: I7506c6e451fb9d46e36f691593b26b42626e8a64 Signed-off-by: Ashlee Young <ashlee@onosfw.com>
2015-10-23Removed this and will use git mv instead.Ashlee Young7-1194/+0
Change-Id: Idb4bc2cea3731fcd99a35e07f440bb5c79a47b97 Signed-off-by: Ashlee Young <ashlee@onosfw.com>
2015-10-23These new files are really patches to the upstream onos project.Ashlee Young7-0/+1194
Change-Id: I58af837fe5f18d8c3c560a268415279079954edd Signed-off-by: Ashlee Young <ashlee@onosfw.com>
2015-10-23Write a new environment driverlanqinglong1-0/+226
JIRA:ONOSFW-140 Environment setup is needed in function test of onosfw Change-Id: Ieba71c196320b1eb2ab1138a91ac616154354799 Signed-off-by: lanqinglong <lanqinglong@huawei.com>
2015-10-23Write some new drivers to connect devicelanqinglong1-0/+191
JIRA:ONOSFW-139 connection-env should be add Change-Id: I85640533f67775aa89b2ab7e0a7527997d626ce1 Signed-off-by: lanqinglong <lanqinglong@huawei.com>
2015-10-23Merge topics 'DefaultFlowClassifier', 'FlowClassifier'Tim Zhao4-0/+762
* changes: [ONOSFW -127] implementation of flow classifier for sfc. [ONOSFW-127] FlowClassifier for SFC.
2015-10-23Merge "[ONOSFW-127] Container class for Port Pair"Tim Zhao3-0/+432
2015-10-22[ONOSFW-127] Container class for Port PairPhaneendra Manda3-0/+432
Change-Id: Ibd13dff2ceae9ca85c1d9a01ad23935f175c7e6d
2015-10-22[ONOSFW -127] implementation of flow classifier for sfc.Bharat saraswal1-0/+414
Change-Id: I8457c29525425137368dbb42c5b2330403b91352
2015-10-22[ONOSFW-127] FlowClassifier for SFC.bharat saraswal3-0/+348
Change-Id: I1064f83aabd3941156585ca65f8f35757724e21d
2015-10-21Create a new framework of running onos testlanqinglong9-0/+141
JIRA:ONOSFW-138 Onosfw need some test, so it need a new framework Change-Id: Iaccdc1184767bdb1b794d36d92e09bf03a38d82f Signed-off-by: lanqinglong <lanqinglong@huawei.com>
2015-10-19Updated onos src tree to commit id 1e60f97ae50c05b94fcb6a10520738bfb5efdfd1Ashlee Young231-13056/+5312
2015-10-09added missing directory structure for rpmbuildAshlee Young16-0/+382
Change-Id: I42b06b4318868e08e85a90e81f06357dbda75bef
2015-10-09Updated master to commit id 6ee8aa3e67ce89908a8c93aa9445c6f71a18f986Ashlee Young578-4451/+39571
Change-Id: I94b055ee2f298daf71e2ec794fd0f2495bd8081f
struct irq_data *d) { struct pcap_chip *pcap = irq_data_get_irq_chip_data(d); pcap->msr &= ~(1 << irq_to_pcap(pcap, d->irq)); queue_work(pcap->workqueue, &pcap->msr_work); } static struct irq_chip pcap_irq_chip = { .name = "pcap", .irq_disable = pcap_mask_irq, .irq_mask = pcap_mask_irq, .irq_unmask = pcap_unmask_irq, }; static void pcap_msr_work(struct work_struct *work) { struct pcap_chip *pcap = container_of(work, struct pcap_chip, msr_work); ezx_pcap_write(pcap, PCAP_REG_MSR, pcap->msr); } static void pcap_isr_work(struct work_struct *work) { struct pcap_chip *pcap = container_of(work, struct pcap_chip, isr_work); struct pcap_platform_data *pdata = dev_get_platdata(&pcap->spi->dev); u32 msr, isr, int_sel, service; int irq; do { ezx_pcap_read(pcap, PCAP_REG_MSR, &msr); ezx_pcap_read(pcap, PCAP_REG_ISR, &isr); /* We can't service/ack irqs that are assigned to port 2 */ if (!(pdata->config & PCAP_SECOND_PORT)) { ezx_pcap_read(pcap, PCAP_REG_INT_SEL, &int_sel); isr &= ~int_sel; } ezx_pcap_write(pcap, PCAP_REG_MSR, isr | msr); ezx_pcap_write(pcap, PCAP_REG_ISR, isr); local_irq_disable(); service = isr & ~msr; for (irq = pcap->irq_base; service; service >>= 1, irq++) { if (service & 1) generic_handle_irq(irq); } local_irq_enable(); ezx_pcap_write(pcap, PCAP_REG_MSR, pcap->msr); } while (gpio_get_value(pdata->gpio)); } static void pcap_irq_handler(struct irq_desc *desc) { struct pcap_chip *pcap = irq_desc_get_handler_data(desc); desc->irq_data.chip->irq_ack(&desc->irq_data); queue_work(pcap->workqueue, &pcap->isr_work); } /* ADC */ void pcap_set_ts_bits(struct pcap_chip *pcap, u32 bits) { u32 tmp; mutex_lock(&pcap->adc_mutex); ezx_pcap_read(pcap, PCAP_REG_ADC, &tmp); tmp &= ~(PCAP_ADC_TS_M_MASK | PCAP_ADC_TS_REF_LOWPWR); tmp |= bits & (PCAP_ADC_TS_M_MASK | PCAP_ADC_TS_REF_LOWPWR); ezx_pcap_write(pcap, PCAP_REG_ADC, tmp); mutex_unlock(&pcap->adc_mutex); } EXPORT_SYMBOL_GPL(pcap_set_ts_bits); static void pcap_disable_adc(struct pcap_chip *pcap) { u32 tmp; ezx_pcap_read(pcap, PCAP_REG_ADC, &tmp); tmp &= ~(PCAP_ADC_ADEN|PCAP_ADC_BATT_I_ADC|PCAP_ADC_BATT_I_POLARITY); ezx_pcap_write(pcap, PCAP_REG_ADC, tmp); } static void pcap_adc_trigger(struct pcap_chip *pcap) { u32 tmp; u8 head; mutex_lock(&pcap->adc_mutex); head = pcap->adc_head; if (!pcap->adc_queue[head]) { /* queue is empty, save power */ pcap_disable_adc(pcap); mutex_unlock(&pcap->adc_mutex); return; } /* start conversion on requested bank, save TS_M bits */ ezx_pcap_read(pcap, PCAP_REG_ADC, &tmp); tmp &= (PCAP_ADC_TS_M_MASK | PCAP_ADC_TS_REF_LOWPWR); tmp |= pcap->adc_queue[head]->flags | PCAP_ADC_ADEN; if (pcap->adc_queue[head]->bank == PCAP_ADC_BANK_1) tmp |= PCAP_ADC_AD_SEL1; ezx_pcap_write(pcap, PCAP_REG_ADC, tmp); mutex_unlock(&pcap->adc_mutex); ezx_pcap_write(pcap, PCAP_REG_ADR, PCAP_ADR_ASC); } static irqreturn_t pcap_adc_irq(int irq, void *_pcap) { struct pcap_chip *pcap = _pcap; struct pcap_adc_request *req; u16 res[2]; u32 tmp; mutex_lock(&pcap->adc_mutex); req = pcap->adc_queue[pcap->adc_head]; if (WARN(!req, "adc irq without pending request\n")) { mutex_unlock(&pcap->adc_mutex); return IRQ_HANDLED; } /* read requested channels results */ ezx_pcap_read(pcap, PCAP_REG_ADC, &tmp); tmp &= ~(PCAP_ADC_ADA1_MASK | PCAP_ADC_ADA2_MASK); tmp |= (req->ch[0] << PCAP_ADC_ADA1_SHIFT); tmp |= (req->ch[1] << PCAP_ADC_ADA2_SHIFT); ezx_pcap_write(pcap, PCAP_REG_ADC, tmp); ezx_pcap_read(pcap, PCAP_REG_ADR, &tmp); res[0] = (tmp & PCAP_ADR_ADD1_MASK) >> PCAP_ADR_ADD1_SHIFT; res[1] = (tmp & PCAP_ADR_ADD2_MASK) >> PCAP_ADR_ADD2_SHIFT; pcap->adc_queue[pcap->adc_head] = NULL; pcap->adc_head = (pcap->adc_head + 1) & (PCAP_ADC_MAXQ - 1); mutex_unlock(&pcap->adc_mutex); /* pass the results and release memory */ req->callback(req->data, res); kfree(req); /* trigger next conversion (if any) on queue */ pcap_adc_trigger(pcap); return IRQ_HANDLED; } int pcap_adc_async(struct pcap_chip *pcap, u8 bank, u32 flags, u8 ch[], void *callback, void *data) { struct pcap_adc_request *req; /* This will be freed after we have a result */ req = kmalloc(sizeof(struct pcap_adc_request), GFP_KERNEL); if (!req) return -ENOMEM; req->bank = bank; req->flags = flags; req->ch[0] = ch[0]; req->ch[1] = ch[1]; req->callback = callback; req->data = data; mutex_lock(&pcap->adc_mutex); if (pcap->adc_queue[pcap->adc_tail]) { mutex_unlock(&pcap->adc_mutex); kfree(req); return -EBUSY; } pcap->adc_queue[pcap->adc_tail] = req; pcap->adc_tail = (pcap->adc_tail + 1) & (PCAP_ADC_MAXQ - 1); mutex_unlock(&pcap->adc_mutex); /* start conversion */ pcap_adc_trigger(pcap); return 0; } EXPORT_SYMBOL_GPL(pcap_adc_async); static void pcap_adc_sync_cb(void *param, u16 res[]) { struct pcap_adc_sync_request *req = param; req->res[0] = res[0]; req->res[1] = res[1]; complete(&req->completion); } int pcap_adc_sync(struct pcap_chip *pcap, u8 bank, u32 flags, u8 ch[], u16 res[]) { struct pcap_adc_sync_request sync_data; int ret; init_completion(&sync_data.completion); ret = pcap_adc_async(pcap, bank, flags, ch, pcap_adc_sync_cb, &sync_data); if (ret) return ret; wait_for_completion(&sync_data.completion); res[0] = sync_data.res[0]; res[1] = sync_data.res[1]; return 0; } EXPORT_SYMBOL_GPL(pcap_adc_sync); /* subdevs */ static int pcap_remove_subdev(struct device *dev, void *unused) { platform_device_unregister(to_platform_device(dev)); return 0; } static int pcap_add_subdev(struct pcap_chip *pcap, struct pcap_subdev *subdev) { struct platform_device *pdev; int ret; pdev = platform_device_alloc(subdev->name, subdev->id); if (!pdev) return -ENOMEM; pdev->dev.parent = &pcap->spi->dev; pdev->dev.platform_data = subdev->platform_data; ret = platform_device_add(pdev); if (ret) platform_device_put(pdev); return ret; } static int ezx_pcap_remove(struct spi_device *spi) { struct pcap_chip *pcap = spi_get_drvdata(spi); int i; /* remove all registered subdevs */ device_for_each_child(&spi->dev, NULL, pcap_remove_subdev); /* cleanup ADC */ mutex_lock(&pcap->adc_mutex); for (i = 0; i < PCAP_ADC_MAXQ; i++) kfree(pcap->adc_queue[i]); mutex_unlock(&pcap->adc_mutex); /* cleanup irqchip */ for (i = pcap->irq_base; i < (pcap->irq_base + PCAP_NIRQS); i++) irq_set_chip_and_handler(i, NULL, NULL); destroy_workqueue(pcap->workqueue); return 0; } static int ezx_pcap_probe(struct spi_device *spi) { struct pcap_platform_data *pdata = dev_get_platdata(&spi->dev); struct pcap_chip *pcap; int i, adc_irq; int ret = -ENODEV; /* platform data is required */ if (!pdata) goto ret; pcap = devm_kzalloc(&spi->dev, sizeof(*pcap), GFP_KERNEL); if (!pcap) { ret = -ENOMEM; goto ret; } mutex_init(&pcap->io_mutex); mutex_init(&pcap->adc_mutex); INIT_WORK(&pcap->isr_work, pcap_isr_work); INIT_WORK(&pcap->msr_work, pcap_msr_work); spi_set_drvdata(spi, pcap); /* setup spi */ spi->bits_per_word = 32; spi->mode = SPI_MODE_0 | (pdata->config & PCAP_CS_AH ? SPI_CS_HIGH : 0); ret = spi_setup(spi); if (ret) goto ret; pcap->spi = spi; /* setup irq */ pcap->irq_base = pdata->irq_base; pcap->workqueue = create_singlethread_workqueue("pcapd"); if (!pcap->workqueue) { ret = -ENOMEM; dev_err(&spi->dev, "can't create pcap thread\n"); goto ret; } /* redirect interrupts to AP, except adcdone2 */ if (!(pdata->config & PCAP_SECOND_PORT)) ezx_pcap_write(pcap, PCAP_REG_INT_SEL, (1 << PCAP_IRQ_ADCDONE2)); /* setup irq chip */ for (i = pcap->irq_base; i < (pcap->irq_base + PCAP_NIRQS); i++) { irq_set_chip_and_handler(i, &pcap_irq_chip, handle_simple_irq); irq_set_chip_data(i, pcap); irq_clear_status_flags(i, IRQ_NOREQUEST | IRQ_NOPROBE); } /* mask/ack all PCAP interrupts */ ezx_pcap_write(pcap, PCAP_REG_MSR, PCAP_MASK_ALL_INTERRUPT); ezx_pcap_write(pcap, PCAP_REG_ISR, PCAP_CLEAR_INTERRUPT_REGISTER); pcap->msr = PCAP_MASK_ALL_INTERRUPT; irq_set_irq_type(spi->irq, IRQ_TYPE_EDGE_RISING); irq_set_chained_handler_and_data(spi->irq, pcap_irq_handler, pcap); irq_set_irq_wake(spi->irq, 1); /* ADC */ adc_irq = pcap_to_irq(pcap, (pdata->config & PCAP_SECOND_PORT) ? PCAP_IRQ_ADCDONE2 : PCAP_IRQ_ADCDONE); ret = devm_request_irq(&spi->dev, adc_irq, pcap_adc_irq, 0, "ADC", pcap); if (ret) goto free_irqchip; /* setup subdevs */ for (i = 0; i < pdata->num_subdevs; i++) { ret = pcap_add_subdev(pcap, &pdata->subdevs[i]); if (ret) goto remove_subdevs; } /* board specific quirks */ if (pdata->init) pdata->init(pcap); return 0; remove_subdevs: device_for_each_child(&spi->dev, NULL, pcap_remove_subdev); free_irqchip: for (i = pcap->irq_base; i < (pcap->irq_base + PCAP_NIRQS); i++) irq_set_chip_and_handler(i, NULL, NULL); /* destroy_workqueue: */ destroy_workqueue(pcap->workqueue); ret: return ret; } static struct spi_driver ezxpcap_driver = { .probe = ezx_pcap_probe, .remove = ezx_pcap_remove, .driver = { .name = "ezx-pcap", }, }; static int __init ezx_pcap_init(void) { return spi_register_driver(&ezxpcap_driver); } static void __exit ezx_pcap_exit(void) { spi_unregister_driver(&ezxpcap_driver); } subsys_initcall(ezx_pcap_init); module_exit(ezx_pcap_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Daniel Ribeiro / Harald Welte"); MODULE_DESCRIPTION("Motorola PCAP2 ASIC Driver"); MODULE_ALIAS("spi:ezx-pcap");