diff options
65 files changed, 3441 insertions, 3515 deletions
diff --git a/Documentation/devicetree/bindings/pinctrl/nvidia,tegra20-pinmux.txt b/Documentation/devicetree/bindings/pinctrl/nvidia,tegra20-pinmux.txt new file mode 100644 index 000000000000..c8e578263ce2 --- /dev/null +++ b/Documentation/devicetree/bindings/pinctrl/nvidia,tegra20-pinmux.txt | |||
| @@ -0,0 +1,132 @@ | |||
| 1 | NVIDIA Tegra20 pinmux controller | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible: "nvidia,tegra20-pinmux" | ||
| 5 | - reg: Should contain the register physical address and length for each of | ||
| 6 | the tri-state, mux, pull-up/down, and pad control register sets. | ||
| 7 | |||
| 8 | Please refer to pinctrl-bindings.txt in this directory for details of the | ||
| 9 | common pinctrl bindings used by client devices, including the meaning of the | ||
| 10 | phrase "pin configuration node". | ||
| 11 | |||
| 12 | Tegra's pin configuration nodes act as a container for an abitrary number of | ||
| 13 | subnodes. Each of these subnodes represents some desired configuration for a | ||
| 14 | pin, a group, or a list of pins or groups. This configuration can include the | ||
| 15 | mux function to select on those pin(s)/group(s), and various pin configuration | ||
| 16 | parameters, such as pull-up, tristate, drive strength, etc. | ||
| 17 | |||
| 18 | The name of each subnode is not important; all subnodes should be enumerated | ||
| 19 | and processed purely based on their content. | ||
| 20 | |||
| 21 | Each subnode only affects those parameters that are explicitly listed. In | ||
| 22 | other words, a subnode that lists a mux function but no pin configuration | ||
| 23 | parameters implies no information about any pin configuration parameters. | ||
| 24 | Similarly, a pin subnode that describes a pullup parameter implies no | ||
| 25 | information about e.g. the mux function or tristate parameter. For this | ||
| 26 | reason, even seemingly boolean values are actually tristates in this binding: | ||
| 27 | unspecified, off, or on. Unspecified is represented as an absent property, | ||
| 28 | and off/on are represented as integer values 0 and 1. | ||
| 29 | |||
| 30 | Required subnode-properties: | ||
| 31 | - nvidia,pins : An array of strings. Each string contains the name of a pin or | ||
| 32 | group. Valid values for these names are listed below. | ||
| 33 | |||
| 34 | Optional subnode-properties: | ||
| 35 | - nvidia,function: A string containing the name of the function to mux to the | ||
| 36 | pin or group. Valid values for function names are listed below. See the Tegra | ||
| 37 | TRM to determine which are valid for each pin or group. | ||
| 38 | - nvidia,pull: Integer, representing the pull-down/up to apply to the pin. | ||
| 39 | 0: none, 1: down, 2: up. | ||
| 40 | - nvidia,tristate: Integer. | ||
| 41 | 0: drive, 1: tristate. | ||
| 42 | - nvidia,high-speed-mode: Integer. Enable high speed mode the pins. | ||
| 43 | 0: no, 1: yes. | ||
| 44 | - nvidia,schmitt: Integer. Enables Schmitt Trigger on the input. | ||
| 45 | 0: no, 1: yes. | ||
| 46 | - nvidia,low-power-mode: Integer. Valid values 0-3. 0 is least power, 3 is | ||
| 47 | most power. Controls the drive power or current. See "Low Power Mode" | ||
| 48 | or "LPMD1" and "LPMD0" in the Tegra TRM. | ||
| 49 | - nvidia,pull-down-strength: Integer. Controls drive strength. 0 is weakest. | ||
| 50 | The range of valid values depends on the pingroup. See "CAL_DRVDN" in the | ||
| 51 | Tegra TRM. | ||
| 52 | - nvidia,pull-up-strength: Integer. Controls drive strength. 0 is weakest. | ||
| 53 | The range of valid values depends on the pingroup. See "CAL_DRVUP" in the | ||
| 54 | Tegra TRM. | ||
| 55 | - nvidia,slew-rate-rising: Integer. Controls rising signal slew rate. 0 is | ||
| 56 | fastest. The range of valid values depends on the pingroup. See | ||
| 57 | "DRVDN_SLWR" in the Tegra TRM. | ||
| 58 | - nvidia,slew-rate-falling: Integer. Controls falling signal slew rate. 0 is | ||
| 59 | fastest. The range of valid values depends on the pingroup. See | ||
| 60 | "DRVUP_SLWF" in the Tegra TRM. | ||
| 61 | |||
| 62 | Note that many of these properties are only valid for certain specific pins | ||
| 63 | or groups. See the Tegra TRM and various pinmux spreadsheets for complete | ||
| 64 | details regarding which groups support which functionality. The Linux pinctrl | ||
| 65 | driver may also be a useful reference, since it consolidates, disambiguates, | ||
| 66 | and corrects data from all those sources. | ||
| 67 | |||
| 68 | Valid values for pin and group names are: | ||
| 69 | |||
| 70 | mux groups: | ||
| 71 | |||
| 72 | These all support nvidia,function, nvidia,tristate, and many support | ||
| 73 | nvidia,pull. | ||
| 74 | |||
| 75 | ata, atb, atc, atd, ate, cdev1, cdev2, crtp, csus, dap1, dap2, dap3, dap4, | ||
| 76 | ddc, dta, dtb, dtc, dtd, dte, dtf, gma, gmb, gmc, gmd, gme, gpu, gpu7, | ||
| 77 | gpv, hdint, i2cp, irrx, irtx, kbca, kbcb, kbcc, kbcd, kbce, kbcf, lcsn, | ||
| 78 | ld0, ld1, ld2, ld3, ld4, ld5, ld6, ld7, ld8, ld9, ld10, ld11, ld12, ld13, | ||
| 79 | ld14, ld15, ld16, ld17, ldc, ldi, lhp0, lhp1, lhp2, lhs, lm0, lm1, lpp, | ||
| 80 | lpw0, lpw1, lpw2, lsc0, lsc1, lsck, lsda, lsdi, lspi, lvp0, lvp1, lvs, | ||
| 81 | owc, pmc, pta, rm, sdb, sdc, sdd, sdio1, slxa, slxc, slxd, slxk, spdi, | ||
| 82 | spdo, spia, spib, spic, spid, spie, spif, spig, spih, uaa, uab, uac, uad, | ||
| 83 | uca, ucb, uda. | ||
| 84 | |||
| 85 | tristate groups: | ||
| 86 | |||
| 87 | These only support nvidia,pull. | ||
| 88 | |||
| 89 | ck32, ddrc, pmca, pmcb, pmcc, pmcd, pmce, xm2c, xm2d, ls, lc, ld17_0, | ||
| 90 | ld19_18, ld21_20, ld23_22. | ||
| 91 | |||
| 92 | drive groups: | ||
| 93 | |||
| 94 | With some exceptions, these support nvidia,high-speed-mode, | ||
| 95 | nvidia,schmitt, nvidia,low-power-mode, nvidia,pull-down-strength, | ||
| 96 | nvidia,pull-up-strength, nvidia,slew_rate-rising, nvidia,slew_rate-falling. | ||
| 97 | |||
| 98 | drive_ao1, drive_ao2, drive_at1, drive_at2, drive_cdev1, drive_cdev2, | ||
| 99 | drive_csus, drive_dap1, drive_dap2, drive_dap3, drive_dap4, drive_dbg, | ||
| 100 | drive_lcd1, drive_lcd2, drive_sdmmc2, drive_sdmmc3, drive_spi, drive_uaa, | ||
| 101 | drive_uab, drive_uart2, drive_uart3, drive_vi1, drive_vi2, drive_xm2a, | ||
| 102 | drive_xm2c, drive_xm2d, drive_xm2clk, drive_sdio1, drive_crt, drive_ddc, | ||
| 103 | drive_gma, drive_gmb, drive_gmc, drive_gmd, drive_gme, drive_owr, | ||
| 104 | drive_uda. | ||
| 105 | |||
| 106 | Example: | ||
| 107 | |||
| 108 | pinctrl@70000000 { | ||
| 109 | compatible = "nvidia,tegra20-pinmux"; | ||
| 110 | reg = < 0x70000014 0x10 /* Tri-state registers */ | ||
| 111 | 0x70000080 0x20 /* Mux registers */ | ||
| 112 | 0x700000a0 0x14 /* Pull-up/down registers */ | ||
| 113 | 0x70000868 0xa8 >; /* Pad control registers */ | ||
| 114 | }; | ||
| 115 | |||
| 116 | Example board file extract: | ||
| 117 | |||
| 118 | pinctrl@70000000 { | ||
| 119 | sdio4_default: sdio4_default { | ||
| 120 | atb { | ||
| 121 | nvidia,pins = "atb", "gma", "gme"; | ||
| 122 | nvidia,function = "sdio4"; | ||
| 123 | nvidia,pull = <0>; | ||
| 124 | nvidia,tristate = <0>; | ||
| 125 | }; | ||
| 126 | }; | ||
| 127 | }; | ||
| 128 | |||
| 129 | sdhci@c8000600 { | ||
| 130 | pinctrl-names = "default"; | ||
| 131 | pinctrl-0 = <&sdio4_default>; | ||
| 132 | }; | ||
diff --git a/Documentation/devicetree/bindings/pinctrl/nvidia,tegra30-pinmux.txt b/Documentation/devicetree/bindings/pinctrl/nvidia,tegra30-pinmux.txt new file mode 100644 index 000000000000..c275b70349c1 --- /dev/null +++ b/Documentation/devicetree/bindings/pinctrl/nvidia,tegra30-pinmux.txt | |||
| @@ -0,0 +1,132 @@ | |||
| 1 | NVIDIA Tegra30 pinmux controller | ||
| 2 | |||
| 3 | The Tegra30 pinctrl binding is very similar to the Tegra20 pinctrl binding, | ||
| 4 | as described in nvidia,tegra20-pinmux.txt. In fact, this document assumes | ||
| 5 | that binding as a baseline, and only documents the differences between the | ||
| 6 | two bindings. | ||
| 7 | |||
| 8 | Required properties: | ||
| 9 | - compatible: "nvidia,tegra30-pinmux" | ||
| 10 | - reg: Should contain the register physical address and length for each of | ||
| 11 | the pad control and mux registers. | ||
| 12 | |||
| 13 | Tegra30 adds the following optional properties for pin configuration subnodes: | ||
| 14 | - nvidia,enable-input: Integer. Enable the pin's input path. 0: no, 1: yes. | ||
| 15 | - nvidia,open-drain: Integer. Enable open drain mode. 0: no, 1: yes. | ||
| 16 | - nvidia,lock: Integer. Lock the pin configuration against further changes | ||
| 17 | until reset. 0: no, 1: yes. | ||
| 18 | - nvidia,io-reset: Integer. Reset the IO path. 0: no, 1: yes. | ||
| 19 | |||
| 20 | As with Tegra20, see the Tegra TRM for complete details regarding which groups | ||
| 21 | support which functionality. | ||
| 22 | |||
| 23 | Valid values for pin and group names are: | ||
| 24 | |||
| 25 | per-pin mux groups: | ||
| 26 | |||
| 27 | These all support nvidia,function, nvidia,tristate, nvidia,pull, | ||
| 28 | nvidia,enable-input, nvidia,lock. Some support nvidia,open-drain, | ||
| 29 | nvidia,io-reset. | ||
| 30 | |||
| 31 | clk_32k_out_pa0, uart3_cts_n_pa1, dap2_fs_pa2, dap2_sclk_pa3, | ||
| 32 | dap2_din_pa4, dap2_dout_pa5, sdmmc3_clk_pa6, sdmmc3_cmd_pa7, gmi_a17_pb0, | ||
| 33 | gmi_a18_pb1, lcd_pwr0_pb2, lcd_pclk_pb3, sdmmc3_dat3_pb4, sdmmc3_dat2_pb5, | ||
| 34 | sdmmc3_dat1_pb6, sdmmc3_dat0_pb7, uart3_rts_n_pc0, lcd_pwr1_pc1, | ||
| 35 | uart2_txd_pc2, uart2_rxd_pc3, gen1_i2c_scl_pc4, gen1_i2c_sda_pc5, | ||
| 36 | lcd_pwr2_pc6, gmi_wp_n_pc7, sdmmc3_dat5_pd0, sdmmc3_dat4_pd1, lcd_dc1_pd2, | ||
| 37 | sdmmc3_dat6_pd3, sdmmc3_dat7_pd4, vi_d1_pd5, vi_vsync_pd6, vi_hsync_pd7, | ||
| 38 | lcd_d0_pe0, lcd_d1_pe1, lcd_d2_pe2, lcd_d3_pe3, lcd_d4_pe4, lcd_d5_pe5, | ||
| 39 | lcd_d6_pe6, lcd_d7_pe7, lcd_d8_pf0, lcd_d9_pf1, lcd_d10_pf2, lcd_d11_pf3, | ||
| 40 | lcd_d12_pf4, lcd_d13_pf5, lcd_d14_pf6, lcd_d15_pf7, gmi_ad0_pg0, | ||
| 41 | gmi_ad1_pg1, gmi_ad2_pg2, gmi_ad3_pg3, gmi_ad4_pg4, gmi_ad5_pg5, | ||
| 42 | gmi_ad6_pg6, gmi_ad7_pg7, gmi_ad8_ph0, gmi_ad9_ph1, gmi_ad10_ph2, | ||
| 43 | gmi_ad11_ph3, gmi_ad12_ph4, gmi_ad13_ph5, gmi_ad14_ph6, gmi_ad15_ph7, | ||
| 44 | gmi_wr_n_pi0, gmi_oe_n_pi1, gmi_dqs_pi2, gmi_cs6_n_pi3, gmi_rst_n_pi4, | ||
| 45 | gmi_iordy_pi5, gmi_cs7_n_pi6, gmi_wait_pi7, gmi_cs0_n_pj0, lcd_de_pj1, | ||
| 46 | gmi_cs1_n_pj2, lcd_hsync_pj3, lcd_vsync_pj4, uart2_cts_n_pj5, | ||
| 47 | uart2_rts_n_pj6, gmi_a16_pj7, gmi_adv_n_pk0, gmi_clk_pk1, gmi_cs4_n_pk2, | ||
| 48 | gmi_cs2_n_pk3, gmi_cs3_n_pk4, spdif_out_pk5, spdif_in_pk6, gmi_a19_pk7, | ||
| 49 | vi_d2_pl0, vi_d3_pl1, vi_d4_pl2, vi_d5_pl3, vi_d6_pl4, vi_d7_pl5, | ||
| 50 | vi_d8_pl6, vi_d9_pl7, lcd_d16_pm0, lcd_d17_pm1, lcd_d18_pm2, lcd_d19_pm3, | ||
| 51 | lcd_d20_pm4, lcd_d21_pm5, lcd_d22_pm6, lcd_d23_pm7, dap1_fs_pn0, | ||
| 52 | dap1_din_pn1, dap1_dout_pn2, dap1_sclk_pn3, lcd_cs0_n_pn4, lcd_sdout_pn5, | ||
| 53 | lcd_dc0_pn6, hdmi_int_pn7, ulpi_data7_po0, ulpi_data0_po1, ulpi_data1_po2, | ||
| 54 | ulpi_data2_po3, ulpi_data3_po4, ulpi_data4_po5, ulpi_data5_po6, | ||
| 55 | ulpi_data6_po7, dap3_fs_pp0, dap3_din_pp1, dap3_dout_pp2, dap3_sclk_pp3, | ||
| 56 | dap4_fs_pp4, dap4_din_pp5, dap4_dout_pp6, dap4_sclk_pp7, kb_col0_pq0, | ||
| 57 | kb_col1_pq1, kb_col2_pq2, kb_col3_pq3, kb_col4_pq4, kb_col5_pq5, | ||
| 58 | kb_col6_pq6, kb_col7_pq7, kb_row0_pr0, kb_row1_pr1, kb_row2_pr2, | ||
| 59 | kb_row3_pr3, kb_row4_pr4, kb_row5_pr5, kb_row6_pr6, kb_row7_pr7, | ||
| 60 | kb_row8_ps0, kb_row9_ps1, kb_row10_ps2, kb_row11_ps3, kb_row12_ps4, | ||
| 61 | kb_row13_ps5, kb_row14_ps6, kb_row15_ps7, vi_pclk_pt0, vi_mclk_pt1, | ||
| 62 | vi_d10_pt2, vi_d11_pt3, vi_d0_pt4, gen2_i2c_scl_pt5, gen2_i2c_sda_pt6, | ||
| 63 | sdmmc4_cmd_pt7, pu0, pu1, pu2, pu3, pu4, pu5, pu6, jtag_rtck_pu7, pv0, | ||
| 64 | pv1, pv2, pv3, ddc_scl_pv4, ddc_sda_pv5, crt_hsync_pv6, crt_vsync_pv7, | ||
| 65 | lcd_cs1_n_pw0, lcd_m1_pw1, spi2_cs1_n_pw2, spi2_cs2_n_pw3, clk1_out_pw4, | ||
| 66 | clk2_out_pw5, uart3_txd_pw6, uart3_rxd_pw7, spi2_mosi_px0, spi2_miso_px1, | ||
| 67 | spi2_sck_px2, spi2_cs0_n_px3, spi1_mosi_px4, spi1_sck_px5, spi1_cs0_n_px6, | ||
| 68 | spi1_miso_px7, ulpi_clk_py0, ulpi_dir_py1, ulpi_nxt_py2, ulpi_stp_py3, | ||
| 69 | sdmmc1_dat3_py4, sdmmc1_dat2_py5, sdmmc1_dat1_py6, sdmmc1_dat0_py7, | ||
| 70 | sdmmc1_clk_pz0, sdmmc1_cmd_pz1, lcd_sdin_pz2, lcd_wr_n_pz3, lcd_sck_pz4, | ||
| 71 | sys_clk_req_pz5, pwr_i2c_scl_pz6, pwr_i2c_sda_pz7, sdmmc4_dat0_paa0, | ||
| 72 | sdmmc4_dat1_paa1, sdmmc4_dat2_paa2, sdmmc4_dat3_paa3, sdmmc4_dat4_paa4, | ||
| 73 | sdmmc4_dat5_paa5, sdmmc4_dat6_paa6, sdmmc4_dat7_paa7, pbb0, | ||
| 74 | cam_i2c_scl_pbb1, cam_i2c_sda_pbb2, pbb3, pbb4, pbb5, pbb6, pbb7, | ||
| 75 | cam_mclk_pcc0, pcc1, pcc2, sdmmc4_rst_n_pcc3, sdmmc4_clk_pcc4, | ||
| 76 | clk2_req_pcc5, pex_l2_rst_n_pcc6, pex_l2_clkreq_n_pcc7, | ||
| 77 | pex_l0_prsnt_n_pdd0, pex_l0_rst_n_pdd1, pex_l0_clkreq_n_pdd2, | ||
| 78 | pex_wake_n_pdd3, pex_l1_prsnt_n_pdd4, pex_l1_rst_n_pdd5, | ||
| 79 | pex_l1_clkreq_n_pdd6, pex_l2_prsnt_n_pdd7, clk3_out_pee0, clk3_req_pee1, | ||
| 80 | clk1_req_pee2, hdmi_cec_pee3, clk_32k_in, core_pwr_req, cpu_pwr_req, owr, | ||
| 81 | pwr_int_n. | ||
| 82 | |||
| 83 | drive groups: | ||
| 84 | |||
| 85 | These all support nvidia,pull-down-strength, nvidia,pull-up-strength, | ||
| 86 | nvidia,slew_rate-rising, nvidia,slew_rate-falling. Most but not all | ||
| 87 | support nvidia,high-speed-mode, nvidia,schmitt, nvidia,low-power-mode. | ||
| 88 | |||
| 89 | ao1, ao2, at1, at2, at3, at4, at5, cdev1, cdev2, cec, crt, csus, dap1, | ||
| 90 | dap2, dap3, dap4, dbg, ddc, dev3, gma, gmb, gmc, gmd, gme, gmf, gmg, | ||
| 91 | gmh, gpv, lcd1, lcd2, owr, sdio1, sdio2, sdio3, spi, uaa, uab, uart2, | ||
| 92 | uart3, uda, vi1. | ||
| 93 | |||
| 94 | Example: | ||
| 95 | |||
| 96 | pinctrl@70000000 { | ||
| 97 | compatible = "nvidia,tegra30-pinmux"; | ||
| 98 | reg = < 0x70000868 0xd0 /* Pad control registers */ | ||
| 99 | 0x70003000 0x3e0 >; /* Mux registers */ | ||
| 100 | }; | ||
| 101 | |||
| 102 | Example board file extract: | ||
| 103 | |||
| 104 | pinctrl@70000000 { | ||
| 105 | sdmmc4_default: pinmux { | ||
| 106 | sdmmc4_clk_pcc4 { | ||
| 107 | nvidia,pins = "sdmmc4_clk_pcc4", | ||
| 108 | "sdmmc4_rst_n_pcc3"; | ||
| 109 | nvidia,function = "sdmmc4"; | ||
| 110 | nvidia,pull = <0>; | ||
| 111 | nvidia,tristate = <0>; | ||
| 112 | }; | ||
| 113 | sdmmc4_dat0_paa0 { | ||
| 114 | nvidia,pins = "sdmmc4_dat0_paa0", | ||
| 115 | "sdmmc4_dat1_paa1", | ||
| 116 | "sdmmc4_dat2_paa2", | ||
| 117 | "sdmmc4_dat3_paa3", | ||
| 118 | "sdmmc4_dat4_paa4", | ||
| 119 | "sdmmc4_dat5_paa5", | ||
| 120 | "sdmmc4_dat6_paa6", | ||
| 121 | "sdmmc4_dat7_paa7"; | ||
| 122 | nvidia,function = "sdmmc4"; | ||
| 123 | nvidia,pull = <2>; | ||
| 124 | nvidia,tristate = <0>; | ||
| 125 | }; | ||
| 126 | }; | ||
| 127 | }; | ||
| 128 | |||
| 129 | sdhci@78000400 { | ||
| 130 | pinctrl-names = "default"; | ||
| 131 | pinctrl-0 = <&sdmmc4_default>; | ||
| 132 | }; | ||
diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt b/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt new file mode 100644 index 000000000000..c95ea8278f87 --- /dev/null +++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt | |||
| @@ -0,0 +1,128 @@ | |||
| 1 | == Introduction == | ||
| 2 | |||
| 3 | Hardware modules that control pin multiplexing or configuration parameters | ||
| 4 | such as pull-up/down, tri-state, drive-strength etc are designated as pin | ||
| 5 | controllers. Each pin controller must be represented as a node in device tree, | ||
| 6 | just like any other hardware module. | ||
| 7 | |||
| 8 | Hardware modules whose signals are affected by pin configuration are | ||
| 9 | designated client devices. Again, each client device must be represented as a | ||
| 10 | node in device tree, just like any other hardware module. | ||
| 11 | |||
| 12 | For a client device to operate correctly, certain pin controllers must | ||
| 13 | set up certain specific pin configurations. Some client devices need a | ||
| 14 | single static pin configuration, e.g. set up during initialization. Others | ||
| 15 | need to reconfigure pins at run-time, for example to tri-state pins when the | ||
| 16 | device is inactive. Hence, each client device can define a set of named | ||
| 17 | states. The number and names of those states is defined by the client device's | ||
| 18 | own binding. | ||
| 19 | |||
| 20 | The common pinctrl bindings defined in this file provide an infrastructure | ||
| 21 | for client device device tree nodes to map those state names to the pin | ||
| 22 | configuration used by those states. | ||
| 23 | |||
| 24 | Note that pin controllers themselves may also be client devices of themselves. | ||
| 25 | For example, a pin controller may set up its own "active" state when the | ||
| 26 | driver loads. This would allow representing a board's static pin configuration | ||
| 27 | in a single place, rather than splitting it across multiple client device | ||
| 28 | nodes. The decision to do this or not somewhat rests with the author of | ||
| 29 | individual board device tree files, and any requirements imposed by the | ||
| 30 | bindings for the individual client devices in use by that board, i.e. whether | ||
| 31 | they require certain specific named states for dynamic pin configuration. | ||
| 32 | |||
| 33 | == Pinctrl client devices == | ||
| 34 | |||
| 35 | For each client device individually, every pin state is assigned an integer | ||
| 36 | ID. These numbers start at 0, and are contiguous. For each state ID, a unique | ||
| 37 | property exists to define the pin configuration. Each state may also be | ||
| 38 | assigned a name. When names are used, another property exists to map from | ||
| 39 | those names to the integer IDs. | ||
| 40 | |||
| 41 | Each client device's own binding determines the set of states the must be | ||
| 42 | defined in its device tree node, and whether to define the set of state | ||
| 43 | IDs that must be provided, or whether to define the set of state names that | ||
| 44 | must be provided. | ||
| 45 | |||
| 46 | Required properties: | ||
| 47 | pinctrl-0: List of phandles, each pointing at a pin configuration | ||
| 48 | node. These referenced pin configuration nodes must be child | ||
| 49 | nodes of the pin controller that they configure. Multiple | ||
| 50 | entries may exist in this list so that multiple pin | ||
| 51 | controllers may be configured, or so that a state may be built | ||
| 52 | from multiple nodes for a single pin controller, each | ||
| 53 | contributing part of the overall configuration. See the next | ||
| 54 | section of this document for details of the format of these | ||
| 55 | pin configuration nodes. | ||
| 56 | |||
| 57 | In some cases, it may be useful to define a state, but for it | ||
| 58 | to be empty. This may be required when a common IP block is | ||
| 59 | used in an SoC either without a pin controller, or where the | ||
| 60 | pin controller does not affect the HW module in question. If | ||
| 61 | the binding for that IP block requires certain pin states to | ||
| 62 | exist, they must still be defined, but may be left empty. | ||
| 63 | |||
| 64 | Optional properties: | ||
| 65 | pinctrl-1: List of phandles, each pointing at a pin configuration | ||
| 66 | node within a pin controller. | ||
| 67 | ... | ||
| 68 | pinctrl-n: List of phandles, each pointing at a pin configuration | ||
| 69 | node within a pin controller. | ||
| 70 | pinctrl-names: The list of names to assign states. List entry 0 defines the | ||
| 71 | name for integer state ID 0, list entry 1 for state ID 1, and | ||
| 72 | so on. | ||
| 73 | |||
| 74 | For example: | ||
| 75 | |||
| 76 | /* For a client device requiring named states */ | ||
| 77 | device { | ||
| 78 | pinctrl-names = "active", "idle"; | ||
| 79 | pinctrl-0 = <&state_0_node_a>; | ||
| 80 | pinctrl-1 = <&state_1_node_a &state_1_node_b>; | ||
| 81 | }; | ||
| 82 | |||
| 83 | /* For the same device if using state IDs */ | ||
| 84 | device { | ||
| 85 | pinctrl-0 = <&state_0_node_a>; | ||
| 86 | pinctrl-1 = <&state_1_node_a &state_1_node_b>; | ||
| 87 | }; | ||
| 88 | |||
| 89 | /* | ||
| 90 | * For an IP block whose binding supports pin configuration, | ||
| 91 | * but in use on an SoC that doesn't have any pin control hardware | ||
| 92 | */ | ||
| 93 | device { | ||
| 94 | pinctrl-names = "active", "idle"; | ||
| 95 | pinctrl-0 = <>; | ||
| 96 | pinctrl-1 = <>; | ||
| 97 | }; | ||
| 98 | |||
| 99 | == Pin controller devices == | ||
| 100 | |||
| 101 | Pin controller devices should contain the pin configuration nodes that client | ||
| 102 | devices reference. | ||
| 103 | |||
| 104 | For example: | ||
| 105 | |||
| 106 | pincontroller { | ||
| 107 | ... /* Standard DT properties for the device itself elided */ | ||
| 108 | |||
| 109 | state_0_node_a { | ||
| 110 | ... | ||
| 111 | }; | ||
| 112 | state_1_node_a { | ||
| 113 | ... | ||
| 114 | }; | ||
| 115 | state_1_node_b { | ||
| 116 | ... | ||
| 117 | }; | ||
| 118 | } | ||
| 119 | |||
| 120 | The contents of each of those pin configuration child nodes is defined | ||
| 121 | entirely by the binding for the individual pin controller device. There | ||
| 122 | exists no common standard for this content. | ||
| 123 | |||
| 124 | The pin configuration nodes need not be direct children of the pin controller | ||
| 125 | device; they may be grandchildren, for example. Whether this is legal, and | ||
| 126 | whether there is any interaction between the child and intermediate parent | ||
| 127 | nodes, is again defined entirely by the binding for the individual pin | ||
| 128 | controller device. | ||
diff --git a/Documentation/devicetree/bindings/pinmux/pinmux_nvidia.txt b/Documentation/devicetree/bindings/pinmux/pinmux_nvidia.txt deleted file mode 100644 index 36f82dbdd14d..000000000000 --- a/Documentation/devicetree/bindings/pinmux/pinmux_nvidia.txt +++ /dev/null | |||
| @@ -1,5 +0,0 @@ | |||
| 1 | NVIDIA Tegra 2 pinmux controller | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible : "nvidia,tegra20-pinmux" | ||
| 5 | |||
diff --git a/Documentation/devicetree/bindings/usb/tegra-usb.txt b/Documentation/devicetree/bindings/usb/tegra-usb.txt index 007005ddbe12..e9b005dc7625 100644 --- a/Documentation/devicetree/bindings/usb/tegra-usb.txt +++ b/Documentation/devicetree/bindings/usb/tegra-usb.txt | |||
| @@ -12,6 +12,9 @@ Required properties : | |||
| 12 | - nvidia,vbus-gpio : If present, specifies a gpio that needs to be | 12 | - nvidia,vbus-gpio : If present, specifies a gpio that needs to be |
| 13 | activated for the bus to be powered. | 13 | activated for the bus to be powered. |
| 14 | 14 | ||
| 15 | Required properties for phy_type == ulpi: | ||
| 16 | - nvidia,phy-reset-gpio : The GPIO used to reset the PHY. | ||
| 17 | |||
| 15 | Optional properties: | 18 | Optional properties: |
| 16 | - dr_mode : dual role mode. Indicates the working mode for | 19 | - dr_mode : dual role mode. Indicates the working mode for |
| 17 | nvidia,tegra20-ehci compatible controllers. Can be "host", "peripheral", | 20 | nvidia,tegra20-ehci compatible controllers. Can be "host", "peripheral", |
diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt index 2a596a4fc23e..ef4fa7b423d2 100644 --- a/Documentation/driver-model/devres.txt +++ b/Documentation/driver-model/devres.txt | |||
| @@ -276,3 +276,7 @@ REGULATOR | |||
| 276 | devm_regulator_get() | 276 | devm_regulator_get() |
| 277 | devm_regulator_put() | 277 | devm_regulator_put() |
| 278 | devm_regulator_bulk_get() | 278 | devm_regulator_bulk_get() |
| 279 | |||
| 280 | PINCTRL | ||
| 281 | devm_pinctrl_get() | ||
| 282 | devm_pinctrl_put() | ||
diff --git a/Documentation/pinctrl.txt b/Documentation/pinctrl.txt index d97bccf46147..e40f4b4e1977 100644 --- a/Documentation/pinctrl.txt +++ b/Documentation/pinctrl.txt | |||
| @@ -152,11 +152,9 @@ static const struct foo_group foo_groups[] = { | |||
| 152 | }; | 152 | }; |
| 153 | 153 | ||
| 154 | 154 | ||
| 155 | static int foo_list_groups(struct pinctrl_dev *pctldev, unsigned selector) | 155 | static int foo_get_groups_count(struct pinctrl_dev *pctldev) |
| 156 | { | 156 | { |
| 157 | if (selector >= ARRAY_SIZE(foo_groups)) | 157 | return ARRAY_SIZE(foo_groups); |
| 158 | return -EINVAL; | ||
| 159 | return 0; | ||
| 160 | } | 158 | } |
| 161 | 159 | ||
| 162 | static const char *foo_get_group_name(struct pinctrl_dev *pctldev, | 160 | static const char *foo_get_group_name(struct pinctrl_dev *pctldev, |
| @@ -175,7 +173,7 @@ static int foo_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector, | |||
| 175 | } | 173 | } |
| 176 | 174 | ||
| 177 | static struct pinctrl_ops foo_pctrl_ops = { | 175 | static struct pinctrl_ops foo_pctrl_ops = { |
| 178 | .list_groups = foo_list_groups, | 176 | .get_groups_count = foo_get_groups_count, |
| 179 | .get_group_name = foo_get_group_name, | 177 | .get_group_name = foo_get_group_name, |
| 180 | .get_group_pins = foo_get_group_pins, | 178 | .get_group_pins = foo_get_group_pins, |
| 181 | }; | 179 | }; |
| @@ -186,13 +184,12 @@ static struct pinctrl_desc foo_desc = { | |||
| 186 | .pctlops = &foo_pctrl_ops, | 184 | .pctlops = &foo_pctrl_ops, |
| 187 | }; | 185 | }; |
| 188 | 186 | ||
| 189 | The pin control subsystem will call the .list_groups() function repeatedly | 187 | The pin control subsystem will call the .get_groups_count() function to |
| 190 | beginning on 0 until it returns non-zero to determine legal selectors, then | 188 | determine total number of legal selectors, then it will call the other functions |
| 191 | it will call the other functions to retrieve the name and pins of the group. | 189 | to retrieve the name and pins of the group. Maintaining the data structure of |
| 192 | Maintaining the data structure of the groups is up to the driver, this is | 190 | the groups is up to the driver, this is just a simple example - in practice you |
| 193 | just a simple example - in practice you may need more entries in your group | 191 | may need more entries in your group structure, for example specific register |
| 194 | structure, for example specific register ranges associated with each group | 192 | ranges associated with each group and so on. |
| 195 | and so on. | ||
| 196 | 193 | ||
| 197 | 194 | ||
| 198 | Pin configuration | 195 | Pin configuration |
| @@ -606,11 +603,9 @@ static const struct foo_group foo_groups[] = { | |||
| 606 | }; | 603 | }; |
| 607 | 604 | ||
| 608 | 605 | ||
| 609 | static int foo_list_groups(struct pinctrl_dev *pctldev, unsigned selector) | 606 | static int foo_get_groups_count(struct pinctrl_dev *pctldev) |
| 610 | { | 607 | { |
| 611 | if (selector >= ARRAY_SIZE(foo_groups)) | 608 | return ARRAY_SIZE(foo_groups); |
| 612 | return -EINVAL; | ||
| 613 | return 0; | ||
| 614 | } | 609 | } |
| 615 | 610 | ||
| 616 | static const char *foo_get_group_name(struct pinctrl_dev *pctldev, | 611 | static const char *foo_get_group_name(struct pinctrl_dev *pctldev, |
| @@ -629,7 +624,7 @@ static int foo_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector, | |||
| 629 | } | 624 | } |
| 630 | 625 | ||
| 631 | static struct pinctrl_ops foo_pctrl_ops = { | 626 | static struct pinctrl_ops foo_pctrl_ops = { |
| 632 | .list_groups = foo_list_groups, | 627 | .get_groups_count = foo_get_groups_count, |
| 633 | .get_group_name = foo_get_group_name, | 628 | .get_group_name = foo_get_group_name, |
| 634 | .get_group_pins = foo_get_group_pins, | 629 | .get_group_pins = foo_get_group_pins, |
| 635 | }; | 630 | }; |
| @@ -640,7 +635,7 @@ struct foo_pmx_func { | |||
| 640 | const unsigned num_groups; | 635 | const unsigned num_groups; |
| 641 | }; | 636 | }; |
| 642 | 637 | ||
| 643 | static const char * const spi0_groups[] = { "spi0_1_grp" }; | 638 | static const char * const spi0_groups[] = { "spi0_0_grp", "spi0_1_grp" }; |
| 644 | static const char * const i2c0_groups[] = { "i2c0_grp" }; | 639 | static const char * const i2c0_groups[] = { "i2c0_grp" }; |
| 645 | static const char * const mmc0_groups[] = { "mmc0_1_grp", "mmc0_2_grp", | 640 | static const char * const mmc0_groups[] = { "mmc0_1_grp", "mmc0_2_grp", |
| 646 | "mmc0_3_grp" }; | 641 | "mmc0_3_grp" }; |
| @@ -663,11 +658,9 @@ static const struct foo_pmx_func foo_functions[] = { | |||
| 663 | }, | 658 | }, |
| 664 | }; | 659 | }; |
| 665 | 660 | ||
| 666 | int foo_list_funcs(struct pinctrl_dev *pctldev, unsigned selector) | 661 | int foo_get_functions_count(struct pinctrl_dev *pctldev) |
| 667 | { | 662 | { |
| 668 | if (selector >= ARRAY_SIZE(foo_functions)) | 663 | return ARRAY_SIZE(foo_functions); |
| 669 | return -EINVAL; | ||
| 670 | return 0; | ||
| 671 | } | 664 | } |
| 672 | 665 | ||
| 673 | const char *foo_get_fname(struct pinctrl_dev *pctldev, unsigned selector) | 666 | const char *foo_get_fname(struct pinctrl_dev *pctldev, unsigned selector) |
| @@ -703,7 +696,7 @@ void foo_disable(struct pinctrl_dev *pctldev, unsigned selector, | |||
| 703 | } | 696 | } |
| 704 | 697 | ||
| 705 | struct pinmux_ops foo_pmxops = { | 698 | struct pinmux_ops foo_pmxops = { |
| 706 | .list_functions = foo_list_funcs, | 699 | .get_functions_count = foo_get_functions_count, |
| 707 | .get_function_name = foo_get_fname, | 700 | .get_function_name = foo_get_fname, |
| 708 | .get_function_groups = foo_get_groups, | 701 | .get_function_groups = foo_get_groups, |
| 709 | .enable = foo_enable, | 702 | .enable = foo_enable, |
| @@ -786,7 +779,7 @@ and spi on the second function mapping: | |||
| 786 | 779 | ||
| 787 | #include <linux/pinctrl/machine.h> | 780 | #include <linux/pinctrl/machine.h> |
| 788 | 781 | ||
| 789 | static const struct pinctrl_map __initdata mapping[] = { | 782 | static const struct pinctrl_map mapping[] __initconst = { |
| 790 | { | 783 | { |
| 791 | .dev_name = "foo-spi.0", | 784 | .dev_name = "foo-spi.0", |
| 792 | .name = PINCTRL_STATE_DEFAULT, | 785 | .name = PINCTRL_STATE_DEFAULT, |
| @@ -952,13 +945,13 @@ case), we define a mapping like this: | |||
| 952 | The result of grabbing this mapping from the device with something like | 945 | The result of grabbing this mapping from the device with something like |
| 953 | this (see next paragraph): | 946 | this (see next paragraph): |
| 954 | 947 | ||
| 955 | p = pinctrl_get(dev); | 948 | p = devm_pinctrl_get(dev); |
| 956 | s = pinctrl_lookup_state(p, "8bit"); | 949 | s = pinctrl_lookup_state(p, "8bit"); |
| 957 | ret = pinctrl_select_state(p, s); | 950 | ret = pinctrl_select_state(p, s); |
| 958 | 951 | ||
| 959 | or more simply: | 952 | or more simply: |
| 960 | 953 | ||
| 961 | p = pinctrl_get_select(dev, "8bit"); | 954 | p = devm_pinctrl_get_select(dev, "8bit"); |
| 962 | 955 | ||
| 963 | Will be that you activate all the three bottom records in the mapping at | 956 | Will be that you activate all the three bottom records in the mapping at |
| 964 | once. Since they share the same name, pin controller device, function and | 957 | once. Since they share the same name, pin controller device, function and |
| @@ -992,7 +985,7 @@ foo_probe() | |||
| 992 | /* Allocate a state holder named "foo" etc */ | 985 | /* Allocate a state holder named "foo" etc */ |
| 993 | struct foo_state *foo = ...; | 986 | struct foo_state *foo = ...; |
| 994 | 987 | ||
| 995 | foo->p = pinctrl_get(&device); | 988 | foo->p = devm_pinctrl_get(&device); |
| 996 | if (IS_ERR(foo->p)) { | 989 | if (IS_ERR(foo->p)) { |
| 997 | /* FIXME: clean up "foo" here */ | 990 | /* FIXME: clean up "foo" here */ |
| 998 | return PTR_ERR(foo->p); | 991 | return PTR_ERR(foo->p); |
| @@ -1000,24 +993,17 @@ foo_probe() | |||
| 1000 | 993 | ||
| 1001 | foo->s = pinctrl_lookup_state(foo->p, PINCTRL_STATE_DEFAULT); | 994 | foo->s = pinctrl_lookup_state(foo->p, PINCTRL_STATE_DEFAULT); |
| 1002 | if (IS_ERR(foo->s)) { | 995 | if (IS_ERR(foo->s)) { |
| 1003 | pinctrl_put(foo->p); | ||
| 1004 | /* FIXME: clean up "foo" here */ | 996 | /* FIXME: clean up "foo" here */ |
| 1005 | return PTR_ERR(s); | 997 | return PTR_ERR(s); |
| 1006 | } | 998 | } |
| 1007 | 999 | ||
| 1008 | ret = pinctrl_select_state(foo->s); | 1000 | ret = pinctrl_select_state(foo->s); |
| 1009 | if (ret < 0) { | 1001 | if (ret < 0) { |
| 1010 | pinctrl_put(foo->p); | ||
| 1011 | /* FIXME: clean up "foo" here */ | 1002 | /* FIXME: clean up "foo" here */ |
| 1012 | return ret; | 1003 | return ret; |
| 1013 | } | 1004 | } |
| 1014 | } | 1005 | } |
| 1015 | 1006 | ||
| 1016 | foo_remove() | ||
| 1017 | { | ||
| 1018 | pinctrl_put(state->p); | ||
| 1019 | } | ||
| 1020 | |||
| 1021 | This get/lookup/select/put sequence can just as well be handled by bus drivers | 1007 | This get/lookup/select/put sequence can just as well be handled by bus drivers |
| 1022 | if you don't want each and every driver to handle it and you know the | 1008 | if you don't want each and every driver to handle it and you know the |
| 1023 | arrangement on your bus. | 1009 | arrangement on your bus. |
| @@ -1029,6 +1015,11 @@ The semantics of the pinctrl APIs are: | |||
| 1029 | kernel memory to hold the pinmux state. All mapping table parsing or similar | 1015 | kernel memory to hold the pinmux state. All mapping table parsing or similar |
| 1030 | slow operations take place within this API. | 1016 | slow operations take place within this API. |
| 1031 | 1017 | ||
| 1018 | - devm_pinctrl_get() is a variant of pinctrl_get() that causes pinctrl_put() | ||
| 1019 | to be called automatically on the retrieved pointer when the associated | ||
| 1020 | device is removed. It is recommended to use this function over plain | ||
| 1021 | pinctrl_get(). | ||
| 1022 | |||
| 1032 | - pinctrl_lookup_state() is called in process context to obtain a handle to a | 1023 | - pinctrl_lookup_state() is called in process context to obtain a handle to a |
| 1033 | specific state for a the client device. This operation may be slow too. | 1024 | specific state for a the client device. This operation may be slow too. |
| 1034 | 1025 | ||
| @@ -1041,14 +1032,30 @@ The semantics of the pinctrl APIs are: | |||
| 1041 | 1032 | ||
| 1042 | - pinctrl_put() frees all information associated with a pinctrl handle. | 1033 | - pinctrl_put() frees all information associated with a pinctrl handle. |
| 1043 | 1034 | ||
| 1035 | - devm_pinctrl_put() is a variant of pinctrl_put() that may be used to | ||
| 1036 | explicitly destroy a pinctrl object returned by devm_pinctrl_get(). | ||
| 1037 | However, use of this function will be rare, due to the automatic cleanup | ||
| 1038 | that will occur even without calling it. | ||
| 1039 | |||
| 1040 | pinctrl_get() must be paired with a plain pinctrl_put(). | ||
| 1041 | pinctrl_get() may not be paired with devm_pinctrl_put(). | ||
| 1042 | devm_pinctrl_get() can optionally be paired with devm_pinctrl_put(). | ||
| 1043 | devm_pinctrl_get() may not be paired with plain pinctrl_put(). | ||
| 1044 | |||
| 1044 | Usually the pin control core handled the get/put pair and call out to the | 1045 | Usually the pin control core handled the get/put pair and call out to the |
| 1045 | device drivers bookkeeping operations, like checking available functions and | 1046 | device drivers bookkeeping operations, like checking available functions and |
| 1046 | the associated pins, whereas the enable/disable pass on to the pin controller | 1047 | the associated pins, whereas the enable/disable pass on to the pin controller |
| 1047 | driver which takes care of activating and/or deactivating the mux setting by | 1048 | driver which takes care of activating and/or deactivating the mux setting by |
| 1048 | quickly poking some registers. | 1049 | quickly poking some registers. |
| 1049 | 1050 | ||
| 1050 | The pins are allocated for your device when you issue the pinctrl_get() call, | 1051 | The pins are allocated for your device when you issue the devm_pinctrl_get() |
| 1051 | after this you should be able to see this in the debugfs listing of all pins. | 1052 | call, after this you should be able to see this in the debugfs listing of all |
| 1053 | pins. | ||
| 1054 | |||
| 1055 | NOTE: the pinctrl system will return -EPROBE_DEFER if it cannot find the | ||
| 1056 | requested pinctrl handles, for example if the pinctrl driver has not yet | ||
| 1057 | registered. Thus make sure that the error path in your driver gracefully | ||
| 1058 | cleans up and is ready to retry the probing later in the startup process. | ||
| 1052 | 1059 | ||
| 1053 | 1060 | ||
| 1054 | System pin control hogging | 1061 | System pin control hogging |
| @@ -1094,13 +1101,13 @@ it, disables and releases it, and muxes it in on the pins defined by group B: | |||
| 1094 | 1101 | ||
| 1095 | #include <linux/pinctrl/consumer.h> | 1102 | #include <linux/pinctrl/consumer.h> |
| 1096 | 1103 | ||
| 1097 | foo_switch() | 1104 | struct pinctrl *p; |
| 1098 | { | 1105 | struct pinctrl_state *s1, *s2; |
| 1099 | struct pinctrl *p; | ||
| 1100 | struct pinctrl_state *s1, *s2; | ||
| 1101 | 1106 | ||
| 1107 | foo_probe() | ||
| 1108 | { | ||
| 1102 | /* Setup */ | 1109 | /* Setup */ |
| 1103 | p = pinctrl_get(&device); | 1110 | p = devm_pinctrl_get(&device); |
| 1104 | if (IS_ERR(p)) | 1111 | if (IS_ERR(p)) |
| 1105 | ... | 1112 | ... |
| 1106 | 1113 | ||
| @@ -1111,7 +1118,10 @@ foo_switch() | |||
| 1111 | s2 = pinctrl_lookup_state(foo->p, "pos-B"); | 1118 | s2 = pinctrl_lookup_state(foo->p, "pos-B"); |
| 1112 | if (IS_ERR(s2)) | 1119 | if (IS_ERR(s2)) |
| 1113 | ... | 1120 | ... |
| 1121 | } | ||
| 1114 | 1122 | ||
| 1123 | foo_switch() | ||
| 1124 | { | ||
| 1115 | /* Enable on position A */ | 1125 | /* Enable on position A */ |
| 1116 | ret = pinctrl_select_state(s1); | 1126 | ret = pinctrl_select_state(s1); |
| 1117 | if (ret < 0) | 1127 | if (ret < 0) |
| @@ -1125,8 +1135,6 @@ foo_switch() | |||
| 1125 | ... | 1135 | ... |
| 1126 | 1136 | ||
| 1127 | ... | 1137 | ... |
| 1128 | |||
| 1129 | pinctrl_put(p); | ||
| 1130 | } | 1138 | } |
| 1131 | 1139 | ||
| 1132 | The above has to be done from process context. | 1140 | The above has to be done from process context. |
diff --git a/arch/arm/boot/dts/tegra-cardhu.dts b/arch/arm/boot/dts/tegra-cardhu.dts index ac3fb7558459..0a9f34a2c3aa 100644 --- a/arch/arm/boot/dts/tegra-cardhu.dts +++ b/arch/arm/boot/dts/tegra-cardhu.dts | |||
| @@ -10,6 +10,50 @@ | |||
| 10 | reg = < 0x80000000 0x40000000 >; | 10 | reg = < 0x80000000 0x40000000 >; |
| 11 | }; | 11 | }; |
| 12 | 12 | ||
| 13 | pinmux@70000000 { | ||
| 14 | pinctrl-names = "default"; | ||
| 15 | pinctrl-0 = <&state_default>; | ||
| 16 | |||
| 17 | state_default: pinmux { | ||
| 18 | sdmmc1_clk_pz0 { | ||
| 19 | nvidia,pins = "sdmmc1_clk_pz0"; | ||
| 20 | nvidia,function = "sdmmc1"; | ||
| 21 | nvidia,pull = <0>; | ||
| 22 | nvidia,tristate = <0>; | ||
| 23 | }; | ||
| 24 | sdmmc1_cmd_pz1 { | ||
| 25 | nvidia,pins = "sdmmc1_cmd_pz1", | ||
| 26 | "sdmmc1_dat0_py7", | ||
| 27 | "sdmmc1_dat1_py6", | ||
| 28 | "sdmmc1_dat2_py5", | ||
| 29 | "sdmmc1_dat3_py4"; | ||
| 30 | nvidia,function = "sdmmc1"; | ||
| 31 | nvidia,pull = <2>; | ||
| 32 | nvidia,tristate = <0>; | ||
| 33 | }; | ||
| 34 | sdmmc4_clk_pcc4 { | ||
| 35 | nvidia,pins = "sdmmc4_clk_pcc4", | ||
| 36 | "sdmmc4_rst_n_pcc3"; | ||
| 37 | nvidia,function = "sdmmc4"; | ||
| 38 | nvidia,pull = <0>; | ||
| 39 | nvidia,tristate = <0>; | ||
| 40 | }; | ||
| 41 | sdmmc4_dat0_paa0 { | ||
| 42 | nvidia,pins = "sdmmc4_dat0_paa0", | ||
| 43 | "sdmmc4_dat1_paa1", | ||
| 44 | "sdmmc4_dat2_paa2", | ||
| 45 | "sdmmc4_dat3_paa3", | ||
| 46 | "sdmmc4_dat4_paa4", | ||
| 47 | "sdmmc4_dat5_paa5", | ||
| 48 | "sdmmc4_dat6_paa6", | ||
| 49 | "sdmmc4_dat7_paa7"; | ||
| 50 | nvidia,function = "sdmmc4"; | ||
| 51 | nvidia,pull = <2>; | ||
| 52 | nvidia,tristate = <0>; | ||
| 53 | }; | ||
| 54 | }; | ||
| 55 | }; | ||
| 56 | |||
| 13 | serial@70006000 { | 57 | serial@70006000 { |
| 14 | clock-frequency = < 408000000 >; | 58 | clock-frequency = < 408000000 >; |
| 15 | }; | 59 | }; |
diff --git a/arch/arm/boot/dts/tegra-harmony.dts b/arch/arm/boot/dts/tegra-harmony.dts index 6e8447dc0202..6857cec8382d 100644 --- a/arch/arm/boot/dts/tegra-harmony.dts +++ b/arch/arm/boot/dts/tegra-harmony.dts | |||
| @@ -10,6 +10,230 @@ | |||
| 10 | reg = < 0x00000000 0x40000000 >; | 10 | reg = < 0x00000000 0x40000000 >; |
| 11 | }; | 11 | }; |
| 12 | 12 | ||
| 13 | pinmux@70000000 { | ||
| 14 | pinctrl-names = "default"; | ||
| 15 | pinctrl-0 = <&state_default>; | ||
| 16 | |||
| 17 | state_default: pinmux { | ||
| 18 | ata { | ||
| 19 | nvidia,pins = "ata"; | ||
| 20 | nvidia,function = "ide"; | ||
| 21 | }; | ||
| 22 | atb { | ||
| 23 | nvidia,pins = "atb", "gma", "gme"; | ||
| 24 | nvidia,function = "sdio4"; | ||
| 25 | }; | ||
| 26 | atc { | ||
| 27 | nvidia,pins = "atc"; | ||
| 28 | nvidia,function = "nand"; | ||
| 29 | }; | ||
| 30 | atd { | ||
| 31 | nvidia,pins = "atd", "ate", "gmb", "gmd", "gpu", | ||
| 32 | "spia", "spib", "spic"; | ||
| 33 | nvidia,function = "gmi"; | ||
| 34 | }; | ||
| 35 | cdev1 { | ||
| 36 | nvidia,pins = "cdev1"; | ||
| 37 | nvidia,function = "plla_out"; | ||
| 38 | }; | ||
| 39 | cdev2 { | ||
| 40 | nvidia,pins = "cdev2"; | ||
| 41 | nvidia,function = "pllp_out4"; | ||
| 42 | }; | ||
| 43 | crtp { | ||
| 44 | nvidia,pins = "crtp"; | ||
| 45 | nvidia,function = "crt"; | ||
| 46 | }; | ||
| 47 | csus { | ||
| 48 | nvidia,pins = "csus"; | ||
| 49 | nvidia,function = "vi_sensor_clk"; | ||
| 50 | }; | ||
| 51 | dap1 { | ||
| 52 | nvidia,pins = "dap1"; | ||
| 53 | nvidia,function = "dap1"; | ||
| 54 | }; | ||
| 55 | dap2 { | ||
| 56 | nvidia,pins = "dap2"; | ||
| 57 | nvidia,function = "dap2"; | ||
| 58 | }; | ||
| 59 | dap3 { | ||
| 60 | nvidia,pins = "dap3"; | ||
| 61 | nvidia,function = "dap3"; | ||
| 62 | }; | ||
| 63 | dap4 { | ||
| 64 | nvidia,pins = "dap4"; | ||
| 65 | nvidia,function = "dap4"; | ||
| 66 | }; | ||
| 67 | ddc { | ||
| 68 | nvidia,pins = "ddc"; | ||
| 69 | nvidia,function = "i2c2"; | ||
| 70 | }; | ||
| 71 | dta { | ||
| 72 | nvidia,pins = "dta", "dtd"; | ||
| 73 | nvidia,function = "sdio2"; | ||
| 74 | }; | ||
| 75 | dtb { | ||
| 76 | nvidia,pins = "dtb", "dtc", "dte"; | ||
| 77 | nvidia,function = "rsvd1"; | ||
| 78 | }; | ||
| 79 | dtf { | ||
| 80 | nvidia,pins = "dtf"; | ||
| 81 | nvidia,function = "i2c3"; | ||
| 82 | }; | ||
| 83 | gmc { | ||
| 84 | nvidia,pins = "gmc"; | ||
| 85 | nvidia,function = "uartd"; | ||
| 86 | }; | ||
| 87 | gpu7 { | ||
| 88 | nvidia,pins = "gpu7"; | ||
| 89 | nvidia,function = "rtck"; | ||
| 90 | }; | ||
| 91 | gpv { | ||
| 92 | nvidia,pins = "gpv", "slxa", "slxk"; | ||
| 93 | nvidia,function = "pcie"; | ||
| 94 | }; | ||
| 95 | hdint { | ||
| 96 | nvidia,pins = "hdint", "pta"; | ||
| 97 | nvidia,function = "hdmi"; | ||
| 98 | }; | ||
| 99 | i2cp { | ||
| 100 | nvidia,pins = "i2cp"; | ||
| 101 | nvidia,function = "i2cp"; | ||
| 102 | }; | ||
| 103 | irrx { | ||
| 104 | nvidia,pins = "irrx", "irtx"; | ||
| 105 | nvidia,function = "uarta"; | ||
| 106 | }; | ||
| 107 | kbca { | ||
| 108 | nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd", | ||
| 109 | "kbce", "kbcf"; | ||
| 110 | nvidia,function = "kbc"; | ||
| 111 | }; | ||
| 112 | lcsn { | ||
| 113 | nvidia,pins = "lcsn", "ld0", "ld1", "ld2", | ||
| 114 | "ld3", "ld4", "ld5", "ld6", "ld7", | ||
| 115 | "ld8", "ld9", "ld10", "ld11", "ld12", | ||
| 116 | "ld13", "ld14", "ld15", "ld16", "ld17", | ||
| 117 | "ldc", "ldi", "lhp0", "lhp1", "lhp2", | ||
| 118 | "lhs", "lm0", "lm1", "lpp", "lpw0", | ||
| 119 | "lpw1", "lpw2", "lsc0", "lsc1", "lsck", | ||
| 120 | "lsda", "lsdi", "lspi", "lvp0", "lvp1", | ||
| 121 | "lvs"; | ||
| 122 | nvidia,function = "displaya"; | ||
| 123 | }; | ||
| 124 | owc { | ||
| 125 | nvidia,pins = "owc", "spdi", "spdo", "uac"; | ||
| 126 | nvidia,function = "rsvd2"; | ||
| 127 | }; | ||
| 128 | pmc { | ||
| 129 | nvidia,pins = "pmc"; | ||
| 130 | nvidia,function = "pwr_on"; | ||
| 131 | }; | ||
| 132 | rm { | ||
| 133 | nvidia,pins = "rm"; | ||
| 134 | nvidia,function = "i2c1"; | ||
| 135 | }; | ||
| 136 | sdb { | ||
| 137 | nvidia,pins = "sdb", "sdc", "sdd"; | ||
| 138 | nvidia,function = "pwm"; | ||
| 139 | }; | ||
| 140 | sdio1 { | ||
| 141 | nvidia,pins = "sdio1"; | ||
| 142 | nvidia,function = "sdio1"; | ||
| 143 | }; | ||
| 144 | slxc { | ||
| 145 | nvidia,pins = "slxc", "slxd"; | ||
| 146 | nvidia,function = "spdif"; | ||
| 147 | }; | ||
| 148 | spid { | ||
| 149 | nvidia,pins = "spid", "spie", "spif"; | ||
| 150 | nvidia,function = "spi1"; | ||
| 151 | }; | ||
| 152 | spig { | ||
| 153 | nvidia,pins = "spig", "spih"; | ||
| 154 | nvidia,function = "spi2_alt"; | ||
| 155 | }; | ||
| 156 | uaa { | ||
| 157 | nvidia,pins = "uaa", "uab", "uda"; | ||
| 158 | nvidia,function = "ulpi"; | ||
| 159 | }; | ||
| 160 | uad { | ||
| 161 | nvidia,pins = "uad"; | ||
| 162 | nvidia,function = "irda"; | ||
| 163 | }; | ||
| 164 | uca { | ||
| 165 | nvidia,pins = "uca", "ucb"; | ||
| 166 | nvidia,function = "uartc"; | ||
| 167 | }; | ||
| 168 | conf_ata { | ||
| 169 | nvidia,pins = "ata", "atb", "atc", "atd", "ate", | ||
| 170 | "cdev1", "cdev2", "dap1", "dtb", "gma", | ||
| 171 | "gmb", "gmc", "gmd", "gme", "gpu7", | ||
| 172 | "gpv", "i2cp", "pta", "rm", "slxa", | ||
| 173 | "slxk", "spia", "spib", "uac"; | ||
| 174 | nvidia,pull = <0>; | ||
| 175 | nvidia,tristate = <0>; | ||
| 176 | }; | ||
| 177 | conf_ck32 { | ||
| 178 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", | ||
| 179 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; | ||
| 180 | nvidia,pull = <0>; | ||
| 181 | }; | ||
| 182 | conf_csus { | ||
| 183 | nvidia,pins = "csus", "spid", "spif"; | ||
| 184 | nvidia,pull = <1>; | ||
| 185 | nvidia,tristate = <1>; | ||
| 186 | }; | ||
| 187 | conf_crtp { | ||
| 188 | nvidia,pins = "crtp", "dap2", "dap3", "dap4", | ||
| 189 | "dtc", "dte", "dtf", "gpu", "sdio1", | ||
| 190 | "slxc", "slxd", "spdi", "spdo", "spig", | ||
| 191 | "uda"; | ||
| 192 | nvidia,pull = <0>; | ||
| 193 | nvidia,tristate = <1>; | ||
| 194 | }; | ||
| 195 | conf_ddc { | ||
| 196 | nvidia,pins = "ddc", "dta", "dtd", "kbca", | ||
| 197 | "kbcb", "kbcc", "kbcd", "kbce", "kbcf", | ||
| 198 | "sdc"; | ||
| 199 | nvidia,pull = <2>; | ||
| 200 | nvidia,tristate = <0>; | ||
| 201 | }; | ||
| 202 | conf_hdint { | ||
| 203 | nvidia,pins = "hdint", "lcsn", "ldc", "lm1", | ||
| 204 | "lpw1", "lsc1", "lsck", "lsda", "lsdi", | ||
| 205 | "lvp0", "owc", "sdb"; | ||
| 206 | nvidia,tristate = <1>; | ||
| 207 | }; | ||
| 208 | conf_irrx { | ||
| 209 | nvidia,pins = "irrx", "irtx", "sdd", "spic", | ||
| 210 | "spie", "spih", "uaa", "uab", "uad", | ||
| 211 | "uca", "ucb"; | ||
| 212 | nvidia,pull = <2>; | ||
| 213 | nvidia,tristate = <1>; | ||
| 214 | }; | ||
| 215 | conf_lc { | ||
| 216 | nvidia,pins = "lc", "ls"; | ||
| 217 | nvidia,pull = <2>; | ||
| 218 | }; | ||
| 219 | conf_ld0 { | ||
| 220 | nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4", | ||
| 221 | "ld5", "ld6", "ld7", "ld8", "ld9", | ||
| 222 | "ld10", "ld11", "ld12", "ld13", "ld14", | ||
| 223 | "ld15", "ld16", "ld17", "ldi", "lhp0", | ||
| 224 | "lhp1", "lhp2", "lhs", "lm0", "lpp", | ||
| 225 | "lpw0", "lpw2", "lsc0", "lspi", "lvp1", | ||
| 226 | "lvs", "pmc"; | ||
| 227 | nvidia,tristate = <0>; | ||
| 228 | }; | ||
| 229 | conf_ld17_0 { | ||
| 230 | nvidia,pins = "ld17_0", "ld19_18", "ld21_20", | ||
| 231 | "ld23_22"; | ||
| 232 | nvidia,pull = <1>; | ||
| 233 | }; | ||
| 234 | }; | ||
| 235 | }; | ||
| 236 | |||
| 13 | pmc@7000f400 { | 237 | pmc@7000f400 { |
| 14 | nvidia,invert-interrupt; | 238 | nvidia,invert-interrupt; |
| 15 | }; | 239 | }; |
| @@ -112,4 +336,8 @@ | |||
| 112 | power-gpios = <&gpio 70 0>; /* gpio PI6 */ | 336 | power-gpios = <&gpio 70 0>; /* gpio PI6 */ |
| 113 | support-8bit; | 337 | support-8bit; |
| 114 | }; | 338 | }; |
| 339 | |||
| 340 | usb@c5004000 { | ||
| 341 | nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */ | ||
| 342 | }; | ||
| 115 | }; | 343 | }; |
diff --git a/arch/arm/boot/dts/tegra-paz00.dts b/arch/arm/boot/dts/tegra-paz00.dts index 6c02abb469d4..34a917710e09 100644 --- a/arch/arm/boot/dts/tegra-paz00.dts +++ b/arch/arm/boot/dts/tegra-paz00.dts | |||
| @@ -10,6 +10,222 @@ | |||
| 10 | reg = <0x00000000 0x20000000>; | 10 | reg = <0x00000000 0x20000000>; |
| 11 | }; | 11 | }; |
| 12 | 12 | ||
| 13 | pinmux@70000000 { | ||
| 14 | pinctrl-names = "default"; | ||
| 15 | pinctrl-0 = <&state_default>; | ||
| 16 | |||
| 17 | state_default: pinmux { | ||
| 18 | ata { | ||
| 19 | nvidia,pins = "ata", "atc", "atd", "ate", | ||
| 20 | "dap2", "gmb", "gmc", "gmd", "spia", | ||
| 21 | "spib", "spic", "spid", "spie"; | ||
| 22 | nvidia,function = "gmi"; | ||
| 23 | }; | ||
| 24 | atb { | ||
| 25 | nvidia,pins = "atb", "gma", "gme"; | ||
| 26 | nvidia,function = "sdio4"; | ||
| 27 | }; | ||
| 28 | cdev1 { | ||
| 29 | nvidia,pins = "cdev1"; | ||
| 30 | nvidia,function = "plla_out"; | ||
| 31 | }; | ||
| 32 | cdev2 { | ||
| 33 | nvidia,pins = "cdev2"; | ||
| 34 | nvidia,function = "pllp_out4"; | ||
| 35 | }; | ||
| 36 | crtp { | ||
| 37 | nvidia,pins = "crtp"; | ||
| 38 | nvidia,function = "crt"; | ||
| 39 | }; | ||
| 40 | csus { | ||
| 41 | nvidia,pins = "csus"; | ||
| 42 | nvidia,function = "pllc_out1"; | ||
| 43 | }; | ||
| 44 | dap1 { | ||
| 45 | nvidia,pins = "dap1"; | ||
| 46 | nvidia,function = "dap1"; | ||
| 47 | }; | ||
| 48 | dap3 { | ||
| 49 | nvidia,pins = "dap3"; | ||
| 50 | nvidia,function = "dap3"; | ||
| 51 | }; | ||
| 52 | dap4 { | ||
| 53 | nvidia,pins = "dap4"; | ||
| 54 | nvidia,function = "dap4"; | ||
| 55 | }; | ||
| 56 | ddc { | ||
| 57 | nvidia,pins = "ddc"; | ||
| 58 | nvidia,function = "i2c2"; | ||
| 59 | }; | ||
| 60 | dta { | ||
| 61 | nvidia,pins = "dta", "dtb", "dtc", "dtd", "dte"; | ||
| 62 | nvidia,function = "rsvd1"; | ||
| 63 | }; | ||
| 64 | dtf { | ||
| 65 | nvidia,pins = "dtf"; | ||
| 66 | nvidia,function = "i2c3"; | ||
| 67 | }; | ||
| 68 | gpu { | ||
| 69 | nvidia,pins = "gpu", "sdb", "sdd"; | ||
| 70 | nvidia,function = "pwm"; | ||
| 71 | }; | ||
| 72 | gpu7 { | ||
| 73 | nvidia,pins = "gpu7"; | ||
| 74 | nvidia,function = "rtck"; | ||
| 75 | }; | ||
| 76 | gpv { | ||
| 77 | nvidia,pins = "gpv", "slxa", "slxk"; | ||
| 78 | nvidia,function = "pcie"; | ||
| 79 | }; | ||
| 80 | hdint { | ||
| 81 | nvidia,pins = "hdint", "pta"; | ||
| 82 | nvidia,function = "hdmi"; | ||
| 83 | }; | ||
| 84 | i2cp { | ||
| 85 | nvidia,pins = "i2cp"; | ||
| 86 | nvidia,function = "i2cp"; | ||
| 87 | }; | ||
| 88 | irrx { | ||
| 89 | nvidia,pins = "irrx", "irtx"; | ||
| 90 | nvidia,function = "uarta"; | ||
| 91 | }; | ||
| 92 | kbca { | ||
| 93 | nvidia,pins = "kbca", "kbcc", "kbce", "kbcf"; | ||
| 94 | nvidia,function = "kbc"; | ||
| 95 | }; | ||
| 96 | kbcb { | ||
| 97 | nvidia,pins = "kbcb", "kbcd"; | ||
| 98 | nvidia,function = "sdio2"; | ||
| 99 | }; | ||
| 100 | lcsn { | ||
| 101 | nvidia,pins = "lcsn", "ld0", "ld1", "ld2", | ||
| 102 | "ld3", "ld4", "ld5", "ld6", "ld7", | ||
| 103 | "ld8", "ld9", "ld10", "ld11", "ld12", | ||
| 104 | "ld13", "ld14", "ld15", "ld16", "ld17", | ||
| 105 | "ldc", "ldi", "lhp0", "lhp1", "lhp2", | ||
| 106 | "lhs", "lm0", "lm1", "lpp", "lpw0", | ||
| 107 | "lpw1", "lpw2", "lsc0", "lsc1", "lsck", | ||
| 108 | "lsda", "lsdi", "lspi", "lvp0", "lvp1", | ||
| 109 | "lvs"; | ||
| 110 | nvidia,function = "displaya"; | ||
| 111 | }; | ||
| 112 | owc { | ||
| 113 | nvidia,pins = "owc"; | ||
| 114 | nvidia,function = "owr"; | ||
| 115 | }; | ||
| 116 | pmc { | ||
| 117 | nvidia,pins = "pmc"; | ||
| 118 | nvidia,function = "pwr_on"; | ||
| 119 | }; | ||
| 120 | rm { | ||
| 121 | nvidia,pins = "rm"; | ||
| 122 | nvidia,function = "i2c1"; | ||
| 123 | }; | ||
| 124 | sdc { | ||
| 125 | nvidia,pins = "sdc"; | ||
| 126 | nvidia,function = "twc"; | ||
| 127 | }; | ||
| 128 | sdio1 { | ||
| 129 | nvidia,pins = "sdio1"; | ||
| 130 | nvidia,function = "sdio1"; | ||
| 131 | }; | ||
| 132 | slxc { | ||
| 133 | nvidia,pins = "slxc", "slxd"; | ||
| 134 | nvidia,function = "spi4"; | ||
| 135 | }; | ||
| 136 | spdi { | ||
| 137 | nvidia,pins = "spdi", "spdo"; | ||
| 138 | nvidia,function = "rsvd2"; | ||
| 139 | }; | ||
| 140 | spif { | ||
| 141 | nvidia,pins = "spif", "uac"; | ||
| 142 | nvidia,function = "rsvd4"; | ||
| 143 | }; | ||
| 144 | spig { | ||
| 145 | nvidia,pins = "spig", "spih"; | ||
| 146 | nvidia,function = "spi2_alt"; | ||
| 147 | }; | ||
| 148 | uaa { | ||
| 149 | nvidia,pins = "uaa", "uab", "uda"; | ||
| 150 | nvidia,function = "ulpi"; | ||
| 151 | }; | ||
| 152 | uad { | ||
| 153 | nvidia,pins = "uad"; | ||
| 154 | nvidia,function = "spdif"; | ||
| 155 | }; | ||
| 156 | uca { | ||
| 157 | nvidia,pins = "uca", "ucb"; | ||
| 158 | nvidia,function = "uartc"; | ||
| 159 | }; | ||
| 160 | conf_ata { | ||
| 161 | nvidia,pins = "ata", "atb", "atc", "atd", "ate", | ||
| 162 | "cdev1", "cdev2", "dap1", "dap2", "dtf", | ||
| 163 | "gma", "gmb", "gmc", "gmd", "gme", | ||
| 164 | "gpu", "gpu7", "gpv", "i2cp", "pta", | ||
| 165 | "rm", "sdio1", "slxk", "spdo", "uac", | ||
| 166 | "uda"; | ||
| 167 | nvidia,pull = <0>; | ||
| 168 | nvidia,tristate = <0>; | ||
| 169 | }; | ||
| 170 | conf_ck32 { | ||
| 171 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", | ||
| 172 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; | ||
| 173 | nvidia,pull = <0>; | ||
| 174 | }; | ||
| 175 | conf_crtp { | ||
| 176 | nvidia,pins = "crtp", "dap3", "dap4", "dtb", | ||
| 177 | "dtc", "dte", "slxa", "slxc", "slxd", | ||
| 178 | "spdi"; | ||
| 179 | nvidia,pull = <0>; | ||
| 180 | nvidia,tristate = <1>; | ||
| 181 | }; | ||
| 182 | conf_csus { | ||
| 183 | nvidia,pins = "csus", "spia", "spib", "spid", | ||
| 184 | "spif"; | ||
| 185 | nvidia,pull = <1>; | ||
| 186 | nvidia,tristate = <1>; | ||
| 187 | }; | ||
| 188 | conf_ddc { | ||
| 189 | nvidia,pins = "ddc", "irrx", "irtx", "kbca", | ||
| 190 | "kbcb", "kbcc", "kbcd", "kbce", "kbcf", | ||
| 191 | "spic", "spig", "uaa", "uab"; | ||
| 192 | nvidia,pull = <2>; | ||
| 193 | nvidia,tristate = <0>; | ||
| 194 | }; | ||
| 195 | conf_dta { | ||
| 196 | nvidia,pins = "dta", "dtd", "owc", "sdc", "sdd", | ||
| 197 | "spie", "spih", "uad", "uca", "ucb"; | ||
| 198 | nvidia,pull = <2>; | ||
| 199 | nvidia,tristate = <1>; | ||
| 200 | }; | ||
| 201 | conf_hdint { | ||
| 202 | nvidia,pins = "hdint", "ld0", "ld1", "ld2", | ||
| 203 | "ld3", "ld4", "ld5", "ld6", "ld7", | ||
| 204 | "ld8", "ld9", "ld10", "ld11", "ld12", | ||
| 205 | "ld13", "ld14", "ld15", "ld16", "ld17", | ||
| 206 | "ldc", "ldi", "lhs", "lsc0", "lspi", | ||
| 207 | "lvs", "pmc"; | ||
| 208 | nvidia,tristate = <0>; | ||
| 209 | }; | ||
| 210 | conf_lc { | ||
| 211 | nvidia,pins = "lc", "ls"; | ||
| 212 | nvidia,pull = <2>; | ||
| 213 | }; | ||
| 214 | conf_lcsn { | ||
| 215 | nvidia,pins = "lcsn", "lhp0", "lhp1", "lhp2", | ||
| 216 | "lm0", "lm1", "lpp", "lpw0", "lpw1", | ||
| 217 | "lpw2", "lsc1", "lsck", "lsda", "lsdi", | ||
| 218 | "lvp0", "lvp1", "sdb"; | ||
| 219 | nvidia,tristate = <1>; | ||
| 220 | }; | ||
| 221 | conf_ld17_0 { | ||
| 222 | nvidia,pins = "ld17_0", "ld19_18", "ld21_20", | ||
| 223 | "ld23_22"; | ||
| 224 | nvidia,pull = <1>; | ||
| 225 | }; | ||
| 226 | }; | ||
| 227 | }; | ||
| 228 | |||
| 13 | i2c@7000c000 { | 229 | i2c@7000c000 { |
| 14 | clock-frequency = <400000>; | 230 | clock-frequency = <400000>; |
| 15 | 231 | ||
| @@ -131,4 +347,8 @@ | |||
| 131 | linux,default-trigger = "rfkill0"; | 347 | linux,default-trigger = "rfkill0"; |
| 132 | }; | 348 | }; |
| 133 | }; | 349 | }; |
| 350 | |||
| 351 | usb@c5004000 { | ||
| 352 | nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */ | ||
| 353 | }; | ||
| 134 | }; | 354 | }; |
diff --git a/arch/arm/boot/dts/tegra-seaboard.dts b/arch/arm/boot/dts/tegra-seaboard.dts index dbf1c5a171c2..ed0a2f5bf918 100644 --- a/arch/arm/boot/dts/tegra-seaboard.dts +++ b/arch/arm/boot/dts/tegra-seaboard.dts | |||
| @@ -11,6 +11,249 @@ | |||
| 11 | reg = < 0x00000000 0x40000000 >; | 11 | reg = < 0x00000000 0x40000000 >; |
| 12 | }; | 12 | }; |
| 13 | 13 | ||
| 14 | pinmux@70000000 { | ||
| 15 | pinctrl-names = "default"; | ||
| 16 | pinctrl-0 = <&state_default>; | ||
| 17 | |||
| 18 | state_default: pinmux { | ||
| 19 | ata { | ||
| 20 | nvidia,pins = "ata"; | ||
| 21 | nvidia,function = "ide"; | ||
| 22 | }; | ||
| 23 | atb { | ||
| 24 | nvidia,pins = "atb", "gma", "gme"; | ||
| 25 | nvidia,function = "sdio4"; | ||
| 26 | }; | ||
| 27 | atc { | ||
| 28 | nvidia,pins = "atc"; | ||
| 29 | nvidia,function = "nand"; | ||
| 30 | }; | ||
| 31 | atd { | ||
| 32 | nvidia,pins = "atd", "ate", "gmb", "spia", | ||
| 33 | "spib", "spic"; | ||
| 34 | nvidia,function = "gmi"; | ||
| 35 | }; | ||
| 36 | cdev1 { | ||
| 37 | nvidia,pins = "cdev1"; | ||
| 38 | nvidia,function = "plla_out"; | ||
| 39 | }; | ||
| 40 | cdev2 { | ||
| 41 | nvidia,pins = "cdev2"; | ||
| 42 | nvidia,function = "pllp_out4"; | ||
| 43 | }; | ||
| 44 | crtp { | ||
| 45 | nvidia,pins = "crtp", "lm1"; | ||
| 46 | nvidia,function = "crt"; | ||
| 47 | }; | ||
| 48 | csus { | ||
| 49 | nvidia,pins = "csus"; | ||
| 50 | nvidia,function = "vi_sensor_clk"; | ||
| 51 | }; | ||
| 52 | dap1 { | ||
| 53 | nvidia,pins = "dap1"; | ||
| 54 | nvidia,function = "dap1"; | ||
| 55 | }; | ||
| 56 | dap2 { | ||
| 57 | nvidia,pins = "dap2"; | ||
| 58 | nvidia,function = "dap2"; | ||
| 59 | }; | ||
| 60 | dap3 { | ||
| 61 | nvidia,pins = "dap3"; | ||
| 62 | nvidia,function = "dap3"; | ||
| 63 | }; | ||
| 64 | dap4 { | ||
| 65 | nvidia,pins = "dap4"; | ||
| 66 | nvidia,function = "dap4"; | ||
| 67 | }; | ||
| 68 | ddc { | ||
| 69 | nvidia,pins = "ddc", "owc", "spdi", "spdo", | ||
| 70 | "uac"; | ||
| 71 | nvidia,function = "rsvd2"; | ||
| 72 | }; | ||
| 73 | dta { | ||
| 74 | nvidia,pins = "dta", "dtb", "dtc", "dtd", "dte"; | ||
| 75 | nvidia,function = "vi"; | ||
| 76 | }; | ||
| 77 | dtf { | ||
| 78 | nvidia,pins = "dtf"; | ||
| 79 | nvidia,function = "i2c3"; | ||
| 80 | }; | ||
| 81 | gmc { | ||
| 82 | nvidia,pins = "gmc"; | ||
| 83 | nvidia,function = "uartd"; | ||
| 84 | }; | ||
| 85 | gmd { | ||
| 86 | nvidia,pins = "gmd"; | ||
| 87 | nvidia,function = "sflash"; | ||
| 88 | }; | ||
| 89 | gpu { | ||
| 90 | nvidia,pins = "gpu"; | ||
| 91 | nvidia,function = "pwm"; | ||
| 92 | }; | ||
| 93 | gpu7 { | ||
| 94 | nvidia,pins = "gpu7"; | ||
| 95 | nvidia,function = "rtck"; | ||
| 96 | }; | ||
| 97 | gpv { | ||
| 98 | nvidia,pins = "gpv", "slxa", "slxk"; | ||
| 99 | nvidia,function = "pcie"; | ||
| 100 | }; | ||
| 101 | hdint { | ||
| 102 | nvidia,pins = "hdint", "lpw0", "lpw2", "lsc1", | ||
| 103 | "lsck", "lsda", "pta"; | ||
| 104 | nvidia,function = "hdmi"; | ||
| 105 | }; | ||
| 106 | i2cp { | ||
| 107 | nvidia,pins = "i2cp"; | ||
| 108 | nvidia,function = "i2cp"; | ||
| 109 | }; | ||
| 110 | irrx { | ||
| 111 | nvidia,pins = "irrx", "irtx"; | ||
| 112 | nvidia,function = "uartb"; | ||
| 113 | }; | ||
| 114 | kbca { | ||
| 115 | nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd", | ||
| 116 | "kbce", "kbcf"; | ||
| 117 | nvidia,function = "kbc"; | ||
| 118 | }; | ||
| 119 | lcsn { | ||
| 120 | nvidia,pins = "lcsn", "ldc", "lm0", "lpw1", | ||
| 121 | "lsdi", "lvp0"; | ||
| 122 | nvidia,function = "rsvd4"; | ||
| 123 | }; | ||
| 124 | ld0 { | ||
| 125 | nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4", | ||
| 126 | "ld5", "ld6", "ld7", "ld8", "ld9", | ||
| 127 | "ld10", "ld11", "ld12", "ld13", "ld14", | ||
| 128 | "ld15", "ld16", "ld17", "ldi", "lhp0", | ||
| 129 | "lhp1", "lhp2", "lhs", "lpp", "lsc0", | ||
| 130 | "lspi", "lvp1", "lvs"; | ||
| 131 | nvidia,function = "displaya"; | ||
| 132 | }; | ||
| 133 | pmc { | ||
| 134 | nvidia,pins = "pmc"; | ||
| 135 | nvidia,function = "pwr_on"; | ||
| 136 | }; | ||
| 137 | rm { | ||
| 138 | nvidia,pins = "rm"; | ||
| 139 | nvidia,function = "i2c1"; | ||
| 140 | }; | ||
| 141 | sdb { | ||
| 142 | nvidia,pins = "sdb", "sdc", "sdd"; | ||
| 143 | nvidia,function = "sdio3"; | ||
| 144 | }; | ||
| 145 | sdio1 { | ||
| 146 | nvidia,pins = "sdio1"; | ||
| 147 | nvidia,function = "sdio1"; | ||
| 148 | }; | ||
| 149 | slxc { | ||
| 150 | nvidia,pins = "slxc", "slxd"; | ||
| 151 | nvidia,function = "spdif"; | ||
| 152 | }; | ||
| 153 | spid { | ||
| 154 | nvidia,pins = "spid", "spie", "spif"; | ||
| 155 | nvidia,function = "spi1"; | ||
| 156 | }; | ||
| 157 | spig { | ||
| 158 | nvidia,pins = "spig", "spih"; | ||
| 159 | nvidia,function = "spi2_alt"; | ||
| 160 | }; | ||
| 161 | uaa { | ||
| 162 | nvidia,pins = "uaa", "uab", "uda"; | ||
| 163 | nvidia,function = "ulpi"; | ||
| 164 | }; | ||
| 165 | uad { | ||
| 166 | nvidia,pins = "uad"; | ||
| 167 | nvidia,function = "irda"; | ||
| 168 | }; | ||
| 169 | uca { | ||
| 170 | nvidia,pins = "uca", "ucb"; | ||
| 171 | nvidia,function = "uartc"; | ||
| 172 | }; | ||
| 173 | conf_ata { | ||
| 174 | nvidia,pins = "ata", "atb", "atc", "atd", | ||
| 175 | "cdev1", "cdev2", "dap1", "dap2", | ||
| 176 | "dap4", "dtf", "gma", "gmc", "gmd", | ||
| 177 | "gme", "gpu", "gpu7", "i2cp", "irrx", | ||
| 178 | "irtx", "pta", "rm", "sdc", "sdd", | ||
| 179 | "slxd", "slxk", "spdi", "spdo", "uac", | ||
| 180 | "uad", "uca", "ucb", "uda"; | ||
| 181 | nvidia,pull = <0>; | ||
| 182 | nvidia,tristate = <0>; | ||
| 183 | }; | ||
| 184 | conf_ate { | ||
| 185 | nvidia,pins = "ate", "csus", "dap3", "ddc", | ||
| 186 | "gpv", "owc", "slxc", "spib", "spid", | ||
| 187 | "spie"; | ||
| 188 | nvidia,pull = <0>; | ||
| 189 | nvidia,tristate = <1>; | ||
| 190 | }; | ||
| 191 | conf_ck32 { | ||
| 192 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", | ||
| 193 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; | ||
| 194 | nvidia,pull = <0>; | ||
| 195 | }; | ||
| 196 | conf_crtp { | ||
| 197 | nvidia,pins = "crtp", "gmb", "slxa", "spia", | ||
| 198 | "spig", "spih"; | ||
| 199 | nvidia,pull = <2>; | ||
| 200 | nvidia,tristate = <1>; | ||
| 201 | }; | ||
| 202 | conf_dta { | ||
| 203 | nvidia,pins = "dta", "dtb", "dtc", "dtd"; | ||
| 204 | nvidia,pull = <1>; | ||
| 205 | nvidia,tristate = <0>; | ||
| 206 | }; | ||
| 207 | conf_dte { | ||
| 208 | nvidia,pins = "dte", "spif"; | ||
| 209 | nvidia,pull = <1>; | ||
| 210 | nvidia,tristate = <1>; | ||
| 211 | }; | ||
| 212 | conf_hdint { | ||
| 213 | nvidia,pins = "hdint", "lcsn", "ldc", "lm1", | ||
| 214 | "lpw1", "lsc1", "lsck", "lsda", "lsdi", | ||
| 215 | "lvp0"; | ||
| 216 | nvidia,tristate = <1>; | ||
| 217 | }; | ||
| 218 | conf_kbca { | ||
| 219 | nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd", | ||
| 220 | "kbce", "kbcf", "sdio1", "spic", "uaa", | ||
| 221 | "uab"; | ||
| 222 | nvidia,pull = <2>; | ||
| 223 | nvidia,tristate = <0>; | ||
| 224 | }; | ||
| 225 | conf_lc { | ||
| 226 | nvidia,pins = "lc", "ls"; | ||
| 227 | nvidia,pull = <2>; | ||
| 228 | }; | ||
| 229 | conf_ld0 { | ||
| 230 | nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4", | ||
| 231 | "ld5", "ld6", "ld7", "ld8", "ld9", | ||
| 232 | "ld10", "ld11", "ld12", "ld13", "ld14", | ||
| 233 | "ld15", "ld16", "ld17", "ldi", "lhp0", | ||
| 234 | "lhp1", "lhp2", "lhs", "lm0", "lpp", | ||
| 235 | "lpw0", "lpw2", "lsc0", "lspi", "lvp1", | ||
| 236 | "lvs", "pmc", "sdb"; | ||
| 237 | nvidia,tristate = <0>; | ||
| 238 | }; | ||
| 239 | conf_ld17_0 { | ||
| 240 | nvidia,pins = "ld17_0", "ld19_18", "ld21_20", | ||
| 241 | "ld23_22"; | ||
| 242 | nvidia,pull = <1>; | ||
| 243 | }; | ||
| 244 | drive_sdio1 { | ||
| 245 | nvidia,pins = "drive_sdio1"; | ||
| 246 | nvidia,high-speed-mode = <0>; | ||
| 247 | nvidia,schmitt = <0>; | ||
| 248 | nvidia,low-power-mode = <3>; | ||
| 249 | nvidia,pull-down-strength = <31>; | ||
| 250 | nvidia,pull-up-strength = <31>; | ||
| 251 | nvidia,slew-rate-rising = <3>; | ||
| 252 | nvidia,slew-rate-falling = <3>; | ||
| 253 | }; | ||
| 254 | }; | ||
| 255 | }; | ||
| 256 | |||
| 14 | i2c@7000c000 { | 257 | i2c@7000c000 { |
| 15 | clock-frequency = <400000>; | 258 | clock-frequency = <400000>; |
| 16 | 259 | ||
| @@ -172,4 +415,8 @@ | |||
| 172 | 0x00000000 0x00000000 0x00000000 0x00000000 >; | 415 | 0x00000000 0x00000000 0x00000000 0x00000000 >; |
| 173 | }; | 416 | }; |
| 174 | }; | 417 | }; |
| 418 | |||
| 419 | usb@c5004000 { | ||
| 420 | nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */ | ||
| 421 | }; | ||
| 175 | }; | 422 | }; |
diff --git a/arch/arm/boot/dts/tegra-trimslice.dts b/arch/arm/boot/dts/tegra-trimslice.dts index 252476867b54..e4fcf9a8178a 100644 --- a/arch/arm/boot/dts/tegra-trimslice.dts +++ b/arch/arm/boot/dts/tegra-trimslice.dts | |||
| @@ -10,6 +10,236 @@ | |||
| 10 | reg = < 0x00000000 0x40000000 >; | 10 | reg = < 0x00000000 0x40000000 >; |
| 11 | }; | 11 | }; |
| 12 | 12 | ||
| 13 | pinmux@70000000 { | ||
| 14 | pinctrl-names = "default"; | ||
| 15 | pinctrl-0 = <&state_default>; | ||
| 16 | |||
| 17 | state_default: pinmux { | ||
| 18 | ata { | ||
| 19 | nvidia,pins = "ata"; | ||
| 20 | nvidia,function = "ide"; | ||
| 21 | }; | ||
| 22 | atb { | ||
| 23 | nvidia,pins = "atb", "gma"; | ||
| 24 | nvidia,function = "sdio4"; | ||
| 25 | }; | ||
| 26 | atc { | ||
| 27 | nvidia,pins = "atc", "gmb"; | ||
| 28 | nvidia,function = "nand"; | ||
| 29 | }; | ||
| 30 | atd { | ||
| 31 | nvidia,pins = "atd", "ate", "gme", "pta"; | ||
| 32 | nvidia,function = "gmi"; | ||
| 33 | }; | ||
| 34 | cdev1 { | ||
| 35 | nvidia,pins = "cdev1"; | ||
| 36 | nvidia,function = "plla_out"; | ||
| 37 | }; | ||
| 38 | cdev2 { | ||
| 39 | nvidia,pins = "cdev2"; | ||
| 40 | nvidia,function = "pllp_out4"; | ||
| 41 | }; | ||
| 42 | crtp { | ||
| 43 | nvidia,pins = "crtp"; | ||
| 44 | nvidia,function = "crt"; | ||
| 45 | }; | ||
| 46 | csus { | ||
| 47 | nvidia,pins = "csus"; | ||
| 48 | nvidia,function = "vi_sensor_clk"; | ||
| 49 | }; | ||
| 50 | dap1 { | ||
| 51 | nvidia,pins = "dap1"; | ||
| 52 | nvidia,function = "dap1"; | ||
| 53 | }; | ||
| 54 | dap2 { | ||
| 55 | nvidia,pins = "dap2"; | ||
| 56 | nvidia,function = "dap2"; | ||
| 57 | }; | ||
| 58 | dap3 { | ||
| 59 | nvidia,pins = "dap3"; | ||
| 60 | nvidia,function = "dap3"; | ||
| 61 | }; | ||
| 62 | dap4 { | ||
| 63 | nvidia,pins = "dap4"; | ||
| 64 | nvidia,function = "dap4"; | ||
| 65 | }; | ||
| 66 | ddc { | ||
| 67 | nvidia,pins = "ddc"; | ||
| 68 | nvidia,function = "i2c2"; | ||
| 69 | }; | ||
| 70 | dta { | ||
| 71 | nvidia,pins = "dta", "dtb", "dtc", "dtd", "dte"; | ||
| 72 | nvidia,function = "vi"; | ||
| 73 | }; | ||
| 74 | dtf { | ||
| 75 | nvidia,pins = "dtf"; | ||
| 76 | nvidia,function = "i2c3"; | ||
| 77 | }; | ||
| 78 | gmc { | ||
| 79 | nvidia,pins = "gmc", "gmd"; | ||
| 80 | nvidia,function = "sflash"; | ||
| 81 | }; | ||
| 82 | gpu { | ||
| 83 | nvidia,pins = "gpu"; | ||
| 84 | nvidia,function = "uarta"; | ||
| 85 | }; | ||
| 86 | gpu7 { | ||
| 87 | nvidia,pins = "gpu7"; | ||
| 88 | nvidia,function = "rtck"; | ||
| 89 | }; | ||
| 90 | gpv { | ||
| 91 | nvidia,pins = "gpv", "slxa", "slxk"; | ||
| 92 | nvidia,function = "pcie"; | ||
| 93 | }; | ||
| 94 | hdint { | ||
| 95 | nvidia,pins = "hdint"; | ||
| 96 | nvidia,function = "hdmi"; | ||
| 97 | }; | ||
| 98 | i2cp { | ||
| 99 | nvidia,pins = "i2cp"; | ||
| 100 | nvidia,function = "i2cp"; | ||
| 101 | }; | ||
| 102 | irrx { | ||
| 103 | nvidia,pins = "irrx", "irtx"; | ||
| 104 | nvidia,function = "uartb"; | ||
| 105 | }; | ||
| 106 | kbca { | ||
| 107 | nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd", | ||
| 108 | "kbce", "kbcf"; | ||
| 109 | nvidia,function = "kbc"; | ||
| 110 | }; | ||
| 111 | lcsn { | ||
| 112 | nvidia,pins = "lcsn", "ld0", "ld1", "ld2", | ||
| 113 | "ld3", "ld4", "ld5", "ld6", "ld7", | ||
| 114 | "ld8", "ld9", "ld10", "ld11", "ld12", | ||
| 115 | "ld13", "ld14", "ld15", "ld16", "ld17", | ||
| 116 | "ldc", "ldi", "lhp0", "lhp1", "lhp2", | ||
| 117 | "lhs", "lm0", "lm1", "lpp", "lpw0", | ||
| 118 | "lpw1", "lpw2", "lsc0", "lsc1", "lsck", | ||
| 119 | "lsda", "lsdi", "lspi", "lvp0", "lvp1", | ||
| 120 | "lvs"; | ||
| 121 | nvidia,function = "displaya"; | ||
| 122 | }; | ||
| 123 | owc { | ||
| 124 | nvidia,pins = "owc", "uac"; | ||
| 125 | nvidia,function = "rsvd2"; | ||
| 126 | }; | ||
| 127 | pmc { | ||
| 128 | nvidia,pins = "pmc"; | ||
| 129 | nvidia,function = "pwr_on"; | ||
| 130 | }; | ||
| 131 | rm { | ||
| 132 | nvidia,pins = "rm"; | ||
| 133 | nvidia,function = "i2c1"; | ||
| 134 | }; | ||
| 135 | sdb { | ||
| 136 | nvidia,pins = "sdb", "sdc", "sdd"; | ||
| 137 | nvidia,function = "pwm"; | ||
| 138 | }; | ||
| 139 | sdio1 { | ||
| 140 | nvidia,pins = "sdio1"; | ||
| 141 | nvidia,function = "sdio1"; | ||
| 142 | }; | ||
| 143 | slxc { | ||
| 144 | nvidia,pins = "slxc", "slxd"; | ||
| 145 | nvidia,function = "sdio3"; | ||
| 146 | }; | ||
| 147 | spdi { | ||
| 148 | nvidia,pins = "spdi", "spdo"; | ||
| 149 | nvidia,function = "spdif"; | ||
| 150 | }; | ||
| 151 | spia { | ||
| 152 | nvidia,pins = "spia", "spib", "spic"; | ||
| 153 | nvidia,function = "spi2"; | ||
| 154 | }; | ||
| 155 | spid { | ||
| 156 | nvidia,pins = "spid", "spie", "spif"; | ||
| 157 | nvidia,function = "spi1"; | ||
| 158 | }; | ||
| 159 | spig { | ||
| 160 | nvidia,pins = "spig", "spih"; | ||
| 161 | nvidia,function = "spi2_alt"; | ||
| 162 | }; | ||
| 163 | uaa { | ||
| 164 | nvidia,pins = "uaa", "uab", "uda"; | ||
| 165 | nvidia,function = "ulpi"; | ||
| 166 | }; | ||
| 167 | uad { | ||
| 168 | nvidia,pins = "uad"; | ||
| 169 | nvidia,function = "irda"; | ||
| 170 | }; | ||
| 171 | uca { | ||
| 172 | nvidia,pins = "uca", "ucb"; | ||
| 173 | nvidia,function = "uartc"; | ||
| 174 | }; | ||
| 175 | conf_ata { | ||
| 176 | nvidia,pins = "ata", "atc", "atd", "ate", | ||
| 177 | "crtp", "dap2", "dap3", "dap4", "dta", | ||
| 178 | "dtb", "dtc", "dtd", "dte", "gmb", | ||
| 179 | "gme", "i2cp", "pta", "slxc", "slxd", | ||
| 180 | "spdi", "spdo", "uda"; | ||
| 181 | nvidia,pull = <0>; | ||
| 182 | nvidia,tristate = <1>; | ||
| 183 | }; | ||
| 184 | conf_atb { | ||
| 185 | nvidia,pins = "atb", "cdev1", "cdev2", "dap1", | ||
| 186 | "gma", "gmc", "gmd", "gpu", "gpu7", | ||
| 187 | "gpv", "sdio1", "slxa", "slxk", "uac"; | ||
| 188 | nvidia,pull = <0>; | ||
| 189 | nvidia,tristate = <0>; | ||
| 190 | }; | ||
| 191 | conf_ck32 { | ||
| 192 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", | ||
| 193 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; | ||
| 194 | nvidia,pull = <0>; | ||
| 195 | }; | ||
| 196 | conf_csus { | ||
| 197 | nvidia,pins = "csus", "spia", "spib", | ||
| 198 | "spid", "spif"; | ||
| 199 | nvidia,pull = <1>; | ||
| 200 | nvidia,tristate = <1>; | ||
| 201 | }; | ||
| 202 | conf_ddc { | ||
| 203 | nvidia,pins = "ddc", "dtf", "rm", "sdc", "sdd"; | ||
| 204 | nvidia,pull = <2>; | ||
| 205 | nvidia,tristate = <0>; | ||
| 206 | }; | ||
| 207 | conf_hdint { | ||
| 208 | nvidia,pins = "hdint", "lcsn", "ldc", "lm1", | ||
| 209 | "lpw1", "lsc1", "lsck", "lsda", "lsdi", | ||
| 210 | "lvp0", "pmc"; | ||
| 211 | nvidia,tristate = <1>; | ||
| 212 | }; | ||
| 213 | conf_irrx { | ||
| 214 | nvidia,pins = "irrx", "irtx", "kbca", "kbcb", | ||
| 215 | "kbcc", "kbcd", "kbce", "kbcf", "owc", | ||
| 216 | "spic", "spie", "spig", "spih", "uaa", | ||
| 217 | "uab", "uad", "uca", "ucb"; | ||
| 218 | nvidia,pull = <2>; | ||
| 219 | nvidia,tristate = <1>; | ||
| 220 | }; | ||
| 221 | conf_lc { | ||
| 222 | nvidia,pins = "lc", "ls"; | ||
| 223 | nvidia,pull = <2>; | ||
| 224 | }; | ||
| 225 | conf_ld0 { | ||
| 226 | nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4", | ||
| 227 | "ld5", "ld6", "ld7", "ld8", "ld9", | ||
| 228 | "ld10", "ld11", "ld12", "ld13", "ld14", | ||
| 229 | "ld15", "ld16", "ld17", "ldi", "lhp0", | ||
| 230 | "lhp1", "lhp2", "lhs", "lm0", "lpp", | ||
| 231 | "lpw0", "lpw2", "lsc0", "lspi", "lvp1", | ||
| 232 | "lvs", "sdb"; | ||
| 233 | nvidia,tristate = <0>; | ||
| 234 | }; | ||
| 235 | conf_ld17_0 { | ||
| 236 | nvidia,pins = "ld17_0", "ld19_18", "ld21_20", | ||
| 237 | "ld23_22"; | ||
| 238 | nvidia,pull = <1>; | ||
| 239 | }; | ||
| 240 | }; | ||
| 241 | }; | ||
| 242 | |||
| 13 | i2c@7000c000 { | 243 | i2c@7000c000 { |
| 14 | clock-frequency = <400000>; | 244 | clock-frequency = <400000>; |
| 15 | }; | 245 | }; |
| @@ -74,4 +304,8 @@ | |||
| 74 | cd-gpios = <&gpio 121 0>; | 304 | cd-gpios = <&gpio 121 0>; |
| 75 | wp-gpios = <&gpio 122 0>; | 305 | wp-gpios = <&gpio 122 0>; |
| 76 | }; | 306 | }; |
| 307 | |||
| 308 | usb@c5004000 { | ||
| 309 | nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */ | ||
| 310 | }; | ||
| 77 | }; | 311 | }; |
diff --git a/arch/arm/boot/dts/tegra-ventana.dts b/arch/arm/boot/dts/tegra-ventana.dts index 2dcff8728e90..bd074cfb338f 100644 --- a/arch/arm/boot/dts/tegra-ventana.dts +++ b/arch/arm/boot/dts/tegra-ventana.dts | |||
| @@ -10,6 +10,236 @@ | |||
| 10 | reg = < 0x00000000 0x40000000 >; | 10 | reg = < 0x00000000 0x40000000 >; |
| 11 | }; | 11 | }; |
| 12 | 12 | ||
| 13 | pinmux@70000000 { | ||
| 14 | pinctrl-names = "default"; | ||
| 15 | pinctrl-0 = <&state_default>; | ||
| 16 | |||
| 17 | state_default: pinmux { | ||
| 18 | ata { | ||
| 19 | nvidia,pins = "ata"; | ||
| 20 | nvidia,function = "ide"; | ||
| 21 | }; | ||
| 22 | atb { | ||
| 23 | nvidia,pins = "atb", "gma", "gme"; | ||
| 24 | nvidia,function = "sdio4"; | ||
| 25 | }; | ||
| 26 | atc { | ||
| 27 | nvidia,pins = "atc"; | ||
| 28 | nvidia,function = "nand"; | ||
| 29 | }; | ||
| 30 | atd { | ||
| 31 | nvidia,pins = "atd", "ate", "gmb", "spia", | ||
| 32 | "spib", "spic"; | ||
| 33 | nvidia,function = "gmi"; | ||
| 34 | }; | ||
| 35 | cdev1 { | ||
| 36 | nvidia,pins = "cdev1"; | ||
| 37 | nvidia,function = "plla_out"; | ||
| 38 | }; | ||
| 39 | cdev2 { | ||
| 40 | nvidia,pins = "cdev2"; | ||
| 41 | nvidia,function = "pllp_out4"; | ||
| 42 | }; | ||
| 43 | crtp { | ||
| 44 | nvidia,pins = "crtp", "lm1"; | ||
| 45 | nvidia,function = "crt"; | ||
| 46 | }; | ||
| 47 | csus { | ||
| 48 | nvidia,pins = "csus"; | ||
| 49 | nvidia,function = "vi_sensor_clk"; | ||
| 50 | }; | ||
| 51 | dap1 { | ||
| 52 | nvidia,pins = "dap1"; | ||
| 53 | nvidia,function = "dap1"; | ||
| 54 | }; | ||
| 55 | dap2 { | ||
| 56 | nvidia,pins = "dap2"; | ||
| 57 | nvidia,function = "dap2"; | ||
| 58 | }; | ||
| 59 | dap3 { | ||
| 60 | nvidia,pins = "dap3"; | ||
| 61 | nvidia,function = "dap3"; | ||
| 62 | }; | ||
| 63 | dap4 { | ||
| 64 | nvidia,pins = "dap4"; | ||
| 65 | nvidia,function = "dap4"; | ||
| 66 | }; | ||
| 67 | ddc { | ||
| 68 | nvidia,pins = "ddc", "owc", "spdi", "spdo", | ||
| 69 | "uac"; | ||
| 70 | nvidia,function = "rsvd2"; | ||
| 71 | }; | ||
| 72 | dta { | ||
| 73 | nvidia,pins = "dta", "dtb", "dtc", "dtd", "dte"; | ||
| 74 | nvidia,function = "vi"; | ||
| 75 | }; | ||
| 76 | dtf { | ||
| 77 | nvidia,pins = "dtf"; | ||
| 78 | nvidia,function = "i2c3"; | ||
| 79 | }; | ||
| 80 | gmc { | ||
| 81 | nvidia,pins = "gmc"; | ||
| 82 | nvidia,function = "uartd"; | ||
| 83 | }; | ||
| 84 | gmd { | ||
| 85 | nvidia,pins = "gmd"; | ||
| 86 | nvidia,function = "sflash"; | ||
| 87 | }; | ||
| 88 | gpu { | ||
| 89 | nvidia,pins = "gpu"; | ||
| 90 | nvidia,function = "pwm"; | ||
| 91 | }; | ||
| 92 | gpu7 { | ||
| 93 | nvidia,pins = "gpu7"; | ||
| 94 | nvidia,function = "rtck"; | ||
| 95 | }; | ||
| 96 | gpv { | ||
| 97 | nvidia,pins = "gpv", "slxa", "slxk"; | ||
| 98 | nvidia,function = "pcie"; | ||
| 99 | }; | ||
| 100 | hdint { | ||
| 101 | nvidia,pins = "hdint", "pta"; | ||
| 102 | nvidia,function = "hdmi"; | ||
| 103 | }; | ||
| 104 | i2cp { | ||
| 105 | nvidia,pins = "i2cp"; | ||
| 106 | nvidia,function = "i2cp"; | ||
| 107 | }; | ||
| 108 | irrx { | ||
| 109 | nvidia,pins = "irrx", "irtx"; | ||
| 110 | nvidia,function = "uartb"; | ||
| 111 | }; | ||
| 112 | kbca { | ||
| 113 | nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd", | ||
| 114 | "kbce", "kbcf"; | ||
| 115 | nvidia,function = "kbc"; | ||
| 116 | }; | ||
| 117 | lcsn { | ||
| 118 | nvidia,pins = "lcsn", "ldc", "lm0", "lpw1", | ||
| 119 | "lsdi", "lvp0"; | ||
| 120 | nvidia,function = "rsvd4"; | ||
| 121 | }; | ||
| 122 | ld0 { | ||
| 123 | nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4", | ||
| 124 | "ld5", "ld6", "ld7", "ld8", "ld9", | ||
| 125 | "ld10", "ld11", "ld12", "ld13", "ld14", | ||
| 126 | "ld15", "ld16", "ld17", "ldi", "lhp0", | ||
| 127 | "lhp1", "lhp2", "lhs", "lpp", "lpw0", | ||
| 128 | "lpw2", "lsc0", "lsc1", "lsck", "lsda", | ||
| 129 | "lspi", "lvp1", "lvs"; | ||
| 130 | nvidia,function = "displaya"; | ||
| 131 | }; | ||
| 132 | pmc { | ||
| 133 | nvidia,pins = "pmc"; | ||
| 134 | nvidia,function = "pwr_on"; | ||
| 135 | }; | ||
| 136 | rm { | ||
| 137 | nvidia,pins = "rm"; | ||
| 138 | nvidia,function = "i2c1"; | ||
| 139 | }; | ||
| 140 | sdb { | ||
| 141 | nvidia,pins = "sdb", "sdc", "sdd", "slxc"; | ||
| 142 | nvidia,function = "sdio3"; | ||
| 143 | }; | ||
| 144 | sdio1 { | ||
| 145 | nvidia,pins = "sdio1"; | ||
| 146 | nvidia,function = "sdio1"; | ||
| 147 | }; | ||
| 148 | slxd { | ||
| 149 | nvidia,pins = "slxd"; | ||
| 150 | nvidia,function = "spdif"; | ||
| 151 | }; | ||
| 152 | spid { | ||
| 153 | nvidia,pins = "spid", "spie", "spif"; | ||
| 154 | nvidia,function = "spi1"; | ||
| 155 | }; | ||
| 156 | spig { | ||
| 157 | nvidia,pins = "spig", "spih"; | ||
| 158 | nvidia,function = "spi2_alt"; | ||
| 159 | }; | ||
| 160 | uaa { | ||
| 161 | nvidia,pins = "uaa", "uab", "uda"; | ||
| 162 | nvidia,function = "ulpi"; | ||
| 163 | }; | ||
| 164 | uad { | ||
| 165 | nvidia,pins = "uad"; | ||
| 166 | nvidia,function = "irda"; | ||
| 167 | }; | ||
| 168 | uca { | ||
| 169 | nvidia,pins = "uca", "ucb"; | ||
| 170 | nvidia,function = "uartc"; | ||
| 171 | }; | ||
| 172 | conf_ata { | ||
| 173 | nvidia,pins = "ata", "atb", "atc", "atd", | ||
| 174 | "cdev1", "cdev2", "dap1", "dap2", | ||
| 175 | "dap4", "ddc", "dtf", "gma", "gmc", | ||
| 176 | "gme", "gpu", "gpu7", "i2cp", "irrx", | ||
| 177 | "irtx", "pta", "rm", "sdc", "sdd", | ||
| 178 | "slxc", "slxd", "slxk", "spdi", "spdo", | ||
| 179 | "uac", "uad", "uca", "ucb", "uda"; | ||
| 180 | nvidia,pull = <0>; | ||
| 181 | nvidia,tristate = <0>; | ||
| 182 | }; | ||
| 183 | conf_ate { | ||
| 184 | nvidia,pins = "ate", "csus", "dap3", "gmd", | ||
| 185 | "gpv", "owc", "spia", "spib", "spic", | ||
| 186 | "spid", "spie", "spig"; | ||
| 187 | nvidia,pull = <0>; | ||
| 188 | nvidia,tristate = <1>; | ||
| 189 | }; | ||
| 190 | conf_ck32 { | ||
| 191 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", | ||
| 192 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; | ||
| 193 | nvidia,pull = <0>; | ||
| 194 | }; | ||
| 195 | conf_crtp { | ||
| 196 | nvidia,pins = "crtp", "gmb", "slxa", "spih"; | ||
| 197 | nvidia,pull = <2>; | ||
| 198 | nvidia,tristate = <1>; | ||
| 199 | }; | ||
| 200 | conf_dta { | ||
| 201 | nvidia,pins = "dta", "dtb", "dtc", "dtd"; | ||
| 202 | nvidia,pull = <1>; | ||
| 203 | nvidia,tristate = <0>; | ||
| 204 | }; | ||
| 205 | conf_dte { | ||
| 206 | nvidia,pins = "dte", "spif"; | ||
| 207 | nvidia,pull = <1>; | ||
| 208 | nvidia,tristate = <1>; | ||
| 209 | }; | ||
| 210 | conf_hdint { | ||
| 211 | nvidia,pins = "hdint", "lcsn", "ldc", "lm1", | ||
| 212 | "lpw1", "lsck", "lsda", "lsdi", "lvp0"; | ||
| 213 | nvidia,tristate = <1>; | ||
| 214 | }; | ||
| 215 | conf_kbca { | ||
| 216 | nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd", | ||
| 217 | "kbce", "kbcf", "sdio1", "uaa", "uab"; | ||
| 218 | nvidia,pull = <2>; | ||
| 219 | nvidia,tristate = <0>; | ||
| 220 | }; | ||
| 221 | conf_lc { | ||
| 222 | nvidia,pins = "lc", "ls"; | ||
| 223 | nvidia,pull = <2>; | ||
| 224 | }; | ||
| 225 | conf_ld0 { | ||
| 226 | nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4", | ||
| 227 | "ld5", "ld6", "ld7", "ld8", "ld9", | ||
| 228 | "ld10", "ld11", "ld12", "ld13", "ld14", | ||
| 229 | "ld15", "ld16", "ld17", "ldi", "lhp0", | ||
| 230 | "lhp1", "lhp2", "lhs", "lm0", "lpp", | ||
| 231 | "lpw0", "lpw2", "lsc0", "lsc1", "lspi", | ||
| 232 | "lvp1", "lvs", "pmc", "sdb"; | ||
| 233 | nvidia,tristate = <0>; | ||
| 234 | }; | ||
| 235 | conf_ld17_0 { | ||
| 236 | nvidia,pins = "ld17_0", "ld19_18", "ld21_20", | ||
| 237 | "ld23_22"; | ||
| 238 | nvidia,pull = <1>; | ||
| 239 | }; | ||
| 240 | }; | ||
| 241 | }; | ||
| 242 | |||
| 13 | i2c@7000c000 { | 243 | i2c@7000c000 { |
| 14 | clock-frequency = <400000>; | 244 | clock-frequency = <400000>; |
| 15 | 245 | ||
| @@ -105,4 +335,8 @@ | |||
| 105 | sdhci@c8000600 { | 335 | sdhci@c8000600 { |
| 106 | support-8bit; | 336 | support-8bit; |
| 107 | }; | 337 | }; |
| 338 | |||
| 339 | usb@c5004000 { | ||
| 340 | nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */ | ||
| 341 | }; | ||
| 108 | }; | 342 | }; |
diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile index d87d968115ec..2eb4445ddb14 100644 --- a/arch/arm/mach-tegra/Makefile +++ b/arch/arm/mach-tegra/Makefile | |||
| @@ -5,7 +5,6 @@ obj-y += io.o | |||
| 5 | obj-y += irq.o | 5 | obj-y += irq.o |
| 6 | obj-y += clock.o | 6 | obj-y += clock.o |
| 7 | obj-y += timer.o | 7 | obj-y += timer.o |
| 8 | obj-y += pinmux.o | ||
| 9 | obj-y += fuse.o | 8 | obj-y += fuse.o |
| 10 | obj-y += pmc.o | 9 | obj-y += pmc.o |
| 11 | obj-y += flowctrl.o | 10 | obj-y += flowctrl.o |
| @@ -14,8 +13,6 @@ obj-$(CONFIG_CPU_IDLE) += sleep.o | |||
| 14 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += powergate.o | 13 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += powergate.o |
| 15 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_clocks.o | 14 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_clocks.o |
| 16 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_emc.o | 15 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_emc.o |
| 17 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += pinmux-tegra20-tables.o | ||
| 18 | obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += pinmux-tegra30-tables.o | ||
| 19 | obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += board-dt-tegra30.o | 16 | obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += board-dt-tegra30.o |
| 20 | obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += tegra30_clocks.o | 17 | obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += tegra30_clocks.o |
| 21 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o | 18 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o |
diff --git a/arch/arm/mach-tegra/board-dt-tegra20.c b/arch/arm/mach-tegra/board-dt-tegra20.c index 0952494f481a..5b9d5f4c0686 100644 --- a/arch/arm/mach-tegra/board-dt-tegra20.c +++ b/arch/arm/mach-tegra/board-dt-tegra20.c | |||
| @@ -47,15 +47,7 @@ | |||
| 47 | #include "clock.h" | 47 | #include "clock.h" |
| 48 | #include "devices.h" | 48 | #include "devices.h" |
| 49 | 49 | ||
| 50 | void harmony_pinmux_init(void); | ||
| 51 | void paz00_pinmux_init(void); | ||
| 52 | void seaboard_pinmux_init(void); | ||
| 53 | void trimslice_pinmux_init(void); | ||
| 54 | void ventana_pinmux_init(void); | ||
| 55 | |||
| 56 | struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = { | 50 | struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = { |
| 57 | OF_DEV_AUXDATA("nvidia,tegra20-pinmux", TEGRA_APB_MISC_BASE + 0x14, "tegra-pinmux", NULL), | ||
| 58 | OF_DEV_AUXDATA("nvidia,tegra20-gpio", TEGRA_GPIO_BASE, "tegra-gpio", NULL), | ||
| 59 | OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC1_BASE, "sdhci-tegra.0", NULL), | 51 | OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC1_BASE, "sdhci-tegra.0", NULL), |
| 60 | OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC2_BASE, "sdhci-tegra.1", NULL), | 52 | OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC2_BASE, "sdhci-tegra.1", NULL), |
| 61 | OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC3_BASE, "sdhci-tegra.2", NULL), | 53 | OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC3_BASE, "sdhci-tegra.2", NULL), |
| @@ -95,33 +87,10 @@ static struct of_device_id tegra_dt_match_table[] __initdata = { | |||
| 95 | {} | 87 | {} |
| 96 | }; | 88 | }; |
| 97 | 89 | ||
| 98 | static struct { | ||
| 99 | char *machine; | ||
| 100 | void (*init)(void); | ||
| 101 | } pinmux_configs[] = { | ||
| 102 | { "compulab,trimslice", trimslice_pinmux_init }, | ||
| 103 | { "nvidia,harmony", harmony_pinmux_init }, | ||
| 104 | { "compal,paz00", paz00_pinmux_init }, | ||
| 105 | { "nvidia,seaboard", seaboard_pinmux_init }, | ||
| 106 | { "nvidia,ventana", ventana_pinmux_init }, | ||
| 107 | }; | ||
| 108 | |||
| 109 | static void __init tegra_dt_init(void) | 90 | static void __init tegra_dt_init(void) |
| 110 | { | 91 | { |
| 111 | int i; | ||
| 112 | |||
| 113 | tegra_clk_init_from_table(tegra_dt_clk_init_table); | 92 | tegra_clk_init_from_table(tegra_dt_clk_init_table); |
| 114 | 93 | ||
| 115 | for (i = 0; i < ARRAY_SIZE(pinmux_configs); i++) { | ||
| 116 | if (of_machine_is_compatible(pinmux_configs[i].machine)) { | ||
| 117 | pinmux_configs[i].init(); | ||
| 118 | break; | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | WARN(i == ARRAY_SIZE(pinmux_configs), | ||
| 123 | "Unknown platform! Pinmuxing not initialized\n"); | ||
| 124 | |||
| 125 | /* | 94 | /* |
| 126 | * Finished with the static registrations now; fill in the missing | 95 | * Finished with the static registrations now; fill in the missing |
| 127 | * devices | 96 | * devices |
diff --git a/arch/arm/mach-tegra/board-harmony-pinmux.c b/arch/arm/mach-tegra/board-harmony-pinmux.c index 1af85bccc0f1..83d420fbc58c 100644 --- a/arch/arm/mach-tegra/board-harmony-pinmux.c +++ b/arch/arm/mach-tegra/board-harmony-pinmux.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * arch/arm/mach-tegra/board-harmony-pinmux.c | 2 | * arch/arm/mach-tegra/board-harmony-pinmux.c |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2010 Google, Inc. | 4 | * Copyright (C) 2010 Google, Inc. |
| 5 | * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. | ||
| 5 | * | 6 | * |
| 6 | * This software is licensed under the terms of the GNU General Public | 7 | * This software is licensed under the terms of the GNU General Public |
| 7 | * License version 2, as published by the Free Software Foundation, and | 8 | * License version 2, as published by the Free Software Foundation, and |
| @@ -15,153 +16,138 @@ | |||
| 15 | */ | 16 | */ |
| 16 | 17 | ||
| 17 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
| 18 | #include <linux/gpio.h> | ||
| 19 | #include <linux/of.h> | ||
| 20 | 19 | ||
| 21 | #include <mach/pinmux.h> | ||
| 22 | #include <mach/pinmux-tegra20.h> | ||
| 23 | |||
| 24 | #include "gpio-names.h" | ||
| 25 | #include "board-harmony.h" | 20 | #include "board-harmony.h" |
| 26 | #include "board-pinmux.h" | 21 | #include "board-pinmux.h" |
| 27 | 22 | ||
| 28 | static struct tegra_pingroup_config harmony_pinmux[] = { | 23 | static struct pinctrl_map harmony_map[] = { |
| 29 | {TEGRA_PINGROUP_ATA, TEGRA_MUX_IDE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 24 | TEGRA_MAP_MUXCONF("ata", "ide", none, driven), |
| 30 | {TEGRA_PINGROUP_ATB, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 25 | TEGRA_MAP_MUXCONF("atb", "sdio4", none, driven), |
| 31 | {TEGRA_PINGROUP_ATC, TEGRA_MUX_NAND, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 26 | TEGRA_MAP_MUXCONF("atc", "nand", none, driven), |
| 32 | {TEGRA_PINGROUP_ATD, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 27 | TEGRA_MAP_MUXCONF("atd", "gmi", none, driven), |
| 33 | {TEGRA_PINGROUP_ATE, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 28 | TEGRA_MAP_MUXCONF("ate", "gmi", none, driven), |
| 34 | {TEGRA_PINGROUP_CDEV1, TEGRA_MUX_PLLA_OUT, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 29 | TEGRA_MAP_MUXCONF("cdev1", "plla_out", none, driven), |
| 35 | {TEGRA_PINGROUP_CDEV2, TEGRA_MUX_PLLP_OUT4, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 30 | TEGRA_MAP_MUXCONF("cdev2", "pllp_out4", down, tristate), |
| 36 | {TEGRA_PINGROUP_CRTP, TEGRA_MUX_CRT, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 31 | TEGRA_MAP_MUXCONF("crtp", "crt", none, tristate), |
| 37 | {TEGRA_PINGROUP_CSUS, TEGRA_MUX_VI_SENSOR_CLK, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 32 | TEGRA_MAP_MUXCONF("csus", "vi_sensor_clk", down, tristate), |
| 38 | {TEGRA_PINGROUP_DAP1, TEGRA_MUX_DAP1, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 33 | TEGRA_MAP_MUXCONF("dap1", "dap1", none, driven), |
| 39 | {TEGRA_PINGROUP_DAP2, TEGRA_MUX_DAP2, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 34 | TEGRA_MAP_MUXCONF("dap2", "dap2", none, tristate), |
| 40 | {TEGRA_PINGROUP_DAP3, TEGRA_MUX_DAP3, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 35 | TEGRA_MAP_MUXCONF("dap3", "dap3", none, tristate), |
| 41 | {TEGRA_PINGROUP_DAP4, TEGRA_MUX_DAP4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 36 | TEGRA_MAP_MUXCONF("dap4", "dap4", none, tristate), |
| 42 | {TEGRA_PINGROUP_DDC, TEGRA_MUX_I2C2, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 37 | TEGRA_MAP_MUXCONF("ddc", "i2c2", up, driven), |
| 43 | {TEGRA_PINGROUP_DTA, TEGRA_MUX_SDIO2, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 38 | TEGRA_MAP_MUXCONF("dta", "sdio2", up, driven), |
| 44 | {TEGRA_PINGROUP_DTB, TEGRA_MUX_RSVD1, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 39 | TEGRA_MAP_MUXCONF("dtb", "rsvd1", none, driven), |
| 45 | {TEGRA_PINGROUP_DTC, TEGRA_MUX_RSVD1, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 40 | TEGRA_MAP_MUXCONF("dtc", "rsvd1", none, tristate), |
| 46 | {TEGRA_PINGROUP_DTD, TEGRA_MUX_SDIO2, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 41 | TEGRA_MAP_MUXCONF("dtd", "sdio2", up, driven), |
| 47 | {TEGRA_PINGROUP_DTE, TEGRA_MUX_RSVD1, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 42 | TEGRA_MAP_MUXCONF("dte", "rsvd1", none, tristate), |
| 48 | {TEGRA_PINGROUP_DTF, TEGRA_MUX_I2C3, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 43 | TEGRA_MAP_MUXCONF("dtf", "i2c3", none, tristate), |
| 49 | {TEGRA_PINGROUP_GMA, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 44 | TEGRA_MAP_MUXCONF("gma", "sdio4", none, driven), |
| 50 | {TEGRA_PINGROUP_GMB, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 45 | TEGRA_MAP_MUXCONF("gmb", "gmi", none, driven), |
| 51 | {TEGRA_PINGROUP_GMC, TEGRA_MUX_UARTD, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 46 | TEGRA_MAP_MUXCONF("gmc", "uartd", none, driven), |
| 52 | {TEGRA_PINGROUP_GMD, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 47 | TEGRA_MAP_MUXCONF("gmd", "gmi", none, driven), |
| 53 | {TEGRA_PINGROUP_GME, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 48 | TEGRA_MAP_MUXCONF("gme", "sdio4", none, driven), |
| 54 | {TEGRA_PINGROUP_GPU, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 49 | TEGRA_MAP_MUXCONF("gpu", "gmi", none, tristate), |
| 55 | {TEGRA_PINGROUP_GPU7, TEGRA_MUX_RTCK, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 50 | TEGRA_MAP_MUXCONF("gpu7", "rtck", none, driven), |
| 56 | {TEGRA_PINGROUP_GPV, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 51 | TEGRA_MAP_MUXCONF("gpv", "pcie", none, driven), |
| 57 | {TEGRA_PINGROUP_HDINT, TEGRA_MUX_HDMI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 52 | TEGRA_MAP_MUXCONF("hdint", "hdmi", na, tristate), |
| 58 | {TEGRA_PINGROUP_I2CP, TEGRA_MUX_I2C, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 53 | TEGRA_MAP_MUXCONF("i2cp", "i2cp", none, driven), |
| 59 | {TEGRA_PINGROUP_IRRX, TEGRA_MUX_UARTA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 54 | TEGRA_MAP_MUXCONF("irrx", "uarta", up, tristate), |
| 60 | {TEGRA_PINGROUP_IRTX, TEGRA_MUX_UARTA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 55 | TEGRA_MAP_MUXCONF("irtx", "uarta", up, tristate), |
| 61 | {TEGRA_PINGROUP_KBCA, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 56 | TEGRA_MAP_MUXCONF("kbca", "kbc", up, driven), |
| 62 | {TEGRA_PINGROUP_KBCB, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 57 | TEGRA_MAP_MUXCONF("kbcb", "kbc", up, driven), |
| 63 | {TEGRA_PINGROUP_KBCC, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 58 | TEGRA_MAP_MUXCONF("kbcc", "kbc", up, driven), |
| 64 | {TEGRA_PINGROUP_KBCD, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 59 | TEGRA_MAP_MUXCONF("kbcd", "kbc", up, driven), |
| 65 | {TEGRA_PINGROUP_KBCE, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 60 | TEGRA_MAP_MUXCONF("kbce", "kbc", up, driven), |
| 66 | {TEGRA_PINGROUP_KBCF, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 61 | TEGRA_MAP_MUXCONF("kbcf", "kbc", up, driven), |
| 67 | {TEGRA_PINGROUP_LCSN, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 62 | TEGRA_MAP_MUXCONF("lcsn", "displaya", na, tristate), |
| 68 | {TEGRA_PINGROUP_LD0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 63 | TEGRA_MAP_MUXCONF("ld0", "displaya", na, driven), |
| 69 | {TEGRA_PINGROUP_LD1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 64 | TEGRA_MAP_MUXCONF("ld1", "displaya", na, driven), |
| 70 | {TEGRA_PINGROUP_LD10, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 65 | TEGRA_MAP_MUXCONF("ld10", "displaya", na, driven), |
| 71 | {TEGRA_PINGROUP_LD11, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 66 | TEGRA_MAP_MUXCONF("ld11", "displaya", na, driven), |
| 72 | {TEGRA_PINGROUP_LD12, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 67 | TEGRA_MAP_MUXCONF("ld12", "displaya", na, driven), |
| 73 | {TEGRA_PINGROUP_LD13, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 68 | TEGRA_MAP_MUXCONF("ld13", "displaya", na, driven), |
| 74 | {TEGRA_PINGROUP_LD14, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 69 | TEGRA_MAP_MUXCONF("ld14", "displaya", na, driven), |
| 75 | {TEGRA_PINGROUP_LD15, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 70 | TEGRA_MAP_MUXCONF("ld15", "displaya", na, driven), |
| 76 | {TEGRA_PINGROUP_LD16, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 71 | TEGRA_MAP_MUXCONF("ld16", "displaya", na, driven), |
| 77 | {TEGRA_PINGROUP_LD17, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 72 | TEGRA_MAP_MUXCONF("ld17", "displaya", na, driven), |
| 78 | {TEGRA_PINGROUP_LD2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 73 | TEGRA_MAP_MUXCONF("ld2", "displaya", na, driven), |
| 79 | {TEGRA_PINGROUP_LD3, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 74 | TEGRA_MAP_MUXCONF("ld3", "displaya", na, driven), |
| 80 | {TEGRA_PINGROUP_LD4, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 75 | TEGRA_MAP_MUXCONF("ld4", "displaya", na, driven), |
| 81 | {TEGRA_PINGROUP_LD5, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 76 | TEGRA_MAP_MUXCONF("ld5", "displaya", na, driven), |
| 82 | {TEGRA_PINGROUP_LD6, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 77 | TEGRA_MAP_MUXCONF("ld6", "displaya", na, driven), |
| 83 | {TEGRA_PINGROUP_LD7, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 78 | TEGRA_MAP_MUXCONF("ld7", "displaya", na, driven), |
| 84 | {TEGRA_PINGROUP_LD8, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 79 | TEGRA_MAP_MUXCONF("ld8", "displaya", na, driven), |
| 85 | {TEGRA_PINGROUP_LD9, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 80 | TEGRA_MAP_MUXCONF("ld9", "displaya", na, driven), |
| 86 | {TEGRA_PINGROUP_LDC, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 81 | TEGRA_MAP_MUXCONF("ldc", "displaya", na, tristate), |
| 87 | {TEGRA_PINGROUP_LDI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 82 | TEGRA_MAP_MUXCONF("ldi", "displaya", na, driven), |
| 88 | {TEGRA_PINGROUP_LHP0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 83 | TEGRA_MAP_MUXCONF("lhp0", "displaya", na, driven), |
| 89 | {TEGRA_PINGROUP_LHP1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 84 | TEGRA_MAP_MUXCONF("lhp1", "displaya", na, driven), |
| 90 | {TEGRA_PINGROUP_LHP2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 85 | TEGRA_MAP_MUXCONF("lhp2", "displaya", na, driven), |
| 91 | {TEGRA_PINGROUP_LHS, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 86 | TEGRA_MAP_MUXCONF("lhs", "displaya", na, driven), |
| 92 | {TEGRA_PINGROUP_LM0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 87 | TEGRA_MAP_MUXCONF("lm0", "displaya", na, driven), |
| 93 | {TEGRA_PINGROUP_LM1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 88 | TEGRA_MAP_MUXCONF("lm1", "displaya", na, tristate), |
| 94 | {TEGRA_PINGROUP_LPP, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 89 | TEGRA_MAP_MUXCONF("lpp", "displaya", na, driven), |
| 95 | {TEGRA_PINGROUP_LPW0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 90 | TEGRA_MAP_MUXCONF("lpw0", "displaya", na, driven), |
| 96 | {TEGRA_PINGROUP_LPW1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 91 | TEGRA_MAP_MUXCONF("lpw1", "displaya", na, tristate), |
| 97 | {TEGRA_PINGROUP_LPW2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 92 | TEGRA_MAP_MUXCONF("lpw2", "displaya", na, driven), |
| 98 | {TEGRA_PINGROUP_LSC0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 93 | TEGRA_MAP_MUXCONF("lsc0", "displaya", na, driven), |
| 99 | {TEGRA_PINGROUP_LSC1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 94 | TEGRA_MAP_MUXCONF("lsc1", "displaya", na, tristate), |
| 100 | {TEGRA_PINGROUP_LSCK, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 95 | TEGRA_MAP_MUXCONF("lsck", "displaya", na, tristate), |
| 101 | {TEGRA_PINGROUP_LSDA, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 96 | TEGRA_MAP_MUXCONF("lsda", "displaya", na, tristate), |
| 102 | {TEGRA_PINGROUP_LSDI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 97 | TEGRA_MAP_MUXCONF("lsdi", "displaya", na, tristate), |
| 103 | {TEGRA_PINGROUP_LSPI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 98 | TEGRA_MAP_MUXCONF("lspi", "displaya", na, driven), |
| 104 | {TEGRA_PINGROUP_LVP0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 99 | TEGRA_MAP_MUXCONF("lvp0", "displaya", na, tristate), |
| 105 | {TEGRA_PINGROUP_LVP1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 100 | TEGRA_MAP_MUXCONF("lvp1", "displaya", na, driven), |
| 106 | {TEGRA_PINGROUP_LVS, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 101 | TEGRA_MAP_MUXCONF("lvs", "displaya", na, driven), |
| 107 | {TEGRA_PINGROUP_OWC, TEGRA_MUX_RSVD2, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 102 | TEGRA_MAP_MUXCONF("owc", "rsvd2", na, tristate), |
| 108 | {TEGRA_PINGROUP_PMC, TEGRA_MUX_PWR_ON, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 103 | TEGRA_MAP_MUXCONF("pmc", "pwr_on", na, driven), |
| 109 | {TEGRA_PINGROUP_PTA, TEGRA_MUX_HDMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 104 | TEGRA_MAP_MUXCONF("pta", "hdmi", none, driven), |
| 110 | {TEGRA_PINGROUP_RM, TEGRA_MUX_I2C, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 105 | TEGRA_MAP_MUXCONF("rm", "i2c1", none, driven), |
| 111 | {TEGRA_PINGROUP_SDB, TEGRA_MUX_PWM, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 106 | TEGRA_MAP_MUXCONF("sdb", "pwm", na, tristate), |
| 112 | {TEGRA_PINGROUP_SDC, TEGRA_MUX_PWM, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 107 | TEGRA_MAP_MUXCONF("sdc", "pwm", up, driven), |
| 113 | {TEGRA_PINGROUP_SDD, TEGRA_MUX_PWM, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 108 | TEGRA_MAP_MUXCONF("sdd", "pwm", up, tristate), |
| 114 | {TEGRA_PINGROUP_SDIO1, TEGRA_MUX_SDIO1, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 109 | TEGRA_MAP_MUXCONF("sdio1", "sdio1", none, tristate), |
| 115 | {TEGRA_PINGROUP_SLXA, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 110 | TEGRA_MAP_MUXCONF("slxa", "pcie", none, driven), |
| 116 | {TEGRA_PINGROUP_SLXC, TEGRA_MUX_SPDIF, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 111 | TEGRA_MAP_MUXCONF("slxc", "spdif", none, tristate), |
| 117 | {TEGRA_PINGROUP_SLXD, TEGRA_MUX_SPDIF, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 112 | TEGRA_MAP_MUXCONF("slxd", "spdif", none, tristate), |
| 118 | {TEGRA_PINGROUP_SLXK, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 113 | TEGRA_MAP_MUXCONF("slxk", "pcie", none, driven), |
| 119 | {TEGRA_PINGROUP_SPDI, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 114 | TEGRA_MAP_MUXCONF("spdi", "rsvd2", none, tristate), |
| 120 | {TEGRA_PINGROUP_SPDO, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 115 | TEGRA_MAP_MUXCONF("spdo", "rsvd2", none, tristate), |
| 121 | {TEGRA_PINGROUP_SPIA, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 116 | TEGRA_MAP_MUXCONF("spia", "gmi", none, driven), |
| 122 | {TEGRA_PINGROUP_SPIB, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 117 | TEGRA_MAP_MUXCONF("spib", "gmi", none, driven), |
| 123 | {TEGRA_PINGROUP_SPIC, TEGRA_MUX_GMI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 118 | TEGRA_MAP_MUXCONF("spic", "gmi", up, tristate), |
| 124 | {TEGRA_PINGROUP_SPID, TEGRA_MUX_SPI1, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 119 | TEGRA_MAP_MUXCONF("spid", "spi1", down, tristate), |
| 125 | {TEGRA_PINGROUP_SPIE, TEGRA_MUX_SPI1, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 120 | TEGRA_MAP_MUXCONF("spie", "spi1", up, tristate), |
| 126 | {TEGRA_PINGROUP_SPIF, TEGRA_MUX_SPI1, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 121 | TEGRA_MAP_MUXCONF("spif", "spi1", down, tristate), |
| 127 | {TEGRA_PINGROUP_SPIG, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 122 | TEGRA_MAP_MUXCONF("spig", "spi2_alt", none, tristate), |
| 128 | {TEGRA_PINGROUP_SPIH, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 123 | TEGRA_MAP_MUXCONF("spih", "spi2_alt", up, tristate), |
| 129 | {TEGRA_PINGROUP_UAA, TEGRA_MUX_ULPI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 124 | TEGRA_MAP_MUXCONF("uaa", "ulpi", up, tristate), |
| 130 | {TEGRA_PINGROUP_UAB, TEGRA_MUX_ULPI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 125 | TEGRA_MAP_MUXCONF("uab", "ulpi", up, tristate), |
| 131 | {TEGRA_PINGROUP_UAC, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 126 | TEGRA_MAP_MUXCONF("uac", "rsvd2", none, tristate), |
| 132 | {TEGRA_PINGROUP_UAD, TEGRA_MUX_IRDA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 127 | TEGRA_MAP_MUXCONF("uad", "irda", up, tristate), |
| 133 | {TEGRA_PINGROUP_UCA, TEGRA_MUX_UARTC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 128 | TEGRA_MAP_MUXCONF("uca", "uartc", up, tristate), |
| 134 | {TEGRA_PINGROUP_UCB, TEGRA_MUX_UARTC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 129 | TEGRA_MAP_MUXCONF("ucb", "uartc", up, tristate), |
| 135 | {TEGRA_PINGROUP_UDA, TEGRA_MUX_ULPI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 130 | TEGRA_MAP_MUXCONF("uda", "ulpi", none, tristate), |
| 136 | {TEGRA_PINGROUP_CK32, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 131 | TEGRA_MAP_CONF("ck32", none, na), |
| 137 | {TEGRA_PINGROUP_DDRC, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 132 | TEGRA_MAP_CONF("ddrc", none, na), |
| 138 | {TEGRA_PINGROUP_PMCA, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 133 | TEGRA_MAP_CONF("pmca", none, na), |
| 139 | {TEGRA_PINGROUP_PMCB, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 134 | TEGRA_MAP_CONF("pmcb", none, na), |
| 140 | {TEGRA_PINGROUP_PMCC, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 135 | TEGRA_MAP_CONF("pmcc", none, na), |
| 141 | {TEGRA_PINGROUP_PMCD, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 136 | TEGRA_MAP_CONF("pmcd", none, na), |
| 142 | {TEGRA_PINGROUP_PMCE, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 137 | TEGRA_MAP_CONF("pmce", none, na), |
| 143 | {TEGRA_PINGROUP_XM2C, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 138 | TEGRA_MAP_CONF("xm2c", none, na), |
| 144 | {TEGRA_PINGROUP_XM2D, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 139 | TEGRA_MAP_CONF("xm2d", none, na), |
| 145 | }; | 140 | TEGRA_MAP_CONF("ls", up, na), |
| 146 | 141 | TEGRA_MAP_CONF("lc", up, na), | |
| 147 | static struct tegra_gpio_table gpio_table[] = { | 142 | TEGRA_MAP_CONF("ld17_0", down, na), |
| 148 | { .gpio = TEGRA_GPIO_SD2_CD, .enable = true }, | 143 | TEGRA_MAP_CONF("ld19_18", down, na), |
| 149 | { .gpio = TEGRA_GPIO_SD2_WP, .enable = true }, | 144 | TEGRA_MAP_CONF("ld21_20", down, na), |
| 150 | { .gpio = TEGRA_GPIO_SD2_POWER, .enable = true }, | 145 | TEGRA_MAP_CONF("ld23_22", down, na), |
| 151 | { .gpio = TEGRA_GPIO_SD4_CD, .enable = true }, | ||
| 152 | { .gpio = TEGRA_GPIO_SD4_WP, .enable = true }, | ||
| 153 | { .gpio = TEGRA_GPIO_SD4_POWER, .enable = true }, | ||
| 154 | { .gpio = TEGRA_GPIO_CDC_IRQ, .enable = true }, | ||
| 155 | { .gpio = TEGRA_GPIO_HP_DET, .enable = true }, | ||
| 156 | { .gpio = TEGRA_GPIO_INT_MIC_EN, .enable = true }, | ||
| 157 | { .gpio = TEGRA_GPIO_EXT_MIC_EN, .enable = true }, | ||
| 158 | }; | 146 | }; |
| 159 | 147 | ||
| 160 | static struct tegra_board_pinmux_conf conf = { | 148 | static struct tegra_board_pinmux_conf conf = { |
| 161 | .pgs = harmony_pinmux, | 149 | .maps = harmony_map, |
| 162 | .pg_count = ARRAY_SIZE(harmony_pinmux), | 150 | .map_count = ARRAY_SIZE(harmony_map), |
| 163 | .gpios = gpio_table, | ||
| 164 | .gpio_count = ARRAY_SIZE(gpio_table), | ||
| 165 | }; | 151 | }; |
| 166 | 152 | ||
| 167 | void harmony_pinmux_init(void) | 153 | void harmony_pinmux_init(void) |
diff --git a/arch/arm/mach-tegra/board-paz00-pinmux.c b/arch/arm/mach-tegra/board-paz00-pinmux.c index c775572dcea4..6f1111b48e7c 100644 --- a/arch/arm/mach-tegra/board-paz00-pinmux.c +++ b/arch/arm/mach-tegra/board-paz00-pinmux.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * arch/arm/mach-tegra/board-paz00-pinmux.c | 2 | * arch/arm/mach-tegra/board-paz00-pinmux.c |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2010 Marc Dietrich <marvin24@gmx.de> | 4 | * Copyright (C) 2010 Marc Dietrich <marvin24@gmx.de> |
| 5 | * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. | ||
| 5 | * | 6 | * |
| 6 | * This software is licensed under the terms of the GNU General Public | 7 | * This software is licensed under the terms of the GNU General Public |
| 7 | * License version 2, as published by the Free Software Foundation, and | 8 | * License version 2, as published by the Free Software Foundation, and |
| @@ -15,150 +16,138 @@ | |||
| 15 | */ | 16 | */ |
| 16 | 17 | ||
| 17 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
| 18 | #include <linux/gpio.h> | ||
| 19 | #include <linux/of.h> | ||
| 20 | 19 | ||
| 21 | #include <mach/pinmux.h> | ||
| 22 | #include <mach/pinmux-tegra20.h> | ||
| 23 | |||
| 24 | #include "gpio-names.h" | ||
| 25 | #include "board-paz00.h" | 20 | #include "board-paz00.h" |
| 26 | #include "board-pinmux.h" | 21 | #include "board-pinmux.h" |
| 27 | 22 | ||
| 28 | static struct tegra_pingroup_config paz00_pinmux[] = { | 23 | static struct pinctrl_map paz00_map[] = { |
| 29 | {TEGRA_PINGROUP_ATA, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 24 | TEGRA_MAP_MUXCONF("ata", "gmi", none, driven), |
| 30 | {TEGRA_PINGROUP_ATB, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 25 | TEGRA_MAP_MUXCONF("atb", "sdio4", none, driven), |
| 31 | {TEGRA_PINGROUP_ATC, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 26 | TEGRA_MAP_MUXCONF("atc", "gmi", none, driven), |
| 32 | {TEGRA_PINGROUP_ATD, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 27 | TEGRA_MAP_MUXCONF("atd", "gmi", none, driven), |
| 33 | {TEGRA_PINGROUP_ATE, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 28 | TEGRA_MAP_MUXCONF("ate", "gmi", none, driven), |
| 34 | {TEGRA_PINGROUP_CDEV1, TEGRA_MUX_PLLA_OUT, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 29 | TEGRA_MAP_MUXCONF("cdev1", "plla_out", none, driven), |
| 35 | {TEGRA_PINGROUP_CDEV2, TEGRA_MUX_PLLP_OUT4, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 30 | TEGRA_MAP_MUXCONF("cdev2", "pllp_out4", down, driven), |
| 36 | {TEGRA_PINGROUP_CRTP, TEGRA_MUX_CRT, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 31 | TEGRA_MAP_MUXCONF("crtp", "crt", none, tristate), |
| 37 | {TEGRA_PINGROUP_CSUS, TEGRA_MUX_PLLC_OUT1, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 32 | TEGRA_MAP_MUXCONF("csus", "pllc_out1", down, tristate), |
| 38 | {TEGRA_PINGROUP_DAP1, TEGRA_MUX_DAP1, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 33 | TEGRA_MAP_MUXCONF("dap1", "dap1", none, driven), |
| 39 | {TEGRA_PINGROUP_DAP2, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 34 | TEGRA_MAP_MUXCONF("dap2", "gmi", none, driven), |
| 40 | {TEGRA_PINGROUP_DAP3, TEGRA_MUX_DAP3, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 35 | TEGRA_MAP_MUXCONF("dap3", "dap3", none, tristate), |
| 41 | {TEGRA_PINGROUP_DAP4, TEGRA_MUX_DAP4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 36 | TEGRA_MAP_MUXCONF("dap4", "dap4", none, tristate), |
| 42 | {TEGRA_PINGROUP_DDC, TEGRA_MUX_I2C2, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 37 | TEGRA_MAP_MUXCONF("ddc", "i2c2", up, driven), |
| 43 | {TEGRA_PINGROUP_DTA, TEGRA_MUX_RSVD1, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 38 | TEGRA_MAP_MUXCONF("dta", "rsvd1", up, tristate), |
| 44 | {TEGRA_PINGROUP_DTB, TEGRA_MUX_RSVD1, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 39 | TEGRA_MAP_MUXCONF("dtb", "rsvd1", none, tristate), |
| 45 | {TEGRA_PINGROUP_DTC, TEGRA_MUX_RSVD1, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 40 | TEGRA_MAP_MUXCONF("dtc", "rsvd1", none, tristate), |
| 46 | {TEGRA_PINGROUP_DTD, TEGRA_MUX_RSVD1, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 41 | TEGRA_MAP_MUXCONF("dtd", "rsvd1", up, tristate), |
| 47 | {TEGRA_PINGROUP_DTE, TEGRA_MUX_RSVD1, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 42 | TEGRA_MAP_MUXCONF("dte", "rsvd1", none, tristate), |
| 48 | {TEGRA_PINGROUP_DTF, TEGRA_MUX_I2C3, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 43 | TEGRA_MAP_MUXCONF("dtf", "i2c3", none, driven), |
| 49 | {TEGRA_PINGROUP_GMA, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 44 | TEGRA_MAP_MUXCONF("gma", "sdio4", none, driven), |
| 50 | {TEGRA_PINGROUP_GMB, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 45 | TEGRA_MAP_MUXCONF("gmb", "gmi", none, driven), |
| 51 | {TEGRA_PINGROUP_GMC, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 46 | TEGRA_MAP_MUXCONF("gmc", "gmi", none, driven), |
| 52 | {TEGRA_PINGROUP_GMD, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 47 | TEGRA_MAP_MUXCONF("gmd", "gmi", none, driven), |
| 53 | {TEGRA_PINGROUP_GME, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 48 | TEGRA_MAP_MUXCONF("gme", "sdio4", none, driven), |
| 54 | {TEGRA_PINGROUP_GPU, TEGRA_MUX_PWM, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 49 | TEGRA_MAP_MUXCONF("gpu", "pwm", none, driven), |
| 55 | {TEGRA_PINGROUP_GPU7, TEGRA_MUX_RTCK, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 50 | TEGRA_MAP_MUXCONF("gpu7", "rtck", none, driven), |
| 56 | {TEGRA_PINGROUP_GPV, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 51 | TEGRA_MAP_MUXCONF("gpv", "pcie", none, driven), |
| 57 | {TEGRA_PINGROUP_HDINT, TEGRA_MUX_HDMI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 52 | TEGRA_MAP_MUXCONF("hdint", "hdmi", na, driven), |
| 58 | {TEGRA_PINGROUP_I2CP, TEGRA_MUX_I2C, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 53 | TEGRA_MAP_MUXCONF("i2cp", "i2cp", none, driven), |
| 59 | {TEGRA_PINGROUP_IRRX, TEGRA_MUX_UARTA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 54 | TEGRA_MAP_MUXCONF("irrx", "uarta", up, driven), |
| 60 | {TEGRA_PINGROUP_IRTX, TEGRA_MUX_UARTA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 55 | TEGRA_MAP_MUXCONF("irtx", "uarta", up, driven), |
| 61 | {TEGRA_PINGROUP_KBCA, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 56 | TEGRA_MAP_MUXCONF("kbca", "kbc", up, driven), |
| 62 | {TEGRA_PINGROUP_KBCB, TEGRA_MUX_SDIO2, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 57 | TEGRA_MAP_MUXCONF("kbcb", "sdio2", up, driven), |
| 63 | {TEGRA_PINGROUP_KBCC, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 58 | TEGRA_MAP_MUXCONF("kbcc", "kbc", up, driven), |
| 64 | {TEGRA_PINGROUP_KBCD, TEGRA_MUX_SDIO2, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 59 | TEGRA_MAP_MUXCONF("kbcd", "sdio2", up, driven), |
| 65 | {TEGRA_PINGROUP_KBCE, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 60 | TEGRA_MAP_MUXCONF("kbce", "kbc", up, driven), |
| 66 | {TEGRA_PINGROUP_KBCF, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 61 | TEGRA_MAP_MUXCONF("kbcf", "kbc", up, driven), |
| 67 | {TEGRA_PINGROUP_LCSN, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 62 | TEGRA_MAP_MUXCONF("lcsn", "displaya", na, tristate), |
| 68 | {TEGRA_PINGROUP_LD0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 63 | TEGRA_MAP_MUXCONF("ld0", "displaya", na, driven), |
| 69 | {TEGRA_PINGROUP_LD1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 64 | TEGRA_MAP_MUXCONF("ld1", "displaya", na, driven), |
| 70 | {TEGRA_PINGROUP_LD10, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 65 | TEGRA_MAP_MUXCONF("ld10", "displaya", na, driven), |
| 71 | {TEGRA_PINGROUP_LD11, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 66 | TEGRA_MAP_MUXCONF("ld11", "displaya", na, driven), |
| 72 | {TEGRA_PINGROUP_LD12, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 67 | TEGRA_MAP_MUXCONF("ld12", "displaya", na, driven), |
| 73 | {TEGRA_PINGROUP_LD13, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 68 | TEGRA_MAP_MUXCONF("ld13", "displaya", na, driven), |
| 74 | {TEGRA_PINGROUP_LD14, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 69 | TEGRA_MAP_MUXCONF("ld14", "displaya", na, driven), |
| 75 | {TEGRA_PINGROUP_LD15, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 70 | TEGRA_MAP_MUXCONF("ld15", "displaya", na, driven), |
| 76 | {TEGRA_PINGROUP_LD16, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 71 | TEGRA_MAP_MUXCONF("ld16", "displaya", na, driven), |
| 77 | {TEGRA_PINGROUP_LD17, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 72 | TEGRA_MAP_MUXCONF("ld17", "displaya", na, driven), |
| 78 | {TEGRA_PINGROUP_LD2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 73 | TEGRA_MAP_MUXCONF("ld2", "displaya", na, driven), |
| 79 | {TEGRA_PINGROUP_LD3, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 74 | TEGRA_MAP_MUXCONF("ld3", "displaya", na, driven), |
| 80 | {TEGRA_PINGROUP_LD4, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 75 | TEGRA_MAP_MUXCONF("ld4", "displaya", na, driven), |
| 81 | {TEGRA_PINGROUP_LD5, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 76 | TEGRA_MAP_MUXCONF("ld5", "displaya", na, driven), |
| 82 | {TEGRA_PINGROUP_LD6, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 77 | TEGRA_MAP_MUXCONF("ld6", "displaya", na, driven), |
| 83 | {TEGRA_PINGROUP_LD7, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 78 | TEGRA_MAP_MUXCONF("ld7", "displaya", na, driven), |
| 84 | {TEGRA_PINGROUP_LD8, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 79 | TEGRA_MAP_MUXCONF("ld8", "displaya", na, driven), |
| 85 | {TEGRA_PINGROUP_LD9, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 80 | TEGRA_MAP_MUXCONF("ld9", "displaya", na, driven), |
| 86 | {TEGRA_PINGROUP_LDC, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 81 | TEGRA_MAP_MUXCONF("ldc", "displaya", na, driven), |
| 87 | {TEGRA_PINGROUP_LDI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 82 | TEGRA_MAP_MUXCONF("ldi", "displaya", na, driven), |
| 88 | {TEGRA_PINGROUP_LHP0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 83 | TEGRA_MAP_MUXCONF("lhp0", "displaya", na, tristate), |
| 89 | {TEGRA_PINGROUP_LHP1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 84 | TEGRA_MAP_MUXCONF("lhp1", "displaya", na, tristate), |
| 90 | {TEGRA_PINGROUP_LHP2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 85 | TEGRA_MAP_MUXCONF("lhp2", "displaya", na, tristate), |
| 91 | {TEGRA_PINGROUP_LHS, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 86 | TEGRA_MAP_MUXCONF("lhs", "displaya", na, driven), |
| 92 | {TEGRA_PINGROUP_LM0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 87 | TEGRA_MAP_MUXCONF("lm0", "displaya", na, tristate), |
| 93 | {TEGRA_PINGROUP_LM1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 88 | TEGRA_MAP_MUXCONF("lm1", "displaya", na, tristate), |
| 94 | {TEGRA_PINGROUP_LPP, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 89 | TEGRA_MAP_MUXCONF("lpp", "displaya", na, tristate), |
| 95 | {TEGRA_PINGROUP_LPW0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 90 | TEGRA_MAP_MUXCONF("lpw0", "displaya", na, tristate), |
| 96 | {TEGRA_PINGROUP_LPW1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 91 | TEGRA_MAP_MUXCONF("lpw1", "displaya", na, tristate), |
| 97 | {TEGRA_PINGROUP_LPW2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 92 | TEGRA_MAP_MUXCONF("lpw2", "displaya", na, tristate), |
| 98 | {TEGRA_PINGROUP_LSC0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 93 | TEGRA_MAP_MUXCONF("lsc0", "displaya", na, driven), |
| 99 | {TEGRA_PINGROUP_LSC1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 94 | TEGRA_MAP_MUXCONF("lsc1", "displaya", na, tristate), |
| 100 | {TEGRA_PINGROUP_LSCK, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 95 | TEGRA_MAP_MUXCONF("lsck", "displaya", na, tristate), |
| 101 | {TEGRA_PINGROUP_LSDA, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 96 | TEGRA_MAP_MUXCONF("lsda", "displaya", na, tristate), |
| 102 | {TEGRA_PINGROUP_LSDI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 97 | TEGRA_MAP_MUXCONF("lsdi", "displaya", na, tristate), |
| 103 | {TEGRA_PINGROUP_LSPI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 98 | TEGRA_MAP_MUXCONF("lspi", "displaya", na, driven), |
| 104 | {TEGRA_PINGROUP_LVP0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 99 | TEGRA_MAP_MUXCONF("lvp0", "displaya", na, tristate), |
| 105 | {TEGRA_PINGROUP_LVP1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 100 | TEGRA_MAP_MUXCONF("lvp1", "displaya", na, tristate), |
| 106 | {TEGRA_PINGROUP_LVS, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 101 | TEGRA_MAP_MUXCONF("lvs", "displaya", na, driven), |
| 107 | {TEGRA_PINGROUP_OWC, TEGRA_MUX_OWR, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 102 | TEGRA_MAP_MUXCONF("owc", "owr", up, tristate), |
| 108 | {TEGRA_PINGROUP_PMC, TEGRA_MUX_PWR_ON, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 103 | TEGRA_MAP_MUXCONF("pmc", "pwr_on", na, driven), |
| 109 | {TEGRA_PINGROUP_PTA, TEGRA_MUX_HDMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 104 | TEGRA_MAP_MUXCONF("pta", "hdmi", none, driven), |
| 110 | {TEGRA_PINGROUP_RM, TEGRA_MUX_I2C, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 105 | TEGRA_MAP_MUXCONF("rm", "i2c1", none, driven), |
| 111 | {TEGRA_PINGROUP_SDB, TEGRA_MUX_PWM, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 106 | TEGRA_MAP_MUXCONF("sdb", "pwm", na, tristate), |
| 112 | {TEGRA_PINGROUP_SDC, TEGRA_MUX_TWC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 107 | TEGRA_MAP_MUXCONF("sdc", "twc", up, tristate), |
| 113 | {TEGRA_PINGROUP_SDD, TEGRA_MUX_PWM, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 108 | TEGRA_MAP_MUXCONF("sdd", "pwm", up, tristate), |
| 114 | {TEGRA_PINGROUP_SDIO1, TEGRA_MUX_SDIO1, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 109 | TEGRA_MAP_MUXCONF("sdio1", "sdio1", none, driven), |
| 115 | {TEGRA_PINGROUP_SLXA, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 110 | TEGRA_MAP_MUXCONF("slxa", "pcie", none, tristate), |
| 116 | {TEGRA_PINGROUP_SLXC, TEGRA_MUX_SPI4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 111 | TEGRA_MAP_MUXCONF("slxc", "spi4", none, tristate), |
| 117 | {TEGRA_PINGROUP_SLXD, TEGRA_MUX_SPI4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 112 | TEGRA_MAP_MUXCONF("slxd", "spi4", none, tristate), |
| 118 | {TEGRA_PINGROUP_SLXK, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 113 | TEGRA_MAP_MUXCONF("slxk", "pcie", none, driven), |
| 119 | {TEGRA_PINGROUP_SPDI, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 114 | TEGRA_MAP_MUXCONF("spdi", "rsvd2", none, tristate), |
| 120 | {TEGRA_PINGROUP_SPDO, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 115 | TEGRA_MAP_MUXCONF("spdo", "rsvd2", none, driven), |
| 121 | {TEGRA_PINGROUP_SPIA, TEGRA_MUX_GMI, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 116 | TEGRA_MAP_MUXCONF("spia", "gmi", down, tristate), |
| 122 | {TEGRA_PINGROUP_SPIB, TEGRA_MUX_GMI, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 117 | TEGRA_MAP_MUXCONF("spib", "gmi", down, tristate), |
| 123 | {TEGRA_PINGROUP_SPIC, TEGRA_MUX_GMI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 118 | TEGRA_MAP_MUXCONF("spic", "gmi", up, driven), |
| 124 | {TEGRA_PINGROUP_SPID, TEGRA_MUX_GMI, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 119 | TEGRA_MAP_MUXCONF("spid", "gmi", down, tristate), |
| 125 | {TEGRA_PINGROUP_SPIE, TEGRA_MUX_GMI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 120 | TEGRA_MAP_MUXCONF("spie", "gmi", up, tristate), |
| 126 | {TEGRA_PINGROUP_SPIF, TEGRA_MUX_RSVD4, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 121 | TEGRA_MAP_MUXCONF("spif", "rsvd4", down, tristate), |
| 127 | {TEGRA_PINGROUP_SPIG, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 122 | TEGRA_MAP_MUXCONF("spig", "spi2_alt", up, driven), |
| 128 | {TEGRA_PINGROUP_SPIH, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 123 | TEGRA_MAP_MUXCONF("spih", "spi2_alt", up, tristate), |
| 129 | {TEGRA_PINGROUP_UAA, TEGRA_MUX_ULPI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 124 | TEGRA_MAP_MUXCONF("uaa", "ulpi", up, driven), |
| 130 | {TEGRA_PINGROUP_UAB, TEGRA_MUX_ULPI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 125 | TEGRA_MAP_MUXCONF("uab", "ulpi", up, driven), |
| 131 | {TEGRA_PINGROUP_UAC, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 126 | TEGRA_MAP_MUXCONF("uac", "rsvd4", none, driven), |
| 132 | {TEGRA_PINGROUP_UAD, TEGRA_MUX_SPDIF, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 127 | TEGRA_MAP_MUXCONF("uad", "spdif", up, tristate), |
| 133 | {TEGRA_PINGROUP_UCA, TEGRA_MUX_UARTC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 128 | TEGRA_MAP_MUXCONF("uca", "uartc", up, tristate), |
| 134 | {TEGRA_PINGROUP_UCB, TEGRA_MUX_UARTC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 129 | TEGRA_MAP_MUXCONF("ucb", "uartc", up, tristate), |
| 135 | {TEGRA_PINGROUP_UDA, TEGRA_MUX_ULPI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 130 | TEGRA_MAP_MUXCONF("uda", "ulpi", none, driven), |
| 136 | {TEGRA_PINGROUP_CK32, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 131 | TEGRA_MAP_CONF("ck32", none, na), |
| 137 | {TEGRA_PINGROUP_DDRC, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 132 | TEGRA_MAP_CONF("ddrc", none, na), |
| 138 | {TEGRA_PINGROUP_PMCA, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 133 | TEGRA_MAP_CONF("pmca", none, na), |
| 139 | {TEGRA_PINGROUP_PMCB, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 134 | TEGRA_MAP_CONF("pmcb", none, na), |
| 140 | {TEGRA_PINGROUP_PMCC, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 135 | TEGRA_MAP_CONF("pmcc", none, na), |
| 141 | {TEGRA_PINGROUP_PMCD, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 136 | TEGRA_MAP_CONF("pmcd", none, na), |
| 142 | {TEGRA_PINGROUP_PMCE, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 137 | TEGRA_MAP_CONF("pmce", none, na), |
| 143 | {TEGRA_PINGROUP_XM2C, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 138 | TEGRA_MAP_CONF("xm2c", none, na), |
| 144 | {TEGRA_PINGROUP_XM2D, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 139 | TEGRA_MAP_CONF("xm2d", none, na), |
| 145 | }; | 140 | TEGRA_MAP_CONF("ls", up, na), |
| 146 | 141 | TEGRA_MAP_CONF("lc", up, na), | |
| 147 | static struct tegra_gpio_table gpio_table[] = { | 142 | TEGRA_MAP_CONF("ld17_0", down, na), |
| 148 | { .gpio = TEGRA_GPIO_SD1_CD, .enable = true }, | 143 | TEGRA_MAP_CONF("ld19_18", down, na), |
| 149 | { .gpio = TEGRA_GPIO_SD1_WP, .enable = true }, | 144 | TEGRA_MAP_CONF("ld21_20", down, na), |
| 150 | { .gpio = TEGRA_GPIO_SD1_POWER, .enable = true }, | 145 | TEGRA_MAP_CONF("ld23_22", down, na), |
| 151 | { .gpio = TEGRA_ULPI_RST, .enable = true }, | ||
| 152 | { .gpio = TEGRA_WIFI_PWRN, .enable = true }, | ||
| 153 | { .gpio = TEGRA_WIFI_RST, .enable = true }, | ||
| 154 | { .gpio = TEGRA_WIFI_LED, .enable = true }, | ||
| 155 | }; | 146 | }; |
| 156 | 147 | ||
| 157 | static struct tegra_board_pinmux_conf conf = { | 148 | static struct tegra_board_pinmux_conf conf = { |
| 158 | .pgs = paz00_pinmux, | 149 | .maps = paz00_map, |
| 159 | .pg_count = ARRAY_SIZE(paz00_pinmux), | 150 | .map_count = ARRAY_SIZE(paz00_map), |
| 160 | .gpios = gpio_table, | ||
| 161 | .gpio_count = ARRAY_SIZE(gpio_table), | ||
| 162 | }; | 151 | }; |
| 163 | 152 | ||
| 164 | void paz00_pinmux_init(void) | 153 | void paz00_pinmux_init(void) |
diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index 330afdfa2475..e31317deec21 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c | |||
| @@ -159,6 +159,8 @@ static void paz00_i2c_init(void) | |||
| 159 | 159 | ||
| 160 | static void paz00_usb_init(void) | 160 | static void paz00_usb_init(void) |
| 161 | { | 161 | { |
| 162 | tegra_ehci2_ulpi_phy_config.reset_gpio = TEGRA_ULPI_RST; | ||
| 163 | |||
| 162 | platform_device_register(&tegra_ehci2_device); | 164 | platform_device_register(&tegra_ehci2_device); |
| 163 | platform_device_register(&tegra_ehci3_device); | 165 | platform_device_register(&tegra_ehci3_device); |
| 164 | } | 166 | } |
| @@ -176,7 +178,6 @@ static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = { | |||
| 176 | { "uarta", "pll_p", 216000000, true }, | 178 | { "uarta", "pll_p", 216000000, true }, |
| 177 | { "uartc", "pll_p", 216000000, true }, | 179 | { "uartc", "pll_p", 216000000, true }, |
| 178 | 180 | ||
| 179 | { "pll_p_out4", "pll_p", 24000000, true }, | ||
| 180 | { "usbd", "clk_m", 12000000, false }, | 181 | { "usbd", "clk_m", 12000000, false }, |
| 181 | { "usb2", "clk_m", 12000000, false }, | 182 | { "usb2", "clk_m", 12000000, false }, |
| 182 | { "usb3", "clk_m", 12000000, false }, | 183 | { "usb3", "clk_m", 12000000, false }, |
diff --git a/arch/arm/mach-tegra/board-pinmux.c b/arch/arm/mach-tegra/board-pinmux.c index adc3efe979b3..a5574c71b931 100644 --- a/arch/arm/mach-tegra/board-pinmux.c +++ b/arch/arm/mach-tegra/board-pinmux.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2011, NVIDIA CORPORATION. All rights reserved. | 2 | * Copyright (c) 2011,2012, NVIDIA CORPORATION. All rights reserved. |
| 3 | * | 3 | * |
| 4 | * This software is licensed under the terms of the GNU General Public | 4 | * This software is licensed under the terms of the GNU General Public |
| 5 | * License version 2, as published by the Free Software Foundation, and | 5 | * License version 2, as published by the Free Software Foundation, and |
| @@ -15,75 +15,59 @@ | |||
| 15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
| 16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
| 17 | #include <linux/notifier.h> | 17 | #include <linux/notifier.h> |
| 18 | #include <linux/of.h> | ||
| 19 | #include <linux/string.h> | 18 | #include <linux/string.h> |
| 20 | 19 | ||
| 21 | #include <mach/gpio-tegra.h> | ||
| 22 | #include <mach/pinmux.h> | ||
| 23 | |||
| 24 | #include "board-pinmux.h" | 20 | #include "board-pinmux.h" |
| 25 | #include "devices.h" | 21 | #include "devices.h" |
| 26 | 22 | ||
| 27 | struct tegra_board_pinmux_conf *confs[2]; | 23 | unsigned long tegra_pincfg_pullnone_driven[2] = { |
| 28 | 24 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_PULL, TEGRA_PINCONFIG_PULL_NONE), | |
| 29 | static void tegra_board_pinmux_setup_gpios(void) | 25 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_TRISTATE, TEGRA_PINCONFIG_DRIVEN), |
| 30 | { | 26 | }; |
| 31 | int i; | ||
| 32 | |||
| 33 | for (i = 0; i < ARRAY_SIZE(confs); i++) { | ||
| 34 | if (!confs[i]) | ||
| 35 | continue; | ||
| 36 | |||
| 37 | tegra_gpio_config(confs[i]->gpios, confs[i]->gpio_count); | ||
| 38 | } | ||
| 39 | } | ||
| 40 | |||
| 41 | static void tegra_board_pinmux_setup_pinmux(void) | ||
| 42 | { | ||
| 43 | int i; | ||
| 44 | 27 | ||
| 45 | for (i = 0; i < ARRAY_SIZE(confs); i++) { | 28 | unsigned long tegra_pincfg_pullnone_tristate[2] = { |
| 46 | if (!confs[i]) | 29 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_PULL, TEGRA_PINCONFIG_PULL_NONE), |
| 47 | continue; | 30 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_TRISTATE, TEGRA_PINCONFIG_TRISTATE), |
| 31 | }; | ||
| 48 | 32 | ||
| 49 | tegra_pinmux_config_table(confs[i]->pgs, confs[i]->pg_count); | 33 | unsigned long tegra_pincfg_pullnone_na[1] = { |
| 34 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_PULL, TEGRA_PINCONFIG_PULL_NONE), | ||
| 35 | }; | ||
| 50 | 36 | ||
| 51 | if (confs[i]->drives) | 37 | unsigned long tegra_pincfg_pullup_driven[2] = { |
| 52 | tegra_drive_pinmux_config_table(confs[i]->drives, | 38 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_PULL, TEGRA_PINCONFIG_PULL_UP), |
| 53 | confs[i]->drive_count); | 39 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_TRISTATE, TEGRA_PINCONFIG_DRIVEN), |
| 54 | } | 40 | }; |
| 55 | } | ||
| 56 | 41 | ||
| 57 | static int tegra_board_pinmux_bus_notify(struct notifier_block *nb, | 42 | unsigned long tegra_pincfg_pullup_tristate[2] = { |
| 58 | unsigned long event, void *vdev) | 43 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_PULL, TEGRA_PINCONFIG_PULL_UP), |
| 59 | { | 44 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_TRISTATE, TEGRA_PINCONFIG_TRISTATE), |
| 60 | static bool had_gpio; | 45 | }; |
| 61 | static bool had_pinmux; | ||
| 62 | 46 | ||
| 63 | struct device *dev = vdev; | 47 | unsigned long tegra_pincfg_pullup_na[1] = { |
| 64 | const char *devname; | 48 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_PULL, TEGRA_PINCONFIG_PULL_UP), |
| 49 | }; | ||
| 65 | 50 | ||
| 66 | if (event != BUS_NOTIFY_BOUND_DRIVER) | 51 | unsigned long tegra_pincfg_pulldown_driven[2] = { |
| 67 | return NOTIFY_DONE; | 52 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_PULL, TEGRA_PINCONFIG_PULL_DOWN), |
| 53 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_TRISTATE, TEGRA_PINCONFIG_DRIVEN), | ||
| 54 | }; | ||
| 68 | 55 | ||
| 69 | devname = dev_name(dev); | 56 | unsigned long tegra_pincfg_pulldown_tristate[2] = { |
| 57 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_PULL, TEGRA_PINCONFIG_PULL_DOWN), | ||
| 58 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_TRISTATE, TEGRA_PINCONFIG_TRISTATE), | ||
| 59 | }; | ||
| 70 | 60 | ||
| 71 | if (!had_gpio && !strcmp(devname, GPIO_DEV)) { | 61 | unsigned long tegra_pincfg_pulldown_na[1] = { |
| 72 | tegra_board_pinmux_setup_gpios(); | 62 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_PULL, TEGRA_PINCONFIG_PULL_DOWN), |
| 73 | had_gpio = true; | 63 | }; |
| 74 | } else if (!had_pinmux && !strcmp(devname, PINMUX_DEV)) { | ||
| 75 | tegra_board_pinmux_setup_pinmux(); | ||
| 76 | had_pinmux = true; | ||
| 77 | } | ||
| 78 | 64 | ||
| 79 | if (had_gpio && had_pinmux) | 65 | unsigned long tegra_pincfg_pullna_driven[1] = { |
| 80 | return NOTIFY_STOP_MASK; | 66 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_TRISTATE, TEGRA_PINCONFIG_DRIVEN), |
| 81 | else | 67 | }; |
| 82 | return NOTIFY_DONE; | ||
| 83 | } | ||
| 84 | 68 | ||
| 85 | static struct notifier_block nb = { | 69 | unsigned long tegra_pincfg_pullna_tristate[1] = { |
| 86 | .notifier_call = tegra_board_pinmux_bus_notify, | 70 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_TRISTATE, TEGRA_PINCONFIG_TRISTATE), |
| 87 | }; | 71 | }; |
| 88 | 72 | ||
| 89 | static struct platform_device *devices[] = { | 73 | static struct platform_device *devices[] = { |
| @@ -94,11 +78,10 @@ static struct platform_device *devices[] = { | |||
| 94 | void tegra_board_pinmux_init(struct tegra_board_pinmux_conf *conf_a, | 78 | void tegra_board_pinmux_init(struct tegra_board_pinmux_conf *conf_a, |
| 95 | struct tegra_board_pinmux_conf *conf_b) | 79 | struct tegra_board_pinmux_conf *conf_b) |
| 96 | { | 80 | { |
| 97 | confs[0] = conf_a; | 81 | if (conf_a) |
| 98 | confs[1] = conf_b; | 82 | pinctrl_register_mappings(conf_a->maps, conf_a->map_count); |
| 99 | 83 | if (conf_b) | |
| 100 | bus_register_notifier(&platform_bus_type, &nb); | 84 | pinctrl_register_mappings(conf_b->maps, conf_b->map_count); |
| 101 | 85 | ||
| 102 | if (!of_machine_is_compatible("nvidia,tegra20")) | 86 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 103 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
| 104 | } | 87 | } |
diff --git a/arch/arm/mach-tegra/board-pinmux.h b/arch/arm/mach-tegra/board-pinmux.h index 4aac73546f54..c5f3f3381e86 100644 --- a/arch/arm/mach-tegra/board-pinmux.h +++ b/arch/arm/mach-tegra/board-pinmux.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2011, NVIDIA CORPORATION. All rights reserved. | 2 | * Copyright (c) 2011,2012, NVIDIA CORPORATION. All rights reserved. |
| 3 | * | 3 | * |
| 4 | * This software is licensed under the terms of the GNU General Public | 4 | * This software is licensed under the terms of the GNU General Public |
| 5 | * License version 2, as published by the Free Software Foundation, and | 5 | * License version 2, as published by the Free Software Foundation, and |
| @@ -15,21 +15,37 @@ | |||
| 15 | #ifndef __MACH_TEGRA_BOARD_PINMUX_H | 15 | #ifndef __MACH_TEGRA_BOARD_PINMUX_H |
| 16 | #define __MACH_TEGRA_BOARD_PINMUX_H | 16 | #define __MACH_TEGRA_BOARD_PINMUX_H |
| 17 | 17 | ||
| 18 | #define GPIO_DEV "tegra-gpio" | 18 | #include <linux/pinctrl/machine.h> |
| 19 | #define PINMUX_DEV "tegra-pinmux" | ||
| 20 | 19 | ||
| 21 | struct tegra_pingroup_config; | 20 | #include <mach/pinconf-tegra.h> |
| 22 | struct tegra_gpio_table; | ||
| 23 | 21 | ||
| 24 | struct tegra_board_pinmux_conf { | 22 | #define PINMUX_DEV "tegra20-pinctrl" |
| 25 | struct tegra_pingroup_config *pgs; | 23 | |
| 26 | int pg_count; | 24 | #define TEGRA_MAP_MUX(_group_, _function_) \ |
| 25 | PIN_MAP_MUX_GROUP_HOG_DEFAULT(PINMUX_DEV, _group_, _function_) | ||
| 26 | |||
| 27 | #define TEGRA_MAP_CONF(_group_, _pull_, _drive_) \ | ||
| 28 | PIN_MAP_CONFIGS_GROUP_HOG_DEFAULT(PINMUX_DEV, _group_, tegra_pincfg_pull##_pull_##_##_drive_) | ||
| 27 | 29 | ||
| 28 | struct tegra_drive_pingroup_config *drives; | 30 | #define TEGRA_MAP_MUXCONF(_group_, _function_, _pull_, _drive_) \ |
| 29 | int drive_count; | 31 | TEGRA_MAP_MUX(_group_, _function_), \ |
| 32 | TEGRA_MAP_CONF(_group_, _pull_, _drive_) | ||
| 30 | 33 | ||
| 31 | struct tegra_gpio_table *gpios; | 34 | extern unsigned long tegra_pincfg_pullnone_driven[2]; |
| 32 | int gpio_count; | 35 | extern unsigned long tegra_pincfg_pullnone_tristate[2]; |
| 36 | extern unsigned long tegra_pincfg_pullnone_na[1]; | ||
| 37 | extern unsigned long tegra_pincfg_pullup_driven[2]; | ||
| 38 | extern unsigned long tegra_pincfg_pullup_tristate[2]; | ||
| 39 | extern unsigned long tegra_pincfg_pullup_na[1]; | ||
| 40 | extern unsigned long tegra_pincfg_pulldown_driven[2]; | ||
| 41 | extern unsigned long tegra_pincfg_pulldown_tristate[2]; | ||
| 42 | extern unsigned long tegra_pincfg_pulldown_na[1]; | ||
| 43 | extern unsigned long tegra_pincfg_pullna_driven[1]; | ||
| 44 | extern unsigned long tegra_pincfg_pullna_tristate[1]; | ||
| 45 | |||
| 46 | struct tegra_board_pinmux_conf { | ||
| 47 | struct pinctrl_map *maps; | ||
| 48 | int map_count; | ||
| 33 | }; | 49 | }; |
| 34 | 50 | ||
| 35 | void tegra_board_pinmux_init(struct tegra_board_pinmux_conf *conf_a, | 51 | void tegra_board_pinmux_init(struct tegra_board_pinmux_conf *conf_a, |
diff --git a/arch/arm/mach-tegra/board-seaboard-pinmux.c b/arch/arm/mach-tegra/board-seaboard-pinmux.c index 55e7e43a14ad..11fc8a568c64 100644 --- a/arch/arm/mach-tegra/board-seaboard-pinmux.c +++ b/arch/arm/mach-tegra/board-seaboard-pinmux.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2010,2011 NVIDIA Corporation | 2 | * Copyright (C) 2010-2012 NVIDIA Corporation |
| 3 | * Copyright (C) 2011 Google, Inc. | 3 | * Copyright (C) 2011 Google, Inc. |
| 4 | * | 4 | * |
| 5 | * This software is licensed under the terms of the GNU General Public | 5 | * This software is licensed under the terms of the GNU General Public |
| @@ -14,216 +14,176 @@ | |||
| 14 | */ | 14 | */ |
| 15 | 15 | ||
| 16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
| 17 | #include <linux/init.h> | ||
| 18 | #include <linux/gpio.h> | ||
| 19 | #include <linux/of.h> | ||
| 20 | 17 | ||
| 21 | #include <mach/pinmux.h> | ||
| 22 | #include <mach/pinmux-tegra20.h> | ||
| 23 | |||
| 24 | #include "gpio-names.h" | ||
| 25 | #include "board-pinmux.h" | ||
| 26 | #include "board-seaboard.h" | 18 | #include "board-seaboard.h" |
| 19 | #include "board-pinmux.h" | ||
| 27 | 20 | ||
| 28 | #define DEFAULT_DRIVE(_name) \ | 21 | static unsigned long seaboard_pincfg_drive_sdio1[] = { |
| 29 | { \ | 22 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE, 0), |
| 30 | .pingroup = TEGRA_DRIVE_PINGROUP_##_name, \ | 23 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_SCHMITT, 0), |
| 31 | .hsm = TEGRA_HSM_DISABLE, \ | 24 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_LOW_POWER_MODE, 3), |
| 32 | .schmitt = TEGRA_SCHMITT_ENABLE, \ | 25 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH, 31), |
| 33 | .drive = TEGRA_DRIVE_DIV_1, \ | 26 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH, 31), |
| 34 | .pull_down = TEGRA_PULL_31, \ | 27 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING, 3), |
| 35 | .pull_up = TEGRA_PULL_31, \ | 28 | TEGRA_PINCONF_PACK(TEGRA_PINCONF_PARAM_SLEW_RATE_RISING, 3), |
| 36 | .slew_rising = TEGRA_SLEW_SLOWEST, \ | ||
| 37 | .slew_falling = TEGRA_SLEW_SLOWEST, \ | ||
| 38 | } | ||
| 39 | |||
| 40 | static struct tegra_drive_pingroup_config seaboard_drive_pinmux[] = { | ||
| 41 | DEFAULT_DRIVE(SDIO1), | ||
| 42 | }; | ||
| 43 | |||
| 44 | static struct tegra_pingroup_config common_pinmux[] = { | ||
| 45 | {TEGRA_PINGROUP_ATA, TEGRA_MUX_IDE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 46 | {TEGRA_PINGROUP_ATB, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 47 | {TEGRA_PINGROUP_ATC, TEGRA_MUX_NAND, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 48 | {TEGRA_PINGROUP_ATD, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 49 | {TEGRA_PINGROUP_ATE, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 50 | {TEGRA_PINGROUP_CDEV1, TEGRA_MUX_PLLA_OUT, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 51 | {TEGRA_PINGROUP_CDEV2, TEGRA_MUX_PLLP_OUT4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 52 | {TEGRA_PINGROUP_CRTP, TEGRA_MUX_CRT, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | ||
| 53 | {TEGRA_PINGROUP_CSUS, TEGRA_MUX_VI_SENSOR_CLK, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 54 | {TEGRA_PINGROUP_DAP1, TEGRA_MUX_DAP1, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 55 | {TEGRA_PINGROUP_DAP2, TEGRA_MUX_DAP2, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 56 | {TEGRA_PINGROUP_DAP3, TEGRA_MUX_DAP3, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 57 | {TEGRA_PINGROUP_DAP4, TEGRA_MUX_DAP4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 58 | {TEGRA_PINGROUP_DTA, TEGRA_MUX_VI, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | ||
| 59 | {TEGRA_PINGROUP_DTB, TEGRA_MUX_VI, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | ||
| 60 | {TEGRA_PINGROUP_DTC, TEGRA_MUX_VI, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | ||
| 61 | {TEGRA_PINGROUP_DTD, TEGRA_MUX_VI, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | ||
| 62 | {TEGRA_PINGROUP_DTE, TEGRA_MUX_VI, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | ||
| 63 | {TEGRA_PINGROUP_DTF, TEGRA_MUX_I2C3, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 64 | {TEGRA_PINGROUP_GMA, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 65 | {TEGRA_PINGROUP_GMB, TEGRA_MUX_GMI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | ||
| 66 | {TEGRA_PINGROUP_GMC, TEGRA_MUX_UARTD, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 67 | {TEGRA_PINGROUP_GME, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 68 | {TEGRA_PINGROUP_GPU, TEGRA_MUX_PWM, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 69 | {TEGRA_PINGROUP_GPU7, TEGRA_MUX_RTCK, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 70 | {TEGRA_PINGROUP_GPV, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 71 | {TEGRA_PINGROUP_HDINT, TEGRA_MUX_HDMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 72 | {TEGRA_PINGROUP_I2CP, TEGRA_MUX_I2C, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 73 | {TEGRA_PINGROUP_IRRX, TEGRA_MUX_UARTB, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 74 | {TEGRA_PINGROUP_IRTX, TEGRA_MUX_UARTB, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 75 | {TEGRA_PINGROUP_KBCA, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | ||
| 76 | {TEGRA_PINGROUP_KBCB, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | ||
| 77 | {TEGRA_PINGROUP_KBCC, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | ||
| 78 | {TEGRA_PINGROUP_KBCD, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | ||
| 79 | {TEGRA_PINGROUP_KBCE, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | ||
| 80 | {TEGRA_PINGROUP_KBCF, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | ||
| 81 | {TEGRA_PINGROUP_LCSN, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 82 | {TEGRA_PINGROUP_LD0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 83 | {TEGRA_PINGROUP_LD1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 84 | {TEGRA_PINGROUP_LD10, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 85 | {TEGRA_PINGROUP_LD11, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 86 | {TEGRA_PINGROUP_LD12, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 87 | {TEGRA_PINGROUP_LD13, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 88 | {TEGRA_PINGROUP_LD14, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 89 | {TEGRA_PINGROUP_LD15, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 90 | {TEGRA_PINGROUP_LD16, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 91 | {TEGRA_PINGROUP_LD17, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 92 | {TEGRA_PINGROUP_LD2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 93 | {TEGRA_PINGROUP_LD3, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 94 | {TEGRA_PINGROUP_LD4, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 95 | {TEGRA_PINGROUP_LD5, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 96 | {TEGRA_PINGROUP_LD6, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 97 | {TEGRA_PINGROUP_LD7, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 98 | {TEGRA_PINGROUP_LD8, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 99 | {TEGRA_PINGROUP_LD9, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 100 | {TEGRA_PINGROUP_LDC, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 101 | {TEGRA_PINGROUP_LDI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 102 | {TEGRA_PINGROUP_LHP0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 103 | {TEGRA_PINGROUP_LHP1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 104 | {TEGRA_PINGROUP_LHP2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 105 | {TEGRA_PINGROUP_LHS, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 106 | {TEGRA_PINGROUP_LM0, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 107 | {TEGRA_PINGROUP_LM1, TEGRA_MUX_CRT, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 108 | {TEGRA_PINGROUP_LPP, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 109 | {TEGRA_PINGROUP_LPW1, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 110 | {TEGRA_PINGROUP_LSC0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 111 | {TEGRA_PINGROUP_LSDI, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 112 | {TEGRA_PINGROUP_LSPI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 113 | {TEGRA_PINGROUP_LVP0, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 114 | {TEGRA_PINGROUP_LVP1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 115 | {TEGRA_PINGROUP_LVS, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 116 | {TEGRA_PINGROUP_OWC, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 117 | {TEGRA_PINGROUP_PMC, TEGRA_MUX_PWR_ON, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 118 | {TEGRA_PINGROUP_RM, TEGRA_MUX_I2C, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 119 | {TEGRA_PINGROUP_SDB, TEGRA_MUX_SDIO3, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 120 | {TEGRA_PINGROUP_SDC, TEGRA_MUX_SDIO3, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 121 | {TEGRA_PINGROUP_SDD, TEGRA_MUX_SDIO3, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 122 | {TEGRA_PINGROUP_SDIO1, TEGRA_MUX_SDIO1, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | ||
| 123 | {TEGRA_PINGROUP_SLXA, TEGRA_MUX_PCIE, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | ||
| 124 | {TEGRA_PINGROUP_SLXD, TEGRA_MUX_SPDIF, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 125 | {TEGRA_PINGROUP_SPDI, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 126 | {TEGRA_PINGROUP_SPDO, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 127 | {TEGRA_PINGROUP_SPIB, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 128 | {TEGRA_PINGROUP_SPID, TEGRA_MUX_SPI1, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 129 | {TEGRA_PINGROUP_SPIE, TEGRA_MUX_SPI1, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 130 | {TEGRA_PINGROUP_SPIF, TEGRA_MUX_SPI1, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | ||
| 131 | {TEGRA_PINGROUP_SPIH, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | ||
| 132 | {TEGRA_PINGROUP_UAA, TEGRA_MUX_ULPI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | ||
| 133 | {TEGRA_PINGROUP_UAB, TEGRA_MUX_ULPI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | ||
| 134 | {TEGRA_PINGROUP_UAC, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 135 | {TEGRA_PINGROUP_UAD, TEGRA_MUX_IRDA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 136 | {TEGRA_PINGROUP_UCA, TEGRA_MUX_UARTC, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 137 | {TEGRA_PINGROUP_UCB, TEGRA_MUX_UARTC, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 138 | {TEGRA_PINGROUP_UDA, TEGRA_MUX_ULPI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 139 | {TEGRA_PINGROUP_CK32, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 140 | {TEGRA_PINGROUP_DDRC, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 141 | {TEGRA_PINGROUP_PMCA, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 142 | {TEGRA_PINGROUP_PMCB, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 143 | {TEGRA_PINGROUP_PMCC, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 144 | {TEGRA_PINGROUP_PMCD, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 145 | {TEGRA_PINGROUP_PMCE, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 146 | {TEGRA_PINGROUP_XM2C, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 147 | {TEGRA_PINGROUP_XM2D, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 148 | }; | ||
| 149 | |||
| 150 | static struct tegra_pingroup_config seaboard_pinmux[] = { | ||
| 151 | {TEGRA_PINGROUP_DDC, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 152 | {TEGRA_PINGROUP_GMD, TEGRA_MUX_SFLASH, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 153 | {TEGRA_PINGROUP_LPW0, TEGRA_MUX_HDMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 154 | {TEGRA_PINGROUP_LPW2, TEGRA_MUX_HDMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 155 | {TEGRA_PINGROUP_LSC1, TEGRA_MUX_HDMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 156 | {TEGRA_PINGROUP_LSCK, TEGRA_MUX_HDMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 157 | {TEGRA_PINGROUP_LSDA, TEGRA_MUX_HDMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 158 | {TEGRA_PINGROUP_PTA, TEGRA_MUX_HDMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 159 | {TEGRA_PINGROUP_SLXC, TEGRA_MUX_SPDIF, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 160 | {TEGRA_PINGROUP_SLXK, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 161 | {TEGRA_PINGROUP_SPIA, TEGRA_MUX_GMI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | ||
| 162 | {TEGRA_PINGROUP_SPIC, TEGRA_MUX_GMI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | ||
| 163 | {TEGRA_PINGROUP_SPIG, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | ||
| 164 | }; | ||
| 165 | |||
| 166 | static struct tegra_pingroup_config ventana_pinmux[] = { | ||
| 167 | {TEGRA_PINGROUP_DDC, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 168 | {TEGRA_PINGROUP_GMD, TEGRA_MUX_SFLASH, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 169 | {TEGRA_PINGROUP_LPW0, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 170 | {TEGRA_PINGROUP_LPW2, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 171 | {TEGRA_PINGROUP_LSC1, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 172 | {TEGRA_PINGROUP_LSCK, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 173 | {TEGRA_PINGROUP_LSDA, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 174 | {TEGRA_PINGROUP_PTA, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 175 | {TEGRA_PINGROUP_SLXC, TEGRA_MUX_SDIO3, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 176 | {TEGRA_PINGROUP_SLXK, TEGRA_MUX_SDIO3, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | ||
| 177 | {TEGRA_PINGROUP_SPIA, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 178 | {TEGRA_PINGROUP_SPIC, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 179 | {TEGRA_PINGROUP_SPIG, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | ||
| 180 | }; | 29 | }; |
| 181 | 30 | ||
| 182 | static struct tegra_gpio_table common_gpio_table[] = { | 31 | static struct pinctrl_map common_map[] = { |
| 183 | { .gpio = TEGRA_GPIO_SD2_CD, .enable = true }, | 32 | TEGRA_MAP_MUXCONF("ata", "ide", none, driven), |
| 184 | { .gpio = TEGRA_GPIO_SD2_WP, .enable = true }, | 33 | TEGRA_MAP_MUXCONF("atb", "sdio4", none, driven), |
| 185 | { .gpio = TEGRA_GPIO_SD2_POWER, .enable = true }, | 34 | TEGRA_MAP_MUXCONF("atc", "nand", none, driven), |
| 186 | { .gpio = TEGRA_GPIO_CDC_IRQ, .enable = true }, | 35 | TEGRA_MAP_MUXCONF("atd", "gmi", none, driven), |
| 36 | TEGRA_MAP_MUXCONF("ate", "gmi", none, tristate), | ||
| 37 | TEGRA_MAP_MUXCONF("cdev1", "plla_out", none, driven), | ||
| 38 | TEGRA_MAP_MUXCONF("cdev2", "pllp_out4", none, driven), | ||
| 39 | TEGRA_MAP_MUXCONF("crtp", "crt", up, tristate), | ||
| 40 | TEGRA_MAP_MUXCONF("csus", "vi_sensor_clk", none, tristate), | ||
| 41 | TEGRA_MAP_MUXCONF("dap1", "dap1", none, driven), | ||
| 42 | TEGRA_MAP_MUXCONF("dap2", "dap2", none, driven), | ||
| 43 | TEGRA_MAP_MUXCONF("dap3", "dap3", none, tristate), | ||
| 44 | TEGRA_MAP_MUXCONF("dap4", "dap4", none, driven), | ||
| 45 | TEGRA_MAP_MUXCONF("dta", "vi", down, driven), | ||
| 46 | TEGRA_MAP_MUXCONF("dtb", "vi", down, driven), | ||
| 47 | TEGRA_MAP_MUXCONF("dtc", "vi", down, driven), | ||
| 48 | TEGRA_MAP_MUXCONF("dtd", "vi", down, driven), | ||
| 49 | TEGRA_MAP_MUXCONF("dte", "vi", down, tristate), | ||
| 50 | TEGRA_MAP_MUXCONF("dtf", "i2c3", none, driven), | ||
| 51 | TEGRA_MAP_MUXCONF("gma", "sdio4", none, driven), | ||
| 52 | TEGRA_MAP_MUXCONF("gmb", "gmi", up, tristate), | ||
| 53 | TEGRA_MAP_MUXCONF("gmc", "uartd", none, driven), | ||
| 54 | TEGRA_MAP_MUXCONF("gme", "sdio4", none, driven), | ||
| 55 | TEGRA_MAP_MUXCONF("gpu", "pwm", none, driven), | ||
| 56 | TEGRA_MAP_MUXCONF("gpu7", "rtck", none, driven), | ||
| 57 | TEGRA_MAP_MUXCONF("gpv", "pcie", none, tristate), | ||
| 58 | TEGRA_MAP_MUXCONF("hdint", "hdmi", na, tristate), | ||
| 59 | TEGRA_MAP_MUXCONF("i2cp", "i2cp", none, driven), | ||
| 60 | TEGRA_MAP_MUXCONF("irrx", "uartb", none, driven), | ||
| 61 | TEGRA_MAP_MUXCONF("irtx", "uartb", none, driven), | ||
| 62 | TEGRA_MAP_MUXCONF("kbca", "kbc", up, driven), | ||
| 63 | TEGRA_MAP_MUXCONF("kbcb", "kbc", up, driven), | ||
| 64 | TEGRA_MAP_MUXCONF("kbcc", "kbc", up, driven), | ||
| 65 | TEGRA_MAP_MUXCONF("kbcd", "kbc", up, driven), | ||
| 66 | TEGRA_MAP_MUXCONF("kbce", "kbc", up, driven), | ||
| 67 | TEGRA_MAP_MUXCONF("kbcf", "kbc", up, driven), | ||
| 68 | TEGRA_MAP_MUXCONF("lcsn", "rsvd4", na, tristate), | ||
| 69 | TEGRA_MAP_MUXCONF("ld0", "displaya", na, driven), | ||
| 70 | TEGRA_MAP_MUXCONF("ld1", "displaya", na, driven), | ||
| 71 | TEGRA_MAP_MUXCONF("ld10", "displaya", na, driven), | ||
| 72 | TEGRA_MAP_MUXCONF("ld11", "displaya", na, driven), | ||
| 73 | TEGRA_MAP_MUXCONF("ld12", "displaya", na, driven), | ||
| 74 | TEGRA_MAP_MUXCONF("ld13", "displaya", na, driven), | ||
| 75 | TEGRA_MAP_MUXCONF("ld14", "displaya", na, driven), | ||
| 76 | TEGRA_MAP_MUXCONF("ld15", "displaya", na, driven), | ||
| 77 | TEGRA_MAP_MUXCONF("ld16", "displaya", na, driven), | ||
| 78 | TEGRA_MAP_MUXCONF("ld17", "displaya", na, driven), | ||
| 79 | TEGRA_MAP_MUXCONF("ld2", "displaya", na, driven), | ||
| 80 | TEGRA_MAP_MUXCONF("ld3", "displaya", na, driven), | ||
| 81 | TEGRA_MAP_MUXCONF("ld4", "displaya", na, driven), | ||
| 82 | TEGRA_MAP_MUXCONF("ld5", "displaya", na, driven), | ||
| 83 | TEGRA_MAP_MUXCONF("ld6", "displaya", na, driven), | ||
| 84 | TEGRA_MAP_MUXCONF("ld7", "displaya", na, driven), | ||
| 85 | TEGRA_MAP_MUXCONF("ld8", "displaya", na, driven), | ||
| 86 | TEGRA_MAP_MUXCONF("ld9", "displaya", na, driven), | ||
| 87 | TEGRA_MAP_MUXCONF("ldc", "rsvd4", na, tristate), | ||
| 88 | TEGRA_MAP_MUXCONF("ldi", "displaya", na, driven), | ||
| 89 | TEGRA_MAP_MUXCONF("lhp0", "displaya", na, driven), | ||
| 90 | TEGRA_MAP_MUXCONF("lhp1", "displaya", na, driven), | ||
| 91 | TEGRA_MAP_MUXCONF("lhp2", "displaya", na, driven), | ||
| 92 | TEGRA_MAP_MUXCONF("lhs", "displaya", na, driven), | ||
| 93 | TEGRA_MAP_MUXCONF("lm0", "rsvd4", na, driven), | ||
| 94 | TEGRA_MAP_MUXCONF("lm1", "crt", na, tristate), | ||
| 95 | TEGRA_MAP_MUXCONF("lpp", "displaya", na, driven), | ||
| 96 | TEGRA_MAP_MUXCONF("lpw1", "rsvd4", na, tristate), | ||
| 97 | TEGRA_MAP_MUXCONF("lsc0", "displaya", na, driven), | ||
| 98 | TEGRA_MAP_MUXCONF("lsdi", "rsvd4", na, tristate), | ||
| 99 | TEGRA_MAP_MUXCONF("lspi", "displaya", na, driven), | ||
| 100 | TEGRA_MAP_MUXCONF("lvp0", "rsvd4", na, tristate), | ||
| 101 | TEGRA_MAP_MUXCONF("lvp1", "displaya", na, driven), | ||
| 102 | TEGRA_MAP_MUXCONF("lvs", "displaya", na, driven), | ||
| 103 | TEGRA_MAP_MUXCONF("owc", "rsvd2", none, tristate), | ||
| 104 | TEGRA_MAP_MUXCONF("pmc", "pwr_on", na, driven), | ||
| 105 | TEGRA_MAP_MUXCONF("pta", "hdmi", none, driven), | ||
| 106 | TEGRA_MAP_MUXCONF("rm", "i2c1", none, driven), | ||
| 107 | TEGRA_MAP_MUXCONF("sdb", "sdio3", na, driven), | ||
| 108 | TEGRA_MAP_MUXCONF("sdc", "sdio3", none, driven), | ||
| 109 | TEGRA_MAP_MUXCONF("sdd", "sdio3", none, driven), | ||
| 110 | TEGRA_MAP_MUXCONF("sdio1", "sdio1", up, driven), | ||
| 111 | TEGRA_MAP_MUXCONF("slxa", "pcie", up, tristate), | ||
| 112 | TEGRA_MAP_MUXCONF("slxd", "spdif", none, driven), | ||
| 113 | TEGRA_MAP_MUXCONF("slxk", "pcie", none, driven), | ||
| 114 | TEGRA_MAP_MUXCONF("spdi", "rsvd2", none, driven), | ||
| 115 | TEGRA_MAP_MUXCONF("spdo", "rsvd2", none, driven), | ||
| 116 | TEGRA_MAP_MUXCONF("spib", "gmi", none, tristate), | ||
| 117 | TEGRA_MAP_MUXCONF("spid", "spi1", none, tristate), | ||
| 118 | TEGRA_MAP_MUXCONF("spie", "spi1", none, tristate), | ||
| 119 | TEGRA_MAP_MUXCONF("spif", "spi1", down, tristate), | ||
| 120 | TEGRA_MAP_MUXCONF("spih", "spi2_alt", up, tristate), | ||
| 121 | TEGRA_MAP_MUXCONF("uaa", "ulpi", up, driven), | ||
| 122 | TEGRA_MAP_MUXCONF("uab", "ulpi", up, driven), | ||
| 123 | TEGRA_MAP_MUXCONF("uac", "rsvd2", none, driven), | ||
| 124 | TEGRA_MAP_MUXCONF("uad", "irda", none, driven), | ||
| 125 | TEGRA_MAP_MUXCONF("uca", "uartc", none, driven), | ||
| 126 | TEGRA_MAP_MUXCONF("ucb", "uartc", none, driven), | ||
| 127 | TEGRA_MAP_MUXCONF("uda", "ulpi", none, driven), | ||
| 128 | TEGRA_MAP_CONF("ck32", none, na), | ||
| 129 | TEGRA_MAP_CONF("ddrc", none, na), | ||
| 130 | TEGRA_MAP_CONF("pmca", none, na), | ||
| 131 | TEGRA_MAP_CONF("pmcb", none, na), | ||
| 132 | TEGRA_MAP_CONF("pmcc", none, na), | ||
| 133 | TEGRA_MAP_CONF("pmcd", none, na), | ||
| 134 | TEGRA_MAP_CONF("pmce", none, na), | ||
| 135 | TEGRA_MAP_CONF("xm2c", none, na), | ||
| 136 | TEGRA_MAP_CONF("xm2d", none, na), | ||
| 137 | TEGRA_MAP_CONF("ls", up, na), | ||
| 138 | TEGRA_MAP_CONF("lc", up, na), | ||
| 139 | TEGRA_MAP_CONF("ld17_0", down, na), | ||
| 140 | TEGRA_MAP_CONF("ld19_18", down, na), | ||
| 141 | TEGRA_MAP_CONF("ld21_20", down, na), | ||
| 142 | TEGRA_MAP_CONF("ld23_22", down, na), | ||
| 187 | }; | 143 | }; |
| 188 | 144 | ||
| 189 | static struct tegra_gpio_table seaboard_gpio_table[] = { | 145 | static struct pinctrl_map seaboard_map[] = { |
| 190 | { .gpio = TEGRA_GPIO_LIDSWITCH, .enable = true }, | 146 | TEGRA_MAP_MUXCONF("ddc", "rsvd2", none, tristate), |
| 191 | { .gpio = TEGRA_GPIO_POWERKEY, .enable = true }, | 147 | TEGRA_MAP_MUXCONF("gmd", "sflash", none, driven), |
| 192 | { .gpio = TEGRA_GPIO_HP_DET, .enable = true }, | 148 | TEGRA_MAP_MUXCONF("lpw0", "hdmi", na, driven), |
| 193 | { .gpio = TEGRA_GPIO_ISL29018_IRQ, .enable = true }, | 149 | TEGRA_MAP_MUXCONF("lpw2", "hdmi", na, driven), |
| 194 | { .gpio = TEGRA_GPIO_USB1, .enable = true }, | 150 | TEGRA_MAP_MUXCONF("lsc1", "hdmi", na, tristate), |
| 151 | TEGRA_MAP_MUXCONF("lsck", "hdmi", na, tristate), | ||
| 152 | TEGRA_MAP_MUXCONF("lsda", "hdmi", na, tristate), | ||
| 153 | TEGRA_MAP_MUXCONF("slxc", "spdif", none, tristate), | ||
| 154 | TEGRA_MAP_MUXCONF("spia", "gmi", up, tristate), | ||
| 155 | TEGRA_MAP_MUXCONF("spic", "gmi", up, driven), | ||
| 156 | TEGRA_MAP_MUXCONF("spig", "spi2_alt", up, tristate), | ||
| 157 | PIN_MAP_CONFIGS_GROUP_HOG_DEFAULT(PINMUX_DEV, "drive_sdio1", seaboard_pincfg_drive_sdio1), | ||
| 195 | }; | 158 | }; |
| 196 | 159 | ||
| 197 | static struct tegra_gpio_table ventana_gpio_table[] = { | 160 | static struct pinctrl_map ventana_map[] = { |
| 198 | /* hp_det */ | 161 | TEGRA_MAP_MUXCONF("ddc", "rsvd2", none, driven), |
| 199 | { .gpio = TEGRA_GPIO_PW2, .enable = true }, | 162 | TEGRA_MAP_MUXCONF("gmd", "sflash", none, tristate), |
| 200 | /* int_mic_en */ | 163 | TEGRA_MAP_MUXCONF("lpw0", "displaya", na, driven), |
| 201 | { .gpio = TEGRA_GPIO_PX0, .enable = true }, | 164 | TEGRA_MAP_MUXCONF("lpw2", "displaya", na, driven), |
| 202 | /* ext_mic_en */ | 165 | TEGRA_MAP_MUXCONF("lsc1", "displaya", na, driven), |
| 203 | { .gpio = TEGRA_GPIO_PX1, .enable = true }, | 166 | TEGRA_MAP_MUXCONF("lsck", "displaya", na, tristate), |
| 167 | TEGRA_MAP_MUXCONF("lsda", "displaya", na, tristate), | ||
| 168 | TEGRA_MAP_MUXCONF("slxc", "sdio3", none, driven), | ||
| 169 | TEGRA_MAP_MUXCONF("spia", "gmi", none, tristate), | ||
| 170 | TEGRA_MAP_MUXCONF("spic", "gmi", none, tristate), | ||
| 171 | TEGRA_MAP_MUXCONF("spig", "spi2_alt", none, tristate), | ||
| 204 | }; | 172 | }; |
| 205 | 173 | ||
| 206 | static struct tegra_board_pinmux_conf common_conf = { | 174 | static struct tegra_board_pinmux_conf common_conf = { |
| 207 | .pgs = common_pinmux, | 175 | .maps = common_map, |
| 208 | .pg_count = ARRAY_SIZE(common_pinmux), | 176 | .map_count = ARRAY_SIZE(common_map), |
| 209 | .gpios = common_gpio_table, | ||
| 210 | .gpio_count = ARRAY_SIZE(common_gpio_table), | ||
| 211 | }; | 177 | }; |
| 212 | 178 | ||
| 213 | static struct tegra_board_pinmux_conf seaboard_conf = { | 179 | static struct tegra_board_pinmux_conf seaboard_conf = { |
| 214 | .pgs = seaboard_pinmux, | 180 | .maps = seaboard_map, |
| 215 | .pg_count = ARRAY_SIZE(seaboard_pinmux), | 181 | .map_count = ARRAY_SIZE(seaboard_map), |
| 216 | .drives = seaboard_drive_pinmux, | ||
| 217 | .drive_count = ARRAY_SIZE(seaboard_drive_pinmux), | ||
| 218 | .gpios = seaboard_gpio_table, | ||
| 219 | .gpio_count = ARRAY_SIZE(seaboard_gpio_table), | ||
| 220 | }; | 182 | }; |
| 221 | 183 | ||
| 222 | static struct tegra_board_pinmux_conf ventana_conf = { | 184 | static struct tegra_board_pinmux_conf ventana_conf = { |
| 223 | .pgs = ventana_pinmux, | 185 | .maps = ventana_map, |
| 224 | .pg_count = ARRAY_SIZE(ventana_pinmux), | 186 | .map_count = ARRAY_SIZE(ventana_map), |
| 225 | .gpios = ventana_gpio_table, | ||
| 226 | .gpio_count = ARRAY_SIZE(ventana_gpio_table), | ||
| 227 | }; | 187 | }; |
| 228 | 188 | ||
| 229 | void seaboard_pinmux_init(void) | 189 | void seaboard_pinmux_init(void) |
diff --git a/arch/arm/mach-tegra/board-seaboard.c b/arch/arm/mach-tegra/board-seaboard.c index d669847f0485..a0184fb44222 100644 --- a/arch/arm/mach-tegra/board-seaboard.c +++ b/arch/arm/mach-tegra/board-seaboard.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
| 25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
| 26 | #include <linux/gpio_keys.h> | 26 | #include <linux/gpio_keys.h> |
| 27 | #include <linux/platform_data/tegra_usb.h> | ||
| 27 | 28 | ||
| 28 | #include <sound/wm8903.h> | 29 | #include <sound/wm8903.h> |
| 29 | 30 | ||
| @@ -186,20 +187,10 @@ static struct i2c_board_info __initdata wm8903_device = { | |||
| 186 | 187 | ||
| 187 | static int seaboard_ehci_init(void) | 188 | static int seaboard_ehci_init(void) |
| 188 | { | 189 | { |
| 189 | int gpio_status; | 190 | struct tegra_ehci_platform_data *pdata; |
| 190 | 191 | ||
| 191 | gpio_status = gpio_request(TEGRA_GPIO_USB1, "VBUS_USB1"); | 192 | pdata = tegra_ehci1_device.dev.platform_data; |
| 192 | if (gpio_status < 0) { | 193 | pdata->vbus_gpio = TEGRA_GPIO_USB1; |
| 193 | pr_err("VBUS_USB1 request GPIO FAILED\n"); | ||
| 194 | WARN_ON(1); | ||
| 195 | } | ||
| 196 | |||
| 197 | gpio_status = gpio_direction_output(TEGRA_GPIO_USB1, 1); | ||
| 198 | if (gpio_status < 0) { | ||
| 199 | pr_err("VBUS_USB1 request GPIO DIRECTION FAILED\n"); | ||
| 200 | WARN_ON(1); | ||
| 201 | } | ||
| 202 | gpio_set_value(TEGRA_GPIO_USB1, 1); | ||
| 203 | 194 | ||
| 204 | platform_device_register(&tegra_ehci1_device); | 195 | platform_device_register(&tegra_ehci1_device); |
| 205 | platform_device_register(&tegra_ehci3_device); | 196 | platform_device_register(&tegra_ehci3_device); |
| @@ -209,9 +200,6 @@ static int seaboard_ehci_init(void) | |||
| 209 | 200 | ||
| 210 | static void __init seaboard_i2c_init(void) | 201 | static void __init seaboard_i2c_init(void) |
| 211 | { | 202 | { |
| 212 | gpio_request(TEGRA_GPIO_ISL29018_IRQ, "isl29018"); | ||
| 213 | gpio_direction_input(TEGRA_GPIO_ISL29018_IRQ); | ||
| 214 | |||
| 215 | isl29018_device.irq = gpio_to_irq(TEGRA_GPIO_ISL29018_IRQ); | 203 | isl29018_device.irq = gpio_to_irq(TEGRA_GPIO_ISL29018_IRQ); |
| 216 | i2c_register_board_info(0, &isl29018_device, 1); | 204 | i2c_register_board_info(0, &isl29018_device, 1); |
| 217 | 205 | ||
| @@ -261,7 +249,6 @@ static void __init tegra_kaen_init(void) | |||
| 261 | debug_uart_platform_data[0].irq = INT_UARTB; | 249 | debug_uart_platform_data[0].irq = INT_UARTB; |
| 262 | 250 | ||
| 263 | seaboard_audio_pdata.gpio_hp_mute = TEGRA_GPIO_KAEN_HP_MUTE; | 251 | seaboard_audio_pdata.gpio_hp_mute = TEGRA_GPIO_KAEN_HP_MUTE; |
| 264 | tegra_gpio_enable(TEGRA_GPIO_KAEN_HP_MUTE); | ||
| 265 | 252 | ||
| 266 | seaboard_common_init(); | 253 | seaboard_common_init(); |
| 267 | 254 | ||
diff --git a/arch/arm/mach-tegra/board-trimslice-pinmux.c b/arch/arm/mach-tegra/board-trimslice-pinmux.c index a21a2be57cb6..7b39511c0d4d 100644 --- a/arch/arm/mach-tegra/board-trimslice-pinmux.c +++ b/arch/arm/mach-tegra/board-trimslice-pinmux.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * arch/arm/mach-tegra/board-trimslice-pinmux.c | 2 | * arch/arm/mach-tegra/board-trimslice-pinmux.c |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2011 CompuLab, Ltd. | 4 | * Copyright (C) 2011 CompuLab, Ltd. |
| 5 | * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. | ||
| 5 | * | 6 | * |
| 6 | * This software is licensed under the terms of the GNU General Public | 7 | * This software is licensed under the terms of the GNU General Public |
| 7 | * License version 2, as published by the Free Software Foundation, and | 8 | * License version 2, as published by the Free Software Foundation, and |
| @@ -13,150 +14,139 @@ | |||
| 13 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
| 14 | * | 15 | * |
| 15 | */ | 16 | */ |
| 16 | #include <linux/gpio.h> | ||
| 17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
| 18 | #include <linux/init.h> | ||
| 19 | #include <linux/of.h> | ||
| 20 | 18 | ||
| 21 | #include <mach/pinmux.h> | ||
| 22 | #include <mach/pinmux-tegra20.h> | ||
| 23 | |||
| 24 | #include "gpio-names.h" | ||
| 25 | #include "board-pinmux.h" | ||
| 26 | #include "board-trimslice.h" | 19 | #include "board-trimslice.h" |
| 20 | #include "board-pinmux.h" | ||
| 27 | 21 | ||
| 28 | static struct tegra_pingroup_config trimslice_pinmux[] = { | 22 | static struct pinctrl_map trimslice_map[] = { |
| 29 | {TEGRA_PINGROUP_ATA, TEGRA_MUX_IDE, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 23 | TEGRA_MAP_MUXCONF("ata", "ide", none, tristate), |
| 30 | {TEGRA_PINGROUP_ATB, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 24 | TEGRA_MAP_MUXCONF("atb", "sdio4", none, driven), |
| 31 | {TEGRA_PINGROUP_ATC, TEGRA_MUX_NAND, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 25 | TEGRA_MAP_MUXCONF("atc", "nand", none, tristate), |
| 32 | {TEGRA_PINGROUP_ATD, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 26 | TEGRA_MAP_MUXCONF("atd", "gmi", none, tristate), |
| 33 | {TEGRA_PINGROUP_ATE, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 27 | TEGRA_MAP_MUXCONF("ate", "gmi", none, tristate), |
| 34 | {TEGRA_PINGROUP_CDEV1, TEGRA_MUX_PLLA_OUT, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 28 | TEGRA_MAP_MUXCONF("cdev1", "plla_out", none, driven), |
| 35 | {TEGRA_PINGROUP_CDEV2, TEGRA_MUX_PLLP_OUT4, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 29 | TEGRA_MAP_MUXCONF("cdev2", "pllp_out4", down, tristate), |
| 36 | {TEGRA_PINGROUP_CRTP, TEGRA_MUX_CRT, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 30 | TEGRA_MAP_MUXCONF("crtp", "crt", none, tristate), |
| 37 | {TEGRA_PINGROUP_CSUS, TEGRA_MUX_VI_SENSOR_CLK, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 31 | TEGRA_MAP_MUXCONF("csus", "vi_sensor_clk", down, tristate), |
| 38 | {TEGRA_PINGROUP_DAP1, TEGRA_MUX_DAP1, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 32 | TEGRA_MAP_MUXCONF("dap1", "dap1", none, driven), |
| 39 | {TEGRA_PINGROUP_DAP2, TEGRA_MUX_DAP2, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 33 | TEGRA_MAP_MUXCONF("dap2", "dap2", none, tristate), |
| 40 | {TEGRA_PINGROUP_DAP3, TEGRA_MUX_DAP3, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 34 | TEGRA_MAP_MUXCONF("dap3", "dap3", none, tristate), |
| 41 | {TEGRA_PINGROUP_DAP4, TEGRA_MUX_DAP4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 35 | TEGRA_MAP_MUXCONF("dap4", "dap4", none, tristate), |
| 42 | {TEGRA_PINGROUP_DDC, TEGRA_MUX_I2C2, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 36 | TEGRA_MAP_MUXCONF("ddc", "i2c2", up, driven), |
| 43 | {TEGRA_PINGROUP_DTA, TEGRA_MUX_VI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 37 | TEGRA_MAP_MUXCONF("dta", "vi", none, tristate), |
| 44 | {TEGRA_PINGROUP_DTB, TEGRA_MUX_VI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 38 | TEGRA_MAP_MUXCONF("dtb", "vi", none, tristate), |
| 45 | {TEGRA_PINGROUP_DTC, TEGRA_MUX_VI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 39 | TEGRA_MAP_MUXCONF("dtc", "vi", none, tristate), |
| 46 | {TEGRA_PINGROUP_DTD, TEGRA_MUX_VI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 40 | TEGRA_MAP_MUXCONF("dtd", "vi", none, tristate), |
| 47 | {TEGRA_PINGROUP_DTE, TEGRA_MUX_VI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 41 | TEGRA_MAP_MUXCONF("dte", "vi", none, tristate), |
| 48 | {TEGRA_PINGROUP_DTF, TEGRA_MUX_I2C3, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 42 | TEGRA_MAP_MUXCONF("dtf", "i2c3", up, driven), |
| 49 | {TEGRA_PINGROUP_GMA, TEGRA_MUX_SDIO4, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 43 | TEGRA_MAP_MUXCONF("gma", "sdio4", none, driven), |
| 50 | {TEGRA_PINGROUP_GMB, TEGRA_MUX_NAND, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 44 | TEGRA_MAP_MUXCONF("gmb", "nand", none, tristate), |
| 51 | {TEGRA_PINGROUP_GMC, TEGRA_MUX_SFLASH, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 45 | TEGRA_MAP_MUXCONF("gmc", "sflash", none, driven), |
| 52 | {TEGRA_PINGROUP_GMD, TEGRA_MUX_SFLASH, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 46 | TEGRA_MAP_MUXCONF("gmd", "sflash", none, driven), |
| 53 | {TEGRA_PINGROUP_GME, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 47 | TEGRA_MAP_MUXCONF("gme", "gmi", none, tristate), |
| 54 | {TEGRA_PINGROUP_GPU, TEGRA_MUX_UARTA, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 48 | TEGRA_MAP_MUXCONF("gpu", "uarta", none, driven), |
| 55 | {TEGRA_PINGROUP_GPU7, TEGRA_MUX_RTCK, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 49 | TEGRA_MAP_MUXCONF("gpu7", "rtck", none, driven), |
| 56 | {TEGRA_PINGROUP_GPV, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 50 | TEGRA_MAP_MUXCONF("gpv", "pcie", none, driven), |
| 57 | {TEGRA_PINGROUP_HDINT, TEGRA_MUX_HDMI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 51 | TEGRA_MAP_MUXCONF("hdint", "hdmi", na, tristate), |
| 58 | {TEGRA_PINGROUP_I2CP, TEGRA_MUX_I2C, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 52 | TEGRA_MAP_MUXCONF("i2cp", "i2cp", none, tristate), |
| 59 | {TEGRA_PINGROUP_IRRX, TEGRA_MUX_UARTB, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 53 | TEGRA_MAP_MUXCONF("irrx", "uartb", up, tristate), |
| 60 | {TEGRA_PINGROUP_IRTX, TEGRA_MUX_UARTB, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 54 | TEGRA_MAP_MUXCONF("irtx", "uartb", up, tristate), |
| 61 | {TEGRA_PINGROUP_KBCA, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 55 | TEGRA_MAP_MUXCONF("kbca", "kbc", up, tristate), |
| 62 | {TEGRA_PINGROUP_KBCB, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 56 | TEGRA_MAP_MUXCONF("kbcb", "kbc", up, tristate), |
| 63 | {TEGRA_PINGROUP_KBCC, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 57 | TEGRA_MAP_MUXCONF("kbcc", "kbc", up, tristate), |
| 64 | {TEGRA_PINGROUP_KBCD, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 58 | TEGRA_MAP_MUXCONF("kbcd", "kbc", up, tristate), |
| 65 | {TEGRA_PINGROUP_KBCE, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 59 | TEGRA_MAP_MUXCONF("kbce", "kbc", up, tristate), |
| 66 | {TEGRA_PINGROUP_KBCF, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 60 | TEGRA_MAP_MUXCONF("kbcf", "kbc", up, tristate), |
| 67 | {TEGRA_PINGROUP_LCSN, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 61 | TEGRA_MAP_MUXCONF("lcsn", "displaya", na, tristate), |
| 68 | {TEGRA_PINGROUP_LD0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 62 | TEGRA_MAP_MUXCONF("ld0", "displaya", na, driven), |
| 69 | {TEGRA_PINGROUP_LD1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 63 | TEGRA_MAP_MUXCONF("ld1", "displaya", na, driven), |
| 70 | {TEGRA_PINGROUP_LD2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 64 | TEGRA_MAP_MUXCONF("ld10", "displaya", na, driven), |
| 71 | {TEGRA_PINGROUP_LD3, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 65 | TEGRA_MAP_MUXCONF("ld11", "displaya", na, driven), |
| 72 | {TEGRA_PINGROUP_LD4, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 66 | TEGRA_MAP_MUXCONF("ld12", "displaya", na, driven), |
| 73 | {TEGRA_PINGROUP_LD5, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 67 | TEGRA_MAP_MUXCONF("ld13", "displaya", na, driven), |
| 74 | {TEGRA_PINGROUP_LD6, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 68 | TEGRA_MAP_MUXCONF("ld14", "displaya", na, driven), |
| 75 | {TEGRA_PINGROUP_LD7, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 69 | TEGRA_MAP_MUXCONF("ld15", "displaya", na, driven), |
| 76 | {TEGRA_PINGROUP_LD8, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 70 | TEGRA_MAP_MUXCONF("ld16", "displaya", na, driven), |
| 77 | {TEGRA_PINGROUP_LD9, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 71 | TEGRA_MAP_MUXCONF("ld17", "displaya", na, driven), |
| 78 | {TEGRA_PINGROUP_LD10, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 72 | TEGRA_MAP_MUXCONF("ld2", "displaya", na, driven), |
| 79 | {TEGRA_PINGROUP_LD11, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 73 | TEGRA_MAP_MUXCONF("ld3", "displaya", na, driven), |
| 80 | {TEGRA_PINGROUP_LD12, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 74 | TEGRA_MAP_MUXCONF("ld4", "displaya", na, driven), |
| 81 | {TEGRA_PINGROUP_LD13, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 75 | TEGRA_MAP_MUXCONF("ld5", "displaya", na, driven), |
| 82 | {TEGRA_PINGROUP_LD14, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 76 | TEGRA_MAP_MUXCONF("ld6", "displaya", na, driven), |
| 83 | {TEGRA_PINGROUP_LD15, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 77 | TEGRA_MAP_MUXCONF("ld7", "displaya", na, driven), |
| 84 | {TEGRA_PINGROUP_LD16, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 78 | TEGRA_MAP_MUXCONF("ld8", "displaya", na, driven), |
| 85 | {TEGRA_PINGROUP_LD17, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 79 | TEGRA_MAP_MUXCONF("ld9", "displaya", na, driven), |
| 86 | {TEGRA_PINGROUP_LDC, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 80 | TEGRA_MAP_MUXCONF("ldc", "displaya", na, tristate), |
| 87 | {TEGRA_PINGROUP_LDI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 81 | TEGRA_MAP_MUXCONF("ldi", "displaya", na, driven), |
| 88 | {TEGRA_PINGROUP_LHP0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 82 | TEGRA_MAP_MUXCONF("lhp0", "displaya", na, driven), |
| 89 | {TEGRA_PINGROUP_LHP1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 83 | TEGRA_MAP_MUXCONF("lhp1", "displaya", na, driven), |
| 90 | {TEGRA_PINGROUP_LHP2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 84 | TEGRA_MAP_MUXCONF("lhp2", "displaya", na, driven), |
| 91 | {TEGRA_PINGROUP_LHS, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 85 | TEGRA_MAP_MUXCONF("lhs", "displaya", na, driven), |
| 92 | {TEGRA_PINGROUP_LM0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 86 | TEGRA_MAP_MUXCONF("lm0", "displaya", na, driven), |
| 93 | {TEGRA_PINGROUP_LM1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 87 | TEGRA_MAP_MUXCONF("lm1", "displaya", na, tristate), |
| 94 | {TEGRA_PINGROUP_LPP, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 88 | TEGRA_MAP_MUXCONF("lpp", "displaya", na, driven), |
| 95 | {TEGRA_PINGROUP_LPW0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 89 | TEGRA_MAP_MUXCONF("lpw0", "displaya", na, driven), |
| 96 | {TEGRA_PINGROUP_LPW1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 90 | TEGRA_MAP_MUXCONF("lpw1", "displaya", na, tristate), |
| 97 | {TEGRA_PINGROUP_LPW2, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 91 | TEGRA_MAP_MUXCONF("lpw2", "displaya", na, driven), |
| 98 | {TEGRA_PINGROUP_LSC0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 92 | TEGRA_MAP_MUXCONF("lsc0", "displaya", na, driven), |
| 99 | {TEGRA_PINGROUP_LSC1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 93 | TEGRA_MAP_MUXCONF("lsc1", "displaya", na, tristate), |
| 100 | {TEGRA_PINGROUP_LSCK, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 94 | TEGRA_MAP_MUXCONF("lsck", "displaya", na, tristate), |
| 101 | {TEGRA_PINGROUP_LSDA, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 95 | TEGRA_MAP_MUXCONF("lsda", "displaya", na, tristate), |
| 102 | {TEGRA_PINGROUP_LSDI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 96 | TEGRA_MAP_MUXCONF("lsdi", "displaya", na, tristate), |
| 103 | {TEGRA_PINGROUP_LSPI, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 97 | TEGRA_MAP_MUXCONF("lspi", "displaya", na, driven), |
| 104 | {TEGRA_PINGROUP_LVP0, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 98 | TEGRA_MAP_MUXCONF("lvp0", "displaya", na, tristate), |
| 105 | {TEGRA_PINGROUP_LVP1, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL}, | 99 | TEGRA_MAP_MUXCONF("lvp1", "displaya", na, driven), |
| 106 | {TEGRA_PINGROUP_LVS, TEGRA_MUX_DISPLAYA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 100 | TEGRA_MAP_MUXCONF("lvs", "displaya", na, driven), |
| 107 | {TEGRA_PINGROUP_OWC, TEGRA_MUX_RSVD2, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 101 | TEGRA_MAP_MUXCONF("owc", "rsvd2", up, tristate), |
| 108 | {TEGRA_PINGROUP_PMC, TEGRA_MUX_PWR_ON, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 102 | TEGRA_MAP_MUXCONF("pmc", "pwr_on", na, tristate), |
| 109 | {TEGRA_PINGROUP_PTA, TEGRA_MUX_GMI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 103 | TEGRA_MAP_MUXCONF("pta", "gmi", none, tristate), |
| 110 | {TEGRA_PINGROUP_RM, TEGRA_MUX_I2C, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 104 | TEGRA_MAP_MUXCONF("rm", "i2c1", up, driven), |
| 111 | {TEGRA_PINGROUP_SDB, TEGRA_MUX_PWM, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 105 | TEGRA_MAP_MUXCONF("sdb", "pwm", na, driven), |
| 112 | {TEGRA_PINGROUP_SDC, TEGRA_MUX_PWM, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 106 | TEGRA_MAP_MUXCONF("sdc", "pwm", up, driven), |
| 113 | {TEGRA_PINGROUP_SDD, TEGRA_MUX_PWM, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL}, | 107 | TEGRA_MAP_MUXCONF("sdd", "pwm", up, driven), |
| 114 | {TEGRA_PINGROUP_SDIO1, TEGRA_MUX_SDIO1, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 108 | TEGRA_MAP_MUXCONF("sdio1", "sdio1", none, driven), |
| 115 | {TEGRA_PINGROUP_SLXA, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 109 | TEGRA_MAP_MUXCONF("slxa", "pcie", none, driven), |
| 116 | {TEGRA_PINGROUP_SLXC, TEGRA_MUX_SDIO3, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 110 | TEGRA_MAP_MUXCONF("slxc", "sdio3", none, tristate), |
| 117 | {TEGRA_PINGROUP_SLXD, TEGRA_MUX_SDIO3, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 111 | TEGRA_MAP_MUXCONF("slxd", "sdio3", none, tristate), |
| 118 | {TEGRA_PINGROUP_SLXK, TEGRA_MUX_PCIE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 112 | TEGRA_MAP_MUXCONF("slxk", "pcie", none, driven), |
| 119 | {TEGRA_PINGROUP_SPDI, TEGRA_MUX_SPDIF, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 113 | TEGRA_MAP_MUXCONF("spdi", "spdif", none, tristate), |
| 120 | {TEGRA_PINGROUP_SPDO, TEGRA_MUX_SPDIF, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 114 | TEGRA_MAP_MUXCONF("spdo", "spdif", none, tristate), |
| 121 | {TEGRA_PINGROUP_SPIA, TEGRA_MUX_SPI2, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 115 | TEGRA_MAP_MUXCONF("spia", "spi2", down, tristate), |
| 122 | {TEGRA_PINGROUP_SPIB, TEGRA_MUX_SPI2, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 116 | TEGRA_MAP_MUXCONF("spib", "spi2", down, tristate), |
| 123 | {TEGRA_PINGROUP_SPIC, TEGRA_MUX_SPI2, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 117 | TEGRA_MAP_MUXCONF("spic", "spi2", up, tristate), |
| 124 | {TEGRA_PINGROUP_SPID, TEGRA_MUX_SPI1, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 118 | TEGRA_MAP_MUXCONF("spid", "spi1", down, tristate), |
| 125 | {TEGRA_PINGROUP_SPIE, TEGRA_MUX_SPI1, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 119 | TEGRA_MAP_MUXCONF("spie", "spi1", up, tristate), |
| 126 | {TEGRA_PINGROUP_SPIF, TEGRA_MUX_SPI1, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE}, | 120 | TEGRA_MAP_MUXCONF("spif", "spi1", down, tristate), |
| 127 | {TEGRA_PINGROUP_SPIG, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 121 | TEGRA_MAP_MUXCONF("spig", "spi2_alt", up, tristate), |
| 128 | {TEGRA_PINGROUP_SPIH, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 122 | TEGRA_MAP_MUXCONF("spih", "spi2_alt", up, tristate), |
| 129 | {TEGRA_PINGROUP_UAA, TEGRA_MUX_ULPI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 123 | TEGRA_MAP_MUXCONF("uaa", "ulpi", up, tristate), |
| 130 | {TEGRA_PINGROUP_UAB, TEGRA_MUX_ULPI, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 124 | TEGRA_MAP_MUXCONF("uab", "ulpi", up, tristate), |
| 131 | {TEGRA_PINGROUP_UAC, TEGRA_MUX_RSVD2, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 125 | TEGRA_MAP_MUXCONF("uac", "rsvd2", none, driven), |
| 132 | {TEGRA_PINGROUP_UAD, TEGRA_MUX_IRDA, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 126 | TEGRA_MAP_MUXCONF("uad", "irda", up, tristate), |
| 133 | {TEGRA_PINGROUP_UCA, TEGRA_MUX_UARTC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 127 | TEGRA_MAP_MUXCONF("uca", "uartc", up, tristate), |
| 134 | {TEGRA_PINGROUP_UCB, TEGRA_MUX_UARTC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_TRISTATE}, | 128 | TEGRA_MAP_MUXCONF("ucb", "uartc", up, tristate), |
| 135 | {TEGRA_PINGROUP_UDA, TEGRA_MUX_ULPI, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, | 129 | TEGRA_MAP_MUXCONF("uda", "ulpi", none, tristate), |
| 136 | {TEGRA_PINGROUP_CK32, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 130 | TEGRA_MAP_CONF("ck32", none, na), |
| 137 | {TEGRA_PINGROUP_DDRC, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 131 | TEGRA_MAP_CONF("ddrc", none, na), |
| 138 | {TEGRA_PINGROUP_PMCA, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 132 | TEGRA_MAP_CONF("pmca", none, na), |
| 139 | {TEGRA_PINGROUP_PMCB, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 133 | TEGRA_MAP_CONF("pmcb", none, na), |
| 140 | {TEGRA_PINGROUP_PMCC, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 134 | TEGRA_MAP_CONF("pmcc", none, na), |
| 141 | {TEGRA_PINGROUP_PMCD, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 135 | TEGRA_MAP_CONF("pmcd", none, na), |
| 142 | {TEGRA_PINGROUP_PMCE, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 136 | TEGRA_MAP_CONF("pmce", none, na), |
| 143 | {TEGRA_PINGROUP_XM2C, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 137 | TEGRA_MAP_CONF("xm2c", none, na), |
| 144 | {TEGRA_PINGROUP_XM2D, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, | 138 | TEGRA_MAP_CONF("xm2d", none, na), |
| 145 | }; | 139 | TEGRA_MAP_CONF("ls", up, na), |
| 146 | 140 | TEGRA_MAP_CONF("lc", up, na), | |
| 147 | static struct tegra_gpio_table gpio_table[] = { | 141 | TEGRA_MAP_CONF("ld17_0", down, na), |
| 148 | { .gpio = TRIMSLICE_GPIO_SD4_CD, .enable = true }, /* mmc4 cd */ | 142 | TEGRA_MAP_CONF("ld19_18", down, na), |
| 149 | { .gpio = TRIMSLICE_GPIO_SD4_WP, .enable = true }, /* mmc4 wp */ | 143 | TEGRA_MAP_CONF("ld21_20", down, na), |
| 150 | 144 | TEGRA_MAP_CONF("ld23_22", down, na), | |
| 151 | { .gpio = TRIMSLICE_GPIO_USB1_MODE, .enable = true }, /* USB1 mode */ | ||
| 152 | { .gpio = TRIMSLICE_GPIO_USB2_RST, .enable = true }, /* USB2 PHY rst */ | ||
| 153 | }; | 145 | }; |
| 154 | 146 | ||
| 155 | static struct tegra_board_pinmux_conf conf = { | 147 | static struct tegra_board_pinmux_conf conf = { |
| 156 | .pgs = trimslice_pinmux, | 148 | .maps = trimslice_map, |
| 157 | .pg_count = ARRAY_SIZE(trimslice_pinmux), | 149 | .map_count = ARRAY_SIZE(trimslice_map), |
| 158 | .gpios = gpio_table, | ||
| 159 | .gpio_count = ARRAY_SIZE(gpio_table), | ||
| 160 | }; | 150 | }; |
| 161 | 151 | ||
| 162 | void trimslice_pinmux_init(void) | 152 | void trimslice_pinmux_init(void) |
diff --git a/arch/arm/mach-tegra/board-trimslice.c b/arch/arm/mach-tegra/board-trimslice.c index cd52820a3e37..24f1678098dd 100644 --- a/arch/arm/mach-tegra/board-trimslice.c +++ b/arch/arm/mach-tegra/board-trimslice.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/io.h> | 25 | #include <linux/io.h> |
| 26 | #include <linux/i2c.h> | 26 | #include <linux/i2c.h> |
| 27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
| 28 | #include <linux/platform_data/tegra_usb.h> | ||
| 28 | 29 | ||
| 29 | #include <asm/hardware/gic.h> | 30 | #include <asm/hardware/gic.h> |
| 30 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
| @@ -111,19 +112,15 @@ static void trimslice_i2c_init(void) | |||
| 111 | 112 | ||
| 112 | static void trimslice_usb_init(void) | 113 | static void trimslice_usb_init(void) |
| 113 | { | 114 | { |
| 114 | int err; | 115 | struct tegra_ehci_platform_data *pdata; |
| 115 | 116 | ||
| 116 | platform_device_register(&tegra_ehci3_device); | 117 | pdata = tegra_ehci1_device.dev.platform_data; |
| 117 | 118 | pdata->vbus_gpio = TRIMSLICE_GPIO_USB1_MODE; | |
| 118 | platform_device_register(&tegra_ehci2_device); | ||
| 119 | 119 | ||
| 120 | err = gpio_request_one(TRIMSLICE_GPIO_USB1_MODE, GPIOF_OUT_INIT_HIGH, | 120 | tegra_ehci2_ulpi_phy_config.reset_gpio = TEGRA_GPIO_PV0; |
| 121 | "usb1mode"); | ||
| 122 | if (err) { | ||
| 123 | pr_err("TrimSlice: failed to obtain USB1 mode gpio: %d\n", err); | ||
| 124 | return; | ||
| 125 | } | ||
| 126 | 121 | ||
| 122 | platform_device_register(&tegra_ehci3_device); | ||
| 123 | platform_device_register(&tegra_ehci2_device); | ||
| 127 | platform_device_register(&tegra_ehci1_device); | 124 | platform_device_register(&tegra_ehci1_device); |
| 128 | } | 125 | } |
| 129 | 126 | ||
diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 22df10fb9972..f18f615aa93a 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c | |||
| @@ -82,10 +82,12 @@ static __initdata struct tegra_clk_init_table tegra20_clk_init_table[] = { | |||
| 82 | { "pll_p_out1", "pll_p", 28800000, true }, | 82 | { "pll_p_out1", "pll_p", 28800000, true }, |
| 83 | { "pll_p_out2", "pll_p", 48000000, true }, | 83 | { "pll_p_out2", "pll_p", 48000000, true }, |
| 84 | { "pll_p_out3", "pll_p", 72000000, true }, | 84 | { "pll_p_out3", "pll_p", 72000000, true }, |
| 85 | { "pll_p_out4", "pll_p", 108000000, true }, | 85 | { "pll_p_out4", "pll_p", 24000000, true }, |
| 86 | { "sclk", "pll_p_out4", 108000000, true }, | 86 | { "pll_c", "clk_m", 600000000, true }, |
| 87 | { "hclk", "sclk", 108000000, true }, | 87 | { "pll_c_out1", "pll_c", 120000000, true }, |
| 88 | { "pclk", "hclk", 54000000, true }, | 88 | { "sclk", "pll_c_out1", 120000000, true }, |
| 89 | { "hclk", "sclk", 120000000, true }, | ||
| 90 | { "pclk", "hclk", 60000000, true }, | ||
| 89 | { "csite", NULL, 0, true }, | 91 | { "csite", NULL, 0, true }, |
| 90 | { "emc", NULL, 0, true }, | 92 | { "emc", NULL, 0, true }, |
| 91 | { "cpu", NULL, 0, true }, | 93 | { "cpu", NULL, 0, true }, |
diff --git a/arch/arm/mach-tegra/devices.c b/arch/arm/mach-tegra/devices.c index 5f6b867e20b4..9fcb9a522276 100644 --- a/arch/arm/mach-tegra/devices.c +++ b/arch/arm/mach-tegra/devices.c | |||
| @@ -110,7 +110,7 @@ static struct resource pinmux_resource[] = { | |||
| 110 | }; | 110 | }; |
| 111 | 111 | ||
| 112 | struct platform_device tegra_pinmux_device = { | 112 | struct platform_device tegra_pinmux_device = { |
| 113 | .name = "tegra-pinmux", | 113 | .name = "tegra20-pinctrl", |
| 114 | .id = -1, | 114 | .id = -1, |
| 115 | .resource = pinmux_resource, | 115 | .resource = pinmux_resource, |
| 116 | .num_resources = ARRAY_SIZE(pinmux_resource), | 116 | .num_resources = ARRAY_SIZE(pinmux_resource), |
| @@ -439,26 +439,28 @@ static struct resource tegra_usb3_resources[] = { | |||
| 439 | }, | 439 | }, |
| 440 | }; | 440 | }; |
| 441 | 441 | ||
| 442 | static struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = { | 442 | struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = { |
| 443 | /* All existing boards use GPIO PV0 for phy reset */ | 443 | .reset_gpio = -1, |
| 444 | .reset_gpio = TEGRA_GPIO_PV0, | ||
| 445 | .clk = "cdev2", | 444 | .clk = "cdev2", |
| 446 | }; | 445 | }; |
| 447 | 446 | ||
| 448 | struct tegra_ehci_platform_data tegra_ehci1_pdata = { | 447 | struct tegra_ehci_platform_data tegra_ehci1_pdata = { |
| 449 | .operating_mode = TEGRA_USB_OTG, | 448 | .operating_mode = TEGRA_USB_OTG, |
| 450 | .power_down_on_bus_suspend = 1, | 449 | .power_down_on_bus_suspend = 1, |
| 450 | .vbus_gpio = -1, | ||
| 451 | }; | 451 | }; |
| 452 | 452 | ||
| 453 | struct tegra_ehci_platform_data tegra_ehci2_pdata = { | 453 | struct tegra_ehci_platform_data tegra_ehci2_pdata = { |
| 454 | .phy_config = &tegra_ehci2_ulpi_phy_config, | 454 | .phy_config = &tegra_ehci2_ulpi_phy_config, |
| 455 | .operating_mode = TEGRA_USB_HOST, | 455 | .operating_mode = TEGRA_USB_HOST, |
| 456 | .power_down_on_bus_suspend = 1, | 456 | .power_down_on_bus_suspend = 1, |
| 457 | .vbus_gpio = -1, | ||
| 457 | }; | 458 | }; |
| 458 | 459 | ||
| 459 | struct tegra_ehci_platform_data tegra_ehci3_pdata = { | 460 | struct tegra_ehci_platform_data tegra_ehci3_pdata = { |
| 460 | .operating_mode = TEGRA_USB_HOST, | 461 | .operating_mode = TEGRA_USB_HOST, |
| 461 | .power_down_on_bus_suspend = 1, | 462 | .power_down_on_bus_suspend = 1, |
| 463 | .vbus_gpio = -1, | ||
| 462 | }; | 464 | }; |
| 463 | 465 | ||
| 464 | static u64 tegra_ehci_dmamask = DMA_BIT_MASK(32); | 466 | static u64 tegra_ehci_dmamask = DMA_BIT_MASK(32); |
diff --git a/arch/arm/mach-tegra/devices.h b/arch/arm/mach-tegra/devices.h index ec455679b219..4290ea0063ac 100644 --- a/arch/arm/mach-tegra/devices.h +++ b/arch/arm/mach-tegra/devices.h | |||
| @@ -22,6 +22,10 @@ | |||
| 22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
| 23 | #include <linux/platform_data/tegra_usb.h> | 23 | #include <linux/platform_data/tegra_usb.h> |
| 24 | 24 | ||
| 25 | #include <mach/usb_phy.h> | ||
| 26 | |||
| 27 | extern struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config; | ||
| 28 | |||
| 25 | extern struct tegra_ehci_platform_data tegra_ehci1_pdata; | 29 | extern struct tegra_ehci_platform_data tegra_ehci1_pdata; |
| 26 | extern struct tegra_ehci_platform_data tegra_ehci2_pdata; | 30 | extern struct tegra_ehci_platform_data tegra_ehci2_pdata; |
| 27 | extern struct tegra_ehci_platform_data tegra_ehci3_pdata; | 31 | extern struct tegra_ehci_platform_data tegra_ehci3_pdata; |
diff --git a/arch/arm/mach-tegra/include/mach/gpio-tegra.h b/arch/arm/mach-tegra/include/mach/gpio-tegra.h index 6140820555e1..a978b3cc3a8d 100644 --- a/arch/arm/mach-tegra/include/mach/gpio-tegra.h +++ b/arch/arm/mach-tegra/include/mach/gpio-tegra.h | |||
| @@ -25,13 +25,4 @@ | |||
| 25 | 25 | ||
| 26 | #define TEGRA_NR_GPIOS INT_GPIO_NR | 26 | #define TEGRA_NR_GPIOS INT_GPIO_NR |
| 27 | 27 | ||
| 28 | struct tegra_gpio_table { | ||
| 29 | int gpio; /* GPIO number */ | ||
| 30 | bool enable; /* Enable for GPIO at init? */ | ||
| 31 | }; | ||
| 32 | |||
| 33 | void tegra_gpio_config(struct tegra_gpio_table *table, int num); | ||
| 34 | void tegra_gpio_enable(int gpio); | ||
| 35 | void tegra_gpio_disable(int gpio); | ||
| 36 | |||
| 37 | #endif | 28 | #endif |
diff --git a/arch/arm/mach-tegra/include/mach/pinmux-tegra20.h b/arch/arm/mach-tegra/include/mach/pinmux-tegra20.h deleted file mode 100644 index 6a40c1dbab17..000000000000 --- a/arch/arm/mach-tegra/include/mach/pinmux-tegra20.h +++ /dev/null | |||
| @@ -1,184 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/mach-tegra/include/mach/pinmux-tegra20.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Google, Inc. | ||
| 5 | * | ||
| 6 | * This software is licensed under the terms of the GNU General Public | ||
| 7 | * License version 2, as published by the Free Software Foundation, and | ||
| 8 | * may be copied, distributed, and modified under those terms. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | */ | ||
| 16 | |||
| 17 | #ifndef __MACH_TEGRA_PINMUX_TEGRA20_H | ||
| 18 | #define __MACH_TEGRA_PINMUX_TEGRA20_H | ||
| 19 | |||
| 20 | enum tegra_pingroup { | ||
| 21 | TEGRA_PINGROUP_ATA = 0, | ||
| 22 | TEGRA_PINGROUP_ATB, | ||
| 23 | TEGRA_PINGROUP_ATC, | ||
| 24 | TEGRA_PINGROUP_ATD, | ||
| 25 | TEGRA_PINGROUP_ATE, | ||
| 26 | TEGRA_PINGROUP_CDEV1, | ||
| 27 | TEGRA_PINGROUP_CDEV2, | ||
| 28 | TEGRA_PINGROUP_CRTP, | ||
| 29 | TEGRA_PINGROUP_CSUS, | ||
| 30 | TEGRA_PINGROUP_DAP1, | ||
| 31 | TEGRA_PINGROUP_DAP2, | ||
| 32 | TEGRA_PINGROUP_DAP3, | ||
| 33 | TEGRA_PINGROUP_DAP4, | ||
| 34 | TEGRA_PINGROUP_DDC, | ||
| 35 | TEGRA_PINGROUP_DTA, | ||
| 36 | TEGRA_PINGROUP_DTB, | ||
| 37 | TEGRA_PINGROUP_DTC, | ||
| 38 | TEGRA_PINGROUP_DTD, | ||
| 39 | TEGRA_PINGROUP_DTE, | ||
| 40 | TEGRA_PINGROUP_DTF, | ||
| 41 | TEGRA_PINGROUP_GMA, | ||
| 42 | TEGRA_PINGROUP_GMB, | ||
| 43 | TEGRA_PINGROUP_GMC, | ||
| 44 | TEGRA_PINGROUP_GMD, | ||
| 45 | TEGRA_PINGROUP_GME, | ||
| 46 | TEGRA_PINGROUP_GPU, | ||
| 47 | TEGRA_PINGROUP_GPU7, | ||
| 48 | TEGRA_PINGROUP_GPV, | ||
| 49 | TEGRA_PINGROUP_HDINT, | ||
| 50 | TEGRA_PINGROUP_I2CP, | ||
| 51 | TEGRA_PINGROUP_IRRX, | ||
| 52 | TEGRA_PINGROUP_IRTX, | ||
| 53 | TEGRA_PINGROUP_KBCA, | ||
| 54 | TEGRA_PINGROUP_KBCB, | ||
| 55 | TEGRA_PINGROUP_KBCC, | ||
| 56 | TEGRA_PINGROUP_KBCD, | ||
| 57 | TEGRA_PINGROUP_KBCE, | ||
| 58 | TEGRA_PINGROUP_KBCF, | ||
| 59 | TEGRA_PINGROUP_LCSN, | ||
| 60 | TEGRA_PINGROUP_LD0, | ||
| 61 | TEGRA_PINGROUP_LD1, | ||
| 62 | TEGRA_PINGROUP_LD10, | ||
| 63 | TEGRA_PINGROUP_LD11, | ||
| 64 | TEGRA_PINGROUP_LD12, | ||
| 65 | TEGRA_PINGROUP_LD13, | ||
| 66 | TEGRA_PINGROUP_LD14, | ||
| 67 | TEGRA_PINGROUP_LD15, | ||
| 68 | TEGRA_PINGROUP_LD16, | ||
| 69 | TEGRA_PINGROUP_LD17, | ||
| 70 | TEGRA_PINGROUP_LD2, | ||
| 71 | TEGRA_PINGROUP_LD3, | ||
| 72 | TEGRA_PINGROUP_LD4, | ||
| 73 | TEGRA_PINGROUP_LD5, | ||
| 74 | TEGRA_PINGROUP_LD6, | ||
| 75 | TEGRA_PINGROUP_LD7, | ||
| 76 | TEGRA_PINGROUP_LD8, | ||
| 77 | TEGRA_PINGROUP_LD9, | ||
| 78 | TEGRA_PINGROUP_LDC, | ||
| 79 | TEGRA_PINGROUP_LDI, | ||
| 80 | TEGRA_PINGROUP_LHP0, | ||
| 81 | TEGRA_PINGROUP_LHP1, | ||
| 82 | TEGRA_PINGROUP_LHP2, | ||
| 83 | TEGRA_PINGROUP_LHS, | ||
| 84 | TEGRA_PINGROUP_LM0, | ||
| 85 | TEGRA_PINGROUP_LM1, | ||
| 86 | TEGRA_PINGROUP_LPP, | ||
| 87 | TEGRA_PINGROUP_LPW0, | ||
| 88 | TEGRA_PINGROUP_LPW1, | ||
| 89 | TEGRA_PINGROUP_LPW2, | ||
| 90 | TEGRA_PINGROUP_LSC0, | ||
| 91 | TEGRA_PINGROUP_LSC1, | ||
| 92 | TEGRA_PINGROUP_LSCK, | ||
| 93 | TEGRA_PINGROUP_LSDA, | ||
| 94 | TEGRA_PINGROUP_LSDI, | ||
| 95 | TEGRA_PINGROUP_LSPI, | ||
| 96 | TEGRA_PINGROUP_LVP0, | ||
| 97 | TEGRA_PINGROUP_LVP1, | ||
| 98 | TEGRA_PINGROUP_LVS, | ||
| 99 | TEGRA_PINGROUP_OWC, | ||
| 100 | TEGRA_PINGROUP_PMC, | ||
| 101 | TEGRA_PINGROUP_PTA, | ||
| 102 | TEGRA_PINGROUP_RM, | ||
| 103 | TEGRA_PINGROUP_SDB, | ||
| 104 | TEGRA_PINGROUP_SDC, | ||
| 105 | TEGRA_PINGROUP_SDD, | ||
| 106 | TEGRA_PINGROUP_SDIO1, | ||
| 107 | TEGRA_PINGROUP_SLXA, | ||
| 108 | TEGRA_PINGROUP_SLXC, | ||
| 109 | TEGRA_PINGROUP_SLXD, | ||
| 110 | TEGRA_PINGROUP_SLXK, | ||
| 111 | TEGRA_PINGROUP_SPDI, | ||
| 112 | TEGRA_PINGROUP_SPDO, | ||
| 113 | TEGRA_PINGROUP_SPIA, | ||
| 114 | TEGRA_PINGROUP_SPIB, | ||
| 115 | TEGRA_PINGROUP_SPIC, | ||
| 116 | TEGRA_PINGROUP_SPID, | ||
| 117 | TEGRA_PINGROUP_SPIE, | ||
| 118 | TEGRA_PINGROUP_SPIF, | ||
| 119 | TEGRA_PINGROUP_SPIG, | ||
| 120 | TEGRA_PINGROUP_SPIH, | ||
| 121 | TEGRA_PINGROUP_UAA, | ||
| 122 | TEGRA_PINGROUP_UAB, | ||
| 123 | TEGRA_PINGROUP_UAC, | ||
| 124 | TEGRA_PINGROUP_UAD, | ||
| 125 | TEGRA_PINGROUP_UCA, | ||
| 126 | TEGRA_PINGROUP_UCB, | ||
| 127 | TEGRA_PINGROUP_UDA, | ||
| 128 | /* these pin groups only have pullup and pull down control */ | ||
| 129 | TEGRA_PINGROUP_CK32, | ||
| 130 | TEGRA_PINGROUP_DDRC, | ||
| 131 | TEGRA_PINGROUP_PMCA, | ||
| 132 | TEGRA_PINGROUP_PMCB, | ||
| 133 | TEGRA_PINGROUP_PMCC, | ||
| 134 | TEGRA_PINGROUP_PMCD, | ||
| 135 | TEGRA_PINGROUP_PMCE, | ||
| 136 | TEGRA_PINGROUP_XM2C, | ||
| 137 | TEGRA_PINGROUP_XM2D, | ||
| 138 | TEGRA_MAX_PINGROUP, | ||
| 139 | }; | ||
| 140 | |||
| 141 | enum tegra_drive_pingroup { | ||
| 142 | TEGRA_DRIVE_PINGROUP_AO1 = 0, | ||
| 143 | TEGRA_DRIVE_PINGROUP_AO2, | ||
| 144 | TEGRA_DRIVE_PINGROUP_AT1, | ||
| 145 | TEGRA_DRIVE_PINGROUP_AT2, | ||
| 146 | TEGRA_DRIVE_PINGROUP_CDEV1, | ||
| 147 | TEGRA_DRIVE_PINGROUP_CDEV2, | ||
| 148 | TEGRA_DRIVE_PINGROUP_CSUS, | ||
| 149 | TEGRA_DRIVE_PINGROUP_DAP1, | ||
| 150 | TEGRA_DRIVE_PINGROUP_DAP2, | ||
| 151 | TEGRA_DRIVE_PINGROUP_DAP3, | ||
| 152 | TEGRA_DRIVE_PINGROUP_DAP4, | ||
| 153 | TEGRA_DRIVE_PINGROUP_DBG, | ||
| 154 | TEGRA_DRIVE_PINGROUP_LCD1, | ||
| 155 | TEGRA_DRIVE_PINGROUP_LCD2, | ||
| 156 | TEGRA_DRIVE_PINGROUP_SDMMC2, | ||
| 157 | TEGRA_DRIVE_PINGROUP_SDMMC3, | ||
| 158 | TEGRA_DRIVE_PINGROUP_SPI, | ||
| 159 | TEGRA_DRIVE_PINGROUP_UAA, | ||
| 160 | TEGRA_DRIVE_PINGROUP_UAB, | ||
| 161 | TEGRA_DRIVE_PINGROUP_UART2, | ||
| 162 | TEGRA_DRIVE_PINGROUP_UART3, | ||
| 163 | TEGRA_DRIVE_PINGROUP_VI1, | ||
| 164 | TEGRA_DRIVE_PINGROUP_VI2, | ||
| 165 | TEGRA_DRIVE_PINGROUP_XM2A, | ||
| 166 | TEGRA_DRIVE_PINGROUP_XM2C, | ||
| 167 | TEGRA_DRIVE_PINGROUP_XM2D, | ||
| 168 | TEGRA_DRIVE_PINGROUP_XM2CLK, | ||
| 169 | TEGRA_DRIVE_PINGROUP_MEMCOMP, | ||
| 170 | TEGRA_DRIVE_PINGROUP_SDIO1, | ||
| 171 | TEGRA_DRIVE_PINGROUP_CRT, | ||
| 172 | TEGRA_DRIVE_PINGROUP_DDC, | ||
| 173 | TEGRA_DRIVE_PINGROUP_GMA, | ||
| 174 | TEGRA_DRIVE_PINGROUP_GMB, | ||
| 175 | TEGRA_DRIVE_PINGROUP_GMC, | ||
| 176 | TEGRA_DRIVE_PINGROUP_GMD, | ||
| 177 | TEGRA_DRIVE_PINGROUP_GME, | ||
| 178 | TEGRA_DRIVE_PINGROUP_OWR, | ||
| 179 | TEGRA_DRIVE_PINGROUP_UAD, | ||
| 180 | TEGRA_MAX_DRIVE_PINGROUP, | ||
| 181 | }; | ||
| 182 | |||
| 183 | #endif | ||
| 184 | |||
diff --git a/arch/arm/mach-tegra/include/mach/pinmux-tegra30.h b/arch/arm/mach-tegra/include/mach/pinmux-tegra30.h deleted file mode 100644 index c1aee3eb2df1..000000000000 --- a/arch/arm/mach-tegra/include/mach/pinmux-tegra30.h +++ /dev/null | |||
| @@ -1,320 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/mach-tegra/include/mach/pinmux-tegra30.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Google, Inc. | ||
| 5 | * Copyright (C) 2010,2011 Nvidia, Inc. | ||
| 6 | * | ||
| 7 | * This software is licensed under the terms of the GNU General Public | ||
| 8 | * License version 2, as published by the Free Software Foundation, and | ||
| 9 | * may be copied, distributed, and modified under those terms. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | |||
| 18 | #ifndef __MACH_TEGRA_PINMUX_TEGRA30_H | ||
| 19 | #define __MACH_TEGRA_PINMUX_TEGRA30_H | ||
| 20 | |||
| 21 | enum tegra_pingroup { | ||
| 22 | TEGRA_PINGROUP_ULPI_DATA0 = 0, | ||
| 23 | TEGRA_PINGROUP_ULPI_DATA1, | ||
| 24 | TEGRA_PINGROUP_ULPI_DATA2, | ||
| 25 | TEGRA_PINGROUP_ULPI_DATA3, | ||
| 26 | TEGRA_PINGROUP_ULPI_DATA4, | ||
| 27 | TEGRA_PINGROUP_ULPI_DATA5, | ||
| 28 | TEGRA_PINGROUP_ULPI_DATA6, | ||
| 29 | TEGRA_PINGROUP_ULPI_DATA7, | ||
| 30 | TEGRA_PINGROUP_ULPI_CLK, | ||
| 31 | TEGRA_PINGROUP_ULPI_DIR, | ||
| 32 | TEGRA_PINGROUP_ULPI_NXT, | ||
| 33 | TEGRA_PINGROUP_ULPI_STP, | ||
| 34 | TEGRA_PINGROUP_DAP3_FS, | ||
| 35 | TEGRA_PINGROUP_DAP3_DIN, | ||
| 36 | TEGRA_PINGROUP_DAP3_DOUT, | ||
| 37 | TEGRA_PINGROUP_DAP3_SCLK, | ||
| 38 | TEGRA_PINGROUP_GPIO_PV0, | ||
| 39 | TEGRA_PINGROUP_GPIO_PV1, | ||
| 40 | TEGRA_PINGROUP_SDMMC1_CLK, | ||
| 41 | TEGRA_PINGROUP_SDMMC1_CMD, | ||
| 42 | TEGRA_PINGROUP_SDMMC1_DAT3, | ||
| 43 | TEGRA_PINGROUP_SDMMC1_DAT2, | ||
| 44 | TEGRA_PINGROUP_SDMMC1_DAT1, | ||
| 45 | TEGRA_PINGROUP_SDMMC1_DAT0, | ||
| 46 | TEGRA_PINGROUP_GPIO_PV2, | ||
| 47 | TEGRA_PINGROUP_GPIO_PV3, | ||
| 48 | TEGRA_PINGROUP_CLK2_OUT, | ||
| 49 | TEGRA_PINGROUP_CLK2_REQ, | ||
| 50 | TEGRA_PINGROUP_LCD_PWR1, | ||
| 51 | TEGRA_PINGROUP_LCD_PWR2, | ||
| 52 | TEGRA_PINGROUP_LCD_SDIN, | ||
| 53 | TEGRA_PINGROUP_LCD_SDOUT, | ||
| 54 | TEGRA_PINGROUP_LCD_WR_N, | ||
| 55 | TEGRA_PINGROUP_LCD_CS0_N, | ||
| 56 | TEGRA_PINGROUP_LCD_DC0, | ||
| 57 | TEGRA_PINGROUP_LCD_SCK, | ||
| 58 | TEGRA_PINGROUP_LCD_PWR0, | ||
| 59 | TEGRA_PINGROUP_LCD_PCLK, | ||
| 60 | TEGRA_PINGROUP_LCD_DE, | ||
| 61 | TEGRA_PINGROUP_LCD_HSYNC, | ||
| 62 | TEGRA_PINGROUP_LCD_VSYNC, | ||
| 63 | TEGRA_PINGROUP_LCD_D0, | ||
| 64 | TEGRA_PINGROUP_LCD_D1, | ||
| 65 | TEGRA_PINGROUP_LCD_D2, | ||
| 66 | TEGRA_PINGROUP_LCD_D3, | ||
| 67 | TEGRA_PINGROUP_LCD_D4, | ||
| 68 | TEGRA_PINGROUP_LCD_D5, | ||
| 69 | TEGRA_PINGROUP_LCD_D6, | ||
| 70 | TEGRA_PINGROUP_LCD_D7, | ||
| 71 | TEGRA_PINGROUP_LCD_D8, | ||
| 72 | TEGRA_PINGROUP_LCD_D9, | ||
| 73 | TEGRA_PINGROUP_LCD_D10, | ||
| 74 | TEGRA_PINGROUP_LCD_D11, | ||
| 75 | TEGRA_PINGROUP_LCD_D12, | ||
| 76 | TEGRA_PINGROUP_LCD_D13, | ||
| 77 | TEGRA_PINGROUP_LCD_D14, | ||
| 78 | TEGRA_PINGROUP_LCD_D15, | ||
| 79 | TEGRA_PINGROUP_LCD_D16, | ||
| 80 | TEGRA_PINGROUP_LCD_D17, | ||
| 81 | TEGRA_PINGROUP_LCD_D18, | ||
| 82 | TEGRA_PINGROUP_LCD_D19, | ||
| 83 | TEGRA_PINGROUP_LCD_D20, | ||
| 84 | TEGRA_PINGROUP_LCD_D21, | ||
| 85 | TEGRA_PINGROUP_LCD_D22, | ||
| 86 | TEGRA_PINGROUP_LCD_D23, | ||
| 87 | TEGRA_PINGROUP_LCD_CS1_N, | ||
| 88 | TEGRA_PINGROUP_LCD_M1, | ||
| 89 | TEGRA_PINGROUP_LCD_DC1, | ||
| 90 | TEGRA_PINGROUP_HDMI_INT, | ||
| 91 | TEGRA_PINGROUP_DDC_SCL, | ||
| 92 | TEGRA_PINGROUP_DDC_SDA, | ||
| 93 | TEGRA_PINGROUP_CRT_HSYNC, | ||
| 94 | TEGRA_PINGROUP_CRT_VSYNC, | ||
| 95 | TEGRA_PINGROUP_VI_D0, | ||
| 96 | TEGRA_PINGROUP_VI_D1, | ||
| 97 | TEGRA_PINGROUP_VI_D2, | ||
| 98 | TEGRA_PINGROUP_VI_D3, | ||
| 99 | TEGRA_PINGROUP_VI_D4, | ||
| 100 | TEGRA_PINGROUP_VI_D5, | ||
| 101 | TEGRA_PINGROUP_VI_D6, | ||
| 102 | TEGRA_PINGROUP_VI_D7, | ||
| 103 | TEGRA_PINGROUP_VI_D8, | ||
| 104 | TEGRA_PINGROUP_VI_D9, | ||
| 105 | TEGRA_PINGROUP_VI_D10, | ||
| 106 | TEGRA_PINGROUP_VI_D11, | ||
| 107 | TEGRA_PINGROUP_VI_PCLK, | ||
| 108 | TEGRA_PINGROUP_VI_MCLK, | ||
| 109 | TEGRA_PINGROUP_VI_VSYNC, | ||
| 110 | TEGRA_PINGROUP_VI_HSYNC, | ||
| 111 | TEGRA_PINGROUP_UART2_RXD, | ||
| 112 | TEGRA_PINGROUP_UART2_TXD, | ||
| 113 | TEGRA_PINGROUP_UART2_RTS_N, | ||
| 114 | TEGRA_PINGROUP_UART2_CTS_N, | ||
| 115 | TEGRA_PINGROUP_UART3_TXD, | ||
| 116 | TEGRA_PINGROUP_UART3_RXD, | ||
| 117 | TEGRA_PINGROUP_UART3_CTS_N, | ||
| 118 | TEGRA_PINGROUP_UART3_RTS_N, | ||
| 119 | TEGRA_PINGROUP_GPIO_PU0, | ||
| 120 | TEGRA_PINGROUP_GPIO_PU1, | ||
| 121 | TEGRA_PINGROUP_GPIO_PU2, | ||
| 122 | TEGRA_PINGROUP_GPIO_PU3, | ||
| 123 | TEGRA_PINGROUP_GPIO_PU4, | ||
| 124 | TEGRA_PINGROUP_GPIO_PU5, | ||
| 125 | TEGRA_PINGROUP_GPIO_PU6, | ||
| 126 | TEGRA_PINGROUP_GEN1_I2C_SDA, | ||
| 127 | TEGRA_PINGROUP_GEN1_I2C_SCL, | ||
| 128 | TEGRA_PINGROUP_DAP4_FS, | ||
| 129 | TEGRA_PINGROUP_DAP4_DIN, | ||
| 130 | TEGRA_PINGROUP_DAP4_DOUT, | ||
| 131 | TEGRA_PINGROUP_DAP4_SCLK, | ||
| 132 | TEGRA_PINGROUP_CLK3_OUT, | ||
| 133 | TEGRA_PINGROUP_CLK3_REQ, | ||
| 134 | TEGRA_PINGROUP_GMI_WP_N, | ||
| 135 | TEGRA_PINGROUP_GMI_IORDY, | ||
| 136 | TEGRA_PINGROUP_GMI_WAIT, | ||
| 137 | TEGRA_PINGROUP_GMI_ADV_N, | ||
| 138 | TEGRA_PINGROUP_GMI_CLK, | ||
| 139 | TEGRA_PINGROUP_GMI_CS0_N, | ||
| 140 | TEGRA_PINGROUP_GMI_CS1_N, | ||
| 141 | TEGRA_PINGROUP_GMI_CS2_N, | ||
| 142 | TEGRA_PINGROUP_GMI_CS3_N, | ||
| 143 | TEGRA_PINGROUP_GMI_CS4_N, | ||
| 144 | TEGRA_PINGROUP_GMI_CS6_N, | ||
| 145 | TEGRA_PINGROUP_GMI_CS7_N, | ||
| 146 | TEGRA_PINGROUP_GMI_AD0, | ||
| 147 | TEGRA_PINGROUP_GMI_AD1, | ||
| 148 | TEGRA_PINGROUP_GMI_AD2, | ||
| 149 | TEGRA_PINGROUP_GMI_AD3, | ||
| 150 | TEGRA_PINGROUP_GMI_AD4, | ||
| 151 | TEGRA_PINGROUP_GMI_AD5, | ||
| 152 | TEGRA_PINGROUP_GMI_AD6, | ||
| 153 | TEGRA_PINGROUP_GMI_AD7, | ||
| 154 | TEGRA_PINGROUP_GMI_AD8, | ||
| 155 | TEGRA_PINGROUP_GMI_AD9, | ||
| 156 | TEGRA_PINGROUP_GMI_AD10, | ||
| 157 | TEGRA_PINGROUP_GMI_AD11, | ||
| 158 | TEGRA_PINGROUP_GMI_AD12, | ||
| 159 | TEGRA_PINGROUP_GMI_AD13, | ||
| 160 | TEGRA_PINGROUP_GMI_AD14, | ||
| 161 | TEGRA_PINGROUP_GMI_AD15, | ||
| 162 | TEGRA_PINGROUP_GMI_A16, | ||
| 163 | TEGRA_PINGROUP_GMI_A17, | ||
| 164 | TEGRA_PINGROUP_GMI_A18, | ||
| 165 | TEGRA_PINGROUP_GMI_A19, | ||
| 166 | TEGRA_PINGROUP_GMI_WR_N, | ||
| 167 | TEGRA_PINGROUP_GMI_OE_N, | ||
| 168 | TEGRA_PINGROUP_GMI_DQS, | ||
| 169 | TEGRA_PINGROUP_GMI_RST_N, | ||
| 170 | TEGRA_PINGROUP_GEN2_I2C_SCL, | ||
| 171 | TEGRA_PINGROUP_GEN2_I2C_SDA, | ||
| 172 | TEGRA_PINGROUP_SDMMC4_CLK, | ||
| 173 | TEGRA_PINGROUP_SDMMC4_CMD, | ||
| 174 | TEGRA_PINGROUP_SDMMC4_DAT0, | ||
| 175 | TEGRA_PINGROUP_SDMMC4_DAT1, | ||
| 176 | TEGRA_PINGROUP_SDMMC4_DAT2, | ||
| 177 | TEGRA_PINGROUP_SDMMC4_DAT3, | ||
| 178 | TEGRA_PINGROUP_SDMMC4_DAT4, | ||
| 179 | TEGRA_PINGROUP_SDMMC4_DAT5, | ||
| 180 | TEGRA_PINGROUP_SDMMC4_DAT6, | ||
| 181 | TEGRA_PINGROUP_SDMMC4_DAT7, | ||
| 182 | TEGRA_PINGROUP_SDMMC4_RST_N, | ||
| 183 | TEGRA_PINGROUP_CAM_MCLK, | ||
| 184 | TEGRA_PINGROUP_GPIO_PCC1, | ||
| 185 | TEGRA_PINGROUP_GPIO_PBB0, | ||
| 186 | TEGRA_PINGROUP_CAM_I2C_SCL, | ||
| 187 | TEGRA_PINGROUP_CAM_I2C_SDA, | ||
| 188 | TEGRA_PINGROUP_GPIO_PBB3, | ||
| 189 | TEGRA_PINGROUP_GPIO_PBB4, | ||
| 190 | TEGRA_PINGROUP_GPIO_PBB5, | ||
| 191 | TEGRA_PINGROUP_GPIO_PBB6, | ||
| 192 | TEGRA_PINGROUP_GPIO_PBB7, | ||
| 193 | TEGRA_PINGROUP_GPIO_PCC2, | ||
| 194 | TEGRA_PINGROUP_JTAG_RTCK, | ||
| 195 | TEGRA_PINGROUP_PWR_I2C_SCL, | ||
| 196 | TEGRA_PINGROUP_PWR_I2C_SDA, | ||
| 197 | TEGRA_PINGROUP_KB_ROW0, | ||
| 198 | TEGRA_PINGROUP_KB_ROW1, | ||
| 199 | TEGRA_PINGROUP_KB_ROW2, | ||
| 200 | TEGRA_PINGROUP_KB_ROW3, | ||
| 201 | TEGRA_PINGROUP_KB_ROW4, | ||
| 202 | TEGRA_PINGROUP_KB_ROW5, | ||
| 203 | TEGRA_PINGROUP_KB_ROW6, | ||
| 204 | TEGRA_PINGROUP_KB_ROW7, | ||
| 205 | TEGRA_PINGROUP_KB_ROW8, | ||
| 206 | TEGRA_PINGROUP_KB_ROW9, | ||
| 207 | TEGRA_PINGROUP_KB_ROW10, | ||
| 208 | TEGRA_PINGROUP_KB_ROW11, | ||
| 209 | TEGRA_PINGROUP_KB_ROW12, | ||
| 210 | TEGRA_PINGROUP_KB_ROW13, | ||
| 211 | TEGRA_PINGROUP_KB_ROW14, | ||
| 212 | TEGRA_PINGROUP_KB_ROW15, | ||
| 213 | TEGRA_PINGROUP_KB_COL0, | ||
| 214 | TEGRA_PINGROUP_KB_COL1, | ||
| 215 | TEGRA_PINGROUP_KB_COL2, | ||
| 216 | TEGRA_PINGROUP_KB_COL3, | ||
| 217 | TEGRA_PINGROUP_KB_COL4, | ||
| 218 | TEGRA_PINGROUP_KB_COL5, | ||
| 219 | TEGRA_PINGROUP_KB_COL6, | ||
| 220 | TEGRA_PINGROUP_KB_COL7, | ||
| 221 | TEGRA_PINGROUP_CLK_32K_OUT, | ||
| 222 | TEGRA_PINGROUP_SYS_CLK_REQ, | ||
| 223 | TEGRA_PINGROUP_CORE_PWR_REQ, | ||
| 224 | TEGRA_PINGROUP_CPU_PWR_REQ, | ||
| 225 | TEGRA_PINGROUP_PWR_INT_N, | ||
| 226 | TEGRA_PINGROUP_CLK_32K_IN, | ||
| 227 | TEGRA_PINGROUP_OWR, | ||
| 228 | TEGRA_PINGROUP_DAP1_FS, | ||
| 229 | TEGRA_PINGROUP_DAP1_DIN, | ||
| 230 | TEGRA_PINGROUP_DAP1_DOUT, | ||
| 231 | TEGRA_PINGROUP_DAP1_SCLK, | ||
| 232 | TEGRA_PINGROUP_CLK1_REQ, | ||
| 233 | TEGRA_PINGROUP_CLK1_OUT, | ||
| 234 | TEGRA_PINGROUP_SPDIF_IN, | ||
| 235 | TEGRA_PINGROUP_SPDIF_OUT, | ||
| 236 | TEGRA_PINGROUP_DAP2_FS, | ||
| 237 | TEGRA_PINGROUP_DAP2_DIN, | ||
| 238 | TEGRA_PINGROUP_DAP2_DOUT, | ||
| 239 | TEGRA_PINGROUP_DAP2_SCLK, | ||
| 240 | TEGRA_PINGROUP_SPI2_MOSI, | ||
| 241 | TEGRA_PINGROUP_SPI2_MISO, | ||
| 242 | TEGRA_PINGROUP_SPI2_CS0_N, | ||
| 243 | TEGRA_PINGROUP_SPI2_SCK, | ||
| 244 | TEGRA_PINGROUP_SPI1_MOSI, | ||
| 245 | TEGRA_PINGROUP_SPI1_SCK, | ||
| 246 | TEGRA_PINGROUP_SPI1_CS0_N, | ||
| 247 | TEGRA_PINGROUP_SPI1_MISO, | ||
| 248 | TEGRA_PINGROUP_SPI2_CS1_N, | ||
| 249 | TEGRA_PINGROUP_SPI2_CS2_N, | ||
| 250 | TEGRA_PINGROUP_SDMMC3_CLK, | ||
| 251 | TEGRA_PINGROUP_SDMMC3_CMD, | ||
| 252 | TEGRA_PINGROUP_SDMMC3_DAT0, | ||
| 253 | TEGRA_PINGROUP_SDMMC3_DAT1, | ||
| 254 | TEGRA_PINGROUP_SDMMC3_DAT2, | ||
| 255 | TEGRA_PINGROUP_SDMMC3_DAT3, | ||
| 256 | TEGRA_PINGROUP_SDMMC3_DAT4, | ||
| 257 | TEGRA_PINGROUP_SDMMC3_DAT5, | ||
| 258 | TEGRA_PINGROUP_SDMMC3_DAT6, | ||
| 259 | TEGRA_PINGROUP_SDMMC3_DAT7, | ||
| 260 | TEGRA_PINGROUP_PEX_L0_PRSNT_N, | ||
| 261 | TEGRA_PINGROUP_PEX_L0_RST_N, | ||
| 262 | TEGRA_PINGROUP_PEX_L0_CLKREQ_N, | ||
| 263 | TEGRA_PINGROUP_PEX_WAKE_N, | ||
| 264 | TEGRA_PINGROUP_PEX_L1_PRSNT_N, | ||
| 265 | TEGRA_PINGROUP_PEX_L1_RST_N, | ||
| 266 | TEGRA_PINGROUP_PEX_L1_CLKREQ_N, | ||
| 267 | TEGRA_PINGROUP_PEX_L2_PRSNT_N, | ||
| 268 | TEGRA_PINGROUP_PEX_L2_RST_N, | ||
| 269 | TEGRA_PINGROUP_PEX_L2_CLKREQ_N, | ||
| 270 | TEGRA_PINGROUP_HDMI_CEC, | ||
| 271 | TEGRA_MAX_PINGROUP, | ||
| 272 | }; | ||
| 273 | |||
| 274 | enum tegra_drive_pingroup { | ||
| 275 | TEGRA_DRIVE_PINGROUP_AO1 = 0, | ||
| 276 | TEGRA_DRIVE_PINGROUP_AO2, | ||
| 277 | TEGRA_DRIVE_PINGROUP_AT1, | ||
| 278 | TEGRA_DRIVE_PINGROUP_AT2, | ||
| 279 | TEGRA_DRIVE_PINGROUP_AT3, | ||
| 280 | TEGRA_DRIVE_PINGROUP_AT4, | ||
| 281 | TEGRA_DRIVE_PINGROUP_AT5, | ||
| 282 | TEGRA_DRIVE_PINGROUP_CDEV1, | ||
| 283 | TEGRA_DRIVE_PINGROUP_CDEV2, | ||
| 284 | TEGRA_DRIVE_PINGROUP_CSUS, | ||
| 285 | TEGRA_DRIVE_PINGROUP_DAP1, | ||
| 286 | TEGRA_DRIVE_PINGROUP_DAP2, | ||
| 287 | TEGRA_DRIVE_PINGROUP_DAP3, | ||
| 288 | TEGRA_DRIVE_PINGROUP_DAP4, | ||
| 289 | TEGRA_DRIVE_PINGROUP_DBG, | ||
| 290 | TEGRA_DRIVE_PINGROUP_LCD1, | ||
| 291 | TEGRA_DRIVE_PINGROUP_LCD2, | ||
| 292 | TEGRA_DRIVE_PINGROUP_SDIO2, | ||
| 293 | TEGRA_DRIVE_PINGROUP_SDIO3, | ||
| 294 | TEGRA_DRIVE_PINGROUP_SPI, | ||
| 295 | TEGRA_DRIVE_PINGROUP_UAA, | ||
| 296 | TEGRA_DRIVE_PINGROUP_UAB, | ||
| 297 | TEGRA_DRIVE_PINGROUP_UART2, | ||
| 298 | TEGRA_DRIVE_PINGROUP_UART3, | ||
| 299 | TEGRA_DRIVE_PINGROUP_VI1, | ||
| 300 | TEGRA_DRIVE_PINGROUP_SDIO1, | ||
| 301 | TEGRA_DRIVE_PINGROUP_CRT, | ||
| 302 | TEGRA_DRIVE_PINGROUP_DDC, | ||
| 303 | TEGRA_DRIVE_PINGROUP_GMA, | ||
| 304 | TEGRA_DRIVE_PINGROUP_GMB, | ||
| 305 | TEGRA_DRIVE_PINGROUP_GMC, | ||
| 306 | TEGRA_DRIVE_PINGROUP_GMD, | ||
| 307 | TEGRA_DRIVE_PINGROUP_GME, | ||
| 308 | TEGRA_DRIVE_PINGROUP_GMF, | ||
| 309 | TEGRA_DRIVE_PINGROUP_GMG, | ||
| 310 | TEGRA_DRIVE_PINGROUP_GMH, | ||
| 311 | TEGRA_DRIVE_PINGROUP_OWR, | ||
| 312 | TEGRA_DRIVE_PINGROUP_UAD, | ||
| 313 | TEGRA_DRIVE_PINGROUP_GPV, | ||
| 314 | TEGRA_DRIVE_PINGROUP_DEV3, | ||
| 315 | TEGRA_DRIVE_PINGROUP_CEC, | ||
| 316 | TEGRA_MAX_DRIVE_PINGROUP, | ||
| 317 | }; | ||
| 318 | |||
| 319 | #endif | ||
| 320 | |||
diff --git a/arch/arm/mach-tegra/include/mach/pinmux.h b/arch/arm/mach-tegra/include/mach/pinmux.h deleted file mode 100644 index 055f1792c8ff..000000000000 --- a/arch/arm/mach-tegra/include/mach/pinmux.h +++ /dev/null | |||
| @@ -1,302 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/mach-tegra/include/mach/pinmux.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Google, Inc. | ||
| 5 | * Copyright (C) 2010,2011 Nvidia, Inc. | ||
| 6 | * | ||
| 7 | * This software is licensed under the terms of the GNU General Public | ||
| 8 | * License version 2, as published by the Free Software Foundation, and | ||
| 9 | * may be copied, distributed, and modified under those terms. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | |||
| 18 | #ifndef __MACH_TEGRA_PINMUX_H | ||
| 19 | #define __MACH_TEGRA_PINMUX_H | ||
| 20 | |||
| 21 | enum tegra_mux_func { | ||
| 22 | TEGRA_MUX_RSVD = 0x8000, | ||
| 23 | TEGRA_MUX_RSVD1 = 0x8000, | ||
| 24 | TEGRA_MUX_RSVD2 = 0x8001, | ||
| 25 | TEGRA_MUX_RSVD3 = 0x8002, | ||
| 26 | TEGRA_MUX_RSVD4 = 0x8003, | ||
| 27 | TEGRA_MUX_INVALID = 0x4000, | ||
| 28 | TEGRA_MUX_NONE = -1, | ||
| 29 | TEGRA_MUX_AHB_CLK, | ||
| 30 | TEGRA_MUX_APB_CLK, | ||
| 31 | TEGRA_MUX_AUDIO_SYNC, | ||
| 32 | TEGRA_MUX_CRT, | ||
| 33 | TEGRA_MUX_DAP1, | ||
| 34 | TEGRA_MUX_DAP2, | ||
| 35 | TEGRA_MUX_DAP3, | ||
| 36 | TEGRA_MUX_DAP4, | ||
| 37 | TEGRA_MUX_DAP5, | ||
| 38 | TEGRA_MUX_DISPLAYA, | ||
| 39 | TEGRA_MUX_DISPLAYB, | ||
| 40 | TEGRA_MUX_EMC_TEST0_DLL, | ||
| 41 | TEGRA_MUX_EMC_TEST1_DLL, | ||
| 42 | TEGRA_MUX_GMI, | ||
| 43 | TEGRA_MUX_GMI_INT, | ||
| 44 | TEGRA_MUX_HDMI, | ||
| 45 | TEGRA_MUX_I2C, | ||
| 46 | TEGRA_MUX_I2C2, | ||
| 47 | TEGRA_MUX_I2C3, | ||
| 48 | TEGRA_MUX_IDE, | ||
| 49 | TEGRA_MUX_IRDA, | ||
| 50 | TEGRA_MUX_KBC, | ||
| 51 | TEGRA_MUX_MIO, | ||
| 52 | TEGRA_MUX_MIPI_HS, | ||
| 53 | TEGRA_MUX_NAND, | ||
| 54 | TEGRA_MUX_OSC, | ||
| 55 | TEGRA_MUX_OWR, | ||
| 56 | TEGRA_MUX_PCIE, | ||
| 57 | TEGRA_MUX_PLLA_OUT, | ||
| 58 | TEGRA_MUX_PLLC_OUT1, | ||
| 59 | TEGRA_MUX_PLLM_OUT1, | ||
| 60 | TEGRA_MUX_PLLP_OUT2, | ||
| 61 | TEGRA_MUX_PLLP_OUT3, | ||
| 62 | TEGRA_MUX_PLLP_OUT4, | ||
| 63 | TEGRA_MUX_PWM, | ||
| 64 | TEGRA_MUX_PWR_INTR, | ||
| 65 | TEGRA_MUX_PWR_ON, | ||
| 66 | TEGRA_MUX_RTCK, | ||
| 67 | TEGRA_MUX_SDIO1, | ||
| 68 | TEGRA_MUX_SDIO2, | ||
| 69 | TEGRA_MUX_SDIO3, | ||
| 70 | TEGRA_MUX_SDIO4, | ||
| 71 | TEGRA_MUX_SFLASH, | ||
| 72 | TEGRA_MUX_SPDIF, | ||
| 73 | TEGRA_MUX_SPI1, | ||
| 74 | TEGRA_MUX_SPI2, | ||
| 75 | TEGRA_MUX_SPI2_ALT, | ||
| 76 | TEGRA_MUX_SPI3, | ||
| 77 | TEGRA_MUX_SPI4, | ||
| 78 | TEGRA_MUX_TRACE, | ||
| 79 | TEGRA_MUX_TWC, | ||
| 80 | TEGRA_MUX_UARTA, | ||
| 81 | TEGRA_MUX_UARTB, | ||
| 82 | TEGRA_MUX_UARTC, | ||
| 83 | TEGRA_MUX_UARTD, | ||
| 84 | TEGRA_MUX_UARTE, | ||
| 85 | TEGRA_MUX_ULPI, | ||
| 86 | TEGRA_MUX_VI, | ||
| 87 | TEGRA_MUX_VI_SENSOR_CLK, | ||
| 88 | TEGRA_MUX_XIO, | ||
| 89 | TEGRA_MUX_BLINK, | ||
| 90 | TEGRA_MUX_CEC, | ||
| 91 | TEGRA_MUX_CLK12, | ||
| 92 | TEGRA_MUX_DAP, | ||
| 93 | TEGRA_MUX_DAPSDMMC2, | ||
| 94 | TEGRA_MUX_DDR, | ||
| 95 | TEGRA_MUX_DEV3, | ||
| 96 | TEGRA_MUX_DTV, | ||
| 97 | TEGRA_MUX_VI_ALT1, | ||
| 98 | TEGRA_MUX_VI_ALT2, | ||
| 99 | TEGRA_MUX_VI_ALT3, | ||
| 100 | TEGRA_MUX_EMC_DLL, | ||
| 101 | TEGRA_MUX_EXTPERIPH1, | ||
| 102 | TEGRA_MUX_EXTPERIPH2, | ||
| 103 | TEGRA_MUX_EXTPERIPH3, | ||
| 104 | TEGRA_MUX_GMI_ALT, | ||
| 105 | TEGRA_MUX_HDA, | ||
| 106 | TEGRA_MUX_HSI, | ||
| 107 | TEGRA_MUX_I2C4, | ||
| 108 | TEGRA_MUX_I2C5, | ||
| 109 | TEGRA_MUX_I2CPWR, | ||
| 110 | TEGRA_MUX_I2S0, | ||
| 111 | TEGRA_MUX_I2S1, | ||
| 112 | TEGRA_MUX_I2S2, | ||
| 113 | TEGRA_MUX_I2S3, | ||
| 114 | TEGRA_MUX_I2S4, | ||
| 115 | TEGRA_MUX_NAND_ALT, | ||
| 116 | TEGRA_MUX_POPSDIO4, | ||
| 117 | TEGRA_MUX_POPSDMMC4, | ||
| 118 | TEGRA_MUX_PWM0, | ||
| 119 | TEGRA_MUX_PWM1, | ||
| 120 | TEGRA_MUX_PWM2, | ||
| 121 | TEGRA_MUX_PWM3, | ||
| 122 | TEGRA_MUX_SATA, | ||
| 123 | TEGRA_MUX_SPI5, | ||
| 124 | TEGRA_MUX_SPI6, | ||
| 125 | TEGRA_MUX_SYSCLK, | ||
| 126 | TEGRA_MUX_VGP1, | ||
| 127 | TEGRA_MUX_VGP2, | ||
| 128 | TEGRA_MUX_VGP3, | ||
| 129 | TEGRA_MUX_VGP4, | ||
| 130 | TEGRA_MUX_VGP5, | ||
| 131 | TEGRA_MUX_VGP6, | ||
| 132 | TEGRA_MUX_SAFE, | ||
| 133 | TEGRA_MAX_MUX, | ||
| 134 | }; | ||
| 135 | |||
| 136 | enum tegra_pullupdown { | ||
| 137 | TEGRA_PUPD_NORMAL = 0, | ||
| 138 | TEGRA_PUPD_PULL_DOWN, | ||
| 139 | TEGRA_PUPD_PULL_UP, | ||
| 140 | }; | ||
| 141 | |||
| 142 | enum tegra_tristate { | ||
| 143 | TEGRA_TRI_NORMAL = 0, | ||
| 144 | TEGRA_TRI_TRISTATE = 1, | ||
| 145 | }; | ||
| 146 | |||
| 147 | enum tegra_pin_io { | ||
| 148 | TEGRA_PIN_OUTPUT = 0, | ||
| 149 | TEGRA_PIN_INPUT = 1, | ||
| 150 | }; | ||
| 151 | |||
| 152 | enum tegra_vddio { | ||
| 153 | TEGRA_VDDIO_BB = 0, | ||
| 154 | TEGRA_VDDIO_LCD, | ||
| 155 | TEGRA_VDDIO_VI, | ||
| 156 | TEGRA_VDDIO_UART, | ||
| 157 | TEGRA_VDDIO_DDR, | ||
| 158 | TEGRA_VDDIO_NAND, | ||
| 159 | TEGRA_VDDIO_SYS, | ||
| 160 | TEGRA_VDDIO_AUDIO, | ||
| 161 | TEGRA_VDDIO_SD, | ||
| 162 | TEGRA_VDDIO_CAM, | ||
| 163 | TEGRA_VDDIO_GMI, | ||
| 164 | TEGRA_VDDIO_PEXCTL, | ||
| 165 | TEGRA_VDDIO_SDMMC1, | ||
| 166 | TEGRA_VDDIO_SDMMC3, | ||
| 167 | TEGRA_VDDIO_SDMMC4, | ||
| 168 | }; | ||
| 169 | |||
| 170 | struct tegra_pingroup_config { | ||
| 171 | int pingroup; | ||
| 172 | enum tegra_mux_func func; | ||
| 173 | enum tegra_pullupdown pupd; | ||
| 174 | enum tegra_tristate tristate; | ||
| 175 | }; | ||
| 176 | |||
| 177 | enum tegra_slew { | ||
| 178 | TEGRA_SLEW_FASTEST = 0, | ||
| 179 | TEGRA_SLEW_FAST, | ||
| 180 | TEGRA_SLEW_SLOW, | ||
| 181 | TEGRA_SLEW_SLOWEST, | ||
| 182 | TEGRA_MAX_SLEW, | ||
| 183 | }; | ||
| 184 | |||
| 185 | enum tegra_pull_strength { | ||
| 186 | TEGRA_PULL_0 = 0, | ||
| 187 | TEGRA_PULL_1, | ||
| 188 | TEGRA_PULL_2, | ||
| 189 | TEGRA_PULL_3, | ||
| 190 | TEGRA_PULL_4, | ||
| 191 | TEGRA_PULL_5, | ||
| 192 | TEGRA_PULL_6, | ||
| 193 | TEGRA_PULL_7, | ||
| 194 | TEGRA_PULL_8, | ||
| 195 | TEGRA_PULL_9, | ||
| 196 | TEGRA_PULL_10, | ||
| 197 | TEGRA_PULL_11, | ||
| 198 | TEGRA_PULL_12, | ||
| 199 | TEGRA_PULL_13, | ||
| 200 | TEGRA_PULL_14, | ||
| 201 | TEGRA_PULL_15, | ||
| 202 | TEGRA_PULL_16, | ||
| 203 | TEGRA_PULL_17, | ||
| 204 | TEGRA_PULL_18, | ||
| 205 | TEGRA_PULL_19, | ||
| 206 | TEGRA_PULL_20, | ||
| 207 | TEGRA_PULL_21, | ||
| 208 | TEGRA_PULL_22, | ||
| 209 | TEGRA_PULL_23, | ||
| 210 | TEGRA_PULL_24, | ||
| 211 | TEGRA_PULL_25, | ||
| 212 | TEGRA_PULL_26, | ||
| 213 | TEGRA_PULL_27, | ||
| 214 | TEGRA_PULL_28, | ||
| 215 | TEGRA_PULL_29, | ||
| 216 | TEGRA_PULL_30, | ||
| 217 | TEGRA_PULL_31, | ||
| 218 | TEGRA_MAX_PULL, | ||
| 219 | }; | ||
| 220 | |||
| 221 | enum tegra_drive { | ||
| 222 | TEGRA_DRIVE_DIV_8 = 0, | ||
| 223 | TEGRA_DRIVE_DIV_4, | ||
| 224 | TEGRA_DRIVE_DIV_2, | ||
| 225 | TEGRA_DRIVE_DIV_1, | ||
| 226 | TEGRA_MAX_DRIVE, | ||
| 227 | }; | ||
| 228 | |||
| 229 | enum tegra_hsm { | ||
| 230 | TEGRA_HSM_DISABLE = 0, | ||
| 231 | TEGRA_HSM_ENABLE, | ||
| 232 | }; | ||
| 233 | |||
| 234 | enum tegra_schmitt { | ||
| 235 | TEGRA_SCHMITT_DISABLE = 0, | ||
| 236 | TEGRA_SCHMITT_ENABLE, | ||
| 237 | }; | ||
| 238 | |||
| 239 | struct tegra_drive_pingroup_config { | ||
| 240 | int pingroup; | ||
| 241 | enum tegra_hsm hsm; | ||
| 242 | enum tegra_schmitt schmitt; | ||
| 243 | enum tegra_drive drive; | ||
| 244 | enum tegra_pull_strength pull_down; | ||
| 245 | enum tegra_pull_strength pull_up; | ||
| 246 | enum tegra_slew slew_rising; | ||
| 247 | enum tegra_slew slew_falling; | ||
| 248 | }; | ||
| 249 | |||
| 250 | struct tegra_drive_pingroup_desc { | ||
| 251 | const char *name; | ||
| 252 | s16 reg_bank; | ||
| 253 | s16 reg; | ||
| 254 | }; | ||
| 255 | |||
| 256 | struct tegra_pingroup_desc { | ||
| 257 | const char *name; | ||
| 258 | int funcs[4]; | ||
| 259 | int func_safe; | ||
| 260 | int vddio; | ||
| 261 | enum tegra_pin_io io_default; | ||
| 262 | s16 tri_bank; /* Register bank the tri_reg exists within */ | ||
| 263 | s16 mux_bank; /* Register bank the mux_reg exists within */ | ||
| 264 | s16 pupd_bank; /* Register bank the pupd_reg exists within */ | ||
| 265 | s16 tri_reg; /* offset into the TRISTATE_REG_* register bank */ | ||
| 266 | s16 mux_reg; /* offset into the PIN_MUX_CTL_* register bank */ | ||
| 267 | s16 pupd_reg; /* offset into the PULL_UPDOWN_REG_* register bank */ | ||
| 268 | s8 tri_bit; /* offset into the TRISTATE_REG_* register bit */ | ||
| 269 | s8 mux_bit; /* offset into the PIN_MUX_CTL_* register bit */ | ||
| 270 | s8 pupd_bit; /* offset into the PULL_UPDOWN_REG_* register bit */ | ||
| 271 | s8 lock_bit; /* offset of the LOCK bit into mux register bit */ | ||
| 272 | s8 od_bit; /* offset of the OD bit into mux register bit */ | ||
| 273 | s8 ioreset_bit; /* offset of the IO_RESET bit into mux register bit */ | ||
| 274 | }; | ||
| 275 | |||
| 276 | typedef void (*pinmux_init) (const struct tegra_pingroup_desc **pg, | ||
| 277 | int *pg_max, const struct tegra_drive_pingroup_desc **pgdrive, | ||
| 278 | int *pgdrive_max); | ||
| 279 | |||
| 280 | void tegra20_pinmux_init(const struct tegra_pingroup_desc **pg, int *pg_max, | ||
| 281 | const struct tegra_drive_pingroup_desc **pgdrive, int *pgdrive_max); | ||
| 282 | |||
| 283 | void tegra30_pinmux_init(const struct tegra_pingroup_desc **pg, int *pg_max, | ||
| 284 | const struct tegra_drive_pingroup_desc **pgdrive, int *pgdrive_max); | ||
| 285 | |||
| 286 | int tegra_pinmux_set_tristate(int pg, enum tegra_tristate tristate); | ||
| 287 | int tegra_pinmux_set_pullupdown(int pg, enum tegra_pullupdown pupd); | ||
| 288 | |||
| 289 | void tegra_pinmux_config_table(const struct tegra_pingroup_config *config, | ||
| 290 | int len); | ||
| 291 | |||
| 292 | void tegra_drive_pinmux_config_table(struct tegra_drive_pingroup_config *config, | ||
| 293 | int len); | ||
| 294 | void tegra_pinmux_set_safe_pinmux_table(const struct tegra_pingroup_config *config, | ||
| 295 | int len); | ||
| 296 | void tegra_pinmux_config_pinmux_table(const struct tegra_pingroup_config *config, | ||
| 297 | int len); | ||
| 298 | void tegra_pinmux_config_tristate_table(const struct tegra_pingroup_config *config, | ||
| 299 | int len, enum tegra_tristate tristate); | ||
| 300 | void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *config, | ||
| 301 | int len, enum tegra_pullupdown pupd); | ||
| 302 | #endif | ||
diff --git a/arch/arm/mach-tegra/include/mach/usb_phy.h b/arch/arm/mach-tegra/include/mach/usb_phy.h index de1a0f602b28..935ce9f65590 100644 --- a/arch/arm/mach-tegra/include/mach/usb_phy.h +++ b/arch/arm/mach-tegra/include/mach/usb_phy.h | |||
| @@ -61,8 +61,8 @@ struct tegra_usb_phy { | |||
| 61 | struct usb_phy *ulpi; | 61 | struct usb_phy *ulpi; |
| 62 | }; | 62 | }; |
| 63 | 63 | ||
| 64 | struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, | 64 | struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance, |
| 65 | void *config, enum tegra_usb_phy_mode phy_mode); | 65 | void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode); |
| 66 | 66 | ||
| 67 | int tegra_usb_phy_power_on(struct tegra_usb_phy *phy); | 67 | int tegra_usb_phy_power_on(struct tegra_usb_phy *phy); |
| 68 | 68 | ||
diff --git a/arch/arm/mach-tegra/pinmux-tegra20-tables.c b/arch/arm/mach-tegra/pinmux-tegra20-tables.c deleted file mode 100644 index 734add1280b7..000000000000 --- a/arch/arm/mach-tegra/pinmux-tegra20-tables.c +++ /dev/null | |||
| @@ -1,244 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/mach-tegra/pinmux-tegra20-tables.c | ||
| 3 | * | ||
| 4 | * Common pinmux configurations for Tegra20 SoCs | ||
| 5 | * | ||
| 6 | * Copyright (C) 2010 NVIDIA Corporation | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
| 14 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 15 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 16 | * more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License along | ||
| 19 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 20 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
| 21 | */ | ||
| 22 | |||
| 23 | #include <linux/kernel.h> | ||
| 24 | #include <linux/errno.h> | ||
| 25 | #include <linux/spinlock.h> | ||
| 26 | #include <linux/io.h> | ||
| 27 | #include <linux/init.h> | ||
| 28 | #include <linux/string.h> | ||
| 29 | |||
| 30 | #include <mach/iomap.h> | ||
| 31 | #include <mach/pinmux.h> | ||
| 32 | #include <mach/pinmux-tegra20.h> | ||
| 33 | #include <mach/suspend.h> | ||
| 34 | |||
| 35 | #define TRISTATE_REG_A 0x14 | ||
| 36 | #define PIN_MUX_CTL_REG_A 0x80 | ||
| 37 | #define PULLUPDOWN_REG_A 0xa0 | ||
| 38 | #define PINGROUP_REG_A 0x868 | ||
| 39 | |||
| 40 | #define DRIVE_PINGROUP(pg_name, r) \ | ||
| 41 | [TEGRA_DRIVE_PINGROUP_ ## pg_name] = { \ | ||
| 42 | .name = #pg_name, \ | ||
| 43 | .reg_bank = 3, \ | ||
| 44 | .reg = ((r) - PINGROUP_REG_A) \ | ||
| 45 | } | ||
| 46 | |||
| 47 | static const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE_PINGROUP] = { | ||
| 48 | DRIVE_PINGROUP(AO1, 0x868), | ||
| 49 | DRIVE_PINGROUP(AO2, 0x86c), | ||
| 50 | DRIVE_PINGROUP(AT1, 0x870), | ||
| 51 | DRIVE_PINGROUP(AT2, 0x874), | ||
| 52 | DRIVE_PINGROUP(CDEV1, 0x878), | ||
| 53 | DRIVE_PINGROUP(CDEV2, 0x87c), | ||
| 54 | DRIVE_PINGROUP(CSUS, 0x880), | ||
| 55 | DRIVE_PINGROUP(DAP1, 0x884), | ||
| 56 | DRIVE_PINGROUP(DAP2, 0x888), | ||
| 57 | DRIVE_PINGROUP(DAP3, 0x88c), | ||
| 58 | DRIVE_PINGROUP(DAP4, 0x890), | ||
| 59 | DRIVE_PINGROUP(DBG, 0x894), | ||
| 60 | DRIVE_PINGROUP(LCD1, 0x898), | ||
| 61 | DRIVE_PINGROUP(LCD2, 0x89c), | ||
| 62 | DRIVE_PINGROUP(SDMMC2, 0x8a0), | ||
| 63 | DRIVE_PINGROUP(SDMMC3, 0x8a4), | ||
| 64 | DRIVE_PINGROUP(SPI, 0x8a8), | ||
| 65 | DRIVE_PINGROUP(UAA, 0x8ac), | ||
| 66 | DRIVE_PINGROUP(UAB, 0x8b0), | ||
| 67 | DRIVE_PINGROUP(UART2, 0x8b4), | ||
| 68 | DRIVE_PINGROUP(UART3, 0x8b8), | ||
| 69 | DRIVE_PINGROUP(VI1, 0x8bc), | ||
| 70 | DRIVE_PINGROUP(VI2, 0x8c0), | ||
| 71 | DRIVE_PINGROUP(XM2A, 0x8c4), | ||
| 72 | DRIVE_PINGROUP(XM2C, 0x8c8), | ||
| 73 | DRIVE_PINGROUP(XM2D, 0x8cc), | ||
| 74 | DRIVE_PINGROUP(XM2CLK, 0x8d0), | ||
| 75 | DRIVE_PINGROUP(MEMCOMP, 0x8d4), | ||
| 76 | DRIVE_PINGROUP(SDIO1, 0x8e0), | ||
| 77 | DRIVE_PINGROUP(CRT, 0x8ec), | ||
| 78 | DRIVE_PINGROUP(DDC, 0x8f0), | ||
| 79 | DRIVE_PINGROUP(GMA, 0x8f4), | ||
| 80 | DRIVE_PINGROUP(GMB, 0x8f8), | ||
| 81 | DRIVE_PINGROUP(GMC, 0x8fc), | ||
| 82 | DRIVE_PINGROUP(GMD, 0x900), | ||
| 83 | DRIVE_PINGROUP(GME, 0x904), | ||
| 84 | DRIVE_PINGROUP(OWR, 0x908), | ||
| 85 | DRIVE_PINGROUP(UAD, 0x90c), | ||
| 86 | }; | ||
| 87 | |||
| 88 | #define PINGROUP(pg_name, vdd, f0, f1, f2, f3, f_safe, \ | ||
| 89 | tri_r, tri_b, mux_r, mux_b, pupd_r, pupd_b) \ | ||
| 90 | [TEGRA_PINGROUP_ ## pg_name] = { \ | ||
| 91 | .name = #pg_name, \ | ||
| 92 | .vddio = TEGRA_VDDIO_ ## vdd, \ | ||
| 93 | .funcs = { \ | ||
| 94 | TEGRA_MUX_ ## f0, \ | ||
| 95 | TEGRA_MUX_ ## f1, \ | ||
| 96 | TEGRA_MUX_ ## f2, \ | ||
| 97 | TEGRA_MUX_ ## f3, \ | ||
| 98 | }, \ | ||
| 99 | .func_safe = TEGRA_MUX_ ## f_safe, \ | ||
| 100 | .tri_bank = 0, \ | ||
| 101 | .tri_reg = ((tri_r) - TRISTATE_REG_A), \ | ||
| 102 | .tri_bit = tri_b, \ | ||
| 103 | .mux_bank = 1, \ | ||
| 104 | .mux_reg = ((mux_r) - PIN_MUX_CTL_REG_A), \ | ||
| 105 | .mux_bit = mux_b, \ | ||
| 106 | .pupd_bank = 2, \ | ||
| 107 | .pupd_reg = ((pupd_r) - PULLUPDOWN_REG_A), \ | ||
| 108 | .pupd_bit = pupd_b, \ | ||
| 109 | .lock_bit = -1, \ | ||
| 110 | .od_bit = -1, \ | ||
| 111 | .ioreset_bit = -1, \ | ||
| 112 | .io_default = -1, \ | ||
| 113 | } | ||
| 114 | |||
| 115 | static const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = { | ||
| 116 | PINGROUP(ATA, NAND, IDE, NAND, GMI, RSVD, IDE, 0x14, 0, 0x80, 24, 0xA0, 0), | ||
| 117 | PINGROUP(ATB, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 1, 0x80, 16, 0xA0, 2), | ||
| 118 | PINGROUP(ATC, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 2, 0x80, 22, 0xA0, 4), | ||
| 119 | PINGROUP(ATD, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 3, 0x80, 20, 0xA0, 6), | ||
| 120 | PINGROUP(ATE, NAND, IDE, NAND, GMI, RSVD, IDE, 0x18, 25, 0x80, 12, 0xA0, 8), | ||
| 121 | PINGROUP(CDEV1, AUDIO, OSC, PLLA_OUT, PLLM_OUT1, AUDIO_SYNC, OSC, 0x14, 4, 0x88, 2, 0xA8, 0), | ||
| 122 | PINGROUP(CDEV2, AUDIO, OSC, AHB_CLK, APB_CLK, PLLP_OUT4, OSC, 0x14, 5, 0x88, 4, 0xA8, 2), | ||
| 123 | PINGROUP(CRTP, LCD, CRT, RSVD, RSVD, RSVD, RSVD, 0x20, 14, 0x98, 20, 0xA4, 24), | ||
| 124 | PINGROUP(CSUS, VI, PLLC_OUT1, PLLP_OUT2, PLLP_OUT3, VI_SENSOR_CLK, PLLC_OUT1, 0x14, 6, 0x88, 6, 0xAC, 24), | ||
| 125 | PINGROUP(DAP1, AUDIO, DAP1, RSVD, GMI, SDIO2, DAP1, 0x14, 7, 0x88, 20, 0xA0, 10), | ||
| 126 | PINGROUP(DAP2, AUDIO, DAP2, TWC, RSVD, GMI, DAP2, 0x14, 8, 0x88, 22, 0xA0, 12), | ||
| 127 | PINGROUP(DAP3, BB, DAP3, RSVD, RSVD, RSVD, DAP3, 0x14, 9, 0x88, 24, 0xA0, 14), | ||
| 128 | PINGROUP(DAP4, UART, DAP4, RSVD, GMI, RSVD, DAP4, 0x14, 10, 0x88, 26, 0xA0, 16), | ||
| 129 | PINGROUP(DDC, LCD, I2C2, RSVD, RSVD, RSVD, RSVD4, 0x18, 31, 0x88, 0, 0xB0, 28), | ||
| 130 | PINGROUP(DTA, VI, RSVD, SDIO2, VI, RSVD, RSVD4, 0x14, 11, 0x84, 20, 0xA0, 18), | ||
| 131 | PINGROUP(DTB, VI, RSVD, RSVD, VI, SPI1, RSVD1, 0x14, 12, 0x84, 22, 0xA0, 20), | ||
| 132 | PINGROUP(DTC, VI, RSVD, RSVD, VI, RSVD, RSVD1, 0x14, 13, 0x84, 26, 0xA0, 22), | ||
| 133 | PINGROUP(DTD, VI, RSVD, SDIO2, VI, RSVD, RSVD1, 0x14, 14, 0x84, 28, 0xA0, 24), | ||
| 134 | PINGROUP(DTE, VI, RSVD, RSVD, VI, SPI1, RSVD1, 0x14, 15, 0x84, 30, 0xA0, 26), | ||
| 135 | PINGROUP(DTF, VI, I2C3, RSVD, VI, RSVD, RSVD4, 0x20, 12, 0x98, 30, 0xA0, 28), | ||
| 136 | PINGROUP(GMA, NAND, UARTE, SPI3, GMI, SDIO4, SPI3, 0x14, 28, 0x84, 0, 0xB0, 20), | ||
| 137 | PINGROUP(GMB, NAND, IDE, NAND, GMI, GMI_INT, GMI, 0x18, 29, 0x88, 28, 0xB0, 22), | ||
| 138 | PINGROUP(GMC, NAND, UARTD, SPI4, GMI, SFLASH, SPI4, 0x14, 29, 0x84, 2, 0xB0, 24), | ||
| 139 | PINGROUP(GMD, NAND, RSVD, NAND, GMI, SFLASH, GMI, 0x18, 30, 0x88, 30, 0xB0, 26), | ||
| 140 | PINGROUP(GME, NAND, RSVD, DAP5, GMI, SDIO4, GMI, 0x18, 0, 0x8C, 0, 0xA8, 24), | ||
| 141 | PINGROUP(GPU, UART, PWM, UARTA, GMI, RSVD, RSVD4, 0x14, 16, 0x8C, 4, 0xA4, 20), | ||
| 142 | PINGROUP(GPU7, SYS, RTCK, RSVD, RSVD, RSVD, RTCK, 0x20, 11, 0x98, 28, 0xA4, 6), | ||
| 143 | PINGROUP(GPV, SD, PCIE, RSVD, RSVD, RSVD, PCIE, 0x14, 17, 0x8C, 2, 0xA0, 30), | ||
| 144 | PINGROUP(HDINT, LCD, HDMI, RSVD, RSVD, RSVD, HDMI, 0x1C, 23, 0x84, 4, 0xAC, 22), | ||
| 145 | PINGROUP(I2CP, SYS, I2C, RSVD, RSVD, RSVD, RSVD4, 0x14, 18, 0x88, 8, 0xA4, 2), | ||
| 146 | PINGROUP(IRRX, UART, UARTA, UARTB, GMI, SPI4, UARTB, 0x14, 20, 0x88, 18, 0xA8, 22), | ||
| 147 | PINGROUP(IRTX, UART, UARTA, UARTB, GMI, SPI4, UARTB, 0x14, 19, 0x88, 16, 0xA8, 20), | ||
| 148 | PINGROUP(KBCA, SYS, KBC, NAND, SDIO2, EMC_TEST0_DLL, KBC, 0x14, 22, 0x88, 10, 0xA4, 8), | ||
| 149 | PINGROUP(KBCB, SYS, KBC, NAND, SDIO2, MIO, KBC, 0x14, 21, 0x88, 12, 0xA4, 10), | ||
| 150 | PINGROUP(KBCC, SYS, KBC, NAND, TRACE, EMC_TEST1_DLL, KBC, 0x18, 26, 0x88, 14, 0xA4, 12), | ||
| 151 | PINGROUP(KBCD, SYS, KBC, NAND, SDIO2, MIO, KBC, 0x20, 10, 0x98, 26, 0xA4, 14), | ||
| 152 | PINGROUP(KBCE, SYS, KBC, NAND, OWR, RSVD, KBC, 0x14, 26, 0x80, 28, 0xB0, 2), | ||
| 153 | PINGROUP(KBCF, SYS, KBC, NAND, TRACE, MIO, KBC, 0x14, 27, 0x80, 26, 0xB0, 0), | ||
| 154 | PINGROUP(LCSN, LCD, DISPLAYA, DISPLAYB, SPI3, RSVD, RSVD4, 0x1C, 31, 0x90, 12, 0xAC, 20), | ||
| 155 | PINGROUP(LD0, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 0, 0x94, 0, 0xAC, 12), | ||
| 156 | PINGROUP(LD1, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 1, 0x94, 2, 0xAC, 12), | ||
| 157 | PINGROUP(LD10, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 10, 0x94, 20, 0xAC, 12), | ||
| 158 | PINGROUP(LD11, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 11, 0x94, 22, 0xAC, 12), | ||
| 159 | PINGROUP(LD12, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 12, 0x94, 24, 0xAC, 12), | ||
| 160 | PINGROUP(LD13, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 13, 0x94, 26, 0xAC, 12), | ||
| 161 | PINGROUP(LD14, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 14, 0x94, 28, 0xAC, 12), | ||
| 162 | PINGROUP(LD15, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 15, 0x94, 30, 0xAC, 12), | ||
| 163 | PINGROUP(LD16, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 16, 0x98, 0, 0xAC, 12), | ||
| 164 | PINGROUP(LD17, LCD, DISPLAYA, DISPLAYB, RSVD, RSVD, RSVD4, 0x1C, 17, 0x98, 2, 0xAC, 12), | ||
| 165 | PINGROUP(LD2, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 2, 0x94, 4, 0xAC, 12), | ||
| 166 | PINGROUP(LD3, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 3, 0x94, 6, 0xAC, 12), | ||
| 167 | PINGROUP(LD4, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 4, 0x94, 8, 0xAC, 12), | ||
| 168 | PINGROUP(LD5, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 5, 0x94, 10, 0xAC, 12), | ||
| 169 | PINGROUP(LD6, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 6, 0x94, 12, 0xAC, 12), | ||
| 170 | PINGROUP(LD7, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 7, 0x94, 14, 0xAC, 12), | ||
| 171 | PINGROUP(LD8, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 8, 0x94, 16, 0xAC, 12), | ||
| 172 | PINGROUP(LD9, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 9, 0x94, 18, 0xAC, 12), | ||
| 173 | PINGROUP(LDC, LCD, DISPLAYA, DISPLAYB, RSVD, RSVD, RSVD4, 0x1C, 30, 0x90, 14, 0xAC, 20), | ||
| 174 | PINGROUP(LDI, LCD, DISPLAYA, DISPLAYB, RSVD, RSVD, RSVD4, 0x20, 6, 0x98, 16, 0xAC, 18), | ||
| 175 | PINGROUP(LHP0, LCD, DISPLAYA, DISPLAYB, RSVD, RSVD, RSVD4, 0x1C, 18, 0x98, 10, 0xAC, 16), | ||
| 176 | PINGROUP(LHP1, LCD, DISPLAYA, DISPLAYB, RSVD, RSVD, RSVD4, 0x1C, 19, 0x98, 4, 0xAC, 14), | ||
| 177 | PINGROUP(LHP2, LCD, DISPLAYA, DISPLAYB, RSVD, RSVD, RSVD4, 0x1C, 20, 0x98, 6, 0xAC, 14), | ||
| 178 | PINGROUP(LHS, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x20, 7, 0x90, 22, 0xAC, 22), | ||
| 179 | PINGROUP(LM0, LCD, DISPLAYA, DISPLAYB, SPI3, RSVD, RSVD4, 0x1C, 24, 0x90, 26, 0xAC, 22), | ||
| 180 | PINGROUP(LM1, LCD, DISPLAYA, DISPLAYB, RSVD, CRT, RSVD3, 0x1C, 25, 0x90, 28, 0xAC, 22), | ||
| 181 | PINGROUP(LPP, LCD, DISPLAYA, DISPLAYB, RSVD, RSVD, RSVD4, 0x20, 8, 0x98, 14, 0xAC, 18), | ||
| 182 | PINGROUP(LPW0, LCD, DISPLAYA, DISPLAYB, SPI3, HDMI, DISPLAYA, 0x20, 3, 0x90, 0, 0xAC, 20), | ||
| 183 | PINGROUP(LPW1, LCD, DISPLAYA, DISPLAYB, RSVD, RSVD, RSVD4, 0x20, 4, 0x90, 2, 0xAC, 20), | ||
| 184 | PINGROUP(LPW2, LCD, DISPLAYA, DISPLAYB, SPI3, HDMI, DISPLAYA, 0x20, 5, 0x90, 4, 0xAC, 20), | ||
| 185 | PINGROUP(LSC0, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 27, 0x90, 18, 0xAC, 22), | ||
| 186 | PINGROUP(LSC1, LCD, DISPLAYA, DISPLAYB, SPI3, HDMI, DISPLAYA, 0x1C, 28, 0x90, 20, 0xAC, 20), | ||
| 187 | PINGROUP(LSCK, LCD, DISPLAYA, DISPLAYB, SPI3, HDMI, DISPLAYA, 0x1C, 29, 0x90, 16, 0xAC, 20), | ||
| 188 | PINGROUP(LSDA, LCD, DISPLAYA, DISPLAYB, SPI3, HDMI, DISPLAYA, 0x20, 1, 0x90, 8, 0xAC, 20), | ||
| 189 | PINGROUP(LSDI, LCD, DISPLAYA, DISPLAYB, SPI3, RSVD, DISPLAYA, 0x20, 2, 0x90, 6, 0xAC, 20), | ||
| 190 | PINGROUP(LSPI, LCD, DISPLAYA, DISPLAYB, XIO, HDMI, DISPLAYA, 0x20, 0, 0x90, 10, 0xAC, 22), | ||
| 191 | PINGROUP(LVP0, LCD, DISPLAYA, DISPLAYB, RSVD, RSVD, RSVD4, 0x1C, 21, 0x90, 30, 0xAC, 22), | ||
| 192 | PINGROUP(LVP1, LCD, DISPLAYA, DISPLAYB, RSVD, RSVD, RSVD4, 0x1C, 22, 0x98, 8, 0xAC, 16), | ||
| 193 | PINGROUP(LVS, LCD, DISPLAYA, DISPLAYB, XIO, RSVD, RSVD4, 0x1C, 26, 0x90, 24, 0xAC, 22), | ||
| 194 | PINGROUP(OWC, SYS, OWR, RSVD, RSVD, RSVD, OWR, 0x14, 31, 0x84, 8, 0xB0, 30), | ||
| 195 | PINGROUP(PMC, SYS, PWR_ON, PWR_INTR, RSVD, RSVD, PWR_ON, 0x14, 23, 0x98, 18, -1, -1), | ||
| 196 | PINGROUP(PTA, NAND, I2C2, HDMI, GMI, RSVD, RSVD4, 0x14, 24, 0x98, 22, 0xA4, 4), | ||
| 197 | PINGROUP(RM, UART, I2C, RSVD, RSVD, RSVD, RSVD4, 0x14, 25, 0x80, 14, 0xA4, 0), | ||
| 198 | PINGROUP(SDB, SD, UARTA, PWM, SDIO3, SPI2, PWM, 0x20, 15, 0x8C, 10, -1, -1), | ||
| 199 | PINGROUP(SDC, SD, PWM, TWC, SDIO3, SPI3, TWC, 0x18, 1, 0x8C, 12, 0xAC, 28), | ||
| 200 | PINGROUP(SDD, SD, UARTA, PWM, SDIO3, SPI3, PWM, 0x18, 2, 0x8C, 14, 0xAC, 30), | ||
| 201 | PINGROUP(SDIO1, BB, SDIO1, RSVD, UARTE, UARTA, RSVD2, 0x14, 30, 0x80, 30, 0xB0, 18), | ||
| 202 | PINGROUP(SLXA, SD, PCIE, SPI4, SDIO3, SPI2, PCIE, 0x18, 3, 0x84, 6, 0xA4, 22), | ||
| 203 | PINGROUP(SLXC, SD, SPDIF, SPI4, SDIO3, SPI2, SPI4, 0x18, 5, 0x84, 10, 0xA4, 26), | ||
| 204 | PINGROUP(SLXD, SD, SPDIF, SPI4, SDIO3, SPI2, SPI4, 0x18, 6, 0x84, 12, 0xA4, 28), | ||
| 205 | PINGROUP(SLXK, SD, PCIE, SPI4, SDIO3, SPI2, PCIE, 0x18, 7, 0x84, 14, 0xA4, 30), | ||
| 206 | PINGROUP(SPDI, AUDIO, SPDIF, RSVD, I2C, SDIO2, RSVD2, 0x18, 8, 0x8C, 8, 0xA4, 16), | ||
| 207 | PINGROUP(SPDO, AUDIO, SPDIF, RSVD, I2C, SDIO2, RSVD2, 0x18, 9, 0x8C, 6, 0xA4, 18), | ||
| 208 | PINGROUP(SPIA, AUDIO, SPI1, SPI2, SPI3, GMI, GMI, 0x18, 10, 0x8C, 30, 0xA8, 4), | ||
| 209 | PINGROUP(SPIB, AUDIO, SPI1, SPI2, SPI3, GMI, GMI, 0x18, 11, 0x8C, 28, 0xA8, 6), | ||
| 210 | PINGROUP(SPIC, AUDIO, SPI1, SPI2, SPI3, GMI, GMI, 0x18, 12, 0x8C, 26, 0xA8, 8), | ||
| 211 | PINGROUP(SPID, AUDIO, SPI2, SPI1, SPI2_ALT, GMI, GMI, 0x18, 13, 0x8C, 24, 0xA8, 10), | ||
| 212 | PINGROUP(SPIE, AUDIO, SPI2, SPI1, SPI2_ALT, GMI, GMI, 0x18, 14, 0x8C, 22, 0xA8, 12), | ||
| 213 | PINGROUP(SPIF, AUDIO, SPI3, SPI1, SPI2, RSVD, RSVD4, 0x18, 15, 0x8C, 20, 0xA8, 14), | ||
| 214 | PINGROUP(SPIG, AUDIO, SPI3, SPI2, SPI2_ALT, I2C, SPI2_ALT, 0x18, 16, 0x8C, 18, 0xA8, 16), | ||
| 215 | PINGROUP(SPIH, AUDIO, SPI3, SPI2, SPI2_ALT, I2C, SPI2_ALT, 0x18, 17, 0x8C, 16, 0xA8, 18), | ||
| 216 | PINGROUP(UAA, BB, SPI3, MIPI_HS, UARTA, ULPI, MIPI_HS, 0x18, 18, 0x80, 0, 0xAC, 0), | ||
| 217 | PINGROUP(UAB, BB, SPI2, MIPI_HS, UARTA, ULPI, MIPI_HS, 0x18, 19, 0x80, 2, 0xAC, 2), | ||
| 218 | PINGROUP(UAC, BB, OWR, RSVD, RSVD, RSVD, RSVD4, 0x18, 20, 0x80, 4, 0xAC, 4), | ||
| 219 | PINGROUP(UAD, UART, IRDA, SPDIF, UARTA, SPI4, SPDIF, 0x18, 21, 0x80, 6, 0xAC, 6), | ||
| 220 | PINGROUP(UCA, UART, UARTC, RSVD, GMI, RSVD, RSVD4, 0x18, 22, 0x84, 16, 0xAC, 8), | ||
| 221 | PINGROUP(UCB, UART, UARTC, PWM, GMI, RSVD, RSVD4, 0x18, 23, 0x84, 18, 0xAC, 10), | ||
| 222 | PINGROUP(UDA, BB, SPI1, RSVD, UARTD, ULPI, RSVD2, 0x20, 13, 0x80, 8, 0xB0, 16), | ||
| 223 | /* these pin groups only have pullup and pull down control */ | ||
| 224 | PINGROUP(CK32, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xB0, 14), | ||
| 225 | PINGROUP(DDRC, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xAC, 26), | ||
| 226 | PINGROUP(PMCA, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xB0, 4), | ||
| 227 | PINGROUP(PMCB, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xB0, 6), | ||
| 228 | PINGROUP(PMCC, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xB0, 8), | ||
| 229 | PINGROUP(PMCD, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xB0, 10), | ||
| 230 | PINGROUP(PMCE, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xB0, 12), | ||
| 231 | PINGROUP(XM2C, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xA8, 30), | ||
| 232 | PINGROUP(XM2D, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xA8, 28), | ||
| 233 | }; | ||
| 234 | |||
| 235 | void __devinit tegra20_pinmux_init(const struct tegra_pingroup_desc **pg, | ||
| 236 | int *pg_max, const struct tegra_drive_pingroup_desc **pgdrive, | ||
| 237 | int *pgdrive_max) | ||
| 238 | { | ||
| 239 | *pg = tegra_soc_pingroups; | ||
| 240 | *pg_max = TEGRA_MAX_PINGROUP; | ||
| 241 | *pgdrive = tegra_soc_drive_pingroups; | ||
| 242 | *pgdrive_max = TEGRA_MAX_DRIVE_PINGROUP; | ||
| 243 | } | ||
| 244 | |||
diff --git a/arch/arm/mach-tegra/pinmux-tegra30-tables.c b/arch/arm/mach-tegra/pinmux-tegra30-tables.c deleted file mode 100644 index 14fc0e4c1c44..000000000000 --- a/arch/arm/mach-tegra/pinmux-tegra30-tables.c +++ /dev/null | |||
| @@ -1,376 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/mach-tegra/pinmux-tegra30-tables.c | ||
| 3 | * | ||
| 4 | * Common pinmux configurations for Tegra30 SoCs | ||
| 5 | * | ||
| 6 | * Copyright (C) 2010,2011 NVIDIA Corporation | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
| 13 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 14 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 15 | * more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License along | ||
| 18 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 19 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
| 20 | */ | ||
| 21 | |||
| 22 | #include <linux/kernel.h> | ||
| 23 | #include <linux/errno.h> | ||
| 24 | #include <linux/spinlock.h> | ||
| 25 | #include <linux/io.h> | ||
| 26 | #include <linux/init.h> | ||
| 27 | #include <linux/string.h> | ||
| 28 | |||
| 29 | #include <mach/iomap.h> | ||
| 30 | #include <mach/pinmux.h> | ||
| 31 | #include <mach/pinmux-tegra30.h> | ||
| 32 | #include <mach/suspend.h> | ||
| 33 | |||
| 34 | #define PINGROUP_REG_A 0x868 | ||
| 35 | #define MUXCTL_REG_A 0x3000 | ||
| 36 | |||
| 37 | #define DRIVE_PINGROUP(pg_name, r) \ | ||
| 38 | [TEGRA_DRIVE_PINGROUP_ ## pg_name] = { \ | ||
| 39 | .name = #pg_name, \ | ||
| 40 | .reg_bank = 0, \ | ||
| 41 | .reg = ((r) - PINGROUP_REG_A) \ | ||
| 42 | } | ||
| 43 | |||
| 44 | static const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE_PINGROUP] = { | ||
| 45 | DRIVE_PINGROUP(AO1, 0x868), | ||
| 46 | DRIVE_PINGROUP(AO2, 0x86c), | ||
| 47 | DRIVE_PINGROUP(AT1, 0x870), | ||
| 48 | DRIVE_PINGROUP(AT2, 0x874), | ||
| 49 | DRIVE_PINGROUP(AT3, 0x878), | ||
| 50 | DRIVE_PINGROUP(AT4, 0x87c), | ||
| 51 | DRIVE_PINGROUP(AT5, 0x880), | ||
| 52 | DRIVE_PINGROUP(CDEV1, 0x884), | ||
| 53 | DRIVE_PINGROUP(CDEV2, 0x888), | ||
| 54 | DRIVE_PINGROUP(CSUS, 0x88c), | ||
| 55 | DRIVE_PINGROUP(DAP1, 0x890), | ||
| 56 | DRIVE_PINGROUP(DAP2, 0x894), | ||
| 57 | DRIVE_PINGROUP(DAP3, 0x898), | ||
| 58 | DRIVE_PINGROUP(DAP4, 0x89c), | ||
| 59 | DRIVE_PINGROUP(DBG, 0x8a0), | ||
| 60 | DRIVE_PINGROUP(LCD1, 0x8a4), | ||
| 61 | DRIVE_PINGROUP(LCD2, 0x8a8), | ||
| 62 | DRIVE_PINGROUP(SDIO2, 0x8ac), | ||
| 63 | DRIVE_PINGROUP(SDIO3, 0x8b0), | ||
| 64 | DRIVE_PINGROUP(SPI, 0x8b4), | ||
| 65 | DRIVE_PINGROUP(UAA, 0x8b8), | ||
| 66 | DRIVE_PINGROUP(UAB, 0x8bc), | ||
| 67 | DRIVE_PINGROUP(UART2, 0x8c0), | ||
| 68 | DRIVE_PINGROUP(UART3, 0x8c4), | ||
| 69 | DRIVE_PINGROUP(VI1, 0x8c8), | ||
| 70 | DRIVE_PINGROUP(SDIO1, 0x8ec), | ||
| 71 | DRIVE_PINGROUP(CRT, 0x8f8), | ||
| 72 | DRIVE_PINGROUP(DDC, 0x8fc), | ||
| 73 | DRIVE_PINGROUP(GMA, 0x900), | ||
| 74 | DRIVE_PINGROUP(GMB, 0x904), | ||
| 75 | DRIVE_PINGROUP(GMC, 0x908), | ||
| 76 | DRIVE_PINGROUP(GMD, 0x90c), | ||
| 77 | DRIVE_PINGROUP(GME, 0x910), | ||
| 78 | DRIVE_PINGROUP(GMF, 0x914), | ||
| 79 | DRIVE_PINGROUP(GMG, 0x918), | ||
| 80 | DRIVE_PINGROUP(GMH, 0x91c), | ||
| 81 | DRIVE_PINGROUP(OWR, 0x920), | ||
| 82 | DRIVE_PINGROUP(UAD, 0x924), | ||
| 83 | DRIVE_PINGROUP(GPV, 0x928), | ||
| 84 | DRIVE_PINGROUP(DEV3, 0x92c), | ||
| 85 | DRIVE_PINGROUP(CEC, 0x938), | ||
| 86 | }; | ||
| 87 | |||
| 88 | #define PINGROUP(pg_name, vdd, f0, f1, f2, f3, fs, iod, reg) \ | ||
| 89 | [TEGRA_PINGROUP_ ## pg_name] = { \ | ||
| 90 | .name = #pg_name, \ | ||
| 91 | .vddio = TEGRA_VDDIO_ ## vdd, \ | ||
| 92 | .funcs = { \ | ||
| 93 | TEGRA_MUX_ ## f0, \ | ||
| 94 | TEGRA_MUX_ ## f1, \ | ||
| 95 | TEGRA_MUX_ ## f2, \ | ||
| 96 | TEGRA_MUX_ ## f3, \ | ||
| 97 | }, \ | ||
| 98 | .func_safe = TEGRA_MUX_ ## fs, \ | ||
| 99 | .tri_bank = 1, \ | ||
| 100 | .tri_reg = ((reg) - MUXCTL_REG_A), \ | ||
| 101 | .tri_bit = 4, \ | ||
| 102 | .mux_bank = 1, \ | ||
| 103 | .mux_reg = ((reg) - MUXCTL_REG_A), \ | ||
| 104 | .mux_bit = 0, \ | ||
| 105 | .pupd_bank = 1, \ | ||
| 106 | .pupd_reg = ((reg) - MUXCTL_REG_A), \ | ||
| 107 | .pupd_bit = 2, \ | ||
| 108 | .io_default = TEGRA_PIN_ ## iod, \ | ||
| 109 | .od_bit = 6, \ | ||
| 110 | .lock_bit = 7, \ | ||
| 111 | .ioreset_bit = 8, \ | ||
| 112 | } | ||
| 113 | |||
| 114 | static const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = { | ||
| 115 | /* NAME VDD f0 f1 f2 f3 fSafe io reg */ | ||
| 116 | PINGROUP(ULPI_DATA0, BB, SPI3, HSI, UARTA, ULPI, RSVD, INPUT, 0x3000), | ||
| 117 | PINGROUP(ULPI_DATA1, BB, SPI3, HSI, UARTA, ULPI, RSVD, INPUT, 0x3004), | ||
| 118 | PINGROUP(ULPI_DATA2, BB, SPI3, HSI, UARTA, ULPI, RSVD, INPUT, 0x3008), | ||
| 119 | PINGROUP(ULPI_DATA3, BB, SPI3, HSI, UARTA, ULPI, RSVD, INPUT, 0x300c), | ||
| 120 | PINGROUP(ULPI_DATA4, BB, SPI2, HSI, UARTA, ULPI, RSVD, INPUT, 0x3010), | ||
| 121 | PINGROUP(ULPI_DATA5, BB, SPI2, HSI, UARTA, ULPI, RSVD, INPUT, 0x3014), | ||
| 122 | PINGROUP(ULPI_DATA6, BB, SPI2, HSI, UARTA, ULPI, RSVD, INPUT, 0x3018), | ||
| 123 | PINGROUP(ULPI_DATA7, BB, SPI2, HSI, UARTA, ULPI, RSVD, INPUT, 0x301c), | ||
| 124 | PINGROUP(ULPI_CLK, BB, SPI1, RSVD, UARTD, ULPI, RSVD, INPUT, 0x3020), | ||
| 125 | PINGROUP(ULPI_DIR, BB, SPI1, RSVD, UARTD, ULPI, RSVD, INPUT, 0x3024), | ||
| 126 | PINGROUP(ULPI_NXT, BB, SPI1, RSVD, UARTD, ULPI, RSVD, INPUT, 0x3028), | ||
| 127 | PINGROUP(ULPI_STP, BB, SPI1, RSVD, UARTD, ULPI, RSVD, INPUT, 0x302c), | ||
| 128 | PINGROUP(DAP3_FS, BB, I2S2, RSVD1, DISPLAYA, DISPLAYB, RSVD, INPUT, 0x3030), | ||
| 129 | PINGROUP(DAP3_DIN, BB, I2S2, RSVD1, DISPLAYA, DISPLAYB, RSVD, INPUT, 0x3034), | ||
| 130 | PINGROUP(DAP3_DOUT, BB, I2S2, RSVD1, DISPLAYA, DISPLAYB, RSVD, INPUT, 0x3038), | ||
| 131 | PINGROUP(DAP3_SCLK, BB, I2S2, RSVD1, DISPLAYA, DISPLAYB, RSVD, INPUT, 0x303c), | ||
| 132 | PINGROUP(GPIO_PV0, BB, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3040), | ||
| 133 | PINGROUP(GPIO_PV1, BB, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3044), | ||
| 134 | PINGROUP(SDMMC1_CLK, SDMMC1, SDIO1, RSVD1, RSVD2, INVALID, RSVD, INPUT, 0x3048), | ||
| 135 | PINGROUP(SDMMC1_CMD, SDMMC1, SDIO1, RSVD1, RSVD2, INVALID, RSVD, INPUT, 0x304c), | ||
| 136 | PINGROUP(SDMMC1_DAT3, SDMMC1, SDIO1, RSVD1, UARTE, INVALID, RSVD, INPUT, 0x3050), | ||
| 137 | PINGROUP(SDMMC1_DAT2, SDMMC1, SDIO1, RSVD1, UARTE, INVALID, RSVD, INPUT, 0x3054), | ||
| 138 | PINGROUP(SDMMC1_DAT1, SDMMC1, SDIO1, RSVD1, UARTE, INVALID, RSVD, INPUT, 0x3058), | ||
| 139 | PINGROUP(SDMMC1_DAT0, SDMMC1, SDIO1, RSVD1, UARTE, INVALID, RSVD, INPUT, 0x305c), | ||
| 140 | PINGROUP(GPIO_PV2, SDMMC1, OWR, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3060), | ||
| 141 | PINGROUP(GPIO_PV3, SDMMC1, INVALID, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3064), | ||
| 142 | PINGROUP(CLK2_OUT, SDMMC1, EXTPERIPH2, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3068), | ||
| 143 | PINGROUP(CLK2_REQ, SDMMC1, DAP, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x306c), | ||
| 144 | PINGROUP(LCD_PWR1, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3070), | ||
| 145 | PINGROUP(LCD_PWR2, LCD, DISPLAYA, DISPLAYB, SPI5, INVALID, RSVD, OUTPUT, 0x3074), | ||
| 146 | PINGROUP(LCD_SDIN, LCD, DISPLAYA, DISPLAYB, SPI5, RSVD, RSVD, OUTPUT, 0x3078), | ||
| 147 | PINGROUP(LCD_SDOUT, LCD, DISPLAYA, DISPLAYB, SPI5, INVALID, RSVD, OUTPUT, 0x307c), | ||
| 148 | PINGROUP(LCD_WR_N, LCD, DISPLAYA, DISPLAYB, SPI5, INVALID, RSVD, OUTPUT, 0x3080), | ||
| 149 | PINGROUP(LCD_CS0_N, LCD, DISPLAYA, DISPLAYB, SPI5, RSVD, RSVD, OUTPUT, 0x3084), | ||
| 150 | PINGROUP(LCD_DC0, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3088), | ||
| 151 | PINGROUP(LCD_SCK, LCD, DISPLAYA, DISPLAYB, SPI5, INVALID, RSVD, OUTPUT, 0x308c), | ||
| 152 | PINGROUP(LCD_PWR0, LCD, DISPLAYA, DISPLAYB, SPI5, INVALID, RSVD, OUTPUT, 0x3090), | ||
| 153 | PINGROUP(LCD_PCLK, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3094), | ||
| 154 | PINGROUP(LCD_DE, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3098), | ||
| 155 | PINGROUP(LCD_HSYNC, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x309c), | ||
| 156 | PINGROUP(LCD_VSYNC, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30a0), | ||
| 157 | PINGROUP(LCD_D0, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30a4), | ||
| 158 | PINGROUP(LCD_D1, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30a8), | ||
| 159 | PINGROUP(LCD_D2, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30ac), | ||
| 160 | PINGROUP(LCD_D3, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30b0), | ||
| 161 | PINGROUP(LCD_D4, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30b4), | ||
| 162 | PINGROUP(LCD_D5, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30b8), | ||
| 163 | PINGROUP(LCD_D6, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30bc), | ||
| 164 | PINGROUP(LCD_D7, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30c0), | ||
| 165 | PINGROUP(LCD_D8, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30c4), | ||
| 166 | PINGROUP(LCD_D9, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30c8), | ||
| 167 | PINGROUP(LCD_D10, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30cc), | ||
| 168 | PINGROUP(LCD_D11, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30d0), | ||
| 169 | PINGROUP(LCD_D12, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30d4), | ||
| 170 | PINGROUP(LCD_D13, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30d8), | ||
| 171 | PINGROUP(LCD_D14, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30dc), | ||
| 172 | PINGROUP(LCD_D15, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30e0), | ||
| 173 | PINGROUP(LCD_D16, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30e4), | ||
| 174 | PINGROUP(LCD_D17, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30e8), | ||
| 175 | PINGROUP(LCD_D18, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30ec), | ||
| 176 | PINGROUP(LCD_D19, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30f0), | ||
| 177 | PINGROUP(LCD_D20, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30f4), | ||
| 178 | PINGROUP(LCD_D21, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30f8), | ||
| 179 | PINGROUP(LCD_D22, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30fc), | ||
| 180 | PINGROUP(LCD_D23, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3100), | ||
| 181 | PINGROUP(LCD_CS1_N, LCD, DISPLAYA, DISPLAYB, SPI5, RSVD2, RSVD, OUTPUT, 0x3104), | ||
| 182 | PINGROUP(LCD_M1, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3108), | ||
| 183 | PINGROUP(LCD_DC1, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x310c), | ||
| 184 | PINGROUP(HDMI_INT, LCD, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3110), | ||
| 185 | PINGROUP(DDC_SCL, LCD, I2C4, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3114), | ||
| 186 | PINGROUP(DDC_SDA, LCD, I2C4, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3118), | ||
| 187 | PINGROUP(CRT_HSYNC, LCD, CRT, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x311c), | ||
| 188 | PINGROUP(CRT_VSYNC, LCD, CRT, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3120), | ||
| 189 | PINGROUP(VI_D0, VI, INVALID, RSVD1, VI, RSVD2, RSVD, INPUT, 0x3124), | ||
| 190 | PINGROUP(VI_D1, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3128), | ||
| 191 | PINGROUP(VI_D2, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x312c), | ||
| 192 | PINGROUP(VI_D3, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3130), | ||
| 193 | PINGROUP(VI_D4, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3134), | ||
| 194 | PINGROUP(VI_D5, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3138), | ||
| 195 | PINGROUP(VI_D6, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x313c), | ||
| 196 | PINGROUP(VI_D7, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3140), | ||
| 197 | PINGROUP(VI_D8, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3144), | ||
| 198 | PINGROUP(VI_D9, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3148), | ||
| 199 | PINGROUP(VI_D10, VI, INVALID, RSVD1, VI, RSVD2, RSVD, INPUT, 0x314c), | ||
| 200 | PINGROUP(VI_D11, VI, INVALID, RSVD1, VI, RSVD2, RSVD, INPUT, 0x3150), | ||
| 201 | PINGROUP(VI_PCLK, VI, RSVD1, SDIO2, VI, RSVD2, RSVD, INPUT, 0x3154), | ||
| 202 | PINGROUP(VI_MCLK, VI, VI, INVALID, INVALID, INVALID, RSVD, INPUT, 0x3158), | ||
| 203 | PINGROUP(VI_VSYNC, VI, INVALID, RSVD1, VI, RSVD2, RSVD, INPUT, 0x315c), | ||
| 204 | PINGROUP(VI_HSYNC, VI, INVALID, RSVD1, VI, RSVD2, RSVD, INPUT, 0x3160), | ||
| 205 | PINGROUP(UART2_RXD, UART, IRDA, SPDIF, UARTA, SPI4, RSVD, INPUT, 0x3164), | ||
| 206 | PINGROUP(UART2_TXD, UART, IRDA, SPDIF, UARTA, SPI4, RSVD, INPUT, 0x3168), | ||
| 207 | PINGROUP(UART2_RTS_N, UART, UARTA, UARTB, GMI, SPI4, RSVD, INPUT, 0x316c), | ||
| 208 | PINGROUP(UART2_CTS_N, UART, UARTA, UARTB, GMI, SPI4, RSVD, INPUT, 0x3170), | ||
| 209 | PINGROUP(UART3_TXD, UART, UARTC, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x3174), | ||
| 210 | PINGROUP(UART3_RXD, UART, UARTC, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x3178), | ||
| 211 | PINGROUP(UART3_CTS_N, UART, UARTC, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x317c), | ||
| 212 | PINGROUP(UART3_RTS_N, UART, UARTC, PWM0, GMI, RSVD2, RSVD, INPUT, 0x3180), | ||
| 213 | PINGROUP(GPIO_PU0, UART, OWR, UARTA, GMI, RSVD1, RSVD, INPUT, 0x3184), | ||
| 214 | PINGROUP(GPIO_PU1, UART, RSVD1, UARTA, GMI, RSVD2, RSVD, INPUT, 0x3188), | ||
| 215 | PINGROUP(GPIO_PU2, UART, RSVD1, UARTA, GMI, RSVD2, RSVD, INPUT, 0x318c), | ||
| 216 | PINGROUP(GPIO_PU3, UART, PWM0, UARTA, GMI, RSVD1, RSVD, INPUT, 0x3190), | ||
| 217 | PINGROUP(GPIO_PU4, UART, PWM1, UARTA, GMI, RSVD1, RSVD, INPUT, 0x3194), | ||
| 218 | PINGROUP(GPIO_PU5, UART, PWM2, UARTA, GMI, RSVD1, RSVD, INPUT, 0x3198), | ||
| 219 | PINGROUP(GPIO_PU6, UART, PWM3, UARTA, GMI, RSVD1, RSVD, INPUT, 0x319c), | ||
| 220 | PINGROUP(GEN1_I2C_SDA, UART, I2C, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x31a0), | ||
| 221 | PINGROUP(GEN1_I2C_SCL, UART, I2C, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x31a4), | ||
| 222 | PINGROUP(DAP4_FS, UART, I2S3, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x31a8), | ||
| 223 | PINGROUP(DAP4_DIN, UART, I2S3, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x31ac), | ||
| 224 | PINGROUP(DAP4_DOUT, UART, I2S3, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x31b0), | ||
| 225 | PINGROUP(DAP4_SCLK, UART, I2S3, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x31b4), | ||
| 226 | PINGROUP(CLK3_OUT, UART, EXTPERIPH3, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x31b8), | ||
| 227 | PINGROUP(CLK3_REQ, UART, DEV3, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x31bc), | ||
| 228 | PINGROUP(GMI_WP_N, GMI, RSVD1, NAND, GMI, GMI_ALT, RSVD, INPUT, 0x31c0), | ||
| 229 | PINGROUP(GMI_IORDY, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31c4), | ||
| 230 | PINGROUP(GMI_WAIT, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31c8), | ||
| 231 | PINGROUP(GMI_ADV_N, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31cc), | ||
| 232 | PINGROUP(GMI_CLK, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31d0), | ||
| 233 | PINGROUP(GMI_CS0_N, GMI, RSVD1, NAND, GMI, INVALID, RSVD, INPUT, 0x31d4), | ||
| 234 | PINGROUP(GMI_CS1_N, GMI, RSVD1, NAND, GMI, DTV, RSVD, INPUT, 0x31d8), | ||
| 235 | PINGROUP(GMI_CS2_N, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31dc), | ||
| 236 | PINGROUP(GMI_CS3_N, GMI, RSVD1, NAND, GMI, GMI_ALT, RSVD, INPUT, 0x31e0), | ||
| 237 | PINGROUP(GMI_CS4_N, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31e4), | ||
| 238 | PINGROUP(GMI_CS6_N, GMI, NAND, NAND_ALT, GMI, SATA, RSVD, INPUT, 0x31e8), | ||
| 239 | PINGROUP(GMI_CS7_N, GMI, NAND, NAND_ALT, GMI, GMI_ALT, RSVD, INPUT, 0x31ec), | ||
| 240 | PINGROUP(GMI_AD0, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31f0), | ||
| 241 | PINGROUP(GMI_AD1, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31f4), | ||
| 242 | PINGROUP(GMI_AD2, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31f8), | ||
| 243 | PINGROUP(GMI_AD3, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31fc), | ||
| 244 | PINGROUP(GMI_AD4, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3200), | ||
| 245 | PINGROUP(GMI_AD5, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3204), | ||
| 246 | PINGROUP(GMI_AD6, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3208), | ||
| 247 | PINGROUP(GMI_AD7, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x320c), | ||
| 248 | PINGROUP(GMI_AD8, GMI, PWM0, NAND, GMI, RSVD2, RSVD, INPUT, 0x3210), | ||
| 249 | PINGROUP(GMI_AD9, GMI, PWM1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3214), | ||
| 250 | PINGROUP(GMI_AD10, GMI, PWM2, NAND, GMI, RSVD2, RSVD, INPUT, 0x3218), | ||
| 251 | PINGROUP(GMI_AD11, GMI, PWM3, NAND, GMI, RSVD2, RSVD, INPUT, 0x321c), | ||
| 252 | PINGROUP(GMI_AD12, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3220), | ||
| 253 | PINGROUP(GMI_AD13, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3224), | ||
| 254 | PINGROUP(GMI_AD14, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3228), | ||
| 255 | PINGROUP(GMI_AD15, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x322c), | ||
| 256 | PINGROUP(GMI_A16, GMI, UARTD, SPI4, GMI, GMI_ALT, RSVD, INPUT, 0x3230), | ||
| 257 | PINGROUP(GMI_A17, GMI, UARTD, SPI4, GMI, INVALID, RSVD, INPUT, 0x3234), | ||
| 258 | PINGROUP(GMI_A18, GMI, UARTD, SPI4, GMI, INVALID, RSVD, INPUT, 0x3238), | ||
| 259 | PINGROUP(GMI_A19, GMI, UARTD, SPI4, GMI, RSVD3, RSVD, INPUT, 0x323c), | ||
| 260 | PINGROUP(GMI_WR_N, GMI, RSVD1, NAND, GMI, RSVD3, RSVD, INPUT, 0x3240), | ||
| 261 | PINGROUP(GMI_OE_N, GMI, RSVD1, NAND, GMI, RSVD3, RSVD, INPUT, 0x3244), | ||
| 262 | PINGROUP(GMI_DQS, GMI, RSVD1, NAND, GMI, RSVD3, RSVD, INPUT, 0x3248), | ||
| 263 | PINGROUP(GMI_RST_N, GMI, NAND, NAND_ALT, GMI, RSVD3, RSVD, INPUT, 0x324c), | ||
| 264 | PINGROUP(GEN2_I2C_SCL, GMI, I2C2, INVALID, GMI, RSVD3, RSVD, INPUT, 0x3250), | ||
| 265 | PINGROUP(GEN2_I2C_SDA, GMI, I2C2, INVALID, GMI, RSVD3, RSVD, INPUT, 0x3254), | ||
| 266 | PINGROUP(SDMMC4_CLK, SDMMC4, INVALID, NAND, GMI, SDIO4, RSVD, INPUT, 0x3258), | ||
| 267 | PINGROUP(SDMMC4_CMD, SDMMC4, I2C3, NAND, GMI, SDIO4, RSVD, INPUT, 0x325c), | ||
| 268 | PINGROUP(SDMMC4_DAT0, SDMMC4, UARTE, SPI3, GMI, SDIO4, RSVD, INPUT, 0x3260), | ||
| 269 | PINGROUP(SDMMC4_DAT1, SDMMC4, UARTE, SPI3, GMI, SDIO4, RSVD, INPUT, 0x3264), | ||
| 270 | PINGROUP(SDMMC4_DAT2, SDMMC4, UARTE, SPI3, GMI, SDIO4, RSVD, INPUT, 0x3268), | ||
| 271 | PINGROUP(SDMMC4_DAT3, SDMMC4, UARTE, SPI3, GMI, SDIO4, RSVD, INPUT, 0x326c), | ||
| 272 | PINGROUP(SDMMC4_DAT4, SDMMC4, I2C3, I2S4, GMI, SDIO4, RSVD, INPUT, 0x3270), | ||
| 273 | PINGROUP(SDMMC4_DAT5, SDMMC4, VGP3, I2S4, GMI, SDIO4, RSVD, INPUT, 0x3274), | ||
| 274 | PINGROUP(SDMMC4_DAT6, SDMMC4, VGP4, I2S4, GMI, SDIO4, RSVD, INPUT, 0x3278), | ||
| 275 | PINGROUP(SDMMC4_DAT7, SDMMC4, VGP5, I2S4, GMI, SDIO4, RSVD, INPUT, 0x327c), | ||
| 276 | PINGROUP(SDMMC4_RST_N, SDMMC4, VGP6, RSVD1, RSVD2, POPSDMMC4, RSVD, INPUT, 0x3280), | ||
| 277 | PINGROUP(CAM_MCLK, CAM, VI, INVALID, VI_ALT2, POPSDMMC4, RSVD, INPUT, 0x3284), | ||
| 278 | PINGROUP(GPIO_PCC1, CAM, I2S4, RSVD1, RSVD2, POPSDMMC4, RSVD, INPUT, 0x3288), | ||
| 279 | PINGROUP(GPIO_PBB0, CAM, I2S4, RSVD1, RSVD2, POPSDMMC4, RSVD, INPUT, 0x328c), | ||
| 280 | PINGROUP(CAM_I2C_SCL, CAM, INVALID, I2C3, RSVD2, POPSDMMC4, RSVD, INPUT, 0x3290), | ||
| 281 | PINGROUP(CAM_I2C_SDA, CAM, INVALID, I2C3, RSVD2, POPSDMMC4, RSVD, INPUT, 0x3294), | ||
| 282 | PINGROUP(GPIO_PBB3, CAM, VGP3, DISPLAYA, DISPLAYB, POPSDMMC4, RSVD, INPUT, 0x3298), | ||
| 283 | PINGROUP(GPIO_PBB4, CAM, VGP4, DISPLAYA, DISPLAYB, POPSDMMC4, RSVD, INPUT, 0x329c), | ||
| 284 | PINGROUP(GPIO_PBB5, CAM, VGP5, DISPLAYA, DISPLAYB, POPSDMMC4, RSVD, INPUT, 0x32a0), | ||
| 285 | PINGROUP(GPIO_PBB6, CAM, VGP6, DISPLAYA, DISPLAYB, POPSDMMC4, RSVD, INPUT, 0x32a4), | ||
| 286 | PINGROUP(GPIO_PBB7, CAM, I2S4, RSVD1, RSVD2, POPSDMMC4, RSVD, INPUT, 0x32a8), | ||
| 287 | PINGROUP(GPIO_PCC2, CAM, I2S4, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x32ac), | ||
| 288 | PINGROUP(JTAG_RTCK, SYS, RTCK, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x32b0), | ||
| 289 | PINGROUP(PWR_I2C_SCL, SYS, I2CPWR, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x32b4), | ||
| 290 | PINGROUP(PWR_I2C_SDA, SYS, I2CPWR, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x32b8), | ||
| 291 | PINGROUP(KB_ROW0, SYS, KBC, INVALID, RSVD2, RSVD3, RSVD, INPUT, 0x32bc), | ||
| 292 | PINGROUP(KB_ROW1, SYS, KBC, INVALID, RSVD2, RSVD3, RSVD, INPUT, 0x32c0), | ||
| 293 | PINGROUP(KB_ROW2, SYS, KBC, INVALID, RSVD2, RSVD3, RSVD, INPUT, 0x32c4), | ||
| 294 | PINGROUP(KB_ROW3, SYS, KBC, INVALID, RSVD2, INVALID, RSVD, INPUT, 0x32c8), | ||
| 295 | PINGROUP(KB_ROW4, SYS, KBC, INVALID, TRACE, RSVD3, RSVD, INPUT, 0x32cc), | ||
| 296 | PINGROUP(KB_ROW5, SYS, KBC, INVALID, TRACE, OWR, RSVD, INPUT, 0x32d0), | ||
| 297 | PINGROUP(KB_ROW6, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32d4), | ||
| 298 | PINGROUP(KB_ROW7, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32d8), | ||
| 299 | PINGROUP(KB_ROW8, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32dc), | ||
| 300 | PINGROUP(KB_ROW9, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32e0), | ||
| 301 | PINGROUP(KB_ROW10, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32e4), | ||
| 302 | PINGROUP(KB_ROW11, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32e8), | ||
| 303 | PINGROUP(KB_ROW12, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32ec), | ||
| 304 | PINGROUP(KB_ROW13, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32f0), | ||
| 305 | PINGROUP(KB_ROW14, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32f4), | ||
| 306 | PINGROUP(KB_ROW15, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32f8), | ||
| 307 | PINGROUP(KB_COL0, SYS, KBC, INVALID, TRACE, INVALID, RSVD, INPUT, 0x32fc), | ||
| 308 | PINGROUP(KB_COL1, SYS, KBC, INVALID, TRACE, INVALID, RSVD, INPUT, 0x3300), | ||
| 309 | PINGROUP(KB_COL2, SYS, KBC, INVALID, TRACE, RSVD, RSVD, INPUT, 0x3304), | ||
| 310 | PINGROUP(KB_COL3, SYS, KBC, INVALID, TRACE, RSVD, RSVD, INPUT, 0x3308), | ||
| 311 | PINGROUP(KB_COL4, SYS, KBC, INVALID, TRACE, RSVD, RSVD, INPUT, 0x330c), | ||
| 312 | PINGROUP(KB_COL5, SYS, KBC, INVALID, TRACE, RSVD, RSVD, INPUT, 0x3310), | ||
| 313 | PINGROUP(KB_COL6, SYS, KBC, INVALID, TRACE, INVALID, RSVD, INPUT, 0x3314), | ||
| 314 | PINGROUP(KB_COL7, SYS, KBC, INVALID, TRACE, INVALID, RSVD, INPUT, 0x3318), | ||
| 315 | PINGROUP(CLK_32K_OUT, SYS, BLINK, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x331c), | ||
| 316 | PINGROUP(SYS_CLK_REQ, SYS, SYSCLK, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3320), | ||
| 317 | PINGROUP(CORE_PWR_REQ, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3324), | ||
| 318 | PINGROUP(CPU_PWR_REQ, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3328), | ||
| 319 | PINGROUP(PWR_INT_N, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x332c), | ||
| 320 | PINGROUP(CLK_32K_IN, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3330), | ||
| 321 | PINGROUP(OWR, SYS, OWR, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3334), | ||
| 322 | PINGROUP(DAP1_FS, AUDIO, I2S0, HDA, GMI, SDIO2, RSVD, INPUT, 0x3338), | ||
| 323 | PINGROUP(DAP1_DIN, AUDIO, I2S0, HDA, GMI, SDIO2, RSVD, INPUT, 0x333c), | ||
| 324 | PINGROUP(DAP1_DOUT, AUDIO, I2S0, HDA, GMI, SDIO2, RSVD, INPUT, 0x3340), | ||
| 325 | PINGROUP(DAP1_SCLK, AUDIO, I2S0, HDA, GMI, SDIO2, RSVD, INPUT, 0x3344), | ||
| 326 | PINGROUP(CLK1_REQ, AUDIO, DAP, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x3348), | ||
| 327 | PINGROUP(CLK1_OUT, AUDIO, EXTPERIPH1, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x334c), | ||
| 328 | PINGROUP(SPDIF_IN, AUDIO, SPDIF, HDA, INVALID, DAPSDMMC2, RSVD, INPUT, 0x3350), | ||
| 329 | PINGROUP(SPDIF_OUT, AUDIO, SPDIF, RSVD1, INVALID, DAPSDMMC2, RSVD, INPUT, 0x3354), | ||
| 330 | PINGROUP(DAP2_FS, AUDIO, I2S1, HDA, RSVD2, GMI, RSVD, INPUT, 0x3358), | ||
| 331 | PINGROUP(DAP2_DIN, AUDIO, I2S1, HDA, RSVD2, GMI, RSVD, INPUT, 0x335c), | ||
| 332 | PINGROUP(DAP2_DOUT, AUDIO, I2S1, HDA, RSVD2, GMI, RSVD, INPUT, 0x3360), | ||
| 333 | PINGROUP(DAP2_SCLK, AUDIO, I2S1, HDA, RSVD2, GMI, RSVD, INPUT, 0x3364), | ||
| 334 | PINGROUP(SPI2_MOSI, AUDIO, SPI6, SPI2, INVALID, GMI, RSVD, INPUT, 0x3368), | ||
| 335 | PINGROUP(SPI2_MISO, AUDIO, SPI6, SPI2, INVALID, GMI, RSVD, INPUT, 0x336c), | ||
| 336 | PINGROUP(SPI2_CS0_N, AUDIO, SPI6, SPI2, INVALID, GMI, RSVD, INPUT, 0x3370), | ||
| 337 | PINGROUP(SPI2_SCK, AUDIO, SPI6, SPI2, INVALID, GMI, RSVD, INPUT, 0x3374), | ||
| 338 | PINGROUP(SPI1_MOSI, AUDIO, SPI2, SPI1, INVALID, GMI, RSVD, INPUT, 0x3378), | ||
| 339 | PINGROUP(SPI1_SCK, AUDIO, SPI2, SPI1, INVALID, GMI, RSVD, INPUT, 0x337c), | ||
| 340 | PINGROUP(SPI1_CS0_N, AUDIO, SPI2, SPI1, INVALID, GMI, RSVD, INPUT, 0x3380), | ||
| 341 | PINGROUP(SPI1_MISO, AUDIO, INVALID, SPI1, INVALID, RSVD3, RSVD, INPUT, 0x3384), | ||
| 342 | PINGROUP(SPI2_CS1_N, AUDIO, INVALID, SPI2, INVALID, INVALID, RSVD, INPUT, 0x3388), | ||
| 343 | PINGROUP(SPI2_CS2_N, AUDIO, INVALID, SPI2, INVALID, INVALID, RSVD, INPUT, 0x338c), | ||
| 344 | PINGROUP(SDMMC3_CLK, SDMMC3, UARTA, PWM2, SDIO3, INVALID, RSVD, INPUT, 0x3390), | ||
| 345 | PINGROUP(SDMMC3_CMD, SDMMC3, UARTA, PWM3, SDIO3, INVALID, RSVD, INPUT, 0x3394), | ||
| 346 | PINGROUP(SDMMC3_DAT0, SDMMC3, RSVD, RSVD1, SDIO3, INVALID, RSVD, INPUT, 0x3398), | ||
| 347 | PINGROUP(SDMMC3_DAT1, SDMMC3, RSVD, RSVD1, SDIO3, INVALID, RSVD, INPUT, 0x339c), | ||
| 348 | PINGROUP(SDMMC3_DAT2, SDMMC3, RSVD, PWM1, SDIO3, INVALID, RSVD, INPUT, 0x33a0), | ||
| 349 | PINGROUP(SDMMC3_DAT3, SDMMC3, RSVD, PWM0, SDIO3, INVALID, RSVD, INPUT, 0x33a4), | ||
| 350 | PINGROUP(SDMMC3_DAT4, SDMMC3, PWM1, INVALID, SDIO3, INVALID, RSVD, INPUT, 0x33a8), | ||
| 351 | PINGROUP(SDMMC3_DAT5, SDMMC3, PWM0, INVALID, SDIO3, INVALID, RSVD, INPUT, 0x33ac), | ||
| 352 | PINGROUP(SDMMC3_DAT6, SDMMC3, SPDIF, INVALID, SDIO3, INVALID, RSVD, INPUT, 0x33b0), | ||
| 353 | PINGROUP(SDMMC3_DAT7, SDMMC3, SPDIF, INVALID, SDIO3, INVALID, RSVD, INPUT, 0x33b4), | ||
| 354 | PINGROUP(PEX_L0_PRSNT_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33b8), | ||
| 355 | PINGROUP(PEX_L0_RST_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33bc), | ||
| 356 | PINGROUP(PEX_L0_CLKREQ_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33c0), | ||
| 357 | PINGROUP(PEX_WAKE_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33c4), | ||
| 358 | PINGROUP(PEX_L1_PRSNT_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33c8), | ||
| 359 | PINGROUP(PEX_L1_RST_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33cc), | ||
| 360 | PINGROUP(PEX_L1_CLKREQ_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33d0), | ||
| 361 | PINGROUP(PEX_L2_PRSNT_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33d4), | ||
| 362 | PINGROUP(PEX_L2_RST_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33d8), | ||
| 363 | PINGROUP(PEX_L2_CLKREQ_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33dc), | ||
| 364 | PINGROUP(HDMI_CEC, SYS, CEC, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x33e0), | ||
| 365 | }; | ||
| 366 | |||
| 367 | void __devinit tegra30_pinmux_init(const struct tegra_pingroup_desc **pg, | ||
| 368 | int *pg_max, const struct tegra_drive_pingroup_desc **pgdrive, | ||
| 369 | int *pgdrive_max) | ||
| 370 | { | ||
| 371 | *pg = tegra_soc_pingroups; | ||
| 372 | *pg_max = TEGRA_MAX_PINGROUP; | ||
| 373 | *pgdrive = tegra_soc_drive_pingroups; | ||
| 374 | *pgdrive_max = TEGRA_MAX_DRIVE_PINGROUP; | ||
| 375 | } | ||
| 376 | |||
diff --git a/arch/arm/mach-tegra/pinmux.c b/arch/arm/mach-tegra/pinmux.c deleted file mode 100644 index ac35d2b76850..000000000000 --- a/arch/arm/mach-tegra/pinmux.c +++ /dev/null | |||
| @@ -1,987 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/mach-tegra/pinmux.c | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Google, Inc. | ||
| 5 | * | ||
| 6 | * This software is licensed under the terms of the GNU General Public | ||
| 7 | * License version 2, as published by the Free Software Foundation, and | ||
| 8 | * may be copied, distributed, and modified under those terms. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <linux/init.h> | ||
| 18 | #include <linux/module.h> | ||
| 19 | #include <linux/kernel.h> | ||
| 20 | #include <linux/errno.h> | ||
| 21 | #include <linux/spinlock.h> | ||
| 22 | #include <linux/io.h> | ||
| 23 | #include <linux/platform_device.h> | ||
| 24 | #include <linux/of_device.h> | ||
| 25 | |||
| 26 | #include <mach/iomap.h> | ||
| 27 | #include <mach/pinmux.h> | ||
| 28 | |||
| 29 | #define HSM_EN(reg) (((reg) >> 2) & 0x1) | ||
| 30 | #define SCHMT_EN(reg) (((reg) >> 3) & 0x1) | ||
| 31 | #define LPMD(reg) (((reg) >> 4) & 0x3) | ||
| 32 | #define DRVDN(reg) (((reg) >> 12) & 0x1f) | ||
| 33 | #define DRVUP(reg) (((reg) >> 20) & 0x1f) | ||
| 34 | #define SLWR(reg) (((reg) >> 28) & 0x3) | ||
| 35 | #define SLWF(reg) (((reg) >> 30) & 0x3) | ||
| 36 | |||
| 37 | static const struct tegra_pingroup_desc *pingroups; | ||
| 38 | static const struct tegra_drive_pingroup_desc *drive_pingroups; | ||
| 39 | static int pingroup_max; | ||
| 40 | static int drive_max; | ||
| 41 | |||
| 42 | static char *tegra_mux_names[TEGRA_MAX_MUX] = { | ||
| 43 | [TEGRA_MUX_AHB_CLK] = "AHB_CLK", | ||
| 44 | [TEGRA_MUX_APB_CLK] = "APB_CLK", | ||
| 45 | [TEGRA_MUX_AUDIO_SYNC] = "AUDIO_SYNC", | ||
| 46 | [TEGRA_MUX_CRT] = "CRT", | ||
| 47 | [TEGRA_MUX_DAP1] = "DAP1", | ||
| 48 | [TEGRA_MUX_DAP2] = "DAP2", | ||
| 49 | [TEGRA_MUX_DAP3] = "DAP3", | ||
| 50 | [TEGRA_MUX_DAP4] = "DAP4", | ||
| 51 | [TEGRA_MUX_DAP5] = "DAP5", | ||
| 52 | [TEGRA_MUX_DISPLAYA] = "DISPLAYA", | ||
| 53 | [TEGRA_MUX_DISPLAYB] = "DISPLAYB", | ||
| 54 | [TEGRA_MUX_EMC_TEST0_DLL] = "EMC_TEST0_DLL", | ||
| 55 | [TEGRA_MUX_EMC_TEST1_DLL] = "EMC_TEST1_DLL", | ||
| 56 | [TEGRA_MUX_GMI] = "GMI", | ||
| 57 | [TEGRA_MUX_GMI_INT] = "GMI_INT", | ||
| 58 | [TEGRA_MUX_HDMI] = "HDMI", | ||
| 59 | [TEGRA_MUX_I2C] = "I2C", | ||
| 60 | [TEGRA_MUX_I2C2] = "I2C2", | ||
| 61 | [TEGRA_MUX_I2C3] = "I2C3", | ||
| 62 | [TEGRA_MUX_IDE] = "IDE", | ||
| 63 | [TEGRA_MUX_IRDA] = "IRDA", | ||
| 64 | [TEGRA_MUX_KBC] = "KBC", | ||
| 65 | [TEGRA_MUX_MIO] = "MIO", | ||
| 66 | [TEGRA_MUX_MIPI_HS] = "MIPI_HS", | ||
| 67 | [TEGRA_MUX_NAND] = "NAND", | ||
| 68 | [TEGRA_MUX_OSC] = "OSC", | ||
| 69 | [TEGRA_MUX_OWR] = "OWR", | ||
| 70 | [TEGRA_MUX_PCIE] = "PCIE", | ||
| 71 | [TEGRA_MUX_PLLA_OUT] = "PLLA_OUT", | ||
| 72 | [TEGRA_MUX_PLLC_OUT1] = "PLLC_OUT1", | ||
| 73 | [TEGRA_MUX_PLLM_OUT1] = "PLLM_OUT1", | ||
| 74 | [TEGRA_MUX_PLLP_OUT2] = "PLLP_OUT2", | ||
| 75 | [TEGRA_MUX_PLLP_OUT3] = "PLLP_OUT3", | ||
| 76 | [TEGRA_MUX_PLLP_OUT4] = "PLLP_OUT4", | ||
| 77 | [TEGRA_MUX_PWM] = "PWM", | ||
| 78 | [TEGRA_MUX_PWR_INTR] = "PWR_INTR", | ||
| 79 | [TEGRA_MUX_PWR_ON] = "PWR_ON", | ||
| 80 | [TEGRA_MUX_RTCK] = "RTCK", | ||
| 81 | [TEGRA_MUX_SDIO1] = "SDIO1", | ||
| 82 | [TEGRA_MUX_SDIO2] = "SDIO2", | ||
| 83 | [TEGRA_MUX_SDIO3] = "SDIO3", | ||
| 84 | [TEGRA_MUX_SDIO4] = "SDIO4", | ||
| 85 | [TEGRA_MUX_SFLASH] = "SFLASH", | ||
| 86 | [TEGRA_MUX_SPDIF] = "SPDIF", | ||
| 87 | [TEGRA_MUX_SPI1] = "SPI1", | ||
| 88 | [TEGRA_MUX_SPI2] = "SPI2", | ||
| 89 | [TEGRA_MUX_SPI2_ALT] = "SPI2_ALT", | ||
| 90 | [TEGRA_MUX_SPI3] = "SPI3", | ||
| 91 | [TEGRA_MUX_SPI4] = "SPI4", | ||
| 92 | [TEGRA_MUX_TRACE] = "TRACE", | ||
| 93 | [TEGRA_MUX_TWC] = "TWC", | ||
| 94 | [TEGRA_MUX_UARTA] = "UARTA", | ||
| 95 | [TEGRA_MUX_UARTB] = "UARTB", | ||
| 96 | [TEGRA_MUX_UARTC] = "UARTC", | ||
| 97 | [TEGRA_MUX_UARTD] = "UARTD", | ||
| 98 | [TEGRA_MUX_UARTE] = "UARTE", | ||
| 99 | [TEGRA_MUX_ULPI] = "ULPI", | ||
| 100 | [TEGRA_MUX_VI] = "VI", | ||
| 101 | [TEGRA_MUX_VI_SENSOR_CLK] = "VI_SENSOR_CLK", | ||
| 102 | [TEGRA_MUX_XIO] = "XIO", | ||
| 103 | [TEGRA_MUX_BLINK] = "BLINK", | ||
| 104 | [TEGRA_MUX_CEC] = "CEC", | ||
| 105 | [TEGRA_MUX_CLK12] = "CLK12", | ||
| 106 | [TEGRA_MUX_DAP] = "DAP", | ||
| 107 | [TEGRA_MUX_DAPSDMMC2] = "DAPSDMMC2", | ||
| 108 | [TEGRA_MUX_DDR] = "DDR", | ||
| 109 | [TEGRA_MUX_DEV3] = "DEV3", | ||
| 110 | [TEGRA_MUX_DTV] = "DTV", | ||
| 111 | [TEGRA_MUX_VI_ALT1] = "VI_ALT1", | ||
| 112 | [TEGRA_MUX_VI_ALT2] = "VI_ALT2", | ||
| 113 | [TEGRA_MUX_VI_ALT3] = "VI_ALT3", | ||
| 114 | [TEGRA_MUX_EMC_DLL] = "EMC_DLL", | ||
| 115 | [TEGRA_MUX_EXTPERIPH1] = "EXTPERIPH1", | ||
| 116 | [TEGRA_MUX_EXTPERIPH2] = "EXTPERIPH2", | ||
| 117 | [TEGRA_MUX_EXTPERIPH3] = "EXTPERIPH3", | ||
| 118 | [TEGRA_MUX_GMI_ALT] = "GMI_ALT", | ||
| 119 | [TEGRA_MUX_HDA] = "HDA", | ||
| 120 | [TEGRA_MUX_HSI] = "HSI", | ||
| 121 | [TEGRA_MUX_I2C4] = "I2C4", | ||
| 122 | [TEGRA_MUX_I2C5] = "I2C5", | ||
| 123 | [TEGRA_MUX_I2CPWR] = "I2CPWR", | ||
| 124 | [TEGRA_MUX_I2S0] = "I2S0", | ||
| 125 | [TEGRA_MUX_I2S1] = "I2S1", | ||
| 126 | [TEGRA_MUX_I2S2] = "I2S2", | ||
| 127 | [TEGRA_MUX_I2S3] = "I2S3", | ||
| 128 | [TEGRA_MUX_I2S4] = "I2S4", | ||
| 129 | [TEGRA_MUX_NAND_ALT] = "NAND_ALT", | ||
| 130 | [TEGRA_MUX_POPSDIO4] = "POPSDIO4", | ||
| 131 | [TEGRA_MUX_POPSDMMC4] = "POPSDMMC4", | ||
| 132 | [TEGRA_MUX_PWM0] = "PWM0", | ||
| 133 | [TEGRA_MUX_PWM1] = "PWM2", | ||
| 134 | [TEGRA_MUX_PWM2] = "PWM2", | ||
| 135 | [TEGRA_MUX_PWM3] = "PWM3", | ||
| 136 | [TEGRA_MUX_SATA] = "SATA", | ||
| 137 | [TEGRA_MUX_SPI5] = "SPI5", | ||
| 138 | [TEGRA_MUX_SPI6] = "SPI6", | ||
| 139 | [TEGRA_MUX_SYSCLK] = "SYSCLK", | ||
| 140 | [TEGRA_MUX_VGP1] = "VGP1", | ||
| 141 | [TEGRA_MUX_VGP2] = "VGP2", | ||
| 142 | [TEGRA_MUX_VGP3] = "VGP3", | ||
| 143 | [TEGRA_MUX_VGP4] = "VGP4", | ||
| 144 | [TEGRA_MUX_VGP5] = "VGP5", | ||
| 145 | [TEGRA_MUX_VGP6] = "VGP6", | ||
| 146 | [TEGRA_MUX_SAFE] = "<safe>", | ||
| 147 | }; | ||
| 148 | |||
| 149 | static const char *tegra_drive_names[TEGRA_MAX_DRIVE] = { | ||
| 150 | [TEGRA_DRIVE_DIV_8] = "DIV_8", | ||
| 151 | [TEGRA_DRIVE_DIV_4] = "DIV_4", | ||
| 152 | [TEGRA_DRIVE_DIV_2] = "DIV_2", | ||
| 153 | [TEGRA_DRIVE_DIV_1] = "DIV_1", | ||
| 154 | }; | ||
| 155 | |||
| 156 | static const char *tegra_slew_names[TEGRA_MAX_SLEW] = { | ||
| 157 | [TEGRA_SLEW_FASTEST] = "FASTEST", | ||
| 158 | [TEGRA_SLEW_FAST] = "FAST", | ||
| 159 | [TEGRA_SLEW_SLOW] = "SLOW", | ||
| 160 | [TEGRA_SLEW_SLOWEST] = "SLOWEST", | ||
| 161 | }; | ||
| 162 | |||
| 163 | static DEFINE_SPINLOCK(mux_lock); | ||
| 164 | |||
| 165 | static const char *pingroup_name(int pg) | ||
| 166 | { | ||
| 167 | if (pg < 0 || pg >= pingroup_max) | ||
| 168 | return "<UNKNOWN>"; | ||
| 169 | |||
| 170 | return pingroups[pg].name; | ||
| 171 | } | ||
| 172 | |||
| 173 | static const char *func_name(enum tegra_mux_func func) | ||
| 174 | { | ||
| 175 | if (func == TEGRA_MUX_RSVD1) | ||
| 176 | return "RSVD1"; | ||
| 177 | |||
| 178 | if (func == TEGRA_MUX_RSVD2) | ||
| 179 | return "RSVD2"; | ||
| 180 | |||
| 181 | if (func == TEGRA_MUX_RSVD3) | ||
| 182 | return "RSVD3"; | ||
| 183 | |||
| 184 | if (func == TEGRA_MUX_RSVD4) | ||
| 185 | return "RSVD4"; | ||
| 186 | |||
| 187 | if (func == TEGRA_MUX_NONE) | ||
| 188 | return "NONE"; | ||
| 189 | |||
| 190 | if (func < 0 || func >= TEGRA_MAX_MUX) | ||
| 191 | return "<UNKNOWN>"; | ||
| 192 | |||
| 193 | return tegra_mux_names[func]; | ||
| 194 | } | ||
| 195 | |||
| 196 | |||
| 197 | static const char *tri_name(unsigned long val) | ||
| 198 | { | ||
| 199 | return val ? "TRISTATE" : "NORMAL"; | ||
| 200 | } | ||
| 201 | |||
| 202 | static const char *pupd_name(unsigned long val) | ||
| 203 | { | ||
| 204 | switch (val) { | ||
| 205 | case 0: | ||
| 206 | return "NORMAL"; | ||
| 207 | |||
| 208 | case 1: | ||
| 209 | return "PULL_DOWN"; | ||
| 210 | |||
| 211 | case 2: | ||
| 212 | return "PULL_UP"; | ||
| 213 | |||
| 214 | default: | ||
| 215 | return "RSVD"; | ||
| 216 | } | ||
| 217 | } | ||
| 218 | |||
| 219 | static int nbanks; | ||
| 220 | static void __iomem **regs; | ||
| 221 | |||
| 222 | static inline u32 pg_readl(u32 bank, u32 reg) | ||
| 223 | { | ||
| 224 | return readl(regs[bank] + reg); | ||
| 225 | } | ||
| 226 | |||
| 227 | static inline void pg_writel(u32 val, u32 bank, u32 reg) | ||
| 228 | { | ||
| 229 | writel(val, regs[bank] + reg); | ||
| 230 | } | ||
| 231 | |||
| 232 | static int tegra_pinmux_set_func(const struct tegra_pingroup_config *config) | ||
| 233 | { | ||
| 234 | int mux = -1; | ||
| 235 | int i; | ||
| 236 | unsigned long reg; | ||
| 237 | unsigned long flags; | ||
| 238 | int pg = config->pingroup; | ||
| 239 | enum tegra_mux_func func = config->func; | ||
| 240 | |||
| 241 | if (pg < 0 || pg >= pingroup_max) | ||
| 242 | return -ERANGE; | ||
| 243 | |||
| 244 | if (pingroups[pg].mux_reg < 0) | ||
| 245 | return -EINVAL; | ||
| 246 | |||
| 247 | if (func < 0) | ||
| 248 | return -ERANGE; | ||
| 249 | |||
| 250 | if (func == TEGRA_MUX_SAFE) | ||
| 251 | func = pingroups[pg].func_safe; | ||
| 252 | |||
| 253 | if (func & TEGRA_MUX_RSVD) { | ||
| 254 | mux = func & 0x3; | ||
| 255 | } else { | ||
| 256 | for (i = 0; i < 4; i++) { | ||
| 257 | if (pingroups[pg].funcs[i] == func) { | ||
| 258 | mux = i; | ||
| 259 | break; | ||
| 260 | } | ||
| 261 | } | ||
| 262 | } | ||
| 263 | |||
| 264 | if (mux < 0) | ||
| 265 | return -EINVAL; | ||
| 266 | |||
| 267 | spin_lock_irqsave(&mux_lock, flags); | ||
| 268 | |||
| 269 | reg = pg_readl(pingroups[pg].mux_bank, pingroups[pg].mux_reg); | ||
| 270 | reg &= ~(0x3 << pingroups[pg].mux_bit); | ||
| 271 | reg |= mux << pingroups[pg].mux_bit; | ||
| 272 | pg_writel(reg, pingroups[pg].mux_bank, pingroups[pg].mux_reg); | ||
| 273 | |||
| 274 | spin_unlock_irqrestore(&mux_lock, flags); | ||
| 275 | |||
| 276 | return 0; | ||
| 277 | } | ||
| 278 | |||
| 279 | int tegra_pinmux_set_tristate(int pg, enum tegra_tristate tristate) | ||
| 280 | { | ||
| 281 | unsigned long reg; | ||
| 282 | unsigned long flags; | ||
| 283 | |||
| 284 | if (pg < 0 || pg >= pingroup_max) | ||
| 285 | return -ERANGE; | ||
| 286 | |||
| 287 | if (pingroups[pg].tri_reg < 0) | ||
| 288 | return -EINVAL; | ||
| 289 | |||
| 290 | spin_lock_irqsave(&mux_lock, flags); | ||
| 291 | |||
| 292 | reg = pg_readl(pingroups[pg].tri_bank, pingroups[pg].tri_reg); | ||
| 293 | reg &= ~(0x1 << pingroups[pg].tri_bit); | ||
| 294 | if (tristate) | ||
| 295 | reg |= 1 << pingroups[pg].tri_bit; | ||
| 296 | pg_writel(reg, pingroups[pg].tri_bank, pingroups[pg].tri_reg); | ||
| 297 | |||
| 298 | spin_unlock_irqrestore(&mux_lock, flags); | ||
| 299 | |||
| 300 | return 0; | ||
| 301 | } | ||
| 302 | |||
| 303 | int tegra_pinmux_set_pullupdown(int pg, enum tegra_pullupdown pupd) | ||
| 304 | { | ||
| 305 | unsigned long reg; | ||
| 306 | unsigned long flags; | ||
| 307 | |||
| 308 | if (pg < 0 || pg >= pingroup_max) | ||
| 309 | return -ERANGE; | ||
| 310 | |||
| 311 | if (pingroups[pg].pupd_reg < 0) | ||
| 312 | return -EINVAL; | ||
| 313 | |||
| 314 | if (pupd != TEGRA_PUPD_NORMAL && | ||
| 315 | pupd != TEGRA_PUPD_PULL_DOWN && | ||
| 316 | pupd != TEGRA_PUPD_PULL_UP) | ||
| 317 | return -EINVAL; | ||
| 318 | |||
| 319 | |||
| 320 | spin_lock_irqsave(&mux_lock, flags); | ||
| 321 | |||
| 322 | reg = pg_readl(pingroups[pg].pupd_bank, pingroups[pg].pupd_reg); | ||
| 323 | reg &= ~(0x3 << pingroups[pg].pupd_bit); | ||
| 324 | reg |= pupd << pingroups[pg].pupd_bit; | ||
| 325 | pg_writel(reg, pingroups[pg].pupd_bank, pingroups[pg].pupd_reg); | ||
| 326 | |||
| 327 | spin_unlock_irqrestore(&mux_lock, flags); | ||
| 328 | |||
| 329 | return 0; | ||
| 330 | } | ||
| 331 | |||
| 332 | static void tegra_pinmux_config_pingroup(const struct tegra_pingroup_config *config) | ||
| 333 | { | ||
| 334 | int pingroup = config->pingroup; | ||
| 335 | enum tegra_mux_func func = config->func; | ||
| 336 | enum tegra_pullupdown pupd = config->pupd; | ||
| 337 | enum tegra_tristate tristate = config->tristate; | ||
| 338 | int err; | ||
| 339 | |||
| 340 | if (pingroups[pingroup].mux_reg >= 0) { | ||
| 341 | err = tegra_pinmux_set_func(config); | ||
| 342 | if (err < 0) | ||
| 343 | pr_err("pinmux: can't set pingroup %s func to %s: %d\n", | ||
| 344 | pingroup_name(pingroup), func_name(func), err); | ||
| 345 | } | ||
| 346 | |||
| 347 | if (pingroups[pingroup].pupd_reg >= 0) { | ||
| 348 | err = tegra_pinmux_set_pullupdown(pingroup, pupd); | ||
| 349 | if (err < 0) | ||
| 350 | pr_err("pinmux: can't set pingroup %s pullupdown to %s: %d\n", | ||
| 351 | pingroup_name(pingroup), pupd_name(pupd), err); | ||
| 352 | } | ||
| 353 | |||
| 354 | if (pingroups[pingroup].tri_reg >= 0) { | ||
| 355 | err = tegra_pinmux_set_tristate(pingroup, tristate); | ||
| 356 | if (err < 0) | ||
| 357 | pr_err("pinmux: can't set pingroup %s tristate to %s: %d\n", | ||
| 358 | pingroup_name(pingroup), tri_name(func), err); | ||
| 359 | } | ||
| 360 | } | ||
| 361 | |||
| 362 | void tegra_pinmux_config_table(const struct tegra_pingroup_config *config, int len) | ||
| 363 | { | ||
| 364 | int i; | ||
| 365 | |||
| 366 | for (i = 0; i < len; i++) | ||
| 367 | tegra_pinmux_config_pingroup(&config[i]); | ||
| 368 | } | ||
| 369 | |||
| 370 | static const char *drive_pinmux_name(int pg) | ||
| 371 | { | ||
| 372 | if (pg < 0 || pg >= drive_max) | ||
| 373 | return "<UNKNOWN>"; | ||
| 374 | |||
| 375 | return drive_pingroups[pg].name; | ||
| 376 | } | ||
| 377 | |||
| 378 | static const char *enable_name(unsigned long val) | ||
| 379 | { | ||
| 380 | return val ? "ENABLE" : "DISABLE"; | ||
| 381 | } | ||
| 382 | |||
| 383 | static const char *drive_name(unsigned long val) | ||
| 384 | { | ||
| 385 | if (val >= TEGRA_MAX_DRIVE) | ||
| 386 | return "<UNKNOWN>"; | ||
| 387 | |||
| 388 | return tegra_drive_names[val]; | ||
| 389 | } | ||
| 390 | |||
| 391 | static const char *slew_name(unsigned long val) | ||
| 392 | { | ||
| 393 | if (val >= TEGRA_MAX_SLEW) | ||
| 394 | return "<UNKNOWN>"; | ||
| 395 | |||
| 396 | return tegra_slew_names[val]; | ||
| 397 | } | ||
| 398 | |||
| 399 | static int tegra_drive_pinmux_set_hsm(int pg, enum tegra_hsm hsm) | ||
| 400 | { | ||
| 401 | unsigned long flags; | ||
| 402 | u32 reg; | ||
| 403 | if (pg < 0 || pg >= drive_max) | ||
| 404 | return -ERANGE; | ||
| 405 | |||
| 406 | if (hsm != TEGRA_HSM_ENABLE && hsm != TEGRA_HSM_DISABLE) | ||
| 407 | return -EINVAL; | ||
| 408 | |||
| 409 | spin_lock_irqsave(&mux_lock, flags); | ||
| 410 | |||
| 411 | reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 412 | if (hsm == TEGRA_HSM_ENABLE) | ||
| 413 | reg |= (1 << 2); | ||
| 414 | else | ||
| 415 | reg &= ~(1 << 2); | ||
| 416 | pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 417 | |||
| 418 | spin_unlock_irqrestore(&mux_lock, flags); | ||
| 419 | |||
| 420 | return 0; | ||
| 421 | } | ||
| 422 | |||
| 423 | static int tegra_drive_pinmux_set_schmitt(int pg, enum tegra_schmitt schmitt) | ||
| 424 | { | ||
| 425 | unsigned long flags; | ||
| 426 | u32 reg; | ||
| 427 | if (pg < 0 || pg >= drive_max) | ||
| 428 | return -ERANGE; | ||
| 429 | |||
| 430 | if (schmitt != TEGRA_SCHMITT_ENABLE && schmitt != TEGRA_SCHMITT_DISABLE) | ||
| 431 | return -EINVAL; | ||
| 432 | |||
| 433 | spin_lock_irqsave(&mux_lock, flags); | ||
| 434 | |||
| 435 | reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 436 | if (schmitt == TEGRA_SCHMITT_ENABLE) | ||
| 437 | reg |= (1 << 3); | ||
| 438 | else | ||
| 439 | reg &= ~(1 << 3); | ||
| 440 | pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 441 | |||
| 442 | spin_unlock_irqrestore(&mux_lock, flags); | ||
| 443 | |||
| 444 | return 0; | ||
| 445 | } | ||
| 446 | |||
| 447 | static int tegra_drive_pinmux_set_drive(int pg, enum tegra_drive drive) | ||
| 448 | { | ||
| 449 | unsigned long flags; | ||
| 450 | u32 reg; | ||
| 451 | if (pg < 0 || pg >= drive_max) | ||
| 452 | return -ERANGE; | ||
| 453 | |||
| 454 | if (drive < 0 || drive >= TEGRA_MAX_DRIVE) | ||
| 455 | return -EINVAL; | ||
| 456 | |||
| 457 | spin_lock_irqsave(&mux_lock, flags); | ||
| 458 | |||
| 459 | reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 460 | reg &= ~(0x3 << 4); | ||
| 461 | reg |= drive << 4; | ||
| 462 | pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 463 | |||
| 464 | spin_unlock_irqrestore(&mux_lock, flags); | ||
| 465 | |||
| 466 | return 0; | ||
| 467 | } | ||
| 468 | |||
| 469 | static int tegra_drive_pinmux_set_pull_down(int pg, | ||
| 470 | enum tegra_pull_strength pull_down) | ||
| 471 | { | ||
| 472 | unsigned long flags; | ||
| 473 | u32 reg; | ||
| 474 | if (pg < 0 || pg >= drive_max) | ||
| 475 | return -ERANGE; | ||
| 476 | |||
| 477 | if (pull_down < 0 || pull_down >= TEGRA_MAX_PULL) | ||
| 478 | return -EINVAL; | ||
| 479 | |||
| 480 | spin_lock_irqsave(&mux_lock, flags); | ||
| 481 | |||
| 482 | reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 483 | reg &= ~(0x1f << 12); | ||
| 484 | reg |= pull_down << 12; | ||
| 485 | pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 486 | |||
| 487 | spin_unlock_irqrestore(&mux_lock, flags); | ||
| 488 | |||
| 489 | return 0; | ||
| 490 | } | ||
| 491 | |||
| 492 | static int tegra_drive_pinmux_set_pull_up(int pg, | ||
| 493 | enum tegra_pull_strength pull_up) | ||
| 494 | { | ||
| 495 | unsigned long flags; | ||
| 496 | u32 reg; | ||
| 497 | if (pg < 0 || pg >= drive_max) | ||
| 498 | return -ERANGE; | ||
| 499 | |||
| 500 | if (pull_up < 0 || pull_up >= TEGRA_MAX_PULL) | ||
| 501 | return -EINVAL; | ||
| 502 | |||
| 503 | spin_lock_irqsave(&mux_lock, flags); | ||
| 504 | |||
| 505 | reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 506 | reg &= ~(0x1f << 12); | ||
| 507 | reg |= pull_up << 12; | ||
| 508 | pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 509 | |||
| 510 | spin_unlock_irqrestore(&mux_lock, flags); | ||
| 511 | |||
| 512 | return 0; | ||
| 513 | } | ||
| 514 | |||
| 515 | static int tegra_drive_pinmux_set_slew_rising(int pg, | ||
| 516 | enum tegra_slew slew_rising) | ||
| 517 | { | ||
| 518 | unsigned long flags; | ||
| 519 | u32 reg; | ||
| 520 | if (pg < 0 || pg >= drive_max) | ||
| 521 | return -ERANGE; | ||
| 522 | |||
| 523 | if (slew_rising < 0 || slew_rising >= TEGRA_MAX_SLEW) | ||
| 524 | return -EINVAL; | ||
| 525 | |||
| 526 | spin_lock_irqsave(&mux_lock, flags); | ||
| 527 | |||
| 528 | reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 529 | reg &= ~(0x3 << 28); | ||
| 530 | reg |= slew_rising << 28; | ||
| 531 | pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 532 | |||
| 533 | spin_unlock_irqrestore(&mux_lock, flags); | ||
| 534 | |||
| 535 | return 0; | ||
| 536 | } | ||
| 537 | |||
| 538 | static int tegra_drive_pinmux_set_slew_falling(int pg, | ||
| 539 | enum tegra_slew slew_falling) | ||
| 540 | { | ||
| 541 | unsigned long flags; | ||
| 542 | u32 reg; | ||
| 543 | if (pg < 0 || pg >= drive_max) | ||
| 544 | return -ERANGE; | ||
| 545 | |||
| 546 | if (slew_falling < 0 || slew_falling >= TEGRA_MAX_SLEW) | ||
| 547 | return -EINVAL; | ||
| 548 | |||
| 549 | spin_lock_irqsave(&mux_lock, flags); | ||
| 550 | |||
| 551 | reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 552 | reg &= ~(0x3 << 30); | ||
| 553 | reg |= slew_falling << 30; | ||
| 554 | pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg); | ||
| 555 | |||
| 556 | spin_unlock_irqrestore(&mux_lock, flags); | ||
| 557 | |||
| 558 | return 0; | ||
| 559 | } | ||
| 560 | |||
| 561 | static void tegra_drive_pinmux_config_pingroup(int pingroup, | ||
| 562 | enum tegra_hsm hsm, | ||
| 563 | enum tegra_schmitt schmitt, | ||
| 564 | enum tegra_drive drive, | ||
| 565 | enum tegra_pull_strength pull_down, | ||
| 566 | enum tegra_pull_strength pull_up, | ||
| 567 | enum tegra_slew slew_rising, | ||
| 568 | enum tegra_slew slew_falling) | ||
| 569 | { | ||
| 570 | int err; | ||
| 571 | |||
| 572 | err = tegra_drive_pinmux_set_hsm(pingroup, hsm); | ||
| 573 | if (err < 0) | ||
| 574 | pr_err("pinmux: can't set pingroup %s hsm to %s: %d\n", | ||
| 575 | drive_pinmux_name(pingroup), | ||
| 576 | enable_name(hsm), err); | ||
| 577 | |||
| 578 | err = tegra_drive_pinmux_set_schmitt(pingroup, schmitt); | ||
| 579 | if (err < 0) | ||
| 580 | pr_err("pinmux: can't set pingroup %s schmitt to %s: %d\n", | ||
| 581 | drive_pinmux_name(pingroup), | ||
| 582 | enable_name(schmitt), err); | ||
| 583 | |||
| 584 | err = tegra_drive_pinmux_set_drive(pingroup, drive); | ||
| 585 | if (err < 0) | ||
| 586 | pr_err("pinmux: can't set pingroup %s drive to %s: %d\n", | ||
| 587 | drive_pinmux_name(pingroup), | ||
| 588 | drive_name(drive), err); | ||
| 589 | |||
| 590 | err = tegra_drive_pinmux_set_pull_down(pingroup, pull_down); | ||
| 591 | if (err < 0) | ||
| 592 | pr_err("pinmux: can't set pingroup %s pull down to %d: %d\n", | ||
| 593 | drive_pinmux_name(pingroup), | ||
| 594 | pull_down, err); | ||
| 595 | |||
| 596 | err = tegra_drive_pinmux_set_pull_up(pingroup, pull_up); | ||
| 597 | if (err < 0) | ||
| 598 | pr_err("pinmux: can't set pingroup %s pull up to %d: %d\n", | ||
| 599 | drive_pinmux_name(pingroup), | ||
| 600 | pull_up, err); | ||
| 601 | |||
| 602 | err = tegra_drive_pinmux_set_slew_rising(pingroup, slew_rising); | ||
| 603 | if (err < 0) | ||
| 604 | pr_err("pinmux: can't set pingroup %s rising slew to %s: %d\n", | ||
| 605 | drive_pinmux_name(pingroup), | ||
| 606 | slew_name(slew_rising), err); | ||
| 607 | |||
| 608 | err = tegra_drive_pinmux_set_slew_falling(pingroup, slew_falling); | ||
| 609 | if (err < 0) | ||
| 610 | pr_err("pinmux: can't set pingroup %s falling slew to %s: %d\n", | ||
| 611 | drive_pinmux_name(pingroup), | ||
| 612 | slew_name(slew_falling), err); | ||
| 613 | } | ||
| 614 | |||
| 615 | void tegra_drive_pinmux_config_table(struct tegra_drive_pingroup_config *config, | ||
| 616 | int len) | ||
| 617 | { | ||
| 618 | int i; | ||
| 619 | |||
| 620 | for (i = 0; i < len; i++) | ||
| 621 | tegra_drive_pinmux_config_pingroup(config[i].pingroup, | ||
| 622 | config[i].hsm, | ||
| 623 | config[i].schmitt, | ||
| 624 | config[i].drive, | ||
| 625 | config[i].pull_down, | ||
| 626 | config[i].pull_up, | ||
| 627 | config[i].slew_rising, | ||
| 628 | config[i].slew_falling); | ||
| 629 | } | ||
| 630 | |||
| 631 | void tegra_pinmux_set_safe_pinmux_table(const struct tegra_pingroup_config *config, | ||
| 632 | int len) | ||
| 633 | { | ||
| 634 | int i; | ||
| 635 | struct tegra_pingroup_config c; | ||
| 636 | |||
| 637 | for (i = 0; i < len; i++) { | ||
| 638 | int err; | ||
| 639 | c = config[i]; | ||
| 640 | if (c.pingroup < 0 || c.pingroup >= pingroup_max) { | ||
| 641 | WARN_ON(1); | ||
| 642 | continue; | ||
| 643 | } | ||
| 644 | c.func = pingroups[c.pingroup].func_safe; | ||
| 645 | err = tegra_pinmux_set_func(&c); | ||
| 646 | if (err < 0) | ||
| 647 | pr_err("%s: tegra_pinmux_set_func returned %d setting " | ||
| 648 | "%s to %s\n", __func__, err, | ||
| 649 | pingroup_name(c.pingroup), func_name(c.func)); | ||
| 650 | } | ||
| 651 | } | ||
| 652 | |||
| 653 | void tegra_pinmux_config_pinmux_table(const struct tegra_pingroup_config *config, | ||
| 654 | int len) | ||
| 655 | { | ||
| 656 | int i; | ||
| 657 | |||
| 658 | for (i = 0; i < len; i++) { | ||
| 659 | int err; | ||
| 660 | if (config[i].pingroup < 0 || | ||
| 661 | config[i].pingroup >= pingroup_max) { | ||
| 662 | WARN_ON(1); | ||
| 663 | continue; | ||
| 664 | } | ||
| 665 | err = tegra_pinmux_set_func(&config[i]); | ||
| 666 | if (err < 0) | ||
| 667 | pr_err("%s: tegra_pinmux_set_func returned %d setting " | ||
| 668 | "%s to %s\n", __func__, err, | ||
| 669 | pingroup_name(config[i].pingroup), | ||
| 670 | func_name(config[i].func)); | ||
| 671 | } | ||
| 672 | } | ||
| 673 | |||
| 674 | void tegra_pinmux_config_tristate_table(const struct tegra_pingroup_config *config, | ||
| 675 | int len, enum tegra_tristate tristate) | ||
| 676 | { | ||
| 677 | int i; | ||
| 678 | int err; | ||
| 679 | int pingroup; | ||
| 680 | |||
| 681 | for (i = 0; i < len; i++) { | ||
| 682 | pingroup = config[i].pingroup; | ||
| 683 | if (pingroups[pingroup].tri_reg >= 0) { | ||
| 684 | err = tegra_pinmux_set_tristate(pingroup, tristate); | ||
| 685 | if (err < 0) | ||
| 686 | pr_err("pinmux: can't set pingroup %s tristate" | ||
| 687 | " to %s: %d\n", pingroup_name(pingroup), | ||
| 688 | tri_name(tristate), err); | ||
| 689 | } | ||
| 690 | } | ||
| 691 | } | ||
| 692 | |||
| 693 | void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *config, | ||
| 694 | int len, enum tegra_pullupdown pupd) | ||
| 695 | { | ||
| 696 | int i; | ||
| 697 | int err; | ||
| 698 | int pingroup; | ||
| 699 | |||
| 700 | for (i = 0; i < len; i++) { | ||
| 701 | pingroup = config[i].pingroup; | ||
| 702 | if (pingroups[pingroup].pupd_reg >= 0) { | ||
| 703 | err = tegra_pinmux_set_pullupdown(pingroup, pupd); | ||
| 704 | if (err < 0) | ||
| 705 | pr_err("pinmux: can't set pingroup %s pullupdown" | ||
| 706 | " to %s: %d\n", pingroup_name(pingroup), | ||
| 707 | pupd_name(pupd), err); | ||
| 708 | } | ||
| 709 | } | ||
| 710 | } | ||
| 711 | |||
| 712 | static struct of_device_id tegra_pinmux_of_match[] __devinitdata = { | ||
| 713 | #ifdef CONFIG_ARCH_TEGRA_2x_SOC | ||
| 714 | { .compatible = "nvidia,tegra20-pinmux", tegra20_pinmux_init }, | ||
| 715 | #endif | ||
| 716 | #ifdef CONFIG_ARCH_TEGRA_3x_SOC | ||
| 717 | { .compatible = "nvidia,tegra30-pinmux", tegra30_pinmux_init }, | ||
| 718 | #endif | ||
| 719 | { }, | ||
| 720 | }; | ||
| 721 | |||
| 722 | static int __devinit tegra_pinmux_probe(struct platform_device *pdev) | ||
| 723 | { | ||
| 724 | struct resource *res; | ||
| 725 | int i; | ||
| 726 | int config_bad = 0; | ||
| 727 | const struct of_device_id *match; | ||
| 728 | |||
| 729 | match = of_match_device(tegra_pinmux_of_match, &pdev->dev); | ||
| 730 | |||
| 731 | if (match) | ||
| 732 | ((pinmux_init)(match->data))(&pingroups, &pingroup_max, | ||
| 733 | &drive_pingroups, &drive_max); | ||
| 734 | #ifdef CONFIG_ARCH_TEGRA_2x_SOC | ||
| 735 | else | ||
| 736 | /* no device tree available, so we must be on tegra20 */ | ||
| 737 | tegra20_pinmux_init(&pingroups, &pingroup_max, | ||
| 738 | &drive_pingroups, &drive_max); | ||
| 739 | #else | ||
| 740 | pr_warn("non Tegra20 platform requires pinmux devicetree node\n"); | ||
| 741 | #endif | ||
| 742 | |||
| 743 | for (i = 0; ; i++) { | ||
| 744 | res = platform_get_resource(pdev, IORESOURCE_MEM, i); | ||
| 745 | if (!res) | ||
| 746 | break; | ||
| 747 | } | ||
| 748 | nbanks = i; | ||
| 749 | |||
| 750 | for (i = 0; i < pingroup_max; i++) { | ||
| 751 | if (pingroups[i].tri_bank >= nbanks) { | ||
| 752 | dev_err(&pdev->dev, "pingroup %d: bad tri_bank\n", i); | ||
| 753 | config_bad = 1; | ||
| 754 | } | ||
| 755 | |||
| 756 | if (pingroups[i].mux_bank >= nbanks) { | ||
| 757 | dev_err(&pdev->dev, "pingroup %d: bad mux_bank\n", i); | ||
| 758 | config_bad = 1; | ||
| 759 | } | ||
| 760 | |||
| 761 | if (pingroups[i].pupd_bank >= nbanks) { | ||
| 762 | dev_err(&pdev->dev, "pingroup %d: bad pupd_bank\n", i); | ||
| 763 | config_bad = 1; | ||
| 764 | } | ||
| 765 | } | ||
| 766 | |||
| 767 | for (i = 0; i < drive_max; i++) { | ||
| 768 | if (drive_pingroups[i].reg_bank >= nbanks) { | ||
| 769 | dev_err(&pdev->dev, | ||
| 770 | "drive pingroup %d: bad reg_bank\n", i); | ||
| 771 | config_bad = 1; | ||
| 772 | } | ||
| 773 | } | ||
| 774 | |||
| 775 | if (config_bad) | ||
| 776 | return -ENODEV; | ||
| 777 | |||
| 778 | regs = devm_kzalloc(&pdev->dev, nbanks * sizeof(*regs), GFP_KERNEL); | ||
| 779 | if (!regs) { | ||
| 780 | dev_err(&pdev->dev, "Can't alloc regs pointer\n"); | ||
| 781 | return -ENODEV; | ||
| 782 | } | ||
| 783 | |||
| 784 | for (i = 0; i < nbanks; i++) { | ||
| 785 | res = platform_get_resource(pdev, IORESOURCE_MEM, i); | ||
| 786 | if (!res) { | ||
| 787 | dev_err(&pdev->dev, "Missing MEM resource\n"); | ||
| 788 | return -ENODEV; | ||
| 789 | } | ||
| 790 | |||
| 791 | if (!devm_request_mem_region(&pdev->dev, res->start, | ||
| 792 | resource_size(res), | ||
| 793 | dev_name(&pdev->dev))) { | ||
| 794 | dev_err(&pdev->dev, | ||
| 795 | "Couldn't request MEM resource %d\n", i); | ||
| 796 | return -ENODEV; | ||
| 797 | } | ||
| 798 | |||
| 799 | regs[i] = devm_ioremap(&pdev->dev, res->start, | ||
| 800 | resource_size(res)); | ||
| 801 | if (!regs) { | ||
| 802 | dev_err(&pdev->dev, "Couldn't ioremap regs %d\n", i); | ||
| 803 | return -ENODEV; | ||
| 804 | } | ||
| 805 | } | ||
| 806 | |||
| 807 | return 0; | ||
| 808 | } | ||
| 809 | |||
| 810 | static struct platform_driver tegra_pinmux_driver = { | ||
| 811 | .driver = { | ||
| 812 | .name = "tegra-pinmux", | ||
| 813 | .owner = THIS_MODULE, | ||
| 814 | .of_match_table = tegra_pinmux_of_match, | ||
| 815 | }, | ||
| 816 | .probe = tegra_pinmux_probe, | ||
| 817 | }; | ||
| 818 | |||
| 819 | static int __init tegra_pinmux_init(void) | ||
| 820 | { | ||
| 821 | return platform_driver_register(&tegra_pinmux_driver); | ||
| 822 | } | ||
| 823 | postcore_initcall(tegra_pinmux_init); | ||
| 824 | |||
| 825 | #ifdef CONFIG_DEBUG_FS | ||
| 826 | |||
| 827 | #include <linux/debugfs.h> | ||
| 828 | #include <linux/seq_file.h> | ||
| 829 | |||
| 830 | static void dbg_pad_field(struct seq_file *s, int len) | ||
| 831 | { | ||
| 832 | seq_putc(s, ','); | ||
| 833 | |||
| 834 | while (len-- > -1) | ||
| 835 | seq_putc(s, ' '); | ||
| 836 | } | ||
| 837 | |||
| 838 | static int dbg_pinmux_show(struct seq_file *s, void *unused) | ||
| 839 | { | ||
| 840 | int i; | ||
| 841 | int len; | ||
| 842 | |||
| 843 | for (i = 0; i < pingroup_max; i++) { | ||
| 844 | unsigned long reg; | ||
| 845 | unsigned long tri; | ||
| 846 | unsigned long mux; | ||
| 847 | unsigned long pupd; | ||
| 848 | |||
| 849 | seq_printf(s, "\t{TEGRA_PINGROUP_%s", pingroups[i].name); | ||
| 850 | len = strlen(pingroups[i].name); | ||
| 851 | dbg_pad_field(s, 5 - len); | ||
| 852 | |||
| 853 | if (pingroups[i].mux_reg < 0) { | ||
| 854 | seq_printf(s, "TEGRA_MUX_NONE"); | ||
| 855 | len = strlen("NONE"); | ||
| 856 | } else { | ||
| 857 | reg = pg_readl(pingroups[i].mux_bank, | ||
| 858 | pingroups[i].mux_reg); | ||
| 859 | mux = (reg >> pingroups[i].mux_bit) & 0x3; | ||
| 860 | if (pingroups[i].funcs[mux] == TEGRA_MUX_RSVD) { | ||
| 861 | seq_printf(s, "TEGRA_MUX_RSVD%1lu", mux+1); | ||
| 862 | len = 5; | ||
| 863 | } else { | ||
| 864 | seq_printf(s, "TEGRA_MUX_%s", | ||
| 865 | tegra_mux_names[pingroups[i].funcs[mux]]); | ||
| 866 | len = strlen(tegra_mux_names[pingroups[i].funcs[mux]]); | ||
| 867 | } | ||
| 868 | } | ||
| 869 | dbg_pad_field(s, 13-len); | ||
| 870 | |||
| 871 | if (pingroups[i].pupd_reg < 0) { | ||
| 872 | seq_printf(s, "TEGRA_PUPD_NORMAL"); | ||
| 873 | len = strlen("NORMAL"); | ||
| 874 | } else { | ||
| 875 | reg = pg_readl(pingroups[i].pupd_bank, | ||
| 876 | pingroups[i].pupd_reg); | ||
| 877 | pupd = (reg >> pingroups[i].pupd_bit) & 0x3; | ||
| 878 | seq_printf(s, "TEGRA_PUPD_%s", pupd_name(pupd)); | ||
| 879 | len = strlen(pupd_name(pupd)); | ||
| 880 | } | ||
| 881 | dbg_pad_field(s, 9 - len); | ||
| 882 | |||
| 883 | if (pingroups[i].tri_reg < 0) { | ||
| 884 | seq_printf(s, "TEGRA_TRI_NORMAL"); | ||
| 885 | } else { | ||
| 886 | reg = pg_readl(pingroups[i].tri_bank, | ||
| 887 | pingroups[i].tri_reg); | ||
| 888 | tri = (reg >> pingroups[i].tri_bit) & 0x1; | ||
| 889 | |||
| 890 | seq_printf(s, "TEGRA_TRI_%s", tri_name(tri)); | ||
| 891 | } | ||
| 892 | seq_printf(s, "},\n"); | ||
| 893 | } | ||
| 894 | return 0; | ||
| 895 | } | ||
| 896 | |||
| 897 | static int dbg_pinmux_open(struct inode *inode, struct file *file) | ||
| 898 | { | ||
| 899 | return single_open(file, dbg_pinmux_show, &inode->i_private); | ||
| 900 | } | ||
| 901 | |||
| 902 | static const struct file_operations debug_fops = { | ||
| 903 | .open = dbg_pinmux_open, | ||
| 904 | .read = seq_read, | ||
| 905 | .llseek = seq_lseek, | ||
| 906 | .release = single_release, | ||
| 907 | }; | ||
| 908 | |||
| 909 | static int dbg_drive_pinmux_show(struct seq_file *s, void *unused) | ||
| 910 | { | ||
| 911 | int i; | ||
| 912 | int len; | ||
| 913 | |||
| 914 | for (i = 0; i < drive_max; i++) { | ||
| 915 | u32 reg; | ||
| 916 | |||
| 917 | seq_printf(s, "\t{TEGRA_DRIVE_PINGROUP_%s", | ||
| 918 | drive_pingroups[i].name); | ||
| 919 | len = strlen(drive_pingroups[i].name); | ||
| 920 | dbg_pad_field(s, 7 - len); | ||
| 921 | |||
| 922 | |||
| 923 | reg = pg_readl(drive_pingroups[i].reg_bank, | ||
| 924 | drive_pingroups[i].reg); | ||
| 925 | if (HSM_EN(reg)) { | ||
| 926 | seq_printf(s, "TEGRA_HSM_ENABLE"); | ||
| 927 | len = 16; | ||
| 928 | } else { | ||
| 929 | seq_printf(s, "TEGRA_HSM_DISABLE"); | ||
| 930 | len = 17; | ||
| 931 | } | ||
| 932 | dbg_pad_field(s, 17 - len); | ||
| 933 | |||
| 934 | if (SCHMT_EN(reg)) { | ||
| 935 | seq_printf(s, "TEGRA_SCHMITT_ENABLE"); | ||
| 936 | len = 21; | ||
| 937 | } else { | ||
| 938 | seq_printf(s, "TEGRA_SCHMITT_DISABLE"); | ||
| 939 | len = 22; | ||
| 940 | } | ||
| 941 | dbg_pad_field(s, 22 - len); | ||
| 942 | |||
| 943 | seq_printf(s, "TEGRA_DRIVE_%s", drive_name(LPMD(reg))); | ||
| 944 | len = strlen(drive_name(LPMD(reg))); | ||
| 945 | dbg_pad_field(s, 5 - len); | ||
| 946 | |||
| 947 | seq_printf(s, "TEGRA_PULL_%d", DRVDN(reg)); | ||
| 948 | len = DRVDN(reg) < 10 ? 1 : 2; | ||
| 949 | dbg_pad_field(s, 2 - len); | ||
| 950 | |||
| 951 | seq_printf(s, "TEGRA_PULL_%d", DRVUP(reg)); | ||
| 952 | len = DRVUP(reg) < 10 ? 1 : 2; | ||
| 953 | dbg_pad_field(s, 2 - len); | ||
| 954 | |||
| 955 | seq_printf(s, "TEGRA_SLEW_%s", slew_name(SLWR(reg))); | ||
| 956 | len = strlen(slew_name(SLWR(reg))); | ||
| 957 | dbg_pad_field(s, 7 - len); | ||
| 958 | |||
| 959 | seq_printf(s, "TEGRA_SLEW_%s", slew_name(SLWF(reg))); | ||
| 960 | |||
| 961 | seq_printf(s, "},\n"); | ||
| 962 | } | ||
| 963 | return 0; | ||
| 964 | } | ||
| 965 | |||
| 966 | static int dbg_drive_pinmux_open(struct inode *inode, struct file *file) | ||
| 967 | { | ||
| 968 | return single_open(file, dbg_drive_pinmux_show, &inode->i_private); | ||
| 969 | } | ||
| 970 | |||
| 971 | static const struct file_operations debug_drive_fops = { | ||
| 972 | .open = dbg_drive_pinmux_open, | ||
| 973 | .read = seq_read, | ||
| 974 | .llseek = seq_lseek, | ||
| 975 | .release = single_release, | ||
| 976 | }; | ||
| 977 | |||
| 978 | static int __init tegra_pinmux_debuginit(void) | ||
| 979 | { | ||
| 980 | (void) debugfs_create_file("tegra_pinmux", S_IRUGO, | ||
| 981 | NULL, NULL, &debug_fops); | ||
| 982 | (void) debugfs_create_file("tegra_pinmux_drive", S_IRUGO, | ||
| 983 | NULL, NULL, &debug_drive_fops); | ||
| 984 | return 0; | ||
| 985 | } | ||
| 986 | late_initcall(tegra_pinmux_debuginit); | ||
| 987 | #endif | ||
diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/tegra2_clocks.c index 592a4eeb5328..a357ad2a8cf7 100644 --- a/arch/arm/mach-tegra/tegra2_clocks.c +++ b/arch/arm/mach-tegra/tegra2_clocks.c | |||
| @@ -1486,6 +1486,10 @@ static struct clk tegra_clk_m = { | |||
| 1486 | }; | 1486 | }; |
| 1487 | 1487 | ||
| 1488 | static struct clk_pll_freq_table tegra_pll_c_freq_table[] = { | 1488 | static struct clk_pll_freq_table tegra_pll_c_freq_table[] = { |
| 1489 | { 12000000, 600000000, 600, 12, 1, 8 }, | ||
| 1490 | { 13000000, 600000000, 600, 13, 1, 8 }, | ||
| 1491 | { 19200000, 600000000, 500, 16, 1, 6 }, | ||
| 1492 | { 26000000, 600000000, 600, 26, 1, 8 }, | ||
| 1489 | { 0, 0, 0, 0, 0, 0 }, | 1493 | { 0, 0, 0, 0, 0, 0 }, |
| 1490 | }; | 1494 | }; |
| 1491 | 1495 | ||
diff --git a/arch/arm/mach-tegra/usb_phy.c b/arch/arm/mach-tegra/usb_phy.c index c5b2ac04e2a0..54e353c8e304 100644 --- a/arch/arm/mach-tegra/usb_phy.c +++ b/arch/arm/mach-tegra/usb_phy.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
| 27 | #include <linux/io.h> | 27 | #include <linux/io.h> |
| 28 | #include <linux/gpio.h> | 28 | #include <linux/gpio.h> |
| 29 | #include <linux/of_gpio.h> | ||
| 29 | #include <linux/usb/otg.h> | 30 | #include <linux/usb/otg.h> |
| 30 | #include <linux/usb/ulpi.h> | 31 | #include <linux/usb/ulpi.h> |
| 31 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
| @@ -654,8 +655,8 @@ static void ulpi_phy_power_off(struct tegra_usb_phy *phy) | |||
| 654 | clk_disable(phy->clk); | 655 | clk_disable(phy->clk); |
| 655 | } | 656 | } |
| 656 | 657 | ||
| 657 | struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, | 658 | struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance, |
| 658 | void *config, enum tegra_usb_phy_mode phy_mode) | 659 | void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode) |
| 659 | { | 660 | { |
| 660 | struct tegra_usb_phy *phy; | 661 | struct tegra_usb_phy *phy; |
| 661 | struct tegra_ulpi_config *ulpi_config; | 662 | struct tegra_ulpi_config *ulpi_config; |
| @@ -711,7 +712,16 @@ struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, | |||
| 711 | err = -ENXIO; | 712 | err = -ENXIO; |
| 712 | goto err1; | 713 | goto err1; |
| 713 | } | 714 | } |
| 714 | tegra_gpio_enable(ulpi_config->reset_gpio); | 715 | if (!gpio_is_valid(ulpi_config->reset_gpio)) |
| 716 | ulpi_config->reset_gpio = | ||
| 717 | of_get_named_gpio(dev->of_node, | ||
| 718 | "nvidia,phy-reset-gpio", 0); | ||
| 719 | if (!gpio_is_valid(ulpi_config->reset_gpio)) { | ||
| 720 | pr_err("%s: invalid reset gpio: %d\n", __func__, | ||
| 721 | ulpi_config->reset_gpio); | ||
| 722 | err = -EINVAL; | ||
| 723 | goto err1; | ||
| 724 | } | ||
| 715 | gpio_request(ulpi_config->reset_gpio, "ulpi_phy_reset_b"); | 725 | gpio_request(ulpi_config->reset_gpio, "ulpi_phy_reset_b"); |
| 716 | gpio_direction_output(ulpi_config->reset_gpio, 0); | 726 | gpio_direction_output(ulpi_config->reset_gpio, 0); |
| 717 | phy->ulpi = otg_ulpi_create(&ulpi_viewport_access_ops, 0); | 727 | phy->ulpi = otg_ulpi_create(&ulpi_viewport_access_ops, 0); |
diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c index 12f349b3830d..dc5184d57892 100644 --- a/drivers/gpio/gpio-tegra.c +++ b/drivers/gpio/gpio-tegra.c | |||
| @@ -26,10 +26,10 @@ | |||
| 26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
| 27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
| 28 | #include <linux/irqdomain.h> | 28 | #include <linux/irqdomain.h> |
| 29 | #include <linux/pinctrl/consumer.h> | ||
| 29 | 30 | ||
| 30 | #include <asm/mach/irq.h> | 31 | #include <asm/mach/irq.h> |
| 31 | 32 | ||
| 32 | #include <mach/gpio-tegra.h> | ||
| 33 | #include <mach/iomap.h> | 33 | #include <mach/iomap.h> |
| 34 | #include <mach/suspend.h> | 34 | #include <mach/suspend.h> |
| 35 | 35 | ||
| @@ -108,18 +108,29 @@ static void tegra_gpio_mask_write(u32 reg, int gpio, int value) | |||
| 108 | tegra_gpio_writel(val, reg); | 108 | tegra_gpio_writel(val, reg); |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | void tegra_gpio_enable(int gpio) | 111 | static void tegra_gpio_enable(int gpio) |
| 112 | { | 112 | { |
| 113 | tegra_gpio_mask_write(GPIO_MSK_CNF(gpio), gpio, 1); | 113 | tegra_gpio_mask_write(GPIO_MSK_CNF(gpio), gpio, 1); |
| 114 | } | 114 | } |
| 115 | EXPORT_SYMBOL_GPL(tegra_gpio_enable); | 115 | EXPORT_SYMBOL_GPL(tegra_gpio_enable); |
| 116 | 116 | ||
| 117 | void tegra_gpio_disable(int gpio) | 117 | static void tegra_gpio_disable(int gpio) |
| 118 | { | 118 | { |
| 119 | tegra_gpio_mask_write(GPIO_MSK_CNF(gpio), gpio, 0); | 119 | tegra_gpio_mask_write(GPIO_MSK_CNF(gpio), gpio, 0); |
| 120 | } | 120 | } |
| 121 | EXPORT_SYMBOL_GPL(tegra_gpio_disable); | 121 | EXPORT_SYMBOL_GPL(tegra_gpio_disable); |
| 122 | 122 | ||
| 123 | int tegra_gpio_request(struct gpio_chip *chip, unsigned offset) | ||
| 124 | { | ||
| 125 | return pinctrl_request_gpio(offset); | ||
| 126 | } | ||
| 127 | |||
| 128 | void tegra_gpio_free(struct gpio_chip *chip, unsigned offset) | ||
| 129 | { | ||
| 130 | pinctrl_free_gpio(offset); | ||
| 131 | tegra_gpio_disable(offset); | ||
| 132 | } | ||
| 133 | |||
| 123 | static void tegra_gpio_set(struct gpio_chip *chip, unsigned offset, int value) | 134 | static void tegra_gpio_set(struct gpio_chip *chip, unsigned offset, int value) |
| 124 | { | 135 | { |
| 125 | tegra_gpio_mask_write(GPIO_MSK_OUT(offset), offset, value); | 136 | tegra_gpio_mask_write(GPIO_MSK_OUT(offset), offset, value); |
| @@ -133,6 +144,7 @@ static int tegra_gpio_get(struct gpio_chip *chip, unsigned offset) | |||
| 133 | static int tegra_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | 144 | static int tegra_gpio_direction_input(struct gpio_chip *chip, unsigned offset) |
| 134 | { | 145 | { |
| 135 | tegra_gpio_mask_write(GPIO_MSK_OE(offset), offset, 0); | 146 | tegra_gpio_mask_write(GPIO_MSK_OE(offset), offset, 0); |
| 147 | tegra_gpio_enable(offset); | ||
| 136 | return 0; | 148 | return 0; |
| 137 | } | 149 | } |
| 138 | 150 | ||
| @@ -141,6 +153,7 @@ static int tegra_gpio_direction_output(struct gpio_chip *chip, unsigned offset, | |||
| 141 | { | 153 | { |
| 142 | tegra_gpio_set(chip, offset, value); | 154 | tegra_gpio_set(chip, offset, value); |
| 143 | tegra_gpio_mask_write(GPIO_MSK_OE(offset), offset, 1); | 155 | tegra_gpio_mask_write(GPIO_MSK_OE(offset), offset, 1); |
| 156 | tegra_gpio_enable(offset); | ||
| 144 | return 0; | 157 | return 0; |
| 145 | } | 158 | } |
| 146 | 159 | ||
| @@ -151,13 +164,14 @@ static int tegra_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | |||
| 151 | 164 | ||
| 152 | static struct gpio_chip tegra_gpio_chip = { | 165 | static struct gpio_chip tegra_gpio_chip = { |
| 153 | .label = "tegra-gpio", | 166 | .label = "tegra-gpio", |
| 167 | .request = tegra_gpio_request, | ||
| 168 | .free = tegra_gpio_free, | ||
| 154 | .direction_input = tegra_gpio_direction_input, | 169 | .direction_input = tegra_gpio_direction_input, |
| 155 | .get = tegra_gpio_get, | 170 | .get = tegra_gpio_get, |
| 156 | .direction_output = tegra_gpio_direction_output, | 171 | .direction_output = tegra_gpio_direction_output, |
| 157 | .set = tegra_gpio_set, | 172 | .set = tegra_gpio_set, |
| 158 | .to_irq = tegra_gpio_to_irq, | 173 | .to_irq = tegra_gpio_to_irq, |
| 159 | .base = 0, | 174 | .base = 0, |
| 160 | .ngpio = TEGRA_NR_GPIOS, | ||
| 161 | }; | 175 | }; |
| 162 | 176 | ||
| 163 | static void tegra_gpio_irq_ack(struct irq_data *d) | 177 | static void tegra_gpio_irq_ack(struct irq_data *d) |
| @@ -224,6 +238,9 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type) | |||
| 224 | 238 | ||
| 225 | spin_unlock_irqrestore(&bank->lvl_lock[port], flags); | 239 | spin_unlock_irqrestore(&bank->lvl_lock[port], flags); |
| 226 | 240 | ||
| 241 | tegra_gpio_mask_write(GPIO_MSK_OE(gpio), gpio, 0); | ||
| 242 | tegra_gpio_enable(gpio); | ||
| 243 | |||
| 227 | if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) | 244 | if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) |
| 228 | __irq_set_handler_locked(d->irq, handle_level_irq); | 245 | __irq_set_handler_locked(d->irq, handle_level_irq); |
| 229 | else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) | 246 | else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) |
| @@ -490,20 +507,6 @@ static int __init tegra_gpio_init(void) | |||
| 490 | } | 507 | } |
| 491 | postcore_initcall(tegra_gpio_init); | 508 | postcore_initcall(tegra_gpio_init); |
| 492 | 509 | ||
| 493 | void tegra_gpio_config(struct tegra_gpio_table *table, int num) | ||
| 494 | { | ||
| 495 | int i; | ||
| 496 | |||
| 497 | for (i = 0; i < num; i++) { | ||
| 498 | int gpio = table[i].gpio; | ||
| 499 | |||
| 500 | if (table[i].enable) | ||
| 501 | tegra_gpio_enable(gpio); | ||
| 502 | else | ||
| 503 | tegra_gpio_disable(gpio); | ||
| 504 | } | ||
| 505 | } | ||
| 506 | |||
| 507 | #ifdef CONFIG_DEBUG_FS | 510 | #ifdef CONFIG_DEBUG_FS |
| 508 | 511 | ||
| 509 | #include <linux/debugfs.h> | 512 | #include <linux/debugfs.h> |
diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index 53b26502f6e2..ff5a16991939 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c | |||
| @@ -269,7 +269,6 @@ static int __devinit sdhci_tegra_probe(struct platform_device *pdev) | |||
| 269 | "failed to allocate power gpio\n"); | 269 | "failed to allocate power gpio\n"); |
| 270 | goto err_power_req; | 270 | goto err_power_req; |
| 271 | } | 271 | } |
| 272 | tegra_gpio_enable(plat->power_gpio); | ||
| 273 | gpio_direction_output(plat->power_gpio, 1); | 272 | gpio_direction_output(plat->power_gpio, 1); |
| 274 | } | 273 | } |
| 275 | 274 | ||
| @@ -280,7 +279,6 @@ static int __devinit sdhci_tegra_probe(struct platform_device *pdev) | |||
| 280 | "failed to allocate cd gpio\n"); | 279 | "failed to allocate cd gpio\n"); |
| 281 | goto err_cd_req; | 280 | goto err_cd_req; |
| 282 | } | 281 | } |
| 283 | tegra_gpio_enable(plat->cd_gpio); | ||
| 284 | gpio_direction_input(plat->cd_gpio); | 282 | gpio_direction_input(plat->cd_gpio); |
| 285 | 283 | ||
| 286 | rc = request_irq(gpio_to_irq(plat->cd_gpio), carddetect_irq, | 284 | rc = request_irq(gpio_to_irq(plat->cd_gpio), carddetect_irq, |
| @@ -301,7 +299,6 @@ static int __devinit sdhci_tegra_probe(struct platform_device *pdev) | |||
| 301 | "failed to allocate wp gpio\n"); | 299 | "failed to allocate wp gpio\n"); |
| 302 | goto err_wp_req; | 300 | goto err_wp_req; |
| 303 | } | 301 | } |
| 304 | tegra_gpio_enable(plat->wp_gpio); | ||
| 305 | gpio_direction_input(plat->wp_gpio); | 302 | gpio_direction_input(plat->wp_gpio); |
| 306 | } | 303 | } |
| 307 | 304 | ||
| @@ -329,23 +326,17 @@ err_add_host: | |||
| 329 | clk_disable(pltfm_host->clk); | 326 | clk_disable(pltfm_host->clk); |
| 330 | clk_put(pltfm_host->clk); | 327 | clk_put(pltfm_host->clk); |
| 331 | err_clk_get: | 328 | err_clk_get: |
| 332 | if (gpio_is_valid(plat->wp_gpio)) { | 329 | if (gpio_is_valid(plat->wp_gpio)) |
| 333 | tegra_gpio_disable(plat->wp_gpio); | ||
| 334 | gpio_free(plat->wp_gpio); | 330 | gpio_free(plat->wp_gpio); |
| 335 | } | ||
| 336 | err_wp_req: | 331 | err_wp_req: |
| 337 | if (gpio_is_valid(plat->cd_gpio)) | 332 | if (gpio_is_valid(plat->cd_gpio)) |
| 338 | free_irq(gpio_to_irq(plat->cd_gpio), host); | 333 | free_irq(gpio_to_irq(plat->cd_gpio), host); |
| 339 | err_cd_irq_req: | 334 | err_cd_irq_req: |
| 340 | if (gpio_is_valid(plat->cd_gpio)) { | 335 | if (gpio_is_valid(plat->cd_gpio)) |
| 341 | tegra_gpio_disable(plat->cd_gpio); | ||
| 342 | gpio_free(plat->cd_gpio); | 336 | gpio_free(plat->cd_gpio); |
| 343 | } | ||
| 344 | err_cd_req: | 337 | err_cd_req: |
| 345 | if (gpio_is_valid(plat->power_gpio)) { | 338 | if (gpio_is_valid(plat->power_gpio)) |
| 346 | tegra_gpio_disable(plat->power_gpio); | ||
| 347 | gpio_free(plat->power_gpio); | 339 | gpio_free(plat->power_gpio); |
| 348 | } | ||
| 349 | err_power_req: | 340 | err_power_req: |
| 350 | err_no_plat: | 341 | err_no_plat: |
| 351 | sdhci_pltfm_free(pdev); | 342 | sdhci_pltfm_free(pdev); |
| @@ -362,21 +353,16 @@ static int __devexit sdhci_tegra_remove(struct platform_device *pdev) | |||
| 362 | 353 | ||
| 363 | sdhci_remove_host(host, dead); | 354 | sdhci_remove_host(host, dead); |
| 364 | 355 | ||
| 365 | if (gpio_is_valid(plat->wp_gpio)) { | 356 | if (gpio_is_valid(plat->wp_gpio)) |
| 366 | tegra_gpio_disable(plat->wp_gpio); | ||
| 367 | gpio_free(plat->wp_gpio); | 357 | gpio_free(plat->wp_gpio); |
| 368 | } | ||
| 369 | 358 | ||
| 370 | if (gpio_is_valid(plat->cd_gpio)) { | 359 | if (gpio_is_valid(plat->cd_gpio)) { |
| 371 | free_irq(gpio_to_irq(plat->cd_gpio), host); | 360 | free_irq(gpio_to_irq(plat->cd_gpio), host); |
| 372 | tegra_gpio_disable(plat->cd_gpio); | ||
| 373 | gpio_free(plat->cd_gpio); | 361 | gpio_free(plat->cd_gpio); |
| 374 | } | 362 | } |
| 375 | 363 | ||
| 376 | if (gpio_is_valid(plat->power_gpio)) { | 364 | if (gpio_is_valid(plat->power_gpio)) |
| 377 | tegra_gpio_disable(plat->power_gpio); | ||
| 378 | gpio_free(plat->power_gpio); | 365 | gpio_free(plat->power_gpio); |
| 379 | } | ||
| 380 | 366 | ||
| 381 | clk_disable(pltfm_host->clk); | 367 | clk_disable(pltfm_host->clk); |
| 382 | clk_put(pltfm_host->clk); | 368 | clk_put(pltfm_host->clk); |
diff --git a/drivers/of/base.c b/drivers/of/base.c index 580644986945..d9bfd49b1935 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c | |||
| @@ -1260,3 +1260,44 @@ int of_alias_get_id(struct device_node *np, const char *stem) | |||
| 1260 | return id; | 1260 | return id; |
| 1261 | } | 1261 | } |
| 1262 | EXPORT_SYMBOL_GPL(of_alias_get_id); | 1262 | EXPORT_SYMBOL_GPL(of_alias_get_id); |
| 1263 | |||
| 1264 | const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur, | ||
| 1265 | u32 *pu) | ||
| 1266 | { | ||
| 1267 | const void *curv = cur; | ||
| 1268 | |||
| 1269 | if (!prop) | ||
| 1270 | return NULL; | ||
| 1271 | |||
| 1272 | if (!cur) { | ||
| 1273 | curv = prop->value; | ||
| 1274 | goto out_val; | ||
| 1275 | } | ||
| 1276 | |||
| 1277 | curv += sizeof(*cur); | ||
| 1278 | if (curv >= prop->value + prop->length) | ||
| 1279 | return NULL; | ||
| 1280 | |||
| 1281 | out_val: | ||
| 1282 | *pu = be32_to_cpup(curv); | ||
| 1283 | return curv; | ||
| 1284 | } | ||
| 1285 | EXPORT_SYMBOL_GPL(of_prop_next_u32); | ||
| 1286 | |||
| 1287 | const char *of_prop_next_string(struct property *prop, const char *cur) | ||
| 1288 | { | ||
| 1289 | const void *curv = cur; | ||
| 1290 | |||
| 1291 | if (!prop) | ||
| 1292 | return NULL; | ||
| 1293 | |||
| 1294 | if (!cur) | ||
| 1295 | return prop->value; | ||
| 1296 | |||
| 1297 | curv += strlen(cur) + 1; | ||
| 1298 | if (curv >= prop->value + prop->length) | ||
| 1299 | return NULL; | ||
| 1300 | |||
| 1301 | return curv; | ||
| 1302 | } | ||
| 1303 | EXPORT_SYMBOL_GPL(of_prop_next_string); | ||
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index abfb96408779..f73a5ea89754 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | 4 | ||
| 5 | config PINCTRL | 5 | config PINCTRL |
| 6 | bool | 6 | bool |
| 7 | depends on EXPERIMENTAL | ||
| 8 | 7 | ||
| 9 | if PINCTRL | 8 | if PINCTRL |
| 10 | 9 | ||
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile index 6d4150b4eced..8e3c95a02fbd 100644 --- a/drivers/pinctrl/Makefile +++ b/drivers/pinctrl/Makefile | |||
| @@ -5,6 +5,9 @@ ccflags-$(CONFIG_DEBUG_PINCTRL) += -DDEBUG | |||
| 5 | obj-$(CONFIG_PINCTRL) += core.o | 5 | obj-$(CONFIG_PINCTRL) += core.o |
| 6 | obj-$(CONFIG_PINMUX) += pinmux.o | 6 | obj-$(CONFIG_PINMUX) += pinmux.o |
| 7 | obj-$(CONFIG_PINCONF) += pinconf.o | 7 | obj-$(CONFIG_PINCONF) += pinconf.o |
| 8 | ifeq ($(CONFIG_OF),y) | ||
| 9 | obj-$(CONFIG_PINCTRL) += devicetree.o | ||
| 10 | endif | ||
| 8 | obj-$(CONFIG_GENERIC_PINCONF) += pinconf-generic.o | 11 | obj-$(CONFIG_GENERIC_PINCONF) += pinconf-generic.o |
| 9 | obj-$(CONFIG_PINCTRL_PXA3xx) += pinctrl-pxa3xx.o | 12 | obj-$(CONFIG_PINCTRL_PXA3xx) += pinctrl-pxa3xx.o |
| 10 | obj-$(CONFIG_PINCTRL_MMP2) += pinctrl-mmp2.o | 13 | obj-$(CONFIG_PINCTRL_MMP2) += pinctrl-mmp2.o |
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index df6296c5f47b..5cd5a5a3a403 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
| @@ -23,9 +23,11 @@ | |||
| 23 | #include <linux/sysfs.h> | 23 | #include <linux/sysfs.h> |
| 24 | #include <linux/debugfs.h> | 24 | #include <linux/debugfs.h> |
| 25 | #include <linux/seq_file.h> | 25 | #include <linux/seq_file.h> |
| 26 | #include <linux/pinctrl/consumer.h> | ||
| 26 | #include <linux/pinctrl/pinctrl.h> | 27 | #include <linux/pinctrl/pinctrl.h> |
| 27 | #include <linux/pinctrl/machine.h> | 28 | #include <linux/pinctrl/machine.h> |
| 28 | #include "core.h" | 29 | #include "core.h" |
| 30 | #include "devicetree.h" | ||
| 29 | #include "pinmux.h" | 31 | #include "pinmux.h" |
| 30 | #include "pinconf.h" | 32 | #include "pinconf.h" |
| 31 | 33 | ||
| @@ -45,7 +47,7 @@ struct pinctrl_maps { | |||
| 45 | DEFINE_MUTEX(pinctrl_mutex); | 47 | DEFINE_MUTEX(pinctrl_mutex); |
| 46 | 48 | ||
| 47 | /* Global list of pin control devices (struct pinctrl_dev) */ | 49 | /* Global list of pin control devices (struct pinctrl_dev) */ |
| 48 | static LIST_HEAD(pinctrldev_list); | 50 | LIST_HEAD(pinctrldev_list); |
| 49 | 51 | ||
| 50 | /* List of pin controller handles (struct pinctrl) */ | 52 | /* List of pin controller handles (struct pinctrl) */ |
| 51 | static LIST_HEAD(pinctrl_list); | 53 | static LIST_HEAD(pinctrl_list); |
| @@ -124,6 +126,25 @@ int pin_get_from_name(struct pinctrl_dev *pctldev, const char *name) | |||
| 124 | } | 126 | } |
| 125 | 127 | ||
| 126 | /** | 128 | /** |
| 129 | * pin_get_name_from_id() - look up a pin name from a pin id | ||
| 130 | * @pctldev: the pin control device to lookup the pin on | ||
| 131 | * @name: the name of the pin to look up | ||
| 132 | */ | ||
| 133 | const char *pin_get_name(struct pinctrl_dev *pctldev, const unsigned pin) | ||
| 134 | { | ||
| 135 | const struct pin_desc *desc; | ||
| 136 | |||
| 137 | desc = pin_desc_get(pctldev, pin); | ||
| 138 | if (desc == NULL) { | ||
| 139 | dev_err(pctldev->dev, "failed to get pin(%d) name\n", | ||
| 140 | pin); | ||
| 141 | return NULL; | ||
| 142 | } | ||
| 143 | |||
| 144 | return desc->name; | ||
| 145 | } | ||
| 146 | |||
| 147 | /** | ||
| 127 | * pin_is_valid() - check if pin exists on controller | 148 | * pin_is_valid() - check if pin exists on controller |
| 128 | * @pctldev: the pin control device to check the pin on | 149 | * @pctldev: the pin control device to check the pin on |
| 129 | * @pin: pin to check, use the local pin controller index number | 150 | * @pin: pin to check, use the local pin controller index number |
| @@ -318,9 +339,10 @@ int pinctrl_get_group_selector(struct pinctrl_dev *pctldev, | |||
| 318 | const char *pin_group) | 339 | const char *pin_group) |
| 319 | { | 340 | { |
| 320 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; | 341 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; |
| 342 | unsigned ngroups = pctlops->get_groups_count(pctldev); | ||
| 321 | unsigned group_selector = 0; | 343 | unsigned group_selector = 0; |
| 322 | 344 | ||
| 323 | while (pctlops->list_groups(pctldev, group_selector) >= 0) { | 345 | while (group_selector < ngroups) { |
| 324 | const char *gname = pctlops->get_group_name(pctldev, | 346 | const char *gname = pctlops->get_group_name(pctldev, |
| 325 | group_selector); | 347 | group_selector); |
| 326 | if (!strcmp(gname, pin_group)) { | 348 | if (!strcmp(gname, pin_group)) { |
| @@ -516,11 +538,14 @@ static int add_setting(struct pinctrl *p, struct pinctrl_map const *map) | |||
| 516 | 538 | ||
| 517 | setting->pctldev = get_pinctrl_dev_from_devname(map->ctrl_dev_name); | 539 | setting->pctldev = get_pinctrl_dev_from_devname(map->ctrl_dev_name); |
| 518 | if (setting->pctldev == NULL) { | 540 | if (setting->pctldev == NULL) { |
| 519 | dev_err(p->dev, "unknown pinctrl device %s in map entry", | 541 | dev_info(p->dev, "unknown pinctrl device %s in map entry, deferring probe", |
| 520 | map->ctrl_dev_name); | 542 | map->ctrl_dev_name); |
| 521 | kfree(setting); | 543 | kfree(setting); |
| 522 | /* Eventually, this should trigger deferred probe */ | 544 | /* |
| 523 | return -ENODEV; | 545 | * OK let us guess that the driver is not there yet, and |
| 546 | * let's defer obtaining this pinctrl handle to later... | ||
| 547 | */ | ||
| 548 | return -EPROBE_DEFER; | ||
| 524 | } | 549 | } |
| 525 | 550 | ||
| 526 | switch (map->type) { | 551 | switch (map->type) { |
| @@ -579,6 +604,13 @@ static struct pinctrl *create_pinctrl(struct device *dev) | |||
| 579 | } | 604 | } |
| 580 | p->dev = dev; | 605 | p->dev = dev; |
| 581 | INIT_LIST_HEAD(&p->states); | 606 | INIT_LIST_HEAD(&p->states); |
| 607 | INIT_LIST_HEAD(&p->dt_maps); | ||
| 608 | |||
| 609 | ret = pinctrl_dt_to_map(p); | ||
| 610 | if (ret < 0) { | ||
| 611 | kfree(p); | ||
| 612 | return ERR_PTR(ret); | ||
| 613 | } | ||
| 582 | 614 | ||
| 583 | devname = dev_name(dev); | 615 | devname = dev_name(dev); |
| 584 | 616 | ||
| @@ -662,6 +694,8 @@ static void pinctrl_put_locked(struct pinctrl *p, bool inlist) | |||
| 662 | kfree(state); | 694 | kfree(state); |
| 663 | } | 695 | } |
| 664 | 696 | ||
| 697 | pinctrl_dt_free_maps(p); | ||
| 698 | |||
| 665 | if (inlist) | 699 | if (inlist) |
| 666 | list_del(&p->node); | 700 | list_del(&p->node); |
| 667 | kfree(p); | 701 | kfree(p); |
| @@ -787,15 +821,63 @@ int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state) | |||
| 787 | } | 821 | } |
| 788 | EXPORT_SYMBOL_GPL(pinctrl_select_state); | 822 | EXPORT_SYMBOL_GPL(pinctrl_select_state); |
| 789 | 823 | ||
| 824 | static void devm_pinctrl_release(struct device *dev, void *res) | ||
| 825 | { | ||
| 826 | pinctrl_put(*(struct pinctrl **)res); | ||
| 827 | } | ||
| 828 | |||
| 790 | /** | 829 | /** |
| 791 | * pinctrl_register_mappings() - register a set of pin controller mappings | 830 | * struct devm_pinctrl_get() - Resource managed pinctrl_get() |
| 792 | * @maps: the pincontrol mappings table to register. This should probably be | 831 | * @dev: the device to obtain the handle for |
| 793 | * marked with __initdata so it can be discarded after boot. This | 832 | * |
| 794 | * function will perform a shallow copy for the mapping entries. | 833 | * If there is a need to explicitly destroy the returned struct pinctrl, |
| 795 | * @num_maps: the number of maps in the mapping table | 834 | * devm_pinctrl_put() should be used, rather than plain pinctrl_put(). |
| 796 | */ | 835 | */ |
| 797 | int pinctrl_register_mappings(struct pinctrl_map const *maps, | 836 | struct pinctrl *devm_pinctrl_get(struct device *dev) |
| 798 | unsigned num_maps) | 837 | { |
| 838 | struct pinctrl **ptr, *p; | ||
| 839 | |||
| 840 | ptr = devres_alloc(devm_pinctrl_release, sizeof(*ptr), GFP_KERNEL); | ||
| 841 | if (!ptr) | ||
| 842 | return ERR_PTR(-ENOMEM); | ||
| 843 | |||
| 844 | p = pinctrl_get(dev); | ||
| 845 | if (!IS_ERR(p)) { | ||
| 846 | *ptr = p; | ||
| 847 | devres_add(dev, ptr); | ||
| 848 | } else { | ||
| 849 | devres_free(ptr); | ||
| 850 | } | ||
| 851 | |||
| 852 | return p; | ||
| 853 | } | ||
| 854 | EXPORT_SYMBOL_GPL(devm_pinctrl_get); | ||
| 855 | |||
| 856 | static int devm_pinctrl_match(struct device *dev, void *res, void *data) | ||
| 857 | { | ||
| 858 | struct pinctrl **p = res; | ||
| 859 | |||
| 860 | return *p == data; | ||
| 861 | } | ||
| 862 | |||
| 863 | /** | ||
| 864 | * devm_pinctrl_put() - Resource managed pinctrl_put() | ||
| 865 | * @p: the pinctrl handle to release | ||
| 866 | * | ||
| 867 | * Deallocate a struct pinctrl obtained via devm_pinctrl_get(). Normally | ||
| 868 | * this function will not need to be called and the resource management | ||
| 869 | * code will ensure that the resource is freed. | ||
| 870 | */ | ||
| 871 | void devm_pinctrl_put(struct pinctrl *p) | ||
| 872 | { | ||
| 873 | WARN_ON(devres_destroy(p->dev, devm_pinctrl_release, | ||
| 874 | devm_pinctrl_match, p)); | ||
| 875 | pinctrl_put(p); | ||
| 876 | } | ||
| 877 | EXPORT_SYMBOL_GPL(devm_pinctrl_put); | ||
| 878 | |||
| 879 | int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps, | ||
| 880 | bool dup, bool locked) | ||
| 799 | { | 881 | { |
| 800 | int i, ret; | 882 | int i, ret; |
| 801 | struct pinctrl_maps *maps_node; | 883 | struct pinctrl_maps *maps_node; |
| @@ -851,20 +933,52 @@ int pinctrl_register_mappings(struct pinctrl_map const *maps, | |||
| 851 | } | 933 | } |
| 852 | 934 | ||
| 853 | maps_node->num_maps = num_maps; | 935 | maps_node->num_maps = num_maps; |
| 854 | maps_node->maps = kmemdup(maps, sizeof(*maps) * num_maps, GFP_KERNEL); | 936 | if (dup) { |
| 855 | if (!maps_node->maps) { | 937 | maps_node->maps = kmemdup(maps, sizeof(*maps) * num_maps, |
| 856 | pr_err("failed to duplicate mapping table\n"); | 938 | GFP_KERNEL); |
| 857 | kfree(maps_node); | 939 | if (!maps_node->maps) { |
| 858 | return -ENOMEM; | 940 | pr_err("failed to duplicate mapping table\n"); |
| 941 | kfree(maps_node); | ||
| 942 | return -ENOMEM; | ||
| 943 | } | ||
| 944 | } else { | ||
| 945 | maps_node->maps = maps; | ||
| 859 | } | 946 | } |
| 860 | 947 | ||
| 861 | mutex_lock(&pinctrl_mutex); | 948 | if (!locked) |
| 949 | mutex_lock(&pinctrl_mutex); | ||
| 862 | list_add_tail(&maps_node->node, &pinctrl_maps); | 950 | list_add_tail(&maps_node->node, &pinctrl_maps); |
| 863 | mutex_unlock(&pinctrl_mutex); | 951 | if (!locked) |
| 952 | mutex_unlock(&pinctrl_mutex); | ||
| 864 | 953 | ||
| 865 | return 0; | 954 | return 0; |
| 866 | } | 955 | } |
| 867 | 956 | ||
| 957 | /** | ||
| 958 | * pinctrl_register_mappings() - register a set of pin controller mappings | ||
| 959 | * @maps: the pincontrol mappings table to register. This should probably be | ||
| 960 | * marked with __initdata so it can be discarded after boot. This | ||
| 961 | * function will perform a shallow copy for the mapping entries. | ||
| 962 | * @num_maps: the number of maps in the mapping table | ||
| 963 | */ | ||
| 964 | int pinctrl_register_mappings(struct pinctrl_map const *maps, | ||
| 965 | unsigned num_maps) | ||
| 966 | { | ||
| 967 | return pinctrl_register_map(maps, num_maps, true, false); | ||
| 968 | } | ||
| 969 | |||
| 970 | void pinctrl_unregister_map(struct pinctrl_map const *map) | ||
| 971 | { | ||
| 972 | struct pinctrl_maps *maps_node; | ||
| 973 | |||
| 974 | list_for_each_entry(maps_node, &pinctrl_maps, node) { | ||
| 975 | if (maps_node->maps == map) { | ||
| 976 | list_del(&maps_node->node); | ||
| 977 | return; | ||
| 978 | } | ||
| 979 | } | ||
| 980 | } | ||
| 981 | |||
| 868 | #ifdef CONFIG_DEBUG_FS | 982 | #ifdef CONFIG_DEBUG_FS |
| 869 | 983 | ||
| 870 | static int pinctrl_pins_show(struct seq_file *s, void *what) | 984 | static int pinctrl_pins_show(struct seq_file *s, void *what) |
| @@ -906,15 +1020,17 @@ static int pinctrl_groups_show(struct seq_file *s, void *what) | |||
| 906 | { | 1020 | { |
| 907 | struct pinctrl_dev *pctldev = s->private; | 1021 | struct pinctrl_dev *pctldev = s->private; |
| 908 | const struct pinctrl_ops *ops = pctldev->desc->pctlops; | 1022 | const struct pinctrl_ops *ops = pctldev->desc->pctlops; |
| 909 | unsigned selector = 0; | 1023 | unsigned ngroups, selector = 0; |
| 910 | 1024 | ||
| 1025 | ngroups = ops->get_groups_count(pctldev); | ||
| 911 | mutex_lock(&pinctrl_mutex); | 1026 | mutex_lock(&pinctrl_mutex); |
| 912 | 1027 | ||
| 913 | seq_puts(s, "registered pin groups:\n"); | 1028 | seq_puts(s, "registered pin groups:\n"); |
| 914 | while (ops->list_groups(pctldev, selector) >= 0) { | 1029 | while (selector < ngroups) { |
| 915 | const unsigned *pins; | 1030 | const unsigned *pins; |
| 916 | unsigned num_pins; | 1031 | unsigned num_pins; |
| 917 | const char *gname = ops->get_group_name(pctldev, selector); | 1032 | const char *gname = ops->get_group_name(pctldev, selector); |
| 1033 | const char *pname; | ||
| 918 | int ret; | 1034 | int ret; |
| 919 | int i; | 1035 | int i; |
| 920 | 1036 | ||
| @@ -924,10 +1040,14 @@ static int pinctrl_groups_show(struct seq_file *s, void *what) | |||
| 924 | seq_printf(s, "%s [ERROR GETTING PINS]\n", | 1040 | seq_printf(s, "%s [ERROR GETTING PINS]\n", |
| 925 | gname); | 1041 | gname); |
| 926 | else { | 1042 | else { |
| 927 | seq_printf(s, "group: %s, pins = [ ", gname); | 1043 | seq_printf(s, "group: %s\n", gname); |
| 928 | for (i = 0; i < num_pins; i++) | 1044 | for (i = 0; i < num_pins; i++) { |
| 929 | seq_printf(s, "%d ", pins[i]); | 1045 | pname = pin_get_name(pctldev, pins[i]); |
| 930 | seq_puts(s, "]\n"); | 1046 | if (WARN_ON(!pname)) |
| 1047 | return -EINVAL; | ||
| 1048 | seq_printf(s, "pin %d (%s)\n", pins[i], pname); | ||
| 1049 | } | ||
| 1050 | seq_puts(s, "\n"); | ||
| 931 | } | 1051 | } |
| 932 | selector++; | 1052 | selector++; |
| 933 | } | 1053 | } |
| @@ -1226,11 +1346,14 @@ static int pinctrl_check_ops(struct pinctrl_dev *pctldev) | |||
| 1226 | const struct pinctrl_ops *ops = pctldev->desc->pctlops; | 1346 | const struct pinctrl_ops *ops = pctldev->desc->pctlops; |
| 1227 | 1347 | ||
| 1228 | if (!ops || | 1348 | if (!ops || |
| 1229 | !ops->list_groups || | 1349 | !ops->get_groups_count || |
| 1230 | !ops->get_group_name || | 1350 | !ops->get_group_name || |
| 1231 | !ops->get_group_pins) | 1351 | !ops->get_group_pins) |
| 1232 | return -EINVAL; | 1352 | return -EINVAL; |
| 1233 | 1353 | ||
| 1354 | if (ops->dt_node_to_map && !ops->dt_free_map) | ||
| 1355 | return -EINVAL; | ||
| 1356 | |||
| 1234 | return 0; | 1357 | return 0; |
| 1235 | } | 1358 | } |
| 1236 | 1359 | ||
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h index 17ecf651b123..1f40ff68a8c4 100644 --- a/drivers/pinctrl/core.h +++ b/drivers/pinctrl/core.h | |||
| @@ -52,12 +52,15 @@ struct pinctrl_dev { | |||
| 52 | * @dev: the device using this pin control handle | 52 | * @dev: the device using this pin control handle |
| 53 | * @states: a list of states for this device | 53 | * @states: a list of states for this device |
| 54 | * @state: the current state | 54 | * @state: the current state |
| 55 | * @dt_maps: the mapping table chunks dynamically parsed from device tree for | ||
| 56 | * this device, if any | ||
| 55 | */ | 57 | */ |
| 56 | struct pinctrl { | 58 | struct pinctrl { |
| 57 | struct list_head node; | 59 | struct list_head node; |
| 58 | struct device *dev; | 60 | struct device *dev; |
| 59 | struct list_head states; | 61 | struct list_head states; |
| 60 | struct pinctrl_state *state; | 62 | struct pinctrl_state *state; |
| 63 | struct list_head dt_maps; | ||
| 61 | }; | 64 | }; |
| 62 | 65 | ||
| 63 | /** | 66 | /** |
| @@ -100,7 +103,8 @@ struct pinctrl_setting_configs { | |||
| 100 | * struct pinctrl_setting - an individual mux or config setting | 103 | * struct pinctrl_setting - an individual mux or config setting |
| 101 | * @node: list node for struct pinctrl_settings's @settings field | 104 | * @node: list node for struct pinctrl_settings's @settings field |
| 102 | * @type: the type of setting | 105 | * @type: the type of setting |
| 103 | * @pctldev: pin control device handling to be programmed | 106 | * @pctldev: pin control device handling to be programmed. Not used for |
| 107 | * PIN_MAP_TYPE_DUMMY_STATE. | ||
| 104 | * @data: Data specific to the setting type | 108 | * @data: Data specific to the setting type |
| 105 | */ | 109 | */ |
| 106 | struct pinctrl_setting { | 110 | struct pinctrl_setting { |
| @@ -144,6 +148,7 @@ struct pin_desc { | |||
| 144 | 148 | ||
| 145 | struct pinctrl_dev *get_pinctrl_dev_from_devname(const char *dev_name); | 149 | struct pinctrl_dev *get_pinctrl_dev_from_devname(const char *dev_name); |
| 146 | int pin_get_from_name(struct pinctrl_dev *pctldev, const char *name); | 150 | int pin_get_from_name(struct pinctrl_dev *pctldev, const char *name); |
| 151 | const char *pin_get_name(struct pinctrl_dev *pctldev, const unsigned pin); | ||
| 147 | int pinctrl_get_group_selector(struct pinctrl_dev *pctldev, | 152 | int pinctrl_get_group_selector(struct pinctrl_dev *pctldev, |
| 148 | const char *pin_group); | 153 | const char *pin_group); |
| 149 | 154 | ||
| @@ -153,4 +158,9 @@ static inline struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev, | |||
| 153 | return radix_tree_lookup(&pctldev->pin_desc_tree, pin); | 158 | return radix_tree_lookup(&pctldev->pin_desc_tree, pin); |
| 154 | } | 159 | } |
| 155 | 160 | ||
| 161 | int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps, | ||
| 162 | bool dup, bool locked); | ||
| 163 | void pinctrl_unregister_map(struct pinctrl_map const *map); | ||
| 164 | |||
| 156 | extern struct mutex pinctrl_mutex; | 165 | extern struct mutex pinctrl_mutex; |
| 166 | extern struct list_head pinctrldev_list; | ||
diff --git a/drivers/pinctrl/devicetree.c b/drivers/pinctrl/devicetree.c new file mode 100644 index 000000000000..fcb1de45473c --- /dev/null +++ b/drivers/pinctrl/devicetree.c | |||
| @@ -0,0 +1,249 @@ | |||
| 1 | /* | ||
| 2 | * Device tree integration for the pin control subsystem | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify it | ||
| 7 | * under the terms and conditions of the GNU General Public License, | ||
| 8 | * version 2, as published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 13 | * more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #include <linux/device.h> | ||
| 20 | #include <linux/of.h> | ||
| 21 | #include <linux/pinctrl/pinctrl.h> | ||
| 22 | #include <linux/slab.h> | ||
| 23 | |||
| 24 | #include "core.h" | ||
| 25 | #include "devicetree.h" | ||
| 26 | |||
| 27 | /** | ||
| 28 | * struct pinctrl_dt_map - mapping table chunk parsed from device tree | ||
| 29 | * @node: list node for struct pinctrl's @dt_maps field | ||
| 30 | * @pctldev: the pin controller that allocated this struct, and will free it | ||
| 31 | * @maps: the mapping table entries | ||
| 32 | */ | ||
| 33 | struct pinctrl_dt_map { | ||
| 34 | struct list_head node; | ||
| 35 | struct pinctrl_dev *pctldev; | ||
| 36 | struct pinctrl_map *map; | ||
| 37 | unsigned num_maps; | ||
| 38 | }; | ||
| 39 | |||
| 40 | static void dt_free_map(struct pinctrl_dev *pctldev, | ||
| 41 | struct pinctrl_map *map, unsigned num_maps) | ||
| 42 | { | ||
| 43 | if (pctldev) { | ||
| 44 | struct pinctrl_ops *ops = pctldev->desc->pctlops; | ||
| 45 | ops->dt_free_map(pctldev, map, num_maps); | ||
| 46 | } else { | ||
| 47 | /* There is no pctldev for PIN_MAP_TYPE_DUMMY_STATE */ | ||
| 48 | kfree(map); | ||
| 49 | } | ||
| 50 | } | ||
| 51 | |||
| 52 | void pinctrl_dt_free_maps(struct pinctrl *p) | ||
| 53 | { | ||
| 54 | struct pinctrl_dt_map *dt_map, *n1; | ||
| 55 | |||
| 56 | list_for_each_entry_safe(dt_map, n1, &p->dt_maps, node) { | ||
| 57 | pinctrl_unregister_map(dt_map->map); | ||
| 58 | list_del(&dt_map->node); | ||
| 59 | dt_free_map(dt_map->pctldev, dt_map->map, | ||
| 60 | dt_map->num_maps); | ||
| 61 | kfree(dt_map); | ||
| 62 | } | ||
| 63 | |||
| 64 | of_node_put(p->dev->of_node); | ||
| 65 | } | ||
| 66 | |||
| 67 | static int dt_remember_or_free_map(struct pinctrl *p, const char *statename, | ||
| 68 | struct pinctrl_dev *pctldev, | ||
| 69 | struct pinctrl_map *map, unsigned num_maps) | ||
| 70 | { | ||
| 71 | int i; | ||
| 72 | struct pinctrl_dt_map *dt_map; | ||
| 73 | |||
| 74 | /* Initialize common mapping table entry fields */ | ||
| 75 | for (i = 0; i < num_maps; i++) { | ||
| 76 | map[i].dev_name = dev_name(p->dev); | ||
| 77 | map[i].name = statename; | ||
| 78 | if (pctldev) | ||
| 79 | map[i].ctrl_dev_name = dev_name(pctldev->dev); | ||
| 80 | } | ||
| 81 | |||
| 82 | /* Remember the converted mapping table entries */ | ||
| 83 | dt_map = kzalloc(sizeof(*dt_map), GFP_KERNEL); | ||
| 84 | if (!dt_map) { | ||
| 85 | dev_err(p->dev, "failed to alloc struct pinctrl_dt_map\n"); | ||
| 86 | dt_free_map(pctldev, map, num_maps); | ||
| 87 | return -ENOMEM; | ||
| 88 | } | ||
| 89 | |||
| 90 | dt_map->pctldev = pctldev; | ||
| 91 | dt_map->map = map; | ||
| 92 | dt_map->num_maps = num_maps; | ||
| 93 | list_add_tail(&dt_map->node, &p->dt_maps); | ||
| 94 | |||
| 95 | return pinctrl_register_map(map, num_maps, false, true); | ||
| 96 | } | ||
| 97 | |||
| 98 | static struct pinctrl_dev *find_pinctrl_by_of_node(struct device_node *np) | ||
| 99 | { | ||
| 100 | struct pinctrl_dev *pctldev; | ||
| 101 | |||
| 102 | list_for_each_entry(pctldev, &pinctrldev_list, node) | ||
| 103 | if (pctldev->dev->of_node == np) | ||
| 104 | return pctldev; | ||
| 105 | |||
| 106 | return NULL; | ||
| 107 | } | ||
| 108 | |||
| 109 | static int dt_to_map_one_config(struct pinctrl *p, const char *statename, | ||
| 110 | struct device_node *np_config) | ||
| 111 | { | ||
| 112 | struct device_node *np_pctldev; | ||
| 113 | struct pinctrl_dev *pctldev; | ||
| 114 | struct pinctrl_ops *ops; | ||
| 115 | int ret; | ||
| 116 | struct pinctrl_map *map; | ||
| 117 | unsigned num_maps; | ||
| 118 | |||
| 119 | /* Find the pin controller containing np_config */ | ||
| 120 | np_pctldev = of_node_get(np_config); | ||
| 121 | for (;;) { | ||
| 122 | np_pctldev = of_get_next_parent(np_pctldev); | ||
| 123 | if (!np_pctldev || of_node_is_root(np_pctldev)) { | ||
| 124 | dev_info(p->dev, "could not find pctldev for node %s, deferring probe\n", | ||
| 125 | np_config->full_name); | ||
| 126 | of_node_put(np_pctldev); | ||
| 127 | /* OK let's just assume this will appear later then */ | ||
| 128 | return -EPROBE_DEFER; | ||
| 129 | } | ||
| 130 | pctldev = find_pinctrl_by_of_node(np_pctldev); | ||
| 131 | if (pctldev) | ||
| 132 | break; | ||
| 133 | } | ||
| 134 | of_node_put(np_pctldev); | ||
| 135 | |||
| 136 | /* | ||
| 137 | * Call pinctrl driver to parse device tree node, and | ||
| 138 | * generate mapping table entries | ||
| 139 | */ | ||
| 140 | ops = pctldev->desc->pctlops; | ||
| 141 | if (!ops->dt_node_to_map) { | ||
| 142 | dev_err(p->dev, "pctldev %s doesn't support DT\n", | ||
| 143 | dev_name(pctldev->dev)); | ||
| 144 | return -ENODEV; | ||
| 145 | } | ||
| 146 | ret = ops->dt_node_to_map(pctldev, np_config, &map, &num_maps); | ||
| 147 | if (ret < 0) | ||
| 148 | return ret; | ||
| 149 | |||
| 150 | /* Stash the mapping table chunk away for later use */ | ||
| 151 | return dt_remember_or_free_map(p, statename, pctldev, map, num_maps); | ||
| 152 | } | ||
| 153 | |||
| 154 | static int dt_remember_dummy_state(struct pinctrl *p, const char *statename) | ||
| 155 | { | ||
| 156 | struct pinctrl_map *map; | ||
| 157 | |||
| 158 | map = kzalloc(sizeof(*map), GFP_KERNEL); | ||
| 159 | if (!map) { | ||
| 160 | dev_err(p->dev, "failed to alloc struct pinctrl_map\n"); | ||
| 161 | return -ENOMEM; | ||
| 162 | } | ||
| 163 | |||
| 164 | /* There is no pctldev for PIN_MAP_TYPE_DUMMY_STATE */ | ||
| 165 | map->type = PIN_MAP_TYPE_DUMMY_STATE; | ||
| 166 | |||
| 167 | return dt_remember_or_free_map(p, statename, NULL, map, 1); | ||
| 168 | } | ||
| 169 | |||
| 170 | int pinctrl_dt_to_map(struct pinctrl *p) | ||
| 171 | { | ||
| 172 | struct device_node *np = p->dev->of_node; | ||
| 173 | int state, ret; | ||
| 174 | char *propname; | ||
| 175 | struct property *prop; | ||
| 176 | const char *statename; | ||
| 177 | const __be32 *list; | ||
| 178 | int size, config; | ||
| 179 | phandle phandle; | ||
| 180 | struct device_node *np_config; | ||
| 181 | |||
| 182 | /* CONFIG_OF enabled, p->dev not instantiated from DT */ | ||
| 183 | if (!np) { | ||
| 184 | dev_dbg(p->dev, "no of_node; not parsing pinctrl DT\n"); | ||
| 185 | return 0; | ||
| 186 | } | ||
| 187 | |||
| 188 | /* We may store pointers to property names within the node */ | ||
| 189 | of_node_get(np); | ||
| 190 | |||
| 191 | /* For each defined state ID */ | ||
| 192 | for (state = 0; ; state++) { | ||
| 193 | /* Retrieve the pinctrl-* property */ | ||
| 194 | propname = kasprintf(GFP_KERNEL, "pinctrl-%d", state); | ||
| 195 | prop = of_find_property(np, propname, &size); | ||
| 196 | kfree(propname); | ||
| 197 | if (!prop) | ||
| 198 | break; | ||
| 199 | list = prop->value; | ||
| 200 | size /= sizeof(*list); | ||
| 201 | |||
| 202 | /* Determine whether pinctrl-names property names the state */ | ||
| 203 | ret = of_property_read_string_index(np, "pinctrl-names", | ||
| 204 | state, &statename); | ||
| 205 | /* | ||
| 206 | * If not, statename is just the integer state ID. But rather | ||
| 207 | * than dynamically allocate it and have to free it later, | ||
| 208 | * just point part way into the property name for the string. | ||
| 209 | */ | ||
| 210 | if (ret < 0) { | ||
| 211 | /* strlen("pinctrl-") == 8 */ | ||
| 212 | statename = prop->name + 8; | ||
| 213 | } | ||
| 214 | |||
| 215 | /* For every referenced pin configuration node in it */ | ||
| 216 | for (config = 0; config < size; config++) { | ||
| 217 | phandle = be32_to_cpup(list++); | ||
| 218 | |||
| 219 | /* Look up the pin configuration node */ | ||
| 220 | np_config = of_find_node_by_phandle(phandle); | ||
| 221 | if (!np_config) { | ||
| 222 | dev_err(p->dev, | ||
| 223 | "prop %s index %i invalid phandle\n", | ||
| 224 | prop->name, config); | ||
| 225 | ret = -EINVAL; | ||
| 226 | goto err; | ||
| 227 | } | ||
| 228 | |||
| 229 | /* Parse the node */ | ||
| 230 | ret = dt_to_map_one_config(p, statename, np_config); | ||
| 231 | of_node_put(np_config); | ||
| 232 | if (ret < 0) | ||
| 233 | goto err; | ||
| 234 | } | ||
| 235 | |||
| 236 | /* No entries in DT? Generate a dummy state table entry */ | ||
| 237 | if (!size) { | ||
| 238 | ret = dt_remember_dummy_state(p, statename); | ||
| 239 | if (ret < 0) | ||
| 240 | goto err; | ||
| 241 | } | ||
| 242 | } | ||
| 243 | |||
| 244 | return 0; | ||
| 245 | |||
| 246 | err: | ||
| 247 | pinctrl_dt_free_maps(p); | ||
| 248 | return ret; | ||
| 249 | } | ||
diff --git a/drivers/pinctrl/devicetree.h b/drivers/pinctrl/devicetree.h new file mode 100644 index 000000000000..760bc4960f58 --- /dev/null +++ b/drivers/pinctrl/devicetree.h | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | /* | ||
| 2 | * Internal interface to pinctrl device tree integration | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify it | ||
| 7 | * under the terms and conditions of the GNU General Public License, | ||
| 8 | * version 2, as published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 13 | * more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #ifdef CONFIG_OF | ||
| 20 | |||
| 21 | void pinctrl_dt_free_maps(struct pinctrl *p); | ||
| 22 | int pinctrl_dt_to_map(struct pinctrl *p); | ||
| 23 | |||
| 24 | #else | ||
| 25 | |||
| 26 | static inline int pinctrl_dt_to_map(struct pinctrl *p) | ||
| 27 | { | ||
| 28 | return 0; | ||
| 29 | } | ||
| 30 | |||
| 31 | static inline void pinctrl_dt_free_maps(struct pinctrl *p) | ||
| 32 | { | ||
| 33 | } | ||
| 34 | |||
| 35 | #endif | ||
diff --git a/drivers/pinctrl/pinconf.c b/drivers/pinctrl/pinconf.c index 7321e8601294..14f48c96b20d 100644 --- a/drivers/pinctrl/pinconf.c +++ b/drivers/pinctrl/pinconf.c | |||
| @@ -379,8 +379,16 @@ int pinconf_apply_setting(struct pinctrl_setting const *setting) | |||
| 379 | 379 | ||
| 380 | void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map) | 380 | void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map) |
| 381 | { | 381 | { |
| 382 | struct pinctrl_dev *pctldev; | ||
| 383 | const struct pinconf_ops *confops; | ||
| 382 | int i; | 384 | int i; |
| 383 | 385 | ||
| 386 | pctldev = get_pinctrl_dev_from_devname(map->ctrl_dev_name); | ||
| 387 | if (pctldev) | ||
| 388 | confops = pctldev->desc->confops; | ||
| 389 | else | ||
| 390 | confops = NULL; | ||
| 391 | |||
| 384 | switch (map->type) { | 392 | switch (map->type) { |
| 385 | case PIN_MAP_TYPE_CONFIGS_PIN: | 393 | case PIN_MAP_TYPE_CONFIGS_PIN: |
| 386 | seq_printf(s, "pin "); | 394 | seq_printf(s, "pin "); |
| @@ -394,8 +402,15 @@ void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map) | |||
| 394 | 402 | ||
| 395 | seq_printf(s, "%s\n", map->data.configs.group_or_pin); | 403 | seq_printf(s, "%s\n", map->data.configs.group_or_pin); |
| 396 | 404 | ||
| 397 | for (i = 0; i < map->data.configs.num_configs; i++) | 405 | for (i = 0; i < map->data.configs.num_configs; i++) { |
| 398 | seq_printf(s, "config %08lx\n", map->data.configs.configs[i]); | 406 | seq_printf(s, "config "); |
| 407 | if (confops && confops->pin_config_config_dbg_show) | ||
| 408 | confops->pin_config_config_dbg_show(pctldev, s, | ||
| 409 | map->data.configs.configs[i]); | ||
| 410 | else | ||
| 411 | seq_printf(s, "%08lx", map->data.configs.configs[i]); | ||
| 412 | seq_printf(s, "\n"); | ||
| 413 | } | ||
| 399 | } | 414 | } |
| 400 | 415 | ||
| 401 | void pinconf_show_setting(struct seq_file *s, | 416 | void pinconf_show_setting(struct seq_file *s, |
| @@ -403,6 +418,7 @@ void pinconf_show_setting(struct seq_file *s, | |||
| 403 | { | 418 | { |
| 404 | struct pinctrl_dev *pctldev = setting->pctldev; | 419 | struct pinctrl_dev *pctldev = setting->pctldev; |
| 405 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; | 420 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; |
| 421 | const struct pinconf_ops *confops = pctldev->desc->confops; | ||
| 406 | struct pin_desc *desc; | 422 | struct pin_desc *desc; |
| 407 | int i; | 423 | int i; |
| 408 | 424 | ||
| @@ -428,8 +444,15 @@ void pinconf_show_setting(struct seq_file *s, | |||
| 428 | * FIXME: We should really get the pin controler to dump the config | 444 | * FIXME: We should really get the pin controler to dump the config |
| 429 | * values, so they can be decoded to something meaningful. | 445 | * values, so they can be decoded to something meaningful. |
| 430 | */ | 446 | */ |
| 431 | for (i = 0; i < setting->data.configs.num_configs; i++) | 447 | for (i = 0; i < setting->data.configs.num_configs; i++) { |
| 432 | seq_printf(s, " %08lx", setting->data.configs.configs[i]); | 448 | seq_printf(s, " "); |
| 449 | if (confops && confops->pin_config_config_dbg_show) | ||
| 450 | confops->pin_config_config_dbg_show(pctldev, s, | ||
| 451 | setting->data.configs.configs[i]); | ||
| 452 | else | ||
| 453 | seq_printf(s, "%08lx", | ||
| 454 | setting->data.configs.configs[i]); | ||
| 455 | } | ||
| 433 | 456 | ||
| 434 | seq_printf(s, "\n"); | 457 | seq_printf(s, "\n"); |
| 435 | } | 458 | } |
| @@ -448,10 +471,14 @@ static void pinconf_dump_pin(struct pinctrl_dev *pctldev, | |||
| 448 | static int pinconf_pins_show(struct seq_file *s, void *what) | 471 | static int pinconf_pins_show(struct seq_file *s, void *what) |
| 449 | { | 472 | { |
| 450 | struct pinctrl_dev *pctldev = s->private; | 473 | struct pinctrl_dev *pctldev = s->private; |
| 474 | const struct pinconf_ops *ops = pctldev->desc->confops; | ||
| 451 | unsigned i, pin; | 475 | unsigned i, pin; |
| 452 | 476 | ||
| 477 | if (!ops || !ops->pin_config_get) | ||
| 478 | return 0; | ||
| 479 | |||
| 453 | seq_puts(s, "Pin config settings per pin\n"); | 480 | seq_puts(s, "Pin config settings per pin\n"); |
| 454 | seq_puts(s, "Format: pin (name): pinmux setting array\n"); | 481 | seq_puts(s, "Format: pin (name): configs\n"); |
| 455 | 482 | ||
| 456 | mutex_lock(&pinctrl_mutex); | 483 | mutex_lock(&pinctrl_mutex); |
| 457 | 484 | ||
| @@ -495,17 +522,18 @@ static int pinconf_groups_show(struct seq_file *s, void *what) | |||
| 495 | struct pinctrl_dev *pctldev = s->private; | 522 | struct pinctrl_dev *pctldev = s->private; |
| 496 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; | 523 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; |
| 497 | const struct pinconf_ops *ops = pctldev->desc->confops; | 524 | const struct pinconf_ops *ops = pctldev->desc->confops; |
| 525 | unsigned ngroups = pctlops->get_groups_count(pctldev); | ||
| 498 | unsigned selector = 0; | 526 | unsigned selector = 0; |
| 499 | 527 | ||
| 500 | if (!ops || !ops->pin_config_group_get) | 528 | if (!ops || !ops->pin_config_group_get) |
| 501 | return 0; | 529 | return 0; |
| 502 | 530 | ||
| 503 | seq_puts(s, "Pin config settings per pin group\n"); | 531 | seq_puts(s, "Pin config settings per pin group\n"); |
| 504 | seq_puts(s, "Format: group (name): pinmux setting array\n"); | 532 | seq_puts(s, "Format: group (name): configs\n"); |
| 505 | 533 | ||
| 506 | mutex_lock(&pinctrl_mutex); | 534 | mutex_lock(&pinctrl_mutex); |
| 507 | 535 | ||
| 508 | while (pctlops->list_groups(pctldev, selector) >= 0) { | 536 | while (selector < ngroups) { |
| 509 | const char *gname = pctlops->get_group_name(pctldev, selector); | 537 | const char *gname = pctlops->get_group_name(pctldev, selector); |
| 510 | 538 | ||
| 511 | seq_printf(s, "%u (%s):", selector, gname); | 539 | seq_printf(s, "%u (%s):", selector, gname); |
diff --git a/drivers/pinctrl/pinconf.h b/drivers/pinctrl/pinconf.h index 54510de5e8c6..e3ed8cb072a5 100644 --- a/drivers/pinctrl/pinconf.h +++ b/drivers/pinctrl/pinconf.h | |||
| @@ -19,11 +19,6 @@ int pinconf_map_to_setting(struct pinctrl_map const *map, | |||
| 19 | struct pinctrl_setting *setting); | 19 | struct pinctrl_setting *setting); |
| 20 | void pinconf_free_setting(struct pinctrl_setting const *setting); | 20 | void pinconf_free_setting(struct pinctrl_setting const *setting); |
| 21 | int pinconf_apply_setting(struct pinctrl_setting const *setting); | 21 | int pinconf_apply_setting(struct pinctrl_setting const *setting); |
| 22 | void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map); | ||
| 23 | void pinconf_show_setting(struct seq_file *s, | ||
| 24 | struct pinctrl_setting const *setting); | ||
| 25 | void pinconf_init_device_debugfs(struct dentry *devroot, | ||
| 26 | struct pinctrl_dev *pctldev); | ||
| 27 | 22 | ||
| 28 | /* | 23 | /* |
| 29 | * You will only be interested in these if you're using PINCONF | 24 | * You will only be interested in these if you're using PINCONF |
| @@ -61,6 +56,18 @@ static inline int pinconf_apply_setting(struct pinctrl_setting const *setting) | |||
| 61 | return 0; | 56 | return 0; |
| 62 | } | 57 | } |
| 63 | 58 | ||
| 59 | #endif | ||
| 60 | |||
| 61 | #if defined(CONFIG_PINCONF) && defined(CONFIG_DEBUG_FS) | ||
| 62 | |||
| 63 | void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map); | ||
| 64 | void pinconf_show_setting(struct seq_file *s, | ||
| 65 | struct pinctrl_setting const *setting); | ||
| 66 | void pinconf_init_device_debugfs(struct dentry *devroot, | ||
| 67 | struct pinctrl_dev *pctldev); | ||
| 68 | |||
| 69 | #else | ||
| 70 | |||
| 64 | static inline void pinconf_show_map(struct seq_file *s, | 71 | static inline void pinconf_show_map(struct seq_file *s, |
| 65 | struct pinctrl_map const *map) | 72 | struct pinctrl_map const *map) |
| 66 | { | 73 | { |
diff --git a/drivers/pinctrl/pinctrl-coh901.c b/drivers/pinctrl/pinctrl-coh901.c index 0797eba3e33a..55697a5d7482 100644 --- a/drivers/pinctrl/pinctrl-coh901.c +++ b/drivers/pinctrl/pinctrl-coh901.c | |||
| @@ -174,7 +174,7 @@ struct u300_gpio_confdata { | |||
| 174 | 174 | ||
| 175 | 175 | ||
| 176 | /* Initial configuration */ | 176 | /* Initial configuration */ |
| 177 | static const struct __initdata u300_gpio_confdata | 177 | static const struct __initconst u300_gpio_confdata |
| 178 | bs335_gpio_config[BS335_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { | 178 | bs335_gpio_config[BS335_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { |
| 179 | /* Port 0, pins 0-7 */ | 179 | /* Port 0, pins 0-7 */ |
| 180 | { | 180 | { |
| @@ -255,7 +255,7 @@ bs335_gpio_config[BS335_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { | |||
| 255 | } | 255 | } |
| 256 | }; | 256 | }; |
| 257 | 257 | ||
| 258 | static const struct __initdata u300_gpio_confdata | 258 | static const struct __initconst u300_gpio_confdata |
| 259 | bs365_gpio_config[BS365_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { | 259 | bs365_gpio_config[BS365_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { |
| 260 | /* Port 0, pins 0-7 */ | 260 | /* Port 0, pins 0-7 */ |
| 261 | { | 261 | { |
diff --git a/drivers/pinctrl/pinctrl-pxa3xx.c b/drivers/pinctrl/pinctrl-pxa3xx.c index 079dce0e93e9..7644e42ac211 100644 --- a/drivers/pinctrl/pinctrl-pxa3xx.c +++ b/drivers/pinctrl/pinctrl-pxa3xx.c | |||
| @@ -25,20 +25,18 @@ static struct pinctrl_gpio_range pxa3xx_pinctrl_gpio_range = { | |||
| 25 | .pin_base = 0, | 25 | .pin_base = 0, |
| 26 | }; | 26 | }; |
| 27 | 27 | ||
| 28 | static int pxa3xx_list_groups(struct pinctrl_dev *pctrldev, unsigned selector) | 28 | static int pxa3xx_get_groups_count(struct pinctrl_dev *pctrldev) |
| 29 | { | 29 | { |
| 30 | struct pxa3xx_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev); | 30 | struct pxa3xx_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev); |
| 31 | if (selector >= info->num_grps) | 31 | |
| 32 | return -EINVAL; | 32 | return info->num_grps; |
| 33 | return 0; | ||
| 34 | } | 33 | } |
| 35 | 34 | ||
| 36 | static const char *pxa3xx_get_group_name(struct pinctrl_dev *pctrldev, | 35 | static const char *pxa3xx_get_group_name(struct pinctrl_dev *pctrldev, |
| 37 | unsigned selector) | 36 | unsigned selector) |
| 38 | { | 37 | { |
| 39 | struct pxa3xx_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev); | 38 | struct pxa3xx_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev); |
| 40 | if (selector >= info->num_grps) | 39 | |
| 41 | return NULL; | ||
| 42 | return info->grps[selector].name; | 40 | return info->grps[selector].name; |
| 43 | } | 41 | } |
| 44 | 42 | ||
| @@ -48,25 +46,23 @@ static int pxa3xx_get_group_pins(struct pinctrl_dev *pctrldev, | |||
| 48 | unsigned *num_pins) | 46 | unsigned *num_pins) |
| 49 | { | 47 | { |
| 50 | struct pxa3xx_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev); | 48 | struct pxa3xx_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev); |
| 51 | if (selector >= info->num_grps) | 49 | |
| 52 | return -EINVAL; | ||
| 53 | *pins = info->grps[selector].pins; | 50 | *pins = info->grps[selector].pins; |
| 54 | *num_pins = info->grps[selector].npins; | 51 | *num_pins = info->grps[selector].npins; |
| 55 | return 0; | 52 | return 0; |
| 56 | } | 53 | } |
| 57 | 54 | ||
| 58 | static struct pinctrl_ops pxa3xx_pctrl_ops = { | 55 | static struct pinctrl_ops pxa3xx_pctrl_ops = { |
| 59 | .list_groups = pxa3xx_list_groups, | 56 | .get_groups_count = pxa3xx_get_groups_count, |
| 60 | .get_group_name = pxa3xx_get_group_name, | 57 | .get_group_name = pxa3xx_get_group_name, |
| 61 | .get_group_pins = pxa3xx_get_group_pins, | 58 | .get_group_pins = pxa3xx_get_group_pins, |
| 62 | }; | 59 | }; |
| 63 | 60 | ||
| 64 | static int pxa3xx_pmx_list_func(struct pinctrl_dev *pctrldev, unsigned func) | 61 | static int pxa3xx_pmx_get_funcs_count(struct pinctrl_dev *pctrldev) |
| 65 | { | 62 | { |
| 66 | struct pxa3xx_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev); | 63 | struct pxa3xx_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev); |
| 67 | if (func >= info->num_funcs) | 64 | |
| 68 | return -EINVAL; | 65 | return info->num_funcs; |
| 69 | return 0; | ||
| 70 | } | 66 | } |
| 71 | 67 | ||
| 72 | static const char *pxa3xx_pmx_get_func_name(struct pinctrl_dev *pctrldev, | 68 | static const char *pxa3xx_pmx_get_func_name(struct pinctrl_dev *pctrldev, |
| @@ -170,7 +166,7 @@ static int pxa3xx_pmx_request_gpio(struct pinctrl_dev *pctrldev, | |||
| 170 | } | 166 | } |
| 171 | 167 | ||
| 172 | static struct pinmux_ops pxa3xx_pmx_ops = { | 168 | static struct pinmux_ops pxa3xx_pmx_ops = { |
| 173 | .list_functions = pxa3xx_pmx_list_func, | 169 | .get_functions_count = pxa3xx_pmx_get_funcs_count, |
| 174 | .get_function_name = pxa3xx_pmx_get_func_name, | 170 | .get_function_name = pxa3xx_pmx_get_func_name, |
| 175 | .get_function_groups = pxa3xx_pmx_get_groups, | 171 | .get_function_groups = pxa3xx_pmx_get_groups, |
| 176 | .enable = pxa3xx_pmx_enable, | 172 | .enable = pxa3xx_pmx_enable, |
diff --git a/drivers/pinctrl/pinctrl-sirf.c b/drivers/pinctrl/pinctrl-sirf.c index 6b3534cc051a..ba15b1a29e52 100644 --- a/drivers/pinctrl/pinctrl-sirf.c +++ b/drivers/pinctrl/pinctrl-sirf.c | |||
| @@ -853,18 +853,14 @@ static const struct sirfsoc_pin_group sirfsoc_pin_groups[] = { | |||
| 853 | SIRFSOC_PIN_GROUP("gpsgrp", gps_pins), | 853 | SIRFSOC_PIN_GROUP("gpsgrp", gps_pins), |
| 854 | }; | 854 | }; |
| 855 | 855 | ||
| 856 | static int sirfsoc_list_groups(struct pinctrl_dev *pctldev, unsigned selector) | 856 | static int sirfsoc_get_groups_count(struct pinctrl_dev *pctldev) |
| 857 | { | 857 | { |
| 858 | if (selector >= ARRAY_SIZE(sirfsoc_pin_groups)) | 858 | return ARRAY_SIZE(sirfsoc_pin_groups); |
| 859 | return -EINVAL; | ||
| 860 | return 0; | ||
| 861 | } | 859 | } |
| 862 | 860 | ||
| 863 | static const char *sirfsoc_get_group_name(struct pinctrl_dev *pctldev, | 861 | static const char *sirfsoc_get_group_name(struct pinctrl_dev *pctldev, |
| 864 | unsigned selector) | 862 | unsigned selector) |
| 865 | { | 863 | { |
| 866 | if (selector >= ARRAY_SIZE(sirfsoc_pin_groups)) | ||
| 867 | return NULL; | ||
| 868 | return sirfsoc_pin_groups[selector].name; | 864 | return sirfsoc_pin_groups[selector].name; |
| 869 | } | 865 | } |
| 870 | 866 | ||
| @@ -872,8 +868,6 @@ static int sirfsoc_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector | |||
| 872 | const unsigned **pins, | 868 | const unsigned **pins, |
| 873 | unsigned *num_pins) | 869 | unsigned *num_pins) |
| 874 | { | 870 | { |
| 875 | if (selector >= ARRAY_SIZE(sirfsoc_pin_groups)) | ||
| 876 | return -EINVAL; | ||
| 877 | *pins = sirfsoc_pin_groups[selector].pins; | 871 | *pins = sirfsoc_pin_groups[selector].pins; |
| 878 | *num_pins = sirfsoc_pin_groups[selector].num_pins; | 872 | *num_pins = sirfsoc_pin_groups[selector].num_pins; |
| 879 | return 0; | 873 | return 0; |
| @@ -886,7 +880,7 @@ static void sirfsoc_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s | |||
| 886 | } | 880 | } |
| 887 | 881 | ||
| 888 | static struct pinctrl_ops sirfsoc_pctrl_ops = { | 882 | static struct pinctrl_ops sirfsoc_pctrl_ops = { |
| 889 | .list_groups = sirfsoc_list_groups, | 883 | .get_groups_count = sirfsoc_get_groups_count, |
| 890 | .get_group_name = sirfsoc_get_group_name, | 884 | .get_group_name = sirfsoc_get_group_name, |
| 891 | .get_group_pins = sirfsoc_get_group_pins, | 885 | .get_group_pins = sirfsoc_get_group_pins, |
| 892 | .pin_dbg_show = sirfsoc_pin_dbg_show, | 886 | .pin_dbg_show = sirfsoc_pin_dbg_show, |
| @@ -1033,11 +1027,9 @@ static void sirfsoc_pinmux_disable(struct pinctrl_dev *pmxdev, unsigned selector | |||
| 1033 | sirfsoc_pinmux_endisable(spmx, selector, false); | 1027 | sirfsoc_pinmux_endisable(spmx, selector, false); |
| 1034 | } | 1028 | } |
| 1035 | 1029 | ||
| 1036 | static int sirfsoc_pinmux_list_funcs(struct pinctrl_dev *pmxdev, unsigned selector) | 1030 | static int sirfsoc_pinmux_get_funcs_count(struct pinctrl_dev *pmxdev) |
| 1037 | { | 1031 | { |
| 1038 | if (selector >= ARRAY_SIZE(sirfsoc_pmx_functions)) | 1032 | return ARRAY_SIZE(sirfsoc_pmx_functions); |
| 1039 | return -EINVAL; | ||
| 1040 | return 0; | ||
| 1041 | } | 1033 | } |
| 1042 | 1034 | ||
| 1043 | static const char *sirfsoc_pinmux_get_func_name(struct pinctrl_dev *pctldev, | 1035 | static const char *sirfsoc_pinmux_get_func_name(struct pinctrl_dev *pctldev, |
| @@ -1074,9 +1066,9 @@ static int sirfsoc_pinmux_request_gpio(struct pinctrl_dev *pmxdev, | |||
| 1074 | } | 1066 | } |
| 1075 | 1067 | ||
| 1076 | static struct pinmux_ops sirfsoc_pinmux_ops = { | 1068 | static struct pinmux_ops sirfsoc_pinmux_ops = { |
| 1077 | .list_functions = sirfsoc_pinmux_list_funcs, | ||
| 1078 | .enable = sirfsoc_pinmux_enable, | 1069 | .enable = sirfsoc_pinmux_enable, |
| 1079 | .disable = sirfsoc_pinmux_disable, | 1070 | .disable = sirfsoc_pinmux_disable, |
| 1071 | .get_functions_count = sirfsoc_pinmux_get_funcs_count, | ||
| 1080 | .get_function_name = sirfsoc_pinmux_get_func_name, | 1072 | .get_function_name = sirfsoc_pinmux_get_func_name, |
| 1081 | .get_function_groups = sirfsoc_pinmux_get_groups, | 1073 | .get_function_groups = sirfsoc_pinmux_get_groups, |
| 1082 | .gpio_request_enable = sirfsoc_pinmux_request_gpio, | 1074 | .gpio_request_enable = sirfsoc_pinmux_request_gpio, |
diff --git a/drivers/pinctrl/pinctrl-tegra.c b/drivers/pinctrl/pinctrl-tegra.c index 9b329688120c..b6934867d8d3 100644 --- a/drivers/pinctrl/pinctrl-tegra.c +++ b/drivers/pinctrl/pinctrl-tegra.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Driver for the NVIDIA Tegra pinmux | 2 | * Driver for the NVIDIA Tegra pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2011, NVIDIA CORPORATION. All rights reserved. | 4 | * Copyright (c) 2011-2012, NVIDIA CORPORATION. All rights reserved. |
| 5 | * | 5 | * |
| 6 | * Derived from code: | 6 | * Derived from code: |
| 7 | * Copyright (C) 2010 Google, Inc. | 7 | * Copyright (C) 2010 Google, Inc. |
| @@ -22,17 +22,19 @@ | |||
| 22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
| 23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
| 24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
| 25 | #include <linux/of_device.h> | 25 | #include <linux/of.h> |
| 26 | #include <linux/platform_device.h> | ||
| 27 | #include <linux/pinctrl/machine.h> | ||
| 26 | #include <linux/pinctrl/pinctrl.h> | 28 | #include <linux/pinctrl/pinctrl.h> |
| 27 | #include <linux/pinctrl/pinmux.h> | 29 | #include <linux/pinctrl/pinmux.h> |
| 28 | #include <linux/pinctrl/pinconf.h> | 30 | #include <linux/pinctrl/pinconf.h> |
| 31 | #include <linux/slab.h> | ||
| 29 | 32 | ||
| 30 | #include <mach/pinconf-tegra.h> | 33 | #include <mach/pinconf-tegra.h> |
| 31 | 34 | ||
| 35 | #include "core.h" | ||
| 32 | #include "pinctrl-tegra.h" | 36 | #include "pinctrl-tegra.h" |
| 33 | 37 | ||
| 34 | #define DRIVER_NAME "tegra-pinmux-disabled" | ||
| 35 | |||
| 36 | struct tegra_pmx { | 38 | struct tegra_pmx { |
| 37 | struct device *dev; | 39 | struct device *dev; |
| 38 | struct pinctrl_dev *pctl; | 40 | struct pinctrl_dev *pctl; |
| @@ -53,15 +55,11 @@ static inline void pmx_writel(struct tegra_pmx *pmx, u32 val, u32 bank, u32 reg) | |||
| 53 | writel(val, pmx->regs[bank] + reg); | 55 | writel(val, pmx->regs[bank] + reg); |
| 54 | } | 56 | } |
| 55 | 57 | ||
| 56 | static int tegra_pinctrl_list_groups(struct pinctrl_dev *pctldev, | 58 | static int tegra_pinctrl_get_groups_count(struct pinctrl_dev *pctldev) |
| 57 | unsigned group) | ||
| 58 | { | 59 | { |
| 59 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | 60 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); |
| 60 | 61 | ||
| 61 | if (group >= pmx->soc->ngroups) | 62 | return pmx->soc->ngroups; |
| 62 | return -EINVAL; | ||
| 63 | |||
| 64 | return 0; | ||
| 65 | } | 63 | } |
| 66 | 64 | ||
| 67 | static const char *tegra_pinctrl_get_group_name(struct pinctrl_dev *pctldev, | 65 | static const char *tegra_pinctrl_get_group_name(struct pinctrl_dev *pctldev, |
| @@ -69,9 +67,6 @@ static const char *tegra_pinctrl_get_group_name(struct pinctrl_dev *pctldev, | |||
| 69 | { | 67 | { |
| 70 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | 68 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); |
| 71 | 69 | ||
| 72 | if (group >= pmx->soc->ngroups) | ||
| 73 | return NULL; | ||
| 74 | |||
| 75 | return pmx->soc->groups[group].name; | 70 | return pmx->soc->groups[group].name; |
| 76 | } | 71 | } |
| 77 | 72 | ||
| @@ -82,38 +77,259 @@ static int tegra_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, | |||
| 82 | { | 77 | { |
| 83 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | 78 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); |
| 84 | 79 | ||
| 85 | if (group >= pmx->soc->ngroups) | ||
| 86 | return -EINVAL; | ||
| 87 | |||
| 88 | *pins = pmx->soc->groups[group].pins; | 80 | *pins = pmx->soc->groups[group].pins; |
| 89 | *num_pins = pmx->soc->groups[group].npins; | 81 | *num_pins = pmx->soc->groups[group].npins; |
| 90 | 82 | ||
| 91 | return 0; | 83 | return 0; |
| 92 | } | 84 | } |
| 93 | 85 | ||
| 86 | #ifdef CONFIG_DEBUG_FS | ||
| 94 | static void tegra_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev, | 87 | static void tegra_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev, |
| 95 | struct seq_file *s, | 88 | struct seq_file *s, |
| 96 | unsigned offset) | 89 | unsigned offset) |
| 97 | { | 90 | { |
| 98 | seq_printf(s, " " DRIVER_NAME); | 91 | seq_printf(s, " %s", dev_name(pctldev->dev)); |
| 92 | } | ||
| 93 | #endif | ||
| 94 | |||
| 95 | static int reserve_map(struct device *dev, struct pinctrl_map **map, | ||
| 96 | unsigned *reserved_maps, unsigned *num_maps, | ||
| 97 | unsigned reserve) | ||
| 98 | { | ||
| 99 | unsigned old_num = *reserved_maps; | ||
| 100 | unsigned new_num = *num_maps + reserve; | ||
| 101 | struct pinctrl_map *new_map; | ||
| 102 | |||
| 103 | if (old_num >= new_num) | ||
| 104 | return 0; | ||
| 105 | |||
| 106 | new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL); | ||
| 107 | if (!new_map) { | ||
| 108 | dev_err(dev, "krealloc(map) failed\n"); | ||
| 109 | return -ENOMEM; | ||
| 110 | } | ||
| 111 | |||
| 112 | memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map)); | ||
| 113 | |||
| 114 | *map = new_map; | ||
| 115 | *reserved_maps = new_num; | ||
| 116 | |||
| 117 | return 0; | ||
| 118 | } | ||
| 119 | |||
| 120 | static int add_map_mux(struct pinctrl_map **map, unsigned *reserved_maps, | ||
| 121 | unsigned *num_maps, const char *group, | ||
| 122 | const char *function) | ||
| 123 | { | ||
| 124 | if (WARN_ON(*num_maps == *reserved_maps)) | ||
| 125 | return -ENOSPC; | ||
| 126 | |||
| 127 | (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP; | ||
| 128 | (*map)[*num_maps].data.mux.group = group; | ||
| 129 | (*map)[*num_maps].data.mux.function = function; | ||
| 130 | (*num_maps)++; | ||
| 131 | |||
| 132 | return 0; | ||
| 133 | } | ||
| 134 | |||
| 135 | static int add_map_configs(struct device *dev, struct pinctrl_map **map, | ||
| 136 | unsigned *reserved_maps, unsigned *num_maps, | ||
| 137 | const char *group, unsigned long *configs, | ||
| 138 | unsigned num_configs) | ||
| 139 | { | ||
| 140 | unsigned long *dup_configs; | ||
| 141 | |||
| 142 | if (WARN_ON(*num_maps == *reserved_maps)) | ||
| 143 | return -ENOSPC; | ||
| 144 | |||
| 145 | dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs), | ||
| 146 | GFP_KERNEL); | ||
| 147 | if (!dup_configs) { | ||
| 148 | dev_err(dev, "kmemdup(configs) failed\n"); | ||
| 149 | return -ENOMEM; | ||
| 150 | } | ||
| 151 | |||
| 152 | (*map)[*num_maps].type = PIN_MAP_TYPE_CONFIGS_GROUP; | ||
| 153 | (*map)[*num_maps].data.configs.group_or_pin = group; | ||
| 154 | (*map)[*num_maps].data.configs.configs = dup_configs; | ||
| 155 | (*map)[*num_maps].data.configs.num_configs = num_configs; | ||
| 156 | (*num_maps)++; | ||
| 157 | |||
| 158 | return 0; | ||
| 159 | } | ||
| 160 | |||
| 161 | static int add_config(struct device *dev, unsigned long **configs, | ||
| 162 | unsigned *num_configs, unsigned long config) | ||
| 163 | { | ||
| 164 | unsigned old_num = *num_configs; | ||
| 165 | unsigned new_num = old_num + 1; | ||
| 166 | unsigned long *new_configs; | ||
| 167 | |||
| 168 | new_configs = krealloc(*configs, sizeof(*new_configs) * new_num, | ||
| 169 | GFP_KERNEL); | ||
| 170 | if (!new_configs) { | ||
| 171 | dev_err(dev, "krealloc(configs) failed\n"); | ||
| 172 | return -ENOMEM; | ||
| 173 | } | ||
| 174 | |||
| 175 | new_configs[old_num] = config; | ||
| 176 | |||
| 177 | *configs = new_configs; | ||
| 178 | *num_configs = new_num; | ||
| 179 | |||
| 180 | return 0; | ||
| 181 | } | ||
| 182 | |||
| 183 | void tegra_pinctrl_dt_free_map(struct pinctrl_dev *pctldev, | ||
| 184 | struct pinctrl_map *map, unsigned num_maps) | ||
| 185 | { | ||
| 186 | int i; | ||
| 187 | |||
| 188 | for (i = 0; i < num_maps; i++) | ||
| 189 | if (map[i].type == PIN_MAP_TYPE_CONFIGS_GROUP) | ||
| 190 | kfree(map[i].data.configs.configs); | ||
| 191 | |||
| 192 | kfree(map); | ||
| 193 | } | ||
| 194 | |||
| 195 | static const struct cfg_param { | ||
| 196 | const char *property; | ||
| 197 | enum tegra_pinconf_param param; | ||
| 198 | } cfg_params[] = { | ||
| 199 | {"nvidia,pull", TEGRA_PINCONF_PARAM_PULL}, | ||
| 200 | {"nvidia,tristate", TEGRA_PINCONF_PARAM_TRISTATE}, | ||
| 201 | {"nvidia,enable-input", TEGRA_PINCONF_PARAM_ENABLE_INPUT}, | ||
| 202 | {"nvidia,open-drain", TEGRA_PINCONF_PARAM_OPEN_DRAIN}, | ||
| 203 | {"nvidia,lock", TEGRA_PINCONF_PARAM_LOCK}, | ||
| 204 | {"nvidia,io-reset", TEGRA_PINCONF_PARAM_IORESET}, | ||
| 205 | {"nvidia,high-speed-mode", TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE}, | ||
| 206 | {"nvidia,schmitt", TEGRA_PINCONF_PARAM_SCHMITT}, | ||
| 207 | {"nvidia,low-power-mode", TEGRA_PINCONF_PARAM_LOW_POWER_MODE}, | ||
| 208 | {"nvidia,pull-down-strength", TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH}, | ||
| 209 | {"nvidia,pull-up-strength", TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH}, | ||
| 210 | {"nvidia,slew-rate-falling", TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING}, | ||
| 211 | {"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING}, | ||
| 212 | }; | ||
| 213 | |||
| 214 | int tegra_pinctrl_dt_subnode_to_map(struct device *dev, | ||
| 215 | struct device_node *np, | ||
| 216 | struct pinctrl_map **map, | ||
| 217 | unsigned *reserved_maps, | ||
| 218 | unsigned *num_maps) | ||
| 219 | { | ||
| 220 | int ret, i; | ||
| 221 | const char *function; | ||
| 222 | u32 val; | ||
| 223 | unsigned long config; | ||
| 224 | unsigned long *configs = NULL; | ||
| 225 | unsigned num_configs = 0; | ||
| 226 | unsigned reserve; | ||
| 227 | struct property *prop; | ||
| 228 | const char *group; | ||
| 229 | |||
| 230 | ret = of_property_read_string(np, "nvidia,function", &function); | ||
| 231 | if (ret < 0) { | ||
| 232 | /* EINVAL=missing, which is fine since it's optional */ | ||
| 233 | if (ret != -EINVAL) | ||
| 234 | dev_err(dev, | ||
| 235 | "could not parse property nvidia,function\n"); | ||
| 236 | function = NULL; | ||
| 237 | } | ||
| 238 | |||
| 239 | for (i = 0; i < ARRAY_SIZE(cfg_params); i++) { | ||
| 240 | ret = of_property_read_u32(np, cfg_params[i].property, &val); | ||
| 241 | if (!ret) { | ||
| 242 | config = TEGRA_PINCONF_PACK(cfg_params[i].param, val); | ||
| 243 | ret = add_config(dev, &configs, &num_configs, config); | ||
| 244 | if (ret < 0) | ||
| 245 | goto exit; | ||
| 246 | /* EINVAL=missing, which is fine since it's optional */ | ||
| 247 | } else if (ret != -EINVAL) { | ||
| 248 | dev_err(dev, "could not parse property %s\n", | ||
| 249 | cfg_params[i].property); | ||
| 250 | } | ||
| 251 | } | ||
| 252 | |||
| 253 | reserve = 0; | ||
| 254 | if (function != NULL) | ||
| 255 | reserve++; | ||
| 256 | if (num_configs) | ||
| 257 | reserve++; | ||
| 258 | ret = of_property_count_strings(np, "nvidia,pins"); | ||
| 259 | if (ret < 0) { | ||
| 260 | dev_err(dev, "could not parse property nvidia,pins\n"); | ||
| 261 | goto exit; | ||
| 262 | } | ||
| 263 | reserve *= ret; | ||
| 264 | |||
| 265 | ret = reserve_map(dev, map, reserved_maps, num_maps, reserve); | ||
| 266 | if (ret < 0) | ||
| 267 | goto exit; | ||
| 268 | |||
| 269 | of_property_for_each_string(np, "nvidia,pins", prop, group) { | ||
| 270 | if (function) { | ||
| 271 | ret = add_map_mux(map, reserved_maps, num_maps, | ||
| 272 | group, function); | ||
| 273 | if (ret < 0) | ||
| 274 | goto exit; | ||
| 275 | } | ||
| 276 | |||
| 277 | if (num_configs) { | ||
| 278 | ret = add_map_configs(dev, map, reserved_maps, | ||
| 279 | num_maps, group, configs, | ||
| 280 | num_configs); | ||
| 281 | if (ret < 0) | ||
| 282 | goto exit; | ||
| 283 | } | ||
| 284 | } | ||
| 285 | |||
| 286 | ret = 0; | ||
| 287 | |||
| 288 | exit: | ||
| 289 | kfree(configs); | ||
| 290 | return ret; | ||
| 291 | } | ||
| 292 | |||
| 293 | int tegra_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, | ||
| 294 | struct device_node *np_config, | ||
| 295 | struct pinctrl_map **map, unsigned *num_maps) | ||
| 296 | { | ||
| 297 | unsigned reserved_maps; | ||
| 298 | struct device_node *np; | ||
| 299 | int ret; | ||
| 300 | |||
| 301 | reserved_maps = 0; | ||
| 302 | *map = NULL; | ||
| 303 | *num_maps = 0; | ||
| 304 | |||
| 305 | for_each_child_of_node(np_config, np) { | ||
| 306 | ret = tegra_pinctrl_dt_subnode_to_map(pctldev->dev, np, map, | ||
| 307 | &reserved_maps, num_maps); | ||
| 308 | if (ret < 0) { | ||
| 309 | tegra_pinctrl_dt_free_map(pctldev, *map, *num_maps); | ||
| 310 | return ret; | ||
| 311 | } | ||
| 312 | } | ||
| 313 | |||
| 314 | return 0; | ||
| 99 | } | 315 | } |
| 100 | 316 | ||
| 101 | static struct pinctrl_ops tegra_pinctrl_ops = { | 317 | static struct pinctrl_ops tegra_pinctrl_ops = { |
| 102 | .list_groups = tegra_pinctrl_list_groups, | 318 | .get_groups_count = tegra_pinctrl_get_groups_count, |
| 103 | .get_group_name = tegra_pinctrl_get_group_name, | 319 | .get_group_name = tegra_pinctrl_get_group_name, |
| 104 | .get_group_pins = tegra_pinctrl_get_group_pins, | 320 | .get_group_pins = tegra_pinctrl_get_group_pins, |
| 321 | #ifdef CONFIG_DEBUG_FS | ||
| 105 | .pin_dbg_show = tegra_pinctrl_pin_dbg_show, | 322 | .pin_dbg_show = tegra_pinctrl_pin_dbg_show, |
| 323 | #endif | ||
| 324 | .dt_node_to_map = tegra_pinctrl_dt_node_to_map, | ||
| 325 | .dt_free_map = tegra_pinctrl_dt_free_map, | ||
| 106 | }; | 326 | }; |
| 107 | 327 | ||
| 108 | static int tegra_pinctrl_list_funcs(struct pinctrl_dev *pctldev, | 328 | static int tegra_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev) |
| 109 | unsigned function) | ||
| 110 | { | 329 | { |
| 111 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | 330 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); |
| 112 | 331 | ||
| 113 | if (function >= pmx->soc->nfunctions) | 332 | return pmx->soc->nfunctions; |
| 114 | return -EINVAL; | ||
| 115 | |||
| 116 | return 0; | ||
| 117 | } | 333 | } |
| 118 | 334 | ||
| 119 | static const char *tegra_pinctrl_get_func_name(struct pinctrl_dev *pctldev, | 335 | static const char *tegra_pinctrl_get_func_name(struct pinctrl_dev *pctldev, |
| @@ -121,9 +337,6 @@ static const char *tegra_pinctrl_get_func_name(struct pinctrl_dev *pctldev, | |||
| 121 | { | 337 | { |
| 122 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | 338 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); |
| 123 | 339 | ||
| 124 | if (function >= pmx->soc->nfunctions) | ||
| 125 | return NULL; | ||
| 126 | |||
| 127 | return pmx->soc->functions[function].name; | 340 | return pmx->soc->functions[function].name; |
| 128 | } | 341 | } |
| 129 | 342 | ||
| @@ -134,9 +347,6 @@ static int tegra_pinctrl_get_func_groups(struct pinctrl_dev *pctldev, | |||
| 134 | { | 347 | { |
| 135 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | 348 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); |
| 136 | 349 | ||
| 137 | if (function >= pmx->soc->nfunctions) | ||
| 138 | return -EINVAL; | ||
| 139 | |||
| 140 | *groups = pmx->soc->functions[function].groups; | 350 | *groups = pmx->soc->functions[function].groups; |
| 141 | *num_groups = pmx->soc->functions[function].ngroups; | 351 | *num_groups = pmx->soc->functions[function].ngroups; |
| 142 | 352 | ||
| @@ -151,18 +361,16 @@ static int tegra_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function, | |||
| 151 | int i; | 361 | int i; |
| 152 | u32 val; | 362 | u32 val; |
| 153 | 363 | ||
| 154 | if (group >= pmx->soc->ngroups) | ||
| 155 | return -EINVAL; | ||
| 156 | g = &pmx->soc->groups[group]; | 364 | g = &pmx->soc->groups[group]; |
| 157 | 365 | ||
| 158 | if (g->mux_reg < 0) | 366 | if (WARN_ON(g->mux_reg < 0)) |
| 159 | return -EINVAL; | 367 | return -EINVAL; |
| 160 | 368 | ||
| 161 | for (i = 0; i < ARRAY_SIZE(g->funcs); i++) { | 369 | for (i = 0; i < ARRAY_SIZE(g->funcs); i++) { |
| 162 | if (g->funcs[i] == function) | 370 | if (g->funcs[i] == function) |
| 163 | break; | 371 | break; |
| 164 | } | 372 | } |
| 165 | if (i == ARRAY_SIZE(g->funcs)) | 373 | if (WARN_ON(i == ARRAY_SIZE(g->funcs))) |
| 166 | return -EINVAL; | 374 | return -EINVAL; |
| 167 | 375 | ||
| 168 | val = pmx_readl(pmx, g->mux_bank, g->mux_reg); | 376 | val = pmx_readl(pmx, g->mux_bank, g->mux_reg); |
| @@ -180,11 +388,9 @@ static void tegra_pinctrl_disable(struct pinctrl_dev *pctldev, | |||
| 180 | const struct tegra_pingroup *g; | 388 | const struct tegra_pingroup *g; |
| 181 | u32 val; | 389 | u32 val; |
| 182 | 390 | ||
| 183 | if (group >= pmx->soc->ngroups) | ||
| 184 | return; | ||
| 185 | g = &pmx->soc->groups[group]; | 391 | g = &pmx->soc->groups[group]; |
| 186 | 392 | ||
| 187 | if (g->mux_reg < 0) | 393 | if (WARN_ON(g->mux_reg < 0)) |
| 188 | return; | 394 | return; |
| 189 | 395 | ||
| 190 | val = pmx_readl(pmx, g->mux_bank, g->mux_reg); | 396 | val = pmx_readl(pmx, g->mux_bank, g->mux_reg); |
| @@ -194,7 +400,7 @@ static void tegra_pinctrl_disable(struct pinctrl_dev *pctldev, | |||
| 194 | } | 400 | } |
| 195 | 401 | ||
| 196 | static struct pinmux_ops tegra_pinmux_ops = { | 402 | static struct pinmux_ops tegra_pinmux_ops = { |
| 197 | .list_functions = tegra_pinctrl_list_funcs, | 403 | .get_functions_count = tegra_pinctrl_get_funcs_count, |
| 198 | .get_function_name = tegra_pinctrl_get_func_name, | 404 | .get_function_name = tegra_pinctrl_get_func_name, |
| 199 | .get_function_groups = tegra_pinctrl_get_func_groups, | 405 | .get_function_groups = tegra_pinctrl_get_func_groups, |
| 200 | .enable = tegra_pinctrl_enable, | 406 | .enable = tegra_pinctrl_enable, |
| @@ -204,6 +410,7 @@ static struct pinmux_ops tegra_pinmux_ops = { | |||
| 204 | static int tegra_pinconf_reg(struct tegra_pmx *pmx, | 410 | static int tegra_pinconf_reg(struct tegra_pmx *pmx, |
| 205 | const struct tegra_pingroup *g, | 411 | const struct tegra_pingroup *g, |
| 206 | enum tegra_pinconf_param param, | 412 | enum tegra_pinconf_param param, |
| 413 | bool report_err, | ||
| 207 | s8 *bank, s16 *reg, s8 *bit, s8 *width) | 414 | s8 *bank, s16 *reg, s8 *bit, s8 *width) |
| 208 | { | 415 | { |
| 209 | switch (param) { | 416 | switch (param) { |
| @@ -291,9 +498,10 @@ static int tegra_pinconf_reg(struct tegra_pmx *pmx, | |||
| 291 | } | 498 | } |
| 292 | 499 | ||
| 293 | if (*reg < 0) { | 500 | if (*reg < 0) { |
| 294 | dev_err(pmx->dev, | 501 | if (report_err) |
| 295 | "Config param %04x not supported on group %s\n", | 502 | dev_err(pmx->dev, |
| 296 | param, g->name); | 503 | "Config param %04x not supported on group %s\n", |
| 504 | param, g->name); | ||
| 297 | return -ENOTSUPP; | 505 | return -ENOTSUPP; |
| 298 | } | 506 | } |
| 299 | 507 | ||
| @@ -303,12 +511,14 @@ static int tegra_pinconf_reg(struct tegra_pmx *pmx, | |||
| 303 | static int tegra_pinconf_get(struct pinctrl_dev *pctldev, | 511 | static int tegra_pinconf_get(struct pinctrl_dev *pctldev, |
| 304 | unsigned pin, unsigned long *config) | 512 | unsigned pin, unsigned long *config) |
| 305 | { | 513 | { |
| 514 | dev_err(pctldev->dev, "pin_config_get op not supported\n"); | ||
| 306 | return -ENOTSUPP; | 515 | return -ENOTSUPP; |
| 307 | } | 516 | } |
| 308 | 517 | ||
| 309 | static int tegra_pinconf_set(struct pinctrl_dev *pctldev, | 518 | static int tegra_pinconf_set(struct pinctrl_dev *pctldev, |
| 310 | unsigned pin, unsigned long config) | 519 | unsigned pin, unsigned long config) |
| 311 | { | 520 | { |
| 521 | dev_err(pctldev->dev, "pin_config_set op not supported\n"); | ||
| 312 | return -ENOTSUPP; | 522 | return -ENOTSUPP; |
| 313 | } | 523 | } |
| 314 | 524 | ||
| @@ -324,11 +534,10 @@ static int tegra_pinconf_group_get(struct pinctrl_dev *pctldev, | |||
| 324 | s16 reg; | 534 | s16 reg; |
| 325 | u32 val, mask; | 535 | u32 val, mask; |
| 326 | 536 | ||
| 327 | if (group >= pmx->soc->ngroups) | ||
| 328 | return -EINVAL; | ||
| 329 | g = &pmx->soc->groups[group]; | 537 | g = &pmx->soc->groups[group]; |
| 330 | 538 | ||
| 331 | ret = tegra_pinconf_reg(pmx, g, param, &bank, ®, &bit, &width); | 539 | ret = tegra_pinconf_reg(pmx, g, param, true, &bank, ®, &bit, |
| 540 | &width); | ||
| 332 | if (ret < 0) | 541 | if (ret < 0) |
| 333 | return ret; | 542 | return ret; |
| 334 | 543 | ||
| @@ -353,11 +562,10 @@ static int tegra_pinconf_group_set(struct pinctrl_dev *pctldev, | |||
| 353 | s16 reg; | 562 | s16 reg; |
| 354 | u32 val, mask; | 563 | u32 val, mask; |
| 355 | 564 | ||
| 356 | if (group >= pmx->soc->ngroups) | ||
| 357 | return -EINVAL; | ||
| 358 | g = &pmx->soc->groups[group]; | 565 | g = &pmx->soc->groups[group]; |
| 359 | 566 | ||
| 360 | ret = tegra_pinconf_reg(pmx, g, param, &bank, ®, &bit, &width); | 567 | ret = tegra_pinconf_reg(pmx, g, param, true, &bank, ®, &bit, |
| 568 | &width); | ||
| 361 | if (ret < 0) | 569 | if (ret < 0) |
| 362 | return ret; | 570 | return ret; |
| 363 | 571 | ||
| @@ -365,8 +573,10 @@ static int tegra_pinconf_group_set(struct pinctrl_dev *pctldev, | |||
| 365 | 573 | ||
| 366 | /* LOCK can't be cleared */ | 574 | /* LOCK can't be cleared */ |
| 367 | if (param == TEGRA_PINCONF_PARAM_LOCK) { | 575 | if (param == TEGRA_PINCONF_PARAM_LOCK) { |
| 368 | if ((val & BIT(bit)) && !arg) | 576 | if ((val & BIT(bit)) && !arg) { |
| 577 | dev_err(pctldev->dev, "LOCK bit cannot be cleared\n"); | ||
| 369 | return -EINVAL; | 578 | return -EINVAL; |
| 579 | } | ||
| 370 | } | 580 | } |
| 371 | 581 | ||
| 372 | /* Special-case Boolean values; allow any non-zero as true */ | 582 | /* Special-case Boolean values; allow any non-zero as true */ |
| @@ -375,8 +585,12 @@ static int tegra_pinconf_group_set(struct pinctrl_dev *pctldev, | |||
| 375 | 585 | ||
| 376 | /* Range-check user-supplied value */ | 586 | /* Range-check user-supplied value */ |
| 377 | mask = (1 << width) - 1; | 587 | mask = (1 << width) - 1; |
| 378 | if (arg & ~mask) | 588 | if (arg & ~mask) { |
| 589 | dev_err(pctldev->dev, | ||
| 590 | "config %lx: %x too big for %d bit register\n", | ||
| 591 | config, arg, width); | ||
| 379 | return -EINVAL; | 592 | return -EINVAL; |
| 593 | } | ||
| 380 | 594 | ||
| 381 | /* Update register */ | 595 | /* Update register */ |
| 382 | val &= ~(mask << bit); | 596 | val &= ~(mask << bit); |
| @@ -386,23 +600,78 @@ static int tegra_pinconf_group_set(struct pinctrl_dev *pctldev, | |||
| 386 | return 0; | 600 | return 0; |
| 387 | } | 601 | } |
| 388 | 602 | ||
| 603 | #ifdef CONFIG_DEBUG_FS | ||
| 389 | static void tegra_pinconf_dbg_show(struct pinctrl_dev *pctldev, | 604 | static void tegra_pinconf_dbg_show(struct pinctrl_dev *pctldev, |
| 390 | struct seq_file *s, unsigned offset) | 605 | struct seq_file *s, unsigned offset) |
| 391 | { | 606 | { |
| 392 | } | 607 | } |
| 393 | 608 | ||
| 609 | static const char *strip_prefix(const char *s) | ||
| 610 | { | ||
| 611 | const char *comma = strchr(s, ','); | ||
| 612 | if (!comma) | ||
| 613 | return s; | ||
| 614 | |||
| 615 | return comma + 1; | ||
| 616 | } | ||
| 617 | |||
| 394 | static void tegra_pinconf_group_dbg_show(struct pinctrl_dev *pctldev, | 618 | static void tegra_pinconf_group_dbg_show(struct pinctrl_dev *pctldev, |
| 395 | struct seq_file *s, unsigned selector) | 619 | struct seq_file *s, unsigned group) |
| 396 | { | 620 | { |
| 621 | struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | ||
| 622 | const struct tegra_pingroup *g; | ||
| 623 | int i, ret; | ||
| 624 | s8 bank, bit, width; | ||
| 625 | s16 reg; | ||
| 626 | u32 val; | ||
| 627 | |||
| 628 | g = &pmx->soc->groups[group]; | ||
| 629 | |||
| 630 | for (i = 0; i < ARRAY_SIZE(cfg_params); i++) { | ||
| 631 | ret = tegra_pinconf_reg(pmx, g, cfg_params[i].param, false, | ||
| 632 | &bank, ®, &bit, &width); | ||
| 633 | if (ret < 0) | ||
| 634 | continue; | ||
| 635 | |||
| 636 | val = pmx_readl(pmx, bank, reg); | ||
| 637 | val >>= bit; | ||
| 638 | val &= (1 << width) - 1; | ||
| 639 | |||
| 640 | seq_printf(s, "\n\t%s=%u", | ||
| 641 | strip_prefix(cfg_params[i].property), val); | ||
| 642 | } | ||
| 397 | } | 643 | } |
| 398 | 644 | ||
| 645 | static void tegra_pinconf_config_dbg_show(struct pinctrl_dev *pctldev, | ||
| 646 | struct seq_file *s, | ||
| 647 | unsigned long config) | ||
| 648 | { | ||
| 649 | enum tegra_pinconf_param param = TEGRA_PINCONF_UNPACK_PARAM(config); | ||
| 650 | u16 arg = TEGRA_PINCONF_UNPACK_ARG(config); | ||
| 651 | const char *pname = "unknown"; | ||
| 652 | int i; | ||
| 653 | |||
| 654 | for (i = 0; i < ARRAY_SIZE(cfg_params); i++) { | ||
| 655 | if (cfg_params[i].param == param) { | ||
| 656 | pname = cfg_params[i].property; | ||
| 657 | break; | ||
| 658 | } | ||
| 659 | } | ||
| 660 | |||
| 661 | seq_printf(s, "%s=%d", strip_prefix(pname), arg); | ||
| 662 | } | ||
| 663 | #endif | ||
| 664 | |||
| 399 | struct pinconf_ops tegra_pinconf_ops = { | 665 | struct pinconf_ops tegra_pinconf_ops = { |
| 400 | .pin_config_get = tegra_pinconf_get, | 666 | .pin_config_get = tegra_pinconf_get, |
| 401 | .pin_config_set = tegra_pinconf_set, | 667 | .pin_config_set = tegra_pinconf_set, |
| 402 | .pin_config_group_get = tegra_pinconf_group_get, | 668 | .pin_config_group_get = tegra_pinconf_group_get, |
| 403 | .pin_config_group_set = tegra_pinconf_group_set, | 669 | .pin_config_group_set = tegra_pinconf_group_set, |
| 670 | #ifdef CONFIG_DEBUG_FS | ||
| 404 | .pin_config_dbg_show = tegra_pinconf_dbg_show, | 671 | .pin_config_dbg_show = tegra_pinconf_dbg_show, |
| 405 | .pin_config_group_dbg_show = tegra_pinconf_group_dbg_show, | 672 | .pin_config_group_dbg_show = tegra_pinconf_group_dbg_show, |
| 673 | .pin_config_config_dbg_show = tegra_pinconf_config_dbg_show, | ||
| 674 | #endif | ||
| 406 | }; | 675 | }; |
| 407 | 676 | ||
| 408 | static struct pinctrl_gpio_range tegra_pinctrl_gpio_range = { | 677 | static struct pinctrl_gpio_range tegra_pinctrl_gpio_range = { |
| @@ -412,60 +681,29 @@ static struct pinctrl_gpio_range tegra_pinctrl_gpio_range = { | |||
| 412 | }; | 681 | }; |
| 413 | 682 | ||
| 414 | static struct pinctrl_desc tegra_pinctrl_desc = { | 683 | static struct pinctrl_desc tegra_pinctrl_desc = { |
| 415 | .name = DRIVER_NAME, | ||
| 416 | .pctlops = &tegra_pinctrl_ops, | 684 | .pctlops = &tegra_pinctrl_ops, |
| 417 | .pmxops = &tegra_pinmux_ops, | 685 | .pmxops = &tegra_pinmux_ops, |
| 418 | .confops = &tegra_pinconf_ops, | 686 | .confops = &tegra_pinconf_ops, |
| 419 | .owner = THIS_MODULE, | 687 | .owner = THIS_MODULE, |
| 420 | }; | 688 | }; |
| 421 | 689 | ||
| 422 | static struct of_device_id tegra_pinctrl_of_match[] __devinitdata = { | 690 | int __devinit tegra_pinctrl_probe(struct platform_device *pdev, |
| 423 | #ifdef CONFIG_PINCTRL_TEGRA20 | 691 | const struct tegra_pinctrl_soc_data *soc_data) |
| 424 | { | ||
| 425 | .compatible = "nvidia,tegra20-pinmux-disabled", | ||
| 426 | .data = tegra20_pinctrl_init, | ||
| 427 | }, | ||
| 428 | #endif | ||
| 429 | #ifdef CONFIG_PINCTRL_TEGRA30 | ||
| 430 | { | ||
| 431 | .compatible = "nvidia,tegra30-pinmux-disabled", | ||
| 432 | .data = tegra30_pinctrl_init, | ||
| 433 | }, | ||
| 434 | #endif | ||
| 435 | {}, | ||
| 436 | }; | ||
| 437 | |||
| 438 | static int __devinit tegra_pinctrl_probe(struct platform_device *pdev) | ||
| 439 | { | 692 | { |
| 440 | const struct of_device_id *match; | ||
| 441 | tegra_pinctrl_soc_initf initf = NULL; | ||
| 442 | struct tegra_pmx *pmx; | 693 | struct tegra_pmx *pmx; |
| 443 | struct resource *res; | 694 | struct resource *res; |
| 444 | int i; | 695 | int i; |
| 445 | 696 | ||
| 446 | match = of_match_device(tegra_pinctrl_of_match, &pdev->dev); | ||
| 447 | if (match) | ||
| 448 | initf = (tegra_pinctrl_soc_initf)match->data; | ||
| 449 | #ifdef CONFIG_PINCTRL_TEGRA20 | ||
| 450 | if (!initf) | ||
| 451 | initf = tegra20_pinctrl_init; | ||
| 452 | #endif | ||
| 453 | if (!initf) { | ||
| 454 | dev_err(&pdev->dev, | ||
| 455 | "Could not determine SoC-specific init func\n"); | ||
| 456 | return -EINVAL; | ||
| 457 | } | ||
| 458 | |||
| 459 | pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL); | 697 | pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL); |
| 460 | if (!pmx) { | 698 | if (!pmx) { |
| 461 | dev_err(&pdev->dev, "Can't alloc tegra_pmx\n"); | 699 | dev_err(&pdev->dev, "Can't alloc tegra_pmx\n"); |
| 462 | return -ENOMEM; | 700 | return -ENOMEM; |
| 463 | } | 701 | } |
| 464 | pmx->dev = &pdev->dev; | 702 | pmx->dev = &pdev->dev; |
| 465 | 703 | pmx->soc = soc_data; | |
| 466 | (*initf)(&pmx->soc); | ||
| 467 | 704 | ||
| 468 | tegra_pinctrl_gpio_range.npins = pmx->soc->ngpios; | 705 | tegra_pinctrl_gpio_range.npins = pmx->soc->ngpios; |
| 706 | tegra_pinctrl_desc.name = dev_name(&pdev->dev); | ||
| 469 | tegra_pinctrl_desc.pins = pmx->soc->pins; | 707 | tegra_pinctrl_desc.pins = pmx->soc->pins; |
| 470 | tegra_pinctrl_desc.npins = pmx->soc->npins; | 708 | tegra_pinctrl_desc.npins = pmx->soc->npins; |
| 471 | 709 | ||
| @@ -520,8 +758,9 @@ static int __devinit tegra_pinctrl_probe(struct platform_device *pdev) | |||
| 520 | 758 | ||
| 521 | return 0; | 759 | return 0; |
| 522 | } | 760 | } |
| 761 | EXPORT_SYMBOL_GPL(tegra_pinctrl_probe); | ||
| 523 | 762 | ||
| 524 | static int __devexit tegra_pinctrl_remove(struct platform_device *pdev) | 763 | int __devexit tegra_pinctrl_remove(struct platform_device *pdev) |
| 525 | { | 764 | { |
| 526 | struct tegra_pmx *pmx = platform_get_drvdata(pdev); | 765 | struct tegra_pmx *pmx = platform_get_drvdata(pdev); |
| 527 | 766 | ||
| @@ -530,30 +769,4 @@ static int __devexit tegra_pinctrl_remove(struct platform_device *pdev) | |||
| 530 | 769 | ||
| 531 | return 0; | 770 | return 0; |
| 532 | } | 771 | } |
| 533 | 772 | EXPORT_SYMBOL_GPL(tegra_pinctrl_remove); | |
| 534 | static struct platform_driver tegra_pinctrl_driver = { | ||
| 535 | .driver = { | ||
| 536 | .name = DRIVER_NAME, | ||
| 537 | .owner = THIS_MODULE, | ||
| 538 | .of_match_table = tegra_pinctrl_of_match, | ||
| 539 | }, | ||
| 540 | .probe = tegra_pinctrl_probe, | ||
| 541 | .remove = __devexit_p(tegra_pinctrl_remove), | ||
| 542 | }; | ||
| 543 | |||
| 544 | static int __init tegra_pinctrl_init(void) | ||
| 545 | { | ||
| 546 | return platform_driver_register(&tegra_pinctrl_driver); | ||
| 547 | } | ||
| 548 | arch_initcall(tegra_pinctrl_init); | ||
| 549 | |||
| 550 | static void __exit tegra_pinctrl_exit(void) | ||
| 551 | { | ||
| 552 | platform_driver_unregister(&tegra_pinctrl_driver); | ||
| 553 | } | ||
| 554 | module_exit(tegra_pinctrl_exit); | ||
| 555 | |||
| 556 | MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>"); | ||
| 557 | MODULE_DESCRIPTION("NVIDIA Tegra pinctrl driver"); | ||
| 558 | MODULE_LICENSE("GPL v2"); | ||
| 559 | MODULE_DEVICE_TABLE(of, tegra_pinctrl_of_match); | ||
diff --git a/drivers/pinctrl/pinctrl-tegra.h b/drivers/pinctrl/pinctrl-tegra.h index 782c795326ef..705c007a38cc 100644 --- a/drivers/pinctrl/pinctrl-tegra.h +++ b/drivers/pinctrl/pinctrl-tegra.h | |||
| @@ -139,25 +139,8 @@ struct tegra_pinctrl_soc_data { | |||
| 139 | unsigned ngroups; | 139 | unsigned ngroups; |
| 140 | }; | 140 | }; |
| 141 | 141 | ||
| 142 | /** | 142 | int tegra_pinctrl_probe(struct platform_device *pdev, |
| 143 | * tegra_pinctrl_soc_initf() - Retrieve pin controller details for a SoC. | 143 | const struct tegra_pinctrl_soc_data *soc_data); |
| 144 | * @soc_data: This pointer must be updated to point at a struct containing | 144 | int tegra_pinctrl_remove(struct platform_device *pdev); |
| 145 | * details of the SoC. | ||
| 146 | */ | ||
| 147 | typedef void (*tegra_pinctrl_soc_initf)( | ||
| 148 | const struct tegra_pinctrl_soc_data **soc_data); | ||
| 149 | |||
| 150 | /** | ||
| 151 | * tegra20_pinctrl_init() - Retrieve pin controller details for Tegra20 | ||
| 152 | * @soc_data: This pointer will be updated to point at a struct containing | ||
| 153 | * details of Tegra20's pin controller. | ||
| 154 | */ | ||
| 155 | void tegra20_pinctrl_init(const struct tegra_pinctrl_soc_data **soc_data); | ||
| 156 | /** | ||
| 157 | * tegra30_pinctrl_init() - Retrieve pin controller details for Tegra20 | ||
| 158 | * @soc_data: This pointer will be updated to point at a struct containing | ||
| 159 | * details of Tegra30's pin controller. | ||
| 160 | */ | ||
| 161 | void tegra30_pinctrl_init(const struct tegra_pinctrl_soc_data **soc_data); | ||
| 162 | 145 | ||
| 163 | #endif | 146 | #endif |
diff --git a/drivers/pinctrl/pinctrl-tegra20.c b/drivers/pinctrl/pinctrl-tegra20.c index f69ff96aa292..a74f9a568536 100644 --- a/drivers/pinctrl/pinctrl-tegra20.c +++ b/drivers/pinctrl/pinctrl-tegra20.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Pinctrl data for the NVIDIA Tegra20 pinmux | 2 | * Pinctrl data for the NVIDIA Tegra20 pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2011, NVIDIA CORPORATION. All rights reserved. | 4 | * Copyright (c) 2011-2012, NVIDIA CORPORATION. All rights reserved. |
| 5 | * | 5 | * |
| 6 | * Derived from code: | 6 | * Derived from code: |
| 7 | * Copyright (C) 2010 Google, Inc. | 7 | * Copyright (C) 2010 Google, Inc. |
| @@ -17,6 +17,8 @@ | |||
| 17 | * more details. | 17 | * more details. |
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | #include <linux/module.h> | ||
| 21 | #include <linux/of.h> | ||
| 20 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
| 21 | #include <linux/pinctrl/pinctrl.h> | 23 | #include <linux/pinctrl/pinctrl.h> |
| 22 | #include <linux/pinctrl/pinmux.h> | 24 | #include <linux/pinctrl/pinmux.h> |
| @@ -2854,7 +2856,39 @@ static const struct tegra_pinctrl_soc_data tegra20_pinctrl = { | |||
| 2854 | .ngroups = ARRAY_SIZE(tegra20_groups), | 2856 | .ngroups = ARRAY_SIZE(tegra20_groups), |
| 2855 | }; | 2857 | }; |
| 2856 | 2858 | ||
| 2857 | void __devinit tegra20_pinctrl_init(const struct tegra_pinctrl_soc_data **soc) | 2859 | static int __devinit tegra20_pinctrl_probe(struct platform_device *pdev) |
| 2858 | { | 2860 | { |
| 2859 | *soc = &tegra20_pinctrl; | 2861 | return tegra_pinctrl_probe(pdev, &tegra20_pinctrl); |
| 2860 | } | 2862 | } |
| 2863 | |||
| 2864 | static struct of_device_id tegra20_pinctrl_of_match[] __devinitdata = { | ||
| 2865 | { .compatible = "nvidia,tegra20-pinmux", }, | ||
| 2866 | { }, | ||
| 2867 | }; | ||
| 2868 | |||
| 2869 | static struct platform_driver tegra20_pinctrl_driver = { | ||
| 2870 | .driver = { | ||
| 2871 | .name = "tegra20-pinctrl", | ||
| 2872 | .owner = THIS_MODULE, | ||
| 2873 | .of_match_table = tegra20_pinctrl_of_match, | ||
| 2874 | }, | ||
| 2875 | .probe = tegra20_pinctrl_probe, | ||
| 2876 | .remove = __devexit_p(tegra_pinctrl_remove), | ||
| 2877 | }; | ||
| 2878 | |||
| 2879 | static int __init tegra20_pinctrl_init(void) | ||
| 2880 | { | ||
| 2881 | return platform_driver_register(&tegra20_pinctrl_driver); | ||
| 2882 | } | ||
| 2883 | arch_initcall(tegra20_pinctrl_init); | ||
| 2884 | |||
| 2885 | static void __exit tegra20_pinctrl_exit(void) | ||
| 2886 | { | ||
| 2887 | platform_driver_unregister(&tegra20_pinctrl_driver); | ||
| 2888 | } | ||
| 2889 | module_exit(tegra20_pinctrl_exit); | ||
| 2890 | |||
| 2891 | MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>"); | ||
| 2892 | MODULE_DESCRIPTION("NVIDIA Tegra20 pinctrl driver"); | ||
| 2893 | MODULE_LICENSE("GPL v2"); | ||
| 2894 | MODULE_DEVICE_TABLE(of, tegra20_pinctrl_of_match); | ||
diff --git a/drivers/pinctrl/pinctrl-tegra30.c b/drivers/pinctrl/pinctrl-tegra30.c index 4d7571d4a431..0386fdf0da16 100644 --- a/drivers/pinctrl/pinctrl-tegra30.c +++ b/drivers/pinctrl/pinctrl-tegra30.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Pinctrl data for the NVIDIA Tegra30 pinmux | 2 | * Pinctrl data for the NVIDIA Tegra30 pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2011, NVIDIA CORPORATION. All rights reserved. | 4 | * Copyright (c) 2011-2012, NVIDIA CORPORATION. All rights reserved. |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify it | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * under the terms and conditions of the GNU General Public License, | 7 | * under the terms and conditions of the GNU General Public License, |
| @@ -13,6 +13,8 @@ | |||
| 13 | * more details. | 13 | * more details. |
| 14 | */ | 14 | */ |
| 15 | 15 | ||
| 16 | #include <linux/module.h> | ||
| 17 | #include <linux/of.h> | ||
| 16 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
| 17 | #include <linux/pinctrl/pinctrl.h> | 19 | #include <linux/pinctrl/pinctrl.h> |
| 18 | #include <linux/pinctrl/pinmux.h> | 20 | #include <linux/pinctrl/pinmux.h> |
| @@ -3720,7 +3722,39 @@ static const struct tegra_pinctrl_soc_data tegra30_pinctrl = { | |||
| 3720 | .ngroups = ARRAY_SIZE(tegra30_groups), | 3722 | .ngroups = ARRAY_SIZE(tegra30_groups), |
| 3721 | }; | 3723 | }; |
| 3722 | 3724 | ||
| 3723 | void __devinit tegra30_pinctrl_init(const struct tegra_pinctrl_soc_data **soc) | 3725 | static int __devinit tegra30_pinctrl_probe(struct platform_device *pdev) |
| 3724 | { | 3726 | { |
| 3725 | *soc = &tegra30_pinctrl; | 3727 | return tegra_pinctrl_probe(pdev, &tegra30_pinctrl); |
| 3726 | } | 3728 | } |
| 3729 | |||
| 3730 | static struct of_device_id tegra30_pinctrl_of_match[] __devinitdata = { | ||
| 3731 | { .compatible = "nvidia,tegra30-pinmux", }, | ||
| 3732 | { }, | ||
| 3733 | }; | ||
| 3734 | |||
| 3735 | static struct platform_driver tegra30_pinctrl_driver = { | ||
| 3736 | .driver = { | ||
| 3737 | .name = "tegra30-pinctrl", | ||
| 3738 | .owner = THIS_MODULE, | ||
| 3739 | .of_match_table = tegra30_pinctrl_of_match, | ||
| 3740 | }, | ||
| 3741 | .probe = tegra30_pinctrl_probe, | ||
| 3742 | .remove = __devexit_p(tegra_pinctrl_remove), | ||
| 3743 | }; | ||
| 3744 | |||
| 3745 | static int __init tegra30_pinctrl_init(void) | ||
| 3746 | { | ||
| 3747 | return platform_driver_register(&tegra30_pinctrl_driver); | ||
| 3748 | } | ||
| 3749 | arch_initcall(tegra30_pinctrl_init); | ||
| 3750 | |||
| 3751 | static void __exit tegra30_pinctrl_exit(void) | ||
| 3752 | { | ||
| 3753 | platform_driver_unregister(&tegra30_pinctrl_driver); | ||
| 3754 | } | ||
| 3755 | module_exit(tegra30_pinctrl_exit); | ||
| 3756 | |||
| 3757 | MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>"); | ||
| 3758 | MODULE_DESCRIPTION("NVIDIA Tegra30 pinctrl driver"); | ||
| 3759 | MODULE_LICENSE("GPL v2"); | ||
| 3760 | MODULE_DEVICE_TABLE(of, tegra30_pinctrl_of_match); | ||
diff --git a/drivers/pinctrl/pinctrl-u300.c b/drivers/pinctrl/pinctrl-u300.c index 26eb8ccd72d5..05d029911be6 100644 --- a/drivers/pinctrl/pinctrl-u300.c +++ b/drivers/pinctrl/pinctrl-u300.c | |||
| @@ -836,18 +836,14 @@ static const struct u300_pin_group u300_pin_groups[] = { | |||
| 836 | }, | 836 | }, |
| 837 | }; | 837 | }; |
| 838 | 838 | ||
| 839 | static int u300_list_groups(struct pinctrl_dev *pctldev, unsigned selector) | 839 | static int u300_get_groups_count(struct pinctrl_dev *pctldev) |
| 840 | { | 840 | { |
| 841 | if (selector >= ARRAY_SIZE(u300_pin_groups)) | 841 | return ARRAY_SIZE(u300_pin_groups); |
| 842 | return -EINVAL; | ||
| 843 | return 0; | ||
| 844 | } | 842 | } |
| 845 | 843 | ||
| 846 | static const char *u300_get_group_name(struct pinctrl_dev *pctldev, | 844 | static const char *u300_get_group_name(struct pinctrl_dev *pctldev, |
| 847 | unsigned selector) | 845 | unsigned selector) |
| 848 | { | 846 | { |
| 849 | if (selector >= ARRAY_SIZE(u300_pin_groups)) | ||
| 850 | return NULL; | ||
| 851 | return u300_pin_groups[selector].name; | 847 | return u300_pin_groups[selector].name; |
| 852 | } | 848 | } |
| 853 | 849 | ||
| @@ -855,8 +851,6 @@ static int u300_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector, | |||
| 855 | const unsigned **pins, | 851 | const unsigned **pins, |
| 856 | unsigned *num_pins) | 852 | unsigned *num_pins) |
| 857 | { | 853 | { |
| 858 | if (selector >= ARRAY_SIZE(u300_pin_groups)) | ||
| 859 | return -EINVAL; | ||
| 860 | *pins = u300_pin_groups[selector].pins; | 854 | *pins = u300_pin_groups[selector].pins; |
| 861 | *num_pins = u300_pin_groups[selector].num_pins; | 855 | *num_pins = u300_pin_groups[selector].num_pins; |
| 862 | return 0; | 856 | return 0; |
| @@ -869,7 +863,7 @@ static void u300_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, | |||
| 869 | } | 863 | } |
| 870 | 864 | ||
| 871 | static struct pinctrl_ops u300_pctrl_ops = { | 865 | static struct pinctrl_ops u300_pctrl_ops = { |
| 872 | .list_groups = u300_list_groups, | 866 | .get_groups_count = u300_get_groups_count, |
| 873 | .get_group_name = u300_get_group_name, | 867 | .get_group_name = u300_get_group_name, |
| 874 | .get_group_pins = u300_get_group_pins, | 868 | .get_group_pins = u300_get_group_pins, |
| 875 | .pin_dbg_show = u300_pin_dbg_show, | 869 | .pin_dbg_show = u300_pin_dbg_show, |
| @@ -991,11 +985,9 @@ static void u300_pmx_disable(struct pinctrl_dev *pctldev, unsigned selector, | |||
| 991 | u300_pmx_endisable(upmx, selector, false); | 985 | u300_pmx_endisable(upmx, selector, false); |
| 992 | } | 986 | } |
| 993 | 987 | ||
| 994 | static int u300_pmx_list_funcs(struct pinctrl_dev *pctldev, unsigned selector) | 988 | static int u300_pmx_get_funcs_count(struct pinctrl_dev *pctldev) |
| 995 | { | 989 | { |
| 996 | if (selector >= ARRAY_SIZE(u300_pmx_functions)) | 990 | return ARRAY_SIZE(u300_pmx_functions); |
| 997 | return -EINVAL; | ||
| 998 | return 0; | ||
| 999 | } | 991 | } |
| 1000 | 992 | ||
| 1001 | static const char *u300_pmx_get_func_name(struct pinctrl_dev *pctldev, | 993 | static const char *u300_pmx_get_func_name(struct pinctrl_dev *pctldev, |
| @@ -1014,7 +1006,7 @@ static int u300_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned selector, | |||
| 1014 | } | 1006 | } |
| 1015 | 1007 | ||
| 1016 | static struct pinmux_ops u300_pmx_ops = { | 1008 | static struct pinmux_ops u300_pmx_ops = { |
| 1017 | .list_functions = u300_pmx_list_funcs, | 1009 | .get_functions_count = u300_pmx_get_funcs_count, |
| 1018 | .get_function_name = u300_pmx_get_func_name, | 1010 | .get_function_name = u300_pmx_get_func_name, |
| 1019 | .get_function_groups = u300_pmx_get_groups, | 1011 | .get_function_groups = u300_pmx_get_groups, |
| 1020 | .enable = u300_pmx_enable, | 1012 | .enable = u300_pmx_enable, |
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c index 4e62783a573a..fa0357bd88ff 100644 --- a/drivers/pinctrl/pinmux.c +++ b/drivers/pinctrl/pinmux.c | |||
| @@ -33,10 +33,12 @@ | |||
| 33 | int pinmux_check_ops(struct pinctrl_dev *pctldev) | 33 | int pinmux_check_ops(struct pinctrl_dev *pctldev) |
| 34 | { | 34 | { |
| 35 | const struct pinmux_ops *ops = pctldev->desc->pmxops; | 35 | const struct pinmux_ops *ops = pctldev->desc->pmxops; |
| 36 | unsigned nfuncs; | ||
| 36 | unsigned selector = 0; | 37 | unsigned selector = 0; |
| 37 | 38 | ||
| 38 | /* Check that we implement required operations */ | 39 | /* Check that we implement required operations */ |
| 39 | if (!ops->list_functions || | 40 | if (!ops || |
| 41 | !ops->get_functions_count || | ||
| 40 | !ops->get_function_name || | 42 | !ops->get_function_name || |
| 41 | !ops->get_function_groups || | 43 | !ops->get_function_groups || |
| 42 | !ops->enable || | 44 | !ops->enable || |
| @@ -44,11 +46,12 @@ int pinmux_check_ops(struct pinctrl_dev *pctldev) | |||
| 44 | return -EINVAL; | 46 | return -EINVAL; |
| 45 | 47 | ||
| 46 | /* Check that all functions registered have names */ | 48 | /* Check that all functions registered have names */ |
| 47 | while (ops->list_functions(pctldev, selector) >= 0) { | 49 | nfuncs = ops->get_functions_count(pctldev); |
| 50 | while (selector < nfuncs) { | ||
| 48 | const char *fname = ops->get_function_name(pctldev, | 51 | const char *fname = ops->get_function_name(pctldev, |
| 49 | selector); | 52 | selector); |
| 50 | if (!fname) { | 53 | if (!fname) { |
| 51 | pr_err("pinmux ops has no name for function%u\n", | 54 | dev_err(pctldev->dev, "pinmux ops has no name for function%u\n", |
| 52 | selector); | 55 | selector); |
| 53 | return -EINVAL; | 56 | return -EINVAL; |
| 54 | } | 57 | } |
| @@ -85,8 +88,6 @@ static int pin_request(struct pinctrl_dev *pctldev, | |||
| 85 | const struct pinmux_ops *ops = pctldev->desc->pmxops; | 88 | const struct pinmux_ops *ops = pctldev->desc->pmxops; |
| 86 | int status = -EINVAL; | 89 | int status = -EINVAL; |
| 87 | 90 | ||
| 88 | dev_dbg(pctldev->dev, "request pin %d for %s\n", pin, owner); | ||
| 89 | |||
| 90 | desc = pin_desc_get(pctldev, pin); | 91 | desc = pin_desc_get(pctldev, pin); |
| 91 | if (desc == NULL) { | 92 | if (desc == NULL) { |
| 92 | dev_err(pctldev->dev, | 93 | dev_err(pctldev->dev, |
| @@ -94,6 +95,9 @@ static int pin_request(struct pinctrl_dev *pctldev, | |||
| 94 | goto out; | 95 | goto out; |
| 95 | } | 96 | } |
| 96 | 97 | ||
| 98 | dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n", | ||
| 99 | pin, desc->name, owner); | ||
| 100 | |||
| 97 | if (gpio_range) { | 101 | if (gpio_range) { |
| 98 | /* There's no need to support multiple GPIO requests */ | 102 | /* There's no need to support multiple GPIO requests */ |
| 99 | if (desc->gpio_owner) { | 103 | if (desc->gpio_owner) { |
| @@ -287,10 +291,11 @@ static int pinmux_func_name_to_selector(struct pinctrl_dev *pctldev, | |||
| 287 | const char *function) | 291 | const char *function) |
| 288 | { | 292 | { |
| 289 | const struct pinmux_ops *ops = pctldev->desc->pmxops; | 293 | const struct pinmux_ops *ops = pctldev->desc->pmxops; |
| 294 | unsigned nfuncs = ops->get_functions_count(pctldev); | ||
| 290 | unsigned selector = 0; | 295 | unsigned selector = 0; |
| 291 | 296 | ||
| 292 | /* See if this pctldev has this function */ | 297 | /* See if this pctldev has this function */ |
| 293 | while (ops->list_functions(pctldev, selector) >= 0) { | 298 | while (selector < nfuncs) { |
| 294 | const char *fname = ops->get_function_name(pctldev, | 299 | const char *fname = ops->get_function_name(pctldev, |
| 295 | selector); | 300 | selector); |
| 296 | 301 | ||
| @@ -319,6 +324,11 @@ int pinmux_map_to_setting(struct pinctrl_map const *map, | |||
| 319 | const unsigned *pins; | 324 | const unsigned *pins; |
| 320 | unsigned num_pins; | 325 | unsigned num_pins; |
| 321 | 326 | ||
| 327 | if (!pmxops) { | ||
| 328 | dev_err(pctldev->dev, "does not support mux function\n"); | ||
| 329 | return -EINVAL; | ||
| 330 | } | ||
| 331 | |||
| 322 | setting->data.mux.func = | 332 | setting->data.mux.func = |
| 323 | pinmux_func_name_to_selector(pctldev, map->data.mux.function); | 333 | pinmux_func_name_to_selector(pctldev, map->data.mux.function); |
| 324 | if (setting->data.mux.func < 0) | 334 | if (setting->data.mux.func < 0) |
| @@ -477,11 +487,15 @@ static int pinmux_functions_show(struct seq_file *s, void *what) | |||
| 477 | { | 487 | { |
| 478 | struct pinctrl_dev *pctldev = s->private; | 488 | struct pinctrl_dev *pctldev = s->private; |
| 479 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; | 489 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; |
| 490 | unsigned nfuncs; | ||
| 480 | unsigned func_selector = 0; | 491 | unsigned func_selector = 0; |
| 481 | 492 | ||
| 482 | mutex_lock(&pinctrl_mutex); | 493 | if (!pmxops) |
| 494 | return 0; | ||
| 483 | 495 | ||
| 484 | while (pmxops->list_functions(pctldev, func_selector) >= 0) { | 496 | mutex_lock(&pinctrl_mutex); |
| 497 | nfuncs = pmxops->get_functions_count(pctldev); | ||
| 498 | while (func_selector < nfuncs) { | ||
| 485 | const char *func = pmxops->get_function_name(pctldev, | 499 | const char *func = pmxops->get_function_name(pctldev, |
| 486 | func_selector); | 500 | func_selector); |
| 487 | const char * const *groups; | 501 | const char * const *groups; |
| @@ -515,6 +529,9 @@ static int pinmux_pins_show(struct seq_file *s, void *what) | |||
| 515 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; | 529 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; |
| 516 | unsigned i, pin; | 530 | unsigned i, pin; |
| 517 | 531 | ||
| 532 | if (!pmxops) | ||
| 533 | return 0; | ||
| 534 | |||
| 518 | seq_puts(s, "Pinmux settings per pin\n"); | 535 | seq_puts(s, "Pinmux settings per pin\n"); |
| 519 | seq_puts(s, "Format: pin (name): mux_owner gpio_owner hog?\n"); | 536 | seq_puts(s, "Format: pin (name): mux_owner gpio_owner hog?\n"); |
| 520 | 537 | ||
diff --git a/drivers/pinctrl/pinmux.h b/drivers/pinctrl/pinmux.h index 6fc47003e95d..d1a98b1c9fce 100644 --- a/drivers/pinctrl/pinmux.h +++ b/drivers/pinctrl/pinmux.h | |||
| @@ -31,12 +31,6 @@ void pinmux_free_setting(struct pinctrl_setting const *setting); | |||
| 31 | int pinmux_enable_setting(struct pinctrl_setting const *setting); | 31 | int pinmux_enable_setting(struct pinctrl_setting const *setting); |
| 32 | void pinmux_disable_setting(struct pinctrl_setting const *setting); | 32 | void pinmux_disable_setting(struct pinctrl_setting const *setting); |
| 33 | 33 | ||
| 34 | void pinmux_show_map(struct seq_file *s, struct pinctrl_map const *map); | ||
| 35 | void pinmux_show_setting(struct seq_file *s, | ||
| 36 | struct pinctrl_setting const *setting); | ||
| 37 | void pinmux_init_device_debugfs(struct dentry *devroot, | ||
| 38 | struct pinctrl_dev *pctldev); | ||
| 39 | |||
| 40 | #else | 34 | #else |
| 41 | 35 | ||
| 42 | static inline int pinmux_check_ops(struct pinctrl_dev *pctldev) | 36 | static inline int pinmux_check_ops(struct pinctrl_dev *pctldev) |
| @@ -89,6 +83,18 @@ static inline void pinmux_disable_setting( | |||
| 89 | { | 83 | { |
| 90 | } | 84 | } |
| 91 | 85 | ||
| 86 | #endif | ||
| 87 | |||
| 88 | #if defined(CONFIG_PINMUX) && defined(CONFIG_DEBUG_FS) | ||
| 89 | |||
| 90 | void pinmux_show_map(struct seq_file *s, struct pinctrl_map const *map); | ||
| 91 | void pinmux_show_setting(struct seq_file *s, | ||
| 92 | struct pinctrl_setting const *setting); | ||
| 93 | void pinmux_init_device_debugfs(struct dentry *devroot, | ||
| 94 | struct pinctrl_dev *pctldev); | ||
| 95 | |||
| 96 | #else | ||
| 97 | |||
| 92 | static inline void pinmux_show_map(struct seq_file *s, | 98 | static inline void pinmux_show_map(struct seq_file *s, |
| 93 | struct pinctrl_map const *map) | 99 | struct pinctrl_map const *map) |
| 94 | { | 100 | { |
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 86183366647f..10bb3ea276f9 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c | |||
| @@ -581,15 +581,16 @@ static const struct hc_driver tegra_ehci_hc_driver = { | |||
| 581 | .port_handed_over = ehci_port_handed_over, | 581 | .port_handed_over = ehci_port_handed_over, |
| 582 | }; | 582 | }; |
| 583 | 583 | ||
| 584 | static int setup_vbus_gpio(struct platform_device *pdev) | 584 | static int setup_vbus_gpio(struct platform_device *pdev, |
| 585 | struct tegra_ehci_platform_data *pdata) | ||
| 585 | { | 586 | { |
| 586 | int err = 0; | 587 | int err = 0; |
| 587 | int gpio; | 588 | int gpio; |
| 588 | 589 | ||
| 589 | if (!pdev->dev.of_node) | 590 | gpio = pdata->vbus_gpio; |
| 590 | return 0; | 591 | if (!gpio_is_valid(gpio)) |
| 591 | 592 | gpio = of_get_named_gpio(pdev->dev.of_node, | |
| 592 | gpio = of_get_named_gpio(pdev->dev.of_node, "nvidia,vbus-gpio", 0); | 593 | "nvidia,vbus-gpio", 0); |
| 593 | if (!gpio_is_valid(gpio)) | 594 | if (!gpio_is_valid(gpio)) |
| 594 | return 0; | 595 | return 0; |
| 595 | 596 | ||
| @@ -633,7 +634,7 @@ static int tegra_ehci_probe(struct platform_device *pdev) | |||
| 633 | if (!pdev->dev.dma_mask) | 634 | if (!pdev->dev.dma_mask) |
| 634 | pdev->dev.dma_mask = &tegra_ehci_dma_mask; | 635 | pdev->dev.dma_mask = &tegra_ehci_dma_mask; |
| 635 | 636 | ||
| 636 | setup_vbus_gpio(pdev); | 637 | setup_vbus_gpio(pdev, pdata); |
| 637 | 638 | ||
| 638 | tegra = kzalloc(sizeof(struct tegra_ehci_hcd), GFP_KERNEL); | 639 | tegra = kzalloc(sizeof(struct tegra_ehci_hcd), GFP_KERNEL); |
| 639 | if (!tegra) | 640 | if (!tegra) |
| @@ -707,8 +708,9 @@ static int tegra_ehci_probe(struct platform_device *pdev) | |||
| 707 | } | 708 | } |
| 708 | } | 709 | } |
| 709 | 710 | ||
| 710 | tegra->phy = tegra_usb_phy_open(instance, hcd->regs, pdata->phy_config, | 711 | tegra->phy = tegra_usb_phy_open(&pdev->dev, instance, hcd->regs, |
| 711 | TEGRA_USB_PHY_MODE_HOST); | 712 | pdata->phy_config, |
| 713 | TEGRA_USB_PHY_MODE_HOST); | ||
| 712 | if (IS_ERR(tegra->phy)) { | 714 | if (IS_ERR(tegra->phy)) { |
| 713 | dev_err(&pdev->dev, "Failed to open USB phy\n"); | 715 | dev_err(&pdev->dev, "Failed to open USB phy\n"); |
| 714 | err = -ENXIO; | 716 | err = -ENXIO; |
diff --git a/include/linux/of.h b/include/linux/of.h index fa7fb1d97458..e3f942d9da89 100644 --- a/include/linux/of.h +++ b/include/linux/of.h | |||
| @@ -259,6 +259,37 @@ extern void of_detach_node(struct device_node *); | |||
| 259 | #endif | 259 | #endif |
| 260 | 260 | ||
| 261 | #define of_match_ptr(_ptr) (_ptr) | 261 | #define of_match_ptr(_ptr) (_ptr) |
| 262 | |||
| 263 | /* | ||
| 264 | * struct property *prop; | ||
| 265 | * const __be32 *p; | ||
| 266 | * u32 u; | ||
| 267 | * | ||
| 268 | * of_property_for_each_u32(np, "propname", prop, p, u) | ||
| 269 | * printk("U32 value: %x\n", u); | ||
| 270 | */ | ||
| 271 | const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur, | ||
| 272 | u32 *pu); | ||
| 273 | #define of_property_for_each_u32(np, propname, prop, p, u) \ | ||
| 274 | for (prop = of_find_property(np, propname, NULL), \ | ||
| 275 | p = of_prop_next_u32(prop, NULL, &u); \ | ||
| 276 | p; \ | ||
| 277 | p = of_prop_next_u32(prop, p, &u)) | ||
| 278 | |||
| 279 | /* | ||
| 280 | * struct property *prop; | ||
| 281 | * const char *s; | ||
| 282 | * | ||
| 283 | * of_property_for_each_string(np, "propname", prop, s) | ||
| 284 | * printk("String value: %s\n", s); | ||
| 285 | */ | ||
| 286 | const char *of_prop_next_string(struct property *prop, const char *cur); | ||
| 287 | #define of_property_for_each_string(np, propname, prop, s) \ | ||
| 288 | for (prop = of_find_property(np, propname, NULL), \ | ||
| 289 | s = of_prop_next_string(prop, NULL); \ | ||
| 290 | s; \ | ||
| 291 | s = of_prop_next_string(prop, s)) | ||
| 292 | |||
| 262 | #else /* CONFIG_OF */ | 293 | #else /* CONFIG_OF */ |
| 263 | 294 | ||
| 264 | static inline bool of_have_populated_dt(void) | 295 | static inline bool of_have_populated_dt(void) |
| @@ -349,6 +380,10 @@ static inline int of_machine_is_compatible(const char *compat) | |||
| 349 | 380 | ||
| 350 | #define of_match_ptr(_ptr) NULL | 381 | #define of_match_ptr(_ptr) NULL |
| 351 | #define of_match_node(_matches, _node) NULL | 382 | #define of_match_node(_matches, _node) NULL |
| 383 | #define of_property_for_each_u32(np, propname, prop, p, u) \ | ||
| 384 | while (0) | ||
| 385 | #define of_property_for_each_string(np, propname, prop, s) \ | ||
| 386 | while (0) | ||
| 352 | #endif /* CONFIG_OF */ | 387 | #endif /* CONFIG_OF */ |
| 353 | 388 | ||
| 354 | /** | 389 | /** |
diff --git a/include/linux/pinctrl/consumer.h b/include/linux/pinctrl/consumer.h index 191e72688481..6dd96fb45482 100644 --- a/include/linux/pinctrl/consumer.h +++ b/include/linux/pinctrl/consumer.h | |||
| @@ -36,6 +36,9 @@ extern struct pinctrl_state * __must_check pinctrl_lookup_state( | |||
| 36 | const char *name); | 36 | const char *name); |
| 37 | extern int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s); | 37 | extern int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s); |
| 38 | 38 | ||
| 39 | extern struct pinctrl * __must_check devm_pinctrl_get(struct device *dev); | ||
| 40 | extern void devm_pinctrl_put(struct pinctrl *p); | ||
| 41 | |||
| 39 | #else /* !CONFIG_PINCTRL */ | 42 | #else /* !CONFIG_PINCTRL */ |
| 40 | 43 | ||
| 41 | static inline int pinctrl_request_gpio(unsigned gpio) | 44 | static inline int pinctrl_request_gpio(unsigned gpio) |
| @@ -79,6 +82,15 @@ static inline int pinctrl_select_state(struct pinctrl *p, | |||
| 79 | return 0; | 82 | return 0; |
| 80 | } | 83 | } |
| 81 | 84 | ||
| 85 | static inline struct pinctrl * __must_check devm_pinctrl_get(struct device *dev) | ||
| 86 | { | ||
| 87 | return NULL; | ||
| 88 | } | ||
| 89 | |||
| 90 | static inline void devm_pinctrl_put(struct pinctrl *p) | ||
| 91 | { | ||
| 92 | } | ||
| 93 | |||
| 82 | #endif /* CONFIG_PINCTRL */ | 94 | #endif /* CONFIG_PINCTRL */ |
| 83 | 95 | ||
| 84 | static inline struct pinctrl * __must_check pinctrl_get_select( | 96 | static inline struct pinctrl * __must_check pinctrl_get_select( |
| @@ -113,6 +125,38 @@ static inline struct pinctrl * __must_check pinctrl_get_select_default( | |||
| 113 | return pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT); | 125 | return pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT); |
| 114 | } | 126 | } |
| 115 | 127 | ||
| 128 | static inline struct pinctrl * __must_check devm_pinctrl_get_select( | ||
| 129 | struct device *dev, const char *name) | ||
| 130 | { | ||
| 131 | struct pinctrl *p; | ||
| 132 | struct pinctrl_state *s; | ||
| 133 | int ret; | ||
| 134 | |||
| 135 | p = devm_pinctrl_get(dev); | ||
| 136 | if (IS_ERR(p)) | ||
| 137 | return p; | ||
| 138 | |||
| 139 | s = pinctrl_lookup_state(p, name); | ||
| 140 | if (IS_ERR(s)) { | ||
| 141 | devm_pinctrl_put(p); | ||
| 142 | return ERR_PTR(PTR_ERR(s)); | ||
| 143 | } | ||
| 144 | |||
| 145 | ret = pinctrl_select_state(p, s); | ||
| 146 | if (ret < 0) { | ||
| 147 | devm_pinctrl_put(p); | ||
| 148 | return ERR_PTR(ret); | ||
| 149 | } | ||
| 150 | |||
| 151 | return p; | ||
| 152 | } | ||
| 153 | |||
| 154 | static inline struct pinctrl * __must_check devm_pinctrl_get_select_default( | ||
| 155 | struct device *dev) | ||
| 156 | { | ||
| 157 | return devm_pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT); | ||
| 158 | } | ||
| 159 | |||
| 116 | #ifdef CONFIG_PINCONF | 160 | #ifdef CONFIG_PINCONF |
| 117 | 161 | ||
| 118 | extern int pin_config_get(const char *dev_name, const char *name, | 162 | extern int pin_config_get(const char *dev_name, const char *name, |
diff --git a/include/linux/pinctrl/pinconf.h b/include/linux/pinctrl/pinconf.h index ec431f03362d..7b9d5f00ed37 100644 --- a/include/linux/pinctrl/pinconf.h +++ b/include/linux/pinctrl/pinconf.h | |||
| @@ -33,6 +33,8 @@ struct seq_file; | |||
| 33 | * per-device info for a certain pin in debugfs | 33 | * per-device info for a certain pin in debugfs |
| 34 | * @pin_config_group_dbg_show: optional debugfs display hook that will provide | 34 | * @pin_config_group_dbg_show: optional debugfs display hook that will provide |
| 35 | * per-device info for a certain group in debugfs | 35 | * per-device info for a certain group in debugfs |
| 36 | * @pin_config_config_dbg_show: optional debugfs display hook that will decode | ||
| 37 | * and display a driver's pin configuration parameter | ||
| 36 | */ | 38 | */ |
| 37 | struct pinconf_ops { | 39 | struct pinconf_ops { |
| 38 | #ifdef CONFIG_GENERIC_PINCONF | 40 | #ifdef CONFIG_GENERIC_PINCONF |
| @@ -56,6 +58,9 @@ struct pinconf_ops { | |||
| 56 | void (*pin_config_group_dbg_show) (struct pinctrl_dev *pctldev, | 58 | void (*pin_config_group_dbg_show) (struct pinctrl_dev *pctldev, |
| 57 | struct seq_file *s, | 59 | struct seq_file *s, |
| 58 | unsigned selector); | 60 | unsigned selector); |
| 61 | void (*pin_config_config_dbg_show) (struct pinctrl_dev *pctldev, | ||
| 62 | struct seq_file *s, | ||
| 63 | unsigned long config); | ||
| 59 | }; | 64 | }; |
| 60 | 65 | ||
| 61 | #endif | 66 | #endif |
diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h index 4e9f0788c221..c22d0409d2ef 100644 --- a/include/linux/pinctrl/pinctrl.h +++ b/include/linux/pinctrl/pinctrl.h | |||
| @@ -21,9 +21,11 @@ | |||
| 21 | 21 | ||
| 22 | struct device; | 22 | struct device; |
| 23 | struct pinctrl_dev; | 23 | struct pinctrl_dev; |
| 24 | struct pinctrl_map; | ||
| 24 | struct pinmux_ops; | 25 | struct pinmux_ops; |
| 25 | struct pinconf_ops; | 26 | struct pinconf_ops; |
| 26 | struct gpio_chip; | 27 | struct gpio_chip; |
| 28 | struct device_node; | ||
| 27 | 29 | ||
| 28 | /** | 30 | /** |
| 29 | * struct pinctrl_pin_desc - boards/machines provide information on their | 31 | * struct pinctrl_pin_desc - boards/machines provide information on their |
| @@ -64,9 +66,7 @@ struct pinctrl_gpio_range { | |||
| 64 | /** | 66 | /** |
| 65 | * struct pinctrl_ops - global pin control operations, to be implemented by | 67 | * struct pinctrl_ops - global pin control operations, to be implemented by |
| 66 | * pin controller drivers. | 68 | * pin controller drivers. |
| 67 | * @list_groups: list the number of selectable named groups available | 69 | * @get_groups_count: Returns the count of total number of groups registered. |
| 68 | * in this pinmux driver, the core will begin on 0 and call this | ||
| 69 | * repeatedly as long as it returns >= 0 to enumerate the groups | ||
| 70 | * @get_group_name: return the group name of the pin group | 70 | * @get_group_name: return the group name of the pin group |
| 71 | * @get_group_pins: return an array of pins corresponding to a certain | 71 | * @get_group_pins: return an array of pins corresponding to a certain |
| 72 | * group selector @pins, and the size of the array in @num_pins | 72 | * group selector @pins, and the size of the array in @num_pins |
| @@ -74,7 +74,7 @@ struct pinctrl_gpio_range { | |||
| 74 | * info for a certain pin in debugfs | 74 | * info for a certain pin in debugfs |
| 75 | */ | 75 | */ |
| 76 | struct pinctrl_ops { | 76 | struct pinctrl_ops { |
| 77 | int (*list_groups) (struct pinctrl_dev *pctldev, unsigned selector); | 77 | int (*get_groups_count) (struct pinctrl_dev *pctldev); |
| 78 | const char *(*get_group_name) (struct pinctrl_dev *pctldev, | 78 | const char *(*get_group_name) (struct pinctrl_dev *pctldev, |
| 79 | unsigned selector); | 79 | unsigned selector); |
| 80 | int (*get_group_pins) (struct pinctrl_dev *pctldev, | 80 | int (*get_group_pins) (struct pinctrl_dev *pctldev, |
| @@ -83,6 +83,11 @@ struct pinctrl_ops { | |||
| 83 | unsigned *num_pins); | 83 | unsigned *num_pins); |
| 84 | void (*pin_dbg_show) (struct pinctrl_dev *pctldev, struct seq_file *s, | 84 | void (*pin_dbg_show) (struct pinctrl_dev *pctldev, struct seq_file *s, |
| 85 | unsigned offset); | 85 | unsigned offset); |
| 86 | int (*dt_node_to_map) (struct pinctrl_dev *pctldev, | ||
| 87 | struct device_node *np_config, | ||
| 88 | struct pinctrl_map **map, unsigned *num_maps); | ||
| 89 | void (*dt_free_map) (struct pinctrl_dev *pctldev, | ||
| 90 | struct pinctrl_map *map, unsigned num_maps); | ||
| 86 | }; | 91 | }; |
| 87 | 92 | ||
| 88 | /** | 93 | /** |
diff --git a/include/linux/pinctrl/pinmux.h b/include/linux/pinctrl/pinmux.h index 47e9237edd47..dd7bef61d066 100644 --- a/include/linux/pinctrl/pinmux.h +++ b/include/linux/pinctrl/pinmux.h | |||
| @@ -29,9 +29,8 @@ struct pinctrl_dev; | |||
| 29 | * is allowed to answer "no" by returning a negative error code | 29 | * is allowed to answer "no" by returning a negative error code |
| 30 | * @free: the reverse function of the request() callback, frees a pin after | 30 | * @free: the reverse function of the request() callback, frees a pin after |
| 31 | * being requested | 31 | * being requested |
| 32 | * @list_functions: list the number of selectable named functions available | 32 | * @get_functions_count: returns number of selectable named functions available |
| 33 | * in this pinmux driver, the core will begin on 0 and call this | 33 | * in this pinmux driver |
| 34 | * repeatedly as long as it returns >= 0 to enumerate mux settings | ||
| 35 | * @get_function_name: return the function name of the muxing selector, | 34 | * @get_function_name: return the function name of the muxing selector, |
| 36 | * called by the core to figure out which mux setting it shall map a | 35 | * called by the core to figure out which mux setting it shall map a |
| 37 | * certain device to | 36 | * certain device to |
| @@ -62,7 +61,7 @@ struct pinctrl_dev; | |||
| 62 | struct pinmux_ops { | 61 | struct pinmux_ops { |
| 63 | int (*request) (struct pinctrl_dev *pctldev, unsigned offset); | 62 | int (*request) (struct pinctrl_dev *pctldev, unsigned offset); |
| 64 | int (*free) (struct pinctrl_dev *pctldev, unsigned offset); | 63 | int (*free) (struct pinctrl_dev *pctldev, unsigned offset); |
| 65 | int (*list_functions) (struct pinctrl_dev *pctldev, unsigned selector); | 64 | int (*get_functions_count) (struct pinctrl_dev *pctldev); |
| 66 | const char *(*get_function_name) (struct pinctrl_dev *pctldev, | 65 | const char *(*get_function_name) (struct pinctrl_dev *pctldev, |
| 67 | unsigned selector); | 66 | unsigned selector); |
| 68 | int (*get_function_groups) (struct pinctrl_dev *pctldev, | 67 | int (*get_function_groups) (struct pinctrl_dev *pctldev, |
diff --git a/include/linux/platform_data/tegra_usb.h b/include/linux/platform_data/tegra_usb.h index 6bca5b569acb..66c673fef408 100644 --- a/include/linux/platform_data/tegra_usb.h +++ b/include/linux/platform_data/tegra_usb.h | |||
| @@ -26,6 +26,7 @@ struct tegra_ehci_platform_data { | |||
| 26 | /* power down the phy on bus suspend */ | 26 | /* power down the phy on bus suspend */ |
| 27 | int power_down_on_bus_suspend; | 27 | int power_down_on_bus_suspend; |
| 28 | void *phy_config; | 28 | void *phy_config; |
| 29 | int vbus_gpio; | ||
| 29 | }; | 30 | }; |
| 30 | 31 | ||
| 31 | #endif /* _TEGRA_USB_H_ */ | 32 | #endif /* _TEGRA_USB_H_ */ |
