Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

soc: mediatek: PMIC wrap: add a slave specific struct

This patch adds a new struct pwrap_slv_type that we use to store the slave
specific data. The patch adds 2 new helper functions to access the dew
registers. The slave type is looked up via the wrappers child node.

Signed-off-by: John Crispin <blogic@openwrt.org>
Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>

authored by

John Crispin and committed by
Matthias Brugger
b28d78cd 25269cef

+112 -47
+112 -47
drivers/soc/mediatek/mtk-pmic-wrap.c
··· 69 69 PWRAP_WDT_SRC_EN_HARB_STAUPD_DLE | \ 70 70 PWRAP_WDT_SRC_EN_HARB_STAUPD_ALE) 71 71 72 - /* macro for slave device wrapper registers */ 73 - #define PWRAP_DEW_BASE 0xbc00 74 - #define PWRAP_DEW_EVENT_OUT_EN (PWRAP_DEW_BASE + 0x0) 75 - #define PWRAP_DEW_DIO_EN (PWRAP_DEW_BASE + 0x2) 76 - #define PWRAP_DEW_EVENT_SRC_EN (PWRAP_DEW_BASE + 0x4) 77 - #define PWRAP_DEW_EVENT_SRC (PWRAP_DEW_BASE + 0x6) 78 - #define PWRAP_DEW_EVENT_FLAG (PWRAP_DEW_BASE + 0x8) 79 - #define PWRAP_DEW_READ_TEST (PWRAP_DEW_BASE + 0xa) 80 - #define PWRAP_DEW_WRITE_TEST (PWRAP_DEW_BASE + 0xc) 81 - #define PWRAP_DEW_CRC_EN (PWRAP_DEW_BASE + 0xe) 82 - #define PWRAP_DEW_CRC_VAL (PWRAP_DEW_BASE + 0x10) 83 - #define PWRAP_DEW_MON_GRP_SEL (PWRAP_DEW_BASE + 0x12) 84 - #define PWRAP_DEW_MON_FLAG_SEL (PWRAP_DEW_BASE + 0x14) 85 - #define PWRAP_DEW_EVENT_TEST (PWRAP_DEW_BASE + 0x16) 86 - #define PWRAP_DEW_CIPHER_KEY_SEL (PWRAP_DEW_BASE + 0x18) 87 - #define PWRAP_DEW_CIPHER_IV_SEL (PWRAP_DEW_BASE + 0x1a) 88 - #define PWRAP_DEW_CIPHER_LOAD (PWRAP_DEW_BASE + 0x1c) 89 - #define PWRAP_DEW_CIPHER_START (PWRAP_DEW_BASE + 0x1e) 90 - #define PWRAP_DEW_CIPHER_RDY (PWRAP_DEW_BASE + 0x20) 91 - #define PWRAP_DEW_CIPHER_MODE (PWRAP_DEW_BASE + 0x22) 92 - #define PWRAP_DEW_CIPHER_SWRST (PWRAP_DEW_BASE + 0x24) 93 - #define PWRAP_MT8173_DEW_CIPHER_IV0 (PWRAP_DEW_BASE + 0x26) 94 - #define PWRAP_MT8173_DEW_CIPHER_IV1 (PWRAP_DEW_BASE + 0x28) 95 - #define PWRAP_MT8173_DEW_CIPHER_IV2 (PWRAP_DEW_BASE + 0x2a) 96 - #define PWRAP_MT8173_DEW_CIPHER_IV3 (PWRAP_DEW_BASE + 0x2c) 97 - #define PWRAP_MT8173_DEW_CIPHER_IV4 (PWRAP_DEW_BASE + 0x2e) 98 - #define PWRAP_MT8173_DEW_CIPHER_IV5 (PWRAP_DEW_BASE + 0x30) 72 + /* defines for slave device wrapper registers */ 73 + enum dew_regs { 74 + PWRAP_DEW_BASE, 75 + PWRAP_DEW_DIO_EN, 76 + PWRAP_DEW_READ_TEST, 77 + PWRAP_DEW_WRITE_TEST, 78 + PWRAP_DEW_CRC_EN, 79 + PWRAP_DEW_CRC_VAL, 80 + PWRAP_DEW_MON_GRP_SEL, 81 + PWRAP_DEW_CIPHER_KEY_SEL, 82 + PWRAP_DEW_CIPHER_IV_SEL, 83 + PWRAP_DEW_CIPHER_RDY, 84 + PWRAP_DEW_CIPHER_MODE, 85 + PWRAP_DEW_CIPHER_SWRST, 86 + 87 + /* MT6397 only regs */ 88 + PWRAP_DEW_EVENT_OUT_EN, 89 + PWRAP_DEW_EVENT_SRC_EN, 90 + PWRAP_DEW_EVENT_SRC, 91 + PWRAP_DEW_EVENT_FLAG, 92 + PWRAP_DEW_MON_FLAG_SEL, 93 + PWRAP_DEW_EVENT_TEST, 94 + PWRAP_DEW_CIPHER_LOAD, 95 + PWRAP_DEW_CIPHER_START, 96 + }; 97 + 98 + static const u32 mt6397_regs[] = { 99 + [PWRAP_DEW_BASE] = 0xbc00, 100 + [PWRAP_DEW_EVENT_OUT_EN] = 0xbc00, 101 + [PWRAP_DEW_DIO_EN] = 0xbc02, 102 + [PWRAP_DEW_EVENT_SRC_EN] = 0xbc04, 103 + [PWRAP_DEW_EVENT_SRC] = 0xbc06, 104 + [PWRAP_DEW_EVENT_FLAG] = 0xbc08, 105 + [PWRAP_DEW_READ_TEST] = 0xbc0a, 106 + [PWRAP_DEW_WRITE_TEST] = 0xbc0c, 107 + [PWRAP_DEW_CRC_EN] = 0xbc0e, 108 + [PWRAP_DEW_CRC_VAL] = 0xbc10, 109 + [PWRAP_DEW_MON_GRP_SEL] = 0xbc12, 110 + [PWRAP_DEW_MON_FLAG_SEL] = 0xbc14, 111 + [PWRAP_DEW_EVENT_TEST] = 0xbc16, 112 + [PWRAP_DEW_CIPHER_KEY_SEL] = 0xbc18, 113 + [PWRAP_DEW_CIPHER_IV_SEL] = 0xbc1a, 114 + [PWRAP_DEW_CIPHER_LOAD] = 0xbc1c, 115 + [PWRAP_DEW_CIPHER_START] = 0xbc1e, 116 + [PWRAP_DEW_CIPHER_RDY] = 0xbc20, 117 + [PWRAP_DEW_CIPHER_MODE] = 0xbc22, 118 + [PWRAP_DEW_CIPHER_SWRST] = 0xbc24, 119 + }; 99 120 100 121 enum pwrap_regs { 101 122 PWRAP_MUX_SEL, ··· 370 349 [PWRAP_DCM_DBC_PRD] = 0x160, 371 350 }; 372 351 352 + enum pmic_type { 353 + PMIC_MT6397, 354 + }; 355 + 373 356 enum pwrap_type { 374 357 PWRAP_MT8135, 375 358 PWRAP_MT8173, 359 + }; 360 + 361 + struct pwrap_slv_type { 362 + const u32 *dew_regs; 363 + enum pmic_type type; 376 364 }; 377 365 378 366 struct pmic_wrapper { ··· 389 359 void __iomem *base; 390 360 struct regmap *regmap; 391 361 const struct pmic_wrapper_type *master; 362 + const struct pwrap_slv_type *slave; 392 363 struct clk *clk_spi; 393 364 struct clk *clk_wrap; 394 365 struct reset_control *rstc; ··· 575 544 576 545 for (i = 0; i < 4; i++) { 577 546 pwrap_writel(wrp, i, PWRAP_SIDLY); 578 - pwrap_read(wrp, PWRAP_DEW_READ_TEST, &rdata); 547 + pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_READ_TEST], 548 + &rdata); 579 549 if (rdata == PWRAP_DEW_READ_TEST_VAL) { 580 550 dev_dbg(wrp->dev, "[Read Test] pass, SIDLY=%x\n", i); 581 551 pass |= 1 << i; ··· 625 593 u32 rdata; 626 594 int ret; 627 595 628 - ret = pwrap_read(wrp, PWRAP_DEW_CIPHER_RDY, &rdata); 596 + ret = pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_RDY], 597 + &rdata); 629 598 if (ret) 630 599 return 0; 631 600 ··· 654 621 } 655 622 656 623 /* Config cipher mode @PMIC */ 657 - pwrap_write(wrp, PWRAP_DEW_CIPHER_SWRST, 0x1); 658 - pwrap_write(wrp, PWRAP_DEW_CIPHER_SWRST, 0x0); 659 - pwrap_write(wrp, PWRAP_DEW_CIPHER_KEY_SEL, 0x1); 660 - pwrap_write(wrp, PWRAP_DEW_CIPHER_IV_SEL, 0x2); 661 - pwrap_write(wrp, PWRAP_DEW_CIPHER_LOAD, 0x1); 662 - pwrap_write(wrp, PWRAP_DEW_CIPHER_START, 0x1); 624 + pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_SWRST], 0x1); 625 + pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_SWRST], 0x0); 626 + pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_KEY_SEL], 0x1); 627 + pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_IV_SEL], 0x2); 628 + pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_LOAD], 0x1); 629 + pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_START], 0x1); 663 630 664 631 /* wait for cipher data ready@AP */ 665 632 ret = pwrap_wait_for_state(wrp, pwrap_is_cipher_ready); ··· 676 643 } 677 644 678 645 /* wait for cipher mode idle */ 679 - pwrap_write(wrp, PWRAP_DEW_CIPHER_MODE, 0x1); 646 + pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_MODE], 0x1); 680 647 ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle); 681 648 if (ret) { 682 649 dev_err(wrp->dev, "cipher mode idle fail, ret=%d\n", ret); ··· 686 653 pwrap_writel(wrp, 1, PWRAP_CIPHER_MODE); 687 654 688 655 /* Write Test */ 689 - if (pwrap_write(wrp, PWRAP_DEW_WRITE_TEST, PWRAP_DEW_WRITE_TEST_VAL) || 690 - pwrap_read(wrp, PWRAP_DEW_WRITE_TEST, &rdata) || 691 - (rdata != PWRAP_DEW_WRITE_TEST_VAL)) { 656 + if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_WRITE_TEST], 657 + PWRAP_DEW_WRITE_TEST_VAL) || 658 + pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_WRITE_TEST], 659 + &rdata) || 660 + (rdata != PWRAP_DEW_WRITE_TEST_VAL)) { 692 661 dev_err(wrp->dev, "rdata=0x%04X\n", rdata); 693 662 return -EFAULT; 694 663 } ··· 712 677 writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN); 713 678 714 679 /* enable PMIC event out and sources */ 715 - if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) || 716 - pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) { 680 + if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_OUT_EN], 681 + 0x1) || 682 + pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_SRC_EN], 683 + 0xffff)) { 717 684 dev_err(wrp->dev, "enable dewrap fail\n"); 718 685 return -EFAULT; 719 686 } ··· 726 689 static int pwrap_mt8173_init_soc_specific(struct pmic_wrapper *wrp) 727 690 { 728 691 /* PMIC_DEWRAP enables */ 729 - if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) || 730 - pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) { 692 + if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_OUT_EN], 693 + 0x1) || 694 + pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_SRC_EN], 695 + 0xffff)) { 731 696 dev_err(wrp->dev, "enable dewrap fail\n"); 732 697 return -EFAULT; 733 698 } ··· 773 734 return ret; 774 735 775 736 /* Enable dual IO mode */ 776 - pwrap_write(wrp, PWRAP_DEW_DIO_EN, 1); 737 + pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_DIO_EN], 1); 777 738 778 739 /* Check IDLE & INIT_DONE in advance */ 779 740 ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle); ··· 785 746 pwrap_writel(wrp, 1, PWRAP_DIO_EN); 786 747 787 748 /* Read Test */ 788 - pwrap_read(wrp, PWRAP_DEW_READ_TEST, &rdata); 749 + pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_READ_TEST], &rdata); 789 750 if (rdata != PWRAP_DEW_READ_TEST_VAL) { 790 751 dev_err(wrp->dev, "Read test failed after switch to DIO mode: 0x%04x != 0x%04x\n", 791 752 PWRAP_DEW_READ_TEST_VAL, rdata); ··· 798 759 return ret; 799 760 800 761 /* Signature checking - using CRC */ 801 - if (pwrap_write(wrp, PWRAP_DEW_CRC_EN, 0x1)) 762 + if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_EN], 0x1)) 802 763 return -EFAULT; 803 764 804 765 pwrap_writel(wrp, 0x1, PWRAP_CRC_EN); 805 766 pwrap_writel(wrp, 0x0, PWRAP_SIG_MODE); 806 - pwrap_writel(wrp, PWRAP_DEW_CRC_VAL, PWRAP_SIG_ADR); 767 + pwrap_writel(wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_VAL], 768 + PWRAP_SIG_ADR); 807 769 pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN); 808 770 809 771 if (wrp->master->type == PWRAP_MT8135) ··· 858 818 .max_register = 0xffff, 859 819 }; 860 820 821 + static const struct pwrap_slv_type pmic_mt6397 = { 822 + .dew_regs = mt6397_regs, 823 + .type = PMIC_MT6397, 824 + }; 825 + 826 + static const struct of_device_id of_slave_match_tbl[] = { 827 + { 828 + .compatible = "mediatek,mt6397", 829 + .data = &pmic_mt6397, 830 + }, { 831 + /* sentinel */ 832 + } 833 + }; 834 + MODULE_DEVICE_TABLE(of, of_slave_match_tbl); 835 + 861 836 static struct pmic_wrapper_type pwrap_mt8135 = { 862 837 .regs = mt8135_regs, 863 838 .type = PWRAP_MT8135, ··· 917 862 struct device_node *np = pdev->dev.of_node; 918 863 const struct of_device_id *of_id = 919 864 of_match_device(of_pwrap_match_tbl, &pdev->dev); 865 + const struct of_device_id *of_slave_id = NULL; 920 866 struct resource *res; 867 + 868 + if (pdev->dev.of_node->child) 869 + of_slave_id = of_match_node(of_slave_match_tbl, 870 + pdev->dev.of_node->child); 871 + if (!of_slave_id) { 872 + dev_dbg(&pdev->dev, "slave pmic should be defined in dts\n"); 873 + return -EINVAL; 874 + } 921 875 922 876 wrp = devm_kzalloc(&pdev->dev, sizeof(*wrp), GFP_KERNEL); 923 877 if (!wrp) ··· 935 871 platform_set_drvdata(pdev, wrp); 936 872 937 873 wrp->master = of_id->data; 874 + wrp->slave = of_slave_id->data; 938 875 wrp->dev = &pdev->dev; 939 876 940 877 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pwrap");