Message ID | 1494936994-20026-9-git-send-email-yinbo.zhu@nxp.com |
---|---|
State | Superseded |
Delegated to: | York Sun |
Headers | show |
On Tue, May 16, 2017 at 08:16:28PM +0800, yinbo.zhu wrote: > From: Rajat Srivastava <rajat.srivastava@nxp.com> > > Adds helper functions to enable snooping and outstanding burst beat > settings. > > Signed-off-by: Rajat Srivastava <rajat.srivastava@nxp.com> > Signed-off-by: Rajesh Bhagat <rajesh.bhagat@nxp.com> > --- > drivers/usb/dwc3/core.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ > drivers/usb/dwc3/core.h | 7 +++++++ > 2 files changed, 52 insertions(+) > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > index 85cc96a..4ac599a 100644 > --- a/drivers/usb/dwc3/core.c > +++ b/drivers/usb/dwc3/core.c > @@ -599,6 +599,51 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) > > #define DWC3_ALIGN_MASK (16 - 1) > > +void dwc3_core_incr_burst_enable(int index, int btype_incr_val, > + int breq_limit) > +{ > + struct dwc3 *dwc; > + u32 reg; > + > + list_for_each_entry(dwc, &dwc3_list, list) { > + if (dwc->index != index) > + continue; > + > + /* > + * Change burst beat and outstanding pipelined > + * transfers requests > + */ > + reg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG0); > + reg = (reg & ~DWC3_INCR_BTYPE_MASK) | btype_incr_val; > + dwc3_writel(dwc->regs, DWC3_GSBUSCFG0, reg); > + > + reg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG1); > + reg = (reg & ~DWC3_BREQ_LIMIT_MASK) | (breq_limit << 8); > + dwc3_writel(dwc->regs, DWC3_GSBUSCFG1, reg); > + break; > + } > +} > + > +void dwc3_core_set_snooping(int index, bool snoop) > +{ > + struct dwc3 *dwc; > + u32 reg; > + > + list_for_each_entry(dwc, &dwc3_list, list) { > + if (dwc->index != index) > + continue; > + > + /* Enable/Disable snooping */ > + reg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG0); > + if (snoop) > + reg |= DWC3_SNOOP_ENABLE; > + else > + reg &= ~DWC3_SNOOP_ENABLE; > + dwc3_writel(dwc->regs, DWC3_GSBUSCFG0, reg); > + break; > + } > +} > + > /** > * dwc3_uboot_init - dwc3 core uboot initialization code > * @dwc3_dev: struct dwc3_device containing initialization data > diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h > index 72d2fcd..455e7fa 100644 > --- a/drivers/usb/dwc3/core.h > +++ b/drivers/usb/dwc3/core.h > @@ -593,6 +593,13 @@ struct dwc3_hwparams { > /* HWPARAMS7 */ > #define DWC3_RAM1_DEPTH(n) ((n) & 0xffff) > > +/* GSBUSCFG0 */ > +#define DWC3_SNOOP_ENABLE (0x22220000) > +#define DWC3_INCR_BTYPE_MASK (0xff) > + > +/* GSBUSCFG1 */ > +#define DWC3_BREQ_LIMIT_MASK (0xf00) > + > struct dwc3_request { > struct usb_request request; > struct list_head list; Marek?
On 05/16/2017 09:32 PM, Tom Rini wrote: > On Tue, May 16, 2017 at 08:16:28PM +0800, yinbo.zhu wrote: > >> From: Rajat Srivastava <rajat.srivastava@nxp.com> >> >> Adds helper functions to enable snooping and outstanding burst beat >> settings. >> >> Signed-off-by: Rajat Srivastava <rajat.srivastava@nxp.com> >> Signed-off-by: Rajesh Bhagat <rajesh.bhagat@nxp.com> >> --- >> drivers/usb/dwc3/core.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ >> drivers/usb/dwc3/core.h | 7 +++++++ >> 2 files changed, 52 insertions(+) >> >> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c >> index 85cc96a..4ac599a 100644 >> --- a/drivers/usb/dwc3/core.c >> +++ b/drivers/usb/dwc3/core.c >> @@ -599,6 +599,51 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) >> >> #define DWC3_ALIGN_MASK (16 - 1) >> >> +void dwc3_core_incr_burst_enable(int index, int btype_incr_val, >> + int breq_limit) >> +{ >> + struct dwc3 *dwc; >> + u32 reg; >> + >> + list_for_each_entry(dwc, &dwc3_list, list) { >> + if (dwc->index != index) >> + continue; >> + >> + /* >> + * Change burst beat and outstanding pipelined >> + * transfers requests >> + */ >> + reg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG0); >> + reg = (reg & ~DWC3_INCR_BTYPE_MASK) | btype_incr_val; >> + dwc3_writel(dwc->regs, DWC3_GSBUSCFG0, reg); >> + >> + reg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG1); >> + reg = (reg & ~DWC3_BREQ_LIMIT_MASK) | (breq_limit << 8); >> + dwc3_writel(dwc->regs, DWC3_GSBUSCFG1, reg); >> + break; >> + } >> +} >> + >> +void dwc3_core_set_snooping(int index, bool snoop) >> +{ >> + struct dwc3 *dwc; >> + u32 reg; So how do you discern which controller should have this value increased/set and which shouldn't ? I believe that information should come from DT ... hacking it up such that you change it for all controllers doesn't scale. >> + list_for_each_entry(dwc, &dwc3_list, list) { >> + if (dwc->index != index) >> + continue; >> + >> + /* Enable/Disable snooping */ >> + reg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG0); >> + if (snoop) >> + reg |= DWC3_SNOOP_ENABLE; >> + else >> + reg &= ~DWC3_SNOOP_ENABLE; >> + dwc3_writel(dwc->regs, DWC3_GSBUSCFG0, reg); >> + break; >> + } >> +} >> + >> /** >> * dwc3_uboot_init - dwc3 core uboot initialization code >> * @dwc3_dev: struct dwc3_device containing initialization data >> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h >> index 72d2fcd..455e7fa 100644 >> --- a/drivers/usb/dwc3/core.h >> +++ b/drivers/usb/dwc3/core.h >> @@ -593,6 +593,13 @@ struct dwc3_hwparams { >> /* HWPARAMS7 */ >> #define DWC3_RAM1_DEPTH(n) ((n) & 0xffff) >> >> +/* GSBUSCFG0 */ >> +#define DWC3_SNOOP_ENABLE (0x22220000) >> +#define DWC3_INCR_BTYPE_MASK (0xff) >> + >> +/* GSBUSCFG1 */ >> +#define DWC3_BREQ_LIMIT_MASK (0xf00) Drop the parenthesis ... >> struct dwc3_request { >> struct usb_request request; >> struct list_head list; > > Marek? >
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 85cc96a..4ac599a 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -599,6 +599,51 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) #define DWC3_ALIGN_MASK (16 - 1) +void dwc3_core_incr_burst_enable(int index, int btype_incr_val, + int breq_limit) +{ + struct dwc3 *dwc; + u32 reg; + + list_for_each_entry(dwc, &dwc3_list, list) { + if (dwc->index != index) + continue; + + /* + * Change burst beat and outstanding pipelined + * transfers requests + */ + reg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG0); + reg = (reg & ~DWC3_INCR_BTYPE_MASK) | btype_incr_val; + dwc3_writel(dwc->regs, DWC3_GSBUSCFG0, reg); + + reg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG1); + reg = (reg & ~DWC3_BREQ_LIMIT_MASK) | (breq_limit << 8); + dwc3_writel(dwc->regs, DWC3_GSBUSCFG1, reg); + break; + } +} + +void dwc3_core_set_snooping(int index, bool snoop) +{ + struct dwc3 *dwc; + u32 reg; + + list_for_each_entry(dwc, &dwc3_list, list) { + if (dwc->index != index) + continue; + + /* Enable/Disable snooping */ + reg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG0); + if (snoop) + reg |= DWC3_SNOOP_ENABLE; + else + reg &= ~DWC3_SNOOP_ENABLE; + dwc3_writel(dwc->regs, DWC3_GSBUSCFG0, reg); + break; + } +} + /** * dwc3_uboot_init - dwc3 core uboot initialization code * @dwc3_dev: struct dwc3_device containing initialization data diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 72d2fcd..455e7fa 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -593,6 +593,13 @@ struct dwc3_hwparams { /* HWPARAMS7 */ #define DWC3_RAM1_DEPTH(n) ((n) & 0xffff) +/* GSBUSCFG0 */ +#define DWC3_SNOOP_ENABLE (0x22220000) +#define DWC3_INCR_BTYPE_MASK (0xff) + +/* GSBUSCFG1 */ +#define DWC3_BREQ_LIMIT_MASK (0xf00) + struct dwc3_request { struct usb_request request; struct list_head list;