diff mbox

[U-Boot,6/7] ARM: tegra: enable SD card on p2771-0000

Message ID 20160729191506.24803-6-swarren@wwwdotorg.org
State Accepted
Commit 45d85f0872ef92779ea5b51a424845a919a41462
Delegated to: Tom Warren
Headers show

Commit Message

Stephen Warren July 29, 2016, 7:15 p.m. UTC
From: Stephen Warren <swarren@nvidia.com>

Now that clock and reset drivers exist for Tegra186, we can enable the SD
card controller. Now that a BPMP I2C driver exists for Tegra186, we can
communicate with the PMIC to enable power to the SD card. Hook up the DT
content and board code required to make the SD card work.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 arch/arm/dts/tegra186-p2771-0000-a02.dts |  5 +++++
 arch/arm/dts/tegra186-p2771-0000-b00.dts |  5 +++++
 arch/arm/dts/tegra186-p2771-0000.dtsi    | 14 ++++++++++++++
 board/nvidia/p2771-0000/p2771-0000.c     | 26 ++++++++++++++++++++++++++
 configs/p2771-0000-a02_defconfig         |  1 +
 configs/p2771-0000-b00_defconfig         |  1 +
 6 files changed, 52 insertions(+)

Comments

Simon Glass Aug. 1, 2016, 1:04 a.m. UTC | #1
Hi Stephen,

