diff options
author | Jake Park <jakep@nvidia.com> | 2013-04-02 17:36:10 +0900 |
---|---|---|
committer | Mrutyunjay Sawant <msawant@nvidia.com> | 2013-04-04 21:06:20 -0700 |
commit | 31ad046d07d103cfefb14068f3b75aee61170b7c (patch) | |
tree | d55ecc2a669a5f4a16d11c2c5cbaca8da3adf82f | |
parent | 899207c4a809c569134ae2da3d47a821f16fdf64 (diff) |
arch: arm: tegratab: add tegratab support
Create initial board files for Tegratab
bug 1262450
bug 1262648
Change-Id: Ic1049e8be7c77f7f41f8db6ddc3f6643e1dd6914
Signed-off-by: Jake Park <jakep@nvidia.com>
Reviewed-on: http://git-master/r/215438
Reviewed-by: Mrutyunjay Sawant <msawant@nvidia.com>
Tested-by: Mrutyunjay Sawant <msawant@nvidia.com>
-rw-r--r-- | arch/arm/boot/dts/tegra114-tegratab.dts | 727 | ||||
-rw-r--r-- | arch/arm/mach-tegra/Kconfig | 8 | ||||
-rw-r--r-- | arch/arm/mach-tegra/Makefile | 11 | ||||
-rw-r--r-- | arch/arm/mach-tegra/Makefile.boot | 1 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab-kbc.c | 87 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab-memory.c | 2205 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab-panel.c | 518 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab-pinmux-t11x.h | 348 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab-pinmux.c | 255 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab-power.c | 788 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab-powermon.c | 27 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab-sdhci.c | 270 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab-sensors.c | 561 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab.c | 735 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-tegratab.h | 116 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra-board-id.h | 3 | ||||
-rw-r--r-- | arch/arm/tools/mach-types | 1 |
17 files changed, 6660 insertions, 1 deletions
diff --git a/arch/arm/boot/dts/tegra114-tegratab.dts b/arch/arm/boot/dts/tegra114-tegratab.dts new file mode 100644 index 000000000000..53966f52dd1f --- /dev/null +++ b/arch/arm/boot/dts/tegra114-tegratab.dts @@ -0,0 +1,727 @@ +/* + * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/dts-v1/; + +/include/ "tegra114.dtsi" + +/ { + model = "NVIDIA Tegra114 tegratab evaluation board"; + compatible = "nvidia,tegratab", "nvidia,tegra114"; + + pinmux { + pinctrl-names = "default"; + pinctrl-0 = <&state_default>; + + state_default: pinmux { + clk1_out_pw4 { + nvidia,pins = "clk1_out_pw4"; + nvidia,function = "extperiph1"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + dap1_din_pn1 { + nvidia,pins = "dap1_din_pn1"; + nvidia,function = "i2s0"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + dap1_dout_pn2 { + nvidia,pins = "dap1_dout_pn2", + "dap1_fs_pn0", + "dap1_sclk_pn3"; + nvidia,function = "i2s0"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + dap2_din_pa4 { + nvidia,pins = "dap2_din_pa4"; + nvidia,function = "i2s1"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + dap2_dout_pa5 { + nvidia,pins = "dap2_dout_pa5", + "dap2_fs_pa2", + "dap2_sclk_pa3"; + nvidia,function = "i2s1"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + dap4_din_pp5 { + nvidia,pins = "dap4_din_pp5", + "dap4_dout_pp6", + "dap4_fs_pp4", + "dap4_sclk_pp7"; + nvidia,function = "i2s3"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + dvfs_pwm_px0 { + nvidia,pins = "dvfs_pwm_px0", + "dvfs_clk_px2"; + nvidia,function = "cldvfs"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + ulpi_clk_py0 { + nvidia,pins = "ulpi_clk_py0", + "ulpi_data0_po1", + "ulpi_data1_po2", + "ulpi_data2_po3", + "ulpi_data3_po4", + "ulpi_data4_po5", + "ulpi_data5_po6", + "ulpi_data6_po7", + "ulpi_data7_po0"; + nvidia,function = "ulpi"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + ulpi_dir_py1 { + nvidia,pins = "ulpi_dir_py1", + "ulpi_nxt_py2"; + nvidia,function = "ulpi"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + ulpi_stp_py3 { + nvidia,pins = "ulpi_stp_py3"; + nvidia,function = "ulpi"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + cam_i2c_scl_pbb1 { + nvidia,pins = "cam_i2c_scl_pbb1", + "cam_i2c_sda_pbb2"; + nvidia,function = "i2c3"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + nvidia,lock = <0>; + nvidia,open-drain = <0>; + }; + cam_mclk_pcc0 { + nvidia,pins = "cam_mclk_pcc0", + "pbb0"; + nvidia,function = "vi_alt3"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + nvidia,lock = <0>; + }; + gen2_i2c_scl_pt5 { + nvidia,pins = "gen2_i2c_scl_pt5", + "gen2_i2c_sda_pt6"; + nvidia,function = "i2c2"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + nvidia,lock = <0>; + nvidia,open-drain = <0>; + }; + gmi_a16_pj7 { + nvidia,pins = "gmi_a16_pj7"; + nvidia,function = "uartd"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + gmi_a17_pb0 { + nvidia,pins = "gmi_a17_pb0", + "gmi_a18_pb1"; + nvidia,function = "uartd"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + gmi_a19_pk7 { + nvidia,pins = "gmi_a19_pk7"; + nvidia,function = "uartd"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + gmi_ad5_pg5 { + nvidia,pins = "gmi_ad5_pg5", + "gmi_cs6_n_pi3", + "gmi_wr_n_pi0"; + nvidia,function = "spi4"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + gmi_ad6_pg6 { + nvidia,pins = "gmi_ad6_pg6", + "gmi_ad7_pg7"; + nvidia,function = "spi4"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + gmi_ad12_ph4 { + nvidia,pins = "gmi_ad12_ph4"; + nvidia,function = "rsvd4"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + gmi_ad9_ph1 { + nvidia,pins = "gmi_ad9_ph1"; + nvidia,function = "pwm1"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + gmi_cs1_n_pj2 { + nvidia,pins = "gmi_cs1_n_pj2", + "gmi_oe_n_pi1"; + nvidia,function = "soc"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + clk2_out_pw5 { + nvidia,pins = "clk2_out_pw5"; + nvidia,function = "extperiph2"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + sdmmc1_clk_pz0 { + nvidia,pins = "sdmmc1_clk_pz0"; + nvidia,function = "sdmmc1"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + sdmmc1_cmd_pz1 { + nvidia,pins = "sdmmc1_cmd_pz1", + "sdmmc1_dat0_py7", + "sdmmc1_dat1_py6", + "sdmmc1_dat2_py5", + "sdmmc1_dat3_py4"; + nvidia,function = "sdmmc1"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + sdmmc1_wp_n_pv3 { + nvidia,pins = "sdmmc1_wp_n_pv3"; + nvidia,function = "spi4"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + sdmmc3_clk_pa6 { + nvidia,pins = "sdmmc3_clk_pa6"; + nvidia,function = "sdmmc3"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + sdmmc3_cmd_pa7 { + nvidia,pins = "sdmmc3_cmd_pa7", + "sdmmc3_dat0_pb7", + "sdmmc3_dat1_pb6", + "sdmmc3_dat2_pb5", + "sdmmc3_dat3_pb4", + "kb_col4_pq4", + "sdmmc3_clk_lb_out_pee4", + "sdmmc3_clk_lb_in_pee5"; + nvidia,function = "sdmmc3"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + sdmmc4_clk_pcc4 { + nvidia,pins = "sdmmc4_clk_pcc4"; + nvidia,function = "sdmmc4"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + sdmmc4_cmd_pt7 { + nvidia,pins = "sdmmc4_cmd_pt7", + "sdmmc4_dat0_paa0", + "sdmmc4_dat1_paa1", + "sdmmc4_dat2_paa2", + "sdmmc4_dat3_paa3", + "sdmmc4_dat4_paa4", + "sdmmc4_dat5_paa5", + "sdmmc4_dat6_paa6", + "sdmmc4_dat7_paa7"; + nvidia,function = "sdmmc4"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + clk_32k_out_pa0 { + nvidia,pins = "clk_32k_out_pa0"; + nvidia,function = "blink"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + kb_col0_pq0 { + nvidia,pins = "kb_col0_pq0", + "kb_col1_pq1", + "kb_col2_pq2", + "kb_row0_pr0", + "kb_row1_pr1", + "kb_row2_pr2"; + nvidia,function = "kbc"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + dap3_din_pp1 { + nvidia,pins = "dap3_din_pp1", + "dap3_sclk_pp3"; + nvidia,function = "displayb"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <0>; + }; + pv0 { + nvidia,pins = "pv0"; + nvidia,function = "rsvd4"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <0>; + }; + kb_row7_pr7 { + nvidia,pins = "kb_row7_pr7"; + nvidia,function = "rsvd2"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + kb_row10_ps2 { + nvidia,pins = "kb_row10_ps2"; + nvidia,function = "uarta"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + kb_row9_ps1 { + nvidia,pins = "kb_row9_ps1"; + nvidia,function = "uarta"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + pwr_i2c_scl_pz6 { + nvidia,pins = "pwr_i2c_scl_pz6", + "pwr_i2c_sda_pz7"; + nvidia,function = "i2cpwr"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + nvidia,lock = <0>; + nvidia,open-drain = <0>; + }; + sys_clk_req_pz5 { + nvidia,pins = "sys_clk_req_pz5"; + nvidia,function = "sysclk"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + core_pwr_req { + nvidia,pins = "core_pwr_req"; + nvidia,function = "pwron"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + cpu_pwr_req { + nvidia,pins = "cpu_pwr_req"; + nvidia,function = "cpu"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + pwr_int_n { + nvidia,pins = "pwr_int_n"; + nvidia,function = "pmi"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + reset_out_n { + nvidia,pins = "reset_out_n"; + nvidia,function = "reset_out_n"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + clk3_out_pee0 { + nvidia,pins = "clk3_out_pee0"; + nvidia,function = "extperiph3"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + gen1_i2c_scl_pc4 { + nvidia,pins = "gen1_i2c_scl_pc4", + "gen1_i2c_sda_pc5"; + nvidia,function = "i2c1"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + nvidia,lock = <0>; + nvidia,open-drain = <0>; + }; + uart2_cts_n_pj5 { + nvidia,pins = "uart2_cts_n_pj5"; + nvidia,function = "uartb"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + uart2_rts_n_pj6 { + nvidia,pins = "uart2_rts_n_pj6"; + nvidia,function = "uartb"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + uart2_rxd_pc3 { + nvidia,pins = "uart2_rxd_pc3"; + nvidia,function = "irda"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + uart2_txd_pc2 { + nvidia,pins = "uart2_txd_pc2"; + nvidia,function = "irda"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + uart3_cts_n_pa1 { + nvidia,pins = "uart3_cts_n_pa1", + "uart3_rxd_pw7"; + nvidia,function = "uartc"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + uart3_rts_n_pc0 { + nvidia,pins = "uart3_rts_n_pc0", + "uart3_txd_pw6"; + nvidia,function = "uartc"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + owr { + nvidia,pins = "owr"; + nvidia,function = "owr"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + hdmi_cec_pee3 { + nvidia,pins = "hdmi_cec_pee3"; + nvidia,function = "cec"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + nvidia,lock = <0>; + nvidia,open-drain = <0>; + }; + ddc_scl_pv4 { + nvidia,pins = "ddc_scl_pv4", + "ddc_sda_pv5"; + nvidia,function = "i2c4"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + nvidia,lock = <0>; + nvidia,rcv-sel = <1>; + }; + spdif_in_pk6 { + nvidia,pins = "spdif_in_pk6"; + nvidia,function = "usb"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + nvidia,lock = <0>; + }; + usb_vbus_en0_pn4 { + nvidia,pins = "usb_vbus_en0_pn4"; + nvidia,function = "usb"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + nvidia,lock = <0>; + nvidia,open-drain = <1>; + }; + gpio_x6_aud_px6 { + nvidia,pins = "gpio_x6_aud_px6"; + nvidia,function = "spi6"; + nvidia,pull = <2>; + nvidia,tristate = <1>; + nvidia,enable-input = <1>; + }; + gpio_x4_aud_px4 { + nvidia,pins = "gpio_x4_aud_px4", + "gpio_x7_aud_px7"; + nvidia,function = "rsvd1"; + nvidia,pull = <1>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + gpio_x5_aud_px5 { + nvidia,pins = "gpio_x5_aud_px5"; + nvidia,function = "rsvd1"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + gpio_w2_aud_pw2 { + nvidia,pins = "gpio_w2_aud_pw2"; + nvidia,function = "rsvd2"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + gpio_w3_aud_pw3 { + nvidia,pins = "gpio_w3_aud_pw3"; + nvidia,function = "spi6"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + gpio_x1_aud_px1 { + nvidia,pins = "gpio_x1_aud_px1"; + nvidia,function = "rsvd4"; + nvidia,pull = <1>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + gpio_x3_aud_px3 { + nvidia,pins = "gpio_x3_aud_px3"; + nvidia,function = "rsvd4"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + dap3_fs_pp0 { + nvidia,pins = "dap3_fs_pp0"; + nvidia,function = "i2s2"; + nvidia,pull = <1>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + dap3_dout_pp2 { + nvidia,pins = "dap3_dout_pp2"; + nvidia,function = "i2s2"; + nvidia,pull = <1>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + pv1 { + nvidia,pins = "pv1"; + nvidia,function = "rsvd1"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + pbb3 { + nvidia,pins = "pbb3", + "pbb5", + "pbb6", + "pbb7"; + nvidia,function = "rsvd4"; + nvidia,pull = <1>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + pcc1 { + nvidia,pins = "pcc1", + "pcc2"; + nvidia,function = "rsvd4"; + nvidia,pull = <1>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + gmi_ad0_pg0 { + nvidia,pins = "gmi_ad0_pg0", + "gmi_ad1_pg1"; + nvidia,function = "gmi"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + gmi_ad10_ph2 { + nvidia,pins = "gmi_ad10_ph2", + "gmi_ad11_ph3", + "gmi_ad13_ph5", + "gmi_ad8_ph0", + "gmi_clk_pk1"; + nvidia,function = "gmi"; + nvidia,pull = <1>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + gmi_ad2_pg2 { + nvidia,pins = "gmi_ad2_pg2", + "gmi_ad3_pg3"; + nvidia,function = "gmi"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + gmi_adv_n_pk0 { + nvidia,pins = "gmi_adv_n_pk0", + "gmi_cs0_n_pj0", + "gmi_cs2_n_pk3", + "gmi_cs4_n_pk2", + "gmi_cs7_n_pi6", + "gmi_dqs_p_pj3", + "gmi_iordy_pi5", + "gmi_wp_n_pc7"; + nvidia,function = "gmi"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + gmi_cs3_n_pk4 { + nvidia,pins = "gmi_cs3_n_pk4"; + nvidia,function = "gmi"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + clk2_req_pcc5 { + nvidia,pins = "clk2_req_pcc5"; + nvidia,function = "rsvd4"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + kb_col3_pq3 { + nvidia,pins = "kb_col3_pq3", + "kb_col6_pq6", + "kb_col7_pq7"; + nvidia,function = "kbc"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + kb_col5_pq5 { + nvidia,pins = "kb_col5_pq5"; + nvidia,function = "kbc"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + kb_row3_pr3 { + nvidia,pins = "kb_row3_pr3", + "kb_row4_pr4", + "kb_row6_pr6", + "kb_row8_ps0"; + nvidia,function = "kbc"; + nvidia,pull = <1>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + clk3_req_pee1 { + nvidia,pins = "clk3_req_pee1"; + nvidia,function = "rsvd4"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + pu4 { + nvidia,pins = "pu4"; + nvidia,function = "displayb"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <0>; + }; + pu5 { + nvidia,pins = "pu5", + "pu6"; + nvidia,function = "displayb"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + hdmi_int_pn7 { + nvidia,pins = "hdmi_int_pn7"; + nvidia,function = "rsvd1"; + nvidia,pull = <1>; + nvidia,tristate = <0>; + nvidia,enable-input = <1>; + }; + clk1_req_pee2 { + nvidia,pins = "clk1_req_pee2", + "usb_vbus_en1_pn5"; + nvidia,function = "rsvd4"; + nvidia,pull = <1>; + nvidia,tristate = <1>; + nvidia,enable-input = <0>; + }; + + drive_sdio1 { + nvidia,pins = "drive_sdio1"; + nvidia,high-speed-mode = <1>; + nvidia,schmitt = <0>; + nvidia,low-power-mode = <3>; + nvidia,pull-down-strength = <36>; + nvidia,pull-up-strength = <20>; + nvidia,slew-rate-rising = <2>; + nvidia,slew-rate-falling = <2>; + }; + drive_sdio3 { + nvidia,pins = "drive_sdio3"; + nvidia,high-speed-mode = <1>; + nvidia,schmitt = <0>; + nvidia,low-power-mode = <3>; + nvidia,pull-down-strength = <22>; + nvidia,pull-up-strength = <36>; + nvidia,slew-rate-rising = <0>; + nvidia,slew-rate-falling = <0>; + }; + drive_gma { + nvidia,pins = "drive_gma"; + nvidia,high-speed-mode = <1>; + nvidia,schmitt = <0>; + nvidia,low-power-mode = <3>; + nvidia,pull-down-strength = <2>; + nvidia,pull-up-strength = <1>; + nvidia,slew-rate-rising = <0>; + nvidia,slew-rate-falling = <0>; + nvidia,drive-type = <1>; + }; + }; + }; +}; diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index ff95972487d5..36ab48bcbe63 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -339,6 +339,14 @@ config MACH_ROTH help Support for NVIDIA THOR development platform +config MACH_TEGRATAB + bool "Tegratab board" + depends on ARCH_TEGRA_11x_SOC + select MACH_HAS_SND_SOC_TEGRA_RT5639 if SND_SOC + select MACH_HAS_SND_SOC_TEGRA_RT5640 if SND_SOC + help + Support for NVIDIA TEGRATAB development platform + choice prompt "Tegra platform type" default TEGRA_SILICON_PLATFORM diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile index ff5501499232..dff61b85da56 100644 --- a/arch/arm/mach-tegra/Makefile +++ b/arch/arm/mach-tegra/Makefile @@ -299,6 +299,17 @@ obj-${CONFIG_MACH_MACALLAN} += board-macallan-kbc.o obj-${CONFIG_MACH_MACALLAN} += board-macallan-sensors.o obj-${CONFIG_MACH_MACALLAN} += panel-p-wuxga-10-1.o +obj-${CONFIG_MACH_TEGRATAB} += board-tegratab.o +obj-${CONFIG_MACH_TEGRATAB} += board-tegratab-memory.o +obj-${CONFIG_MACH_TEGRATAB} += board-tegratab-pinmux.o +obj-${CONFIG_MACH_TEGRATAB} += board-tegratab-power.o +obj-${CONFIG_MACH_TEGRATAB} += board-tegratab-powermon.o +obj-${CONFIG_MACH_TEGRATAB} += board-tegratab-sdhci.o +obj-${CONFIG_MACH_TEGRATAB} += board-tegratab-panel.o +obj-${CONFIG_MACH_TEGRATAB} += board-tegratab-kbc.o +obj-${CONFIG_MACH_TEGRATAB} += board-tegratab-sensors.o +obj-${CONFIG_MACH_TEGRATAB} += panel-p-wuxga-10-1.o + obj-${CONFIG_MACH_TEGRA_PLUTO} += board-pluto.o obj-${CONFIG_MACH_TEGRA_PLUTO} += board-pluto-memory.o obj-${CONFIG_MACH_TEGRA_PLUTO} += board-pluto-pinmux.o diff --git a/arch/arm/mach-tegra/Makefile.boot b/arch/arm/mach-tegra/Makefile.boot index dfcb4d747e63..14639f578eba 100644 --- a/arch/arm/mach-tegra/Makefile.boot +++ b/arch/arm/mach-tegra/Makefile.boot @@ -21,3 +21,4 @@ dtb-$(CONFIG_ARCH_TEGRA_11x_SOC) += tegra114-dalmore.dtb dtb-$(CONFIG_ARCH_TEGRA_11x_SOC) += tegra114-macallan.dtb dtb-$(CONFIG_ARCH_TEGRA_11x_SOC) += tegra114-roth.dtb dtb-$(CONFIG_ARCH_TEGRA_11x_SOC) += tegra114-pluto.dtb +dtb-$(CONFIG_ARCH_TEGRA_11x_SOC) += tegra114-tegratab.dtb
\ No newline at end of file diff --git a/arch/arm/mach-tegra/board-tegratab-kbc.c b/arch/arm/mach-tegra/board-tegratab-kbc.c new file mode 100644 index 000000000000..4528f6477373 --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab-kbc.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include <linux/input.h> +#include <mach/io.h> +#include <linux/io.h> +#include <mach/iomap.h> +#include <mach/kbc.h> +#include <linux/gpio.h> +#include <linux/gpio_keys.h> +#include <linux/mfd/palmas.h> +#include "wakeups-t11x.h" + +#include "tegra-board-id.h" +#include "board.h" +#include "board-tegratab.h" +#include "devices.h" + +#define GPIO_KEY(_id, _gpio, _iswake) \ + { \ + .code = _id, \ + .gpio = TEGRA_GPIO_##_gpio, \ + .active_low = 1, \ + .desc = #_id, \ + .type = EV_KEY, \ + .wakeup = _iswake, \ + .debounce_interval = 10, \ + } + +static struct gpio_keys_button tegratab_e1569_keys[] = { + [0] = GPIO_KEY(KEY_POWER, PQ0, 1), + [1] = GPIO_KEY(KEY_VOLUMEUP, PR2, 0), + [2] = GPIO_KEY(KEY_VOLUMEDOWN, PR1, 0), +}; + +static int tegratab_wakeup_key(void) +{ + int wakeup_key; + u64 status = readl(IO_ADDRESS(TEGRA_PMC_BASE) + PMC_WAKE_STATUS) + | (u64)readl(IO_ADDRESS(TEGRA_PMC_BASE) + + PMC_WAKE2_STATUS) << 32; + if (status & ((u64)1 << TEGRA_WAKE_GPIO_PQ0)) + wakeup_key = KEY_POWER; + else if (status & ((u64)1 << TEGRA_WAKE_GPIO_PS0)) + wakeup_key = SW_LID; + else + wakeup_key = KEY_RESERVED; + + return wakeup_key; +} + +static struct gpio_keys_platform_data tegratab_e1569_keys_pdata = { + .buttons = tegratab_e1569_keys, + .nbuttons = ARRAY_SIZE(tegratab_e1569_keys), + .wakeup_key = tegratab_wakeup_key, +}; + +static struct platform_device tegratab_e1569_keys_device = { + .name = "gpio-keys", + .id = 0, + .dev = { + .platform_data = &tegratab_e1569_keys_pdata, + }, +}; + +int __init tegratab_kbc_init(void) +{ + platform_device_register(&tegratab_e1569_keys_device); + + return 0; +} + diff --git a/arch/arm/mach-tegra/board-tegratab-memory.c b/arch/arm/mach-tegra/board-tegratab-memory.c new file mode 100644 index 000000000000..d50cde5c4688 --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab-memory.c @@ -0,0 +1,2205 @@ +/* + * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/platform_data/tegra_emc.h> + +#include "board.h" +#include "board-tegratab.h" + +#include "tegra-board-id.h" +#include "tegra11_emc.h" +#include "fuse.h" +#include "devices.h" + +static struct tegra11_emc_table e1569_mt41k128m16_125_table[] = { + { + 0x41, /* Rev 4.0.3 */ + 12750, /* SDRAM frequency */ + 900, /* min voltage */ + "pll_p", /* clock source id */ + 0x4000003e, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x00000000, /* EMC_RC */ + 0x00000003, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x00000000, /* EMC_RAS */ + 0x00000000, /* EMC_RP */ + 0x00000004, /* EMC_R2W */ + 0x0000000a, /* EMC_W2R */ + 0x00000003, /* EMC_R2P */ + 0x0000000b, /* EMC_W2P */ + 0x00000000, /* EMC_RD_RCD */ + 0x00000000, /* EMC_WR_RCD */ + 0x00000003, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000005, /* EMC_WDV */ + 0x00000005, /* EMC_WDV_MASK */ + 0x00000006, /* EMC_IBDLY */ + 0x00010000, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000004, /* EMC_QRST */ + 0x0000000d, /* EMC_RDV_MASK */ + 0x00000060, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x00000018, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000002, /* EMC_PDEX2WR */ + 0x00000002, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x00000007, /* EMC_AR2PDEN */ + 0x0000000f, /* EMC_RW2PDEN */ + 0x00000005, /* EMC_TXSR */ + 0x00000005, /* EMC_TXSRDLL */ + 0x00000004, /* EMC_TCKE */ + 0x00000004, /* EMC_TCKESR */ + 0x00000004, /* EMC_TPD */ + 0x00000001, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000004, /* EMC_TCLKSTABLE */ + 0x00000005, /* EMC_TCLKSTOP */ + 0x00000064, /* EMC_TREFBW */ + 0x00000005, /* EMC_QUSE_EXTRA */ + 0x00000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000aa88, /* EMC_FBIO_CFG5 */ + 0x002c00a0, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x0006c000, /* EMC_DLL_XFORM_DQS4 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS5 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS6 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS7 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0000a11c, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc085, /* EMC_XM2CLKPADCTRL */ + 0x81f1f108, /* EMC_XM2COMPPADCTRL */ + 0x03035504, /* EMC_XM2VTTGENPADCTRL */ + 0x0000003f, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00000000, /* EMC_ZCAL_INTERVAL */ + 0x00000042, /* EMC_ZCAL_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x800001c6, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0x40040001, /* MC_EMEM_ARB_CFG */ + 0x8000003f, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RP */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RC */ + 0x00000000, /* MC_EMEM_ARB_TIMING_RAS */ + 0x00000001, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x00000008, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000001, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000003, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000006, /* MC_EMEM_ARB_TIMING_W2R */ + 0x06030102, /* MC_EMEM_ARB_DA_TURNS */ + 0x000a0402, /* MC_EMEM_ARB_DA_COVERS */ + 0x77e30303, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000006, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000006, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x0000000e, /* MC_PTSA_GRANT_DECREMENT */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x000000ff, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x000000ff, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x7320000e, /* EMC_CFG */ + 0x80001221, /* Mode Register 0 */ + 0x80100003, /* Mode Register 1 */ + 0x80200008, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 57820, /* expected dvfs latency (ns) */ + }, + { + 0x41, /* Rev 4.0.3 */ + 20400, /* SDRAM frequency */ + 900, /* min voltage */ + "pll_p", /* clock source id */ + 0x40000026, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x00000000, /* EMC_RC */ + 0x00000003, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x00000000, /* EMC_RAS */ + 0x00000000, /* EMC_RP */ + 0x00000004, /* EMC_R2W */ + 0x0000000a, /* EMC_W2R */ + 0x00000003, /* EMC_R2P */ + 0x0000000b, /* EMC_W2P */ + 0x00000000, /* EMC_RD_RCD */ + 0x00000000, /* EMC_WR_RCD */ + 0x00000003, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000005, /* EMC_WDV */ + 0x00000005, /* EMC_WDV_MASK */ + 0x00000006, /* EMC_IBDLY */ + 0x00010000, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000004, /* EMC_QRST */ + 0x0000000d, /* EMC_RDV_MASK */ + 0x0000009a, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x00000026, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000002, /* EMC_PDEX2WR */ + 0x00000002, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x00000007, /* EMC_AR2PDEN */ + 0x0000000f, /* EMC_RW2PDEN */ + 0x00000005, /* EMC_TXSR */ + 0x00000006, /* EMC_TXSRDLL */ + 0x00000004, /* EMC_TCKE */ + 0x00000004, /* EMC_TCKESR */ + 0x00000004, /* EMC_TPD */ + 0x00000001, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000004, /* EMC_TCLKSTABLE */ + 0x00000005, /* EMC_TCLKSTOP */ + 0x000000a0, /* EMC_TREFBW */ + 0x00000005, /* EMC_QUSE_EXTRA */ + 0x00000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000aa88, /* EMC_FBIO_CFG5 */ + 0x002c00a0, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x0006c000, /* EMC_DLL_XFORM_DQS4 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS5 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS6 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS7 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0000a11c, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc085, /* EMC_XM2CLKPADCTRL */ + 0x81f1f108, /* EMC_XM2COMPPADCTRL */ + 0x03035504, /* EMC_XM2VTTGENPADCTRL */ + 0x0000003f, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00000000, /* EMC_ZCAL_INTERVAL */ + 0x00000042, /* EMC_ZCAL_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x8000023a, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0x40020001, /* MC_EMEM_ARB_CFG */ + 0x80000046, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RP */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RC */ + 0x00000000, /* MC_EMEM_ARB_TIMING_RAS */ + 0x00000001, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x00000008, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000001, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000003, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000006, /* MC_EMEM_ARB_TIMING_W2R */ + 0x06030102, /* MC_EMEM_ARB_DA_TURNS */ + 0x000a0402, /* MC_EMEM_ARB_DA_COVERS */ + 0x75430303, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000006, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000006, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000014, /* MC_PTSA_GRANT_DECREMENT */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x000000ff, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x000000ff, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x7320000e, /* EMC_CFG */ + 0x80001221, /* Mode Register 0 */ + 0x80100003, /* Mode Register 1 */ + 0x80200008, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 35610, /* expected dvfs latency (ns) */ + }, + { + 0x41, /* Rev 4.0.3 */ + 40800, /* SDRAM frequency */ + 900, /* min voltage */ + "pll_p", /* clock source id */ + 0x40000012, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x00000001, /* EMC_RC */ + 0x00000006, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x00000001, /* EMC_RAS */ + 0x00000000, /* EMC_RP */ + 0x00000004, /* EMC_R2W */ + 0x0000000a, /* EMC_W2R */ + 0x00000003, /* EMC_R2P */ + 0x0000000b, /* EMC_W2P */ + 0x00000000, /* EMC_RD_RCD */ + 0x00000000, /* EMC_WR_RCD */ + 0x00000003, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000005, /* EMC_WDV */ + 0x00000005, /* EMC_WDV_MASK */ + 0x00000006, /* EMC_IBDLY */ + 0x00010000, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000004, /* EMC_QRST */ + 0x0000000d, /* EMC_RDV_MASK */ + 0x00000134, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x0000004d, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000002, /* EMC_PDEX2WR */ + 0x00000002, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x00000007, /* EMC_AR2PDEN */ + 0x0000000f, /* EMC_RW2PDEN */ + 0x00000007, /* EMC_TXSR */ + 0x0000000c, /* EMC_TXSRDLL */ + 0x00000004, /* EMC_TCKE */ + 0x00000004, /* EMC_TCKESR */ + 0x00000004, /* EMC_TPD */ + 0x00000002, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000004, /* EMC_TCLKSTABLE */ + 0x00000005, /* EMC_TCLKSTOP */ + 0x0000013f, /* EMC_TREFBW */ + 0x00000005, /* EMC_QUSE_EXTRA */ + 0x00000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000aa88, /* EMC_FBIO_CFG5 */ + 0x002c00a0, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x0006c000, /* EMC_DLL_XFORM_DQS4 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS5 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS6 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS7 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0000a11c, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc085, /* EMC_XM2CLKPADCTRL */ + 0x81f1f108, /* EMC_XM2COMPPADCTRL */ + 0x03035504, /* EMC_XM2VTTGENPADCTRL */ + 0x0000003f, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00000000, /* EMC_ZCAL_INTERVAL */ + 0x00000042, /* EMC_ZCAL_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x80000370, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0xa0000001, /* MC_EMEM_ARB_CFG */ + 0x8000005b, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RP */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RC */ + 0x00000000, /* MC_EMEM_ARB_TIMING_RAS */ + 0x00000001, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x00000008, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000001, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000003, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000006, /* MC_EMEM_ARB_TIMING_W2R */ + 0x06030102, /* MC_EMEM_ARB_DA_TURNS */ + 0x000a0402, /* MC_EMEM_ARB_DA_COVERS */ + 0x73630303, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000006, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000006, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x0000002a, /* MC_PTSA_GRANT_DECREMENT */ + 0x00b000b0, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x00b000c4, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x00d700eb, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x000000eb, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x00eb00eb, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x00ff00eb, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x000000ff, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x7320000e, /* EMC_CFG */ + 0x80001221, /* Mode Register 0 */ + 0x80100003, /* Mode Register 1 */ + 0x80200008, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 20850, /* expected dvfs latency (ns) */ + }, + { + 0x41, /* Rev 4.0.3 */ + 68000, /* SDRAM frequency */ + 900, /* min voltage */ + "pll_p", /* clock source id */ + 0x4000000a, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x00000003, /* EMC_RC */ + 0x0000000a, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x00000002, /* EMC_RAS */ + 0x00000000, /* EMC_RP */ + 0x00000004, /* EMC_R2W */ + 0x0000000a, /* EMC_W2R */ + 0x00000003, /* EMC_R2P */ + 0x0000000b, /* EMC_W2P */ + 0x00000000, /* EMC_RD_RCD */ + 0x00000000, /* EMC_WR_RCD */ + 0x00000003, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000005, /* EMC_WDV */ + 0x00000005, /* EMC_WDV_MASK */ + 0x00000006, /* EMC_IBDLY */ + 0x00010000, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000004, /* EMC_QRST */ + 0x0000000d, /* EMC_RDV_MASK */ + 0x00000202, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x00000080, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000002, /* EMC_PDEX2WR */ + 0x00000002, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x00000008, /* EMC_AR2PDEN */ + 0x0000000f, /* EMC_RW2PDEN */ + 0x0000000c, /* EMC_TXSR */ + 0x00000013, /* EMC_TXSRDLL */ + 0x00000004, /* EMC_TCKE */ + 0x00000004, /* EMC_TCKESR */ + 0x00000004, /* EMC_TPD */ + 0x00000003, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000004, /* EMC_TCLKSTABLE */ + 0x00000005, /* EMC_TCLKSTOP */ + 0x00000213, /* EMC_TREFBW */ + 0x00000005, /* EMC_QUSE_EXTRA */ + 0x00000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000aa88, /* EMC_FBIO_CFG5 */ + 0x002c00a0, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x0006c000, /* EMC_DLL_XFORM_DQS4 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS5 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS6 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS7 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0000a11c, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc085, /* EMC_XM2CLKPADCTRL */ + 0x81f1f108, /* EMC_XM2COMPPADCTRL */ + 0x03035504, /* EMC_XM2VTTGENPADCTRL */ + 0x0000003f, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00000000, /* EMC_ZCAL_INTERVAL */ + 0x00000042, /* EMC_ZCAL_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x8000050e, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0x00000001, /* MC_EMEM_ARB_CFG */ + 0x80000076, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RP */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RC */ + 0x00000000, /* MC_EMEM_ARB_TIMING_RAS */ + 0x00000001, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x00000008, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000001, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000003, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000006, /* MC_EMEM_ARB_TIMING_W2R */ + 0x06030102, /* MC_EMEM_ARB_DA_TURNS */ + 0x000a0402, /* MC_EMEM_ARB_DA_COVERS */ + 0x72c30403, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000006, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000006, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000046, /* MC_PTSA_GRANT_DECREMENT */ + 0x00690069, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x00690075, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x0081008d, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x0000008d, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x008d008d, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x00bc008d, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x000000bc, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x00bc00bc, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x7320000e, /* EMC_CFG */ + 0x80001221, /* Mode Register 0 */ + 0x80100003, /* Mode Register 1 */ + 0x80200008, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 10720, /* expected dvfs latency (ns) */ + }, + { + 0x41, /* Rev 4.0.3 */ + 102000, /* SDRAM frequency */ + 900, /* min voltage */ + "pll_p", /* clock source id */ + 0x40000006, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x00000004, /* EMC_RC */ + 0x00000010, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x00000003, /* EMC_RAS */ + 0x00000001, /* EMC_RP */ + 0x00000004, /* EMC_R2W */ + 0x0000000a, /* EMC_W2R */ + 0x00000003, /* EMC_R2P */ + 0x0000000b, /* EMC_W2P */ + 0x00000001, /* EMC_RD_RCD */ + 0x00000001, /* EMC_WR_RCD */ + 0x00000003, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000005, /* EMC_WDV */ + 0x00000005, /* EMC_WDV_MASK */ + 0x00000006, /* EMC_IBDLY */ + 0x00010000, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000004, /* EMC_QRST */ + 0x0000000d, /* EMC_RDV_MASK */ + 0x00000303, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x000000c0, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000002, /* EMC_PDEX2WR */ + 0x00000002, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x0000000d, /* EMC_AR2PDEN */ + 0x0000000f, /* EMC_RW2PDEN */ + 0x00000012, /* EMC_TXSR */ + 0x0000001c, /* EMC_TXSRDLL */ + 0x00000004, /* EMC_TCKE */ + 0x00000004, /* EMC_TCKESR */ + 0x00000004, /* EMC_TPD */ + 0x00000005, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000004, /* EMC_TCLKSTABLE */ + 0x00000005, /* EMC_TCLKSTOP */ + 0x0000031c, /* EMC_TREFBW */ + 0x00000005, /* EMC_QUSE_EXTRA */ + 0x00000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000aa88, /* EMC_FBIO_CFG5 */ + 0x002c00a0, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x0006c000, /* EMC_DLL_XFORM_DQS4 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS5 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS6 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS7 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0000a11c, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc085, /* EMC_XM2CLKPADCTRL */ + 0x81f1f108, /* EMC_XM2COMPPADCTRL */ + 0x03035504, /* EMC_XM2VTTGENPADCTRL */ + 0x0000003f, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00000000, /* EMC_ZCAL_INTERVAL */ + 0x00000042, /* EMC_ZCAL_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x80000714, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0x08000001, /* MC_EMEM_ARB_CFG */ + 0x80000098, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RP */ + 0x00000003, /* MC_EMEM_ARB_TIMING_RC */ + 0x00000000, /* MC_EMEM_ARB_TIMING_RAS */ + 0x00000002, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x00000008, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000001, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000003, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000006, /* MC_EMEM_ARB_TIMING_W2R */ + 0x06030102, /* MC_EMEM_ARB_DA_TURNS */ + 0x000a0403, /* MC_EMEM_ARB_DA_COVERS */ + 0x72830504, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000006, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000006, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000068, /* MC_PTSA_GRANT_DECREMENT */ + 0x00460046, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x0046004e, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x0056005e, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x0000005e, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x005e005e, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x007d005e, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x0000007d, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x007d007d, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x7320000e, /* EMC_CFG */ + 0x80001221, /* Mode Register 0 */ + 0x80100003, /* Mode Register 1 */ + 0x80200008, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 6890, /* expected dvfs latency (ns) */ + }, + { + 0x41, /* Rev 4.0.3 */ + 204000, /* SDRAM frequency */ + 900, /* min voltage */ + "pll_p", /* clock source id */ + 0x40000002, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x00000009, /* EMC_RC */ + 0x00000020, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x00000007, /* EMC_RAS */ + 0x00000002, /* EMC_RP */ + 0x00000004, /* EMC_R2W */ + 0x0000000a, /* EMC_W2R */ + 0x00000003, /* EMC_R2P */ + 0x0000000b, /* EMC_W2P */ + 0x00000002, /* EMC_RD_RCD */ + 0x00000002, /* EMC_WR_RCD */ + 0x00000003, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000005, /* EMC_WDV */ + 0x00000005, /* EMC_WDV_MASK */ + 0x00000006, /* EMC_IBDLY */ + 0x00010000, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000004, /* EMC_QRST */ + 0x0000000d, /* EMC_RDV_MASK */ + 0x00000607, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x00000181, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000002, /* EMC_PDEX2WR */ + 0x00000002, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x0000001d, /* EMC_AR2PDEN */ + 0x0000000f, /* EMC_RW2PDEN */ + 0x00000023, /* EMC_TXSR */ + 0x00000038, /* EMC_TXSRDLL */ + 0x00000004, /* EMC_TCKE */ + 0x00000004, /* EMC_TCKESR */ + 0x00000004, /* EMC_TPD */ + 0x00000009, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000004, /* EMC_TCLKSTABLE */ + 0x00000005, /* EMC_TCLKSTOP */ + 0x00000638, /* EMC_TREFBW */ + 0x00000006, /* EMC_QUSE_EXTRA */ + 0x00000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000aa88, /* EMC_FBIO_CFG5 */ + 0x000000a0, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x0006c000, /* EMC_DLL_XFORM_DQS4 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS5 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS6 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS7 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0000a11c, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc085, /* EMC_XM2CLKPADCTRL */ + 0x81f1f108, /* EMC_XM2COMPPADCTRL */ + 0x05057404, /* EMC_XM2VTTGENPADCTRL */ + 0x0000003f, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00020000, /* EMC_ZCAL_INTERVAL */ + 0x00000100, /* EMC_ZCAL_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT */ + 0x000c000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x80000d22, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0x01000003, /* MC_EMEM_ARB_CFG */ + 0x800000fe, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RP */ + 0x00000005, /* MC_EMEM_ARB_TIMING_RC */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RAS */ + 0x00000004, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x00000008, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000001, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000003, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000006, /* MC_EMEM_ARB_TIMING_W2R */ + 0x06030102, /* MC_EMEM_ARB_DA_TURNS */ + 0x000a0405, /* MC_EMEM_ARB_DA_COVERS */ + 0x72440a06, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000004, /* EMC_FBIO_CFG6 */ + 0x00000007, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x0079e79e, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000808, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000004, /* EMC_FBIO_CFG6 */ + 0x00000007, /* EMC_QUSE */ + 0x00000004, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0006c000, /* EMC_DLL_XFORM_DQS0 */ + 0x00000009, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x0079e79e, /* EMC_XM2DQSPADCTRL4 */ + 0x20820800, /* EMC_XM2DQSPADCTRL3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000808, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS1 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS2 */ + 0x0006c000, /* EMC_DLL_XFORM_DQS3 */ + 0x00048000, /* EMC_DLL_XFORM_DQ1 */ + 0x00048000, /* EMC_DLL_XFORM_DQ2 */ + 0x00048000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x000000d0, /* MC_PTSA_GRANT_DECREMENT */ + 0x00230023, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x00230027, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x002b002f, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x0000002f, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x002f002f, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x003e002f, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x0000003e, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x003e003e, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x00ff00c8, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x7320000e, /* EMC_CFG */ + 0x80001221, /* Mode Register 0 */ + 0x80100003, /* Mode Register 1 */ + 0x80200008, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 3420, /* expected dvfs latency (ns) */ + }, + { + 0x41, /* Rev 4.0.3 */ + 312000, /* SDRAM frequency */ + 1000, /* min voltage */ + "pll_c", /* clock source id */ + 0x24000002, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x0000000e, /* EMC_RC */ + 0x00000030, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x00000009, /* EMC_RAS */ + 0x00000003, /* EMC_RP */ + 0x00000004, /* EMC_R2W */ + 0x00000008, /* EMC_W2R */ + 0x00000002, /* EMC_R2P */ + 0x00000009, /* EMC_W2P */ + 0x00000003, /* EMC_RD_RCD */ + 0x00000003, /* EMC_WR_RCD */ + 0x00000002, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000004, /* EMC_WDV */ + 0x00000004, /* EMC_WDV_MASK */ + 0x00000007, /* EMC_IBDLY */ + 0x00080006, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000004, /* EMC_QRST */ + 0x0000000d, /* EMC_RDV_MASK */ + 0x00000945, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x00000251, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000001, /* EMC_PDEX2WR */ + 0x00000008, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x0000002e, /* EMC_AR2PDEN */ + 0x0000000e, /* EMC_RW2PDEN */ + 0x00000036, /* EMC_TXSR */ + 0x00000200, /* EMC_TXSRDLL */ + 0x00000004, /* EMC_TCKE */ + 0x00000004, /* EMC_TCKESR */ + 0x00000004, /* EMC_TPD */ + 0x0000000d, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000004, /* EMC_TCLKSTABLE */ + 0x00000005, /* EMC_TCLKSTOP */ + 0x00000986, /* EMC_TREFBW */ + 0x00000006, /* EMC_QUSE_EXTRA */ + 0x00000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000ba88, /* EMC_FBIO_CFG5 */ + 0x002c00a0, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x00030000, /* EMC_DLL_XFORM_DQS4 */ + 0x00030000, /* EMC_DLL_XFORM_DQS5 */ + 0x00030000, /* EMC_DLL_XFORM_DQS6 */ + 0x00030000, /* EMC_DLL_XFORM_DQS7 */ + 0x00028000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00028000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00028000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00028000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0001013d, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc085, /* EMC_XM2CLKPADCTRL */ + 0x81f1f108, /* EMC_XM2COMPPADCTRL */ + 0x03035504, /* EMC_XM2VTTGENPADCTRL */ + 0x00000000, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00020000, /* EMC_ZCAL_INTERVAL */ + 0x00000100, /* EMC_ZCAL_WAIT_CNT */ + 0x0190000c, /* EMC_MRS_WAIT_CNT */ + 0x0190000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x80001395, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0x0b000004, /* MC_EMEM_ARB_CFG */ + 0x8000016a, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RP */ + 0x00000007, /* MC_EMEM_ARB_TIMING_RC */ + 0x00000004, /* MC_EMEM_ARB_TIMING_RAS */ + 0x00000006, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x00000007, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000002, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000004, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000006, /* MC_EMEM_ARB_TIMING_W2R */ + 0x06040202, /* MC_EMEM_ARB_DA_TURNS */ + 0x000b0607, /* MC_EMEM_ARB_DA_COVERS */ + 0x76e50f08, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000004, /* EMC_FBIO_CFG6 */ + 0x00000007, /* EMC_QUSE */ + 0x00000005, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x00030000, /* EMC_DLL_XFORM_DQS0 */ + 0x0000000b, /* EMC_QSAFE */ + 0x00028000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x10410400, /* EMC_XM2DQSPADCTRL3 */ + 0x00030000, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00024000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00024000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00024000, /* EMC_DLL_XFORM_ADDR2 */ + 0x00030000, /* EMC_DLL_XFORM_DQS1 */ + 0x00030000, /* EMC_DLL_XFORM_DQS2 */ + 0x00030000, /* EMC_DLL_XFORM_DQS3 */ + 0x00030000, /* EMC_DLL_XFORM_DQ1 */ + 0x00030000, /* EMC_DLL_XFORM_DQ2 */ + 0x00030000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00028000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00028000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00028000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000004, /* EMC_FBIO_CFG6 */ + 0x00000007, /* EMC_QUSE */ + 0x00000005, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x00030000, /* EMC_DLL_XFORM_DQS0 */ + 0x0000000b, /* EMC_QSAFE */ + 0x00028000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000d, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x10410400, /* EMC_XM2DQSPADCTRL3 */ + 0x00030000, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00024000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00024000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00024000, /* EMC_DLL_XFORM_ADDR2 */ + 0x00030000, /* EMC_DLL_XFORM_DQS1 */ + 0x00030000, /* EMC_DLL_XFORM_DQS2 */ + 0x00030000, /* EMC_DLL_XFORM_DQS3 */ + 0x00030000, /* EMC_DLL_XFORM_DQ1 */ + 0x00030000, /* EMC_DLL_XFORM_DQ2 */ + 0x00030000, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00028000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00028000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00028000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000140, /* MC_PTSA_GRANT_DECREMENT */ + 0x00170017, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x00170019, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x001c001e, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x0000001e, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x001e001e, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x0029001e, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x00000029, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x00290029, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x00ff0082, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x00ff00ff, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x5320000e, /* EMC_CFG */ + 0x80000321, /* Mode Register 0 */ + 0x80100002, /* Mode Register 1 */ + 0x80200000, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 2680, /* expected dvfs latency (ns) */ + }, + { + 0x41, /* Rev 4.0.3 */ + 408000, /* SDRAM frequency */ + 1000, /* min voltage */ + "pll_p", /* clock source id */ + 0x40000000, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x00000012, /* EMC_RC */ + 0x00000040, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x0000000d, /* EMC_RAS */ + 0x00000004, /* EMC_RP */ + 0x00000005, /* EMC_R2W */ + 0x00000009, /* EMC_W2R */ + 0x00000002, /* EMC_R2P */ + 0x0000000c, /* EMC_W2P */ + 0x00000004, /* EMC_RD_RCD */ + 0x00000004, /* EMC_WR_RCD */ + 0x00000002, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000004, /* EMC_WDV */ + 0x00000004, /* EMC_WDV_MASK */ + 0x00000007, /* EMC_IBDLY */ + 0x00080006, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000004, /* EMC_QRST */ + 0x0000000e, /* EMC_RDV_MASK */ + 0x00000c2f, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x0000030b, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000001, /* EMC_PDEX2WR */ + 0x00000008, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x0000003d, /* EMC_AR2PDEN */ + 0x00000011, /* EMC_RW2PDEN */ + 0x00000046, /* EMC_TXSR */ + 0x00000200, /* EMC_TXSRDLL */ + 0x00000004, /* EMC_TCKE */ + 0x00000004, /* EMC_TCKESR */ + 0x00000004, /* EMC_TPD */ + 0x00000011, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000004, /* EMC_TCLKSTABLE */ + 0x00000005, /* EMC_TCLKSTOP */ + 0x00000c70, /* EMC_TREFBW */ + 0x00000006, /* EMC_QUSE_EXTRA */ + 0x00000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000ba88, /* EMC_FBIO_CFG5 */ + 0x002c0080, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x00018000, /* EMC_DLL_XFORM_DQS4 */ + 0x00018000, /* EMC_DLL_XFORM_DQS5 */ + 0x00018000, /* EMC_DLL_XFORM_DQS6 */ + 0x00018000, /* EMC_DLL_XFORM_DQS7 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0001013d, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc085, /* EMC_XM2CLKPADCTRL */ + 0x81f1f108, /* EMC_XM2COMPPADCTRL */ + 0x03035504, /* EMC_XM2VTTGENPADCTRL */ + 0x00000000, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00020000, /* EMC_ZCAL_INTERVAL */ + 0x00000100, /* EMC_ZCAL_WAIT_CNT */ + 0x0181000c, /* EMC_MRS_WAIT_CNT */ + 0x0181000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x80001944, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0x02000006, /* MC_EMEM_ARB_CFG */ + 0x80000190, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RP */ + 0x0000000a, /* MC_EMEM_ARB_TIMING_RC */ + 0x00000006, /* MC_EMEM_ARB_TIMING_RAS */ + 0x00000008, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x00000009, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000002, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000004, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000006, /* MC_EMEM_ARB_TIMING_W2R */ + 0x06040202, /* MC_EMEM_ARB_DA_TURNS */ + 0x000e070a, /* MC_EMEM_ARB_DA_COVERS */ + 0x7547130b, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000004, /* EMC_FBIO_CFG6 */ + 0x00000007, /* EMC_QUSE */ + 0x00000005, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x00018000, /* EMC_DLL_XFORM_DQS0 */ + 0x0000000c, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000e, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x10410400, /* EMC_XM2DQSPADCTRL3 */ + 0x00020001, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000005, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000005, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000005, /* EMC_DLL_XFORM_ADDR2 */ + 0x00018000, /* EMC_DLL_XFORM_DQS1 */ + 0x00018000, /* EMC_DLL_XFORM_DQS2 */ + 0x00018000, /* EMC_DLL_XFORM_DQS3 */ + 0x00020001, /* EMC_DLL_XFORM_DQ1 */ + 0x00020001, /* EMC_DLL_XFORM_DQ2 */ + 0x00020001, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000004, /* EMC_FBIO_CFG6 */ + 0x00000007, /* EMC_QUSE */ + 0x00000005, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x00018000, /* EMC_DLL_XFORM_DQS0 */ + 0x0000000c, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x0000000e, /* EMC_RDV */ + 0x00208208, /* EMC_XM2DQSPADCTRL4 */ + 0x10410400, /* EMC_XM2DQSPADCTRL3 */ + 0x00020001, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00000005, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000000, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00000005, /* EMC_DLL_XFORM_ADDR1 */ + 0x00000005, /* EMC_DLL_XFORM_ADDR2 */ + 0x00018000, /* EMC_DLL_XFORM_DQS1 */ + 0x00018000, /* EMC_DLL_XFORM_DQS2 */ + 0x00018000, /* EMC_DLL_XFORM_DQS3 */ + 0x00020001, /* EMC_DLL_XFORM_DQ1 */ + 0x00020001, /* EMC_DLL_XFORM_DQ2 */ + 0x00020001, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x000000d1, /* MC_PTSA_GRANT_DECREMENT */ + 0x00110011, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x00110013, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x00150017, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x00000017, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x00170017, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x001f0017, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x0000001f, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x001f001f, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x00d30064, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x00d300d3, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x53200006, /* EMC_CFG */ + 0x80000731, /* Mode Register 0 */ + 0x80100002, /* Mode Register 1 */ + 0x80200008, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 1750, /* expected dvfs latency (ns) */ + }, + { + 0x41, /* Rev 4.0.3 */ + 528000, /* SDRAM frequency */ + 1100, /* min voltage */ + "pll_m", /* clock source id */ + 0x80000000, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x00000018, /* EMC_RC */ + 0x00000053, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x00000010, /* EMC_RAS */ + 0x00000006, /* EMC_RP */ + 0x00000004, /* EMC_R2W */ + 0x00000009, /* EMC_W2R */ + 0x00000002, /* EMC_R2P */ + 0x0000000d, /* EMC_W2P */ + 0x00000006, /* EMC_RD_RCD */ + 0x00000006, /* EMC_WR_RCD */ + 0x00000002, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000005, /* EMC_WDV */ + 0x00000005, /* EMC_WDV_MASK */ + 0x00000009, /* EMC_IBDLY */ + 0x00090007, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000007, /* EMC_QRST */ + 0x00000010, /* EMC_RDV_MASK */ + 0x00000fd8, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x000003f6, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000002, /* EMC_PDEX2WR */ + 0x0000000b, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x00000050, /* EMC_AR2PDEN */ + 0x00000012, /* EMC_RW2PDEN */ + 0x0000005a, /* EMC_TXSR */ + 0x00000200, /* EMC_TXSRDLL */ + 0x00000004, /* EMC_TCKE */ + 0x00000004, /* EMC_TCKESR */ + 0x00000004, /* EMC_TPD */ + 0x00000016, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000005, /* EMC_TCLKSTABLE */ + 0x00000006, /* EMC_TCLKSTOP */ + 0x00001019, /* EMC_TREFBW */ + 0x00000008, /* EMC_QUSE_EXTRA */ + 0x00000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000ba88, /* EMC_FBIO_CFG5 */ + 0xf0120091, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x0000000a, /* EMC_DLL_XFORM_DQS4 */ + 0x0000000a, /* EMC_DLL_XFORM_DQS5 */ + 0x0000000a, /* EMC_DLL_XFORM_DQS6 */ + 0x0000000a, /* EMC_DLL_XFORM_DQS7 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0000013d, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc085, /* EMC_XM2CLKPADCTRL */ + 0x81f1f108, /* EMC_XM2COMPPADCTRL */ + 0x07077504, /* EMC_XM2VTTGENPADCTRL */ + 0x00000000, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00020000, /* EMC_ZCAL_INTERVAL */ + 0x00000100, /* EMC_ZCAL_WAIT_CNT */ + 0x016e000c, /* EMC_MRS_WAIT_CNT */ + 0x016e000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x80002066, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0x0f000007, /* MC_EMEM_ARB_CFG */ + 0x80000190, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000003, /* MC_EMEM_ARB_TIMING_RP */ + 0x0000000c, /* MC_EMEM_ARB_TIMING_RC */ + 0x00000007, /* MC_EMEM_ARB_TIMING_RAS */ + 0x0000000a, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x00000009, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000002, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000004, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000006, /* MC_EMEM_ARB_TIMING_W2R */ + 0x06040202, /* MC_EMEM_ARB_DA_TURNS */ + 0x0010090c, /* MC_EMEM_ARB_DA_COVERS */ + 0x7428180e, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000009, /* EMC_QUSE */ + 0x00000007, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0000000a, /* EMC_DLL_XFORM_DQS0 */ + 0x0000000c, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x00000010, /* EMC_RDV */ + 0x0028a28a, /* EMC_XM2DQSPADCTRL4 */ + 0x10410400, /* EMC_XM2DQSPADCTRL3 */ + 0x0000000a, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00010000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000909, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00010000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00010000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0000000a, /* EMC_DLL_XFORM_DQS1 */ + 0x0000000a, /* EMC_DLL_XFORM_DQS2 */ + 0x0000000a, /* EMC_DLL_XFORM_DQS3 */ + 0x0000000a, /* EMC_DLL_XFORM_DQ1 */ + 0x0000000a, /* EMC_DLL_XFORM_DQ2 */ + 0x0000000a, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x00000009, /* EMC_QUSE */ + 0x00000007, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x0000000a, /* EMC_DLL_XFORM_DQS0 */ + 0x0000000c, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x00000010, /* EMC_RDV */ + 0x0028a28a, /* EMC_XM2DQSPADCTRL4 */ + 0x10410400, /* EMC_XM2DQSPADCTRL3 */ + 0x0000000a, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x00010000, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000909, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x00010000, /* EMC_DLL_XFORM_ADDR1 */ + 0x00010000, /* EMC_DLL_XFORM_ADDR2 */ + 0x0000000a, /* EMC_DLL_XFORM_DQS1 */ + 0x0000000a, /* EMC_DLL_XFORM_DQS2 */ + 0x0000000a, /* EMC_DLL_XFORM_DQS3 */ + 0x0000000a, /* EMC_DLL_XFORM_DQ1 */ + 0x0000000a, /* EMC_DLL_XFORM_DQ2 */ + 0x0000000a, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x0000010e, /* MC_PTSA_GRANT_DECREMENT */ + 0x000d000d, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x000d000f, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x00100012, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x00000012, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x00120012, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x00180012, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x00000018, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x00180018, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x00a3004d, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x00a300a3, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x73100004, /* EMC_CFG */ + 0x80000941, /* Mode Register 0 */ + 0x80100002, /* Mode Register 1 */ + 0x80200008, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 1440, /* expected dvfs latency (ns) */ + }, + { + 0x41, /* Rev 4.0.3 */ + 624000, /* SDRAM frequency */ + 1100, /* min voltage */ + "pll_c", /* clock source id */ + 0x24000000, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x0000001d, /* EMC_RC */ + 0x00000062, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x00000014, /* EMC_RAS */ + 0x00000007, /* EMC_RP */ + 0x00000007, /* EMC_R2W */ + 0x0000000b, /* EMC_W2R */ + 0x00000003, /* EMC_R2P */ + 0x00000010, /* EMC_W2P */ + 0x00000007, /* EMC_RD_RCD */ + 0x00000007, /* EMC_WR_RCD */ + 0x00000003, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000005, /* EMC_WDV */ + 0x00000005, /* EMC_WDV_MASK */ + 0x0000000a, /* EMC_IBDLY */ + 0x000c000a, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000007, /* EMC_QRST */ + 0x00000012, /* EMC_RDV_MASK */ + 0x000012c4, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x000004b1, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000002, /* EMC_PDEX2WR */ + 0x0000000d, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x0000005e, /* EMC_AR2PDEN */ + 0x00000015, /* EMC_RW2PDEN */ + 0x0000006b, /* EMC_TXSR */ + 0x00000200, /* EMC_TXSRDLL */ + 0x00000005, /* EMC_TCKE */ + 0x00000005, /* EMC_TCKESR */ + 0x00000005, /* EMC_TPD */ + 0x00000019, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000006, /* EMC_TCLKSTABLE */ + 0x00000007, /* EMC_TCLKSTOP */ + 0x00001305, /* EMC_TREFBW */ + 0x00000009, /* EMC_QUSE_EXTRA */ + 0x00000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000ba88, /* EMC_FBIO_CFG5 */ + 0xf00d0191, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x007f800b, /* EMC_DLL_XFORM_DQS4 */ + 0x007f800b, /* EMC_DLL_XFORM_DQS5 */ + 0x007f800b, /* EMC_DLL_XFORM_DQS6 */ + 0x007f800b, /* EMC_DLL_XFORM_DQS7 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0000013d, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc085, /* EMC_XM2CLKPADCTRL */ + 0x81f1f108, /* EMC_XM2COMPPADCTRL */ + 0x07077504, /* EMC_XM2VTTGENPADCTRL */ + 0x00000000, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00020000, /* EMC_ZCAL_INTERVAL */ + 0x00000100, /* EMC_ZCAL_WAIT_CNT */ + 0x0160000c, /* EMC_MRS_WAIT_CNT */ + 0x0160000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x8000261a, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0x06000009, /* MC_EMEM_ARB_CFG */ + 0x80000190, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000003, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000004, /* MC_EMEM_ARB_TIMING_RP */ + 0x0000000f, /* MC_EMEM_ARB_TIMING_RC */ + 0x00000009, /* MC_EMEM_ARB_TIMING_RAS */ + 0x0000000c, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000001, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000003, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x0000000b, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000002, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000005, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000007, /* MC_EMEM_ARB_TIMING_W2R */ + 0x07050202, /* MC_EMEM_ARB_DA_TURNS */ + 0x00130b0f, /* MC_EMEM_ARB_DA_COVERS */ + 0x736a1d10, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000004, /* EMC_FBIO_CFG6 */ + 0x0000000a, /* EMC_QUSE */ + 0x00000008, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x007f800b, /* EMC_DLL_XFORM_DQS0 */ + 0x0000000c, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x00000012, /* EMC_RDV */ + 0x0028a28a, /* EMC_XM2DQSPADCTRL4 */ + 0x10410400, /* EMC_XM2DQSPADCTRL3 */ + 0x00000009, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000909, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR1 */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR2 */ + 0x007f800b, /* EMC_DLL_XFORM_DQS1 */ + 0x007f800b, /* EMC_DLL_XFORM_DQS2 */ + 0x007f800b, /* EMC_DLL_XFORM_DQS3 */ + 0x00000009, /* EMC_DLL_XFORM_DQ1 */ + 0x00000009, /* EMC_DLL_XFORM_DQ2 */ + 0x00000009, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000004, /* EMC_FBIO_CFG6 */ + 0x0000000a, /* EMC_QUSE */ + 0x00000008, /* EMC_EINPUT */ + 0x00000004, /* EMC_EINPUT_DURATION */ + 0x007f800b, /* EMC_DLL_XFORM_DQS0 */ + 0x0000000c, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x00000012, /* EMC_RDV */ + 0x0028a28a, /* EMC_XM2DQSPADCTRL4 */ + 0x10410400, /* EMC_XM2DQSPADCTRL3 */ + 0x00000009, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10000, /* EMC_AUTO_CAL_CONFIG */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000909, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR1 */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR2 */ + 0x007f800b, /* EMC_DLL_XFORM_DQS1 */ + 0x007f800b, /* EMC_DLL_XFORM_DQS2 */ + 0x007f800b, /* EMC_DLL_XFORM_DQS3 */ + 0x00000009, /* EMC_DLL_XFORM_DQ1 */ + 0x00000009, /* EMC_DLL_XFORM_DQ2 */ + 0x00000009, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x0000013f, /* MC_PTSA_GRANT_DECREMENT */ + 0x000b000b, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x000b000c, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x000e000f, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x0000000f, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x000f000f, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x0014000f, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x00000014, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x00140014, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x008a0041, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x008a008a, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x53200000, /* EMC_CFG */ + 0x80000b61, /* Mode Register 0 */ + 0x80100002, /* Mode Register 1 */ + 0x80200010, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 1440, /* expected dvfs latency (ns) */ + }, + { + 0x41, /* Rev 4.0.3 */ + 792000, /* SDRAM frequency */ + 1100, /* min voltage */ + "pll_m", /* clock source id */ + 0x80000000, /* CLK_SOURCE_EMC */ + 99, /* number of burst_regs */ + 30, /* number of trim_regs (each channel) */ + 11, /* number of up_down_regs */ + { + 0x00000024, /* EMC_RC */ + 0x0000007d, /* EMC_RFC */ + 0x00000000, /* EMC_RFC_SLR */ + 0x00000019, /* EMC_RAS */ + 0x0000000a, /* EMC_RP */ + 0x00000009, /* EMC_R2W */ + 0x0000000d, /* EMC_W2R */ + 0x00000004, /* EMC_R2P */ + 0x00000013, /* EMC_W2P */ + 0x0000000a, /* EMC_RD_RCD */ + 0x0000000a, /* EMC_WR_RCD */ + 0x00000004, /* EMC_RRD */ + 0x00000001, /* EMC_REXT */ + 0x00000000, /* EMC_WEXT */ + 0x00000006, /* EMC_WDV */ + 0x00000006, /* EMC_WDV_MASK */ + 0x0000000b, /* EMC_IBDLY */ + 0x000d000a, /* EMC_PUTERM_EXTRA */ + 0x00000000, /* EMC_CDB_CNTL_2 */ + 0x00000008, /* EMC_QRST */ + 0x00000014, /* EMC_RDV_MASK */ + 0x000017e4, /* EMC_REFRESH */ + 0x00000000, /* EMC_BURST_REFRESH_NUM */ + 0x000005f9, /* EMC_PRE_REFRESH_REQ_CNT */ + 0x00000003, /* EMC_PDEX2WR */ + 0x00000012, /* EMC_PDEX2RD */ + 0x00000001, /* EMC_PCHG2PDEN */ + 0x00000000, /* EMC_ACT2PDEN */ + 0x00000077, /* EMC_AR2PDEN */ + 0x00000018, /* EMC_RW2PDEN */ + 0x00000087, /* EMC_TXSR */ + 0x00000200, /* EMC_TXSRDLL */ + 0x00000005, /* EMC_TCKE */ + 0x00000005, /* EMC_TCKESR */ + 0x00000005, /* EMC_TPD */ + 0x00000020, /* EMC_TFAW */ + 0x00000000, /* EMC_TRPAB */ + 0x00000007, /* EMC_TCLKSTABLE */ + 0x00000008, /* EMC_TCLKSTOP */ + 0x00001825, /* EMC_TREFBW */ + 0x0000000a, /* EMC_QUSE_EXTRA */ + 0x80000020, /* EMC_ODT_WRITE */ + 0x00000000, /* EMC_ODT_READ */ + 0x0000ba88, /* EMC_FBIO_CFG5 */ + 0xf0070191, /* EMC_CFG_DIG_DLL */ + 0x00008000, /* EMC_CFG_DIG_DLL_PERIOD */ + 0x00000008, /* EMC_DLL_XFORM_DQS4 */ + 0x00000008, /* EMC_DLL_XFORM_DQS5 */ + 0x00000008, /* EMC_DLL_XFORM_DQS6 */ + 0x00000008, /* EMC_DLL_XFORM_DQS7 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE4 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE5 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE6 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE7 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS4 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS5 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS6 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS7 */ + 0x001112a0, /* EMC_XM2CMDPADCTRL */ + 0x00000000, /* EMC_XM2CMDPADCTRL4 */ + 0x0000013d, /* EMC_XM2DQSPADCTRL2 */ + 0x00000000, /* EMC_XM2DQPADCTRL2 */ + 0x77ffc084, /* EMC_XM2CLKPADCTRL */ + 0x81f1f508, /* EMC_XM2COMPPADCTRL */ + 0x07076604, /* EMC_XM2VTTGENPADCTRL */ + 0x00000000, /* EMC_XM2VTTGENPADCTRL2 */ + 0x0000003f, /* EMC_DSR_VTTGEN_DRV */ + 0x00000000, /* EMC_TXDSRVTTGEN */ + 0x02000000, /* EMC_FBIO_SPARE */ + 0x00000802, /* EMC_CTT_TERM_CTRL */ + 0x00020000, /* EMC_ZCAL_INTERVAL */ + 0x00000100, /* EMC_ZCAL_WAIT_CNT */ + 0x0147000c, /* EMC_MRS_WAIT_CNT */ + 0x0147000c, /* EMC_MRS_WAIT_CNT2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG2 */ + 0x00000000, /* EMC_AUTO_CAL_CONFIG3 */ + 0x00000000, /* EMC_CTT */ + 0x00000000, /* EMC_CTT_DURATION */ + 0x80003018, /* EMC_DYN_SELF_REF_CONTROL */ + 0x1f7df7df, /* EMC_CA_TRAINING_TIMING_CNTL1 */ + 0x0000001f, /* EMC_CA_TRAINING_TIMING_CNTL2 */ + 0x0e00000b, /* MC_EMEM_ARB_CFG */ + 0x80000190, /* MC_EMEM_ARB_OUTSTANDING_REQ */ + 0x00000004, /* MC_EMEM_ARB_TIMING_RCD */ + 0x00000005, /* MC_EMEM_ARB_TIMING_RP */ + 0x00000013, /* MC_EMEM_ARB_TIMING_RC */ + 0x0000000c, /* MC_EMEM_ARB_TIMING_RAS */ + 0x0000000f, /* MC_EMEM_ARB_TIMING_FAW */ + 0x00000002, /* MC_EMEM_ARB_TIMING_RRD */ + 0x00000003, /* MC_EMEM_ARB_TIMING_RAP2PRE */ + 0x0000000c, /* MC_EMEM_ARB_TIMING_WAP2PRE */ + 0x00000002, /* MC_EMEM_ARB_TIMING_R2R */ + 0x00000002, /* MC_EMEM_ARB_TIMING_W2W */ + 0x00000006, /* MC_EMEM_ARB_TIMING_R2W */ + 0x00000008, /* MC_EMEM_ARB_TIMING_W2R */ + 0x08060202, /* MC_EMEM_ARB_DA_TURNS */ + 0x00170e13, /* MC_EMEM_ARB_DA_COVERS */ + 0x72cc2414, /* MC_EMEM_ARB_MISC0 */ + 0x001f0000, /* MC_EMEM_ARB_RING1_THROTTLE */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x0000000b, /* EMC_QUSE */ + 0x00000008, /* EMC_EINPUT */ + 0x00000006, /* EMC_EINPUT_DURATION */ + 0x00000008, /* EMC_DLL_XFORM_DQS0 */ + 0x0000000d, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x00000014, /* EMC_RDV */ + 0x00249249, /* EMC_XM2DQSPADCTRL4 */ + 0x10410400, /* EMC_XM2DQSPADCTRL3 */ + 0x007fc00a, /* EMC_DLL_XFORM_DQ0 */ + 0xa0f10f0f, /* EMC_AUTO_CAL_CONFIG */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000b0b, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR1 */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR2 */ + 0x00000008, /* EMC_DLL_XFORM_DQS1 */ + 0x00000008, /* EMC_DLL_XFORM_DQS2 */ + 0x00000008, /* EMC_DLL_XFORM_DQS3 */ + 0x007fc00a, /* EMC_DLL_XFORM_DQ1 */ + 0x007fc00a, /* EMC_DLL_XFORM_DQ2 */ + 0x007fc00a, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000000, /* EMC_CDB_CNTL_1 */ + 0x00000006, /* EMC_FBIO_CFG6 */ + 0x0000000b, /* EMC_QUSE */ + 0x00000008, /* EMC_EINPUT */ + 0x00000006, /* EMC_EINPUT_DURATION */ + 0x00000008, /* EMC_DLL_XFORM_DQS0 */ + 0x0000000d, /* EMC_QSAFE */ + 0x00000000, /* EMC_DLL_XFORM_QUSE0 */ + 0x00000014, /* EMC_RDV */ + 0x00249249, /* EMC_XM2DQSPADCTRL4 */ + 0x10410400, /* EMC_XM2DQSPADCTRL3 */ + 0x007fc00a, /* EMC_DLL_XFORM_DQ0 */ + 0xa8f10f0f, /* EMC_AUTO_CAL_CONFIG */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR0 */ + 0x00000b0b, /* EMC_XM2CLKPADCTRL2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS0 */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR1 */ + 0x007fc00d, /* EMC_DLL_XFORM_ADDR2 */ + 0x00000008, /* EMC_DLL_XFORM_DQS1 */ + 0x00000008, /* EMC_DLL_XFORM_DQS2 */ + 0x00000008, /* EMC_DLL_XFORM_DQS3 */ + 0x007fc00a, /* EMC_DLL_XFORM_DQ1 */ + 0x007fc00a, /* EMC_DLL_XFORM_DQ2 */ + 0x007fc00a, /* EMC_DLL_XFORM_DQ3 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS1 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS2 */ + 0x00000000, /* EMC_DLI_TRIM_TXDQS3 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE1 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE2 */ + 0x00000000, /* EMC_DLL_XFORM_QUSE3 */ + }, + { + 0x00000196, /* MC_PTSA_GRANT_DECREMENT */ + 0x00090009, /* MC_LATENCY_ALLOWANCE_G2_0 */ + 0x0009000a, /* MC_LATENCY_ALLOWANCE_G2_1 */ + 0x000b000c, /* MC_LATENCY_ALLOWANCE_NV_0 */ + 0x0000000c, /* MC_LATENCY_ALLOWANCE_NV2_0 */ + 0x000c000c, /* MC_LATENCY_ALLOWANCE_NV_2 */ + 0x0010000c, /* MC_LATENCY_ALLOWANCE_NV_1 */ + 0x00000010, /* MC_LATENCY_ALLOWANCE_NV2_1 */ + 0x00100010, /* MC_LATENCY_ALLOWANCE_NV3 */ + 0x006d0033, /* MC_LATENCY_ALLOWANCE_EPP_0 */ + 0x006d006d, /* MC_LATENCY_ALLOWANCE_EPP_1 */ + }, + 0x00000042, /* EMC_ZCAL_WAIT_CNT after clock change */ + 0x001fffff, /* EMC_AUTO_CAL_INTERVAL */ + 0x73000000, /* EMC_CFG */ + 0x80000d71, /* Mode Register 0 */ + 0x80100002, /* Mode Register 1 */ + 0x80200218, /* Mode Register 2 */ + 0x00000000, /* Mode Register 4 */ + 1200, /* expected dvfs latency (ns) */ + }, +}; + +static struct tegra11_emc_pdata e1569_mt41k128m16_125_pdata = { + .description = "e1569_mt41k128m16_125", + .tables = e1569_mt41k128m16_125_table, + .num_tables = ARRAY_SIZE(e1569_mt41k128m16_125_table), +}; + +static struct tegra11_emc_pdata *tegratab_get_emc_data(void) +{ + return &e1569_mt41k128m16_125_pdata; +} + +int __init tegratab_emc_init(void) +{ + tegra_emc_device.dev.platform_data = tegratab_get_emc_data(); + platform_device_register(&tegra_emc_device); + tegra11_emc_init(); + return 0; +} diff --git a/arch/arm/mach-tegra/board-tegratab-panel.c b/arch/arm/mach-tegra/board-tegratab-panel.c new file mode 100644 index 000000000000..2d0d051f4079 --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab-panel.c @@ -0,0 +1,518 @@ +/* + * arch/arm/mach-tegra/board-tegratab-panel.c + * + * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include <linux/ioport.h> +#include <linux/fb.h> +#include <linux/nvmap.h> +#include <linux/nvhost.h> +#include <linux/init.h> +#include <linux/delay.h> +#include <linux/gpio.h> +#include <linux/tegra_pwm_bl.h> +#include <linux/regulator/consumer.h> +#include <linux/pwm_backlight.h> + +#include <mach/irqs.h> +#include <mach/iomap.h> +#include <mach/dc.h> + +#include "board.h" +#include "devices.h" +#include "gpio-names.h" +#include "board-panel.h" +#include "common.h" +#include "tegra11_host1x_devices.h" + +struct platform_device * __init tegratab_host1x_init(void) +{ + struct platform_device *pdev = NULL; + +#ifdef CONFIG_TEGRA_GRHOST + pdev = tegra11_register_host1x_devices(); + if (!pdev) { + pr_err("host1x devices registration failed\n"); + return NULL; + } +#endif + return pdev; +} + +#ifdef CONFIG_TEGRA_DC + +/* HDMI Hotplug detection pin */ +#define tegratab_hdmi_hpd TEGRA_GPIO_PN7 + +static struct regulator *tegratab_hdmi_reg; +static struct regulator *tegratab_hdmi_pll; +static struct regulator *tegratab_hdmi_vddio; + +static struct resource tegratab_disp1_resources[] = { + { + .name = "irq", + .start = INT_DISPLAY_GENERAL, + .end = INT_DISPLAY_GENERAL, + .flags = IORESOURCE_IRQ, + }, + { + .name = "regs", + .start = TEGRA_DISPLAY_BASE, + .end = TEGRA_DISPLAY_BASE + TEGRA_DISPLAY_SIZE - 1, + .flags = IORESOURCE_MEM, + }, + { + .name = "fbmem", + .start = 0, /* Filled in by tegratab_panel_init() */ + .end = 0, /* Filled in by tegratab_panel_init() */ + .flags = IORESOURCE_MEM, + }, + { + .name = "ganged_dsia_regs", + .start = 0, /* Filled in the panel file by init_resources() */ + .end = 0, /* Filled in the panel file by init_resources() */ + .flags = IORESOURCE_MEM, + }, + { + .name = "ganged_dsib_regs", + .start = 0, /* Filled in the panel file by init_resources() */ + .end = 0, /* Filled in the panel file by init_resources() */ + .flags = IORESOURCE_MEM, + }, + { + .name = "dsi_regs", + .start = 0, /* Filled in the panel file by init_resources() */ + .end = 0, /* Filled in the panel file by init_resources() */ + .flags = IORESOURCE_MEM, + }, + { + .name = "mipi_cal", + .start = TEGRA_MIPI_CAL_BASE, + .end = TEGRA_MIPI_CAL_BASE + TEGRA_MIPI_CAL_SIZE - 1, + .flags = IORESOURCE_MEM, + }, +}; + +static struct resource tegratab_disp2_resources[] = { + { + .name = "irq", + .start = INT_DISPLAY_B_GENERAL, + .end = INT_DISPLAY_B_GENERAL, + .flags = IORESOURCE_IRQ, + }, + { + .name = "regs", + .start = TEGRA_DISPLAY2_BASE, + .end = TEGRA_DISPLAY2_BASE + TEGRA_DISPLAY2_SIZE - 1, + .flags = IORESOURCE_MEM, + }, + { + .name = "fbmem", + .start = 0, /* Filled in by tegratab_panel_init() */ + .end = 0, /* Filled in by tegratab_panel_init() */ + .flags = IORESOURCE_MEM, + }, + { + .name = "hdmi_regs", + .start = TEGRA_HDMI_BASE, + .end = TEGRA_HDMI_BASE + TEGRA_HDMI_SIZE - 1, + .flags = IORESOURCE_MEM, + }, +}; + + +static struct tegra_dc_sd_settings sd_settings; + +static struct tegra_dc_out tegratab_disp1_out = { + .type = TEGRA_DC_OUT_DSI, + /* + * In the early bring-up stage, we will not enable + * PRISM. + * TODO. enable PRISM later. + */ + .sd_settings = NULL, + /* + * .sd_settings = &sd_settings, + */ +}; + +static int tegratab_hdmi_enable(struct device *dev) +{ + int ret; + if (!tegratab_hdmi_reg) { + tegratab_hdmi_reg = regulator_get(dev, "avdd_hdmi"); + if (IS_ERR_OR_NULL(tegratab_hdmi_reg)) { + pr_err("hdmi: couldn't get regulator avdd_hdmi\n"); + tegratab_hdmi_reg = NULL; + return PTR_ERR(tegratab_hdmi_reg); + } + } + ret = regulator_enable(tegratab_hdmi_reg); + if (ret < 0) { + pr_err("hdmi: couldn't enable regulator avdd_hdmi\n"); + return ret; + } + if (!tegratab_hdmi_pll) { + tegratab_hdmi_pll = regulator_get(dev, "avdd_hdmi_pll"); + if (IS_ERR_OR_NULL(tegratab_hdmi_pll)) { + pr_err("hdmi: couldn't get regulator avdd_hdmi_pll\n"); + tegratab_hdmi_pll = NULL; + regulator_put(tegratab_hdmi_reg); + tegratab_hdmi_reg = NULL; + return PTR_ERR(tegratab_hdmi_pll); + } + } + ret = regulator_enable(tegratab_hdmi_pll); + if (ret < 0) { + pr_err("hdmi: couldn't enable regulator avdd_hdmi_pll\n"); + return ret; + } + return 0; +} + +static int tegratab_hdmi_disable(void) +{ + if (tegratab_hdmi_reg) { + regulator_disable(tegratab_hdmi_reg); + regulator_put(tegratab_hdmi_reg); + tegratab_hdmi_reg = NULL; + } + + if (tegratab_hdmi_pll) { + regulator_disable(tegratab_hdmi_pll); + regulator_put(tegratab_hdmi_pll); + tegratab_hdmi_pll = NULL; + } + + return 0; +} + +static int tegratab_hdmi_postsuspend(void) +{ + if (tegratab_hdmi_vddio) { + regulator_disable(tegratab_hdmi_vddio); + regulator_put(tegratab_hdmi_vddio); + tegratab_hdmi_vddio = NULL; + } + return 0; +} + +static int tegratab_hdmi_hotplug_init(struct device *dev) +{ + if (!tegratab_hdmi_vddio) { + tegratab_hdmi_vddio = regulator_get(dev, "vdd_hdmi_5v0"); + if (WARN_ON(IS_ERR(tegratab_hdmi_vddio))) { + pr_err("%s: couldn't get regulator vdd_hdmi_5v0: %ld\n", + __func__, PTR_ERR(tegratab_hdmi_vddio)); + tegratab_hdmi_vddio = NULL; + } else { + regulator_enable(tegratab_hdmi_vddio); + mdelay(5); + } + } + + return 0; +} + +static struct tegra_dc_out tegratab_disp2_out = { + .type = TEGRA_DC_OUT_HDMI, + .flags = TEGRA_DC_OUT_HOTPLUG_HIGH, + .parent_clk = "pll_d2_out0", + + .dcc_bus = 3, + .hotplug_gpio = tegratab_hdmi_hpd, + + .max_pixclock = KHZ2PICOS(297000), + + .align = TEGRA_DC_ALIGN_MSB, + .order = TEGRA_DC_ORDER_RED_BLUE, + + .enable = tegratab_hdmi_enable, + .disable = tegratab_hdmi_disable, + .postsuspend = tegratab_hdmi_postsuspend, + .hotplug_init = tegratab_hdmi_hotplug_init, +}; + +static struct tegra_fb_data tegratab_disp1_fb_data = { + .win = 0, + .bits_per_pixel = 32, + .flags = TEGRA_FB_FLIP_ON_PROBE, +}; + +static struct tegra_dc_platform_data tegratab_disp1_pdata = { + .flags = TEGRA_DC_FLAG_ENABLED, + .default_out = &tegratab_disp1_out, + .fb = &tegratab_disp1_fb_data, + .emc_clk_rate = 204000000, + /* + * In early panel bring-up stage, we will not + * enable CMU. Check if CONFIG_TEGRA_DC_CMU is + * removed in early bring-up stage as well. + * TODO...enable CMU later. + */ +#ifdef CONFIG_TEGRA_DC_CMU + .cmu_enable = 0, + /*.cmu_enable = 1,*/ +#endif +}; + +static struct tegra_fb_data tegratab_disp2_fb_data = { + .win = 0, + .xres = 1024, + .yres = 600, + .bits_per_pixel = 32, + .flags = TEGRA_FB_FLIP_ON_PROBE, +}; + +static struct tegra_dc_platform_data tegratab_disp2_pdata = { + .flags = TEGRA_DC_FLAG_ENABLED, + .default_out = &tegratab_disp2_out, + .fb = &tegratab_disp2_fb_data, + .emc_clk_rate = 300000000, +}; + +static struct platform_device tegratab_disp2_device = { + .name = "tegradc", + .id = 1, + .resource = tegratab_disp2_resources, + .num_resources = ARRAY_SIZE(tegratab_disp2_resources), + .dev = { + .platform_data = &tegratab_disp2_pdata, + }, +}; + +static struct platform_device tegratab_disp1_device = { + .name = "tegradc", + .id = 0, + .resource = tegratab_disp1_resources, + .num_resources = ARRAY_SIZE(tegratab_disp1_resources), + .dev = { + .platform_data = &tegratab_disp1_pdata, + }, +}; + +static struct nvmap_platform_carveout tegratab_carveouts[] = { + [0] = { + .name = "iram", + .usage_mask = NVMAP_HEAP_CARVEOUT_IRAM, + .base = TEGRA_IRAM_BASE + TEGRA_RESET_HANDLER_SIZE, + .size = TEGRA_IRAM_SIZE - TEGRA_RESET_HANDLER_SIZE, + .buddy_size = 0, /* no buddy allocation for IRAM */ + }, + [1] = { + .name = "generic-0", + .usage_mask = NVMAP_HEAP_CARVEOUT_GENERIC, + .base = 0, /* Filled in by tegratab_panel_init() */ + .size = 0, /* Filled in by tegratab_panel_init() */ + .buddy_size = SZ_32K, + }, + [2] = { + .name = "vpr", + .usage_mask = NVMAP_HEAP_CARVEOUT_VPR, + .base = 0, /* Filled in by tegratab_panel_init() */ + .size = 0, /* Filled in by tegratab_panel_init() */ + .buddy_size = SZ_32K, + }, +}; + +static struct nvmap_platform_data tegratab_nvmap_data = { + .carveouts = tegratab_carveouts, + .nr_carveouts = ARRAY_SIZE(tegratab_carveouts), +}; +static struct platform_device tegratab_nvmap_device __initdata = { + .name = "tegra-nvmap", + .id = -1, + .dev = { + .platform_data = &tegratab_nvmap_data, + }, +}; + +static struct tegra_dc_sd_settings tegratab_sd_settings = { + /* + * In early panel bring-up stage, + * we will disable PRISM. + * TODO. enable PRISM later. + */ + .enable = 0, + /*.enable = 1, */ /* enabled by default. */ + .use_auto_pwm = false, + .hw_update_delay = 0, + .bin_width = -1, + .aggressiveness = 5, + .use_vid_luma = false, + .phase_in_adjustments = 0, + .k_limit_enable = true, + .k_limit = 200, + .sd_window_enable = false, + .soft_clipping_enable = true, + /* Low soft clipping threshold to compensate for aggressive k_limit */ + .soft_clipping_threshold = 128, + .smooth_k_enable = false, + .smooth_k_incr = 64, + /* Default video coefficients */ + .coeff = {5, 9, 2}, + .fc = {0, 0}, + /* Immediate backlight changes */ + .blp = {1024, 255}, + /* Gammas: R: 2.2 G: 2.2 B: 2.2 */ + /* Default BL TF */ + .bltf = { + { + {57, 65, 73, 82}, + {92, 103, 114, 125}, + {138, 150, 164, 178}, + {193, 208, 224, 241}, + }, + }, + /* Default LUT */ + .lut = { + { + {255, 255, 255}, + {199, 199, 199}, + {153, 153, 153}, + {116, 116, 116}, + {85, 85, 85}, + {59, 59, 59}, + {36, 36, 36}, + {17, 17, 17}, + {0, 0, 0}, + }, + }, + .sd_brightness = &sd_brightness, + .use_vpulse2 = true, +}; + +static void tegratab_panel_select(void) +{ + struct tegra_panel *panel = NULL; + struct board_info board; + + tegra_get_display_board_info(&board); + + switch (board.board_id) { + default: + panel = &dsi_p_wuxga_10_1; + break; + } + if (panel) { + if (panel->init_sd_settings) + panel->init_sd_settings(&sd_settings); + + if (panel->init_dc_out) + panel->init_dc_out(&tegratab_disp1_out); + + if (panel->init_fb_data) + panel->init_fb_data(&tegratab_disp1_fb_data); + + if (panel->init_cmu_data) + panel->init_cmu_data(&tegratab_disp1_pdata); + + if (panel->set_disp_device) + panel->set_disp_device(&tegratab_disp1_device); + + if (panel->init_resources) + panel->init_resources(tegratab_disp1_resources, + ARRAY_SIZE(tegratab_disp1_resources)); + + if (panel->register_bl_dev) + panel->register_bl_dev(); + + if (panel->register_i2c_bridge) + panel->register_i2c_bridge(); + } + +} +int __init tegratab_panel_init(void) +{ + int err = 0; + struct resource __maybe_unused *res; + struct platform_device *phost1x; + + sd_settings = tegratab_sd_settings; + + tegratab_panel_select(); + +#ifdef CONFIG_TEGRA_NVMAP + tegratab_carveouts[1].base = tegra_carveout_start; + tegratab_carveouts[1].size = tegra_carveout_size; + tegratab_carveouts[2].base = tegra_vpr_start; + tegratab_carveouts[2].size = tegra_vpr_size; + + err = platform_device_register(&tegratab_nvmap_device); + if (err) { + pr_err("nvmap device registration failed\n"); + return err; + } +#endif + + phost1x = tegratab_host1x_init(); + if (!phost1x) { + pr_err("host1x devices registration failed\n"); + return -EINVAL; + } + + gpio_request(tegratab_hdmi_hpd, "hdmi_hpd"); + gpio_direction_input(tegratab_hdmi_hpd); + + res = platform_get_resource_byname(&tegratab_disp1_device, + IORESOURCE_MEM, "fbmem"); + res->start = tegra_fb_start; + res->end = tegra_fb_start + tegra_fb_size - 1; + + /* Copy the bootloader fb to the fb. */ + __tegra_move_framebuffer(&tegratab_nvmap_device, + tegra_fb_start, tegra_bootloader_fb_start, + min(tegra_fb_size, tegra_bootloader_fb_size)); + + res = platform_get_resource_byname(&tegratab_disp2_device, + IORESOURCE_MEM, "fbmem"); + res->start = tegra_fb2_start; + res->end = tegra_fb2_start + tegra_fb2_size - 1; + + tegratab_disp1_device.dev.parent = &phost1x->dev; + err = platform_device_register(&tegratab_disp1_device); + if (err) { + pr_err("disp1 device registration failed\n"); + return err; + } + + tegratab_disp2_device.dev.parent = &phost1x->dev; + err = platform_device_register(&tegratab_disp2_device); + if (err) { + pr_err("disp2 device registration failed\n"); + return err; + } + +#ifdef CONFIG_TEGRA_NVAVP + nvavp_device.dev.parent = &phost1x->dev; + err = platform_device_register(&nvavp_device); + if (err) { + pr_err("nvavp device registration failed\n"); + return err; + } +#endif + return err; +} +#else +int __init tegratab_panel_init(void) +{ + if (tegratab_host1x_init()) + return 0; + else + return -EINVAL; +} +#endif diff --git a/arch/arm/mach-tegra/board-tegratab-pinmux-t11x.h b/arch/arm/mach-tegra/board-tegratab-pinmux-t11x.h new file mode 100644 index 000000000000..ab8fa3de01a4 --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab-pinmux-t11x.h @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* DO NOT EDIT THIS FILE. THIS FILE IS GENERATED FROM TEGRATAB_PINMUX.XLSM */ + + +static __initdata struct tegra_pingroup_config tegratab_pinmux_common[] = { + + /* EXTPERIPH1 pinmux */ + DEFAULT_PINMUX(CLK1_OUT, EXTPERIPH1, NORMAL, NORMAL, OUTPUT), + + /* I2S0 pinmux */ + DEFAULT_PINMUX(DAP1_DIN, I2S0, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(DAP1_DOUT, I2S0, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(DAP1_FS, I2S0, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(DAP1_SCLK, I2S0, NORMAL, NORMAL, OUTPUT), + + /* I2S1 pinmux */ + DEFAULT_PINMUX(DAP2_DIN, I2S1, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(DAP2_DOUT, I2S1, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(DAP2_FS, I2S1, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(DAP2_SCLK, I2S1, NORMAL, NORMAL, OUTPUT), + + /* CLDVFS pinmux */ + DEFAULT_PINMUX(DVFS_PWM, CLDVFS, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(DVFS_CLK, CLDVFS, NORMAL, NORMAL, OUTPUT), + + /* SPI1 pinmux */ + DEFAULT_PINMUX(ULPI_CLK, SPI1, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(ULPI_DIR, SPI1, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(ULPI_NXT, SPI1, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(ULPI_STP, SPI1, NORMAL, NORMAL, OUTPUT), + + /* I2C3 pinmux */ + I2C_PINMUX(CAM_I2C_SCL, I2C3, NORMAL, NORMAL, INPUT, DISABLE, ENABLE), + I2C_PINMUX(CAM_I2C_SDA, I2C3, NORMAL, NORMAL, INPUT, DISABLE, ENABLE), + + /* VI_ALT3 pinmux */ + VI_PINMUX(CAM_MCLK, VI_ALT3, NORMAL, NORMAL, OUTPUT, DISABLE, DISABLE), + VI_PINMUX(GPIO_PBB0, VI_ALT3, NORMAL, NORMAL, OUTPUT, DISABLE, DISABLE), + + /* I2C2 pinmux */ + I2C_PINMUX(GEN2_I2C_SCL, I2C2, NORMAL, NORMAL, INPUT, DISABLE, ENABLE), + I2C_PINMUX(GEN2_I2C_SDA, I2C2, NORMAL, NORMAL, INPUT, DISABLE, ENABLE), + + /* UARTD pinmux */ + DEFAULT_PINMUX(GMI_A16, UARTD, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(GMI_A17, UARTD, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(GMI_A18, UARTD, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(GMI_A19, UARTD, NORMAL, NORMAL, OUTPUT), + + /* SPI4 pinmux */ + DEFAULT_PINMUX(GMI_AD5, SPI4, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(GMI_AD6, SPI4, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(GMI_AD7, SPI4, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(GMI_WR_N, SPI4, NORMAL, NORMAL, OUTPUT), + + /* PWM1 pinmux */ + DEFAULT_PINMUX(GMI_AD9, PWM1, NORMAL, NORMAL, OUTPUT), + + /* SOC pinmux */ + DEFAULT_PINMUX(GMI_CS1_N, SOC, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(GMI_OE_N, SOC, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(CLK_32K_OUT, SOC, PULL_UP, NORMAL, INPUT), + + /* EXTPERIPH2 pinmux */ + DEFAULT_PINMUX(CLK2_OUT, EXTPERIPH2, NORMAL, NORMAL, OUTPUT), + + /* SDMMC1 pinmux */ + DEFAULT_PINMUX(SDMMC1_CLK, SDMMC1, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC1_CMD, SDMMC1, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC1_DAT0, SDMMC1, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC1_DAT1, SDMMC1, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC1_DAT2, SDMMC1, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC1_DAT3, SDMMC1, PULL_UP, NORMAL, INPUT), + + /* SDMMC3 pinmux */ + DEFAULT_PINMUX(SDMMC3_CLK, SDMMC3, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(SDMMC3_CMD, SDMMC3, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC3_DAT0, SDMMC3, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC3_DAT1, SDMMC3, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC3_DAT2, SDMMC3, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC3_DAT3, SDMMC3, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC3_CLK_LB_OUT, SDMMC3, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC3_CLK_LB_IN, SDMMC3, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(KB_COL4, SDMMC3, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC3_CD_N, SDMMC3, PULL_UP, NORMAL, INPUT), + + /* SDMMC4 pinmux */ + DEFAULT_PINMUX(SDMMC4_CLK, SDMMC4, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC4_CMD, SDMMC4, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC4_DAT0, SDMMC4, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC4_DAT1, SDMMC4, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC4_DAT2, SDMMC4, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC4_DAT3, SDMMC4, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC4_DAT4, SDMMC4, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC4_DAT5, SDMMC4, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC4_DAT6, SDMMC4, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(SDMMC4_DAT7, SDMMC4, PULL_UP, NORMAL, INPUT), + + /* UARTA pinmux */ + DEFAULT_PINMUX(KB_ROW10, UARTA, PULL_DOWN, NORMAL, INPUT), + DEFAULT_PINMUX(KB_ROW9, UARTA, NORMAL, NORMAL, OUTPUT), + + DEFAULT_PINMUX(KB_ROW6, KBC, PULL_DOWN, NORMAL, INPUT), + + /* KBC pinmux */ + DEFAULT_PINMUX(KB_ROW8, KBC, PULL_UP, NORMAL, INPUT), + + /* I2CPWR pinmux */ + I2C_PINMUX(PWR_I2C_SCL, I2CPWR, NORMAL, NORMAL, INPUT, DISABLE, ENABLE), + I2C_PINMUX(PWR_I2C_SDA, I2CPWR, NORMAL, NORMAL, INPUT, DISABLE, ENABLE), + + /* SYSCLK pinmux */ + DEFAULT_PINMUX(SYS_CLK_REQ, SYSCLK, NORMAL, NORMAL, OUTPUT), + + /* RTCK pinmux */ + DEFAULT_PINMUX(JTAG_RTCK, RTCK, NORMAL, NORMAL, INPUT), + + /* CLK pinmux */ + DEFAULT_PINMUX(CLK_32K_IN, CLK, NORMAL, NORMAL, INPUT), + + /* PWRON pinmux */ + DEFAULT_PINMUX(CORE_PWR_REQ, PWRON, NORMAL, NORMAL, OUTPUT), + + /* CPU pinmux */ + DEFAULT_PINMUX(CPU_PWR_REQ, CPU, NORMAL, NORMAL, OUTPUT), + + /* PMI pinmux */ + DEFAULT_PINMUX(PWR_INT_N, PMI, PULL_UP, NORMAL, INPUT), + + /* RESET_OUT_N pinmux */ + DEFAULT_PINMUX(RESET_OUT_N, RESET_OUT_N, NORMAL, NORMAL, OUTPUT), + + /* EXTPERIPH3 pinmux */ + DEFAULT_PINMUX(CLK3_OUT, EXTPERIPH3, NORMAL, NORMAL, OUTPUT), + + /* I2S3 pinmux */ + DEFAULT_PINMUX(DAP4_DIN, I2S3, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(DAP4_DOUT, I2S3, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(DAP4_FS, I2S3, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(DAP4_SCLK, I2S3, NORMAL, NORMAL, OUTPUT), + + /* I2C1 pinmux */ + I2C_PINMUX(GEN1_I2C_SCL, I2C1, NORMAL, NORMAL, INPUT, DISABLE, ENABLE), + I2C_PINMUX(GEN1_I2C_SDA, I2C1, NORMAL, NORMAL, INPUT, DISABLE, ENABLE), + + /* UARTB pinmux */ + DEFAULT_PINMUX(UART2_CTS_N, UARTB, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(UART2_RTS_N, UARTB, NORMAL, NORMAL, OUTPUT), + + /* IRDA pinmux */ + DEFAULT_PINMUX(UART2_RXD, IRDA, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(UART2_TXD, IRDA, NORMAL, NORMAL, OUTPUT), + + /* UARTC pinmux */ + DEFAULT_PINMUX(UART3_CTS_N, UARTC, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(UART3_RTS_N, UARTC, NORMAL, NORMAL, OUTPUT), + DEFAULT_PINMUX(UART3_RXD, UARTC, PULL_UP, NORMAL, INPUT), + DEFAULT_PINMUX(UART3_TXD, UARTC, NORMAL, NORMAL, OUTPUT), + + /* CEC pinmux */ + CEC_PINMUX(HDMI_CEC, CEC, NORMAL, NORMAL, INPUT, DISABLE, DISABLE), + + /* I2C4 pinmux */ + DDC_PINMUX(DDC_SCL, I2C4, NORMAL, NORMAL, INPUT, DISABLE, HIGH), + DDC_PINMUX(DDC_SDA, I2C4, NORMAL, NORMAL, INPUT, DISABLE, HIGH), + + /* USB pinmux */ + DEFAULT_PINMUX(USB_VBUS_EN0, USB, NORMAL, NORMAL, OUTPUT), + + /* GPIO pinmux */ + GPIO_PINMUX(GPIO_X4_AUD, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_X5_AUD, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_X6_AUD, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_X7_AUD, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_W2_AUD, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_W3_AUD, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_X1_AUD, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_X3_AUD, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(DAP3_DIN, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(DAP3_DOUT, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(DAP3_FS, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(DAP3_SCLK, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_PV0, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_PV1, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(ULPI_DATA2, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(ULPI_DATA3, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(ULPI_DATA4, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_PBB3, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_PBB4, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_PBB5, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_PBB6, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_PBB7, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_PCC1, PULL_DOWN, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_PCC2, PULL_DOWN, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_AD0, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_AD1, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_AD10, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_AD11, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_AD12, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_AD13, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_AD14, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_AD2, NORMAL, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_AD3, NORMAL, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_AD8, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_ADV_N, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_CLK, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_CS0_N, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_CS2_N, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_CS3_N, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_CS4_N, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_CS7_N, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_DQS_P, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_IORDY, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GMI_RST_N, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_WAIT, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GMI_WP_N, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(CLK2_REQ, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(SDMMC1_WP_N, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(KB_COL0, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(KB_COL1, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(KB_COL2, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(KB_COL3, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(KB_COL5, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(KB_COL6, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(KB_COL7, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(KB_ROW0, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(KB_ROW1, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(KB_ROW2, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(KB_ROW3, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(KB_ROW4, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(KB_ROW5, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(KB_ROW7, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(CLK3_REQ, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_PU0, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_PU1, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_PU2, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_PU3, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_PU4, NORMAL, NORMAL, OUTPUT, DISABLE), + GPIO_PINMUX(GPIO_PU5, PULL_UP, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(GPIO_PU6, NORMAL, NORMAL, INPUT, DISABLE), + GPIO_PINMUX(HDMI_INT, PULL_DOWN, NORMAL, INPUT, DEFAULT), + GPIO_PINMUX(SPDIF_IN, NORMAL, NORMAL, OUTPUT, DISABLE), +}; + +static __initdata struct tegra_pingroup_config unused_pins_lowpower[] = { + UNUSED_PINMUX(CLK1_REQ), + UNUSED_PINMUX(ULPI_DATA0), + UNUSED_PINMUX(ULPI_DATA1), + UNUSED_PINMUX(ULPI_DATA5), + UNUSED_PINMUX(ULPI_DATA6), + UNUSED_PINMUX(ULPI_DATA7), + UNUSED_PINMUX(GMI_AD15), + UNUSED_PINMUX(GMI_AD4), + UNUSED_PINMUX(GMI_CS6_N), + UNUSED_PINMUX(OWR), + UNUSED_PINMUX(SPDIF_OUT), + UNUSED_PINMUX(USB_VBUS_EN1), +}; + +static struct gpio_init_pin_info init_gpio_mode_tegratab_common[] = { + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PX4, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PX5, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PX6, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PX7, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PW2, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PW3, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PX1, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PX3, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PP1, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PP2, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PP0, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PP3, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PV0, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PV1, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PO3, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PO4, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PO5, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PBB3, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PBB4, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PBB5, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PBB6, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PBB7, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PCC1, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PCC2, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PG0, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PG1, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PH2, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PH3, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PH4, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PH5, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PH6, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PG2, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PG3, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PH0, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PK0, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PK1, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PJ0, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PK3, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PK4, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PK2, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PI6, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PJ3, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PI5, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PI4, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PI7, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PC7, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PCC5, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PV3, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PQ0, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PQ1, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PQ2, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PQ3, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PQ5, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PQ6, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PQ7, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PR0, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PR1, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PR2, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PR3, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PR4, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PR5, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PR7, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PEE1, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PU0, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PU1, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PU2, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PU3, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PU4, false, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PU5, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PU6, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PN7, true, 0), + GPIO_INIT_PIN_MODE(TEGRA_GPIO_PK6, false, 0), +}; diff --git a/arch/arm/mach-tegra/board-tegratab-pinmux.c b/arch/arm/mach-tegra/board-tegratab-pinmux.c new file mode 100644 index 000000000000..5dce5f05ca94 --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab-pinmux.c @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/gpio.h> +#include <mach/pinmux.h> +#include <mach/gpio-tegra.h> +#include "board.h" +#include "board-tegratab.h" +#include "devices.h" +#include "gpio-names.h" + +#include <mach/pinmux-t11.h> + +#define DEFAULT_DRIVE(_name) \ + { \ + .pingroup = TEGRA_DRIVE_PINGROUP_##_name, \ + .hsm = TEGRA_HSM_DISABLE, \ + .schmitt = TEGRA_SCHMITT_ENABLE, \ + .drive = TEGRA_DRIVE_DIV_1, \ + .pull_down = TEGRA_PULL_31, \ + .pull_up = TEGRA_PULL_31, \ + .slew_rising = TEGRA_SLEW_SLOWEST, \ + .slew_falling = TEGRA_SLEW_SLOWEST, \ + } +/* Setting the drive strength of pins + * hsm: Enable High speed mode (ENABLE/DISABLE) + * Schimit: Enable/disable schimit (ENABLE/DISABLE) + * drive: low power mode (DIV_1, DIV_2, DIV_4, DIV_8) + * pulldn_drive - drive down (falling edge) - Driver Output Pull-Down drive + * strength code. Value from 0 to 31. + * pullup_drive - drive up (rising edge) - Driver Output Pull-Up drive + * strength code. Value from 0 to 31. + * pulldn_slew - Driver Output Pull-Up slew control code - 2bit code + * code 11 is least slewing of signal. code 00 is highest + * slewing of the signal. + * Value - FASTEST, FAST, SLOW, SLOWEST + * pullup_slew - Driver Output Pull-Down slew control code - + * code 11 is least slewing of signal. code 00 is highest + * slewing of the signal. + * Value - FASTEST, FAST, SLOW, SLOWEST + */ +#define SET_DRIVE(_name, _hsm, _schmitt, _drive, _pulldn_drive, \ + _pullup_drive, _pulldn_slew, _pullup_slew) \ + { \ + .pingroup = TEGRA_DRIVE_PINGROUP_##_name, \ + .hsm = TEGRA_HSM_##_hsm, \ + .schmitt = TEGRA_SCHMITT_##_schmitt, \ + .drive = TEGRA_DRIVE_##_drive, \ + .pull_down = TEGRA_PULL_##_pulldn_drive, \ + .pull_up = TEGRA_PULL_##_pullup_drive, \ + .slew_rising = TEGRA_SLEW_##_pulldn_slew, \ + .slew_falling = TEGRA_SLEW_##_pullup_slew, \ + } + +/* Setting the drive strength of pins + * hsm: Enable High speed mode (ENABLE/DISABLE) + * Schimit: Enable/disable schimit (ENABLE/DISABLE) + * drive: low power mode (DIV_1, DIV_2, DIV_4, DIV_8) + * pulldn_drive - drive down (falling edge) - Driver Output Pull-Down drive + * strength code. Value from 0 to 31. + * pullup_drive - drive up (rising edge) - Driver Output Pull-Up drive + * strength code. Value from 0 to 31. + * pulldn_slew - Driver Output Pull-Up slew control code - 2bit code + * code 11 is least slewing of signal. code 00 is highest + * slewing of the signal. + * Value - FASTEST, FAST, SLOW, SLOWEST + * pullup_slew - Driver Output Pull-Down slew control code - + * code 11 is least slewing of signal. code 00 is highest + * slewing of the signal. + * Value - FASTEST, FAST, SLOW, SLOWEST + * drive_type - Drive type to be used depending on the resistors. + */ + +#define SET_DRIVE_WITH_TYPE(_name, _hsm, _schmitt, _drive, _pulldn_drive,\ + _pullup_drive, _pulldn_slew, _pullup_slew, _drive_type) \ + { \ + .pingroup = TEGRA_DRIVE_PINGROUP_##_name, \ + .hsm = TEGRA_HSM_##_hsm, \ + .schmitt = TEGRA_SCHMITT_##_schmitt, \ + .drive = TEGRA_DRIVE_##_drive, \ + .pull_down = TEGRA_PULL_##_pulldn_drive, \ + .pull_up = TEGRA_PULL_##_pullup_drive, \ + .slew_rising = TEGRA_SLEW_##_pulldn_slew, \ + .slew_falling = TEGRA_SLEW_##_pullup_slew, \ + .drive_type = TEGRA_DRIVE_TYPE_##_drive_type, \ + } + +#define DEFAULT_PINMUX(_pingroup, _mux, _pupd, _tri, _io) \ + { \ + .pingroup = TEGRA_PINGROUP_##_pingroup, \ + .func = TEGRA_MUX_##_mux, \ + .pupd = TEGRA_PUPD_##_pupd, \ + .tristate = TEGRA_TRI_##_tri, \ + .io = TEGRA_PIN_##_io, \ + .lock = TEGRA_PIN_LOCK_DEFAULT, \ + .od = TEGRA_PIN_OD_DEFAULT, \ + .ioreset = TEGRA_PIN_IO_RESET_DEFAULT, \ + } + +#define I2C_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _od) \ + { \ + .pingroup = TEGRA_PINGROUP_##_pingroup, \ + .func = TEGRA_MUX_##_mux, \ + .pupd = TEGRA_PUPD_##_pupd, \ + .tristate = TEGRA_TRI_##_tri, \ + .io = TEGRA_PIN_##_io, \ + .lock = TEGRA_PIN_LOCK_##_lock, \ + .od = TEGRA_PIN_OD_##_od, \ + .ioreset = TEGRA_PIN_IO_RESET_DEFAULT, \ + } + +#define DDC_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _rcv_sel) \ + { \ + .pingroup = TEGRA_PINGROUP_##_pingroup, \ + .func = TEGRA_MUX_##_mux, \ + .pupd = TEGRA_PUPD_##_pupd, \ + .tristate = TEGRA_TRI_##_tri, \ + .io = TEGRA_PIN_##_io, \ + .lock = TEGRA_PIN_LOCK_##_lock, \ + .rcv_sel = TEGRA_PIN_RCV_SEL_##_rcv_sel, \ + .ioreset = TEGRA_PIN_IO_RESET_DEFAULT, \ + } + +#define VI_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _ioreset) \ + { \ + .pingroup = TEGRA_PINGROUP_##_pingroup, \ + .func = TEGRA_MUX_##_mux, \ + .pupd = TEGRA_PUPD_##_pupd, \ + .tristate = TEGRA_TRI_##_tri, \ + .io = TEGRA_PIN_##_io, \ + .lock = TEGRA_PIN_LOCK_##_lock, \ + .od = TEGRA_PIN_OD_DEFAULT, \ + .ioreset = TEGRA_PIN_IO_RESET_##_ioreset \ + } + +#define CEC_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _od) \ + { \ + .pingroup = TEGRA_PINGROUP_##_pingroup, \ + .func = TEGRA_MUX_##_mux, \ + .pupd = TEGRA_PUPD_##_pupd, \ + .tristate = TEGRA_TRI_##_tri, \ + .io = TEGRA_PIN_##_io, \ + .lock = TEGRA_PIN_LOCK_##_lock, \ + .od = TEGRA_PIN_OD_##_od, \ + .ioreset = TEGRA_PIN_IO_RESET_DEFAULT, \ + } + +#define GPIO_PINMUX(_pingroup, _pupd, _tri, _io, _od) \ + { \ + .pingroup = TEGRA_PINGROUP_##_pingroup, \ + .func = TEGRA_MUX_SAFE, \ + .pupd = TEGRA_PUPD_##_pupd, \ + .tristate = TEGRA_TRI_##_tri, \ + .io = TEGRA_PIN_##_io, \ + .lock = TEGRA_PIN_LOCK_DEFAULT, \ + .od = TEGRA_PIN_OD_##_od, \ + .ioreset = TEGRA_PIN_IO_RESET_DEFAULT, \ + } + +#define UNUSED_PINMUX(_pingroup) \ + { \ + .pingroup = TEGRA_PINGROUP_##_pingroup, \ + .func = TEGRA_MUX_SAFE, \ + .pupd = TEGRA_PUPD_PULL_DOWN, \ + .tristate = TEGRA_TRI_TRISTATE, \ + .io = TEGRA_PIN_OUTPUT, \ + .lock = TEGRA_PIN_LOCK_DEFAULT, \ + .od = TEGRA_PIN_OD_DEFAULT, \ + .ioreset = TEGRA_PIN_IO_RESET_DEFAULT, \ + } + +#define USB_PINMUX CEC_PINMUX + +#define GPIO_INIT_PIN_MODE(_gpio, _is_input, _value) \ + { \ + .gpio_nr = _gpio, \ + .is_input = _is_input, \ + .value = _value, \ + } + +static __initdata struct tegra_drive_pingroup_config tegratab_drive_pinmux[] = { + /* DEFAULT_DRIVE(<pin_group>), */ + /* SDMMC1 */ + SET_DRIVE(SDIO1, ENABLE, DISABLE, DIV_1, 36, 20, SLOW, SLOW), + + /* SDMMC3 */ + SET_DRIVE(SDIO3, ENABLE, DISABLE, DIV_1, 22, 36, FASTEST, FASTEST), + + /* SDMMC4 */ + SET_DRIVE_WITH_TYPE(GMA, ENABLE, DISABLE, DIV_1, 2, 1, FASTEST, + FASTEST, 1), +}; + +#include "board-tegratab-pinmux-t11x.h" + +/* THIS IS FOR TESTING OR WORKAROUND PURPOSES. ANYTHING INSIDE THIS TABLE + * SHOULD BE PUSHED TO PINMUX SPREADSHEET FOR AUTOGEN OR FIXED + * */ +static __initdata struct tegra_pingroup_config manual_config_pinmux[] = { + + /* ULPI SFIOs are not supposed to be supported. + * This setting is only for Tegratab. */ + DEFAULT_PINMUX(ULPI_DATA0, ULPI, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(ULPI_DATA1, ULPI, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(ULPI_DATA5, ULPI, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(ULPI_DATA6, ULPI, NORMAL, NORMAL, INPUT), + DEFAULT_PINMUX(ULPI_DATA7, ULPI, NORMAL, NORMAL, INPUT), +}; + +static void __init tegratab_gpio_init_configure(void) +{ + int len; + int i; + struct gpio_init_pin_info *pins_info; + + len = ARRAY_SIZE(init_gpio_mode_tegratab_common); + pins_info = init_gpio_mode_tegratab_common; + + for (i = 0; i < len; ++i) { + tegra_gpio_init_configure(pins_info->gpio_nr, + pins_info->is_input, pins_info->value); + pins_info++; + } +} + +int __init tegratab_pinmux_init(void) +{ + tegratab_gpio_init_configure(); + + tegra_pinmux_config_table(tegratab_pinmux_common, + ARRAY_SIZE(tegratab_pinmux_common)); + tegra_drive_pinmux_config_table(tegratab_drive_pinmux, + ARRAY_SIZE(tegratab_drive_pinmux)); + tegra_pinmux_config_table(unused_pins_lowpower, + ARRAY_SIZE(unused_pins_lowpower)); + tegra_pinmux_config_table(manual_config_pinmux, + ARRAY_SIZE(manual_config_pinmux)); + + return 0; +} diff --git a/arch/arm/mach-tegra/board-tegratab-power.c b/arch/arm/mach-tegra/board-tegratab-power.c new file mode 100644 index 000000000000..db37ce08d0f5 --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab-power.c @@ -0,0 +1,788 @@ +/* + * arch/arm/mach-tegra/board-tegratab-power.c + * + * Copyright (C) 2012-2013 NVIDIA Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <linux/i2c.h> +#include <linux/pda_power.h> +#include <linux/platform_device.h> +#include <linux/resource.h> +#include <linux/io.h> +#include <linux/regulator/machine.h> +#include <linux/regulator/driver.h> +#include <linux/regulator/fixed.h> +#include <linux/mfd/palmas.h> +#include <linux/mfd/bq2419x.h> +#include <linux/max17048_battery.h> +#include <linux/gpio.h> +#include <linux/interrupt.h> +#include <linux/regulator/userspace-consumer.h> + +#include <asm/mach-types.h> +#include <linux/power/sbs-battery.h> + +#include <mach/iomap.h> +#include <mach/irqs.h> +#include <mach/hardware.h> +#include <mach/edp.h> +#include <mach/gpio-tegra.h> + +#include "cpu-tegra.h" +#include "pm.h" +#include "tegra-board-id.h" +#include "board-pmu-defines.h" +#include "board.h" +#include "gpio-names.h" +#include "board-common.h" +#include "board-tegratab.h" +#include "tegra_cl_dvfs.h" +#include "devices.h" +#include "tegra11_soctherm.h" +#include "tegra3_tsensor.h" + +#define PMC_CTRL 0x0 +#define PMC_CTRL_INTR_LOW (1 << 17) + +/* BQ2419X VBUS regulator */ +static struct regulator_consumer_supply tegratab_bq2419x_vbus_supply[] = { + REGULATOR_SUPPLY("usb_vbus", "tegra-ehci.0"), +}; + +static struct regulator_consumer_supply tegratab_bq2419x_batt_supply[] = { + REGULATOR_SUPPLY("usb_bat_chg", "tegra-udc.0"), +}; + +static struct regulator_init_data tegratab_bq2419x_init_data = { + .constraints = { + .name = "bq2419x_vbus", + .min_uV = 0, + .max_uV = 5000000, + .valid_modes_mask = (REGULATOR_MODE_NORMAL | + REGULATOR_MODE_STANDBY), + .valid_ops_mask = (REGULATOR_CHANGE_MODE | + REGULATOR_CHANGE_STATUS | + REGULATOR_CHANGE_VOLTAGE), + }, + .num_consumer_supplies = ARRAY_SIZE(tegratab_bq2419x_vbus_supply), + .consumer_supplies = tegratab_bq2419x_vbus_supply, +}; + +static struct bq2419x_regulator_platform_data tegratab_bq2419x_reg_pdata = { + .reg_init_data = &tegratab_bq2419x_init_data, + .gpio_otg_iusb = TEGRA_GPIO_PI4, + .power_off_on_suspend = true, +}; + +struct bq2419x_charger_platform_data tegratab_bq2419x_charger_pdata = { + .use_usb = 1, + .use_mains = 1, + .gpio_interrupt = TEGRA_GPIO_PJ0, + .gpio_status = TEGRA_GPIO_PK0, + .update_status = max17048_battery_status, + .battery_check = max17048_check_battery, + .max_charge_current_mA = 3000, + .charging_term_current_mA = 100, + .consumer_supplies = tegratab_bq2419x_batt_supply, + .num_consumer_supplies = ARRAY_SIZE(tegratab_bq2419x_batt_supply), +}; + +struct max17048_battery_model tegratab_max17048_mdata = { + .rcomp = 152, + .soccheck_A = 206, + .soccheck_B = 208, + .bits = 19, + .alert_threshold = 0x00, + .one_percent_alerts = 0x40, + .alert_on_reset = 0x40, + .rcomp_seg = 0x0080, + .hibernate = 0x3080, + .vreset = 0x3c96, + .valert = 0xD4AA, + .ocvtest = 55744, + .data_tbl = { + 0xA2, 0x80, 0xA8, 0xF0, 0xAE, 0xD0, 0xB0, 0x90, + 0xB2, 0x60, 0xB3, 0xF0, 0xB5, 0x80, 0xB7, 0x20, + 0xB8, 0xD0, 0xBC, 0x00, 0xBE, 0x20, 0xC0, 0x20, + 0xC3, 0xD0, 0xC9, 0x80, 0xCE, 0xA0, 0xCF, 0xC0, + 0x0A, 0x60, 0x0D, 0xE0, 0x1D, 0x00, 0x1D, 0xE0, + 0x1F, 0xE0, 0x1F, 0xE0, 0x11, 0xC0, 0x11, 0x20, + 0x14, 0x60, 0x0B, 0xE0, 0x14, 0x80, 0x14, 0xC0, + 0x0E, 0x20, 0x12, 0xA0, 0x03, 0x60, 0x03, 0x60, + }, +}; + +struct max17048_platform_data tegratab_max17048_pdata = { + .use_ac = 0, + .use_usb = 0, + .model_data = &tegratab_max17048_mdata, +}; + +static struct i2c_board_info __initdata tegratab_max17048_boardinfo[] = { + { + I2C_BOARD_INFO("max17048", 0x36), + .platform_data = &tegratab_max17048_pdata, + }, +}; + +struct bq2419x_platform_data tegratab_bq2419x_pdata = { + .reg_pdata = &tegratab_bq2419x_reg_pdata, + .bcharger_pdata = &tegratab_bq2419x_charger_pdata, + .disable_watchdog = true, +}; + +static struct i2c_board_info __initdata tegratab_bq2419x_boardinfo[] = { + { + I2C_BOARD_INFO("bq2419x", 0x6b), + .platform_data = &tegratab_bq2419x_pdata, + }, +}; + +/************************ Tegratab based regulator ****************/ +static struct regulator_consumer_supply palmas_smps123_supply[] = { + REGULATOR_SUPPLY("vdd_cpu", NULL), +}; + +static struct regulator_consumer_supply palmas_smps45_supply[] = { + REGULATOR_SUPPLY("vdd_core", NULL), + REGULATOR_SUPPLY("vdd_core", "sdhci-tegra.0"), + REGULATOR_SUPPLY("vdd_core", "sdhci-tegra.3"), +}; + +static struct regulator_consumer_supply palmas_smps6_supply[] = { + REGULATOR_SUPPLY("vdd_lcd_hv", NULL), + REGULATOR_SUPPLY("avdd_lcd", NULL), + REGULATOR_SUPPLY("avdd", "spi0.0"), +}; + +static struct regulator_consumer_supply palmas_smps7_supply[] = { + REGULATOR_SUPPLY("vddio_ddr", NULL), +}; + +static struct regulator_consumer_supply palmas_smps8_supply[] = { + REGULATOR_SUPPLY("avdd_usb_pll", "tegra-udc.0"), + REGULATOR_SUPPLY("avdd_usb_pll", "tegra-ehci.0"), + REGULATOR_SUPPLY("avdd_usb_pll", "tegra-ehci.1"), + REGULATOR_SUPPLY("avdd_osc", NULL), + REGULATOR_SUPPLY("vddio_sys", NULL), + REGULATOR_SUPPLY("vddio_bb", NULL), + REGULATOR_SUPPLY("vddio_sdmmc", "sdhci-tegra.0"), + REGULATOR_SUPPLY("pwrdet_sdmmc1", NULL), + REGULATOR_SUPPLY("vddio_sdmmc", "sdhci-tegra.3"), + REGULATOR_SUPPLY("vdd_emmc", "sdhci-tegra.3"), + REGULATOR_SUPPLY("pwrdet_sdmmc4", NULL), + REGULATOR_SUPPLY("vddio_audio", NULL), + REGULATOR_SUPPLY("pwrdet_audio", NULL), + REGULATOR_SUPPLY("vddio_uart", NULL), + REGULATOR_SUPPLY("pwrdet_uart", NULL), + REGULATOR_SUPPLY("vddio_gmi", NULL), + REGULATOR_SUPPLY("vlogic", "0-0069"), + REGULATOR_SUPPLY("vid", "0-000d"), + REGULATOR_SUPPLY("vddio", "0-0078"), +}; + +static struct regulator_consumer_supply palmas_smps9_supply[] = { + REGULATOR_SUPPLY("vddio_sd_slot", "sdhci-tegra.3"), +}; + +static struct regulator_consumer_supply palmas_smps10_supply[] = { +}; + +static struct regulator_consumer_supply palmas_ldo1_supply[] = { + REGULATOR_SUPPLY("avdd_hdmi_pll", "tegradc.1"), + REGULATOR_SUPPLY("avdd_csi_dsi_pll", "tegradc.0"), + REGULATOR_SUPPLY("avdd_csi_dsi_pll", "tegradc.1"), + REGULATOR_SUPPLY("avdd_csi_dsi_pll", "vi"), + REGULATOR_SUPPLY("avdd_pllm", NULL), + REGULATOR_SUPPLY("avdd_pllu", NULL), + REGULATOR_SUPPLY("avdd_plla_p_c", NULL), + REGULATOR_SUPPLY("avdd_pllx", NULL), + REGULATOR_SUPPLY("vdd_ddr_hs", NULL), + REGULATOR_SUPPLY("avdd_plle", NULL), +}; + +static struct regulator_consumer_supply palmas_ldo2_supply[] = { + REGULATOR_SUPPLY("avdd_dsi_csi", "tegradc.0"), + REGULATOR_SUPPLY("avdd_dsi_csi", "tegradc.1"), + REGULATOR_SUPPLY("avdd_dsi_csi", "vi"), + REGULATOR_SUPPLY("vddio_hsic", "tegra-ehci.1"), + REGULATOR_SUPPLY("vddio_hsic", "tegra-ehci.2"), +}; + +static struct regulator_consumer_supply palmas_ldo3_supply[] = { + REGULATOR_SUPPLY("vpp_fuse", NULL), +}; + +static struct regulator_consumer_supply palmas_ldo4_supply[] = { + REGULATOR_SUPPLY("dvdd", "2-0010"), +}; + +static struct regulator_consumer_supply palmas_ldo5_supply[] = { + REGULATOR_SUPPLY("vdd_af_cam1", NULL), + REGULATOR_SUPPLY("vdd", "2-000C"), +}; + +static struct regulator_consumer_supply palmas_ldo6_supply[] = { +}; + +static struct regulator_consumer_supply palmas_ldo7_supply[] = { + REGULATOR_SUPPLY("avdd", "2-0010"), +}; +static struct regulator_consumer_supply palmas_ldo8_supply[] = { + REGULATOR_SUPPLY("vdd_rtc", NULL), +}; +static struct regulator_consumer_supply palmas_ldo9_supply[] = { + REGULATOR_SUPPLY("vddio_sdmmc", "sdhci-tegra.2"), + REGULATOR_SUPPLY("pwrdet_sdmmc3", NULL), +}; +static struct regulator_consumer_supply palmas_ldoln_supply[] = { + REGULATOR_SUPPLY("avdd_hdmi", "tegradc.1"), +}; + +static struct regulator_consumer_supply palmas_ldousb_supply[] = { + REGULATOR_SUPPLY("avdd_usb", "tegra-udc.0"), + REGULATOR_SUPPLY("avdd_usb", "tegra-ehci.0"), + REGULATOR_SUPPLY("avdd_usb", "tegra-ehci.1"), + REGULATOR_SUPPLY("avdd_usb", "tegra-ehci.2"), + REGULATOR_SUPPLY("hvdd_usb", "tegra-ehci.2"), + +}; + +static struct regulator_consumer_supply palmas_regen1_supply[] = { +}; + +static struct regulator_consumer_supply palmas_regen2_supply[] = { +}; + +PALMAS_PDATA_INIT(smps123, 900, 1300, NULL, 0, 0, 0, 0); +PALMAS_PDATA_INIT(smps45, 900, 1400, NULL, 0, 0, 0, 0); +PALMAS_PDATA_INIT(smps6, 3200, 3200, NULL, 0, 0, 1, NORMAL); +PALMAS_PDATA_INIT(smps7, 1350, 1350, NULL, 0, 0, 1, NORMAL); +PALMAS_PDATA_INIT(smps8, 1800, 1800, NULL, 1, 1, 1, NORMAL); +PALMAS_PDATA_INIT(smps9, 2900, 2900, NULL, 1, 0, 1, NORMAL); +PALMAS_PDATA_INIT(smps10, 5000, 5000, NULL, 0, 0, 0, 0); +PALMAS_PDATA_INIT(ldo1, 1050, 1050, palmas_rails(smps7), 1, 0, 1, 0); +PALMAS_PDATA_INIT(ldo2, 1200, 1200, palmas_rails(smps7), 0, 1, 1, 0); +PALMAS_PDATA_INIT(ldo3, 1800, 1800, NULL, 0, 0, 0, 0); +PALMAS_PDATA_INIT(ldo4, 1200, 1200, palmas_rails(smps8), 0, 0, 0, 0); +PALMAS_PDATA_INIT(ldo5, 2700, 2700, palmas_rails(smps9), 0, 0, 1, 0); +PALMAS_PDATA_INIT(ldo6, 2850, 2850, palmas_rails(smps9), 1, 1, 1, 0); +PALMAS_PDATA_INIT(ldo7, 2700, 2700, palmas_rails(smps9), 0, 0, 1, 0); +PALMAS_PDATA_INIT(ldo8, 950, 950, NULL, 1, 1, 1, 0); +PALMAS_PDATA_INIT(ldo9, 1800, 2900, palmas_rails(smps9), 0, 0, 1, 0); +PALMAS_PDATA_INIT(ldoln, 3300, 3300, NULL, 0, 0, 1, 0); +PALMAS_PDATA_INIT(ldousb, 3300, 3300, NULL, 0, 0, 1, 0); +PALMAS_PDATA_INIT(regen1, 4200, 4200, NULL, 0, 0, 0, 0); +PALMAS_PDATA_INIT(regen2, 4200, 4200, palmas_rails(smps8), 0, 0, 0, 0); + +#define PALMAS_REG_PDATA(_sname) (®_idata_##_sname) +static struct regulator_init_data *tegratab_reg_data[PALMAS_NUM_REGS] = { + NULL, + PALMAS_REG_PDATA(smps123), + NULL, + PALMAS_REG_PDATA(smps45), + NULL, + PALMAS_REG_PDATA(smps6), + PALMAS_REG_PDATA(smps7), + PALMAS_REG_PDATA(smps8), + PALMAS_REG_PDATA(smps9), + PALMAS_REG_PDATA(smps10), + PALMAS_REG_PDATA(ldo1), + PALMAS_REG_PDATA(ldo2), + PALMAS_REG_PDATA(ldo3), + PALMAS_REG_PDATA(ldo4), + PALMAS_REG_PDATA(ldo5), + PALMAS_REG_PDATA(ldo6), + PALMAS_REG_PDATA(ldo7), + PALMAS_REG_PDATA(ldo8), + PALMAS_REG_PDATA(ldo9), + PALMAS_REG_PDATA(ldoln), + PALMAS_REG_PDATA(ldousb), + PALMAS_REG_PDATA(regen1), + PALMAS_REG_PDATA(regen2), + NULL, + NULL, + NULL, +}; + +#define PALMAS_REG_INIT(_name, _warm_reset, _roof_floor, _mode_sleep, \ + _tstep, _vsel) \ + static struct palmas_reg_init reg_init_data_##_name = { \ + .warm_reset = _warm_reset, \ + .roof_floor = _roof_floor, \ + .mode_sleep = _mode_sleep, \ + .tstep = _tstep, \ + .vsel = _vsel, \ + } + +PALMAS_REG_INIT(smps12, 0, 0, 0, 0, 0); +PALMAS_REG_INIT(smps123, 0, PALMAS_EXT_CONTROL_ENABLE1, 0, 0, 0); +PALMAS_REG_INIT(smps3, 0, 0, 0, 0, 0); +PALMAS_REG_INIT(smps45, 0, PALMAS_EXT_CONTROL_NSLEEP, 0, 0, 0); +PALMAS_REG_INIT(smps457, 0, 0, 0, 0, 0); +PALMAS_REG_INIT(smps6, 0, 0, 0, 0, 0); +PALMAS_REG_INIT(smps7, 0, 0, 0, 0, 0); +PALMAS_REG_INIT(smps8, 0, 0, 0, 0, 0); +PALMAS_REG_INIT(smps9, 0, 0, 0, 0, 0); +PALMAS_REG_INIT(smps10, 0, 0, 0, 0, 0); +PALMAS_REG_INIT(ldo1, 0, PALMAS_EXT_CONTROL_NSLEEP, 0, 0, 0); +PALMAS_REG_INIT(ldo2, 0, PALMAS_EXT_CONTROL_NSLEEP, 0, 0, 0); +PALMAS_REG_INIT(ldo3, 0, PALMAS_EXT_CONTROL_NSLEEP, 0, 0, 0); +PALMAS_REG_INIT(ldo4, 0, PALMAS_EXT_CONTROL_NSLEEP, 0, 0, 0); +PALMAS_REG_INIT(ldo5, 0, PALMAS_EXT_CONTROL_NSLEEP, 0, 0, 0); +PALMAS_REG_INIT(ldo6, 0, 0, 0, 0, 0); +PALMAS_REG_INIT(ldo7, 0, PALMAS_EXT_CONTROL_NSLEEP, 0, 0, 0); +PALMAS_REG_INIT(ldo8, 0, 0, 0, 0, 0); +PALMAS_REG_INIT(ldo9, 0, PALMAS_EXT_CONTROL_NSLEEP, 0, 0, 0); +PALMAS_REG_INIT(ldoln, 0, PALMAS_EXT_CONTROL_NSLEEP, 0, 0, 0); +PALMAS_REG_INIT(ldousb, 0, PALMAS_EXT_CONTROL_NSLEEP, 0, 0, 0); + +#define PALMAS_REG_INIT_DATA(_sname) (®_init_data_##_sname) +static struct palmas_reg_init *tegratab_reg_init[PALMAS_NUM_REGS] = { + PALMAS_REG_INIT_DATA(smps12), + PALMAS_REG_INIT_DATA(smps123), + PALMAS_REG_INIT_DATA(smps3), + PALMAS_REG_INIT_DATA(smps45), + PALMAS_REG_INIT_DATA(smps457), + PALMAS_REG_INIT_DATA(smps6), + PALMAS_REG_INIT_DATA(smps7), + PALMAS_REG_INIT_DATA(smps8), + PALMAS_REG_INIT_DATA(smps9), + PALMAS_REG_INIT_DATA(smps10), + PALMAS_REG_INIT_DATA(ldo1), + PALMAS_REG_INIT_DATA(ldo2), + PALMAS_REG_INIT_DATA(ldo3), + PALMAS_REG_INIT_DATA(ldo4), + PALMAS_REG_INIT_DATA(ldo5), + PALMAS_REG_INIT_DATA(ldo6), + PALMAS_REG_INIT_DATA(ldo7), + PALMAS_REG_INIT_DATA(ldo8), + PALMAS_REG_INIT_DATA(ldo9), + PALMAS_REG_INIT_DATA(ldoln), + PALMAS_REG_INIT_DATA(ldousb), +}; + +static struct palmas_pmic_platform_data pmic_platform = { + .enable_ldo8_tracking = true, + .disabe_ldo8_tracking_suspend = true, + .disable_smps10_boost_suspend = true, +}; + +static struct palmas_pinctrl_config palmas_pincfg[] = { + PALMAS_PINMUX(POWERGOOD, POWERGOOD, DEFAULT, DEFAULT), + PALMAS_PINMUX(VAC, VAC, DEFAULT, DEFAULT), + PALMAS_PINMUX(GPIO0, GPIO, DEFAULT, DEFAULT), + PALMAS_PINMUX(GPIO1, GPIO, DEFAULT, DEFAULT), + PALMAS_PINMUX(GPIO2, GPIO, DEFAULT, DEFAULT), + PALMAS_PINMUX(GPIO3, GPIO, DEFAULT, DEFAULT), + PALMAS_PINMUX(GPIO4, GPIO, DEFAULT, DEFAULT), + PALMAS_PINMUX(GPIO5, GPIO, DEFAULT, DEFAULT), + PALMAS_PINMUX(GPIO6, GPIO, DEFAULT, DEFAULT), + PALMAS_PINMUX(GPIO7, GPIO, DEFAULT, DEFAULT), +}; + +static struct palmas_pinctrl_platform_data palmas_pinctrl_pdata = { + .pincfg = palmas_pincfg, + .num_pinctrl = ARRAY_SIZE(palmas_pincfg), + .dvfs1_enable = true, + .dvfs2_enable = false, +}; + +struct palmas_extcon_platform_data palmas_extcon_pdata = { + .connection_name = "palmas-extcon", + .enable_vbus_detection = true, + .enable_id_pin_detection = false, +}; + +static struct palmas_platform_data palmas_pdata = { + .gpio_base = PALMAS_TEGRA_GPIO_BASE, + .irq_base = PALMAS_TEGRA_IRQ_BASE, + .pmic_pdata = &pmic_platform, + .use_power_off = true, + .pinctrl_pdata = &palmas_pinctrl_pdata, + .extcon_pdata = &palmas_extcon_pdata, +}; + +static struct i2c_board_info palma_device[] = { + { + I2C_BOARD_INFO("tps65913", 0x58), + .irq = INT_EXTERNAL_PMU, + .platform_data = &palmas_pdata, + }, +}; + +static struct regulator_consumer_supply fixed_reg_dvdd_lcd_1v8_supply[] = { + REGULATOR_SUPPLY("dvdd_lcd", NULL), +}; + +static struct regulator_consumer_supply fixed_reg_vdd_lcd_bl_en_supply[] = { + REGULATOR_SUPPLY("vdd_lcd_bl_en", NULL), +}; + +/* EN_1V8_TS From TEGRA_GPIO_PH4 */ +static struct regulator_consumer_supply fixed_reg_dvdd_ts_supply[] = { + REGULATOR_SUPPLY("dvdd", "spi0.0"), +}; + +/* ENABLE 5v0 for HDMI */ +static struct regulator_consumer_supply fixed_reg_vdd_hdmi_5v0_supply[] = { + REGULATOR_SUPPLY("vdd_hdmi_5v0", "tegradc.1"), +}; + +static struct regulator_consumer_supply fixed_reg_vddio_sd_slot_supply[] = { + REGULATOR_SUPPLY("vddio_sd_slot", "sdhci-tegra.2"), +}; + +static struct regulator_consumer_supply fixed_reg_vd_cam_1v8_supply[] = { + REGULATOR_SUPPLY("dovdd", "2-0010"), +}; + +/* Macro for defining fixed regulator sub device data */ +#define FIXED_SUPPLY(_name) "fixed_reg_"#_name +#define FIXED_REG(_id, _var, _name, _in_supply, _always_on, _boot_on, \ + _gpio_nr, _open_drain, _active_high, _boot_state, _millivolts) \ + static struct regulator_init_data ri_data_##_var = \ + { \ + .supply_regulator = _in_supply, \ + .num_consumer_supplies = \ + ARRAY_SIZE(fixed_reg_##_name##_supply), \ + .consumer_supplies = fixed_reg_##_name##_supply, \ + .constraints = { \ + .valid_modes_mask = (REGULATOR_MODE_NORMAL | \ + REGULATOR_MODE_STANDBY), \ + .valid_ops_mask = (REGULATOR_CHANGE_MODE | \ + REGULATOR_CHANGE_STATUS | \ + REGULATOR_CHANGE_VOLTAGE), \ + .always_on = _always_on, \ + .boot_on = _boot_on, \ + }, \ + }; \ + static struct fixed_voltage_config fixed_reg_##_var##_pdata = \ + { \ + .supply_name = FIXED_SUPPLY(_name), \ + .microvolts = _millivolts * 1000, \ + .gpio = _gpio_nr, \ + .gpio_is_open_drain = _open_drain, \ + .enable_high = _active_high, \ + .enabled_at_boot = _boot_state, \ + .init_data = &ri_data_##_var, \ + }; \ + static struct platform_device fixed_reg_##_var##_dev = { \ + .name = "reg-fixed-voltage", \ + .id = _id, \ + .dev = { \ + .platform_data = &fixed_reg_##_var##_pdata, \ + }, \ + } + +/* + * Creating the fixed regulator device table + */ + +FIXED_REG(1, dvdd_lcd_1v8, dvdd_lcd_1v8, + palmas_rails(smps8), 0, 1, + PALMAS_TEGRA_GPIO_BASE + PALMAS_GPIO4, false, true, 1, 1800); + +FIXED_REG(2, vdd_lcd_bl_en, vdd_lcd_bl_en, + NULL, 0, 1, + TEGRA_GPIO_PH2, false, true, 1, 3700); + +FIXED_REG(3, dvdd_ts, dvdd_ts, + palmas_rails(smps8), 0, 0, + TEGRA_GPIO_PH4, false, false, 1, 1800); + +FIXED_REG(4, vdd_hdmi_5v0, vdd_hdmi_5v0, + palmas_rails(smps10), 0, 0, + TEGRA_GPIO_PK6, false, true, 0, 5000); + +FIXED_REG(5, vddio_sd_slot, vddio_sd_slot, + palmas_rails(smps9), 0, 0, + TEGRA_GPIO_PK1, false, true, 0, 2900); + +FIXED_REG(6, vd_cam_1v8, vd_cam_1v8, + palmas_rails(smps8), 0, 0, + PALMAS_TEGRA_GPIO_BASE + PALMAS_GPIO6, false, true, 0, 1800); + +#define ADD_FIXED_REG(_name) (&fixed_reg_##_name##_dev) + +/* Gpio switch regulator platform data for Tegratab E1569 */ +static struct platform_device *fixed_reg_devs[] = { + ADD_FIXED_REG(dvdd_lcd_1v8), + ADD_FIXED_REG(vdd_lcd_bl_en), + ADD_FIXED_REG(dvdd_ts), + ADD_FIXED_REG(vdd_hdmi_5v0), + ADD_FIXED_REG(vddio_sd_slot), + ADD_FIXED_REG(vd_cam_1v8), +}; + + +int __init tegratab_palmas_regulator_init(void) +{ + void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE); + u32 pmc_ctrl; + int i; + + /* TPS65913: Normal state of INT request line is LOW. + * configure the power management controller to trigger PMU + * interrupts when HIGH. + */ + pmc_ctrl = readl(pmc + PMC_CTRL); + writel(pmc_ctrl | PMC_CTRL_INTR_LOW, pmc + PMC_CTRL); + for (i = 0; i < PALMAS_NUM_REGS ; i++) { + pmic_platform.reg_data[i] = tegratab_reg_data[i]; + pmic_platform.reg_init[i] = tegratab_reg_init[i]; + } + + i2c_register_board_info(4, palma_device, + ARRAY_SIZE(palma_device)); + return 0; +} + +static int ac_online(void) +{ + return 1; +} + +static struct resource tegratab_pda_resources[] = { + [0] = { + .name = "ac", + }, +}; + +static struct pda_power_pdata tegratab_pda_data = { + .is_ac_online = ac_online, +}; + +static struct platform_device tegratab_pda_power_device = { + .name = "pda-power", + .id = -1, + .resource = tegratab_pda_resources, + .num_resources = ARRAY_SIZE(tegratab_pda_resources), + .dev = { + .platform_data = &tegratab_pda_data, + }, +}; + +static struct tegra_suspend_platform_data tegratab_suspend_data = { + .cpu_timer = 300, + .cpu_off_timer = 300, + .suspend_mode = TEGRA_SUSPEND_LP0, + .core_timer = 0x157e, + .core_off_timer = 2000, + .corereq_high = true, + .sysclkreq_high = true, + .cpu_lp2_min_residency = 1000, + .min_residency_crail = 20000, +#ifdef CONFIG_TEGRA_LP1_LOW_COREVOLTAGE + .lp1_lowvolt_support = false, + .i2c_base_addr = 0, + .pmuslave_addr = 0, + .core_reg_addr = 0, + .lp1_core_volt_low = 0, + .lp1_core_volt_high = 0, +#endif +}; +#ifdef CONFIG_ARCH_TEGRA_HAS_CL_DVFS +/* board parameters for cpu dfll */ +static struct tegra_cl_dvfs_cfg_param tegratab_cl_dvfs_param = { + .sample_rate = 12500, + + .force_mode = TEGRA_CL_DVFS_FORCE_FIXED, + .cf = 10, + .ci = 0, + .cg = 2, + + .droop_cut_value = 0xF, + .droop_restore_ramp = 0x0, + .scale_out_ramp = 0x0, +}; +#endif + +/* palmas: fixed 10mV steps from 600mV to 1400mV, with offset 0x10 */ +#define PMU_CPU_VDD_MAP_SIZE ((1400000 - 600000) / 10000 + 1) +static struct voltage_reg_map pmu_cpu_vdd_map[PMU_CPU_VDD_MAP_SIZE]; +static inline void fill_reg_map(void) +{ + int i; + for (i = 0; i < PMU_CPU_VDD_MAP_SIZE; i++) { + pmu_cpu_vdd_map[i].reg_value = i + 0x10; + pmu_cpu_vdd_map[i].reg_uV = 600000 + 10000 * i; + } +} + +#ifdef CONFIG_ARCH_TEGRA_HAS_CL_DVFS +static struct tegra_cl_dvfs_platform_data tegratab_cl_dvfs_data = { + .dfll_clk_name = "dfll_cpu", + .pmu_if = TEGRA_CL_DVFS_PMU_I2C, + .u.pmu_i2c = { + .fs_rate = 400000, + .slave_addr = 0xb0, + .reg = 0x23, + }, + .vdd_map = pmu_cpu_vdd_map, + .vdd_map_size = PMU_CPU_VDD_MAP_SIZE, + + .cfg_param = &tegratab_cl_dvfs_param, +}; + +static int __init tegratab_cl_dvfs_init(void) +{ + fill_reg_map(); + if (tegra_revision < TEGRA_REVISION_A02) + tegratab_cl_dvfs_data.out_quiet_then_disable = true; + tegra_cl_dvfs_device.dev.platform_data = &tegratab_cl_dvfs_data; + platform_device_register(&tegra_cl_dvfs_device); + + return 0; +} +#endif + +static int __init tegratab_fixed_regulator_init(void) +{ + if (!machine_is_tegratab()) + return 0; + + return platform_add_devices(fixed_reg_devs, + ARRAY_SIZE(fixed_reg_devs)); +} +subsys_initcall_sync(tegratab_fixed_regulator_init); + + +int __init tegratab_regulator_init(void) +{ + +#ifdef CONFIG_ARCH_TEGRA_HAS_CL_DVFS + tegratab_cl_dvfs_init(); +#endif + tegratab_palmas_regulator_init(); + + /* Disable charger when adapter is power source. */ + if (get_power_supply_type() != POWER_SUPPLY_TYPE_BATTERY) + tegratab_bq2419x_pdata.bcharger_pdata = NULL; + + i2c_register_board_info(0, tegratab_max17048_boardinfo, 1); + i2c_register_board_info(0, tegratab_bq2419x_boardinfo, 1); + + platform_device_register(&tegratab_pda_power_device); + + return 0; +} + +int __init tegratab_suspend_init(void) +{ + tegra_init_suspend(&tegratab_suspend_data); + return 0; +} + +int __init tegratab_edp_init(void) +{ + unsigned int regulator_mA; + + regulator_mA = get_maximum_cpu_current_supported(); + if (!regulator_mA) + regulator_mA = 15000; + + pr_info("%s: CPU regulator %d mA\n", __func__, regulator_mA); + tegra_init_cpu_edp_limits(regulator_mA); + + regulator_mA = get_maximum_core_current_supported(); + if (!regulator_mA) + regulator_mA = 4000; + + pr_info("%s: core regulator %d mA\n", __func__, regulator_mA); + tegra_init_core_edp_limits(regulator_mA); + + return 0; +} + +static struct thermal_zone_params tegratab_soctherm_therm_cpu_tzp = { + .governor_name = "pid_thermal_gov", +}; + +static struct tegra_tsensor_pmu_data tpdata_palmas = { + .reset_tegra = 1, + .pmu_16bit_ops = 0, + .controller_type = 0, + .pmu_i2c_addr = 0x58, + .i2c_controller_id = 4, + .poweroff_reg_addr = 0xa0, + .poweroff_reg_data = 0x0, +}; + +static struct soctherm_platform_data tegratab_soctherm_data = { + .therm = { + [THERM_CPU] = { + .zone_enable = true, + .passive_delay = 1000, + .hotspot_offset = 6000, + .num_trips = 3, + .trips = { + { + .cdev_type = "tegra-balanced", + .trip_temp = 90000, + .trip_type = THERMAL_TRIP_PASSIVE, + .upper = THERMAL_NO_LIMIT, + .lower = THERMAL_NO_LIMIT, + }, + { + .cdev_type = "tegra-heavy", + .trip_temp = 100000, + .trip_type = THERMAL_TRIP_HOT, + .upper = THERMAL_NO_LIMIT, + .lower = THERMAL_NO_LIMIT, + }, + { + .cdev_type = "tegra-shutdown", + .trip_temp = 102000, + .trip_type = THERMAL_TRIP_CRITICAL, + .upper = THERMAL_NO_LIMIT, + .lower = THERMAL_NO_LIMIT, + }, + }, + .tzp = &tegratab_soctherm_therm_cpu_tzp, + }, + [THERM_GPU] = { + .zone_enable = true, + .hotspot_offset = 6000, + }, + [THERM_PLL] = { + .zone_enable = true, + }, + }, + .throttle = { + [THROTTLE_HEAVY] = { + .devs = { + [THROTTLE_DEV_CPU] = { + .enable = 1, + }, + }, + }, + }, + .tshut_pmu_trip_data = &tpdata_palmas, +}; + +int __init tegratab_soctherm_init(void) +{ + tegra_platform_edp_init(tegratab_soctherm_data.therm[THERM_CPU].trips, + &tegratab_soctherm_data.therm[THERM_CPU].num_trips, + 8000); /* edp temperature margin */ + tegra_add_tj_trips(tegratab_soctherm_data.therm[THERM_CPU].trips, + &tegratab_soctherm_data.therm[THERM_CPU].num_trips); + tegra_add_vc_trips(tegratab_soctherm_data.therm[THERM_CPU].trips, + &tegratab_soctherm_data.therm[THERM_CPU].num_trips); + + return tegra11_soctherm_init(&tegratab_soctherm_data); +} diff --git a/arch/arm/mach-tegra/board-tegratab-powermon.c b/arch/arm/mach-tegra/board-tegratab-powermon.c new file mode 100644 index 000000000000..e85d5735b494 --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab-powermon.c @@ -0,0 +1,27 @@ +/* + * arch/arm/mach-tegra/board-tegratab-powermon.c + * + * Copyright (c) 2013, NVIDIA Corporation. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include "board.h" +#include "board-tegratab.h" + +int __init tegratab_pmon_init(void) +{ + return 0; +} diff --git a/arch/arm/mach-tegra/board-tegratab-sdhci.c b/arch/arm/mach-tegra/board-tegratab-sdhci.c new file mode 100644 index 000000000000..9e87e05861ef --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab-sdhci.c @@ -0,0 +1,270 @@ +/* + * arch/arm/mach-tegra/board-tegratab-sdhci.c + * + * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include <linux/resource.h> +#include <linux/platform_device.h> +#include <linux/delay.h> +#include <linux/gpio.h> +#include <linux/clk.h> +#include <linux/err.h> +#include <linux/regulator/consumer.h> +#include <linux/mmc/host.h> + +#include <asm/mach-types.h> +#include <mach/irqs.h> +#include <mach/iomap.h> +#include <mach/sdhci.h> +#include <mach/gpio-tegra.h> +#include <mach/io_dpd.h> +#include <linux/wl12xx.h> + +#include "gpio-names.h" +#include "board.h" +#include "board-tegratab.h" + +#define TEGRATAB_SD_CD TEGRA_GPIO_PV2 +#define TEGRATAB_WLAN_PWR TEGRA_GPIO_PCC5 +#define TEGRATAB_WLAN_RST TEGRA_GPIO_PX7 +#define TEGRATAB_WLAN_WOW TEGRA_GPIO_PU5 +static void (*wifi_status_cb)(int card_present, void *dev_id); +static void *wifi_status_cb_devid; +static int tegratab_wifi_status_register(void (*callback)(int , void *), + void *); + +static int tegratab_wifi_power(int on); +static int tegratab_wifi_set_carddetect(int val); + +static struct wl12xx_platform_data tegratab_wl12xx_wlan_data __initdata = { + .board_ref_clock = WL12XX_REFCLOCK_26, + .board_tcxo_clock = 1, + .set_power = tegratab_wifi_power, + .set_carddetect = tegratab_wifi_set_carddetect, +}; + +static struct resource sdhci_resource0[] = { + [0] = { + .start = INT_SDMMC1, + .end = INT_SDMMC1, + .flags = IORESOURCE_IRQ, + }, + [1] = { + .start = TEGRA_SDMMC1_BASE, + .end = TEGRA_SDMMC1_BASE + TEGRA_SDMMC1_SIZE-1, + .flags = IORESOURCE_MEM, + }, +}; + +static struct resource sdhci_resource2[] = { + [0] = { + .start = INT_SDMMC3, + .end = INT_SDMMC3, + .flags = IORESOURCE_IRQ, + }, + [1] = { + .start = TEGRA_SDMMC3_BASE, + .end = TEGRA_SDMMC3_BASE + TEGRA_SDMMC3_SIZE-1, + .flags = IORESOURCE_MEM, + }, +}; + +static struct resource sdhci_resource3[] = { + [0] = { + .start = INT_SDMMC4, + .end = INT_SDMMC4, + .flags = IORESOURCE_IRQ, + }, + [1] = { + .start = TEGRA_SDMMC4_BASE, + .end = TEGRA_SDMMC4_BASE + TEGRA_SDMMC4_SIZE-1, + .flags = IORESOURCE_MEM, + }, +}; + +#ifdef CONFIG_MMC_EMBEDDED_SDIO +static struct embedded_sdio_data embedded_sdio_data0 = { + .cccr = { + .sdio_vsn = 2, + .multi_block = 1, + .low_speed = 0, + .wide_bus = 0, + .high_power = 1, + .high_speed = 1, + }, + .cis = { + .vendor = 0x02d0, + .device = 0x4329, + }, +}; +#endif + +static struct tegra_sdhci_platform_data tegra_sdhci_platform_data0 = { + .mmc_data = { + .register_status_notify = tegratab_wifi_status_register, +#ifdef CONFIG_MMC_EMBEDDED_SDIO + .embedded_sdio = &embedded_sdio_data0, +#endif + .built_in = 0, + .ocr_mask = MMC_OCR_1V8_MASK, + }, +#ifndef CONFIG_MMC_EMBEDDED_SDIO + .pm_flags = MMC_PM_KEEP_POWER, +#endif + .cd_gpio = -1, + .wp_gpio = -1, + .power_gpio = -1, + .tap_delay = 0x2, + .trim_delay = 0x2, + .ddr_clk_limit = 41000000, + .uhs_mask = MMC_UHS_MASK_SDR104 | + MMC_UHS_MASK_DDR50, +}; + +static struct tegra_sdhci_platform_data tegra_sdhci_platform_data2 = { + .cd_gpio = TEGRATAB_SD_CD, + .wp_gpio = -1, + .power_gpio = -1, + .tap_delay = 0x3, + .trim_delay = 0x3, + .ddr_clk_limit = 41000000, + .max_clk_limit = 82000000, + .sd_detect_in_suspend = 1, + .uhs_mask = MMC_UHS_MASK_DDR50, +}; + +static struct tegra_sdhci_platform_data tegra_sdhci_platform_data3 = { + .cd_gpio = -1, + .wp_gpio = -1, + .power_gpio = -1, + .is_8bit = 1, + .tap_delay = 0x5, + .trim_delay = 0, + .ddr_clk_limit = 41000000, + .max_clk_limit = 156000000, + .mmc_data = { + .built_in = 1, + .ocr_mask = MMC_OCR_1V8_MASK, + }, +}; + +static struct platform_device tegra_sdhci_device0 = { + .name = "sdhci-tegra", + .id = 0, + .resource = sdhci_resource0, + .num_resources = ARRAY_SIZE(sdhci_resource0), + .dev = { + .platform_data = &tegra_sdhci_platform_data0, + }, +}; + +static struct platform_device tegra_sdhci_device2 = { + .name = "sdhci-tegra", + .id = 2, + .resource = sdhci_resource2, + .num_resources = ARRAY_SIZE(sdhci_resource2), + .dev = { + .platform_data = &tegra_sdhci_platform_data2, + }, +}; + +static struct platform_device tegra_sdhci_device3 = { + .name = "sdhci-tegra", + .id = 3, + .resource = sdhci_resource3, + .num_resources = ARRAY_SIZE(sdhci_resource3), + .dev = { + .platform_data = &tegra_sdhci_platform_data3, + }, +}; + +static int tegratab_wifi_status_register( + void (*callback)(int card_present, void *dev_id), + void *dev_id) +{ + if (wifi_status_cb) + return -EAGAIN; + wifi_status_cb = callback; + wifi_status_cb_devid = dev_id; + return 0; +} + +static int tegratab_wifi_set_carddetect(int val) +{ + pr_debug("%s: %d\n", __func__, val); + if (wifi_status_cb) + wifi_status_cb(val, wifi_status_cb_devid); + else + pr_warning("%s: Nobody to notify\n", __func__); + return 0; +} + +static int tegratab_wifi_power(int on) +{ + pr_debug("%s: %d\n", __func__, on); + + if (on) { + gpio_set_value(TEGRATAB_WLAN_RST, 1); + mdelay(100); + gpio_set_value(TEGRATAB_WLAN_RST, 0); + mdelay(100); + gpio_set_value(TEGRATAB_WLAN_RST, 1); + mdelay(100); + gpio_set_value(TEGRATAB_WLAN_PWR, 1); + mdelay(200); + } else { + gpio_set_value(TEGRATAB_WLAN_RST, 0); + mdelay(100); + gpio_set_value(TEGRATAB_WLAN_PWR, 0); + } + + return 0; +} + +static int __init tegratab_wifi_init(void) +{ + int rc; + + rc = gpio_request(TEGRATAB_WLAN_PWR, "wlan_power"); + if (rc) + pr_err("WLAN_PWR gpio request failed:%d\n", rc); + rc = gpio_request(TEGRATAB_WLAN_RST, "wlan_rst"); + if (rc) + pr_err("WLAN_RST gpio request failed:%d\n", rc); + rc = gpio_request(TEGRATAB_WLAN_WOW, "bcmsdh_sdmmc"); + if (rc) + pr_err("WLAN_WOW gpio request failed:%d\n", rc); + + rc = gpio_direction_output(TEGRATAB_WLAN_PWR, 0); + if (rc) + pr_err("WLAN_PWR gpio direction configuration failed:%d\n", rc); + rc = gpio_direction_output(TEGRATAB_WLAN_RST, 0); + if (rc) + pr_err("WLAN_RST gpio direction configuration failed:%d\n", rc); + rc = gpio_direction_input(TEGRATAB_WLAN_WOW); + if (rc) + pr_err("WLAN_WOW gpio direction configuration failed:%d\n", rc); + tegratab_wl12xx_wlan_data.irq = gpio_to_irq(TEGRATAB_WLAN_WOW); + wl12xx_set_platform_data(&tegratab_wl12xx_wlan_data); + return 0; +} + +int __init tegratab_sdhci_init(void) +{ + platform_device_register(&tegra_sdhci_device3); + platform_device_register(&tegra_sdhci_device2); + platform_device_register(&tegra_sdhci_device0); + tegratab_wifi_init(); + return 0; +} diff --git a/arch/arm/mach-tegra/board-tegratab-sensors.c b/arch/arm/mach-tegra/board-tegratab-sensors.c new file mode 100644 index 000000000000..4ae1ced9b210 --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab-sensors.c @@ -0,0 +1,561 @@ +/* + * arch/arm/mach-tegra/board-tegratab-sensors.c + * + * Copyright (c) 2012-2013 NVIDIA CORPORATION, All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of NVIDIA CORPORATION nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/i2c.h> +#include <linux/delay.h> +#include <linux/mpu.h> +#include <linux/regulator/consumer.h> +#include <linux/gpio.h> +#include <linux/therm_est.h> +#include <linux/nct1008.h> +#include <linux/cm3217.h> +#include <mach/edp.h> +#include <linux/edp.h> +#include <mach/gpio-tegra.h> +#include <mach/pinmux-t11.h> +#include <mach/pinmux.h> +#include <media/ov5693.h> +#include <media/ad5823.h> +#include <generated/mach-types.h> +#include <linux/power/sbs-battery.h> + +#include "gpio-names.h" +#include "board.h" +#include "board-common.h" +#include "board-tegratab.h" +#include "cpu-tegra.h" +#include "devices.h" +#include "tegra-board-id.h" +#include "dvfs.h" + +static struct board_info board_info; + +static struct throttle_table tj_throttle_table[] = { + /* CPU_THROT_LOW cannot be used by other than CPU */ + /* NO_CAP cannot be used by CPU */ + /* CPU, C2BUS, C3BUS, SCLK, EMC */ + { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1428000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1224000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1122000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1020000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 918000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 816000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 714000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 612000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 612000, 564000, 564000, NO_CAP, NO_CAP } }, + { { 612000, 528000, 528000, NO_CAP, NO_CAP } }, + { { 612000, 492000, 492000, NO_CAP, NO_CAP } }, + { { 612000, 420000, 420000, NO_CAP, NO_CAP } }, + { { 612000, 408000, 408000, NO_CAP, NO_CAP } }, + { { 612000, 360000, 360000, NO_CAP, NO_CAP } }, + { { 612000, 360000, 360000, 312000, NO_CAP } }, + { { 510000, 360000, 360000, 312000, 480000 } }, + { { 468000, 360000, 360000, 312000, 480000 } }, + { { 468000, 276000, 276000, 208000, 480000 } }, + { { 372000, 276000, 276000, 208000, 204000 } }, + { { 288000, 276000, 276000, 208000, 204000 } }, + { { 252000, 276000, 228000, 208000, 102000 } }, + { { 204000, 276000, 228000, 208000, 102000 } }, + { { 102000, 276000, 228000, 208000, 102000 } }, + { { CPU_THROT_LOW, 276000, 228000, 208000, 102000 } }, +}; + +static struct balanced_throttle tj_throttle = { + .throt_tab_size = ARRAY_SIZE(tj_throttle_table), + .throt_tab = tj_throttle_table, +}; + +static int __init tegratab_throttle_init(void) +{ + if (machine_is_tegratab()) + balanced_throttle_register(&tj_throttle, "tegra-balanced"); + return 0; +} +module_init(tegratab_throttle_init); + +static struct nct1008_platform_data tegratab_nct1008_pdata = { + .supported_hwrev = true, + .ext_range = true, + .conv_rate = 0x08, + .shutdown_ext_limit = 105, /* C */ + .shutdown_local_limit = 120, /* C */ +}; + +static struct i2c_board_info tegratab_i2c4_nct1008_board_info[] = { + { + I2C_BOARD_INFO("nct1008", 0x4C), + .platform_data = &tegratab_nct1008_pdata, + .irq = -1, + } +}; + +#define VI_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _ioreset) \ + { \ + .pingroup = TEGRA_PINGROUP_##_pingroup, \ + .func = TEGRA_MUX_##_mux, \ + .pupd = TEGRA_PUPD_##_pupd, \ + .tristate = TEGRA_TRI_##_tri, \ + .io = TEGRA_PIN_##_io, \ + .lock = TEGRA_PIN_LOCK_##_lock, \ + .od = TEGRA_PIN_OD_DEFAULT, \ + .ioreset = TEGRA_PIN_IO_RESET_##_ioreset \ +} + +static struct tegra_pingroup_config mclk_disable = + VI_PINMUX(CAM_MCLK, VI, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT); + +static struct tegra_pingroup_config mclk_enable = + VI_PINMUX(CAM_MCLK, VI_ALT3, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT); + +static struct tegra_pingroup_config pbb0_disable = + VI_PINMUX(GPIO_PBB0, VI, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT); +/* +static struct tegra_pingroup_config pbb0_enable = + VI_PINMUX(GPIO_PBB0, VI_ALT3, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT); +*/ +/* + * As a workaround, tegratab_vcmvdd need to be allocated to activate the + * sensor devices. This is due to the focuser device(AD5823) will hook up + * the i2c bus if it is not powered up. +*/ +static struct regulator *tegratab_vcmvdd; + +static int tegratab_get_vcmvdd(void) +{ + if (!tegratab_vcmvdd) { + tegratab_vcmvdd = regulator_get(NULL, "vdd_af_cam1"); + if (unlikely(WARN_ON(IS_ERR(tegratab_vcmvdd)))) { + pr_err("%s: can't get regulator vcmvdd: %ld\n", + __func__, PTR_ERR(tegratab_vcmvdd)); + tegratab_vcmvdd = NULL; + return -ENODEV; + } + } + return 0; +} + +static int tegratab_ov5693_power_on(struct ov5693_power_rail *pw) +{ + int err; + + if (unlikely(!pw || !pw->avdd || !pw->dovdd)) + return -EFAULT; + + if (tegratab_get_vcmvdd()) + goto ov5693_poweron_fail; + + gpio_set_value(CAM1_POWER_DWN_GPIO, 0); + usleep_range(10, 20); + + err = regulator_enable(pw->avdd); + if (err) + goto ov5693_avdd_fail; + + err = regulator_enable(pw->dovdd); + if (err) + goto ov5693_iovdd_fail; + + usleep_range(1, 2); + gpio_set_value(CAM1_POWER_DWN_GPIO, 1); + + err = regulator_enable(tegratab_vcmvdd); + if (unlikely(err)) + goto ov5693_vcmvdd_fail; + + tegra_pinmux_config_table(&mclk_enable, 1); + usleep_range(300, 310); + + return 0; + +ov5693_vcmvdd_fail: + regulator_disable(pw->dovdd); + +ov5693_iovdd_fail: + regulator_disable(pw->avdd); + +ov5693_avdd_fail: + gpio_set_value(CAM1_POWER_DWN_GPIO, 0); + +ov5693_poweron_fail: + pr_err("%s FAILED\n", __func__); + return -ENODEV; +} + +static int tegratab_ov5693_power_off(struct ov5693_power_rail *pw) +{ + if (unlikely(!pw || !tegratab_vcmvdd || !pw->avdd || !pw->dovdd)) + return -EFAULT; + + usleep_range(21, 25); + tegra_pinmux_config_table(&mclk_disable, 1); + gpio_set_value(CAM1_POWER_DWN_GPIO, 0); + usleep_range(1, 2); + + regulator_disable(tegratab_vcmvdd); + regulator_disable(pw->dovdd); + regulator_disable(pw->avdd); + + return 0; +} + +static struct nvc_gpio_pdata ov5693_gpio_pdata[] = { + { OV5693_GPIO_TYPE_PWRDN, CAM_RSTN, true, 0, }, +}; +static struct ov5693_platform_data tegratab_ov5693_pdata = { + .num = 0, + .dev_name = "camera", + .gpio_count = ARRAY_SIZE(ov5693_gpio_pdata), + .gpio = ov5693_gpio_pdata, + .power_on = tegratab_ov5693_power_on, + .power_off = tegratab_ov5693_power_off, +}; + +static int tegratab_ad5823_power_on(struct ad5823_platform_data *pdata) +{ + int err = 0; + + pr_info("%s\n", __func__); + err = gpio_request_one(pdata->gpio, GPIOF_OUT_INIT_LOW, "af_pwdn"); + + gpio_set_value_cansleep(pdata->gpio, 1); + + return err; +} + +static int tegratab_ad5823_power_off(struct ad5823_platform_data *pdata) +{ + pr_info("%s\n", __func__); + gpio_set_value_cansleep(pdata->gpio, 0); + gpio_free(pdata->gpio); + return 0; +} + +static struct ad5823_platform_data tegratab_ad5823_pdata = { + .gpio = CAM_AF_PWDN, + .power_on = tegratab_ad5823_power_on, + .power_off = tegratab_ad5823_power_off, +}; + +static struct i2c_board_info tegratab_i2c_board_info_e1599[] = { + { + I2C_BOARD_INFO("ov5693", 0x10), + .platform_data = &tegratab_ov5693_pdata, + }, + { + I2C_BOARD_INFO("ad5823", 0x0c), + .platform_data = &tegratab_ad5823_pdata, + }, +}; + +static int tegratab_camera_init(void) +{ + tegra_pinmux_config_table(&mclk_disable, 1); + tegra_pinmux_config_table(&pbb0_disable, 1); + + i2c_register_board_info(2, tegratab_i2c_board_info_e1599, + ARRAY_SIZE(tegratab_i2c_board_info_e1599)); + return 0; +} + +/* MPU board file definition */ +static struct mpu_platform_data mpu6050_gyro_data = { + .int_config = 0x10, + .level_shifter = 0, + /* Located in board_[platformname].h */ + .orientation = MPU_GYRO_ORIENTATION, + .sec_slave_type = SECONDARY_SLAVE_TYPE_COMPASS, + .sec_slave_id = COMPASS_ID_AK8975, + .secondary_i2c_addr = MPU_COMPASS_ADDR, + .secondary_read_reg = 0x06, + .secondary_orientation = MPU_COMPASS_ORIENTATION, + .key = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22, + 0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89}, +}; + +#define TEGRA_CAMERA_GPIO(_gpio, _label, _value) \ + { \ + .gpio = _gpio, \ + .label = _label, \ + .value = _value, \ + } + +static struct cm3217_platform_data tegratab_cm3217_pdata = { + .levels = {10, 160, 225, 320, 640, 1280, 2600, 5800, 8000, 10240}, + .golden_adc = 0, + .power = 0, +}; + +static struct i2c_board_info tegratab_i2c0_board_info_cm3217[] = { + { + I2C_BOARD_INFO("cm3217", 0x10), + .platform_data = &tegratab_cm3217_pdata, + }, +}; + +static struct i2c_board_info __initdata inv_mpu6050_i2c2_board_info[] = { + { + I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR), + .platform_data = &mpu6050_gyro_data, + }, +}; + +static void mpuirq_init(void) +{ + int ret = 0; + unsigned gyro_irq_gpio = MPU_GYRO_IRQ_GPIO; + unsigned gyro_bus_num = MPU_GYRO_BUS_NUM; + char *gyro_name = MPU_GYRO_NAME; + + pr_info("*** MPU START *** mpuirq_init...\n"); + + ret = gpio_request(gyro_irq_gpio, gyro_name); + + if (ret < 0) { + pr_err("%s: gpio_request failed %d\n", __func__, ret); + return; + } + + ret = gpio_direction_input(gyro_irq_gpio); + if (ret < 0) { + pr_err("%s: gpio_direction_input failed %d\n", __func__, ret); + gpio_free(gyro_irq_gpio); + return; + } + pr_info("*** MPU END *** mpuirq_init...\n"); + + inv_mpu6050_i2c2_board_info[0].irq = gpio_to_irq(MPU_GYRO_IRQ_GPIO); + i2c_register_board_info(gyro_bus_num, inv_mpu6050_i2c2_board_info, + ARRAY_SIZE(inv_mpu6050_i2c2_board_info)); +} + +static int tegratab_nct1008_init(void) +{ + int nct1008_port; + int ret = 0; + + nct1008_port = TEGRA_GPIO_PO4; + + tegra_add_cdev_trips(tegratab_nct1008_pdata.trips, + &tegratab_nct1008_pdata.num_trips); + + tegratab_i2c4_nct1008_board_info[0].irq = gpio_to_irq(nct1008_port); + pr_info("%s: tegratab nct1008 irq %d", __func__, \ + tegratab_i2c4_nct1008_board_info[0].irq); + + ret = gpio_request(nct1008_port, "temp_alert"); + if (ret < 0) + return ret; + + ret = gpio_direction_input(nct1008_port); + if (ret < 0) { + pr_info("%s: calling gpio_free(nct1008_port)", __func__); + gpio_free(nct1008_port); + } + + /* tegratab has thermal sensor on GEN1-I2C i.e. instance 0 */ + i2c_register_board_info(0, tegratab_i2c4_nct1008_board_info, + ARRAY_SIZE(tegratab_i2c4_nct1008_board_info)); + + return ret; +} + +#ifdef CONFIG_TEGRA_SKIN_THROTTLE +static struct thermal_trip_info skin_trips[] = { + { + .cdev_type = "skin-balanced", + .trip_temp = 45000, + .trip_type = THERMAL_TRIP_PASSIVE, + .upper = THERMAL_NO_LIMIT, + .lower = THERMAL_NO_LIMIT, + .hysteresis = 0, + }, +}; + +static struct therm_est_subdevice skin_devs[] = { + { + .dev_data = "nct_ext", + .coeffs = { + 2, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 0, + 1, 1, 0, 0, + 0, 0, -1, -7 + }, + }, + { + .dev_data = "nct_int", + .coeffs = { + -11, -7, -5, -3, + -3, -2, -1, 0, + 0, 0, 1, 1, + 1, 2, 2, 3, + 4, 6, 11, 18 + }, + }, +}; + +static struct therm_est_data skin_data = { + .num_trips = ARRAY_SIZE(skin_trips), + .trips = skin_trips, + .toffset = 9793, + .polling_period = 1100, + .passive_delay = 15000, + .tc1 = 10, + .tc2 = 1, + .ndevs = ARRAY_SIZE(skin_devs), + .devs = skin_devs, +}; + +static struct throttle_table skin_throttle_table[] = { + /* CPU_THROT_LOW cannot be used by other than CPU */ + /* NO_CAP cannot be used by CPU */ + /* CPU, C2BUS, C3BUS, SCLK, EMC */ + { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1122000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1122000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1122000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1122000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1122000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1122000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1020000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1020000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1020000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1020000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1020000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 1020000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 918000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 918000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 918000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 918000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 918000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 918000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 816000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 816000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 816000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 816000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 816000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 816000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 714000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 714000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 714000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 714000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 714000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 714000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 612000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 612000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 612000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 612000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 612000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 612000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, + { { 612000, 564000, 564000, NO_CAP, NO_CAP } }, + { { 612000, 564000, 564000, NO_CAP, NO_CAP } }, + { { 612000, 528000, 528000, NO_CAP, NO_CAP } }, + { { 612000, 528000, 528000, NO_CAP, NO_CAP } }, + { { 612000, 492000, 492000, NO_CAP, NO_CAP } }, + { { 612000, 492000, 492000, NO_CAP, NO_CAP } }, + { { 612000, 420000, 420000, NO_CAP, NO_CAP } }, + { { 612000, 420000, 420000, NO_CAP, NO_CAP } }, + { { 612000, 408000, 408000, NO_CAP, NO_CAP } }, + { { 612000, 408000, 408000, NO_CAP, NO_CAP } }, + { { 612000, 360000, 360000, NO_CAP, NO_CAP } }, + { { 612000, 360000, 360000, NO_CAP, NO_CAP } }, + { { 510000, 360000, 360000, 312000, NO_CAP } }, + { { 510000, 360000, 360000, 312000, NO_CAP } }, + { { 510000, 360000, 360000, 312000, 480000 } }, + { { 510000, 360000, 360000, 312000, 480000 } }, + { { 510000, 360000, 360000, 312000, 480000 } }, + { { 510000, 360000, 360000, 312000, 480000 } }, + { { 510000, 360000, 360000, 312000, 480000 } }, + { { 510000, 360000, 360000, 312000, 480000 } }, + { { 468000, 360000, 360000, 312000, 480000 } }, + { { 468000, 360000, 360000, 312000, 480000 } }, + { { 468000, 276000, 276000, 208000, 480000 } }, + { { 468000, 276000, 276000, 208000, 480000 } }, + { { 372000, 276000, 276000, 208000, 204000 } }, + { { 372000, 276000, 276000, 208000, 204000 } }, + { { 288000, 276000, 276000, 208000, 204000 } }, + { { 288000, 276000, 276000, 208000, 204000 } }, + { { 252000, 276000, 228000, 208000, 102000 } }, + { { 252000, 276000, 228000, 208000, 102000 } }, + { { 204000, 276000, 228000, 208000, 102000 } }, + { { 204000, 276000, 228000, 208000, 102000 } }, + { { 102000, 276000, 228000, 208000, 102000 } }, + { { CPU_THROT_LOW, 276000, 228000, 208000, 102000 } }, +}; + +static struct balanced_throttle skin_throttle = { + .throt_tab_size = ARRAY_SIZE(skin_throttle_table), + .throt_tab = skin_throttle_table, +}; + +static int __init tegratab_skin_init(void) +{ + if (machine_is_tegratab()) { + balanced_throttle_register(&skin_throttle, "skin-balanced"); + tegra_skin_therm_est_device.dev.platform_data = &skin_data; + platform_device_register(&tegra_skin_therm_est_device); + } + + return 0; +} +late_initcall(tegratab_skin_init); +#endif + +int __init tegratab_sensors_init(void) +{ + int err; + + tegra_get_board_info(&board_info); + + /* E1545+E1604 has no temp sensor. */ + if (board_info.board_id != BOARD_E1545) { + err = tegratab_nct1008_init(); + if (err) { + pr_err("%s: nct1008 register failed.\n", __func__); + return err; + } + } + + tegratab_camera_init(); + mpuirq_init(); + + i2c_register_board_info(0, tegratab_i2c0_board_info_cm3217, + ARRAY_SIZE(tegratab_i2c0_board_info_cm3217)); + + return 0; +} diff --git a/arch/arm/mach-tegra/board-tegratab.c b/arch/arm/mach-tegra/board-tegratab.c new file mode 100644 index 000000000000..2ff98c8febd3 --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab.c @@ -0,0 +1,735 @@ +/* + * arch/arm/mach-tegra/board-tegratab.c + * + * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/slab.h> +#include <linux/ctype.h> +#include <linux/platform_device.h> +#include <linux/clk.h> +#include <linux/serial_8250.h> +#include <linux/i2c.h> +#include <linux/dma-mapping.h> +#include <linux/delay.h> +#include <linux/i2c-tegra.h> +#include <linux/gpio.h> +#include <linux/input.h> +#include <linux/platform_data/tegra_usb.h> +#include <linux/platform_data/tegra_usb_modem_power.h> +#include <linux/spi/spi.h> +#include <linux/spi/rm31080a_ts.h> +#include <linux/tegra_uart.h> +#include <linux/memblock.h> +#include <linux/spi-tegra.h> +#include <linux/skbuff.h> +#include <linux/ti_wilink_st.h> +#include <linux/regulator/consumer.h> +#include <linux/smb349-charger.h> +#include <linux/max17048_battery.h> +#include <linux/leds.h> +#include <linux/i2c/at24.h> +#include <linux/of_platform.h> +#include <linux/edp.h> + +#include <asm/hardware/gic.h> + +#include <mach/clk.h> +#include <mach/iomap.h> +#include <mach/irqs.h> +#include <mach/pinmux.h> +#include <mach/pinmux-tegra30.h> +#include <mach/iomap.h> +#include <mach/io.h> +#include <mach/io_dpd.h> +#include <mach/i2s.h> +#include <mach/tegra_asoc_pdata.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <mach/usb_phy.h> +#include <mach/gpio-tegra.h> +#include <mach/tegra_fiq_debugger.h> +#include <mach/hardware.h> + +#include "board-touch-raydium.h" +#include "board.h" +#include "board-common.h" +#include "clock.h" +#include "board-tegratab.h" +#include "devices.h" +#include "gpio-names.h" +#include "fuse.h" +#include "pm.h" +#include "pm-irq.h" +#include "common.h" +#include "tegra-board-id.h" + +#if defined CONFIG_TI_ST || defined CONFIG_TI_ST_MODULE +struct ti_st_plat_data tegratab_wilink_pdata = { + .nshutdown_gpio = TEGRA_GPIO_PQ7, + .dev_name = BLUETOOTH_UART_DEV_NAME, + .flow_cntrl = 1, + .baud_rate = 3000000, +}; + +static struct platform_device wl128x_device = { + .name = "kim", + .id = -1, + .dev.platform_data = &tegratab_wilink_pdata, +}; + +static struct platform_device btwilink_device = { + .name = "btwilink", + .id = -1, +}; + +static noinline void __init tegratab_bt_st(void) +{ + pr_info("tegratab_bt_st"); + + platform_device_register(&wl128x_device); + platform_device_register(&btwilink_device); +} + +static struct resource tegratab_st_host_wake_resources[] = { + [0] = { + .name = "host_wake", + .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, + }, +}; + +static struct platform_device tegratab_st_host_wake_device = { + .name = "st_host_wake", + .id = 0, + .num_resources = ARRAY_SIZE(tegratab_st_host_wake_resources), + .resource = tegratab_st_host_wake_resources, +}; + +static noinline void __init tegratab_tegra_setup_st_host_wake(void) +{ + tegratab_st_host_wake_resources[0].start = + tegratab_st_host_wake_resources[0].end = + gpio_to_irq(TEGRA_GPIO_PU6); + platform_device_register(&tegratab_st_host_wake_device); +} +#endif + +static __initdata struct tegra_clk_init_table tegratab_clk_init_table[] = { + /* name parent rate enabled */ + { "pll_m", NULL, 0, false}, + { "hda", "pll_p", 108000000, false}, + { "hda2codec_2x", "pll_p", 48000000, false}, + { "pwm", "pll_p", 3187500, false}, + { "blink", "clk_32k", 32768, true}, + { "i2s1", "pll_a_out0", 0, false}, + { "i2s3", "pll_a_out0", 0, false}, + { "i2s4", "pll_a_out0", 0, false}, + { "spdif_out", "pll_a_out0", 0, false}, + { "d_audio", "clk_m", 12000000, false}, + { "dam0", "clk_m", 12000000, false}, + { "dam1", "clk_m", 12000000, false}, + { "dam2", "clk_m", 12000000, false}, + { "audio1", "i2s1_sync", 0, false}, + { "audio3", "i2s3_sync", 0, false}, + /* Setting vi_sensor-clk to true for validation purpose, will imapact + * power, later set to be false.*/ + { "vi_sensor", "pll_p", 150000000, false}, + { "cilab", "pll_p", 150000000, false}, + { "cilcd", "pll_p", 150000000, false}, + { "cile", "pll_p", 150000000, false}, + { "i2c1", "pll_p", 3200000, false}, + { "i2c2", "pll_p", 3200000, false}, + { "i2c3", "pll_p", 3200000, false}, + { "i2c4", "pll_p", 3200000, false}, + { "i2c5", "pll_p", 3200000, false}, + { NULL, NULL, 0, 0}, +}; + +static struct tegra_i2c_platform_data tegratab_i2c1_platform_data = { + .adapter_nr = 0, + .bus_count = 1, + .bus_clk_rate = { 100000, 0 }, + .scl_gpio = {TEGRA_GPIO_I2C1_SCL, 0}, + .sda_gpio = {TEGRA_GPIO_I2C1_SDA, 0}, + .arb_recovery = arb_lost_recovery, +}; + +static struct tegra_i2c_platform_data tegratab_i2c2_platform_data = { + .adapter_nr = 1, + .bus_count = 1, + .bus_clk_rate = { 100000, 0 }, + .is_clkon_always = true, + .scl_gpio = {TEGRA_GPIO_I2C2_SCL, 0}, + .sda_gpio = {TEGRA_GPIO_I2C2_SDA, 0}, + .arb_recovery = arb_lost_recovery, +}; + +static struct tegra_i2c_platform_data tegratab_i2c3_platform_data = { + .adapter_nr = 2, + .bus_count = 1, + .bus_clk_rate = { 100000, 0 }, + .scl_gpio = {TEGRA_GPIO_I2C3_SCL, 0}, + .sda_gpio = {TEGRA_GPIO_I2C3_SDA, 0}, + .arb_recovery = arb_lost_recovery, +}; + +static struct tegra_i2c_platform_data tegratab_i2c4_platform_data = { + .adapter_nr = 3, + .bus_count = 1, + .bus_clk_rate = { 10000, 0 }, + .scl_gpio = {TEGRA_GPIO_I2C4_SCL, 0}, + .sda_gpio = {TEGRA_GPIO_I2C4_SDA, 0}, + .arb_recovery = arb_lost_recovery, +}; + +static struct tegra_i2c_platform_data tegratab_i2c5_platform_data = { + .adapter_nr = 4, + .bus_count = 1, + .bus_clk_rate = { 400000, 0 }, + .scl_gpio = {TEGRA_GPIO_I2C5_SCL, 0}, + .sda_gpio = {TEGRA_GPIO_I2C5_SDA, 0}, + .arb_recovery = arb_lost_recovery, +}; + +static struct i2c_board_info __initdata rt5640_board_info = { + I2C_BOARD_INFO("rt5640", 0x1c), +}; + +static void tegratab_i2c_init(void) +{ + struct board_info board_info; + + tegra_get_board_info(&board_info); + tegra11_i2c_device1.dev.platform_data = &tegratab_i2c1_platform_data; + tegra11_i2c_device2.dev.platform_data = &tegratab_i2c2_platform_data; + tegra11_i2c_device3.dev.platform_data = &tegratab_i2c3_platform_data; + tegra11_i2c_device4.dev.platform_data = &tegratab_i2c4_platform_data; + tegra11_i2c_device5.dev.platform_data = &tegratab_i2c5_platform_data; + + platform_device_register(&tegra11_i2c_device5); + platform_device_register(&tegra11_i2c_device4); + platform_device_register(&tegra11_i2c_device3); + platform_device_register(&tegra11_i2c_device2); + platform_device_register(&tegra11_i2c_device1); + + i2c_register_board_info(0, &rt5640_board_info, 1); +} + +static struct platform_device *tegratab_uart_devices[] __initdata = { + &tegra_uarta_device, + &tegra_uartb_device, + &tegra_uartc_device, + &tegra_uartd_device, +}; +static struct uart_clk_parent uart_parent_clk[] = { + [0] = {.name = "clk_m"}, + [1] = {.name = "pll_p"}, +#ifndef CONFIG_TEGRA_PLLM_RESTRICTED + [2] = {.name = "pll_m"}, +#endif +}; + +static struct tegra_uart_platform_data tegratab_uart_pdata; +static struct tegra_uart_platform_data tegratab_loopback_uart_pdata; + +static void __init uart_debug_init(void) +{ + int debug_port_id; + + debug_port_id = uart_console_debug_init(3); + if (debug_port_id < 0) + return; + + tegratab_uart_devices[debug_port_id] = uart_console_debug_device; +} + +static void __init tegratab_uart_init(void) +{ + struct clk *c; + int i; + + for (i = 0; i < ARRAY_SIZE(uart_parent_clk); ++i) { + c = tegra_get_clock_by_name(uart_parent_clk[i].name); + if (IS_ERR_OR_NULL(c)) { + pr_err("Not able to get the clock for %s\n", + uart_parent_clk[i].name); + continue; + } + uart_parent_clk[i].parent_clk = c; + uart_parent_clk[i].fixed_clk_rate = clk_get_rate(c); + } + tegratab_uart_pdata.parent_clk_list = uart_parent_clk; + tegratab_uart_pdata.parent_clk_count = ARRAY_SIZE(uart_parent_clk); + tegratab_loopback_uart_pdata.parent_clk_list = uart_parent_clk; + tegratab_loopback_uart_pdata.parent_clk_count = + ARRAY_SIZE(uart_parent_clk); + tegratab_loopback_uart_pdata.is_loopback = true; + tegra_uarta_device.dev.platform_data = &tegratab_uart_pdata; + tegra_uartb_device.dev.platform_data = &tegratab_uart_pdata; + tegra_uartc_device.dev.platform_data = &tegratab_uart_pdata; + tegra_uartd_device.dev.platform_data = &tegratab_uart_pdata; + + /* Register low speed only if it is selected */ + if (!is_tegra_debug_uartport_hs()) + uart_debug_init(); + + platform_add_devices(tegratab_uart_devices, + ARRAY_SIZE(tegratab_uart_devices)); +} + +static struct resource tegra_rtc_resources[] = { + [0] = { + .start = TEGRA_RTC_BASE, + .end = TEGRA_RTC_BASE + TEGRA_RTC_SIZE - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = INT_RTC, + .end = INT_RTC, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device tegra_rtc_device = { + .name = "tegra_rtc", + .id = -1, + .resource = tegra_rtc_resources, + .num_resources = ARRAY_SIZE(tegra_rtc_resources), +}; + +static struct tegra_asoc_platform_data tegratab_audio_pdata = { + .gpio_spkr_en = TEGRA_GPIO_SPKR_EN, + .gpio_hp_det = TEGRA_GPIO_HP_DET, + .gpio_hp_mute = -1, + .gpio_int_mic_en = TEGRA_GPIO_INT_MIC_EN, + .gpio_ext_mic_en = TEGRA_GPIO_EXT_MIC_EN, + .gpio_ldo1_en = TEGRA_GPIO_LDO1_EN, + .gpio_codec1 = TEGRA_GPIO_CODEC1_EN, + .gpio_codec2 = TEGRA_GPIO_CODEC2_EN, + .gpio_codec3 = TEGRA_GPIO_CODEC3_EN, + .i2s_param[HIFI_CODEC] = { + .audio_port_id = 1, + .is_i2s_master = 1, + .i2s_mode = TEGRA_DAIFMT_I2S, + }, + .i2s_param[BT_SCO] = { + .audio_port_id = 3, + .is_i2s_master = 1, + .i2s_mode = TEGRA_DAIFMT_DSP_A, + }, +}; + +static struct platform_device tegratab_audio_device = { + .name = "tegra-snd-rt5640", + .id = 0, + .dev = { + .platform_data = &tegratab_audio_pdata, + }, +}; + +static struct platform_device *tegratab_devices[] __initdata = { + &tegra_pmu_device, + &tegra_rtc_device, + &tegra_udc_device, +#if defined(CONFIG_TEGRA_IOVMM_SMMU) || defined(CONFIG_TEGRA_IOMMU_SMMU) + &tegra_smmu_device, +#endif +#if defined(CONFIG_TEGRA_AVP) + &tegra_avp_device, +#endif +#if defined(CONFIG_CRYPTO_DEV_TEGRA_SE) + &tegra11_se_device, +#endif + &tegra_ahub_device, + &tegra_dam_device0, + &tegra_dam_device1, + &tegra_dam_device2, + &tegra_i2s_device1, + &tegra_i2s_device3, + &tegra_i2s_device4, + &tegra_spdif_device, + &spdif_dit_device, + &bluetooth_dit_device, + &tegra_pcm_device, + &tegratab_audio_device, + &tegra_hda_device, +#if defined(CONFIG_CRYPTO_DEV_TEGRA_AES) + &tegra_aes_device, +#endif +}; + +#ifdef CONFIG_USB_SUPPORT +static struct tegra_usb_platform_data tegra_udc_pdata = { + .port_otg = true, + .has_hostpc = true, + .support_pmu_vbus = true, + .phy_intf = TEGRA_USB_PHY_INTF_UTMI, + .op_mode = TEGRA_USB_OPMODE_DEVICE, + .u_data.dev = { + .vbus_pmu_irq = 0, + .vbus_gpio = -1, + .charging_supported = false, + .remote_wakeup_supported = false, + }, + .u_cfg.utmi = { + .hssync_start_delay = 0, + .elastic_limit = 16, + .idle_wait_delay = 17, + .term_range_adj = 6, + .xcvr_setup = 8, + .xcvr_lsfslew = 2, + .xcvr_lsrslew = 2, + .xcvr_setup_offset = 0, + .xcvr_use_fuses = 1, + }, +}; + +static struct tegra_usb_platform_data tegra_ehci1_utmi_pdata = { + .port_otg = true, + .has_hostpc = true, + .support_pmu_vbus = true, + .unaligned_dma_buf_supported = false, + .phy_intf = TEGRA_USB_PHY_INTF_UTMI, + .op_mode = TEGRA_USB_OPMODE_HOST, + .u_data.host = { + .vbus_gpio = -1, + .hot_plug = false, + .remote_wakeup_supported = true, + .power_off_on_suspend = true, + }, + .u_cfg.utmi = { + .hssync_start_delay = 0, + .elastic_limit = 16, + .idle_wait_delay = 17, + .term_range_adj = 6, + .xcvr_setup = 15, + .xcvr_lsfslew = 2, + .xcvr_lsrslew = 2, + .xcvr_setup_offset = 0, + .xcvr_use_fuses = 1, + .vbus_oc_map = 0x4, + }, +}; + +static struct tegra_usb_otg_data tegra_otg_pdata = { + .ehci_device = &tegra_ehci1_device, + .ehci_pdata = &tegra_ehci1_utmi_pdata, + .extcon_dev_name = "palmas-extcon", +}; + +static void tegratab_usb_init(void) +{ + int usb_port_owner_info = tegra_get_usb_port_owner_info(); + + /* Set USB wake sources for tegratab */ + tegra_set_usb_wake_source(); + + if (!(usb_port_owner_info & UTMI1_PORT_OWNER_XUSB)) { + if (tegra_get_chipid() == TEGRA_CHIPID_TEGRA11 && + tegra_revision == TEGRA_REVISION_A02) { + tegra_ehci1_utmi_pdata \ + .unaligned_dma_buf_supported = true; + tegra_udc_pdata.unaligned_dma_buf_supported = true; + } + tegra_otg_device.dev.platform_data = &tegra_otg_pdata; + platform_device_register(&tegra_otg_device); + /* Setup the udc platform data */ + tegra_udc_device.dev.platform_data = &tegra_udc_pdata; + } +} + +static struct gpio modem_gpios[] = { /* Nemo modem */ + {MODEM_EN, GPIOF_OUT_INIT_HIGH, "MODEM EN"}, + {MDM_RST, GPIOF_OUT_INIT_LOW, "MODEM RESET"}, +}; + +static struct tegra_usb_platform_data tegra_ehci2_hsic_baseband_pdata = { + .port_otg = false, + .has_hostpc = true, + .unaligned_dma_buf_supported = false, + .phy_intf = TEGRA_USB_PHY_INTF_HSIC, + .op_mode = TEGRA_USB_OPMODE_HOST, + .u_data.host = { + .vbus_gpio = -1, + .hot_plug = false, + .remote_wakeup_supported = true, + .power_off_on_suspend = true, + }, +}; + +static int baseband_init(void) +{ + int ret; + + ret = gpio_request_array(modem_gpios, ARRAY_SIZE(modem_gpios)); + if (ret) { + pr_warn("%s:gpio request failed\n", __func__); + return ret; + } + + /* enable pull-down for MDM_COLD_BOOT */ + tegra_pinmux_set_pullupdown(TEGRA_PINGROUP_ULPI_DATA4, + TEGRA_PUPD_PULL_DOWN); + + /* export GPIO for user space access through sysfs */ + gpio_export(MDM_RST, false); + + return 0; +} + +static const struct tegra_modem_operations baseband_operations = { + .init = baseband_init, +}; + +static struct tegra_usb_modem_power_platform_data baseband_pdata = { + .ops = &baseband_operations, + .wake_gpio = -1, + .boot_gpio = MDM_COLDBOOT, + .boot_irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + .autosuspend_delay = 2000, + .short_autosuspend_delay = 50, + .tegra_ehci_device = &tegra_ehci2_device, + .tegra_ehci_pdata = &tegra_ehci2_hsic_baseband_pdata, +}; + +static struct platform_device icera_nemo_device = { + .name = "tegra_usb_modem_power", + .id = -1, + .dev = { + .platform_data = &baseband_pdata, + }, +}; + +static void tegratab_modem_init(void) +{ + int modem_id = tegra_get_modem_id(); + int usb_port_owner_info = tegra_get_usb_port_owner_info(); + switch (modem_id) { + case TEGRA_BB_NEMO: /* on board i500 HSIC */ + if (!(usb_port_owner_info & HSIC1_PORT_OWNER_XUSB)) { + if ((tegra_get_chipid() == TEGRA_CHIPID_TEGRA11) && + (tegra_revision == TEGRA_REVISION_A02)) + tegra_ehci2_hsic_baseband_pdata \ + .unaligned_dma_buf_supported = true; + platform_device_register(&icera_nemo_device); + } + break; + } +} + +#else +static void tegratab_usb_init(void) { } +static void tegratab_modem_init(void) { } +#endif + +static void tegratab_audio_init(void) +{ + struct board_info board_info; + + tegra_get_board_info(&board_info); + + tegratab_audio_pdata.codec_name = "rt5640.0-001c"; + tegratab_audio_pdata.codec_dai_name = "rt5640-aif1"; +} + + +static struct platform_device *tegratab_spi_devices[] __initdata = { + &tegra11_spi_device1, +}; + +struct spi_clk_parent spi_parent_clk_tegratab[] = { + [0] = {.name = "pll_p"}, +#ifndef CONFIG_TEGRA_PLLM_RESTRICTED + [1] = {.name = "pll_m"}, + [2] = {.name = "clk_m"}, +#else + [1] = {.name = "clk_m"}, +#endif +}; + +static struct tegra_spi_platform_data tegratab_spi_pdata = { + .max_dma_buffer = 16 * 1024, + .is_clkon_always = false, + .max_rate = 25000000, +}; + +static void __init tegratab_spi_init(void) +{ + int i; + struct clk *c; + struct board_info board_info, display_board_info; + + tegra_get_board_info(&board_info); + tegra_get_display_board_info(&display_board_info); + + for (i = 0; i < ARRAY_SIZE(spi_parent_clk_tegratab); ++i) { + c = tegra_get_clock_by_name(spi_parent_clk_tegratab[i].name); + if (IS_ERR_OR_NULL(c)) { + pr_err("Not able to get the clock for %s\n", + spi_parent_clk_tegratab[i].name); + continue; + } + spi_parent_clk_tegratab[i].parent_clk = c; + spi_parent_clk_tegratab[i].fixed_clk_rate = clk_get_rate(c); + } + tegratab_spi_pdata.parent_clk_list = spi_parent_clk_tegratab; + tegratab_spi_pdata.parent_clk_count = + ARRAY_SIZE(spi_parent_clk_tegratab); + tegratab_spi_pdata.is_dma_based = + (tegra_revision == TEGRA_REVISION_A01) ? false : true; + tegra11_spi_device1.dev.platform_data = &tegratab_spi_pdata; + platform_add_devices(tegratab_spi_devices, + ARRAY_SIZE(tegratab_spi_devices)); +} + +static __initdata struct tegra_clk_init_table touch_clk_init_table[] = { + /* name parent rate enabled */ + { "extern2", "pll_p", 41000000, false}, + { "clk_out_2", "extern2", 40800000, false}, + { NULL, NULL, 0, 0}, +}; + +struct rm_spi_ts_platform_data rm31080ts_tegratab_data = { + .gpio_reset = TOUCH_GPIO_RST_RAYDIUM_SPI, + .config = 0, + .platform_id = RM_PLATFORM_D010, + .name_of_clock = "clk_out_2", + .name_of_clock_con = "extern2", +}; + +static struct tegra_spi_device_controller_data dev_cdata = { + .rx_clk_tap_delay = 0, + .tx_clk_tap_delay = 16, +}; + +struct spi_board_info rm31080a_tegratab_spi_board[1] = { + { + .modalias = "rm_ts_spidev", + .bus_num = 0, + .chip_select = 0, + .max_speed_hz = 12 * 1000 * 1000, + .mode = SPI_MODE_0, + .controller_data = &dev_cdata, + .platform_data = &rm31080ts_tegratab_data, + }, +}; + +static int __init tegratab_touch_init(void) +{ + struct board_info board_info; + + tegra_get_display_board_info(&board_info); + tegra_clk_init_from_table(touch_clk_init_table); + rm31080ts_tegratab_data.platform_id = RM_PLATFORM_D010; + mdelay(20); + rm31080a_tegratab_spi_board[0].irq = + gpio_to_irq(TOUCH_GPIO_IRQ_RAYDIUM_SPI); + touch_init_raydium(TOUCH_GPIO_IRQ_RAYDIUM_SPI, + TOUCH_GPIO_RST_RAYDIUM_SPI, + &rm31080ts_tegratab_data, + &rm31080a_tegratab_spi_board[0], + ARRAY_SIZE(rm31080a_tegratab_spi_board)); + return 0; +} + +static void __init tegra_tegratab_init(void) +{ + struct board_info board_info; + + tegra_get_display_board_info(&board_info); + tegra_clk_init_from_table(tegratab_clk_init_table); + tegra_clk_verify_parents(); + tegra_soc_device_init("tegratab"); + tegra_enable_pinmux(); + tegratab_pinmux_init(); + tegratab_i2c_init(); + tegratab_spi_init(); + tegratab_usb_init(); + tegratab_uart_init(); + tegratab_audio_init(); + platform_add_devices(tegratab_devices, ARRAY_SIZE(tegratab_devices)); + tegra_ram_console_debug_init(); + tegra_io_dpd_init(); + tegratab_regulator_init(); + tegratab_sdhci_init(); + tegratab_suspend_init(); + tegratab_emc_init(); + tegratab_edp_init(); + tegratab_touch_init(); + tegratab_panel_init(); + tegratab_kbc_init(); + tegratab_pmon_init(); +#if defined CONFIG_TI_ST || defined CONFIG_TI_ST_MODULE + tegratab_bt_st(); + tegratab_tegra_setup_st_host_wake(); +#endif + tegra_release_bootloader_fb(); + tegratab_modem_init(); +#ifdef CONFIG_TEGRA_WDT_RECOVERY + tegra_wdt_recovery_init(); +#endif + tegra_serial_debug_init(TEGRA_UARTD_BASE, INT_WDT_CPU, NULL, -1, -1); + tegratab_sensors_init(); + tegratab_soctherm_init(); + tegra_register_fuse(); +} + +static void __init tegratab_ramconsole_reserve(unsigned long size) +{ + tegra_ram_console_debug_reserve(SZ_1M); +} + +static void __init tegra_tegratab_dt_init(void) +{ +#ifdef CONFIG_USE_OF + of_platform_populate(NULL, + of_default_bus_match_table, NULL, NULL); +#endif + + tegra_tegratab_init(); +} + +static void __init tegra_tegratab_reserve(void) +{ +#if defined(CONFIG_NVMAP_CONVERT_CARVEOUT_TO_IOVMM) + /* 1920*1200*4*2 = 18432000 bytes */ + tegra_reserve(0, SZ_16M + SZ_2M, SZ_16M); +#else + tegra_reserve(SZ_128M, SZ_16M + SZ_2M, SZ_4M); +#endif + tegratab_ramconsole_reserve(SZ_1M); +} + +static const char * const tegratab_dt_board_compat[] = { + "nvidia,tegratab", + NULL +}; + +MACHINE_START(TEGRATAB, "tegratab") + .atag_offset = 0x100, + .soc = &tegra_soc_desc, + .map_io = tegra_map_common_io, + .reserve = tegra_tegratab_reserve, + .init_early = tegra11x_init_early, + .init_irq = tegra_init_irq, + .handle_irq = gic_handle_irq, + .timer = &tegra_timer, + .init_machine = tegra_tegratab_dt_init, + .restart = tegra_assert_system_reset, + .dt_compat = tegratab_dt_board_compat, +MACHINE_END diff --git a/arch/arm/mach-tegra/board-tegratab.h b/arch/arm/mach-tegra/board-tegratab.h new file mode 100644 index 000000000000..3694cc9428ae --- /dev/null +++ b/arch/arm/mach-tegra/board-tegratab.h @@ -0,0 +1,116 @@ +/* + * arch/arm/mach-tegra/board-tegratab.h + * + * Copyright (c) 2013, NVIDIA Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _MACH_TEGRA_BOARD_TEGRATAB_H +#define _MACH_TEGRA_BOARD_TEGRATAB_H + +#include <mach/gpio.h> +#include <mach/irqs.h> +#include "gpio-names.h" + +#define PMC_WAKE_STATUS 0x14 +#define PMC_WAKE2_STATUS 0x168 + +/* External peripheral act as gpio */ +#define PALMAS_TEGRA_GPIO_BASE TEGRA_NR_GPIOS + +/* Audio-related GPIOs */ +#define TEGRA_GPIO_CDC_IRQ TEGRA_GPIO_PW3 +#define TEGRA_GPIO_LDO1_EN TEGRA_GPIO_PV3 +#define TEGRA_GPIO_CODEC1_EN TEGRA_GPIO_PP3 +#define TEGRA_GPIO_CODEC2_EN TEGRA_GPIO_PP1 +#define TEGRA_GPIO_CODEC3_EN TEGRA_GPIO_PV0 + +#define TEGRA_GPIO_SPKR_EN -1 +#define TEGRA_GPIO_HP_DET TEGRA_GPIO_PR7 +#define TEGRA_GPIO_INT_MIC_EN TEGRA_GPIO_PK3 +#define TEGRA_GPIO_EXT_MIC_EN -1 + +/* External peripheral act as interrupt controller */ +#define PALMAS_TEGRA_IRQ_BASE TEGRA_NR_IRQS +#define PALMAS_TEGRA_IRQ_END (PALMAS_TEGRA_IRQ_BASE + PALMAS_NUM_IRQ) + +/* I2C related GPIOs */ +#define TEGRA_GPIO_I2C1_SCL TEGRA_GPIO_PC4 +#define TEGRA_GPIO_I2C1_SDA TEGRA_GPIO_PC5 +#define TEGRA_GPIO_I2C2_SCL TEGRA_GPIO_PT5 +#define TEGRA_GPIO_I2C2_SDA TEGRA_GPIO_PT6 +#define TEGRA_GPIO_I2C3_SCL TEGRA_GPIO_PBB1 +#define TEGRA_GPIO_I2C3_SDA TEGRA_GPIO_PBB2 +#define TEGRA_GPIO_I2C4_SCL TEGRA_GPIO_PV4 +#define TEGRA_GPIO_I2C4_SDA TEGRA_GPIO_PV5 +#define TEGRA_GPIO_I2C5_SCL TEGRA_GPIO_PZ6 +#define TEGRA_GPIO_I2C5_SDA TEGRA_GPIO_PZ7 + +/* Camera related GPIOs */ +#define CAM_RSTN TEGRA_GPIO_PBB3 +#define CAM_FLASH_STROBE TEGRA_GPIO_PBB4 +#define CAM1_POWER_DWN_GPIO TEGRA_GPIO_PBB5 +#define CAM2_POWER_DWN_GPIO TEGRA_GPIO_PBB6 +#define CAM_AF_PWDN TEGRA_GPIO_PBB7 +#define CAM_GPIO1 TEGRA_GPIO_PCC1 +#define CAM_GPIO2 TEGRA_GPIO_PCC2 + +/* Touchscreen definitions */ +#define TOUCH_GPIO_IRQ_RAYDIUM_SPI TEGRA_GPIO_PK2 +#define TOUCH_GPIO_RST_RAYDIUM_SPI TEGRA_GPIO_PK4 + +/* Invensense MPU Definitions */ +#define MPU_GYRO_NAME "mpu6050" +#define MPU_GYRO_IRQ_GPIO TEGRA_GPIO_PR3 +#define MPU_GYRO_ADDR 0x69 +#define MPU_GYRO_BUS_NUM 0 +#define MPU_GYRO_ORIENTATION { 0, 1, 0, -1, 0, 0, 0, 0, 1 } +#define MPU_COMPASS_NAME "ak8975" +#define MPU_COMPASS_IRQ_GPIO 0 +#define MPU_COMPASS_ADDR 0x0D +#define MPU_COMPASS_BUS_NUM 0 +#define MPU_COMPASS_ORIENTATION { 0, 1, 0, -1, 0, 0, 0, 0, 1 } + +/* Modem related GPIOs */ +#define MODEM_EN TEGRA_GPIO_PP2 +#define MDM_RST TEGRA_GPIO_PP0 +#define MDM_COLDBOOT TEGRA_GPIO_PO5 + +int tegratab_regulator_init(void); +int tegratab_suspend_init(void); +int tegratab_sdhci_init(void); +int tegratab_pinmux_init(void); +int tegratab_sensors_init(void); +int tegratab_emc_init(void); +int tegratab_edp_init(void); +int tegratab_panel_init(void); +int roth_panel_init(void); +int tegratab_kbc_init(void); +int tegratab_pmon_init(void); +int tegratab_soctherm_init(void); + +/* UART port which is used by bluetooth*/ +#define BLUETOOTH_UART_DEV_NAME "/dev/ttyHS2" + +/* Baseband IDs */ +enum tegra_bb_type { + TEGRA_BB_NEMO = 1, +}; + +#define UTMI1_PORT_OWNER_XUSB 0x1 +#define UTMI2_PORT_OWNER_XUSB 0x2 +#define HSIC1_PORT_OWNER_XUSB 0x4 + +#endif diff --git a/arch/arm/mach-tegra/tegra-board-id.h b/arch/arm/mach-tegra/tegra-board-id.h index 2bcfba5f2d4e..aae067b036b0 100644 --- a/arch/arm/mach-tegra/tegra-board-id.h +++ b/arch/arm/mach-tegra/tegra-board-id.h @@ -1,7 +1,7 @@ /* * tegra-board-id.h: Defines all boardid of Tegra. * - * Copyright (c) 2012, NVIDIA Corporation. All rights reserved. + * Copyright (c) 2012-2013, NVIDIA Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,6 +33,7 @@ #define BOARD_P2454 0x0996 #define BOARD_E1582 0x062E #define BOARD_E1545 0x0609 +#define BOARD_E1569 0x0621 /* Board Fab version */ #define BOARD_FAB_A00 0x0 diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index 444a36d70b4d..050fee784e45 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types @@ -1178,3 +1178,4 @@ tegra_pluto MACH_TEGRA_PLUTO TEGRA_PLUTO 4306 tai MACH_TAI TAI 4311 roth MACH_ROTH ROTH 4377 macallan MACH_MACALLAN MACALLAN 4406 +tegratab MACH_TEGRATAB TEGRATAB 4544 |