Commit 17495bda authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'fixes-for-v4.0-rc2' of...

Merge tag 'fixes-for-v4.0-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus

Felipe writes:

usb: fixes for v4.0-rc2

Not that many fixes this time. They have all been tested on
platforms I have around and also passed my randconfig builds.

Here's a quick summary of the changes:

Phonet function learned to not disable a disabled endpoint.

musb received a pm_runtime_irq_safe() call to fix a bug when
calling musb_pullup() (via usb_gadget_{connect,disconnect}())
with irqs disabled.

musb also got a really old fix for throughput with isochronous
endpoints by pushing URB completion to a tasklet (by means of
HCD_BH flag).

musb now can properly get its phys on musb-dsps platforms (am335x
as of now).

musb learned how to read boolean OF properties.

Old bug on how to disable dwc3-omap's IRQs got fixed finally.

A few sparse warnings here and there.

Renesas got a linkage fix.
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parents c517d838 a0456399
...@@ -205,6 +205,18 @@ static void dwc3_omap_write_irq0_set(struct dwc3_omap *omap, u32 value) ...@@ -205,6 +205,18 @@ static void dwc3_omap_write_irq0_set(struct dwc3_omap *omap, u32 value)
omap->irq0_offset, value); omap->irq0_offset, value);
} }
static void dwc3_omap_write_irqmisc_clr(struct dwc3_omap *omap, u32 value)
{
dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_CLR_MISC +
omap->irqmisc_offset, value);
}
static void dwc3_omap_write_irq0_clr(struct dwc3_omap *omap, u32 value)
{
dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_CLR_0 -
omap->irq0_offset, value);
}
static void dwc3_omap_set_mailbox(struct dwc3_omap *omap, static void dwc3_omap_set_mailbox(struct dwc3_omap *omap,
enum omap_dwc3_vbus_id_status status) enum omap_dwc3_vbus_id_status status)
{ {
...@@ -345,9 +357,23 @@ static void dwc3_omap_enable_irqs(struct dwc3_omap *omap) ...@@ -345,9 +357,23 @@ static void dwc3_omap_enable_irqs(struct dwc3_omap *omap)
static void dwc3_omap_disable_irqs(struct dwc3_omap *omap) static void dwc3_omap_disable_irqs(struct dwc3_omap *omap)
{ {
u32 reg;
/* disable all IRQs */ /* disable all IRQs */
dwc3_omap_write_irqmisc_set(omap, 0x00); reg = USBOTGSS_IRQO_COREIRQ_ST;
dwc3_omap_write_irq0_set(omap, 0x00); dwc3_omap_write_irq0_clr(omap, reg);
reg = (USBOTGSS_IRQMISC_OEVT |
USBOTGSS_IRQMISC_DRVVBUS_RISE |
USBOTGSS_IRQMISC_CHRGVBUS_RISE |
USBOTGSS_IRQMISC_DISCHRGVBUS_RISE |
USBOTGSS_IRQMISC_IDPULLUP_RISE |
USBOTGSS_IRQMISC_DRVVBUS_FALL |
USBOTGSS_IRQMISC_CHRGVBUS_FALL |
USBOTGSS_IRQMISC_DISCHRGVBUS_FALL |
USBOTGSS_IRQMISC_IDPULLUP_FALL);
dwc3_omap_write_irqmisc_clr(omap, reg);
} }
static u64 dwc3_omap_dma_mask = DMA_BIT_MASK(32); static u64 dwc3_omap_dma_mask = DMA_BIT_MASK(32);
......
...@@ -1161,7 +1161,6 @@ static ssize_t interf_grp_compatible_id_store(struct usb_os_desc *desc, ...@@ -1161,7 +1161,6 @@ static ssize_t interf_grp_compatible_id_store(struct usb_os_desc *desc,
if (desc->opts_mutex) if (desc->opts_mutex)
mutex_lock(desc->opts_mutex); mutex_lock(desc->opts_mutex);
memcpy(desc->ext_compat_id, page, l); memcpy(desc->ext_compat_id, page, l);
desc->ext_compat_id[l] = '\0';
if (desc->opts_mutex) if (desc->opts_mutex)
mutex_unlock(desc->opts_mutex); mutex_unlock(desc->opts_mutex);
...@@ -1192,7 +1191,6 @@ static ssize_t interf_grp_sub_compatible_id_store(struct usb_os_desc *desc, ...@@ -1192,7 +1191,6 @@ static ssize_t interf_grp_sub_compatible_id_store(struct usb_os_desc *desc,
if (desc->opts_mutex) if (desc->opts_mutex)
mutex_lock(desc->opts_mutex); mutex_lock(desc->opts_mutex);
memcpy(desc->ext_compat_id + 8, page, l); memcpy(desc->ext_compat_id + 8, page, l);
desc->ext_compat_id[l + 8] = '\0';
if (desc->opts_mutex) if (desc->opts_mutex)
mutex_unlock(desc->opts_mutex); mutex_unlock(desc->opts_mutex);
......
...@@ -569,7 +569,7 @@ static int hidg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) ...@@ -569,7 +569,7 @@ static int hidg_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
return status; return status;
} }
const struct file_operations f_hidg_fops = { static const struct file_operations f_hidg_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = f_hidg_open, .open = f_hidg_open,
.release = f_hidg_release, .release = f_hidg_release,
......
...@@ -417,7 +417,10 @@ static int pn_set_alt(struct usb_function *f, unsigned intf, unsigned alt) ...@@ -417,7 +417,10 @@ static int pn_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
return -EINVAL; return -EINVAL;
spin_lock(&port->lock); spin_lock(&port->lock);
__pn_reset(f);
if (fp->in_ep->driver_data)
__pn_reset(f);
if (alt == 1) { if (alt == 1) {
int i; int i;
......
...@@ -344,7 +344,7 @@ static struct usb_endpoint_descriptor ss_int_source_desc = { ...@@ -344,7 +344,7 @@ static struct usb_endpoint_descriptor ss_int_source_desc = {
.bInterval = USB_MS_TO_SS_INTERVAL(GZERO_INT_INTERVAL), .bInterval = USB_MS_TO_SS_INTERVAL(GZERO_INT_INTERVAL),
}; };
struct usb_ss_ep_comp_descriptor ss_int_source_comp_desc = { static struct usb_ss_ep_comp_descriptor ss_int_source_comp_desc = {
.bLength = USB_DT_SS_EP_COMP_SIZE, .bLength = USB_DT_SS_EP_COMP_SIZE,
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP, .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
...@@ -362,7 +362,7 @@ static struct usb_endpoint_descriptor ss_int_sink_desc = { ...@@ -362,7 +362,7 @@ static struct usb_endpoint_descriptor ss_int_sink_desc = {
.bInterval = USB_MS_TO_SS_INTERVAL(GZERO_INT_INTERVAL), .bInterval = USB_MS_TO_SS_INTERVAL(GZERO_INT_INTERVAL),
}; };
struct usb_ss_ep_comp_descriptor ss_int_sink_comp_desc = { static struct usb_ss_ep_comp_descriptor ss_int_sink_comp_desc = {
.bLength = USB_DT_SS_EP_COMP_SIZE, .bLength = USB_DT_SS_EP_COMP_SIZE,
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP, .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
......
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
#define UNFLW_CTRL 8 #define UNFLW_CTRL 8
#define OVFLW_CTRL 10 #define OVFLW_CTRL 10
const char *uac2_name = "snd_uac2"; static const char *uac2_name = "snd_uac2";
struct uac2_req { struct uac2_req {
struct uac2_rtd_params *pp; /* parent param */ struct uac2_rtd_params *pp; /* parent param */
...@@ -634,7 +634,7 @@ static struct usb_interface_descriptor std_ac_if_desc = { ...@@ -634,7 +634,7 @@ static struct usb_interface_descriptor std_ac_if_desc = {
}; };
/* Clock source for IN traffic */ /* Clock source for IN traffic */
struct uac_clock_source_descriptor in_clk_src_desc = { static struct uac_clock_source_descriptor in_clk_src_desc = {
.bLength = sizeof in_clk_src_desc, .bLength = sizeof in_clk_src_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
...@@ -646,7 +646,7 @@ struct uac_clock_source_descriptor in_clk_src_desc = { ...@@ -646,7 +646,7 @@ struct uac_clock_source_descriptor in_clk_src_desc = {
}; };
/* Clock source for OUT traffic */ /* Clock source for OUT traffic */
struct uac_clock_source_descriptor out_clk_src_desc = { static struct uac_clock_source_descriptor out_clk_src_desc = {
.bLength = sizeof out_clk_src_desc, .bLength = sizeof out_clk_src_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
...@@ -658,7 +658,7 @@ struct uac_clock_source_descriptor out_clk_src_desc = { ...@@ -658,7 +658,7 @@ struct uac_clock_source_descriptor out_clk_src_desc = {
}; };
/* Input Terminal for USB_OUT */ /* Input Terminal for USB_OUT */
struct uac2_input_terminal_descriptor usb_out_it_desc = { static struct uac2_input_terminal_descriptor usb_out_it_desc = {
.bLength = sizeof usb_out_it_desc, .bLength = sizeof usb_out_it_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
...@@ -672,7 +672,7 @@ struct uac2_input_terminal_descriptor usb_out_it_desc = { ...@@ -672,7 +672,7 @@ struct uac2_input_terminal_descriptor usb_out_it_desc = {
}; };
/* Input Terminal for I/O-In */ /* Input Terminal for I/O-In */
struct uac2_input_terminal_descriptor io_in_it_desc = { static struct uac2_input_terminal_descriptor io_in_it_desc = {
.bLength = sizeof io_in_it_desc, .bLength = sizeof io_in_it_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
...@@ -686,7 +686,7 @@ struct uac2_input_terminal_descriptor io_in_it_desc = { ...@@ -686,7 +686,7 @@ struct uac2_input_terminal_descriptor io_in_it_desc = {
}; };
/* Ouput Terminal for USB_IN */ /* Ouput Terminal for USB_IN */
struct uac2_output_terminal_descriptor usb_in_ot_desc = { static struct uac2_output_terminal_descriptor usb_in_ot_desc = {
.bLength = sizeof usb_in_ot_desc, .bLength = sizeof usb_in_ot_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
...@@ -700,7 +700,7 @@ struct uac2_output_terminal_descriptor usb_in_ot_desc = { ...@@ -700,7 +700,7 @@ struct uac2_output_terminal_descriptor usb_in_ot_desc = {
}; };
/* Ouput Terminal for I/O-Out */ /* Ouput Terminal for I/O-Out */
struct uac2_output_terminal_descriptor io_out_ot_desc = { static struct uac2_output_terminal_descriptor io_out_ot_desc = {
.bLength = sizeof io_out_ot_desc, .bLength = sizeof io_out_ot_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
...@@ -713,7 +713,7 @@ struct uac2_output_terminal_descriptor io_out_ot_desc = { ...@@ -713,7 +713,7 @@ struct uac2_output_terminal_descriptor io_out_ot_desc = {
.bmControls = (CONTROL_RDWR << COPY_CTRL), .bmControls = (CONTROL_RDWR << COPY_CTRL),
}; };
struct uac2_ac_header_descriptor ac_hdr_desc = { static struct uac2_ac_header_descriptor ac_hdr_desc = {
.bLength = sizeof ac_hdr_desc, .bLength = sizeof ac_hdr_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
...@@ -751,7 +751,7 @@ static struct usb_interface_descriptor std_as_out_if1_desc = { ...@@ -751,7 +751,7 @@ static struct usb_interface_descriptor std_as_out_if1_desc = {
}; };
/* Audio Stream OUT Intface Desc */ /* Audio Stream OUT Intface Desc */
struct uac2_as_header_descriptor as_out_hdr_desc = { static struct uac2_as_header_descriptor as_out_hdr_desc = {
.bLength = sizeof as_out_hdr_desc, .bLength = sizeof as_out_hdr_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
...@@ -764,7 +764,7 @@ struct uac2_as_header_descriptor as_out_hdr_desc = { ...@@ -764,7 +764,7 @@ struct uac2_as_header_descriptor as_out_hdr_desc = {
}; };
/* Audio USB_OUT Format */ /* Audio USB_OUT Format */
struct uac2_format_type_i_descriptor as_out_fmt1_desc = { static struct uac2_format_type_i_descriptor as_out_fmt1_desc = {
.bLength = sizeof as_out_fmt1_desc, .bLength = sizeof as_out_fmt1_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubtype = UAC_FORMAT_TYPE, .bDescriptorSubtype = UAC_FORMAT_TYPE,
...@@ -772,7 +772,7 @@ struct uac2_format_type_i_descriptor as_out_fmt1_desc = { ...@@ -772,7 +772,7 @@ struct uac2_format_type_i_descriptor as_out_fmt1_desc = {
}; };
/* STD AS ISO OUT Endpoint */ /* STD AS ISO OUT Endpoint */
struct usb_endpoint_descriptor fs_epout_desc = { static struct usb_endpoint_descriptor fs_epout_desc = {
.bLength = USB_DT_ENDPOINT_SIZE, .bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT, .bDescriptorType = USB_DT_ENDPOINT,
...@@ -782,7 +782,7 @@ struct usb_endpoint_descriptor fs_epout_desc = { ...@@ -782,7 +782,7 @@ struct usb_endpoint_descriptor fs_epout_desc = {
.bInterval = 1, .bInterval = 1,
}; };
struct usb_endpoint_descriptor hs_epout_desc = { static struct usb_endpoint_descriptor hs_epout_desc = {
.bLength = USB_DT_ENDPOINT_SIZE, .bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT, .bDescriptorType = USB_DT_ENDPOINT,
...@@ -828,7 +828,7 @@ static struct usb_interface_descriptor std_as_in_if1_desc = { ...@@ -828,7 +828,7 @@ static struct usb_interface_descriptor std_as_in_if1_desc = {
}; };
/* Audio Stream IN Intface Desc */ /* Audio Stream IN Intface Desc */
struct uac2_as_header_descriptor as_in_hdr_desc = { static struct uac2_as_header_descriptor as_in_hdr_desc = {
.bLength = sizeof as_in_hdr_desc, .bLength = sizeof as_in_hdr_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
...@@ -841,7 +841,7 @@ struct uac2_as_header_descriptor as_in_hdr_desc = { ...@@ -841,7 +841,7 @@ struct uac2_as_header_descriptor as_in_hdr_desc = {
}; };
/* Audio USB_IN Format */ /* Audio USB_IN Format */
struct uac2_format_type_i_descriptor as_in_fmt1_desc = { static struct uac2_format_type_i_descriptor as_in_fmt1_desc = {
.bLength = sizeof as_in_fmt1_desc, .bLength = sizeof as_in_fmt1_desc,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubtype = UAC_FORMAT_TYPE, .bDescriptorSubtype = UAC_FORMAT_TYPE,
...@@ -849,7 +849,7 @@ struct uac2_format_type_i_descriptor as_in_fmt1_desc = { ...@@ -849,7 +849,7 @@ struct uac2_format_type_i_descriptor as_in_fmt1_desc = {
}; };
/* STD AS ISO IN Endpoint */ /* STD AS ISO IN Endpoint */
struct usb_endpoint_descriptor fs_epin_desc = { static struct usb_endpoint_descriptor fs_epin_desc = {
.bLength = USB_DT_ENDPOINT_SIZE, .bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT, .bDescriptorType = USB_DT_ENDPOINT,
...@@ -859,7 +859,7 @@ struct usb_endpoint_descriptor fs_epin_desc = { ...@@ -859,7 +859,7 @@ struct usb_endpoint_descriptor fs_epin_desc = {
.bInterval = 1, .bInterval = 1,
}; };
struct usb_endpoint_descriptor hs_epin_desc = { static struct usb_endpoint_descriptor hs_epin_desc = {
.bLength = USB_DT_ENDPOINT_SIZE, .bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT, .bDescriptorType = USB_DT_ENDPOINT,
...@@ -1563,7 +1563,7 @@ static void afunc_unbind(struct usb_configuration *c, struct usb_function *f) ...@@ -1563,7 +1563,7 @@ static void afunc_unbind(struct usb_configuration *c, struct usb_function *f)
agdev->out_ep->driver_data = NULL; agdev->out_ep->driver_data = NULL;
} }
struct usb_function *afunc_alloc(struct usb_function_instance *fi) static struct usb_function *afunc_alloc(struct usb_function_instance *fi)
{ {
struct audio_dev *agdev; struct audio_dev *agdev;
struct f_uac2_opts *opts; struct f_uac2_opts *opts;
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "uvc.h" #include "uvc.h"
#include "uvc_queue.h" #include "uvc_queue.h"
#include "uvc_video.h" #include "uvc_video.h"
#include "uvc_v4l2.h"
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
* Requests handling * Requests handling
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "uvc.h" #include "uvc.h"
#include "uvc_queue.h" #include "uvc_queue.h"
#include "uvc_video.h"
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
* Video codecs * Video codecs
......
...@@ -133,7 +133,9 @@ struct gfs_configuration { ...@@ -133,7 +133,9 @@ struct gfs_configuration {
struct usb_configuration c; struct usb_configuration c;
int (*eth)(struct usb_configuration *c); int (*eth)(struct usb_configuration *c);
int num; int num;
} gfs_configurations[] = { };
static struct gfs_configuration gfs_configurations[] = {
#ifdef CONFIG_USB_FUNCTIONFS_RNDIS #ifdef CONFIG_USB_FUNCTIONFS_RNDIS
{ {
.eth = bind_rndis_config, .eth = bind_rndis_config,
...@@ -278,7 +280,7 @@ static void *functionfs_acquire_dev(struct ffs_dev *dev) ...@@ -278,7 +280,7 @@ static void *functionfs_acquire_dev(struct ffs_dev *dev)
if (!try_module_get(THIS_MODULE)) if (!try_module_get(THIS_MODULE))
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
return 0; return NULL;
} }
static void functionfs_release_dev(struct ffs_dev *dev) static void functionfs_release_dev(struct ffs_dev *dev)
......
...@@ -1274,7 +1274,7 @@ static void errata2_function(unsigned long data) ...@@ -1274,7 +1274,7 @@ static void errata2_function(unsigned long data)
for (slot = 0; slot < 32; slot++) for (slot = 0; slot < 32; slot++)
if (priv->atl_slots[slot].qh && time_after(jiffies, if (priv->atl_slots[slot].qh && time_after(jiffies,
priv->atl_slots[slot].timestamp + priv->atl_slots[slot].timestamp +
SLOT_TIMEOUT * HZ / 1000)) { msecs_to_jiffies(SLOT_TIMEOUT))) {
ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd);
if (!FROM_DW0_VALID(ptd.dw0) && if (!FROM_DW0_VALID(ptd.dw0) &&
!FROM_DW3_ACTIVE(ptd.dw3)) !FROM_DW3_ACTIVE(ptd.dw3))
...@@ -1286,7 +1286,7 @@ static void errata2_function(unsigned long data) ...@@ -1286,7 +1286,7 @@ static void errata2_function(unsigned long data)
spin_unlock_irqrestore(&priv->lock, spinflags); spin_unlock_irqrestore(&priv->lock, spinflags);
errata2_timer.expires = jiffies + SLOT_CHECK_PERIOD * HZ / 1000; errata2_timer.expires = jiffies + msecs_to_jiffies(SLOT_CHECK_PERIOD);
add_timer(&errata2_timer); add_timer(&errata2_timer);
} }
...@@ -1336,7 +1336,7 @@ static int isp1760_run(struct usb_hcd *hcd) ...@@ -1336,7 +1336,7 @@ static int isp1760_run(struct usb_hcd *hcd)
return retval; return retval;
setup_timer(&errata2_timer, errata2_function, (unsigned long)hcd); setup_timer(&errata2_timer, errata2_function, (unsigned long)hcd);
errata2_timer.expires = jiffies + SLOT_CHECK_PERIOD * HZ / 1000; errata2_timer.expires = jiffies + msecs_to_jiffies(SLOT_CHECK_PERIOD);
add_timer(&errata2_timer); add_timer(&errata2_timer);
chipid = reg_read32(hcd->regs, HC_CHIP_ID_REG); chipid = reg_read32(hcd->regs, HC_CHIP_ID_REG);
......
...@@ -1969,10 +1969,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -1969,10 +1969,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
goto fail0; goto fail0;
} }
pm_runtime_use_autosuspend(musb->controller);
pm_runtime_set_autosuspend_delay(musb->controller, 200);
pm_runtime_enable(musb->controller);
spin_lock_init(&musb->lock); spin_lock_init(&musb->lock);
musb->board_set_power = plat->set_power; musb->board_set_power = plat->set_power;
musb->min_power = plat->min_power; musb->min_power = plat->min_power;
...@@ -1991,6 +1987,12 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -1991,6 +1987,12 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
musb_readl = musb_default_readl; musb_readl = musb_default_readl;
musb_writel = musb_default_writel; musb_writel = musb_default_writel;
/* We need musb_read/write functions initialized for PM */
pm_runtime_use_autosuspend(musb->controller);
pm_runtime_set_autosuspend_delay(musb->controller, 200);
pm_runtime_irq_safe(musb->controller);
pm_runtime_enable(musb->controller);
/* The musb_platform_init() call: /* The musb_platform_init() call:
* - adjusts musb->mregs * - adjusts musb->mregs
* - sets the musb->isr * - sets the musb->isr
......
...@@ -457,12 +457,27 @@ static int dsps_musb_init(struct musb *musb) ...@@ -457,12 +457,27 @@ static int dsps_musb_init(struct musb *musb)
if (IS_ERR(musb->xceiv)) if (IS_ERR(musb->xceiv))
return PTR_ERR(musb->xceiv); return PTR_ERR(musb->xceiv);
musb->phy = devm_phy_get(dev->parent, "usb2-phy");
/* Returns zero if e.g. not clocked */ /* Returns zero if e.g. not clocked */
rev = dsps_readl(reg_base, wrp->revision); rev = dsps_readl(reg_base, wrp->revision);
if (!rev) if (!rev)
return -ENODEV; return -ENODEV;
usb_phy_init(musb->xceiv); usb_phy_init(musb->xceiv);
if (IS_ERR(musb->phy)) {
musb->phy = NULL;
} else {
ret = phy_init(musb->phy);
if (ret < 0)
return ret;
ret = phy_power_on(musb->phy);
if (ret) {
phy_exit(musb->phy);
return ret;
}
}
setup_timer(&glue->timer, otg_timer, (unsigned long) musb); setup_timer(&glue->timer, otg_timer, (unsigned long) musb);
/* Reset the musb */ /* Reset the musb */
...@@ -502,6 +517,8 @@ static int dsps_musb_exit(struct musb *musb) ...@@ -502,6 +517,8 @@ static int dsps_musb_exit(struct musb *musb)
del_timer_sync(&glue->timer); del_timer_sync(&glue->timer);
usb_phy_shutdown(musb->xceiv); usb_phy_shutdown(musb->xceiv);
phy_power_off(musb->phy);
phy_exit(musb->phy);
debugfs_remove_recursive(glue->dbgfs_root); debugfs_remove_recursive(glue->dbgfs_root);
return 0; return 0;
...@@ -610,7 +627,7 @@ static int dsps_musb_reset(struct musb *musb) ...@@ -610,7 +627,7 @@ static int dsps_musb_reset(struct musb *musb)
struct device *dev = musb->controller; struct device *dev = musb->controller;
struct dsps_glue *glue = dev_get_drvdata(dev->parent); struct dsps_glue *glue = dev_get_drvdata(dev->parent);
const struct dsps_musb_wrapper *wrp = glue->wrp; const struct dsps_musb_wrapper *wrp = glue->wrp;
int session_restart = 0; int session_restart = 0, error;
if (glue->sw_babble_enabled) if (glue->sw_babble_enabled)
session_restart = sw_babble_control(musb); session_restart = sw_babble_control(musb);
...@@ -624,8 +641,14 @@ static int dsps_musb_reset(struct musb *musb) ...@@ -624,8 +641,14 @@ static int dsps_musb_reset(struct musb *musb)
dsps_writel(musb->ctrl_base, wrp->control, (1 << wrp->reset)); dsps_writel(musb->ctrl_base, wrp->control, (1 << wrp->reset));
usleep_range(100, 200); usleep_range(100, 200);
usb_phy_shutdown(musb->xceiv); usb_phy_shutdown(musb->xceiv);
error = phy_power_off(musb->phy);
if (error)
dev_err(dev, "phy shutdown failed: %i\n", error);
usleep_range(100, 200); usleep_range(100, 200);
usb_phy_init(musb->xceiv); usb_phy_init(musb->xceiv);
error = phy_power_on(musb->phy);
if (error)
dev_err(dev, "phy powerup failed: %i\n", error);
session_restart = 1; session_restart = 1;
} }
...@@ -687,7 +710,7 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue, ...@@ -687,7 +710,7 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue,
struct musb_hdrc_config *config; struct musb_hdrc_config *config;
struct platform_device *musb; struct platform_device *musb;
struct device_node *dn = parent->dev.of_node; struct device_node *dn = parent->dev.of_node;
int ret; int ret, val;
memset(resources, 0, sizeof(resources)); memset(resources, 0, sizeof(resources));
res = platform_get_resource_byname(parent, IORESOURCE_MEM, "mc"); res = platform_get_resource_byname(parent, IORESOURCE_MEM, "mc");
...@@ -739,7 +762,10 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue, ...@@ -739,7 +762,10 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue,
pdata.mode = get_musb_port_mode(dev); pdata.mode = get_musb_port_mode(dev);
/* DT keeps this entry in mA, musb expects it as per USB spec */ /* DT keeps this entry in mA, musb expects it as per USB spec */
pdata.power = get_int_prop(dn, "mentor,power") / 2; pdata.power = get_int_prop(dn, "mentor,power") / 2;
config->multipoint = of_property_read_bool(dn, "mentor,multipoint");
ret = of_property_read_u32(dn, "mentor,multipoint", &val);
if (!ret && val)
config->multipoint = true;
ret = platform_device_add_data(musb, &pdata, sizeof(pdata)); ret = platform_device_add_data(musb, &pdata, sizeof(pdata));
if (ret) { if (ret) {
......
...@@ -2613,7 +2613,7 @@ static const struct hc_driver musb_hc_driver = { ...@@ -2613,7 +2613,7 @@ static const struct hc_driver musb_hc_driver = {
.description = "musb-hcd", .description = "musb-hcd",
.product_desc = "MUSB HDRC host driver", .product_desc = "MUSB HDRC host driver",
.hcd_priv_size = sizeof(struct musb *), .hcd_priv_size = sizeof(struct musb *),
.flags = HCD_USB2 | HCD_MEMORY, .flags = HCD_USB2 | HCD_MEMORY | HCD_BH,
/* not using irq handler or reset hooks from usbcore, since /* not using irq handler or reset hooks from usbcore, since
* those must be shared with peripheral code for OTG configs * those must be shared with peripheral code for OTG configs
......
...@@ -516,7 +516,7 @@ static int omap2430_probe(struct platform_device *pdev) ...@@ -516,7 +516,7 @@ static int omap2430_probe(struct platform_device *pdev)
struct omap2430_glue *glue; struct omap2430_glue *glue;
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct musb_hdrc_config *config; struct musb_hdrc_config *config;
int ret = -ENOMEM; int ret = -ENOMEM, val;
glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL); glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL);
if (!glue) if (!glue)
...@@ -559,7 +559,10 @@ static int omap2430_probe(struct platform_device *pdev) ...@@ -559,7 +559,10 @@ static int omap2430_probe(struct platform_device *pdev)
of_property_read_u32(np, "num-eps", (u32 *)&config->num_eps); of_property_read_u32(np, "num-eps", (u32 *)&config->num_eps);
of_property_read_u32(np, "ram-bits", (u32 *)&config->ram_bits); of_property_read_u32(np, "ram-bits", (u32 *)&config->ram_bits);
of_property_read_u32(np, "power", (u32 *)&pdata->power); of_property_read_u32(np, "power", (u32 *)&pdata->power);
config->multipoint = of_property_read_bool(np, "multipoint");
ret = of_property_read_u32(np, "multipoint", &val);
if (!ret && val)
config->multipoint = true;
pdata->board_data = data; pdata->board_data = data;
pdata->config = config; pdata->config = config;
......
...@@ -6,6 +6,7 @@ config USB_RENESAS_USBHS ...@@ -6,6 +6,7 @@ config USB_RENESAS_USBHS
tristate 'Renesas USBHS controller' tristate 'Renesas USBHS controller'
depends on USB_GADGET depends on USB_GADGET
depends on ARCH_SHMOBILE || SUPERH || COMPILE_TEST depends on ARCH_SHMOBILE || SUPERH || COMPILE_TEST
depends on EXTCON || !EXTCON # if EXTCON=m, USBHS cannot be built-in
default n default n
help help
Renesas USBHS is a discrete USB host and peripheral controller chip Renesas USBHS is a discrete USB host and peripheral controller chip
......
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