* [PATCH 1/2] mfd: madera: Add register definitions for accessory detect @ 2018-08-07 9:08 Richard Fitzgerald 2018-08-07 9:08 ` [PATCH 2/2] mfd: madera: Don't use regmap_read_poll_timeout to poll for BOOT_DONE Richard Fitzgerald 2018-08-16 9:12 ` [PATCH 1/2] mfd: madera: Add register definitions for accessory detect Lee Jones 0 siblings, 2 replies; 4+ messages in thread From: Richard Fitzgerald @ 2018-08-07 9:08 UTC (permalink / raw) To: lee.jones; +Cc: patches, linux-kernel, Richard Fitzgerald Add some register definitions for accessory detection, used by the extcon driver. Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> --- include/linux/mfd/madera/registers.h | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/include/linux/mfd/madera/registers.h b/include/linux/mfd/madera/registers.h index a6b7c4222c5e..977e06101711 100644 --- a/include/linux/mfd/madera/registers.h +++ b/include/linux/mfd/madera/registers.h @@ -1219,9 +1219,11 @@ #define MADERA_IRQ1_STATUS_33 0x1820 #define MADERA_IRQ1_MASK_1 0x1840 #define MADERA_IRQ1_MASK_2 0x1841 +#define MADERA_IRQ1_MASK_6 0x1845 #define MADERA_IRQ1_MASK_33 0x1860 #define MADERA_IRQ1_RAW_STATUS_1 0x1880 #define MADERA_IRQ1_RAW_STATUS_2 0x1881 +#define MADERA_IRQ1_RAW_STATUS_7 0x1886 #define MADERA_IRQ1_RAW_STATUS_15 0x188E #define MADERA_IRQ1_RAW_STATUS_33 0x18A0 #define MADERA_INTERRUPT_DEBOUNCE_7 0x1A06 @@ -1664,6 +1666,42 @@ #define MADERA_MICB2A_ENA_SHIFT 0 #define MADERA_MICB2A_ENA_WIDTH 1 +/* (0x0225) - HP Ctrl 1L */ +#define MADERA_RMV_SHRT_HP1L 0x4000 +#define MADERA_RMV_SHRT_HP1L_MASK 0x4000 +#define MADERA_RMV_SHRT_HP1L_SHIFT 14 +#define MADERA_RMV_SHRT_HP1L_WIDTH 1 +#define MADERA_HP1L_FLWR 0x0004 +#define MADERA_HP1L_FLWR_MASK 0x0004 +#define MADERA_HP1L_FLWR_SHIFT 2 +#define MADERA_HP1L_FLWR_WIDTH 1 +#define MADERA_HP1L_SHRTI 0x0002 +#define MADERA_HP1L_SHRTI_MASK 0x0002 +#define MADERA_HP1L_SHRTI_SHIFT 1 +#define MADERA_HP1L_SHRTI_WIDTH 1 +#define MADERA_HP1L_SHRTO 0x0001 +#define MADERA_HP1L_SHRTO_MASK 0x0001 +#define MADERA_HP1L_SHRTO_SHIFT 0 +#define MADERA_HP1L_SHRTO_WIDTH 1 + +/* (0x0226) - HP Ctrl 1R */ +#define MADERA_RMV_SHRT_HP1R 0x4000 +#define MADERA_RMV_SHRT_HP1R_MASK 0x4000 +#define MADERA_RMV_SHRT_HP1R_SHIFT 14 +#define MADERA_RMV_SHRT_HP1R_WIDTH 1 +#define MADERA_HP1R_FLWR 0x0004 +#define MADERA_HP1R_FLWR_MASK 0x0004 +#define MADERA_HP1R_FLWR_SHIFT 2 +#define MADERA_HP1R_FLWR_WIDTH 1 +#define MADERA_HP1R_SHRTI 0x0002 +#define MADERA_HP1R_SHRTI_MASK 0x0002 +#define MADERA_HP1R_SHRTI_SHIFT 1 +#define MADERA_HP1R_SHRTI_WIDTH 1 +#define MADERA_HP1R_SHRTO 0x0001 +#define MADERA_HP1R_SHRTO_MASK 0x0001 +#define MADERA_HP1R_SHRTO_SHIFT 0 +#define MADERA_HP1R_SHRTO_WIDTH 1 + /* (0x0293) Accessory_Detect_Mode_1 */ #define MADERA_ACCDET_SRC 0x2000 #define MADERA_ACCDET_SRC_MASK 0x2000 @@ -3766,6 +3804,19 @@ #define MADERA_DSP1_BUS_ERR_EINT1_SHIFT 0 #define MADERA_DSP1_BUS_ERR_EINT1_WIDTH 1 +/* (0x1845) IRQ1_Mask_6 */ +#define MADERA_IM_MICDET2_EINT1 0x0200 +#define MADERA_IM_MICDET2_EINT1_MASK 0x0200 +#define MADERA_IM_MICDET2_EINT1_SHIFT 9 +#define MADERA_IM_MICDET2_EINT1_WIDTH 1 +#define MADERA_IM_MICDET1_EINT1 0x0100 +#define MADERA_IM_MICDET1_EINT1_MASK 0x0100 +#define MADERA_IM_MICDET1_EINT1_SHIFT 8 +#define MADERA_IM_MICDET1_EINT1_WIDTH 1 +#define MADERA_IM_HPDET_EINT1 0x0001 +#define MADERA_IM_HPDET_EINT1_MASK 0x0001 +#define MADERA_IM_HPDET_EINT1_SHIFT 0 +#define MADERA_IM_HPDET_EINT1_WIDTH 1 /* (0x184E) IRQ1_Mask_15 */ #define MADERA_IM_SPK_OVERHEAT_WARN_EINT1 0x0004 #define MADERA_IM_SPK_OVERHEAT_WARN_EINT1_MASK 0x0004 -- 2.11.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] mfd: madera: Don't use regmap_read_poll_timeout to poll for BOOT_DONE 2018-08-07 9:08 [PATCH 1/2] mfd: madera: Add register definitions for accessory detect Richard Fitzgerald @ 2018-08-07 9:08 ` Richard Fitzgerald 2018-08-16 9:12 ` Lee Jones 2018-08-16 9:12 ` [PATCH 1/2] mfd: madera: Add register definitions for accessory detect Lee Jones 1 sibling, 1 reply; 4+ messages in thread From: Richard Fitzgerald @ 2018-08-07 9:08 UTC (permalink / raw) To: lee.jones; +Cc: patches, linux-kernel, Richard Fitzgerald While polling for BOOT_DONE the chip could NAK a read because it is still booting, which would terminate the regmap_read_poll_timeout() with an error. Instead implement a polling loop that ignores read errors so we always poll until the chip signals boot or the loop times out. Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> --- drivers/mfd/madera-core.c | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/drivers/mfd/madera-core.c b/drivers/mfd/madera-core.c index 8cfea969b060..bc5545c53ee5 100644 --- a/drivers/mfd/madera-core.c +++ b/drivers/mfd/madera-core.c @@ -132,33 +132,43 @@ const char *madera_name_from_type(enum madera_type type) } EXPORT_SYMBOL_GPL(madera_name_from_type); -#define MADERA_BOOT_POLL_MAX_INTERVAL_US 5000 -#define MADERA_BOOT_POLL_TIMEOUT_US 25000 +#define MADERA_BOOT_POLL_INTERVAL_USEC 5000 +#define MADERA_BOOT_POLL_TIMEOUT_USEC 25000 static int madera_wait_for_boot(struct madera *madera) { - unsigned int val; - int ret; + ktime_t timeout; + unsigned int val = 0; + int ret = 0; /* * We can't use an interrupt as we need to runtime resume to do so, * so we poll the status bit. This won't race with the interrupt * handler because it will be blocked on runtime resume. + * The chip could NAK a read request while it is booting so ignore + * errors from regmap_read. */ - ret = regmap_read_poll_timeout(madera->regmap, - MADERA_IRQ1_RAW_STATUS_1, - val, - (val & MADERA_BOOT_DONE_STS1), - MADERA_BOOT_POLL_MAX_INTERVAL_US, - MADERA_BOOT_POLL_TIMEOUT_US); - - if (ret) - dev_err(madera->dev, "Polling BOOT_DONE_STS failed: %d\n", ret); + regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val); + if (val & MADERA_BOOT_DONE_STS1) + goto done; + + timeout = ktime_add_us(ktime_get(), MADERA_BOOT_POLL_TIMEOUT_USEC); + do { + usleep_range(MADERA_BOOT_POLL_INTERVAL_USEC / 2, + MADERA_BOOT_POLL_INTERVAL_USEC); + regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val); + if (val & MADERA_BOOT_DONE_STS1) + goto done; + } while (ktime_compare(ktime_get(), timeout) <= 0); + + dev_err(madera->dev, "Polling BOOT_DONE_STS timed out\n"); + ret = -ETIMEDOUT; /* * BOOT_DONE defaults to unmasked on boot so we must ack it. - * Do this unconditionally to avoid interrupt storms. + * Do this even after a timeout to avoid interrupt storms. */ +done: regmap_write(madera->regmap, MADERA_IRQ1_STATUS_1, MADERA_BOOT_DONE_EINT1); -- 2.11.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] mfd: madera: Don't use regmap_read_poll_timeout to poll for BOOT_DONE 2018-08-07 9:08 ` [PATCH 2/2] mfd: madera: Don't use regmap_read_poll_timeout to poll for BOOT_DONE Richard Fitzgerald @ 2018-08-16 9:12 ` Lee Jones 0 siblings, 0 replies; 4+ messages in thread From: Lee Jones @ 2018-08-16 9:12 UTC (permalink / raw) To: Richard Fitzgerald; +Cc: patches, linux-kernel On Tue, 07 Aug 2018, Richard Fitzgerald wrote: > While polling for BOOT_DONE the chip could NAK a read because it is > still booting, which would terminate the regmap_read_poll_timeout() > with an error. > > Instead implement a polling loop that ignores read errors so we > always poll until the chip signals boot or the loop times out. > > Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> > --- > drivers/mfd/madera-core.c | 38 ++++++++++++++++++++++++-------------- > 1 file changed, 24 insertions(+), 14 deletions(-) > > diff --git a/drivers/mfd/madera-core.c b/drivers/mfd/madera-core.c > index 8cfea969b060..bc5545c53ee5 100644 > --- a/drivers/mfd/madera-core.c > +++ b/drivers/mfd/madera-core.c > @@ -132,33 +132,43 @@ const char *madera_name_from_type(enum madera_type type) > } > EXPORT_SYMBOL_GPL(madera_name_from_type); > > -#define MADERA_BOOT_POLL_MAX_INTERVAL_US 5000 > -#define MADERA_BOOT_POLL_TIMEOUT_US 25000 > +#define MADERA_BOOT_POLL_INTERVAL_USEC 5000 > +#define MADERA_BOOT_POLL_TIMEOUT_USEC 25000 > > static int madera_wait_for_boot(struct madera *madera) > { > - unsigned int val; > - int ret; > + ktime_t timeout; > + unsigned int val = 0; > + int ret = 0; > > /* > * We can't use an interrupt as we need to runtime resume to do so, > * so we poll the status bit. This won't race with the interrupt > * handler because it will be blocked on runtime resume. > + * The chip could NAK a read request while it is booting so ignore > + * errors from regmap_read. > */ > - ret = regmap_read_poll_timeout(madera->regmap, > - MADERA_IRQ1_RAW_STATUS_1, > - val, > - (val & MADERA_BOOT_DONE_STS1), > - MADERA_BOOT_POLL_MAX_INTERVAL_US, > - MADERA_BOOT_POLL_TIMEOUT_US); > - > - if (ret) > - dev_err(madera->dev, "Polling BOOT_DONE_STS failed: %d\n", ret); > + regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val); > + if (val & MADERA_BOOT_DONE_STS1) > + goto done; Move the usleep_range() invokation to after the regmap_read(), then you can remove these 3 lines and have the same semantics. > + timeout = ktime_add_us(ktime_get(), MADERA_BOOT_POLL_TIMEOUT_USEC); > + do { > + usleep_range(MADERA_BOOT_POLL_INTERVAL_USEC / 2, > + MADERA_BOOT_POLL_INTERVAL_USEC); > + regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val); > + if (val & MADERA_BOOT_DONE_STS1) > + goto done; > + } while (ktime_compare(ktime_get(), timeout) <= 0); > + > + dev_err(madera->dev, "Polling BOOT_DONE_STS timed out\n"); > + ret = -ETIMEDOUT; > > /* > * BOOT_DONE defaults to unmasked on boot so we must ack it. > - * Do this unconditionally to avoid interrupt storms. > + * Do this even after a timeout to avoid interrupt storms. > */ > +done: > regmap_write(madera->regmap, MADERA_IRQ1_STATUS_1, > MADERA_BOOT_DONE_EINT1); > -- Lee Jones [李琼斯] Linaro Services Technical Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] mfd: madera: Add register definitions for accessory detect 2018-08-07 9:08 [PATCH 1/2] mfd: madera: Add register definitions for accessory detect Richard Fitzgerald 2018-08-07 9:08 ` [PATCH 2/2] mfd: madera: Don't use regmap_read_poll_timeout to poll for BOOT_DONE Richard Fitzgerald @ 2018-08-16 9:12 ` Lee Jones 1 sibling, 0 replies; 4+ messages in thread From: Lee Jones @ 2018-08-16 9:12 UTC (permalink / raw) To: Richard Fitzgerald; +Cc: patches, linux-kernel On Tue, 07 Aug 2018, Richard Fitzgerald wrote: > Add some register definitions for accessory detection, used > by the extcon driver. > > Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> > --- > include/linux/mfd/madera/registers.h | 51 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 51 insertions(+) Applied, thanks. -- Lee Jones [李琼斯] Linaro Services Technical Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-08-16 9:12 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-08-07 9:08 [PATCH 1/2] mfd: madera: Add register definitions for accessory detect Richard Fitzgerald 2018-08-07 9:08 ` [PATCH 2/2] mfd: madera: Don't use regmap_read_poll_timeout to poll for BOOT_DONE Richard Fitzgerald 2018-08-16 9:12 ` Lee Jones 2018-08-16 9:12 ` [PATCH 1/2] mfd: madera: Add register definitions for accessory detect Lee Jones
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.