On 29 July 2016 at 13:15, Stephen Warren <swarren@wwwdotorg.org> wrote:
> From: Stephen Warren <swarren@nvidia.com>
>
> Now that clock and reset drivers exist for Tegra186, we can enable the SD
> card controller. Now that a BPMP I2C driver exists for Tegra186, we can
> communicate with the PMIC to enable power to the SD card. Hook up the DT
> content and board code required to make the SD card work.
>
> Signed-off-by: Stephen Warren <swarren@nvidia.com>
> ---
>  arch/arm/dts/tegra186-p2771-0000-a02.dts |  5 +++++
>  arch/arm/dts/tegra186-p2771-0000-b00.dts |  5 +++++
>  arch/arm/dts/tegra186-p2771-0000.dtsi    | 14 ++++++++++++++
>  board/nvidia/p2771-0000/p2771-0000.c     | 26 ++++++++++++++++++++++++++
>  configs/p2771-0000-a02_defconfig         |  1 +
>  configs/p2771-0000-b00_defconfig         |  1 +
>  6 files changed, 52 insertions(+)
>
> diff --git a/arch/arm/dts/tegra186-p2771-0000-a02.dts b/arch/arm/dts/tegra186-p2771-0000-a02.dts
> index 70f4326c0913..5ed3817a41c6 100644
> --- a/arch/arm/dts/tegra186-p2771-0000-a02.dts
> +++ b/arch/arm/dts/tegra186-p2771-0000-a02.dts
> @@ -5,4 +5,9 @@
>  / {
>         model = "NVIDIA P2771-0000 A02";
>         compatible = "nvidia,p2771-0000-a02", "nvidia,p2771-0000", "nvidia,tegra186";
> +
> +       sdhci@3400000 {
> +               cd-gpios = <&gpio_main TEGRA_MAIN_GPIO(P, 6) GPIO_ACTIVE_LOW>;
> +               power-gpios = <&gpio_main TEGRA_MAIN_GPIO(P, 5) GPIO_ACTIVE_HIGH>;
> +       };
>  };
> diff --git a/arch/arm/dts/tegra186-p2771-0000-b00.dts b/arch/arm/dts/tegra186-p2771-0000-b00.dts
> index 2384a65e870a..90c99c33ccc6 100644
> --- a/arch/arm/dts/tegra186-p2771-0000-b00.dts
> +++ b/arch/arm/dts/tegra186-p2771-0000-b00.dts
> @@ -5,4 +5,9 @@
>  / {
>         model = "NVIDIA P2771-0000 B00";
>         compatible = "nvidia,p2771-0000-b00", "nvidia,p2771-0000", "nvidia,tegra186";
> +
> +       sdhci@3400000 {
> +               cd-gpios = <&gpio_main TEGRA_MAIN_GPIO(P, 5) GPIO_ACTIVE_LOW>;
> +               power-gpios = <&gpio_main TEGRA_MAIN_GPIO(P, 6) GPIO_ACTIVE_HIGH>;
> +       };
>  };
> diff --git a/arch/arm/dts/tegra186-p2771-0000.dtsi b/arch/arm/dts/tegra186-p2771-0000.dtsi
> index 4e2b6fbf97f8..d867674fd04e 100644
> --- a/arch/arm/dts/tegra186-p2771-0000.dtsi
> +++ b/arch/arm/dts/tegra186-p2771-0000.dtsi
> @@ -10,6 +10,8 @@
>
>         aliases {
>                 sdhci0 = "/sdhci@3460000";
> +               sdhci1 = "/sdhci@3400000";
> +               i2c0 = "/bpmp/i2c";
>                 i2c1 = "/i2c@3160000";
>                 i2c2 = "/i2c@c240000";
>                 i2c3 = "/i2c@3180000";
> @@ -39,6 +41,12 @@
>                 status = "okay";
>         };
>
> +       sdhci@3400000 {
> +               status = "okay";
> +               wp-gpios = <&gpio_main TEGRA_MAIN_GPIO(P, 4) GPIO_ACTIVE_HIGH>;
> +               bus-width = <4>;
> +       };
> +
>         sdhci@3460000 {
>                 status = "okay";
>                 bus-width = <8>;
> @@ -55,4 +63,10 @@
>         i2c@31e0000 {
>                 status = "okay";
>         };
> +
> +       bpmp {
> +               i2c {
> +                       status = "okay";
> +               };
> +       };
>  };
> diff --git a/board/nvidia/p2771-0000/p2771-0000.c b/board/nvidia/p2771-0000/p2771-0000.c
> index 4ba8ebc0dce8..0c828a200542 100644
> --- a/board/nvidia/p2771-0000/p2771-0000.c
> +++ b/board/nvidia/p2771-0000/p2771-0000.c
> @@ -5,3 +5,29 @@
>   */
>
>  #include <common.h>
> +#include <i2c.h>
> +#include "../p2571/max77620_init.h"
> +
> +int tegra_board_init(void)
> +{
> +       struct udevice *dev;
> +       uchar val;
> +       int ret;
> +
> +       /* Turn on MAX77620 LDO3 to 3.3V for SD card power */
> +       debug("%s: Set LDO3 for VDDIO_SDMMC_AP power to 3.3V\n", __func__);
> +       ret = i2c_get_chip_for_busnum(0, MAX77620_I2C_ADDR_7BIT, 1, &dev);
> +       if (ret) {
> +               printf("%s: Cannot find MAX77620 I2C chip\n", __func__);
> +               return ret;
> +       }
> +       /* 0xF2 for 3.3v, enabled: bit7:6 = 11 = enable, bit5:0 = voltage */
> +       val = 0xF2;
> +       ret = dm_i2c_write(dev, MAX77620_CNFG1_L3_REG, &val, 1);
> +       if (ret) {
> +               printf("i2c_write 0 0x3c 0x27 failed: %d\n", ret);
> +               return ret;
> +       }

Can you add a simple pmic driver for this? It's really easy and avoids
the horrible busnum stuff. The i2c_get_chip_for_busnum() should
ideally not be used.

> +
> +       return 0;
> +}
> diff --git a/configs/p2771-0000-a02_defconfig b/configs/p2771-0000-a02_defconfig
> index 1fe25f58f199..404f7acf7ef5 100644
> --- a/configs/p2771-0000-a02_defconfig
> +++ b/configs/p2771-0000-a02_defconfig
> @@ -26,6 +26,7 @@ CONFIG_CMD_EXT4=y
>  CONFIG_CMD_EXT4_WRITE=y
>  CONFIG_CMD_FAT=y
>  CONFIG_CMD_FS_GENERIC=y
> +CONFIG_TEGRA186_BPMP_I2C=y
>  CONFIG_SYS_NS16550=y
>  CONFIG_USB=y
>  CONFIG_DM_USB=y
> diff --git a/configs/p2771-0000-b00_defconfig b/configs/p2771-0000-b00_defconfig
> index 552fb6cec78b..ad35c99bbbcc 100644
> --- a/configs/p2771-0000-b00_defconfig
> +++ b/configs/p2771-0000-b00_defconfig
> @@ -26,6 +26,7 @@ CONFIG_CMD_EXT4=y
>  CONFIG_CMD_EXT4_WRITE=y
>  CONFIG_CMD_FAT=y
>  CONFIG_CMD_FS_GENERIC=y
> +CONFIG_TEGRA186_BPMP_I2C=y
>  CONFIG_SYS_NS16550=y
>  CONFIG_USB=y
>  CONFIG_DM_USB=y
> --
> 2.9.2
>

