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

Merge tag 'tegra-for-4.10-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into next/drivers

soc: tegra: Core SoC changes for v4.10-rc1

This contains mostly cleanup and new feature work on the power
management controller as well as the addition of a Kconfig symbol for
the new Tegra186 (Parker) SoC generation.

* tag 'tegra-for-4.10-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux:
soc/tegra: pmc: Use consistent naming for PM domains
soc/tegra: pmc: Remove genpd when adding provider fails
soc/tegra: pmc: Check return code for pm_genpd_init()
soc/tegra: pmc: Clean-up I/O rail error messages
soc/tegra: pmc: Simplify IO rail bit handling
soc/tegra: pmc: Guard against uninitialised PMC clock
soc/tegra: pmc: Add I/O pad voltage support
soc/tegra: pmc: Use consistent ordering of bit definitions
soc/tegra: pmc: Correct type of variable for tegra_pmc_readl()
soc/tegra: pmc: Use BIT macro for register field definition

Signed-off-by: Olof Johansson <olof@lixom.net>

+414 -138
+319 -107
drivers/soc/tegra/pmc.c
··· 45 45 #include <soc/tegra/pmc.h> 46 46 47 47 #define PMC_CNTRL 0x0 48 - #define PMC_CNTRL_SYSCLK_POLARITY (1 << 10) /* sys clk polarity */ 49 - #define PMC_CNTRL_SYSCLK_OE (1 << 11) /* system clock enable */ 50 - #define PMC_CNTRL_SIDE_EFFECT_LP0 (1 << 14) /* LP0 when CPU pwr gated */ 51 - #define PMC_CNTRL_CPU_PWRREQ_POLARITY (1 << 15) /* CPU pwr req polarity */ 52 - #define PMC_CNTRL_CPU_PWRREQ_OE (1 << 16) /* CPU pwr req enable */ 53 - #define PMC_CNTRL_INTR_POLARITY (1 << 17) /* inverts INTR polarity */ 54 - #define PMC_CNTRL_MAIN_RST (1 << 4) 48 + #define PMC_CNTRL_INTR_POLARITY BIT(17) /* inverts INTR polarity */ 49 + #define PMC_CNTRL_CPU_PWRREQ_OE BIT(16) /* CPU pwr req enable */ 50 + #define PMC_CNTRL_CPU_PWRREQ_POLARITY BIT(15) /* CPU pwr req polarity */ 51 + #define PMC_CNTRL_SIDE_EFFECT_LP0 BIT(14) /* LP0 when CPU pwr gated */ 52 + #define PMC_CNTRL_SYSCLK_OE BIT(11) /* system clock enable */ 53 + #define PMC_CNTRL_SYSCLK_POLARITY BIT(10) /* sys clk polarity */ 54 + #define PMC_CNTRL_MAIN_RST BIT(4) 55 55 56 56 #define DPD_SAMPLE 0x020 57 - #define DPD_SAMPLE_ENABLE (1 << 0) 57 + #define DPD_SAMPLE_ENABLE BIT(0) 58 58 #define DPD_SAMPLE_DISABLE (0 << 0) 59 59 60 60 #define PWRGATE_TOGGLE 0x30 61 - #define PWRGATE_TOGGLE_START (1 << 8) 61 + #define PWRGATE_TOGGLE_START BIT(8) 62 62 63 63 #define REMOVE_CLAMPING 0x34 64 64 65 65 #define PWRGATE_STATUS 0x38 66 66 67 + #define PMC_PWR_DET 0x48 68 + 67 69 #define PMC_SCRATCH0 0x50 68 - #define PMC_SCRATCH0_MODE_RECOVERY (1 << 31) 69 - #define PMC_SCRATCH0_MODE_BOOTLOADER (1 << 30) 70 - #define PMC_SCRATCH0_MODE_RCM (1 << 1) 70 + #define PMC_SCRATCH0_MODE_RECOVERY BIT(31) 71 + #define PMC_SCRATCH0_MODE_BOOTLOADER BIT(30) 72 + #define PMC_SCRATCH0_MODE_RCM BIT(1) 71 73 #define PMC_SCRATCH0_MODE_MASK (PMC_SCRATCH0_MODE_RECOVERY | \ 72 74 PMC_SCRATCH0_MODE_BOOTLOADER | \ 73 75 PMC_SCRATCH0_MODE_RCM) ··· 77 75 #define PMC_CPUPWRGOOD_TIMER 0xc8 78 76 #define PMC_CPUPWROFF_TIMER 0xcc 79 77 78 + #define PMC_PWR_DET_VALUE 0xe4 79 + 80 80 #define PMC_SCRATCH41 0x140 81 81 82 82 #define PMC_SENSOR_CTRL 0x1b0 83 - #define PMC_SENSOR_CTRL_SCRATCH_WRITE (1 << 2) 84 - #define PMC_SENSOR_CTRL_ENABLE_RST (1 << 1) 83 + #define PMC_SENSOR_CTRL_SCRATCH_WRITE BIT(2) 84 + #define PMC_SENSOR_CTRL_ENABLE_RST BIT(1) 85 85 86 86 #define PMC_RST_STATUS 0x1b4 87 87 #define PMC_RST_STATUS_POR 0 ··· 94 90 #define PMC_RST_STATUS_AOTAG 5 95 91 96 92 #define IO_DPD_REQ 0x1b8 97 - #define IO_DPD_REQ_CODE_IDLE (0 << 30) 98 - #define IO_DPD_REQ_CODE_OFF (1 << 30) 99 - #define IO_DPD_REQ_CODE_ON (2 << 30) 100 - #define IO_DPD_REQ_CODE_MASK (3 << 30) 93 + #define IO_DPD_REQ_CODE_IDLE (0U << 30) 94 + #define IO_DPD_REQ_CODE_OFF (1U << 30) 95 + #define IO_DPD_REQ_CODE_ON (2U << 30) 96 + #define IO_DPD_REQ_CODE_MASK (3U << 30) 101 97 102 98 #define IO_DPD_STATUS 0x1bc 103 99 #define IO_DPD2_REQ 0x1c0 ··· 105 101 #define SEL_DPD_TIM 0x1c8 106 102 107 103 #define PMC_SCRATCH54 0x258 108 - #define PMC_SCRATCH54_DATA_SHIFT 8 109 - #define PMC_SCRATCH54_ADDR_SHIFT 0 104 + #define PMC_SCRATCH54_DATA_SHIFT 8 105 + #define PMC_SCRATCH54_ADDR_SHIFT 0 110 106 111 107 #define PMC_SCRATCH55 0x25c 112 - #define PMC_SCRATCH55_RESET_TEGRA (1 << 31) 113 - #define PMC_SCRATCH55_CNTRL_ID_SHIFT 27 114 - #define PMC_SCRATCH55_PINMUX_SHIFT 24 115 - #define PMC_SCRATCH55_16BITOP (1 << 15) 116 - #define PMC_SCRATCH55_CHECKSUM_SHIFT 16 117 - #define PMC_SCRATCH55_I2CSLV1_SHIFT 0 108 + #define PMC_SCRATCH55_RESET_TEGRA BIT(31) 109 + #define PMC_SCRATCH55_CNTRL_ID_SHIFT 27 110 + #define PMC_SCRATCH55_PINMUX_SHIFT 24 111 + #define PMC_SCRATCH55_16BITOP BIT(15) 112 + #define PMC_SCRATCH55_CHECKSUM_SHIFT 16 113 + #define PMC_SCRATCH55_I2CSLV1_SHIFT 0 118 114 119 115 #define GPU_RG_CNTRL 0x2d4 120 116 ··· 128 124 unsigned int num_resets; 129 125 }; 130 126 127 + struct tegra_io_pad_soc { 128 + enum tegra_io_pad id; 129 + unsigned int dpd; 130 + unsigned int voltage; 131 + }; 132 + 131 133 struct tegra_pmc_soc { 132 134 unsigned int num_powergates; 133 135 const char *const *powergates; ··· 142 132 143 133 bool has_tsense_reset; 144 134 bool has_gpu_clamps; 135 + 136 + const struct tegra_io_pad_soc *io_pads; 137 + unsigned int num_io_pads; 145 138 }; 146 139 147 140 /** ··· 250 237 if (!strcmp(name, pmc->soc->powergates[i])) 251 238 return i; 252 239 } 253 - 254 - dev_err(pmc->dev, "powergate %s not found\n", name); 255 240 256 241 return -ENODEV; 257 242 } ··· 467 456 static int tegra_genpd_power_on(struct generic_pm_domain *domain) 468 457 { 469 458 struct tegra_powergate *pg = to_powergate(domain); 470 - struct tegra_pmc *pmc = pg->pmc; 471 459 int err; 472 460 473 461 err = tegra_powergate_power_up(pg, true); 474 462 if (err) 475 - dev_err(pmc->dev, "failed to turn on PM domain %s: %d\n", 476 - pg->genpd.name, err); 463 + pr_err("failed to turn on PM domain %s: %d\n", pg->genpd.name, 464 + err); 477 465 478 466 return err; 479 467 } ··· 480 470 static int tegra_genpd_power_off(struct generic_pm_domain *domain) 481 471 { 482 472 struct tegra_powergate *pg = to_powergate(domain); 483 - struct tegra_pmc *pmc = pg->pmc; 484 473 int err; 485 474 486 475 err = tegra_powergate_power_down(pg); 487 476 if (err) 488 - dev_err(pmc->dev, "failed to turn off PM domain %s: %d\n", 489 - pg->genpd.name, err); 477 + pr_err("failed to turn off PM domain %s: %d\n", 478 + pg->genpd.name, err); 490 479 491 480 return err; 492 481 } ··· 810 801 811 802 id = tegra_powergate_lookup(pmc, np->name); 812 803 if (id < 0) { 813 - dev_err(pmc->dev, "powergate lookup failed for %s: %d\n", 814 - np->name, id); 804 + pr_err("powergate lookup failed for %s: %d\n", np->name, id); 815 805 goto free_mem; 816 806 } 817 807 ··· 830 822 831 823 err = tegra_powergate_of_get_clks(pg, np); 832 824 if (err < 0) { 833 - dev_err(pmc->dev, "failed to get clocks for %s: %d\n", 834 - np->name, err); 825 + pr_err("failed to get clocks for %s: %d\n", np->name, err); 835 826 goto set_available; 836 827 } 837 828 838 829 err = tegra_powergate_of_get_resets(pg, np, off); 839 830 if (err < 0) { 840 - dev_err(pmc->dev, "failed to get resets for %s: %d\n", 841 - np->name, err); 831 + pr_err("failed to get resets for %s: %d\n", np->name, err); 842 832 goto remove_clks; 843 833 } 844 834 845 - if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) 846 - goto power_on_cleanup; 835 + if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) { 836 + if (off) 837 + WARN_ON(tegra_powergate_power_up(pg, true)); 838 + 839 + goto remove_resets; 840 + } 847 841 848 842 /* 849 843 * FIXME: If XHCI is enabled for Tegra, then power-up the XUSB ··· 856 846 * to be unused. 857 847 */ 858 848 if (IS_ENABLED(CONFIG_USB_XHCI_TEGRA) && 859 - (id == TEGRA_POWERGATE_XUSBA || id == TEGRA_POWERGATE_XUSBC)) 860 - goto power_on_cleanup; 849 + (id == TEGRA_POWERGATE_XUSBA || id == TEGRA_POWERGATE_XUSBC)) { 850 + if (off) 851 + WARN_ON(tegra_powergate_power_up(pg, true)); 861 852 862 - pm_genpd_init(&pg->genpd, NULL, off); 863 - 864 - err = of_genpd_add_provider_simple(np, &pg->genpd); 865 - if (err < 0) { 866 - dev_err(pmc->dev, "failed to add genpd provider for %s: %d\n", 867 - np->name, err); 868 853 goto remove_resets; 869 854 } 870 855 871 - dev_dbg(pmc->dev, "added power domain %s\n", pg->genpd.name); 856 + err = pm_genpd_init(&pg->genpd, NULL, off); 857 + if (err < 0) { 858 + pr_err("failed to initialise PM domain %s: %d\n", np->name, 859 + err); 860 + goto remove_resets; 861 + } 862 + 863 + err = of_genpd_add_provider_simple(np, &pg->genpd); 864 + if (err < 0) { 865 + pr_err("failed to add PM domain provider for %s: %d\n", 866 + np->name, err); 867 + goto remove_genpd; 868 + } 869 + 870 + pr_debug("added PM domain %s\n", pg->genpd.name); 872 871 873 872 return; 874 873 875 - power_on_cleanup: 876 - if (off) 877 - WARN_ON(tegra_powergate_power_up(pg, true)); 874 + remove_genpd: 875 + pm_genpd_remove(&pg->genpd); 878 876 879 877 remove_resets: 880 878 while (pg->num_resets--) ··· 926 908 of_node_put(np); 927 909 } 928 910 929 - static int tegra_io_rail_prepare(unsigned int id, unsigned long *request, 930 - unsigned long *status, unsigned int *bit) 911 + static const struct tegra_io_pad_soc * 912 + tegra_io_pad_find(struct tegra_pmc *pmc, enum tegra_io_pad id) 931 913 { 914 + unsigned int i; 915 + 916 + for (i = 0; i < pmc->soc->num_io_pads; i++) 917 + if (pmc->soc->io_pads[i].id == id) 918 + return &pmc->soc->io_pads[i]; 919 + 920 + return NULL; 921 + } 922 + 923 + static int tegra_io_pad_prepare(enum tegra_io_pad id, unsigned long *request, 924 + unsigned long *status, u32 *mask) 925 + { 926 + const struct tegra_io_pad_soc *pad; 932 927 unsigned long rate, value; 933 928 934 - *bit = id % 32; 929 + pad = tegra_io_pad_find(pmc, id); 930 + if (!pad) { 931 + pr_err("invalid I/O pad ID %u\n", id); 932 + return -ENOENT; 933 + } 935 934 936 - /* 937 - * There are two sets of 30 bits to select IO rails, but bits 30 and 938 - * 31 are control bits rather than IO rail selection bits. 939 - */ 940 - if (id > 63 || *bit == 30 || *bit == 31) 941 - return -EINVAL; 935 + if (pad->dpd == UINT_MAX) 936 + return -ENOTSUPP; 942 937 943 - if (id < 32) { 938 + *mask = BIT(pad->dpd % 32); 939 + 940 + if (pad->dpd < 32) { 944 941 *status = IO_DPD_STATUS; 945 942 *request = IO_DPD_REQ; 946 943 } else { ··· 964 931 } 965 932 966 933 rate = clk_get_rate(pmc->clk); 934 + if (!rate) { 935 + pr_err("failed to get clock rate\n"); 936 + return -ENODEV; 937 + } 967 938 968 939 tegra_pmc_writel(DPD_SAMPLE_ENABLE, DPD_SAMPLE); 969 940 ··· 979 942 return 0; 980 943 } 981 944 982 - static int tegra_io_rail_poll(unsigned long offset, unsigned long mask, 983 - unsigned long val, unsigned long timeout) 945 + static int tegra_io_pad_poll(unsigned long offset, u32 mask, 946 + u32 val, unsigned long timeout) 984 947 { 985 - unsigned long value; 948 + u32 value; 986 949 987 950 timeout = jiffies + msecs_to_jiffies(timeout); 988 951 ··· 997 960 return -ETIMEDOUT; 998 961 } 999 962 1000 - static void tegra_io_rail_unprepare(void) 963 + static void tegra_io_pad_unprepare(void) 1001 964 { 1002 965 tegra_pmc_writel(DPD_SAMPLE_DISABLE, DPD_SAMPLE); 1003 966 } 1004 967 1005 - int tegra_io_rail_power_on(unsigned int id) 968 + /** 969 + * tegra_io_pad_power_enable() - enable power to I/O pad 970 + * @id: Tegra I/O pad ID for which to enable power 971 + * 972 + * Returns: 0 on success or a negative error code on failure. 973 + */ 974 + int tegra_io_pad_power_enable(enum tegra_io_pad id) 1006 975 { 1007 976 unsigned long request, status; 1008 - unsigned int bit; 977 + u32 mask; 1009 978 int err; 1010 979 1011 980 mutex_lock(&pmc->powergates_lock); 1012 981 1013 - err = tegra_io_rail_prepare(id, &request, &status, &bit); 1014 - if (err) 1015 - goto error; 1016 - 1017 - tegra_pmc_writel(IO_DPD_REQ_CODE_OFF | BIT(bit), request); 1018 - 1019 - err = tegra_io_rail_poll(status, BIT(bit), 0, 250); 1020 - if (err) { 1021 - pr_info("tegra_io_rail_poll() failed: %d\n", err); 1022 - goto error; 982 + err = tegra_io_pad_prepare(id, &request, &status, &mask); 983 + if (err < 0) { 984 + pr_err("failed to prepare I/O pad: %d\n", err); 985 + goto unlock; 1023 986 } 1024 987 1025 - tegra_io_rail_unprepare(); 988 + tegra_pmc_writel(IO_DPD_REQ_CODE_OFF | mask, request); 1026 989 1027 - error: 990 + err = tegra_io_pad_poll(status, mask, 0, 250); 991 + if (err < 0) { 992 + pr_err("failed to enable I/O pad: %d\n", err); 993 + goto unlock; 994 + } 995 + 996 + tegra_io_pad_unprepare(); 997 + 998 + unlock: 999 + mutex_unlock(&pmc->powergates_lock); 1000 + return err; 1001 + } 1002 + EXPORT_SYMBOL(tegra_io_pad_power_enable); 1003 + 1004 + /** 1005 + * tegra_io_pad_power_disable() - disable power to I/O pad 1006 + * @id: Tegra I/O pad ID for which to disable power 1007 + * 1008 + * Returns: 0 on success or a negative error code on failure. 1009 + */ 1010 + int tegra_io_pad_power_disable(enum tegra_io_pad id) 1011 + { 1012 + unsigned long request, status; 1013 + u32 mask; 1014 + int err; 1015 + 1016 + mutex_lock(&pmc->powergates_lock); 1017 + 1018 + err = tegra_io_pad_prepare(id, &request, &status, &mask); 1019 + if (err < 0) { 1020 + pr_err("failed to prepare I/O pad: %d\n", err); 1021 + goto unlock; 1022 + } 1023 + 1024 + tegra_pmc_writel(IO_DPD_REQ_CODE_ON | mask, request); 1025 + 1026 + err = tegra_io_pad_poll(status, mask, mask, 250); 1027 + if (err < 0) { 1028 + pr_err("failed to disable I/O pad: %d\n", err); 1029 + goto unlock; 1030 + } 1031 + 1032 + tegra_io_pad_unprepare(); 1033 + 1034 + unlock: 1035 + mutex_unlock(&pmc->powergates_lock); 1036 + return err; 1037 + } 1038 + EXPORT_SYMBOL(tegra_io_pad_power_disable); 1039 + 1040 + int tegra_io_pad_set_voltage(enum tegra_io_pad id, 1041 + enum tegra_io_pad_voltage voltage) 1042 + { 1043 + const struct tegra_io_pad_soc *pad; 1044 + u32 value; 1045 + 1046 + pad = tegra_io_pad_find(pmc, id); 1047 + if (!pad) 1048 + return -ENOENT; 1049 + 1050 + if (pad->voltage == UINT_MAX) 1051 + return -ENOTSUPP; 1052 + 1053 + mutex_lock(&pmc->powergates_lock); 1054 + 1055 + /* write-enable PMC_PWR_DET_VALUE[pad->voltage] */ 1056 + value = tegra_pmc_readl(PMC_PWR_DET); 1057 + value |= BIT(pad->voltage); 1058 + tegra_pmc_writel(value, PMC_PWR_DET); 1059 + 1060 + /* update I/O voltage */ 1061 + value = tegra_pmc_readl(PMC_PWR_DET_VALUE); 1062 + 1063 + if (voltage == TEGRA_IO_PAD_1800000UV) 1064 + value &= ~BIT(pad->voltage); 1065 + else 1066 + value |= BIT(pad->voltage); 1067 + 1068 + tegra_pmc_writel(value, PMC_PWR_DET_VALUE); 1069 + 1028 1070 mutex_unlock(&pmc->powergates_lock); 1029 1071 1030 - return err; 1072 + usleep_range(100, 250); 1073 + 1074 + return 0; 1075 + } 1076 + EXPORT_SYMBOL(tegra_io_pad_set_voltage); 1077 + 1078 + int tegra_io_pad_get_voltage(enum tegra_io_pad id) 1079 + { 1080 + const struct tegra_io_pad_soc *pad; 1081 + u32 value; 1082 + 1083 + pad = tegra_io_pad_find(pmc, id); 1084 + if (!pad) 1085 + return -ENOENT; 1086 + 1087 + if (pad->voltage == UINT_MAX) 1088 + return -ENOTSUPP; 1089 + 1090 + value = tegra_pmc_readl(PMC_PWR_DET_VALUE); 1091 + 1092 + if ((value & BIT(pad->voltage)) == 0) 1093 + return TEGRA_IO_PAD_1800000UV; 1094 + 1095 + return TEGRA_IO_PAD_3300000UV; 1096 + } 1097 + EXPORT_SYMBOL(tegra_io_pad_get_voltage); 1098 + 1099 + /** 1100 + * tegra_io_rail_power_on() - enable power to I/O rail 1101 + * @id: Tegra I/O pad ID for which to enable power 1102 + * 1103 + * See also: tegra_io_pad_power_enable() 1104 + */ 1105 + int tegra_io_rail_power_on(unsigned int id) 1106 + { 1107 + return tegra_io_pad_power_enable(id); 1031 1108 } 1032 1109 EXPORT_SYMBOL(tegra_io_rail_power_on); 1033 1110 1111 + /** 1112 + * tegra_io_rail_power_off() - disable power to I/O rail 1113 + * @id: Tegra I/O pad ID for which to disable power 1114 + * 1115 + * See also: tegra_io_pad_power_disable() 1116 + */ 1034 1117 int tegra_io_rail_power_off(unsigned int id) 1035 1118 { 1036 - unsigned long request, status; 1037 - unsigned int bit; 1038 - int err; 1039 - 1040 - mutex_lock(&pmc->powergates_lock); 1041 - 1042 - err = tegra_io_rail_prepare(id, &request, &status, &bit); 1043 - if (err) { 1044 - pr_info("tegra_io_rail_prepare() failed: %d\n", err); 1045 - goto error; 1046 - } 1047 - 1048 - tegra_pmc_writel(IO_DPD_REQ_CODE_ON | BIT(bit), request); 1049 - 1050 - err = tegra_io_rail_poll(status, BIT(bit), BIT(bit), 250); 1051 - if (err) 1052 - goto error; 1053 - 1054 - tegra_io_rail_unprepare(); 1055 - 1056 - error: 1057 - mutex_unlock(&pmc->powergates_lock); 1058 - 1059 - return err; 1119 + return tegra_io_pad_power_disable(id); 1060 1120 } 1061 1121 EXPORT_SYMBOL(tegra_io_rail_power_off); 1062 1122 ··· 1588 1454 TEGRA_POWERGATE_CPU3, 1589 1455 }; 1590 1456 1457 + static const struct tegra_io_pad_soc tegra124_io_pads[] = { 1458 + { .id = TEGRA_IO_PAD_AUDIO, .dpd = 17, .voltage = UINT_MAX }, 1459 + { .id = TEGRA_IO_PAD_BB, .dpd = 15, .voltage = UINT_MAX }, 1460 + { .id = TEGRA_IO_PAD_CAM, .dpd = 36, .voltage = UINT_MAX }, 1461 + { .id = TEGRA_IO_PAD_COMP, .dpd = 22, .voltage = UINT_MAX }, 1462 + { .id = TEGRA_IO_PAD_CSIA, .dpd = 0, .voltage = UINT_MAX }, 1463 + { .id = TEGRA_IO_PAD_CSIB, .dpd = 1, .voltage = UINT_MAX }, 1464 + { .id = TEGRA_IO_PAD_CSIE, .dpd = 44, .voltage = UINT_MAX }, 1465 + { .id = TEGRA_IO_PAD_DSI, .dpd = 2, .voltage = UINT_MAX }, 1466 + { .id = TEGRA_IO_PAD_DSIB, .dpd = 39, .voltage = UINT_MAX }, 1467 + { .id = TEGRA_IO_PAD_DSIC, .dpd = 40, .voltage = UINT_MAX }, 1468 + { .id = TEGRA_IO_PAD_DSID, .dpd = 41, .voltage = UINT_MAX }, 1469 + { .id = TEGRA_IO_PAD_HDMI, .dpd = 28, .voltage = UINT_MAX }, 1470 + { .id = TEGRA_IO_PAD_HSIC, .dpd = 19, .voltage = UINT_MAX }, 1471 + { .id = TEGRA_IO_PAD_HV, .dpd = 38, .voltage = UINT_MAX }, 1472 + { .id = TEGRA_IO_PAD_LVDS, .dpd = 57, .voltage = UINT_MAX }, 1473 + { .id = TEGRA_IO_PAD_MIPI_BIAS, .dpd = 3, .voltage = UINT_MAX }, 1474 + { .id = TEGRA_IO_PAD_NAND, .dpd = 13, .voltage = UINT_MAX }, 1475 + { .id = TEGRA_IO_PAD_PEX_BIAS, .dpd = 4, .voltage = UINT_MAX }, 1476 + { .id = TEGRA_IO_PAD_PEX_CLK1, .dpd = 5, .voltage = UINT_MAX }, 1477 + { .id = TEGRA_IO_PAD_PEX_CLK2, .dpd = 6, .voltage = UINT_MAX }, 1478 + { .id = TEGRA_IO_PAD_PEX_CNTRL, .dpd = 32, .voltage = UINT_MAX }, 1479 + { .id = TEGRA_IO_PAD_SDMMC1, .dpd = 33, .voltage = UINT_MAX }, 1480 + { .id = TEGRA_IO_PAD_SDMMC3, .dpd = 34, .voltage = UINT_MAX }, 1481 + { .id = TEGRA_IO_PAD_SDMMC4, .dpd = 35, .voltage = UINT_MAX }, 1482 + { .id = TEGRA_IO_PAD_SYS_DDC, .dpd = 58, .voltage = UINT_MAX }, 1483 + { .id = TEGRA_IO_PAD_UART, .dpd = 14, .voltage = UINT_MAX }, 1484 + { .id = TEGRA_IO_PAD_USB0, .dpd = 9, .voltage = UINT_MAX }, 1485 + { .id = TEGRA_IO_PAD_USB1, .dpd = 10, .voltage = UINT_MAX }, 1486 + { .id = TEGRA_IO_PAD_USB2, .dpd = 11, .voltage = UINT_MAX }, 1487 + { .id = TEGRA_IO_PAD_USB_BIAS, .dpd = 12, .voltage = UINT_MAX }, 1488 + }; 1489 + 1591 1490 static const struct tegra_pmc_soc tegra124_pmc_soc = { 1592 1491 .num_powergates = ARRAY_SIZE(tegra124_powergates), 1593 1492 .powergates = tegra124_powergates, ··· 1628 1461 .cpu_powergates = tegra124_cpu_powergates, 1629 1462 .has_tsense_reset = true, 1630 1463 .has_gpu_clamps = true, 1464 + .num_io_pads = ARRAY_SIZE(tegra124_io_pads), 1465 + .io_pads = tegra124_io_pads, 1631 1466 }; 1632 1467 1633 1468 static const char * const tegra210_powergates[] = { ··· 1666 1497 TEGRA_POWERGATE_CPU3, 1667 1498 }; 1668 1499 1500 + static const struct tegra_io_pad_soc tegra210_io_pads[] = { 1501 + { .id = TEGRA_IO_PAD_AUDIO, .dpd = 17, .voltage = 5 }, 1502 + { .id = TEGRA_IO_PAD_AUDIO_HV, .dpd = 61, .voltage = 18 }, 1503 + { .id = TEGRA_IO_PAD_CAM, .dpd = 36, .voltage = 10 }, 1504 + { .id = TEGRA_IO_PAD_CSIA, .dpd = 0, .voltage = UINT_MAX }, 1505 + { .id = TEGRA_IO_PAD_CSIB, .dpd = 1, .voltage = UINT_MAX }, 1506 + { .id = TEGRA_IO_PAD_CSIC, .dpd = 42, .voltage = UINT_MAX }, 1507 + { .id = TEGRA_IO_PAD_CSID, .dpd = 43, .voltage = UINT_MAX }, 1508 + { .id = TEGRA_IO_PAD_CSIE, .dpd = 44, .voltage = UINT_MAX }, 1509 + { .id = TEGRA_IO_PAD_CSIF, .dpd = 45, .voltage = UINT_MAX }, 1510 + { .id = TEGRA_IO_PAD_DBG, .dpd = 25, .voltage = 19 }, 1511 + { .id = TEGRA_IO_PAD_DEBUG_NONAO, .dpd = 26, .voltage = UINT_MAX }, 1512 + { .id = TEGRA_IO_PAD_DMIC, .dpd = 50, .voltage = 20 }, 1513 + { .id = TEGRA_IO_PAD_DP, .dpd = 51, .voltage = UINT_MAX }, 1514 + { .id = TEGRA_IO_PAD_DSI, .dpd = 2, .voltage = UINT_MAX }, 1515 + { .id = TEGRA_IO_PAD_DSIB, .dpd = 39, .voltage = UINT_MAX }, 1516 + { .id = TEGRA_IO_PAD_DSIC, .dpd = 40, .voltage = UINT_MAX }, 1517 + { .id = TEGRA_IO_PAD_DSID, .dpd = 41, .voltage = UINT_MAX }, 1518 + { .id = TEGRA_IO_PAD_EMMC, .dpd = 35, .voltage = UINT_MAX }, 1519 + { .id = TEGRA_IO_PAD_EMMC2, .dpd = 37, .voltage = UINT_MAX }, 1520 + { .id = TEGRA_IO_PAD_GPIO, .dpd = 27, .voltage = 21 }, 1521 + { .id = TEGRA_IO_PAD_HDMI, .dpd = 28, .voltage = UINT_MAX }, 1522 + { .id = TEGRA_IO_PAD_HSIC, .dpd = 19, .voltage = UINT_MAX }, 1523 + { .id = TEGRA_IO_PAD_LVDS, .dpd = 57, .voltage = UINT_MAX }, 1524 + { .id = TEGRA_IO_PAD_MIPI_BIAS, .dpd = 3, .voltage = UINT_MAX }, 1525 + { .id = TEGRA_IO_PAD_PEX_BIAS, .dpd = 4, .voltage = UINT_MAX }, 1526 + { .id = TEGRA_IO_PAD_PEX_CLK1, .dpd = 5, .voltage = UINT_MAX }, 1527 + { .id = TEGRA_IO_PAD_PEX_CLK2, .dpd = 6, .voltage = UINT_MAX }, 1528 + { .id = TEGRA_IO_PAD_PEX_CNTRL, .dpd = UINT_MAX, .voltage = 11 }, 1529 + { .id = TEGRA_IO_PAD_SDMMC1, .dpd = 33, .voltage = 12 }, 1530 + { .id = TEGRA_IO_PAD_SDMMC3, .dpd = 34, .voltage = 13 }, 1531 + { .id = TEGRA_IO_PAD_SPI, .dpd = 46, .voltage = 22 }, 1532 + { .id = TEGRA_IO_PAD_SPI_HV, .dpd = 47, .voltage = 23 }, 1533 + { .id = TEGRA_IO_PAD_UART, .dpd = 14, .voltage = 2 }, 1534 + { .id = TEGRA_IO_PAD_USB0, .dpd = 9, .voltage = UINT_MAX }, 1535 + { .id = TEGRA_IO_PAD_USB1, .dpd = 10, .voltage = UINT_MAX }, 1536 + { .id = TEGRA_IO_PAD_USB2, .dpd = 11, .voltage = UINT_MAX }, 1537 + { .id = TEGRA_IO_PAD_USB3, .dpd = 18, .voltage = UINT_MAX }, 1538 + { .id = TEGRA_IO_PAD_USB_BIAS, .dpd = 12, .voltage = UINT_MAX }, 1539 + }; 1540 + 1669 1541 static const struct tegra_pmc_soc tegra210_pmc_soc = { 1670 1542 .num_powergates = ARRAY_SIZE(tegra210_powergates), 1671 1543 .powergates = tegra210_powergates, ··· 1714 1504 .cpu_powergates = tegra210_cpu_powergates, 1715 1505 .has_tsense_reset = true, 1716 1506 .has_gpu_clamps = true, 1507 + .num_io_pads = ARRAY_SIZE(tegra210_io_pads), 1508 + .io_pads = tegra210_io_pads, 1717 1509 }; 1718 1510 1719 1511 static const struct of_device_id tegra_pmc_match[] = {
+95 -31
include/soc/tegra/pmc.h
··· 76 76 77 77 #define TEGRA_POWERGATE_3D0 TEGRA_POWERGATE_3D 78 78 79 - #define TEGRA_IO_RAIL_CSIA 0 80 - #define TEGRA_IO_RAIL_CSIB 1 81 - #define TEGRA_IO_RAIL_DSI 2 82 - #define TEGRA_IO_RAIL_MIPI_BIAS 3 83 - #define TEGRA_IO_RAIL_PEX_BIAS 4 84 - #define TEGRA_IO_RAIL_PEX_CLK1 5 85 - #define TEGRA_IO_RAIL_PEX_CLK2 6 86 - #define TEGRA_IO_RAIL_USB0 9 87 - #define TEGRA_IO_RAIL_USB1 10 88 - #define TEGRA_IO_RAIL_USB2 11 89 - #define TEGRA_IO_RAIL_USB_BIAS 12 90 - #define TEGRA_IO_RAIL_NAND 13 91 - #define TEGRA_IO_RAIL_UART 14 92 - #define TEGRA_IO_RAIL_BB 15 93 - #define TEGRA_IO_RAIL_AUDIO 17 94 - #define TEGRA_IO_RAIL_HSIC 19 95 - #define TEGRA_IO_RAIL_COMP 22 96 - #define TEGRA_IO_RAIL_HDMI 28 97 - #define TEGRA_IO_RAIL_PEX_CNTRL 32 98 - #define TEGRA_IO_RAIL_SDMMC1 33 99 - #define TEGRA_IO_RAIL_SDMMC3 34 100 - #define TEGRA_IO_RAIL_SDMMC4 35 101 - #define TEGRA_IO_RAIL_CAM 36 102 - #define TEGRA_IO_RAIL_RES 37 103 - #define TEGRA_IO_RAIL_HV 38 104 - #define TEGRA_IO_RAIL_DSIB 39 105 - #define TEGRA_IO_RAIL_DSIC 40 106 - #define TEGRA_IO_RAIL_DSID 41 107 - #define TEGRA_IO_RAIL_CSIE 44 108 - #define TEGRA_IO_RAIL_LVDS 57 109 - #define TEGRA_IO_RAIL_SYS_DDC 58 79 + /** 80 + * enum tegra_io_pad - I/O pad group identifier 81 + * 82 + * I/O pins on Tegra SoCs are grouped into so-called I/O pads. Each such pad 83 + * can be used to control the common voltage signal level and power state of 84 + * the pins of the given pad. 85 + */ 86 + enum tegra_io_pad { 87 + TEGRA_IO_PAD_AUDIO, 88 + TEGRA_IO_PAD_AUDIO_HV, 89 + TEGRA_IO_PAD_BB, 90 + TEGRA_IO_PAD_CAM, 91 + TEGRA_IO_PAD_COMP, 92 + TEGRA_IO_PAD_CSIA, 93 + TEGRA_IO_PAD_CSIB, 94 + TEGRA_IO_PAD_CSIC, 95 + TEGRA_IO_PAD_CSID, 96 + TEGRA_IO_PAD_CSIE, 97 + TEGRA_IO_PAD_CSIF, 98 + TEGRA_IO_PAD_DBG, 99 + TEGRA_IO_PAD_DEBUG_NONAO, 100 + TEGRA_IO_PAD_DMIC, 101 + TEGRA_IO_PAD_DP, 102 + TEGRA_IO_PAD_DSI, 103 + TEGRA_IO_PAD_DSIB, 104 + TEGRA_IO_PAD_DSIC, 105 + TEGRA_IO_PAD_DSID, 106 + TEGRA_IO_PAD_EMMC, 107 + TEGRA_IO_PAD_EMMC2, 108 + TEGRA_IO_PAD_GPIO, 109 + TEGRA_IO_PAD_HDMI, 110 + TEGRA_IO_PAD_HSIC, 111 + TEGRA_IO_PAD_HV, 112 + TEGRA_IO_PAD_LVDS, 113 + TEGRA_IO_PAD_MIPI_BIAS, 114 + TEGRA_IO_PAD_NAND, 115 + TEGRA_IO_PAD_PEX_BIAS, 116 + TEGRA_IO_PAD_PEX_CLK1, 117 + TEGRA_IO_PAD_PEX_CLK2, 118 + TEGRA_IO_PAD_PEX_CNTRL, 119 + TEGRA_IO_PAD_SDMMC1, 120 + TEGRA_IO_PAD_SDMMC3, 121 + TEGRA_IO_PAD_SDMMC4, 122 + TEGRA_IO_PAD_SPI, 123 + TEGRA_IO_PAD_SPI_HV, 124 + TEGRA_IO_PAD_SYS_DDC, 125 + TEGRA_IO_PAD_UART, 126 + TEGRA_IO_PAD_USB0, 127 + TEGRA_IO_PAD_USB1, 128 + TEGRA_IO_PAD_USB2, 129 + TEGRA_IO_PAD_USB3, 130 + TEGRA_IO_PAD_USB_BIAS, 131 + }; 132 + 133 + /* deprecated, use TEGRA_IO_PAD_{HDMI,LVDS} instead */ 134 + #define TEGRA_IO_RAIL_HDMI TEGRA_IO_PAD_HDMI 135 + #define TEGRA_IO_RAIL_LVDS TEGRA_IO_PAD_LVDS 136 + 137 + /** 138 + * enum tegra_io_pad_voltage - voltage level of the I/O pad's source rail 139 + * @TEGRA_IO_PAD_1800000UV: 1.8 V 140 + * @TEGRA_IO_PAD_3300000UV: 3.3 V 141 + */ 142 + enum tegra_io_pad_voltage { 143 + TEGRA_IO_PAD_1800000UV, 144 + TEGRA_IO_PAD_3300000UV, 145 + }; 110 146 111 147 #ifdef CONFIG_ARCH_TEGRA 112 148 int tegra_powergate_is_powered(unsigned int id); ··· 154 118 int tegra_powergate_sequence_power_up(unsigned int id, struct clk *clk, 155 119 struct reset_control *rst); 156 120 121 + int tegra_io_pad_power_enable(enum tegra_io_pad id); 122 + int tegra_io_pad_power_disable(enum tegra_io_pad id); 123 + int tegra_io_pad_set_voltage(enum tegra_io_pad id, 124 + enum tegra_io_pad_voltage voltage); 125 + int tegra_io_pad_get_voltage(enum tegra_io_pad id); 126 + 127 + /* deprecated, use tegra_io_pad_power_{enable,disable}() instead */ 157 128 int tegra_io_rail_power_on(unsigned int id); 158 129 int tegra_io_rail_power_off(unsigned int id); 159 130 #else ··· 187 144 static inline int tegra_powergate_sequence_power_up(unsigned int id, 188 145 struct clk *clk, 189 146 struct reset_control *rst) 147 + { 148 + return -ENOSYS; 149 + } 150 + 151 + static inline int tegra_io_pad_power_enable(enum tegra_io_pad id) 152 + { 153 + return -ENOSYS; 154 + } 155 + 156 + static inline int tegra_io_pad_power_disable(enum tegra_io_pad id) 157 + { 158 + return -ENOSYS; 159 + } 160 + 161 + static inline int tegra_io_pad_set_voltage(enum tegra_io_pad id, 162 + enum tegra_io_pad_voltage voltage) 163 + { 164 + return -ENOSYS; 165 + } 166 + 167 + static inline int tegra_io_pad_get_voltage(enum tegra_io_pad id) 190 168 { 191 169 return -ENOSYS; 192 170 }