Re: [PATCHv6 1/8] usb: dwc2: Update the gadget driver to use common dwc2_hsotg structure

From: Felipe Balbi
Date: Thu Oct 30 2014 - 09:57:09 EST


On Tue, Oct 28, 2014 at 06:25:42PM -0500, dinguyen@xxxxxxxxxxxxxxxxxxxxx wrote:
> From: Dinh Nguyen <dinguyen@xxxxxxxxxxxxxxxxxxxxx>
>
> Adds the gadget data structure and appropriate data structure pointers
> to the common dwc2_hsotg data structure. To keep the driver data
> dereference code looking clean, the gadget variable declares are only available
> for peripheral and dual-role mode. This is needed so that the dwc2_hsotg data
> structure can be used by the hcd and gadget drivers.
>
> Updates gadget.c to use the dwc2_hsotg data structure and gadget pointers
> that have been moved into the common dwc2_hsotg structure.
>
> Signed-off-by: Dinh Nguyen <dinguyen@xxxxxxxxxxxxxxxxxxxxx>
> Signed-off-by: Paul Zimmerman <paulz@xxxxxxxxxxxx>
> ---
> v5: Keep the changes to mininum and maintain hcd and gadget driver to build
> and work separately. Use IS_ENABLED() instead of #if defined
> v3: Updated with paulz's suggestion to avoid double pointers.
> v2: Left the function parameter name as 'hsotg' and just changed its type.
> ---
> drivers/usb/dwc2/core.h | 156 ++++++++++++++++++++++++----------------------
> drivers/usb/dwc2/gadget.c | 145 +++++++++++++++++++++---------------------
> 2 files changed, 154 insertions(+), 147 deletions(-)
>
> diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
> index 55c90c5..96c283d 100644
> --- a/drivers/usb/dwc2/core.h
> +++ b/drivers/usb/dwc2/core.h
> @@ -84,7 +84,7 @@ static const char * const s3c_hsotg_supply_names[] = {
> */
> #define EP0_MPS_LIMIT 64
>
> -struct s3c_hsotg;
> +struct dwc2_hsotg;
> struct s3c_hsotg_req;
>
> /**
> @@ -130,7 +130,7 @@ struct s3c_hsotg_req;
> struct s3c_hsotg_ep {
> struct usb_ep ep;
> struct list_head queue;
> - struct s3c_hsotg *parent;
> + struct dwc2_hsotg *parent;
> struct s3c_hsotg_req *req;
> struct dentry *debugfs;
>
> @@ -155,67 +155,6 @@ struct s3c_hsotg_ep {
> };
>
> /**
> - * struct s3c_hsotg - driver state.
> - * @dev: The parent device supplied to the probe function
> - * @driver: USB gadget driver
> - * @phy: The otg phy transceiver structure for phy control.
> - * @uphy: The otg phy transceiver structure for old USB phy control.
> - * @plat: The platform specific configuration data. This can be removed once
> - * all SoCs support usb transceiver.
> - * @regs: The memory area mapped for accessing registers.
> - * @irq: The IRQ number we are using
> - * @supplies: Definition of USB power supplies
> - * @phyif: PHY interface width
> - * @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos.
> - * @num_of_eps: Number of available EPs (excluding EP0)
> - * @debug_root: root directrory for debugfs.
> - * @debug_file: main status file for debugfs.
> - * @debug_fifo: FIFO status file for debugfs.
> - * @ep0_reply: Request used for ep0 reply.
> - * @ep0_buff: Buffer for EP0 reply data, if needed.
> - * @ctrl_buff: Buffer for EP0 control requests.
> - * @ctrl_req: Request for EP0 control packets.
> - * @setup: NAK management for EP0 SETUP
> - * @last_rst: Time of last reset
> - * @eps: The endpoints being supplied to the gadget framework
> - */
> -struct s3c_hsotg {
> - struct device *dev;
> - struct usb_gadget_driver *driver;
> - struct phy *phy;
> - struct usb_phy *uphy;
> - struct s3c_hsotg_plat *plat;
> -
> - spinlock_t lock;
> -
> - void __iomem *regs;
> - int irq;
> - struct clk *clk;
> -
> - struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)];
> -
> - u32 phyif;
> - int fifo_mem;
> - unsigned int dedicated_fifos:1;
> - unsigned char num_of_eps;
> - u32 fifo_map;
> -
> - struct dentry *debug_root;
> - struct dentry *debug_file;
> - struct dentry *debug_fifo;
> -
> - struct usb_request *ep0_reply;
> - struct usb_request *ctrl_req;
> - u8 ep0_buff[8];
> - u8 ctrl_buff[8];
> -
> - struct usb_gadget gadget;
> - unsigned int setup;
> - unsigned long last_rst;
> - struct s3c_hsotg_ep *eps;
> -};
> -
> -/**
> * struct s3c_hsotg_req - data transfer request
> * @req: The USB gadget request
> * @queue: The list of requests for the endpoint this is queued for.
> @@ -229,6 +168,7 @@ struct s3c_hsotg_req {
> unsigned char mapped;
> };
>
> +#if IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) || IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
> #define call_gadget(_hs, _entry) \
> do { \
> if ((_hs)->gadget.speed != USB_SPEED_UNKNOWN && \
> @@ -238,6 +178,9 @@ do { \
> spin_lock(&_hs->lock); \
> } \
> } while (0)
> +#else
> +#define call_gadget(_hs, _entry) do {} while (0)
> +#endif
>
> struct dwc2_hsotg;
> struct dwc2_host_chan;
> @@ -495,11 +438,13 @@ struct dwc2_hw_params {
> * struct dwc2_hsotg - Holds the state of the driver, including the non-periodic
> * and periodic schedules
> *
> + * These are common for both host and peripheral modes:
> + *
> * @dev: The struct device pointer
> * @regs: Pointer to controller regs
> - * @core_params: Parameters that define how the core should be configured
> * @hw_params: Parameters that were autodetected from the
> * hardware registers
> + * @core_params: Parameters that define how the core should be configured
> * @op_state: The operational State, during transitions (a_host=>
> * a_peripheral and b_device=>b_host) this may not match
> * the core, but allows the software to determine
> @@ -508,6 +453,8 @@ struct dwc2_hw_params {
> * - USB_DR_MODE_PERIPHERAL
> * - USB_DR_MODE_HOST
> * - USB_DR_MODE_OTG
> + * @lock: Spinlock that protects all the driver data structures
> + * @priv: Stores a pointer to the struct usb_hcd
> * @queuing_high_bandwidth: True if multiple packets of a high-bandwidth
> * transfer are in process of being queued
> * @srp_success: Stores status of SRP request in the case of a FS PHY
> @@ -517,6 +464,9 @@ struct dwc2_hw_params {
> * interrupt
> * @wkp_timer: Timer object for handling Wakeup Detected interrupt
> * @lx_state: Lx state of connected device
> + *
> + * These are for host mode:
> + *
> * @flags: Flags for handling root port state changes
> * @non_periodic_sched_inactive: Inactive QHs in the non-periodic schedule.
> * Transfers associated with these QHs are not currently
> @@ -585,11 +535,31 @@ struct dwc2_hw_params {
> * @status_buf_dma: DMA address for status_buf
> * @start_work: Delayed work for handling host A-cable connection
> * @reset_work: Delayed work for handling a port reset
> - * @lock: Spinlock that protects all the driver data structures
> - * @priv: Stores a pointer to the struct usb_hcd
> * @otg_port: OTG port number
> * @frame_list: Frame list
> * @frame_list_dma: Frame list DMA address
> + *
> + * These are for peripheral mode:
> + *
> + * @driver: USB gadget driver
> + * @phy: The otg phy transceiver structure for phy control.
> + * @uphy: The otg phy transceiver structure for old USB phy control.
> + * @plat: The platform specific configuration data. This can be removed once
> + * all SoCs support usb transceiver.
> + * @supplies: Definition of USB power supplies
> + * @phyif: PHY interface width
> + * @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos.
> + * @num_of_eps: Number of available EPs (excluding EP0)
> + * @debug_root: Root directrory for debugfs.
> + * @debug_file: Main status file for debugfs.
> + * @debug_fifo: FIFO status file for debugfs.
> + * @ep0_reply: Request used for ep0 reply.
> + * @ep0_buff: Buffer for EP0 reply data, if needed.
> + * @ctrl_buff: Buffer for EP0 control requests.
> + * @ctrl_req: Request for EP0 control packets.
> + * @setup: NAK management for EP0 SETUP
> + * @last_rst: Time of last reset
> + * @eps: The endpoints being supplied to the gadget framework
> */
> struct dwc2_hsotg {
> struct device *dev;
> @@ -601,6 +571,9 @@ struct dwc2_hsotg {
> enum usb_otg_state op_state;
> enum usb_dr_mode dr_mode;
>
> + spinlock_t lock;
> + void *priv;
> +
> unsigned int queuing_high_bandwidth:1;
> unsigned int srp_success:1;
>
> @@ -609,6 +582,14 @@ struct dwc2_hsotg {
> struct timer_list wkp_timer;
> enum dwc2_lx_state lx_state;
>
> + /* DWC OTG HW Release versions */
> +#define DWC2_CORE_REV_2_71a 0x4f54271a
> +#define DWC2_CORE_REV_2_90a 0x4f54290a
> +#define DWC2_CORE_REV_2_92a 0x4f54292a
> +#define DWC2_CORE_REV_2_94a 0x4f54294a
> +#define DWC2_CORE_REV_3_00a 0x4f54300a
> +
> +#if IS_ENABLED(CONFIG_USB_DWC2_HOST) || IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
> union dwc2_hcd_internal_flags {
> u32 d32;
> struct {
> @@ -655,19 +636,10 @@ struct dwc2_hsotg {
>
> struct delayed_work start_work;
> struct delayed_work reset_work;
> - spinlock_t lock;
> - void *priv;
> u8 otg_port;
> u32 *frame_list;
> dma_addr_t frame_list_dma;
>
> - /* DWC OTG HW Release versions */
> -#define DWC2_CORE_REV_2_71a 0x4f54271a
> -#define DWC2_CORE_REV_2_90a 0x4f54290a
> -#define DWC2_CORE_REV_2_92a 0x4f54292a
> -#define DWC2_CORE_REV_2_94a 0x4f54294a
> -#define DWC2_CORE_REV_3_00a 0x4f54300a
> -
> #ifdef DEBUG
> u32 frrem_samples;
> u64 frrem_accum;
> @@ -686,6 +658,40 @@ struct dwc2_hsotg {
> u32 hfnum_other_samples_b;
> u64 hfnum_other_frrem_accum_b;
> #endif
> +#endif /* CONFIG_USB_DWC2_HOST || CONFIG_USB_DWC2_DUAL_ROLE */
> +
> +#if IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) || IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
> + /* Gadget structures */
> + struct usb_gadget_driver *driver;
> + struct phy *phy;

this shouldn't be limited to gadget.

> + struct usb_phy *uphy;

this shouldn't be limited to gadget.

> + struct s3c_hsotg_plat *plat;
> +
> + int irq;

this shouldn't be limited to gadget.

> + struct clk *clk;

this shouldn't be limited to gadget.

> +
> + struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)];

this shouldn't be limited to gadget.

> + u32 phyif;
> + int fifo_mem;
> + unsigned int dedicated_fifos:1;
> + unsigned char num_of_eps;
> + u32 fifo_map;
> +
> + struct dentry *debug_root;

this shouldn't be limited to gadget.

> + struct dentry *debug_file;

this shouldn't be limited to gadget.

> + struct dentry *debug_fifo;

this shouldn't be limited to gadget.

--
balbi

Attachment: signature.asc
Description: Digital signature