0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/bits.h>
0013 #include <linux/clk.h>
0014 #include <linux/delay.h>
0015 #include <linux/dma-mapping.h>
0016 #include <linux/interrupt.h>
0017 #include <linux/iopoll.h>
0018 #include <linux/litex.h>
0019 #include <linux/mod_devicetable.h>
0020 #include <linux/module.h>
0021 #include <linux/platform_device.h>
0022
0023 #include <linux/mmc/host.h>
0024 #include <linux/mmc/mmc.h>
0025 #include <linux/mmc/sd.h>
0026
0027 #define LITEX_PHY_CARDDETECT 0x00
0028 #define LITEX_PHY_CLOCKERDIV 0x04
0029 #define LITEX_PHY_INITIALIZE 0x08
0030 #define LITEX_PHY_WRITESTATUS 0x0C
0031 #define LITEX_CORE_CMDARG 0x00
0032 #define LITEX_CORE_CMDCMD 0x04
0033 #define LITEX_CORE_CMDSND 0x08
0034 #define LITEX_CORE_CMDRSP 0x0C
0035 #define LITEX_CORE_CMDEVT 0x1C
0036 #define LITEX_CORE_DATEVT 0x20
0037 #define LITEX_CORE_BLKLEN 0x24
0038 #define LITEX_CORE_BLKCNT 0x28
0039 #define LITEX_BLK2MEM_BASE 0x00
0040 #define LITEX_BLK2MEM_LEN 0x08
0041 #define LITEX_BLK2MEM_ENA 0x0C
0042 #define LITEX_BLK2MEM_DONE 0x10
0043 #define LITEX_BLK2MEM_LOOP 0x14
0044 #define LITEX_MEM2BLK_BASE 0x00
0045 #define LITEX_MEM2BLK_LEN 0x08
0046 #define LITEX_MEM2BLK_ENA 0x0C
0047 #define LITEX_MEM2BLK_DONE 0x10
0048 #define LITEX_MEM2BLK_LOOP 0x14
0049 #define LITEX_MEM2BLK 0x18
0050 #define LITEX_IRQ_STATUS 0x00
0051 #define LITEX_IRQ_PENDING 0x04
0052 #define LITEX_IRQ_ENABLE 0x08
0053
0054 #define SD_CTL_DATA_XFER_NONE 0
0055 #define SD_CTL_DATA_XFER_READ 1
0056 #define SD_CTL_DATA_XFER_WRITE 2
0057
0058 #define SD_CTL_RESP_NONE 0
0059 #define SD_CTL_RESP_SHORT 1
0060 #define SD_CTL_RESP_LONG 2
0061 #define SD_CTL_RESP_SHORT_BUSY 3
0062
0063 #define SD_BIT_DONE BIT(0)
0064 #define SD_BIT_WR_ERR BIT(1)
0065 #define SD_BIT_TIMEOUT BIT(2)
0066 #define SD_BIT_CRC_ERR BIT(3)
0067
0068 #define SD_SLEEP_US 5
0069 #define SD_TIMEOUT_US 20000
0070
0071 #define SDIRQ_CARD_DETECT 1
0072 #define SDIRQ_SD_TO_MEM_DONE 2
0073 #define SDIRQ_MEM_TO_SD_DONE 4
0074 #define SDIRQ_CMD_DONE 8
0075
0076 struct litex_mmc_host {
0077 struct mmc_host *mmc;
0078
0079 void __iomem *sdphy;
0080 void __iomem *sdcore;
0081 void __iomem *sdreader;
0082 void __iomem *sdwriter;
0083 void __iomem *sdirq;
0084
0085 void *buffer;
0086 size_t buf_size;
0087 dma_addr_t dma;
0088
0089 struct completion cmd_done;
0090 int irq;
0091
0092 unsigned int ref_clk;
0093 unsigned int sd_clk;
0094
0095 u32 resp[4];
0096 u16 rca;
0097
0098 bool is_bus_width_set;
0099 bool app_cmd;
0100 };
0101
0102 static int litex_mmc_sdcard_wait_done(void __iomem *reg, struct device *dev)
0103 {
0104 u8 evt;
0105 int ret;
0106
0107 ret = readx_poll_timeout(litex_read8, reg, evt, evt & SD_BIT_DONE,
0108 SD_SLEEP_US, SD_TIMEOUT_US);
0109 if (ret)
0110 return ret;
0111 if (evt == SD_BIT_DONE)
0112 return 0;
0113 if (evt & SD_BIT_WR_ERR)
0114 return -EIO;
0115 if (evt & SD_BIT_TIMEOUT)
0116 return -ETIMEDOUT;
0117 if (evt & SD_BIT_CRC_ERR)
0118 return -EILSEQ;
0119 dev_err(dev, "%s: unknown error (evt=%x)\n", __func__, evt);
0120 return -EINVAL;
0121 }
0122
0123 static int litex_mmc_send_cmd(struct litex_mmc_host *host,
0124 u8 cmd, u32 arg, u8 response_len, u8 transfer)
0125 {
0126 struct device *dev = mmc_dev(host->mmc);
0127 void __iomem *reg;
0128 int ret;
0129 u8 evt;
0130
0131 litex_write32(host->sdcore + LITEX_CORE_CMDARG, arg);
0132 litex_write32(host->sdcore + LITEX_CORE_CMDCMD,
0133 cmd << 8 | transfer << 5 | response_len);
0134 litex_write8(host->sdcore + LITEX_CORE_CMDSND, 1);
0135
0136
0137
0138
0139
0140 if (host->irq > 0 &&
0141 (transfer != SD_CTL_DATA_XFER_NONE ||
0142 response_len == SD_CTL_RESP_SHORT_BUSY)) {
0143 reinit_completion(&host->cmd_done);
0144 litex_write32(host->sdirq + LITEX_IRQ_ENABLE,
0145 SDIRQ_CMD_DONE | SDIRQ_CARD_DETECT);
0146 wait_for_completion(&host->cmd_done);
0147 }
0148
0149 ret = litex_mmc_sdcard_wait_done(host->sdcore + LITEX_CORE_CMDEVT, dev);
0150 if (ret) {
0151 dev_err(dev, "Command (cmd %d) error, status %d\n", cmd, ret);
0152 return ret;
0153 }
0154
0155 if (response_len != SD_CTL_RESP_NONE) {
0156
0157
0158
0159
0160 memcpy_fromio(host->resp,
0161 host->sdcore + LITEX_CORE_CMDRSP, 0x10);
0162 }
0163
0164 if (!host->app_cmd && cmd == SD_SEND_RELATIVE_ADDR)
0165 host->rca = (host->resp[3] >> 16);
0166
0167 host->app_cmd = (cmd == MMC_APP_CMD);
0168
0169 if (transfer == SD_CTL_DATA_XFER_NONE)
0170 return ret;
0171
0172 ret = litex_mmc_sdcard_wait_done(host->sdcore + LITEX_CORE_DATEVT, dev);
0173 if (ret) {
0174 dev_err(dev, "Data xfer (cmd %d) error, status %d\n", cmd, ret);
0175 return ret;
0176 }
0177
0178
0179 reg = (transfer == SD_CTL_DATA_XFER_READ) ?
0180 host->sdreader + LITEX_BLK2MEM_DONE :
0181 host->sdwriter + LITEX_MEM2BLK_DONE;
0182 ret = readx_poll_timeout(litex_read8, reg, evt, evt & SD_BIT_DONE,
0183 SD_SLEEP_US, SD_TIMEOUT_US);
0184 if (ret)
0185 dev_err(dev, "DMA timeout (cmd %d)\n", cmd);
0186
0187 return ret;
0188 }
0189
0190 static int litex_mmc_send_app_cmd(struct litex_mmc_host *host)
0191 {
0192 return litex_mmc_send_cmd(host, MMC_APP_CMD, host->rca << 16,
0193 SD_CTL_RESP_SHORT, SD_CTL_DATA_XFER_NONE);
0194 }
0195
0196 static int litex_mmc_send_set_bus_w_cmd(struct litex_mmc_host *host, u32 width)
0197 {
0198 return litex_mmc_send_cmd(host, SD_APP_SET_BUS_WIDTH, width,
0199 SD_CTL_RESP_SHORT, SD_CTL_DATA_XFER_NONE);
0200 }
0201
0202 static int litex_mmc_set_bus_width(struct litex_mmc_host *host)
0203 {
0204 bool app_cmd_sent;
0205 int ret;
0206
0207 if (host->is_bus_width_set)
0208 return 0;
0209
0210
0211 app_cmd_sent = host->app_cmd;
0212 if (!app_cmd_sent) {
0213 ret = litex_mmc_send_app_cmd(host);
0214 if (ret)
0215 return ret;
0216 }
0217
0218
0219 ret = litex_mmc_send_set_bus_w_cmd(host, MMC_BUS_WIDTH_4);
0220 if (ret)
0221 return ret;
0222
0223
0224 if (app_cmd_sent) {
0225 ret = litex_mmc_send_app_cmd(host);
0226 if (ret)
0227 return ret;
0228 }
0229
0230 host->is_bus_width_set = true;
0231
0232 return 0;
0233 }
0234
0235 static int litex_mmc_get_cd(struct mmc_host *mmc)
0236 {
0237 struct litex_mmc_host *host = mmc_priv(mmc);
0238 int ret;
0239
0240 if (!mmc_card_is_removable(mmc))
0241 return 1;
0242
0243 ret = !litex_read8(host->sdphy + LITEX_PHY_CARDDETECT);
0244 if (ret)
0245 return ret;
0246
0247
0248 host->is_bus_width_set = false;
0249
0250 return 0;
0251 }
0252
0253 static irqreturn_t litex_mmc_interrupt(int irq, void *arg)
0254 {
0255 struct mmc_host *mmc = arg;
0256 struct litex_mmc_host *host = mmc_priv(mmc);
0257 u32 pending = litex_read32(host->sdirq + LITEX_IRQ_PENDING);
0258 irqreturn_t ret = IRQ_NONE;
0259
0260
0261 if (pending & SDIRQ_CARD_DETECT) {
0262 litex_write32(host->sdirq + LITEX_IRQ_PENDING,
0263 SDIRQ_CARD_DETECT);
0264 mmc_detect_change(mmc, msecs_to_jiffies(10));
0265 ret = IRQ_HANDLED;
0266 }
0267
0268
0269 if (pending & SDIRQ_CMD_DONE) {
0270
0271 litex_write32(host->sdirq + LITEX_IRQ_ENABLE,
0272 SDIRQ_CARD_DETECT);
0273 complete(&host->cmd_done);
0274 ret = IRQ_HANDLED;
0275 }
0276
0277 return ret;
0278 }
0279
0280 static u32 litex_mmc_response_len(struct mmc_command *cmd)
0281 {
0282 if (cmd->flags & MMC_RSP_136)
0283 return SD_CTL_RESP_LONG;
0284 if (!(cmd->flags & MMC_RSP_PRESENT))
0285 return SD_CTL_RESP_NONE;
0286 if (cmd->flags & MMC_RSP_BUSY)
0287 return SD_CTL_RESP_SHORT_BUSY;
0288 return SD_CTL_RESP_SHORT;
0289 }
0290
0291 static void litex_mmc_do_dma(struct litex_mmc_host *host, struct mmc_data *data,
0292 unsigned int *len, bool *direct, u8 *transfer)
0293 {
0294 struct device *dev = mmc_dev(host->mmc);
0295 dma_addr_t dma;
0296 int sg_count;
0297
0298
0299
0300
0301
0302
0303 dma = host->dma;
0304 *len = data->blksz * data->blocks;
0305 sg_count = dma_map_sg(dev, data->sg, data->sg_len,
0306 mmc_get_dma_dir(data));
0307 if (sg_count == 1) {
0308 dma = sg_dma_address(data->sg);
0309 *len = sg_dma_len(data->sg);
0310 *direct = true;
0311 } else if (*len > host->buf_size)
0312 *len = host->buf_size;
0313
0314 if (data->flags & MMC_DATA_READ) {
0315 litex_write8(host->sdreader + LITEX_BLK2MEM_ENA, 0);
0316 litex_write64(host->sdreader + LITEX_BLK2MEM_BASE, dma);
0317 litex_write32(host->sdreader + LITEX_BLK2MEM_LEN, *len);
0318 litex_write8(host->sdreader + LITEX_BLK2MEM_ENA, 1);
0319 *transfer = SD_CTL_DATA_XFER_READ;
0320 } else if (data->flags & MMC_DATA_WRITE) {
0321 if (!*direct)
0322 sg_copy_to_buffer(data->sg, data->sg_len,
0323 host->buffer, *len);
0324 litex_write8(host->sdwriter + LITEX_MEM2BLK_ENA, 0);
0325 litex_write64(host->sdwriter + LITEX_MEM2BLK_BASE, dma);
0326 litex_write32(host->sdwriter + LITEX_MEM2BLK_LEN, *len);
0327 litex_write8(host->sdwriter + LITEX_MEM2BLK_ENA, 1);
0328 *transfer = SD_CTL_DATA_XFER_WRITE;
0329 } else {
0330 dev_warn(dev, "Data present w/o read or write flag.\n");
0331
0332 }
0333
0334 litex_write16(host->sdcore + LITEX_CORE_BLKLEN, data->blksz);
0335 litex_write32(host->sdcore + LITEX_CORE_BLKCNT, data->blocks);
0336 }
0337
0338 static void litex_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
0339 {
0340 struct litex_mmc_host *host = mmc_priv(mmc);
0341 struct device *dev = mmc_dev(mmc);
0342 struct mmc_command *cmd = mrq->cmd;
0343 struct mmc_command *sbc = mrq->sbc;
0344 struct mmc_data *data = mrq->data;
0345 struct mmc_command *stop = mrq->stop;
0346 unsigned int retries = cmd->retries;
0347 unsigned int len = 0;
0348 bool direct = false;
0349 u32 response_len = litex_mmc_response_len(cmd);
0350 u8 transfer = SD_CTL_DATA_XFER_NONE;
0351
0352
0353 if (!litex_mmc_get_cd(mmc)) {
0354 cmd->error = -ENOMEDIUM;
0355 mmc_request_done(mmc, mrq);
0356 return;
0357 }
0358
0359
0360 if (sbc) {
0361 sbc->error = litex_mmc_send_cmd(host, sbc->opcode, sbc->arg,
0362 litex_mmc_response_len(sbc),
0363 SD_CTL_DATA_XFER_NONE);
0364 if (sbc->error) {
0365 host->is_bus_width_set = false;
0366 mmc_request_done(mmc, mrq);
0367 return;
0368 }
0369 }
0370
0371 if (data) {
0372
0373
0374
0375
0376
0377
0378 cmd->error = litex_mmc_set_bus_width(host);
0379 if (cmd->error) {
0380 dev_err(dev, "Can't set bus width!\n");
0381 mmc_request_done(mmc, mrq);
0382 return;
0383 }
0384
0385 litex_mmc_do_dma(host, data, &len, &direct, &transfer);
0386 }
0387
0388 do {
0389 cmd->error = litex_mmc_send_cmd(host, cmd->opcode, cmd->arg,
0390 response_len, transfer);
0391 } while (cmd->error && retries-- > 0);
0392
0393 if (cmd->error) {
0394
0395 host->is_bus_width_set = false;
0396 }
0397
0398 if (response_len == SD_CTL_RESP_SHORT) {
0399
0400 cmd->resp[0] = host->resp[3];
0401 cmd->resp[1] = host->resp[2] & 0xFF;
0402 } else if (response_len == SD_CTL_RESP_LONG) {
0403 cmd->resp[0] = host->resp[0];
0404 cmd->resp[1] = host->resp[1];
0405 cmd->resp[2] = host->resp[2];
0406 cmd->resp[3] = host->resp[3];
0407 }
0408
0409
0410 if (stop && (cmd->error || !sbc)) {
0411 stop->error = litex_mmc_send_cmd(host, stop->opcode, stop->arg,
0412 litex_mmc_response_len(stop),
0413 SD_CTL_DATA_XFER_NONE);
0414 if (stop->error)
0415 host->is_bus_width_set = false;
0416 }
0417
0418 if (data) {
0419 dma_unmap_sg(dev, data->sg, data->sg_len,
0420 mmc_get_dma_dir(data));
0421 }
0422
0423 if (!cmd->error && transfer != SD_CTL_DATA_XFER_NONE) {
0424 data->bytes_xfered = min(len, mmc->max_req_size);
0425 if (transfer == SD_CTL_DATA_XFER_READ && !direct) {
0426 sg_copy_from_buffer(data->sg, sg_nents(data->sg),
0427 host->buffer, data->bytes_xfered);
0428 }
0429 }
0430
0431 mmc_request_done(mmc, mrq);
0432 }
0433
0434 static void litex_mmc_setclk(struct litex_mmc_host *host, unsigned int freq)
0435 {
0436 struct device *dev = mmc_dev(host->mmc);
0437 u32 div;
0438
0439 div = freq ? host->ref_clk / freq : 256U;
0440 div = roundup_pow_of_two(div);
0441 div = clamp(div, 2U, 256U);
0442 dev_dbg(dev, "sd_clk_freq=%d: set to %d via div=%d\n",
0443 freq, host->ref_clk / div, div);
0444 litex_write16(host->sdphy + LITEX_PHY_CLOCKERDIV, div);
0445 host->sd_clk = freq;
0446 }
0447
0448 static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
0449 {
0450 struct litex_mmc_host *host = mmc_priv(mmc);
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460 if (ios->clock != host->sd_clk)
0461 litex_mmc_setclk(host, ios->clock);
0462 }
0463
0464 static const struct mmc_host_ops litex_mmc_ops = {
0465 .get_cd = litex_mmc_get_cd,
0466 .request = litex_mmc_request,
0467 .set_ios = litex_mmc_set_ios,
0468 };
0469
0470 static int litex_mmc_irq_init(struct platform_device *pdev,
0471 struct litex_mmc_host *host)
0472 {
0473 struct device *dev = mmc_dev(host->mmc);
0474 int ret;
0475
0476 ret = platform_get_irq_optional(pdev, 0);
0477 if (ret < 0 && ret != -ENXIO)
0478 return ret;
0479 if (ret > 0)
0480 host->irq = ret;
0481 else {
0482 dev_warn(dev, "Failed to get IRQ, using polling\n");
0483 goto use_polling;
0484 }
0485
0486 host->sdirq = devm_platform_ioremap_resource_byname(pdev, "irq");
0487 if (IS_ERR(host->sdirq))
0488 return PTR_ERR(host->sdirq);
0489
0490 ret = devm_request_irq(dev, host->irq, litex_mmc_interrupt, 0,
0491 "litex-mmc", host->mmc);
0492 if (ret < 0) {
0493 dev_warn(dev, "IRQ request error %d, using polling\n", ret);
0494 goto use_polling;
0495 }
0496
0497
0498 litex_write32(host->sdirq + LITEX_IRQ_PENDING, SDIRQ_CARD_DETECT);
0499 litex_write32(host->sdirq + LITEX_IRQ_ENABLE, SDIRQ_CARD_DETECT);
0500
0501 return 0;
0502
0503 use_polling:
0504 host->mmc->caps |= MMC_CAP_NEEDS_POLL;
0505 return 0;
0506 }
0507
0508 static void litex_mmc_free_host_wrapper(void *mmc)
0509 {
0510 mmc_free_host(mmc);
0511 }
0512
0513 static int litex_mmc_probe(struct platform_device *pdev)
0514 {
0515 struct device *dev = &pdev->dev;
0516 struct litex_mmc_host *host;
0517 struct mmc_host *mmc;
0518 struct clk *clk;
0519 int ret;
0520
0521
0522
0523
0524
0525
0526
0527 mmc = mmc_alloc_host(sizeof(struct litex_mmc_host), dev);
0528 if (!mmc)
0529 return -ENOMEM;
0530
0531 ret = devm_add_action_or_reset(dev, litex_mmc_free_host_wrapper, mmc);
0532 if (ret)
0533 return dev_err_probe(dev, ret,
0534 "Can't register mmc_free_host action\n");
0535
0536 host = mmc_priv(mmc);
0537 host->mmc = mmc;
0538
0539
0540 clk = devm_clk_get(dev, NULL);
0541 if (IS_ERR(clk))
0542 return dev_err_probe(dev, PTR_ERR(clk), "can't get clock\n");
0543 host->ref_clk = clk_get_rate(clk);
0544 host->sd_clk = 0;
0545
0546
0547
0548
0549
0550
0551 host->is_bus_width_set = false;
0552 host->app_cmd = false;
0553
0554
0555 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
0556 if (ret)
0557 return ret;
0558
0559 host->buf_size = mmc->max_req_size * 2;
0560 host->buffer = dmam_alloc_coherent(dev, host->buf_size,
0561 &host->dma, GFP_KERNEL);
0562 if (host->buffer == NULL)
0563 return -ENOMEM;
0564
0565 host->sdphy = devm_platform_ioremap_resource_byname(pdev, "phy");
0566 if (IS_ERR(host->sdphy))
0567 return PTR_ERR(host->sdphy);
0568
0569 host->sdcore = devm_platform_ioremap_resource_byname(pdev, "core");
0570 if (IS_ERR(host->sdcore))
0571 return PTR_ERR(host->sdcore);
0572
0573 host->sdreader = devm_platform_ioremap_resource_byname(pdev, "reader");
0574 if (IS_ERR(host->sdreader))
0575 return PTR_ERR(host->sdreader);
0576
0577 host->sdwriter = devm_platform_ioremap_resource_byname(pdev, "writer");
0578 if (IS_ERR(host->sdwriter))
0579 return PTR_ERR(host->sdwriter);
0580
0581
0582 litex_write8(host->sdreader + LITEX_BLK2MEM_ENA, 0);
0583 litex_write8(host->sdwriter + LITEX_MEM2BLK_ENA, 0);
0584
0585 init_completion(&host->cmd_done);
0586 ret = litex_mmc_irq_init(pdev, host);
0587 if (ret)
0588 return ret;
0589
0590 mmc->ops = &litex_mmc_ops;
0591
0592 ret = mmc_regulator_get_supply(mmc);
0593 if (ret || mmc->ocr_avail == 0) {
0594 dev_warn(dev, "can't get voltage, defaulting to 3.3V\n");
0595 mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
0596 }
0597
0598
0599
0600
0601
0602 mmc->f_min = 12.5e6;
0603 mmc->f_max = 50e6;
0604
0605 ret = mmc_of_parse(mmc);
0606 if (ret)
0607 return ret;
0608
0609
0610 mmc->caps &= ~MMC_CAP_8_BIT_DATA;
0611 mmc->caps |= MMC_CAP_4_BIT_DATA;
0612
0613
0614 mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY |
0615 MMC_CAP_DRIVER_TYPE_D |
0616 MMC_CAP_CMD23;
0617 mmc->caps2 |= MMC_CAP2_NO_WRITE_PROTECT |
0618 MMC_CAP2_NO_SDIO |
0619 MMC_CAP2_NO_MMC;
0620
0621 platform_set_drvdata(pdev, host);
0622
0623 ret = mmc_add_host(mmc);
0624 if (ret)
0625 return ret;
0626
0627 dev_info(dev, "LiteX MMC controller initialized.\n");
0628 return 0;
0629 }
0630
0631 static int litex_mmc_remove(struct platform_device *pdev)
0632 {
0633 struct litex_mmc_host *host = platform_get_drvdata(pdev);
0634
0635 mmc_remove_host(host->mmc);
0636 return 0;
0637 }
0638
0639 static const struct of_device_id litex_match[] = {
0640 { .compatible = "litex,mmc" },
0641 { }
0642 };
0643 MODULE_DEVICE_TABLE(of, litex_match);
0644
0645 static struct platform_driver litex_mmc_driver = {
0646 .probe = litex_mmc_probe,
0647 .remove = litex_mmc_remove,
0648 .driver = {
0649 .name = "litex-mmc",
0650 .of_match_table = litex_match,
0651 },
0652 };
0653 module_platform_driver(litex_mmc_driver);
0654
0655 MODULE_DESCRIPTION("LiteX SDCard driver");
0656 MODULE_AUTHOR("Antmicro <contact@antmicro.com>");
0657 MODULE_AUTHOR("Kamil Rakoczy <krakoczy@antmicro.com>");
0658 MODULE_AUTHOR("Maciej Dudek <mdudek@internships.antmicro.com>");
0659 MODULE_AUTHOR("Paul Mackerras <paulus@ozlabs.org>");
0660 MODULE_AUTHOR("Gabriel Somlo <gsomlo@gmail.com>");
0661 MODULE_LICENSE("GPL v2");