Linux Samsung SOC development
 help / color / mirror / Atom feed
* [PATCH 00/11] usb: Remove redundant error messages on IRQ request failure
@ 2026-07-31  3:54 Pan Chuang
  2026-07-31  3:54 ` [PATCH 04/11] usb: dwc3: Remove redundant dev_err()/dev_err_probe() Pan Chuang
  0 siblings, 1 reply; 4+ messages in thread
From: Pan Chuang @ 2026-07-31  3:54 UTC (permalink / raw)
  To: Peter Chen, Pawel Laszczak, Roger Quadros, Greg Kroah-Hartman,
	Minas Harutyunyan, Peter Griffin, André Draszik,
	Tudor Ambarus, Thinh Nguyen, Frank Li, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Joel Stanley,
	Andrew Jeffery, Neal Liu, Cristian Birsan, Nicolas Ferre,
	Alexandre Belloni, Claudiu Beznea, Herve Codina, Thierry Reding,
	Jonathan Hunter, Mathias Nyman, Al Cooper,
	Broadcom internal kernel review list, Florian Fainelli,
	Souradeep Chowdhury, Chunfeng Yun, Heikki Krogerus,
	Matthias Brugger, AngeloGioacchino Del Regno,
	open list:CADENCE USB3 DRD IP DRIVER, open list,
	moderated list:GOOGLE TENSOR SoC SUPPORT,
	open list:GOOGLE TENSOR SoC SUPPORT,
	open list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE,
	open list:OMAP USB SUPPORT,
	moderated list:ARM/ASPEED MACHINE SUPPORT,
	open list:RENESAS RZ/N1 USBF CONTROLLER DRIVER,
	open list:TEGRA ARCHITECTURE SUPPORT,
	open list:ARM/QUALCOMM MAILING LIST,
	moderated list:MEDIATEK USB3 DRD IP DRIVER
  Cc: Pan Chuang

devm_request_threaded_irq() and devm_request_any_context_irq()
automatically log detailed error messages on failure via
the devm_request_result() helper, which prints device
name, IRQ number, handler functions, and error code.

Since devm_request_irq() is a static inline wrapper around
devm_request_threaded_irq(), it also benefits from this
automatic logging.

Remove the now-redundant dev_err() and dev_err_probe() calls
in usb drivers that follow these devm_request_*_irq()
functions, as the core now provides more detailed diagnostic
information on failure.

Pan Chuang (11):
  usb: cdns3: Remove redundant dev_err()
  usb: common: usb-conn-gpio: Remove redundant dev_err()
  usb: dwc2: gadget: Remove redundant dev_err()
  usb: dwc3: Remove redundant dev_err()/dev_err_probe()
  usb: gadget: Remove redundant dev_err()
  usb: host: xhci-tegra: Remove redundant dev_err()
  usb: misc: Remove redundant dev_err()/dev_err_probe()
  usb: mtu3: Remove redundant dev_err()
  usb: phy: Remove redundant dev_err()/dev_err_probe()
  usb: renesas_usbhs: Remove redundant dev_err()
  usb: typec: Remove redundant dev_err()/dev_err_probe()

 drivers/usb/cdns3/core.c                  |  4 +---
 drivers/usb/cdns3/drd.c                   |  4 +---
 drivers/usb/common/usb-conn-gpio.c        |  8 ++------
 drivers/usb/dwc2/gadget.c                 |  4 +---
 drivers/usb/dwc3/dwc3-google.c            |  4 +---
 drivers/usb/dwc3/dwc3-imx.c               |  2 +-
 drivers/usb/dwc3/dwc3-imx8mp.c            |  4 +---
 drivers/usb/dwc3/dwc3-keystone.c          |  5 +----
 drivers/usb/dwc3/dwc3-omap.c              |  5 +----
 drivers/usb/gadget/udc/aspeed-vhub/core.c |  4 +---
 drivers/usb/gadget/udc/aspeed_udc.c       |  4 +---
 drivers/usb/gadget/udc/atmel_usba_udc.c   |  5 +----
 drivers/usb/gadget/udc/r8a66597-udc.c     |  4 +---
 drivers/usb/gadget/udc/renesas_usbf.c     |  8 ++------
 drivers/usb/gadget/udc/snps_udc_plat.c    |  4 +---
 drivers/usb/gadget/udc/tegra-xudc.c       |  5 +----
 drivers/usb/host/xhci-tegra.c             |  8 ++------
 drivers/usb/misc/brcmstb-usb-pinmap.c     |  9 ++-------
 drivers/usb/misc/qcom_eud.c               |  2 +-
 drivers/usb/mtu3/mtu3_core.c              |  4 +---
 drivers/usb/phy/phy-ab8500-usb.c          | 12 +++---------
 drivers/usb/phy/phy-generic.c             |  3 +--
 drivers/usb/phy/phy-gpio-vbus-usb.c       |  5 +----
 drivers/usb/renesas_usbhs/mod.c           |  4 +---
 drivers/usb/typec/anx7411.c               |  4 +---
 drivers/usb/typec/hd3ss3220.c             |  4 +---
 drivers/usb/typec/mux/it5205.c            |  2 +-
 drivers/usb/typec/tcpm/tcpci_maxim_core.c |  3 +--
 drivers/usb/typec/tcpm/tcpci_mt6360.c     |  1 -
 drivers/usb/typec/tcpm/tcpci_mt6370.c     |  2 +-
 30 files changed, 35 insertions(+), 102 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 04/11] usb: dwc3: Remove redundant dev_err()/dev_err_probe()
  2026-07-31  3:54 [PATCH 00/11] usb: Remove redundant error messages on IRQ request failure Pan Chuang
@ 2026-07-31  3:54 ` Pan Chuang
  2026-07-31 14:45   ` Frank Li
  2026-08-05  1:00   ` Thinh Nguyen
  0 siblings, 2 replies; 4+ messages in thread
