-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 10/30/2014 08:54 AM, Felipe Balbi wrote: > 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. > All fixed.. thanks, Dinh -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAEBAgAGBQJUU6LrAAoJEBmUBAuBoyj024wP/j7x+PW8rV8Aqzhkg4d1zSKE BE7/Axir8uPVTZfIOFBouHz6h0APztgW+by7DZdXCE8K6gUDAfzruxLRHNjctT6E KRj6A+i7qYnF/0+kc9b2InWYfS8NcOxths7r70RhJz7jlCphpaqlfhlicMSc0Ury Z/EeOYRpbwltDHGSBSkcPaw0yL4h/BQIRm1rRaUj+10cliSYwW5Re6mfiWVV+0pl WA56MM5xf7N9PO1Q+TPyStLyUTLyb3jiNwCOWfUCIkpHwJC9AIgbuBZXPMrSGOoL cMNoLHkgfY4HPFgzGlGxIgbHdkMec6A78FzSgz04P5+Uzh/MGKyrecordMbpQAPS DCGGWOsPrujAbWhgrus+cfxznIV3+4vhP+uC387RgLsYaJLRpAEpYN5aTABRU8u2 uEsbfYIhRGaGDQqTR0mzcKMXy9xoUMLNLkpiaqlGTs2Et0f1ZkElIn/dpefx417u Ocmfq7ab0cXgHnYNjdk9yE9JchgjUG5sn+INKbm/lLmXNyN3VHNZnBO42v1d78Gw sylySISc1aUJGXkuRJDPM4oC4jyPrerLB4BQbF0bQqaakz+U83+I+wZ7e9IOldO9 bPk5I7VZO8F8Ve0oP1WvuVZGeCnhrTd2isfx/orQ4J3uQFBD9hddGyaroDPtRIkA zoNVOSXVySi9EiPYT12u =382E -----END PGP SIGNATURE----- -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html