Regards,
Simon
Simon Glass Aug. 4, 2016, 1:16 a.m. UTC | #2
Hi Stephen,

On 1 August 2016 at 10:02, Stephen Warren <swarren@wwwdotorg.org> wrote:
> On 07/31/2016 07:04 PM, Simon Glass wrote:
>>
>> Hi Stephen,
>>
>> On 29 July 2016 at 13:15, Stephen Warren <swarren@wwwdotorg.org> wrote:
>>>
>>> From: Stephen Warren <swarren@nvidia.com>
>>>
>>> Now that clock and reset drivers exist for Tegra186, we can enable the SD
>>> card controller. Now that a BPMP I2C driver exists for Tegra186, we can
>>> communicate with the PMIC to enable power to the SD card. Hook up the DT
>>> content and board code required to make the SD card work.
>
>
>>> diff --git a/board/nvidia/p2771-0000/p2771-0000.c
>>> b/board/nvidia/p2771-0000/p2771-0000.c
>
>
>>> +int tegra_board_init(void)
>>> +{
>>> +       struct udevice *dev;
>>> +       uchar val;
>>> +       int ret;
>>> +
>>> +       /* Turn on MAX77620 LDO3 to 3.3V for SD card power */
>>> +       debug("%s: Set LDO3 for VDDIO_SDMMC_AP power to 3.3V\n",
>>> __func__);
>>> +       ret = i2c_get_chip_for_busnum(0, MAX77620_I2C_ADDR_7BIT, 1,
>>> &dev);
>>> +       if (ret) {
>>> +               printf("%s: Cannot find MAX77620 I2C chip\n", __func__);
>>> +               return ret;
>>> +       }
>>> +       /* 0xF2 for 3.3v, enabled: bit7:6 = 11 = enable, bit5:0 = voltage
>>> */
>>> +       val = 0xF2;
>>> +       ret = dm_i2c_write(dev, MAX77620_CNFG1_L3_REG, &val, 1);
>>> +       if (ret) {
>>> +               printf("i2c_write 0 0x3c 0x27 failed: %d\n", ret);
>>> +               return ret;
>>> +       }
>>
>>
>> Can you add a simple pmic driver for this? It's really easy and avoids
>> the horrible busnum stuff. The i2c_get_chip_for_busnum() should
>> ideally not be used.
>
>
> Perhaps we can defer that until later?
>
> FWIW, this current approach is used by all/most Tegra boards and works great
> for now. If converting this kind of code to use the PMIC infra-structure,
> I'd rather take a pass and do all Tegra boards at once, but equally I'd
> rather not hold up the Tegra186 patches behind yet another common API
> conversion; there are already 3 new common APIs introduced for Tegra in the
> Tegra186 support...

OK, will I remember this coming up previously, so I look forward to it
getting sorted out. It really isn't that much work to write a PMIC
driver.

Regards,
Simon
diff mbox

Patch

diff --git a/arch/arm/dts/tegra186-p2771-0000-a02.dts b/arch/arm/dts/tegra186-p2771-0000-a02.dts
index 70f4326c0913..5ed3817a41c6 100644
--- a/arch/arm/dts/tegra186-p2771-0000-a02.dts
+++ b/arch/arm/dts/tegra186-p2771-0000-a02.dts
@@ -5,4 +5,9 @@ 
 / {
 	model = "NVIDIA P2771-0000 A02";
 	compatible = "nvidia,p2771-0000-a02", "nvidia,p2771-0000", "nvidia,tegra186";
+
+	sdhci@3400000 {
+		cd-gpios = <&gpio_main TEGRA_MAIN_GPIO(P, 6) GPIO_ACTIVE_LOW>;
+		power-gpios = <&gpio_main TEGRA_MAIN_GPIO(P, 5) GPIO_ACTIVE_HIGH>;
+	};
 };
diff --git a/arch/arm/dts/tegra186-p2771-0000-b00.dts b/arch/arm/dts/tegra186-p2771-0000-b00.dts
index 2384a65e870a..90c99c33ccc6 100644
--- a/arch/arm/dts/tegra186-p2771-0000-b00.dts
+++ b/arch/arm/dts/tegra186-p2771-0000-b00.dts
@@ -5,4 +5,9 @@ 
 / {
 	model = "NVIDIA P2771-0000 B00";
 	compatible = "nvidia,p2771-0000-b00", "nvidia,p2771-0000", "nvidia,tegra186";
+
+	sdhci@3400000 {
+		cd-gpios = <&gpio_main TEGRA_MAIN_GPIO(P, 5) GPIO_ACTIVE_LOW>;
+		power-gpios = <&gpio_main TEGRA_MAIN_GPIO(P, 6) GPIO_ACTIVE_HIGH>;
+	};
 };
diff --git a/arch/arm/dts/tegra186-p2771-0000.dtsi b/arch/arm/dts/tegra186-p2771-0000.dtsi
index 4e2b6fbf97f8..d867674fd04e 100644
--- a/arch/arm/dts/tegra186-p2771-0000.dtsi
+++ b/arch/arm/dts/tegra186-p2771-0000.dtsi
@@ -10,6 +10,8 @@ 
 
 	aliases {
 		sdhci0 = "/sdhci@3460000";
+		sdhci1 = "/sdhci@3400000";
+		i2c0 = "/bpmp/i2c";
 		i2c1 = "/i2c@3160000";
 		i2c2 = "/i2c@c240000";
 		i2c3 = "/i2c@3180000";
@@ -39,6 +41,12 @@ 
 		status = "okay";
 	};
 
+	sdhci@3400000 {
+		status = "okay";
+		wp-gpios = <&gpio_main TEGRA_MAIN_GPIO(P, 4) GPIO_ACTIVE_HIGH>;
+		bus-width = <4>;
+	};
+
 	sdhci@3460000 {
 		status = "okay";
 		bus-width = <8>;
@@ -55,4 +63,10 @@ 
 	i2c@31e0000 {
 		status = "okay";
 	};
+
+	bpmp {
+		i2c {
+			status = "okay";
+		};
+	};
 };
diff --git a/board/nvidia/p2771-0000/p2771-0000.c b/board/nvidia/p2771-0000/p2771-0000.c
index 4ba8ebc0dce8..0c828a200542 100644
--- a/board/nvidia/p2771-0000/p2771-0000.c
+++ b/board/nvidia/p2771-0000/p2771-0000.c
@@ -5,3 +5,29 @@ 
  */
 
 #include <common.h>
+#include <i2c.h>
+#include "../p2571/max77620_init.h"
+
+int tegra_board_init(void)
+{
+	struct udevice *dev;
+	uchar val;
+	int ret;
+
+	/* Turn on MAX77620 LDO3 to 3.3V for SD card power */
+	debug("%s: Set LDO3 for VDDIO_SDMMC_AP power to 3.3V\n", __func__);
+	ret = i2c_get_chip_for_busnum(0, MAX77620_I2C_ADDR_7BIT, 1, &dev);
+	if (ret) {
+		printf("%s: Cannot find MAX77620 I2C chip\n", __func__);
+		return ret;
+	}
+	/* 0xF2 for 3.3v, enabled: bit7:6 = 11 = enable, bit5:0 = voltage */
+	val = 0xF2;
+	ret = dm_i2c_write(dev, MAX77620_CNFG1_L3_REG, &val, 1);
+	if (ret) {
+		printf("i2c_write 0 0x3c 0x27 failed: %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
diff --git a/configs/p2771-0000-a02_defconfig b/configs/p2771-0000-a02_defconfig
index 1fe25f58f199..404f7acf7ef5 100644
--- a/configs/p2771-0000-a02_defconfig
+++ b/configs/p2771-0000-a02_defconfig
@@ -26,6 +26,7 @@  CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
+CONFIG_TEGRA186_BPMP_I2C=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_DM_USB=y
diff --git a/configs/p2771-0000-b00_defconfig b/configs/p2771-0000-b00_defconfig
index 552fb6cec78b..ad35c99bbbcc 100644
--- a/configs/p2771-0000-b00_defconfig
+++ b/configs/p2771-0000-b00_defconfig
@@ -26,6 +26,7 @@  CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
+CONFIG_TEGRA186_BPMP_I2C=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_DM_USB=y