From: Pan Chuang @ 2026-07-31  3:54 UTC (permalink / raw)
  To: Peter Griffin, André Draszik, Tudor Ambarus, Thinh Nguyen,
	Greg Kroah-Hartman, Frank Li, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam,
	moderated list:GOOGLE TENSOR SoC SUPPORT,
	open list:GOOGLE TENSOR SoC SUPPORT,
	open list:DESIGNWARE USB3 DRD IP DRIVER, open list,
	open list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE,
	open list:OMAP USB SUPPORT
  Cc: Pan Chuang

Since commit 55b48e23f5c4 ("genirq/devres: Add error handling in
devm_request_*_irq()"),
devm_request_irq() and devm_request_threaded_irq() automatically log
detailed error messages on failure. Remove the now-redundant
driver-specific dev_err() and dev_err_probe() calls.

Signed-off-by: Pan Chuang <panchuang@vivo.com>
---
 drivers/usb/dwc3/dwc3-google.c   | 4 +---
 drivers/usb/dwc3/dwc3-imx.c      | 2 +-
 drivers/usb/dwc3/dwc3-imx8mp.c   | 4 +---
 drivers/usb/dwc3/dwc3-keystone.c | 5 +----
 drivers/usb/dwc3/dwc3-omap.c     | 5 +----
 5 files changed, 5 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/dwc3/dwc3-google.c b/drivers/usb/dwc3/dwc3-google.c
index 60ee4cc99b28..e581d407b872 100644
--- a/drivers/usb/dwc3/dwc3-google.c
+++ b/drivers/usb/dwc3/dwc3-google.c
@@ -235,10 +235,8 @@ static int dwc3_google_request_irq(struct dwc3_google *google, struct platform_d
 					dwc3_google_resume_irq,
 					IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
 					req_name, google);
-	if (ret < 0) {
-		dev_err(google->dev, "failed to request irq %s\n", req_name);
+	if (ret < 0)
 		return ret;
-	}
 
 	return irq;
 }
diff --git a/drivers/usb/dwc3/dwc3-imx.c b/drivers/usb/dwc3/dwc3-imx.c
index 973a486b544d..d967acd43d44 100644
--- a/drivers/usb/dwc3/dwc3-imx.c
+++ b/drivers/usb/dwc3/dwc3-imx.c
@@ -250,7 +250,7 @@ static int dwc3_imx_probe(struct platform_device *pdev)
 					IRQF_ONESHOT | IRQF_NO_AUTOEN,
 					irq_name, dwc_imx);
 	if (ret)
-		return dev_err_probe(dev, ret, "failed to request IRQ #%d\n", irq);
+		return ret;
 
 	ret = device_add_software_node(dev, &dwc3_imx_swnode);
 	if (ret)
diff --git a/drivers/usb/dwc3/dwc3-imx8mp.c b/drivers/usb/dwc3/dwc3-imx8mp.c
index 1cf96540b66e..ee92a5efaa6e 100644
--- a/drivers/usb/dwc3/dwc3-imx8mp.c
+++ b/drivers/usb/dwc3/dwc3-imx8mp.c
@@ -273,10 +273,8 @@ static int dwc3_imx8mp_probe(struct platform_device *pdev)
 
 	err = devm_request_threaded_irq(dev, irq, NULL, dwc3_imx8mp_interrupt,
 					IRQF_ONESHOT, dev_name(dev), dwc3_imx);
-	if (err) {
-		dev_err(dev, "failed to request IRQ #%d --> %d\n", irq, err);
+	if (err)
 		goto put_dwc3;
-	}
 
 	device_set_wakeup_capable(dev, true);
 	pm_runtime_put(dev);
diff --git a/drivers/usb/dwc3/dwc3-keystone.c b/drivers/usb/dwc3/dwc3-keystone.c
index 7ee1610162b9..8ad302abe883 100644
--- a/drivers/usb/dwc3/dwc3-keystone.c
+++ b/drivers/usb/dwc3/dwc3-keystone.c
@@ -144,11 +144,8 @@ static int kdwc3_probe(struct platform_device *pdev)
 
 	error = devm_request_irq(dev, irq, dwc3_keystone_interrupt, IRQF_SHARED,
 			dev_name(dev), kdwc);
-	if (error) {
-		dev_err(dev, "failed to request IRQ #%d --> %d\n",
-				irq, error);
+	if (error)
 		goto err_irq;
-	}
 
 	kdwc3_enable_irqs(kdwc);
 
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
index fe74d11bb629..3bff775fbe4e 100644
--- a/drivers/usb/dwc3/dwc3-omap.c
+++ b/drivers/usb/dwc3/dwc3-omap.c
@@ -518,11 +518,8 @@ static int dwc3_omap_probe(struct platform_device *pdev)
 	ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt,
 					dwc3_omap_interrupt_thread, IRQF_SHARED,
 					"dwc3-omap", omap);
