usb: musb-new: sunxi: Allocate struct phy in private
Allocate struct phy in private structure instead of allocating locally and assign it to a pointer. This eventually fix miss alignment phy which is used in another functions. Tested-by: Chen-Yu Tsai <wens@csie.org> # A33-OlinuXino Tested-by: Jagan Teki <jagan@amarulasolutions.com> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
This commit is contained in:
@@ -87,7 +87,7 @@ struct sunxi_glue {
|
|||||||
struct sunxi_ccm_reg *ccm;
|
struct sunxi_ccm_reg *ccm;
|
||||||
struct sunxi_musb_config *cfg;
|
struct sunxi_musb_config *cfg;
|
||||||
struct device dev;
|
struct device dev;
|
||||||
struct phy *phy;
|
struct phy phy;
|
||||||
};
|
};
|
||||||
#define to_sunxi_glue(d) container_of(d, struct sunxi_glue, dev)
|
#define to_sunxi_glue(d) container_of(d, struct sunxi_glue, dev)
|
||||||
|
|
||||||
@@ -235,19 +235,19 @@ static int sunxi_musb_enable(struct musb *musb)
|
|||||||
musb_writeb(musb->mregs, USBC_REG_o_VEND0, 0);
|
musb_writeb(musb->mregs, USBC_REG_o_VEND0, 0);
|
||||||
|
|
||||||
if (is_host_enabled(musb)) {
|
if (is_host_enabled(musb)) {
|
||||||
ret = sun4i_usb_phy_vbus_detect(glue->phy);
|
ret = sun4i_usb_phy_vbus_detect(&glue->phy);
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
printf("A charger is plugged into the OTG: ");
|
printf("A charger is plugged into the OTG: ");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = sun4i_usb_phy_id_detect(glue->phy);
|
ret = sun4i_usb_phy_id_detect(&glue->phy);
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
printf("No host cable detected: ");
|
printf("No host cable detected: ");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = generic_phy_power_on(glue->phy);
|
ret = generic_phy_power_on(&glue->phy);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("failed to power on USB PHY\n");
|
pr_err("failed to power on USB PHY\n");
|
||||||
return ret;
|
return ret;
|
||||||
@@ -271,7 +271,7 @@ static void sunxi_musb_disable(struct musb *musb)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (is_host_enabled(musb)) {
|
if (is_host_enabled(musb)) {
|
||||||
ret = generic_phy_power_off(glue->phy);
|
ret = generic_phy_power_off(&glue->phy);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("failed to power off USB PHY\n");
|
pr_err("failed to power off USB PHY\n");
|
||||||
return;
|
return;
|
||||||
@@ -291,7 +291,7 @@ static int sunxi_musb_init(struct musb *musb)
|
|||||||
|
|
||||||
pr_debug("%s():\n", __func__);
|
pr_debug("%s():\n", __func__);
|
||||||
|
|
||||||
ret = generic_phy_init(glue->phy);
|
ret = generic_phy_init(&glue->phy);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("failed to init USB PHY\n");
|
pr_err("failed to init USB PHY\n");
|
||||||
return ret;
|
return ret;
|
||||||
@@ -330,14 +330,14 @@ static void sunxi_musb_pre_root_reset_end(struct musb *musb)
|
|||||||
{
|
{
|
||||||
struct sunxi_glue *glue = to_sunxi_glue(musb->controller);
|
struct sunxi_glue *glue = to_sunxi_glue(musb->controller);
|
||||||
|
|
||||||
sun4i_usb_phy_set_squelch_detect(glue->phy, false);
|
sun4i_usb_phy_set_squelch_detect(&glue->phy, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sunxi_musb_post_root_reset_end(struct musb *musb)
|
static void sunxi_musb_post_root_reset_end(struct musb *musb)
|
||||||
{
|
{
|
||||||
struct sunxi_glue *glue = to_sunxi_glue(musb->controller);
|
struct sunxi_glue *glue = to_sunxi_glue(musb->controller);
|
||||||
|
|
||||||
sun4i_usb_phy_set_squelch_detect(glue->phy, true);
|
sun4i_usb_phy_set_squelch_detect(&glue->phy, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct musb_platform_ops sunxi_musb_ops = {
|
static const struct musb_platform_ops sunxi_musb_ops = {
|
||||||
@@ -405,7 +405,6 @@ static int musb_usb_probe(struct udevice *dev)
|
|||||||
struct usb_bus_priv *priv = dev_get_uclass_priv(dev);
|
struct usb_bus_priv *priv = dev_get_uclass_priv(dev);
|
||||||
struct musb_hdrc_platform_data pdata;
|
struct musb_hdrc_platform_data pdata;
|
||||||
void *base = dev_read_addr_ptr(dev);
|
void *base = dev_read_addr_ptr(dev);
|
||||||
struct phy phy;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!base)
|
if (!base)
|
||||||
@@ -419,13 +418,12 @@ static int musb_usb_probe(struct udevice *dev)
|
|||||||
if (IS_ERR(glue->ccm))
|
if (IS_ERR(glue->ccm))
|
||||||
return PTR_ERR(glue->ccm);
|
return PTR_ERR(glue->ccm);
|
||||||
|
|
||||||
ret = generic_phy_get_by_name(dev, "usb", &phy);
|
ret = generic_phy_get_by_name(dev, "usb", &glue->phy);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("failed to get usb PHY\n");
|
pr_err("failed to get usb PHY\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
glue->phy = &phy;
|
|
||||||
priv->desc_before_addr = true;
|
priv->desc_before_addr = true;
|
||||||
|
|
||||||
memset(&pdata, 0, sizeof(pdata));
|
memset(&pdata, 0, sizeof(pdata));
|
||||||
@@ -460,8 +458,8 @@ static int musb_usb_remove(struct udevice *dev)
|
|||||||
struct musb_host_data *host = &glue->mdata;
|
struct musb_host_data *host = &glue->mdata;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (generic_phy_valid(glue->phy)) {
|
if (generic_phy_valid(&glue->phy)) {
|
||||||
ret = generic_phy_exit(glue->phy);
|
ret = generic_phy_exit(&glue->phy);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("failed to exit %s USB PHY\n", dev->name);
|
pr_err("failed to exit %s USB PHY\n", dev->name);
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user