mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Input: imx6ul_tsc - propagate the errors
imx6ul_adc_init() may fail in two cases, so we should better propagate the errors and make sure that the callers of this function also check and propagate the errors accordingly. Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
		
							parent
							
								
									46b018fa95
								
							
						
					
					
						commit
						6cc527b058
					
				
					 1 changed files with 19 additions and 9 deletions
				
			
		| 
						 | 
					@ -94,7 +94,7 @@ struct imx6ul_tsc {
 | 
				
			||||||
 * TSC module need ADC to get the measure value. So
 | 
					 * TSC module need ADC to get the measure value. So
 | 
				
			||||||
 * before config TSC, we should initialize ADC module.
 | 
					 * before config TSC, we should initialize ADC module.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void imx6ul_adc_init(struct imx6ul_tsc *tsc)
 | 
					static int imx6ul_adc_init(struct imx6ul_tsc *tsc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int adc_hc = 0;
 | 
						int adc_hc = 0;
 | 
				
			||||||
	int adc_gc;
 | 
						int adc_gc;
 | 
				
			||||||
| 
						 | 
					@ -122,17 +122,23 @@ static void imx6ul_adc_init(struct imx6ul_tsc *tsc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	timeout = wait_for_completion_timeout
 | 
						timeout = wait_for_completion_timeout
 | 
				
			||||||
			(&tsc->completion, ADC_TIMEOUT);
 | 
								(&tsc->completion, ADC_TIMEOUT);
 | 
				
			||||||
	if (timeout == 0)
 | 
						if (timeout == 0) {
 | 
				
			||||||
		dev_err(tsc->dev, "Timeout for adc calibration\n");
 | 
							dev_err(tsc->dev, "Timeout for adc calibration\n");
 | 
				
			||||||
 | 
							return -ETIMEDOUT;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	adc_gs = readl(tsc->adc_regs + REG_ADC_GS);
 | 
						adc_gs = readl(tsc->adc_regs + REG_ADC_GS);
 | 
				
			||||||
	if (adc_gs & ADC_CALF)
 | 
						if (adc_gs & ADC_CALF) {
 | 
				
			||||||
		dev_err(tsc->dev, "ADC calibration failed\n");
 | 
							dev_err(tsc->dev, "ADC calibration failed\n");
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* TSC need the ADC work in hardware trigger */
 | 
						/* TSC need the ADC work in hardware trigger */
 | 
				
			||||||
	adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG);
 | 
						adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG);
 | 
				
			||||||
	adc_cfg |= ADC_HARDWARE_TRIGGER;
 | 
						adc_cfg |= ADC_HARDWARE_TRIGGER;
 | 
				
			||||||
	writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG);
 | 
						writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -188,11 +194,17 @@ static void imx6ul_tsc_set(struct imx6ul_tsc *tsc)
 | 
				
			||||||
	writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL);
 | 
						writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void imx6ul_tsc_init(struct imx6ul_tsc *tsc)
 | 
					static int imx6ul_tsc_init(struct imx6ul_tsc *tsc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	imx6ul_adc_init(tsc);
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = imx6ul_adc_init(tsc);
 | 
				
			||||||
 | 
						if (err)
 | 
				
			||||||
 | 
							return err;
 | 
				
			||||||
	imx6ul_tsc_channel_config(tsc);
 | 
						imx6ul_tsc_channel_config(tsc);
 | 
				
			||||||
	imx6ul_tsc_set(tsc);
 | 
						imx6ul_tsc_set(tsc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc)
 | 
					static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc)
 | 
				
			||||||
| 
						 | 
					@ -311,9 +323,7 @@ static int imx6ul_tsc_open(struct input_dev *input_dev)
 | 
				
			||||||
		return err;
 | 
							return err;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	imx6ul_tsc_init(tsc);
 | 
						return imx6ul_tsc_init(tsc);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void imx6ul_tsc_close(struct input_dev *input_dev)
 | 
					static void imx6ul_tsc_close(struct input_dev *input_dev)
 | 
				
			||||||
| 
						 | 
					@ -491,7 +501,7 @@ static int __maybe_unused imx6ul_tsc_resume(struct device *dev)
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		imx6ul_tsc_init(tsc);
 | 
							retval = imx6ul_tsc_init(tsc);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue