Commit d9e33b59 authored by Stephen Warren's avatar Stephen Warren

Merge branch 'for-3.5/usb-ulpi' into for-3.5/dt2-new

parents 8c6a3852 563da21b
...@@ -12,6 +12,9 @@ Required properties : ...@@ -12,6 +12,9 @@ Required properties :
- nvidia,vbus-gpio : If present, specifies a gpio that needs to be - nvidia,vbus-gpio : If present, specifies a gpio that needs to be
activated for the bus to be powered. activated for the bus to be powered.
Required properties for phy_type == ulpi:
- nvidia,phy-reset-gpio : The GPIO used to reset the PHY.
Optional properties: Optional properties:
- dr_mode : dual role mode. Indicates the working mode for - dr_mode : dual role mode. Indicates the working mode for
nvidia,tegra20-ehci compatible controllers. Can be "host", "peripheral", nvidia,tegra20-ehci compatible controllers. Can be "host", "peripheral",
......
...@@ -167,28 +167,28 @@ uca { ...@@ -167,28 +167,28 @@ uca {
}; };
conf_ata { conf_ata {
nvidia,pins = "ata", "atb", "atc", "atd", "ate", nvidia,pins = "ata", "atb", "atc", "atd", "ate",
"cdev1", "dap1", "dtb", "gma", "gmb", "cdev1", "cdev2", "dap1", "dtb", "gma",
"gmc", "gmd", "gme", "gpu7", "gpv", "gmb", "gmc", "gmd", "gme", "gpu7",
"i2cp", "pta", "rm", "slxa", "slxk", "gpv", "i2cp", "pta", "rm", "slxa",
"spia", "spib"; "slxk", "spia", "spib", "uac";
nvidia,pull = <0>; nvidia,pull = <0>;
nvidia,tristate = <0>; nvidia,tristate = <0>;
}; };
conf_cdev2 {
nvidia,pins = "cdev2", "csus", "spid", "spif";
nvidia,pull = <1>;
nvidia,tristate = <1>;
};
conf_ck32 { conf_ck32 {
nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", nvidia,pins = "ck32", "ddrc", "pmca", "pmcb",
"pmcc", "pmcd", "pmce", "xm2c", "xm2d"; "pmcc", "pmcd", "pmce", "xm2c", "xm2d";
nvidia,pull = <0>; nvidia,pull = <0>;
}; };
conf_csus {
nvidia,pins = "csus", "spid", "spif";
nvidia,pull = <1>;
nvidia,tristate = <1>;
};
conf_crtp { conf_crtp {
nvidia,pins = "crtp", "dap2", "dap3", "dap4", nvidia,pins = "crtp", "dap2", "dap3", "dap4",
"dtc", "dte", "dtf", "gpu", "sdio1", "dtc", "dte", "dtf", "gpu", "sdio1",
"slxc", "slxd", "spdi", "spdo", "spig", "slxc", "slxd", "spdi", "spdo", "spig",
"uac", "uda"; "uda";
nvidia,pull = <0>; nvidia,pull = <0>;
nvidia,tristate = <1>; nvidia,tristate = <1>;
}; };
...@@ -336,4 +336,8 @@ sdhci@c8000600 { ...@@ -336,4 +336,8 @@ sdhci@c8000600 {
power-gpios = <&gpio 70 0>; /* gpio PI6 */ power-gpios = <&gpio 70 0>; /* gpio PI6 */
support-8bit; support-8bit;
}; };
usb@c5004000 {
nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */
};
}; };
...@@ -159,18 +159,14 @@ uca { ...@@ -159,18 +159,14 @@ uca {
}; };
conf_ata { conf_ata {
nvidia,pins = "ata", "atb", "atc", "atd", "ate", nvidia,pins = "ata", "atb", "atc", "atd", "ate",
"cdev1", "dap1", "dap2", "dtf", "gma", "cdev1", "cdev2", "dap1", "dap2", "dtf",
"gmb", "gmc", "gmd", "gme", "gpu", "gma", "gmb", "gmc", "gmd", "gme",
"gpu7", "gpv", "i2cp", "pta", "rm", "gpu", "gpu7", "gpv", "i2cp", "pta",
"sdio1", "slxk", "spdo", "uac", "uda"; "rm", "sdio1", "slxk", "spdo", "uac",
"uda";
nvidia,pull = <0>; nvidia,pull = <0>;
nvidia,tristate = <0>; nvidia,tristate = <0>;
}; };
conf_cdev2 {
nvidia,pins = "cdev2";
nvidia,pull = <1>;
nvidia,tristate = <0>;
};
conf_ck32 { conf_ck32 {
nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", nvidia,pins = "ck32", "ddrc", "pmca", "pmcb",
"pmcc", "pmcd", "pmce", "xm2c", "xm2d"; "pmcc", "pmcd", "pmce", "xm2c", "xm2d";
...@@ -351,4 +347,8 @@ wifi { ...@@ -351,4 +347,8 @@ wifi {
linux,default-trigger = "rfkill0"; linux,default-trigger = "rfkill0";
}; };
}; };
usb@c5004000 {
nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */
};
}; };
...@@ -415,4 +415,8 @@ emc-table@380000 { ...@@ -415,4 +415,8 @@ emc-table@380000 {
0x00000000 0x00000000 0x00000000 0x00000000 >; 0x00000000 0x00000000 0x00000000 0x00000000 >;
}; };
}; };
usb@c5004000 {
nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */
};
}; };
...@@ -182,23 +182,23 @@ conf_ata { ...@@ -182,23 +182,23 @@ conf_ata {
nvidia,tristate = <1>; nvidia,tristate = <1>;
}; };
conf_atb { conf_atb {
nvidia,pins = "atb", "cdev1", "dap1", "gma", nvidia,pins = "atb", "cdev1", "cdev2", "dap1",
"gmc", "gmd", "gpu", "gpu7", "gpv", "gma", "gmc", "gmd", "gpu", "gpu7",
"sdio1", "slxa", "slxk", "uac"; "gpv", "sdio1", "slxa", "slxk", "uac";
nvidia,pull = <0>; nvidia,pull = <0>;
nvidia,tristate = <0>; nvidia,tristate = <0>;
}; };
conf_cdev2 {
nvidia,pins = "cdev2", "csus", "spia", "spib",
"spid", "spif";
nvidia,pull = <1>;
nvidia,tristate = <1>;
};
conf_ck32 { conf_ck32 {
nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", nvidia,pins = "ck32", "ddrc", "pmca", "pmcb",
"pmcc", "pmcd", "pmce", "xm2c", "xm2d"; "pmcc", "pmcd", "pmce", "xm2c", "xm2d";
nvidia,pull = <0>; nvidia,pull = <0>;
}; };
conf_csus {
nvidia,pins = "csus", "spia", "spib",
"spid", "spif";
nvidia,pull = <1>;
nvidia,tristate = <1>;
};
conf_ddc { conf_ddc {
nvidia,pins = "ddc", "dtf", "rm", "sdc", "sdd"; nvidia,pins = "ddc", "dtf", "rm", "sdc", "sdd";
nvidia,pull = <2>; nvidia,pull = <2>;
...@@ -304,4 +304,8 @@ sdhci@c8000600 { ...@@ -304,4 +304,8 @@ sdhci@c8000600 {
cd-gpios = <&gpio 121 0>; cd-gpios = <&gpio 121 0>;
wp-gpios = <&gpio 122 0>; wp-gpios = <&gpio 122 0>;
}; };
usb@c5004000 {
nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */
};
}; };
...@@ -335,4 +335,8 @@ sdhci@c8000400 { ...@@ -335,4 +335,8 @@ sdhci@c8000400 {
sdhci@c8000600 { sdhci@c8000600 {
support-8bit; support-8bit;
}; };
usb@c5004000 {
nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */
};
}; };
...@@ -159,6 +159,8 @@ static void paz00_i2c_init(void) ...@@ -159,6 +159,8 @@ static void paz00_i2c_init(void)
static void paz00_usb_init(void) static void paz00_usb_init(void)
{ {
tegra_ehci2_ulpi_phy_config.reset_gpio = TEGRA_ULPI_RST;
platform_device_register(&tegra_ehci2_device); platform_device_register(&tegra_ehci2_device);
platform_device_register(&tegra_ehci3_device); platform_device_register(&tegra_ehci3_device);
} }
...@@ -176,7 +178,6 @@ static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = { ...@@ -176,7 +178,6 @@ static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = {
{ "uarta", "pll_p", 216000000, true }, { "uarta", "pll_p", 216000000, true },
{ "uartc", "pll_p", 216000000, true }, { "uartc", "pll_p", 216000000, true },
{ "pll_p_out4", "pll_p", 24000000, true },
{ "usbd", "clk_m", 12000000, false }, { "usbd", "clk_m", 12000000, false },
{ "usb2", "clk_m", 12000000, false }, { "usb2", "clk_m", 12000000, false },
{ "usb3", "clk_m", 12000000, false }, { "usb3", "clk_m", 12000000, false },
......
...@@ -117,6 +117,8 @@ static void trimslice_usb_init(void) ...@@ -117,6 +117,8 @@ static void trimslice_usb_init(void)
pdata = tegra_ehci1_device.dev.platform_data; pdata = tegra_ehci1_device.dev.platform_data;
pdata->vbus_gpio = TRIMSLICE_GPIO_USB1_MODE; pdata->vbus_gpio = TRIMSLICE_GPIO_USB1_MODE;
tegra_ehci2_ulpi_phy_config.reset_gpio = TEGRA_GPIO_PV0;
platform_device_register(&tegra_ehci3_device); platform_device_register(&tegra_ehci3_device);
platform_device_register(&tegra_ehci2_device); platform_device_register(&tegra_ehci2_device);
platform_device_register(&tegra_ehci1_device); platform_device_register(&tegra_ehci1_device);
......
...@@ -82,10 +82,12 @@ static __initdata struct tegra_clk_init_table tegra20_clk_init_table[] = { ...@@ -82,10 +82,12 @@ static __initdata struct tegra_clk_init_table tegra20_clk_init_table[] = {
{ "pll_p_out1", "pll_p", 28800000, true }, { "pll_p_out1", "pll_p", 28800000, true },
{ "pll_p_out2", "pll_p", 48000000, true }, { "pll_p_out2", "pll_p", 48000000, true },
{ "pll_p_out3", "pll_p", 72000000, true }, { "pll_p_out3", "pll_p", 72000000, true },
{ "pll_p_out4", "pll_p", 108000000, true }, { "pll_p_out4", "pll_p", 24000000, true },
{ "sclk", "pll_p_out4", 108000000, true }, { "pll_c", "clk_m", 600000000, true },
{ "hclk", "sclk", 108000000, true }, { "pll_c_out1", "pll_c", 120000000, true },
{ "pclk", "hclk", 54000000, true }, { "sclk", "pll_c_out1", 120000000, true },
{ "hclk", "sclk", 120000000, true },
{ "pclk", "hclk", 60000000, true },
{ "csite", NULL, 0, true }, { "csite", NULL, 0, true },
{ "emc", NULL, 0, true }, { "emc", NULL, 0, true },
{ "cpu", NULL, 0, true }, { "cpu", NULL, 0, true },
......
...@@ -439,9 +439,8 @@ static struct resource tegra_usb3_resources[] = { ...@@ -439,9 +439,8 @@ static struct resource tegra_usb3_resources[] = {
}, },
}; };
static struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = { struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = {
/* All existing boards use GPIO PV0 for phy reset */ .reset_gpio = -1,
.reset_gpio = TEGRA_GPIO_PV0,
.clk = "cdev2", .clk = "cdev2",
}; };
......
...@@ -22,6 +22,10 @@ ...@@ -22,6 +22,10 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/platform_data/tegra_usb.h> #include <linux/platform_data/tegra_usb.h>
#include <mach/usb_phy.h>
extern struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config;
extern struct tegra_ehci_platform_data tegra_ehci1_pdata; extern struct tegra_ehci_platform_data tegra_ehci1_pdata;
extern struct tegra_ehci_platform_data tegra_ehci2_pdata; extern struct tegra_ehci_platform_data tegra_ehci2_pdata;
extern struct tegra_ehci_platform_data tegra_ehci3_pdata; extern struct tegra_ehci_platform_data tegra_ehci3_pdata;
......
...@@ -61,8 +61,8 @@ struct tegra_usb_phy { ...@@ -61,8 +61,8 @@ struct tegra_usb_phy {
struct usb_phy *ulpi; struct usb_phy *ulpi;
}; };
struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,
void *config, enum tegra_usb_phy_mode phy_mode); void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode);
int tegra_usb_phy_power_on(struct tegra_usb_phy *phy); int tegra_usb_phy_power_on(struct tegra_usb_phy *phy);
......
...@@ -1486,6 +1486,10 @@ static struct clk tegra_clk_m = { ...@@ -1486,6 +1486,10 @@ static struct clk tegra_clk_m = {
}; };
static struct clk_pll_freq_table tegra_pll_c_freq_table[] = { static struct clk_pll_freq_table tegra_pll_c_freq_table[] = {
{ 12000000, 600000000, 600, 12, 1, 8 },
{ 13000000, 600000000, 600, 13, 1, 8 },
{ 19200000, 600000000, 500, 16, 1, 6 },
{ 26000000, 600000000, 600, 26, 1, 8 },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
}; };
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/usb/otg.h> #include <linux/usb/otg.h>
#include <linux/usb/ulpi.h> #include <linux/usb/ulpi.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
...@@ -654,8 +655,8 @@ static void ulpi_phy_power_off(struct tegra_usb_phy *phy) ...@@ -654,8 +655,8 @@ static void ulpi_phy_power_off(struct tegra_usb_phy *phy)
clk_disable(phy->clk); clk_disable(phy->clk);
} }
struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,
void *config, enum tegra_usb_phy_mode phy_mode) void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode)
{ {
struct tegra_usb_phy *phy; struct tegra_usb_phy *phy;
struct tegra_ulpi_config *ulpi_config; struct tegra_ulpi_config *ulpi_config;
...@@ -711,6 +712,16 @@ struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, ...@@ -711,6 +712,16 @@ struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs,
err = -ENXIO; err = -ENXIO;
goto err1; goto err1;
} }
if (!gpio_is_valid(ulpi_config->reset_gpio))
ulpi_config->reset_gpio =
of_get_named_gpio(dev->of_node,
"nvidia,phy-reset-gpio", 0);
if (!gpio_is_valid(ulpi_config->reset_gpio)) {
pr_err("%s: invalid reset gpio: %d\n", __func__,
ulpi_config->reset_gpio);
err = -EINVAL;
goto err1;
}
gpio_request(ulpi_config->reset_gpio, "ulpi_phy_reset_b"); gpio_request(ulpi_config->reset_gpio, "ulpi_phy_reset_b");
gpio_direction_output(ulpi_config->reset_gpio, 0); gpio_direction_output(ulpi_config->reset_gpio, 0);
phy->ulpi = otg_ulpi_create(&ulpi_viewport_access_ops, 0); phy->ulpi = otg_ulpi_create(&ulpi_viewport_access_ops, 0);
......
...@@ -708,8 +708,9 @@ static int tegra_ehci_probe(struct platform_device *pdev) ...@@ -708,8 +708,9 @@ static int tegra_ehci_probe(struct platform_device *pdev)
} }
} }
tegra->phy = tegra_usb_phy_open(instance, hcd->regs, pdata->phy_config, tegra->phy = tegra_usb_phy_open(&pdev->dev, instance, hcd->regs,
TEGRA_USB_PHY_MODE_HOST); pdata->phy_config,
TEGRA_USB_PHY_MODE_HOST);
if (IS_ERR(tegra->phy)) { if (IS_ERR(tegra->phy)) {
dev_err(&pdev->dev, "Failed to open USB phy\n"); dev_err(&pdev->dev, "Failed to open USB phy\n");
err = -ENXIO; err = -ENXIO;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment