This source file includes following definitions.
- mtk_desc_ring_link
- mtk_dfe_dse_buf_setup
- mtk_dfe_dse_state_check
- mtk_dfe_dse_reset
- mtk_cmd_desc_ring_setup
- mtk_res_desc_ring_setup
- mtk_packet_engine_setup
- mtk_aic_cap_check
- mtk_aic_init
- mtk_accelerator_init
- mtk_desc_dma_free
- mtk_desc_ring_alloc
- mtk_crypto_probe
- mtk_crypto_remove
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 #include <linux/clk.h>
   9 #include <linux/init.h>
  10 #include <linux/kernel.h>
  11 #include <linux/module.h>
  12 #include <linux/mod_devicetable.h>
  13 #include <linux/platform_device.h>
  14 #include <linux/pm_runtime.h>
  15 #include "mtk-platform.h"
  16 
  17 #define MTK_BURST_SIZE_MSK              GENMASK(7, 4)
  18 #define MTK_BURST_SIZE(x)               ((x) << 4)
  19 #define MTK_DESC_SIZE(x)                ((x) << 0)
  20 #define MTK_DESC_OFFSET(x)              ((x) << 16)
  21 #define MTK_DESC_FETCH_SIZE(x)          ((x) << 0)
  22 #define MTK_DESC_FETCH_THRESH(x)        ((x) << 16)
  23 #define MTK_DESC_OVL_IRQ_EN             BIT(25)
  24 #define MTK_DESC_ATP_PRESENT            BIT(30)
  25 
  26 #define MTK_DFSE_IDLE                   GENMASK(3, 0)
  27 #define MTK_DFSE_THR_CTRL_EN            BIT(30)
  28 #define MTK_DFSE_THR_CTRL_RESET         BIT(31)
  29 #define MTK_DFSE_RING_ID(x)             (((x) >> 12) & GENMASK(3, 0))
  30 #define MTK_DFSE_MIN_DATA(x)            ((x) << 0)
  31 #define MTK_DFSE_MAX_DATA(x)            ((x) << 8)
  32 #define MTK_DFE_MIN_CTRL(x)             ((x) << 16)
  33 #define MTK_DFE_MAX_CTRL(x)             ((x) << 24)
  34 
  35 #define MTK_IN_BUF_MIN_THRESH(x)        ((x) << 8)
  36 #define MTK_IN_BUF_MAX_THRESH(x)        ((x) << 12)
  37 #define MTK_OUT_BUF_MIN_THRESH(x)       ((x) << 0)
  38 #define MTK_OUT_BUF_MAX_THRESH(x)       ((x) << 4)
  39 #define MTK_IN_TBUF_SIZE(x)             (((x) >> 4) & GENMASK(3, 0))
  40 #define MTK_IN_DBUF_SIZE(x)             (((x) >> 8) & GENMASK(3, 0))
  41 #define MTK_OUT_DBUF_SIZE(x)            (((x) >> 16) & GENMASK(3, 0))
  42 #define MTK_CMD_FIFO_SIZE(x)            (((x) >> 8) & GENMASK(3, 0))
  43 #define MTK_RES_FIFO_SIZE(x)            (((x) >> 12) & GENMASK(3, 0))
  44 
  45 #define MTK_PE_TK_LOC_AVL               BIT(2)
  46 #define MTK_PE_PROC_HELD                BIT(14)
  47 #define MTK_PE_TK_TIMEOUT_EN            BIT(22)
  48 #define MTK_PE_INPUT_DMA_ERR            BIT(0)
  49 #define MTK_PE_OUTPUT_DMA_ERR           BIT(1)
  50 #define MTK_PE_PKT_PORC_ERR             BIT(2)
  51 #define MTK_PE_PKT_TIMEOUT              BIT(3)
  52 #define MTK_PE_FATAL_ERR                BIT(14)
  53 #define MTK_PE_INPUT_DMA_ERR_EN         BIT(16)
  54 #define MTK_PE_OUTPUT_DMA_ERR_EN        BIT(17)
  55 #define MTK_PE_PKT_PORC_ERR_EN          BIT(18)
  56 #define MTK_PE_PKT_TIMEOUT_EN           BIT(19)
  57 #define MTK_PE_FATAL_ERR_EN             BIT(30)
  58 #define MTK_PE_INT_OUT_EN               BIT(31)
  59 
  60 #define MTK_HIA_SIGNATURE               ((u16)0x35ca)
  61 #define MTK_HIA_DATA_WIDTH(x)           (((x) >> 25) & GENMASK(1, 0))
  62 #define MTK_HIA_DMA_LENGTH(x)           (((x) >> 20) & GENMASK(4, 0))
  63 #define MTK_CDR_STAT_CLR                GENMASK(4, 0)
  64 #define MTK_RDR_STAT_CLR                GENMASK(7, 0)
  65 
  66 #define MTK_AIC_INT_MSK                 GENMASK(5, 0)
  67 #define MTK_AIC_VER_MSK                 (GENMASK(15, 0) | GENMASK(27, 20))
  68 #define MTK_AIC_VER11                   0x011036c9
  69 #define MTK_AIC_VER12                   0x012036c9
  70 #define MTK_AIC_G_CLR                   GENMASK(30, 20)
  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 struct mtk_sys_cap {
 111         
 112         u32 hia_ver;
 113         u32 hia_opt;
 114         
 115         u32 pkt_eng_opt;
 116         
 117         u32 hw_opt;
 118 };
 119 
 120 static void mtk_desc_ring_link(struct mtk_cryp *cryp, u32 mask)
 121 {
 122         
 123         writel(MTK_DFSE_THR_CTRL_EN | mask, cryp->base + DFE_THR_CTRL);
 124         writel(MTK_DFSE_THR_CTRL_EN | mask, cryp->base + DSE_THR_CTRL);
 125 }
 126 
 127 static void mtk_dfe_dse_buf_setup(struct mtk_cryp *cryp,
 128                                   struct mtk_sys_cap *cap)
 129 {
 130         u32 width = MTK_HIA_DATA_WIDTH(cap->hia_opt) + 2;
 131         u32 len = MTK_HIA_DMA_LENGTH(cap->hia_opt) - 1;
 132         u32 ipbuf = min((u32)MTK_IN_DBUF_SIZE(cap->hw_opt) + width, len);
 133         u32 opbuf = min((u32)MTK_OUT_DBUF_SIZE(cap->hw_opt) + width, len);
 134         u32 itbuf = min((u32)MTK_IN_TBUF_SIZE(cap->hw_opt) + width, len);
 135 
 136         writel(MTK_DFSE_MIN_DATA(ipbuf - 1) |
 137                MTK_DFSE_MAX_DATA(ipbuf) |
 138                MTK_DFE_MIN_CTRL(itbuf - 1) |
 139                MTK_DFE_MAX_CTRL(itbuf),
 140                cryp->base + DFE_CFG);
 141 
 142         writel(MTK_DFSE_MIN_DATA(opbuf - 1) |
 143                MTK_DFSE_MAX_DATA(opbuf),
 144                cryp->base + DSE_CFG);
 145 
 146         writel(MTK_IN_BUF_MIN_THRESH(ipbuf - 1) |
 147                MTK_IN_BUF_MAX_THRESH(ipbuf),
 148                cryp->base + PE_IN_DBUF_THRESH);
 149 
 150         writel(MTK_IN_BUF_MIN_THRESH(itbuf - 1) |
 151                MTK_IN_BUF_MAX_THRESH(itbuf),
 152                cryp->base + PE_IN_TBUF_THRESH);
 153 
 154         writel(MTK_OUT_BUF_MIN_THRESH(opbuf - 1) |
 155                MTK_OUT_BUF_MAX_THRESH(opbuf),
 156                cryp->base + PE_OUT_DBUF_THRESH);
 157 
 158         writel(0, cryp->base + PE_OUT_TBUF_THRESH);
 159         writel(0, cryp->base + PE_OUT_BUF_CTRL);
 160 }
 161 
 162 static int mtk_dfe_dse_state_check(struct mtk_cryp *cryp)
 163 {
 164         int ret = -EINVAL;
 165         u32 val;
 166 
 167         
 168         val = readl(cryp->base + DFE_THR_STAT);
 169         if (MTK_DFSE_RING_ID(val) == MTK_DFSE_IDLE) {
 170                 val = readl(cryp->base + DSE_THR_STAT);
 171                 if (MTK_DFSE_RING_ID(val) == MTK_DFSE_IDLE)
 172                         ret = 0;
 173         }
 174 
 175         if (!ret) {
 176                 
 177                 writel(0, cryp->base + DFE_THR_CTRL);
 178                 writel(0, cryp->base + DSE_THR_CTRL);
 179         } else {
 180                 return -EBUSY;
 181         }
 182 
 183         return 0;
 184 }
 185 
 186 static int mtk_dfe_dse_reset(struct mtk_cryp *cryp)
 187 {
 188         int err;
 189 
 190         
 191         writel(MTK_DFSE_THR_CTRL_RESET, cryp->base + DFE_THR_CTRL);
 192         writel(0, cryp->base + DFE_PRIO_0);
 193         writel(0, cryp->base + DFE_PRIO_1);
 194         writel(0, cryp->base + DFE_PRIO_2);
 195         writel(0, cryp->base + DFE_PRIO_3);
 196 
 197         writel(MTK_DFSE_THR_CTRL_RESET, cryp->base + DSE_THR_CTRL);
 198         writel(0, cryp->base + DSE_PRIO_0);
 199         writel(0, cryp->base + DSE_PRIO_1);
 200         writel(0, cryp->base + DSE_PRIO_2);
 201         writel(0, cryp->base + DSE_PRIO_3);
 202 
 203         err = mtk_dfe_dse_state_check(cryp);
 204         if (err)
 205                 return err;
 206 
 207         return 0;
 208 }
 209 
 210 static void mtk_cmd_desc_ring_setup(struct mtk_cryp *cryp,
 211                                     int i, struct mtk_sys_cap *cap)
 212 {
 213         
 214         u32 count =
 215                 ((1 << MTK_CMD_FIFO_SIZE(cap->hia_opt)) / MTK_DESC_SZ) - 1;
 216 
 217         
 218         writel(0, cryp->base + CDR_CFG(i));
 219 
 220         
 221         writel(MTK_CNT_RST, cryp->base + CDR_PREP_COUNT(i));
 222         writel(MTK_CNT_RST, cryp->base + CDR_PROC_COUNT(i));
 223 
 224         writel(0, cryp->base + CDR_PREP_PNTR(i));
 225         writel(0, cryp->base + CDR_PROC_PNTR(i));
 226         writel(0, cryp->base + CDR_DMA_CFG(i));
 227 
 228         
 229         writel(0, cryp->base + CDR_BASE_ADDR_HI(i));
 230         writel(cryp->ring[i]->cmd_dma, cryp->base + CDR_BASE_ADDR_LO(i));
 231 
 232         writel(MTK_DESC_RING_SZ, cryp->base + CDR_RING_SIZE(i));
 233 
 234         
 235         writel(MTK_CDR_STAT_CLR, cryp->base + CDR_STAT(i));
 236 
 237         
 238 
 239 
 240 
 241         writel(MTK_DESC_SIZE(MTK_DESC_SZ) |
 242                    MTK_DESC_OFFSET(MTK_DESC_OFF) |
 243                MTK_DESC_ATP_PRESENT,
 244                cryp->base + CDR_DESC_SIZE(i));
 245 
 246         writel(MTK_DESC_FETCH_SIZE(count * MTK_DESC_OFF) |
 247                    MTK_DESC_FETCH_THRESH(count * MTK_DESC_SZ),
 248                    cryp->base + CDR_CFG(i));
 249 }
 250 
 251 static void mtk_res_desc_ring_setup(struct mtk_cryp *cryp,
 252                                     int i, struct mtk_sys_cap *cap)
 253 {
 254         u32 rndup = 2;
 255         u32 count = ((1 << MTK_RES_FIFO_SIZE(cap->hia_opt)) / rndup) - 1;
 256 
 257         
 258         writel(0, cryp->base + RDR_CFG(i));
 259 
 260         
 261         writel(MTK_CNT_RST, cryp->base + RDR_PREP_COUNT(i));
 262         writel(MTK_CNT_RST, cryp->base + RDR_PROC_COUNT(i));
 263 
 264         writel(0, cryp->base + RDR_PREP_PNTR(i));
 265         writel(0, cryp->base + RDR_PROC_PNTR(i));
 266         writel(0, cryp->base + RDR_DMA_CFG(i));
 267 
 268         
 269         writel(0, cryp->base + RDR_BASE_ADDR_HI(i));
 270         writel(cryp->ring[i]->res_dma, cryp->base + RDR_BASE_ADDR_LO(i));
 271 
 272         writel(MTK_DESC_RING_SZ, cryp->base + RDR_RING_SIZE(i));
 273         writel(MTK_RDR_STAT_CLR, cryp->base + RDR_STAT(i));
 274 
 275         
 276 
 277 
 278 
 279 
 280         writel(MTK_RDR_PROC_THRESH | MTK_RDR_PROC_MODE,
 281                cryp->base + RDR_THRESH(i));
 282 
 283         
 284 
 285 
 286 
 287 
 288         writel(MTK_DESC_SIZE(MTK_DESC_SZ) | MTK_DESC_OFFSET(MTK_DESC_OFF),
 289                cryp->base + RDR_DESC_SIZE(i));
 290 
 291         
 292 
 293 
 294 
 295         writel(MTK_DESC_FETCH_SIZE(count * MTK_DESC_OFF) |
 296                MTK_DESC_FETCH_THRESH(count * rndup) |
 297                MTK_DESC_OVL_IRQ_EN,
 298                    cryp->base + RDR_CFG(i));
 299 }
 300 
 301 static int mtk_packet_engine_setup(struct mtk_cryp *cryp)
 302 {
 303         struct mtk_sys_cap cap;
 304         int i, err;
 305         u32 val;
 306 
 307         cap.hia_ver = readl(cryp->base + HIA_VERSION);
 308         cap.hia_opt = readl(cryp->base + HIA_OPTIONS);
 309         cap.hw_opt = readl(cryp->base + EIP97_OPTIONS);
 310 
 311         if (!(((u16)cap.hia_ver) == MTK_HIA_SIGNATURE))
 312                 return -EINVAL;
 313 
 314         
 315         writel(0, cryp->base + EIP97_MST_CTRL);
 316 
 317         
 318         val = readl(cryp->base + HIA_MST_CTRL);
 319         val &= ~MTK_BURST_SIZE_MSK;
 320         val |= MTK_BURST_SIZE(5);
 321         writel(val, cryp->base + HIA_MST_CTRL);
 322 
 323         err = mtk_dfe_dse_reset(cryp);
 324         if (err) {
 325                 dev_err(cryp->dev, "Failed to reset DFE and DSE.\n");
 326                 return err;
 327         }
 328 
 329         mtk_dfe_dse_buf_setup(cryp, &cap);
 330 
 331         
 332         mtk_desc_ring_link(cryp, 0xf);
 333 
 334         for (i = 0; i < MTK_RING_MAX; i++) {
 335                 mtk_cmd_desc_ring_setup(cryp, i, &cap);
 336                 mtk_res_desc_ring_setup(cryp, i, &cap);
 337         }
 338 
 339         writel(MTK_PE_TK_LOC_AVL | MTK_PE_PROC_HELD | MTK_PE_TK_TIMEOUT_EN,
 340                cryp->base + PE_TOKEN_CTRL_STAT);
 341 
 342         
 343         writel(MTK_AIC_G_CLR, cryp->base + AIC_G_ACK);
 344         writel(MTK_PE_INPUT_DMA_ERR | MTK_PE_OUTPUT_DMA_ERR |
 345                MTK_PE_PKT_PORC_ERR | MTK_PE_PKT_TIMEOUT |
 346                MTK_PE_FATAL_ERR | MTK_PE_INPUT_DMA_ERR_EN |
 347                MTK_PE_OUTPUT_DMA_ERR_EN | MTK_PE_PKT_PORC_ERR_EN |
 348                MTK_PE_PKT_TIMEOUT_EN | MTK_PE_FATAL_ERR_EN |
 349                MTK_PE_INT_OUT_EN,
 350                cryp->base + PE_INTERRUPT_CTRL_STAT);
 351 
 352         return 0;
 353 }
 354 
 355 static int mtk_aic_cap_check(struct mtk_cryp *cryp, int hw)
 356 {
 357         u32 val;
 358 
 359         if (hw == MTK_RING_MAX)
 360                 val = readl(cryp->base + AIC_G_VERSION);
 361         else
 362                 val = readl(cryp->base + AIC_VERSION(hw));
 363 
 364         val &= MTK_AIC_VER_MSK;
 365         if (val != MTK_AIC_VER11 && val != MTK_AIC_VER12)
 366                 return -ENXIO;
 367 
 368         if (hw == MTK_RING_MAX)
 369                 val = readl(cryp->base + AIC_G_OPTIONS);
 370         else
 371                 val = readl(cryp->base + AIC_OPTIONS(hw));
 372 
 373         val &= MTK_AIC_INT_MSK;
 374         if (!val || val > 32)
 375                 return -ENXIO;
 376 
 377         return 0;
 378 }
 379 
 380 static int mtk_aic_init(struct mtk_cryp *cryp, int hw)
 381 {
 382         int err;
 383 
 384         err = mtk_aic_cap_check(cryp, hw);
 385         if (err)
 386                 return err;
 387 
 388         
 389         if (hw == MTK_RING_MAX) {
 390                 writel(0, cryp->base + AIC_G_ENABLE_CTRL);
 391                 writel(0, cryp->base + AIC_G_POL_CTRL);
 392                 writel(0, cryp->base + AIC_G_TYPE_CTRL);
 393                 writel(0, cryp->base + AIC_G_ENABLE_SET);
 394         } else {
 395                 writel(0, cryp->base + AIC_ENABLE_CTRL(hw));
 396                 writel(0, cryp->base + AIC_POL_CTRL(hw));
 397                 writel(0, cryp->base + AIC_TYPE_CTRL(hw));
 398                 writel(0, cryp->base + AIC_ENABLE_SET(hw));
 399         }
 400 
 401         return 0;
 402 }
 403 
 404 static int mtk_accelerator_init(struct mtk_cryp *cryp)
 405 {
 406         int i, err;
 407 
 408         
 409         for (i = 0; i < MTK_IRQ_NUM; i++) {
 410                 err = mtk_aic_init(cryp, i);
 411                 if (err) {
 412                         dev_err(cryp->dev, "Failed to initialize AIC.\n");
 413                         return err;
 414                 }
 415         }
 416 
 417         
 418         err = mtk_packet_engine_setup(cryp);
 419         if (err) {
 420                 dev_err(cryp->dev, "Failed to configure packet engine.\n");
 421                 return err;
 422         }
 423 
 424         return 0;
 425 }
 426 
 427 static void mtk_desc_dma_free(struct mtk_cryp *cryp)
 428 {
 429         int i;
 430 
 431         for (i = 0; i < MTK_RING_MAX; i++) {
 432                 dma_free_coherent(cryp->dev, MTK_DESC_RING_SZ,
 433                                   cryp->ring[i]->res_base,
 434                                   cryp->ring[i]->res_dma);
 435                 dma_free_coherent(cryp->dev, MTK_DESC_RING_SZ,
 436                                   cryp->ring[i]->cmd_base,
 437                                   cryp->ring[i]->cmd_dma);
 438                 kfree(cryp->ring[i]);
 439         }
 440 }
 441 
 442 static int mtk_desc_ring_alloc(struct mtk_cryp *cryp)
 443 {
 444         struct mtk_ring **ring = cryp->ring;
 445         int i, err = ENOMEM;
 446 
 447         for (i = 0; i < MTK_RING_MAX; i++) {
 448                 ring[i] = kzalloc(sizeof(**ring), GFP_KERNEL);
 449                 if (!ring[i])
 450                         goto err_cleanup;
 451 
 452                 ring[i]->cmd_base = dma_alloc_coherent(cryp->dev,
 453                                                        MTK_DESC_RING_SZ,
 454                                                        &ring[i]->cmd_dma,
 455                                                        GFP_KERNEL);
 456                 if (!ring[i]->cmd_base)
 457                         goto err_cleanup;
 458 
 459                 ring[i]->res_base = dma_alloc_coherent(cryp->dev,
 460                                                        MTK_DESC_RING_SZ,
 461                                                        &ring[i]->res_dma,
 462                                                        GFP_KERNEL);
 463                 if (!ring[i]->res_base)
 464                         goto err_cleanup;
 465 
 466                 ring[i]->cmd_next = ring[i]->cmd_base;
 467                 ring[i]->res_next = ring[i]->res_base;
 468         }
 469         return 0;
 470 
 471 err_cleanup:
 472         for (; i--; ) {
 473                 dma_free_coherent(cryp->dev, MTK_DESC_RING_SZ,
 474                                   ring[i]->res_base, ring[i]->res_dma);
 475                 dma_free_coherent(cryp->dev, MTK_DESC_RING_SZ,
 476                                   ring[i]->cmd_base, ring[i]->cmd_dma);
 477                 kfree(ring[i]);
 478         }
 479         return err;
 480 }
 481 
 482 static int mtk_crypto_probe(struct platform_device *pdev)
 483 {
 484         struct mtk_cryp *cryp;
 485         int i, err;
 486 
 487         cryp = devm_kzalloc(&pdev->dev, sizeof(*cryp), GFP_KERNEL);
 488         if (!cryp)
 489                 return -ENOMEM;
 490 
 491         cryp->base = devm_platform_ioremap_resource(pdev, 0);
 492         if (IS_ERR(cryp->base))
 493                 return PTR_ERR(cryp->base);
 494 
 495         for (i = 0; i < MTK_IRQ_NUM; i++) {
 496                 cryp->irq[i] = platform_get_irq(pdev, i);
 497                 if (cryp->irq[i] < 0)
 498                         return cryp->irq[i];
 499         }
 500 
 501         cryp->clk_cryp = devm_clk_get(&pdev->dev, "cryp");
 502         if (IS_ERR(cryp->clk_cryp))
 503                 return -EPROBE_DEFER;
 504 
 505         cryp->dev = &pdev->dev;
 506         pm_runtime_enable(cryp->dev);
 507         pm_runtime_get_sync(cryp->dev);
 508 
 509         err = clk_prepare_enable(cryp->clk_cryp);
 510         if (err)
 511                 goto err_clk_cryp;
 512 
 513         
 514         err = mtk_desc_ring_alloc(cryp);
 515         if (err) {
 516                 dev_err(cryp->dev, "Unable to allocate descriptor rings.\n");
 517                 goto err_resource;
 518         }
 519 
 520         
 521         err = mtk_accelerator_init(cryp);
 522         if (err) {
 523                 dev_err(cryp->dev, "Failed to initialize cryptographic engine.\n");
 524                 goto err_engine;
 525         }
 526 
 527         err = mtk_cipher_alg_register(cryp);
 528         if (err) {
 529                 dev_err(cryp->dev, "Unable to register cipher algorithm.\n");
 530                 goto err_cipher;
 531         }
 532 
 533         err = mtk_hash_alg_register(cryp);
 534         if (err) {
 535                 dev_err(cryp->dev, "Unable to register hash algorithm.\n");
 536                 goto err_hash;
 537         }
 538 
 539         platform_set_drvdata(pdev, cryp);
 540         return 0;
 541 
 542 err_hash:
 543         mtk_cipher_alg_release(cryp);
 544 err_cipher:
 545         mtk_dfe_dse_reset(cryp);
 546 err_engine:
 547         mtk_desc_dma_free(cryp);
 548 err_resource:
 549         clk_disable_unprepare(cryp->clk_cryp);
 550 err_clk_cryp:
 551         pm_runtime_put_sync(cryp->dev);
 552         pm_runtime_disable(cryp->dev);
 553 
 554         return err;
 555 }
 556 
 557 static int mtk_crypto_remove(struct platform_device *pdev)
 558 {
 559         struct mtk_cryp *cryp = platform_get_drvdata(pdev);
 560 
 561         mtk_hash_alg_release(cryp);
 562         mtk_cipher_alg_release(cryp);
 563         mtk_desc_dma_free(cryp);
 564 
 565         clk_disable_unprepare(cryp->clk_cryp);
 566 
 567         pm_runtime_put_sync(cryp->dev);
 568         pm_runtime_disable(cryp->dev);
 569         platform_set_drvdata(pdev, NULL);
 570 
 571         return 0;
 572 }
 573 
 574 static const struct of_device_id of_crypto_id[] = {
 575         { .compatible = "mediatek,eip97-crypto" },
 576         {},
 577 };
 578 MODULE_DEVICE_TABLE(of, of_crypto_id);
 579 
 580 static struct platform_driver mtk_crypto_driver = {
 581         .probe = mtk_crypto_probe,
 582         .remove = mtk_crypto_remove,
 583         .driver = {
 584                    .name = "mtk-crypto",
 585                    .of_match_table = of_crypto_id,
 586         },
 587 };
 588 module_platform_driver(mtk_crypto_driver);
 589 
 590 MODULE_LICENSE("GPL");
 591 MODULE_AUTHOR("Ryder Lee <ryder.lee@mediatek.com>");
 592 MODULE_DESCRIPTION("Cryptographic accelerator driver for EIP97");