-	if (ret) {
-		dev_err(dev, "failed to request IRQ #%d --> %d\n",
-			omap->irq, ret);
+	if (ret)
 		goto err2;
-	}
 	dwc3_omap_enable_irqs(omap);
 	return 0;
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 04/11] usb: dwc3: Remove redundant dev_err()/dev_err_probe()
  2026-07-31  3:54 ` [PATCH 04/11] usb: dwc3: Remove redundant dev_err()/dev_err_probe() Pan Chuang
@ 2026-07-31 14:45   ` Frank Li
  2026-08-05  1:00   ` Thinh Nguyen
  1 sibling, 0 replies; 4+ messages in thread
From: Frank Li @ 2026-07-31 14:45 UTC (permalink / raw)
  To: Pan Chuang
  Cc: Peter Griffin, André Draszik, Tudor Ambarus, Thinh Nguyen,
	Greg Kroah-Hartman, Frank Li, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam,
	moderated list:GOOGLE TENSOR SoC SUPPORT,
	open list:GOOGLE TENSOR SoC SUPPORT,
	open list:DESIGNWARE USB3 DRD IP DRIVER, open list,
	open list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE,
	open list:OMAP USB SUPPORT

On Fri, Jul 31, 2026 at 11:54:38AM +0800, Pan Chuang wrote:
> Since commit 55b48e23f5c4 ("genirq/devres: Add error handling in
> devm_request_*_irq()"),
> devm_request_irq() and devm_request_threaded_irq() automatically log
> detailed error messages on failure. Remove the now-redundant
> driver-specific dev_err() and dev_err_probe() calls.
>
> Signed-off-by: Pan Chuang <panchuang@vivo.com>
> ---
>  drivers/usb/dwc3/dwc3-google.c   | 4 +---
>  drivers/usb/dwc3/dwc3-imx.c      | 2 +-
>  drivers/usb/dwc3/dwc3-imx8mp.c   | 4 +---

for imx part

Acked-by: Frank Li <Frank.Li@nxp.com>

>  drivers/usb/dwc3/dwc3-keystone.c | 5 +----
>  drivers/usb/dwc3/dwc3-omap.c     | 5 +----
>  5 files changed, 5 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/usb/dwc3/dwc3-google.c b/drivers/usb/dwc3/dwc3-google.c
> index 60ee4cc99b28..e581d407b872 100644
> --- a/drivers/usb/dwc3/dwc3-google.c
> +++ b/drivers/usb/dwc3/dwc3-google.c
> @@ -235,10 +235,8 @@ static int dwc3_google_request_irq(struct dwc3_google *google, struct platform_d
>  					dwc3_google_resume_irq,
>  					IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
>  					req_name, google);
> -	if (ret < 0) {
> -		dev_err(google->dev, "failed to request irq %s\n", req_name);
> +	if (ret < 0)
>  		return ret;
> -	}
>
>  	return irq;
>  }
> diff --git a/drivers/usb/dwc3/dwc3-imx.c b/drivers/usb/dwc3/dwc3-imx.c
> index 973a486b544d..d967acd43d44 100644
> --- a/drivers/usb/dwc3/dwc3-imx.c
> +++ b/drivers/usb/dwc3/dwc3-imx.c
> @@ -250,7 +250,7 @@ static int dwc3_imx_probe(struct platform_device *pdev)
>  					IRQF_ONESHOT | IRQF_NO_AUTOEN,
>  					irq_name, dwc_imx);
>  	if (ret)
> -		return dev_err_probe(dev, ret, "failed to request IRQ #%d\n", irq);
> +		return ret;
>
>  	ret = device_add_software_node(dev, &dwc3_imx_swnode);
>  	if (ret)
> diff --git a/drivers/usb/dwc3/dwc3-imx8mp.c b/drivers/usb/dwc3/dwc3-imx8mp.c
> index 1cf96540b66e..ee92a5efaa6e 100644
> --- a/drivers/usb/dwc3/dwc3-imx8mp.c
> +++ b/drivers/usb/dwc3/dwc3-imx8mp.c
> @@ -273,10 +273,8 @@ static int dwc3_imx8mp_probe(struct platform_device *pdev)
>
>  	err = devm_request_threaded_irq(dev, irq, NULL, dwc3_imx8mp_interrupt,
>  					IRQF_ONESHOT, dev_name(dev), dwc3_imx);
> -	if (err) {
> -		dev_err(dev, "failed to request IRQ #%d --> %d\n", irq, err);
> +	if (err)
>  		goto put_dwc3;
> -	}
>
>  	device_set_wakeup_capable(dev, true);
>  	pm_runtime_put(dev);
> diff --git a/drivers/usb/dwc3/dwc3-keystone.c b/drivers/usb/dwc3/dwc3-keystone.c
> index 7ee1610162b9..8ad302abe883 100644
> --- a/drivers/usb/dwc3/dwc3-keystone.c
> +++ b/drivers/usb/dwc3/dwc3-keystone.c
> @@ -144,11 +144,8 @@ static int kdwc3_probe(struct platform_device *pdev)
>
>  	error = devm_request_irq(dev, irq, dwc3_keystone_interrupt, IRQF_SHARED,
>  			dev_name(dev), kdwc);
> -	if (error) {
> -		dev_err(dev, "failed to request IRQ #%d --> %d\n",
> -				irq, error);
> +	if (error)
>  		goto err_irq;
> -	}
>
>  	kdwc3_enable_irqs(kdwc);
>
> diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
> index fe74d11bb629..3bff775fbe4e 100644
> --- a/drivers/usb/dwc3/dwc3-omap.c
> +++ b/drivers/usb/dwc3/dwc3-omap.c
> @@ -518,11 +518,8 @@ static int dwc3_omap_probe(struct platform_device *pdev)
>  	ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt,
>  					dwc3_omap_interrupt_thread, IRQF_SHARED,
>  					"dwc3-omap", omap);
> -	if (ret) {
> -		dev_err(dev, "failed to request IRQ #%d --> %d\n",
> -			omap->irq, ret);
> +	if (ret)
>  		goto err2;
> -	}
>  	dwc3_omap_enable_irqs(omap);
>  	return 0;
>
> --
> 2.34.1
>
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 04/11] usb: dwc3: Remove redundant dev_err()/dev_err_probe()
  2026-07-31  3:54 ` [PATCH 04/11] usb: dwc3: Remove redundant dev_err()/dev_err_probe() Pan Chuang
  2026-07-31 14:45   ` Frank Li
@ 2026-08-05  1:00   ` Thinh Nguyen
  1 sibling, 0 replies; 4+ messages in thread
