The chipidea changes for v4.5-rc1
- Delete static debug for chipidea driver. - Suspend USB core when A device tries to switch to peripheral mode, at former design, it just stopped SoF simply but USB core doesn't know it. - Several small changes. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJWfLjWAAoJEEhZKYFQ1nG7R/cH/3xP4nz3pDDOpsX6U8Q1V81D K7118WeAOx64sdGRZ3bsEjNko4NI1j2jcQU2Zgtx/I5Q0lJfNm4linNNWJHKEb/m 1VJVxFJXP6lwWImVWNJbyvhzel8mlgaNza+ZabUOAFmSig9q3yHUq5lDqzPVLZWY z7lYQS+sOsCorsQierXiRxSRvkipB32NpdfhEXkj6P6Ji2a1UDDRA7F3f9k9t8QR iI1T5+gbJL/3eo+ToOdlGciIUjoa4bK5b0Iz+QeU2eSOqjuVcu4tZO5IJbH/o10Z dAhcDOr0DPEGzfpwihevyX3HcRKTKHPlzo2GdW5TJ5e7vm5C43fGHB0GgpIJBWw= =7ZBY -----END PGP SIGNATURE----- Merge tag 'usb-ci-v4.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb into usb-testing Peter writes: The chipidea changes for v4.5-rc1 - Delete static debug for chipidea driver. - Suspend USB core when A device tries to switch to peripheral mode, at former design, it just stopped SoF simply but USB core doesn't know it. - Several small changes.
This commit is contained in:
commit
f7dbd84fd4
|
@ -7,8 +7,8 @@ with 2 Freescale i.MX6Q sabre SD boards.
|
|||
---------------------------------------
|
||||
Select CONFIG_USB_OTG_FSM, rebuild kernel Image and modules.
|
||||
If you want to check some internal variables for otg fsm,
|
||||
select CONFIG_USB_CHIPIDEA_DEBUG, there are 2 files which
|
||||
can show otg fsm variables and some controller registers value:
|
||||
mount debugfs, there are 2 files which can show otg fsm
|
||||
variables and some controller registers value:
|
||||
cat /sys/kernel/debug/ci_hdrc.0/otg
|
||||
cat /sys/kernel/debug/ci_hdrc.0/registers
|
||||
|
||||
|
|
|
@ -37,9 +37,4 @@ config USB_CHIPIDEA_HOST
|
|||
Say Y here to enable host controller functionality of the
|
||||
ChipIdea driver.
|
||||
|
||||
config USB_CHIPIDEA_DEBUG
|
||||
bool "ChipIdea driver debug"
|
||||
help
|
||||
Say Y here to enable debugging output of the ChipIdea driver.
|
||||
|
||||
endif
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
ccflags-$(CONFIG_USB_CHIPIDEA_DEBUG) := -DDEBUG
|
||||
|
||||
obj-$(CONFIG_USB_CHIPIDEA) += ci_hdrc.o
|
||||
|
||||
ci_hdrc-y := core.o otg.o
|
||||
ci_hdrc-y := core.o otg.o debug.o
|
||||
ci_hdrc-$(CONFIG_USB_CHIPIDEA_UDC) += udc.o
|
||||
ci_hdrc-$(CONFIG_USB_CHIPIDEA_HOST) += host.o
|
||||
ci_hdrc-$(CONFIG_USB_CHIPIDEA_DEBUG) += debug.o
|
||||
ci_hdrc-$(CONFIG_USB_OTG_FSM) += otg_fsm.o
|
||||
|
||||
# Glue/Bridge layers go here
|
||||
|
|
|
@ -433,4 +433,7 @@ int hw_wait_reg(struct ci_hdrc *ci, enum ci_hw_regs reg, u32 mask,
|
|||
|
||||
void ci_platform_configure(struct ci_hdrc *ci);
|
||||
|
||||
int dbg_create_files(struct ci_hdrc *ci);
|
||||
|
||||
void dbg_remove_files(struct ci_hdrc *ci);
|
||||
#endif /* __DRIVERS_USB_CHIPIDEA_CI_H */
|
||||
|
|
|
@ -345,6 +345,11 @@ static int ci_hdrc_imx_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void ci_hdrc_imx_shutdown(struct platform_device *pdev)
|
||||
{
|
||||
ci_hdrc_imx_remove(pdev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int imx_controller_suspend(struct device *dev)
|
||||
{
|
||||
|
@ -462,6 +467,7 @@ static const struct dev_pm_ops ci_hdrc_imx_pm_ops = {
|
|||
static struct platform_driver ci_hdrc_imx_driver = {
|
||||
.probe = ci_hdrc_imx_probe,
|
||||
.remove = ci_hdrc_imx_remove,
|
||||
.shutdown = ci_hdrc_imx_shutdown,
|
||||
.driver = {
|
||||
.name = "imx_usb",
|
||||
.of_match_table = ci_hdrc_imx_dt_ids,
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
* - BUS: bus glue code, bus abstraction layer
|
||||
*
|
||||
* Compile Options
|
||||
* - CONFIG_USB_CHIPIDEA_DEBUG: enable debug facilities
|
||||
* - STALL_IN: non-empty bulk-in pipes cannot be halted
|
||||
* if defined mass storage compliance succeeds but with warnings
|
||||
* => case 4: Hi > Dn
|
||||
|
@ -71,7 +70,6 @@
|
|||
#include "udc.h"
|
||||
#include "bits.h"
|
||||
#include "host.h"
|
||||
#include "debug.h"
|
||||
#include "otg.h"
|
||||
#include "otg_fsm.h"
|
||||
|
||||
|
@ -688,52 +686,39 @@ static int ci_get_platdata(struct device *dev,
|
|||
if (usb_get_maximum_speed(dev) == USB_SPEED_FULL)
|
||||
platdata->flags |= CI_HDRC_FORCE_FULLSPEED;
|
||||
|
||||
if (of_find_property(dev->of_node, "phy-clkgate-delay-us", NULL))
|
||||
of_property_read_u32(dev->of_node, "phy-clkgate-delay-us",
|
||||
&platdata->phy_clkgate_delay_us);
|
||||
|
||||
platdata->itc_setting = 1;
|
||||
if (of_find_property(dev->of_node, "itc-setting", NULL)) {
|
||||
ret = of_property_read_u32(dev->of_node, "itc-setting",
|
||||
&platdata->itc_setting);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"failed to get itc-setting\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (of_find_property(dev->of_node, "ahb-burst-config", NULL)) {
|
||||
of_property_read_u32(dev->of_node, "itc-setting",
|
||||
&platdata->itc_setting);
|
||||
|
||||
ret = of_property_read_u32(dev->of_node, "ahb-burst-config",
|
||||
&platdata->ahb_burst_config);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"failed to get ahb-burst-config\n");
|
||||
if (!ret) {
|
||||
platdata->flags |= CI_HDRC_OVERRIDE_AHB_BURST;
|
||||
} else if (ret != -EINVAL) {
|
||||
dev_err(dev, "failed to get ahb-burst-config\n");
|
||||
return ret;
|
||||
}
|
||||
platdata->flags |= CI_HDRC_OVERRIDE_AHB_BURST;
|
||||
}
|
||||
|
||||
if (of_find_property(dev->of_node, "tx-burst-size-dword", NULL)) {
|
||||
ret = of_property_read_u32(dev->of_node, "tx-burst-size-dword",
|
||||
&platdata->tx_burst_size);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"failed to get tx-burst-size-dword\n");
|
||||
return ret;
|
||||
}
|
||||
if (!ret) {
|
||||
platdata->flags |= CI_HDRC_OVERRIDE_TX_BURST;
|
||||
} else if (ret != -EINVAL) {
|
||||
dev_err(dev, "failed to get tx-burst-size-dword\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (of_find_property(dev->of_node, "rx-burst-size-dword", NULL)) {
|
||||
ret = of_property_read_u32(dev->of_node, "rx-burst-size-dword",
|
||||
&platdata->rx_burst_size);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"failed to get rx-burst-size-dword\n");
|
||||
return ret;
|
||||
}
|
||||
if (!ret) {
|
||||
platdata->flags |= CI_HDRC_OVERRIDE_RX_BURST;
|
||||
} else if (ret != -EINVAL) {
|
||||
dev_err(dev, "failed to get rx-burst-size-dword\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ext_id = ERR_PTR(-ENODEV);
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
#include "ci.h"
|
||||
#include "udc.h"
|
||||
#include "bits.h"
|
||||
#include "debug.h"
|
||||
#include "otg.h"
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
* debug.h - ChipIdea USB driver debug interfaces
|
||||
*
|
||||
* Copyright (C) 2008 Chipidea - MIPS Technologies, Inc. All rights reserved.
|
||||
*
|
||||
* Author: David Lopo
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __DRIVERS_USB_CHIPIDEA_DEBUG_H
|
||||
#define __DRIVERS_USB_CHIPIDEA_DEBUG_H
|
||||
|
||||
#ifdef CONFIG_USB_CHIPIDEA_DEBUG
|
||||
int dbg_create_files(struct ci_hdrc *ci);
|
||||
void dbg_remove_files(struct ci_hdrc *ci);
|
||||
#else
|
||||
static inline int dbg_create_files(struct ci_hdrc *ci)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void dbg_remove_files(struct ci_hdrc *ci)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __DRIVERS_USB_CHIPIDEA_DEBUG_H */
|
|
@ -190,6 +190,8 @@ static void host_stop(struct ci_hdrc *ci)
|
|||
(ci->platdata->flags & CI_HDRC_TURN_VBUS_EARLY_ON))
|
||||
regulator_disable(ci->platdata->reg_vbus);
|
||||
}
|
||||
ci->hcd = NULL;
|
||||
ci->otg.host = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -485,20 +485,30 @@ static void ci_otg_loc_conn(struct otg_fsm *fsm, int on)
|
|||
|
||||
/*
|
||||
* Generate SOF by host.
|
||||
* This is controlled through suspend/resume the port.
|
||||
* In host mode, controller will automatically send SOF.
|
||||
* Suspend will block the data on the port.
|
||||
*
|
||||
* This is controlled through usbcore by usb autosuspend,
|
||||
* so the usb device class driver need support autosuspend,
|
||||
* otherwise the bus suspend will not happen.
|
||||
*/
|
||||
static void ci_otg_loc_sof(struct otg_fsm *fsm, int on)
|
||||
{
|
||||
struct ci_hdrc *ci = container_of(fsm, struct ci_hdrc, fsm);
|
||||
struct usb_device *udev;
|
||||
|
||||
if (on)
|
||||
hw_write(ci, OP_PORTSC, PORTSC_W1C_BITS | PORTSC_FPR,
|
||||
PORTSC_FPR);
|
||||
else
|
||||
hw_write(ci, OP_PORTSC, PORTSC_W1C_BITS | PORTSC_SUSP,
|
||||
PORTSC_SUSP);
|
||||
if (!fsm->otg->host)
|
||||
return;
|
||||
|
||||
udev = usb_hub_find_child(fsm->otg->host->root_hub, 1);
|
||||
if (!udev)
|
||||
return;
|
||||
|
||||
if (on) {
|
||||
usb_disable_autosuspend(udev);
|
||||
} else {
|
||||
pm_runtime_set_autosuspend_delay(&udev->dev, 0);
|
||||
usb_enable_autosuspend(udev);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include "ci.h"
|
||||
#include "udc.h"
|
||||
#include "bits.h"
|
||||
#include "debug.h"
|
||||
#include "otg.h"
|
||||
#include "otg_fsm.h"
|
||||
|
||||
|
@ -403,9 +402,9 @@ static inline u8 _usb_addr(struct ci_hw_ep *ep)
|
|||
}
|
||||
|
||||
/**
|
||||
* _hardware_queue: configures a request at hardware level
|
||||
* @gadget: gadget
|
||||
* _hardware_enqueue: configures a request at hardware level
|
||||
* @hwep: endpoint
|
||||
* @hwreq: request
|
||||
*
|
||||
* This function returns an error code
|
||||
*/
|
||||
|
@ -434,19 +433,28 @@ static int _hardware_enqueue(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq)
|
|||
if (hwreq->req.dma % PAGE_SIZE)
|
||||
pages--;
|
||||
|
||||
if (rest == 0)
|
||||
add_td_to_list(hwep, hwreq, 0);
|
||||
if (rest == 0) {
|
||||
ret = add_td_to_list(hwep, hwreq, 0);
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
}
|
||||
|
||||
while (rest > 0) {
|
||||
unsigned count = min(hwreq->req.length - hwreq->req.actual,
|
||||
(unsigned)(pages * CI_HDRC_PAGE_SIZE));
|
||||
add_td_to_list(hwep, hwreq, count);
|
||||
ret = add_td_to_list(hwep, hwreq, count);
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
|
||||
rest -= count;
|
||||
}
|
||||
|
||||
if (hwreq->req.zero && hwreq->req.length && hwep->dir == TX
|
||||
&& (hwreq->req.length % hwep->ep.maxpacket == 0))
|
||||
add_td_to_list(hwep, hwreq, 0);
|
||||
&& (hwreq->req.length % hwep->ep.maxpacket == 0)) {
|
||||
ret = add_td_to_list(hwep, hwreq, 0);
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
}
|
||||
|
||||
firstnode = list_first_entry(&hwreq->tds, struct td_node, td);
|
||||
|
||||
|
@ -787,8 +795,12 @@ static void isr_get_status_complete(struct usb_ep *ep, struct usb_request *req)
|
|||
|
||||
/**
|
||||
* _ep_queue: queues (submits) an I/O request to an endpoint
|
||||
* @ep: endpoint
|
||||
* @req: request
|
||||
* @gfp_flags: GFP flags (not used)
|
||||
*
|
||||
* Caller must hold lock
|
||||
* This function returns an error code
|
||||
*/
|
||||
static int _ep_queue(struct usb_ep *ep, struct usb_request *req,
|
||||
gfp_t __maybe_unused gfp_flags)
|
||||
|
|
Loading…
Reference in New Issue