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:
Greg Kroah-Hartman 2015-12-26 16:59:14 -08:00
commit f7dbd84fd4
11 changed files with 74 additions and 95 deletions

View File

@ -7,8 +7,8 @@ with 2 Freescale i.MX6Q sabre SD boards.
--------------------------------------- ---------------------------------------
Select CONFIG_USB_OTG_FSM, rebuild kernel Image and modules. Select CONFIG_USB_OTG_FSM, rebuild kernel Image and modules.
If you want to check some internal variables for otg fsm, If you want to check some internal variables for otg fsm,
select CONFIG_USB_CHIPIDEA_DEBUG, there are 2 files which mount debugfs, there are 2 files which can show otg fsm
can show otg fsm variables and some controller registers value: variables and some controller registers value:
cat /sys/kernel/debug/ci_hdrc.0/otg cat /sys/kernel/debug/ci_hdrc.0/otg
cat /sys/kernel/debug/ci_hdrc.0/registers cat /sys/kernel/debug/ci_hdrc.0/registers

View File

@ -37,9 +37,4 @@ config USB_CHIPIDEA_HOST
Say Y here to enable host controller functionality of the Say Y here to enable host controller functionality of the
ChipIdea driver. ChipIdea driver.
config USB_CHIPIDEA_DEBUG
bool "ChipIdea driver debug"
help
Say Y here to enable debugging output of the ChipIdea driver.
endif endif

View File

@ -1,11 +1,8 @@
ccflags-$(CONFIG_USB_CHIPIDEA_DEBUG) := -DDEBUG
obj-$(CONFIG_USB_CHIPIDEA) += ci_hdrc.o 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_UDC) += udc.o
ci_hdrc-$(CONFIG_USB_CHIPIDEA_HOST) += host.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 ci_hdrc-$(CONFIG_USB_OTG_FSM) += otg_fsm.o
# Glue/Bridge layers go here # Glue/Bridge layers go here

View File

@ -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); 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 */ #endif /* __DRIVERS_USB_CHIPIDEA_CI_H */

View File

@ -345,6 +345,11 @@ static int ci_hdrc_imx_remove(struct platform_device *pdev)
return 0; return 0;
} }
static void ci_hdrc_imx_shutdown(struct platform_device *pdev)
{
ci_hdrc_imx_remove(pdev);
}
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int imx_controller_suspend(struct device *dev) 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 = { static struct platform_driver ci_hdrc_imx_driver = {
.probe = ci_hdrc_imx_probe, .probe = ci_hdrc_imx_probe,
.remove = ci_hdrc_imx_remove, .remove = ci_hdrc_imx_remove,
.shutdown = ci_hdrc_imx_shutdown,
.driver = { .driver = {
.name = "imx_usb", .name = "imx_usb",
.of_match_table = ci_hdrc_imx_dt_ids, .of_match_table = ci_hdrc_imx_dt_ids,

View File

@ -23,7 +23,6 @@
* - BUS: bus glue code, bus abstraction layer * - BUS: bus glue code, bus abstraction layer
* *
* Compile Options * Compile Options
* - CONFIG_USB_CHIPIDEA_DEBUG: enable debug facilities
* - STALL_IN: non-empty bulk-in pipes cannot be halted * - STALL_IN: non-empty bulk-in pipes cannot be halted
* if defined mass storage compliance succeeds but with warnings * if defined mass storage compliance succeeds but with warnings
* => case 4: Hi > Dn * => case 4: Hi > Dn
@ -71,7 +70,6 @@
#include "udc.h" #include "udc.h"
#include "bits.h" #include "bits.h"
#include "host.h" #include "host.h"
#include "debug.h"
#include "otg.h" #include "otg.h"
#include "otg_fsm.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) if (usb_get_maximum_speed(dev) == USB_SPEED_FULL)
platdata->flags |= CI_HDRC_FORCE_FULLSPEED; 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",
of_property_read_u32(dev->of_node, "phy-clkgate-delay-us",
&platdata->phy_clkgate_delay_us); &platdata->phy_clkgate_delay_us);
platdata->itc_setting = 1; 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",
ret = of_property_read_u32(dev->of_node, "ahb-burst-config", &platdata->itc_setting);
&platdata->ahb_burst_config);
if (ret) { ret = of_property_read_u32(dev->of_node, "ahb-burst-config",
dev_err(dev, &platdata->ahb_burst_config);
"failed to get ahb-burst-config\n"); if (!ret) {
return ret;
}
platdata->flags |= CI_HDRC_OVERRIDE_AHB_BURST; platdata->flags |= CI_HDRC_OVERRIDE_AHB_BURST;
} else if (ret != -EINVAL) {
dev_err(dev, "failed to get ahb-burst-config\n");
return ret;
} }
if (of_find_property(dev->of_node, "tx-burst-size-dword", NULL)) { ret = of_property_read_u32(dev->of_node, "tx-burst-size-dword",
ret = of_property_read_u32(dev->of_node, "tx-burst-size-dword", &platdata->tx_burst_size);
&platdata->tx_burst_size); if (!ret) {
if (ret) {
dev_err(dev,
"failed to get tx-burst-size-dword\n");
return ret;
}
platdata->flags |= CI_HDRC_OVERRIDE_TX_BURST; 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",
ret = of_property_read_u32(dev->of_node, "rx-burst-size-dword", &platdata->rx_burst_size);
&platdata->rx_burst_size); if (!ret) {
if (ret) {
dev_err(dev,
"failed to get rx-burst-size-dword\n");
return ret;
}
platdata->flags |= CI_HDRC_OVERRIDE_RX_BURST; 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); ext_id = ERR_PTR(-ENODEV);

View File

@ -15,7 +15,6 @@
#include "ci.h" #include "ci.h"
#include "udc.h" #include "udc.h"
#include "bits.h" #include "bits.h"
#include "debug.h"
#include "otg.h" #include "otg.h"
/** /**

View File

@ -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 */

View File

@ -190,6 +190,8 @@ static void host_stop(struct ci_hdrc *ci)
(ci->platdata->flags & CI_HDRC_TURN_VBUS_EARLY_ON)) (ci->platdata->flags & CI_HDRC_TURN_VBUS_EARLY_ON))
regulator_disable(ci->platdata->reg_vbus); regulator_disable(ci->platdata->reg_vbus);
} }
ci->hcd = NULL;
ci->otg.host = NULL;
} }

View File

@ -485,20 +485,30 @@ static void ci_otg_loc_conn(struct otg_fsm *fsm, int on)
/* /*
* Generate SOF by host. * Generate SOF by host.
* This is controlled through suspend/resume the port.
* In host mode, controller will automatically send SOF. * In host mode, controller will automatically send SOF.
* Suspend will block the data on the port. * 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) 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) if (!fsm->otg->host)
hw_write(ci, OP_PORTSC, PORTSC_W1C_BITS | PORTSC_FPR, return;
PORTSC_FPR);
else udev = usb_hub_find_child(fsm->otg->host->root_hub, 1);
hw_write(ci, OP_PORTSC, PORTSC_W1C_BITS | PORTSC_SUSP, if (!udev)
PORTSC_SUSP); return;
if (on) {
usb_disable_autosuspend(udev);
} else {
pm_runtime_set_autosuspend_delay(&udev->dev, 0);
usb_enable_autosuspend(udev);
}
} }
/* /*

View File

@ -26,7 +26,6 @@
#include "ci.h" #include "ci.h"
#include "udc.h" #include "udc.h"
#include "bits.h" #include "bits.h"
#include "debug.h"
#include "otg.h" #include "otg.h"
#include "otg_fsm.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 * _hardware_enqueue: configures a request at hardware level
* @gadget: gadget
* @hwep: endpoint * @hwep: endpoint
* @hwreq: request
* *
* This function returns an error code * 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) if (hwreq->req.dma % PAGE_SIZE)
pages--; pages--;
if (rest == 0) if (rest == 0) {
add_td_to_list(hwep, hwreq, 0); ret = add_td_to_list(hwep, hwreq, 0);
if (ret < 0)
goto done;
}
while (rest > 0) { while (rest > 0) {
unsigned count = min(hwreq->req.length - hwreq->req.actual, unsigned count = min(hwreq->req.length - hwreq->req.actual,
(unsigned)(pages * CI_HDRC_PAGE_SIZE)); (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; rest -= count;
} }
if (hwreq->req.zero && hwreq->req.length && hwep->dir == TX if (hwreq->req.zero && hwreq->req.length && hwep->dir == TX
&& (hwreq->req.length % hwep->ep.maxpacket == 0)) && (hwreq->req.length % hwep->ep.maxpacket == 0)) {
add_td_to_list(hwep, hwreq, 0); ret = add_td_to_list(hwep, hwreq, 0);
if (ret < 0)
goto done;
}
firstnode = list_first_entry(&hwreq->tds, struct td_node, td); 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_queue: queues (submits) an I/O request to an endpoint
* @ep: endpoint
* @req: request
* @gfp_flags: GFP flags (not used)
* *
* Caller must hold lock * Caller must hold lock
* This function returns an error code
*/ */
static int _ep_queue(struct usb_ep *ep, struct usb_request *req, static int _ep_queue(struct usb_ep *ep, struct usb_request *req,
gfp_t __maybe_unused gfp_flags) gfp_t __maybe_unused gfp_flags)