From: Thinh Nguyen @ 2026-08-05  1:00 UTC (permalink / raw)
  To: Pan Chuang
  Cc: Peter Griffin, André Draszik, Tudor Ambarus, Thinh Nguyen,
	Greg Kroah-Hartman, Frank Li, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam,
	moderated list:GOOGLE TENSOR SoC  SUPPORT,
	open list:GOOGLE TENSOR SoC  SUPPORT,
	open list:DESIGNWARE USB3 DRD  IP DRIVER, open list,
	open list:ARM/FREESCALE IMX / MXC ARM  ARCHITECTURE,
	open list:OMAP USB SUPPORT

On Fri, Jul 31, 2026, Pan Chuang wrote:
> Since commit 55b48e23f5c4 ("genirq/devres: Add error handling in
> devm_request_*_irq()"),
> devm_request_irq() and devm_request_threaded_irq() automatically log
> detailed error messages on failure. Remove the now-redundant
> driver-specific dev_err() and dev_err_probe() calls.
> 
> Signed-off-by: Pan Chuang <panchuang@vivo.com>
> ---
>  drivers/usb/dwc3/dwc3-google.c   | 4 +---
>  drivers/usb/dwc3/dwc3-imx.c      | 2 +-
>  drivers/usb/dwc3/dwc3-imx8mp.c   | 4 +---
>  drivers/usb/dwc3/dwc3-keystone.c | 5 +----
>  drivers/usb/dwc3/dwc3-omap.c     | 5 +----
>  5 files changed, 5 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/dwc3-google.c b/drivers/usb/dwc3/dwc3-google.c
> index 60ee4cc99b28..e581d407b872 100644
> --- a/drivers/usb/dwc3/dwc3-google.c
> +++ b/drivers/usb/dwc3/dwc3-google.c
> @@ -235,10 +235,8 @@ static int dwc3_google_request_irq(struct dwc3_google *google, struct platform_d
>  					dwc3_google_resume_irq,
>  					IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
>  					req_name, google);
> -	if (ret < 0) {
> -		dev_err(google->dev, "failed to request irq %s\n", req_name);
> +	if (ret < 0)
>  		return ret;
> -	}
>  
>  	return irq;
>  }
> diff --git a/drivers/usb/dwc3/dwc3-imx.c b/drivers/usb/dwc3/dwc3-imx.c
> index 973a486b544d..d967acd43d44 100644
> --- a/drivers/usb/dwc3/dwc3-imx.c
> +++ b/drivers/usb/dwc3/dwc3-imx.c
> @@ -250,7 +250,7 @@ static int dwc3_imx_probe(struct platform_device *pdev)
>  					IRQF_ONESHOT | IRQF_NO_AUTOEN,
>  					irq_name, dwc_imx);
>  	if (ret)
> -		return dev_err_probe(dev, ret, "failed to request IRQ #%d\n", irq);
> +		return ret;
>  
>  	ret = device_add_software_node(dev, &dwc3_imx_swnode);
>  	if (ret)
> diff --git a/drivers/usb/dwc3/dwc3-imx8mp.c b/drivers/usb/dwc3/dwc3-imx8mp.c
> index 1cf96540b66e..ee92a5efaa6e 100644
> --- a/drivers/usb/dwc3/dwc3-imx8mp.c
> +++ b/drivers/usb/dwc3/dwc3-imx8mp.c
> @@ -273,10 +273,8 @@ static int dwc3_imx8mp_probe(struct platform_device *pdev)
>  
>  	err = devm_request_threaded_irq(dev, irq, NULL, dwc3_imx8mp_interrupt,
>  					IRQF_ONESHOT, dev_name(dev), dwc3_imx);
> -	if (err) {
> -		dev_err(dev, "failed to request IRQ #%d --> %d\n", irq, err);
> +	if (err)
>  		goto put_dwc3;
> -	}
>  
>  	device_set_wakeup_capable(dev, true);
>  	pm_runtime_put(dev);
> diff --git a/drivers/usb/dwc3/dwc3-keystone.c b/drivers/usb/dwc3/dwc3-keystone.c
> index 7ee1610162b9..8ad302abe883 100644
> --- a/drivers/usb/dwc3/dwc3-keystone.c
> +++ b/drivers/usb/dwc3/dwc3-keystone.c
> @@ -144,11 +144,8 @@ static int kdwc3_probe(struct platform_device *pdev)
>  
>  	error = devm_request_irq(dev, irq, dwc3_keystone_interrupt, IRQF_SHARED,
>  			dev_name(dev), kdwc);
> -	if (error) {
> -		dev_err(dev, "failed to request IRQ #%d --> %d\n",
> -				irq, error);
> +	if (error)
>  		goto err_irq;
> -	}
>  
>  	kdwc3_enable_irqs(kdwc);
>  
> diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
> index fe74d11bb629..3bff775fbe4e 100644
> --- a/drivers/usb/dwc3/dwc3-omap.c
> +++ b/drivers/usb/dwc3/dwc3-omap.c
> @@ -518,11 +518,8 @@ static int dwc3_omap_probe(struct platform_device *pdev)
>  	ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt,
>  					dwc3_omap_interrupt_thread, IRQF_SHARED,
>  					"dwc3-omap", omap);
> -	if (ret) {
> -		dev_err(dev, "failed to request IRQ #%d --> %d\n",
> -			omap->irq, ret);
> +	if (ret)
>  		goto err2;
> -	}
>  	dwc3_omap_enable_irqs(omap);
>  	return 0;
>  
> -- 
> 2.34.1
> 

Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>

Thanks,
Thinh

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-08-05  1:01 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-31  3:54 [PATCH 00/11] usb: Remove redundant error messages on IRQ request failure Pan Chuang
2026-07-31  3:54 ` [PATCH 04/11] usb: dwc3: Remove redundant dev_err()/dev_err_probe() Pan Chuang
2026-07-31 14:45   ` Frank Li
2026-08-05  1:00   ` Thinh Nguyen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox