Re: [PATCH v6 5/8] i2c: mux: pca954x: Call request irq after adding mux segments

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2017-05-02 11:12, Phil Reid wrote:
> The pca954x device do not have the ability to mask interrupts. For
> i2c slave devices that also don't have masking ability (eg ltc1760
> smbalert output) delay registering the irq until after the mux
> segments have been configured. During the mux add_adaptor call the
> core i2c system can register an smbalert handler which would then
> be called immediately when the irq is registered. This smbalert
> handler will then clear the pending irq.
> 
> Signed-off-by: Phil Reid <preid@xxxxxxxxxxxxxxxxx>
> ---
>  drivers/i2c/muxes/i2c-mux-pca954x.c | 52 +++++++++++++++++--------------------
>  1 file changed, 24 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mux-pca954x.c
> index ad31d21..4299738 100644
> --- a/drivers/i2c/muxes/i2c-mux-pca954x.c
> +++ b/drivers/i2c/muxes/i2c-mux-pca954x.c
> @@ -294,7 +294,7 @@ static int pca954x_irq_setup(struct i2c_mux_core *muxc)
>  {
>  	struct pca954x *data = i2c_mux_priv(muxc);
>  	struct i2c_client *client = data->client;
> -	int c, err, irq;
> +	int c, irq;
>  
>  	if (!data->chip->has_irq || client->irq <= 0)
>  		return 0;
> @@ -314,24 +314,22 @@ static int pca954x_irq_setup(struct i2c_mux_core *muxc)
>  			handle_simple_irq);
>  	}
>  
> -	err = devm_request_threaded_irq(&client->dev, data->client->irq, NULL,
> -					pca954x_irq_handler,
> -					IRQF_ONESHOT | IRQF_SHARED,
> -					"pca954x", data);
> -	if (err)
> -		goto err_req_irq;
> +	return 0;
> +}
>  
> -	disable_irq(data->client->irq);
> +static void pca954x_cleanup(struct i2c_mux_core *muxc)
> +{
> +	struct pca954x *data = i2c_mux_priv(muxc);
> +	int c, irq;
>  
> -	return 0;
> -err_req_irq:
> -	for (c = 0; c < data->chip->nchans; c++) {
> -		irq = irq_find_mapping(data->irq, c);
> -		irq_dispose_mapping(irq);
> +	if (data->irq) {
> +		for (c = 0; c < data->chip->nchans; c++) {
> +			irq = irq_find_mapping(data->irq, c);
> +			irq_dispose_mapping(irq);
> +		}
> +		irq_domain_remove(data->irq);
>  	}
> -	irq_domain_remove(data->irq);
> -
> -	return err;
> +	i2c_mux_del_adapters(muxc);
>  }
>  
>  /*
> @@ -422,6 +420,14 @@ static int pca954x_probe(struct i2c_client *client,
>  		}
>  	}
>  
> +	if (data->chip->has_irq || client->irq > 0) {

This should be && instead of ||. However, I think it's better to not
try to replicate the inverse of the test in pca954x_irq_setup and
instead just check if the irq domain is there with "if (data->irq)".
Assuming that is the intent...

> +		ret = devm_request_threaded_irq(&client->dev, data->client->irq,
> +		NULL, pca954x_irq_handler, IRQF_ONESHOT | IRQF_SHARED,
> +		"pca954x", data);

The indentation is horrific. Please fix.

Acked with those two fixed.

I also noticed that there is no check for failure of the call to
irq_create_mapping in pca954x_irq_setup. For bonus points, can you
fix that error path too, please? Or should failure to create those
irq mappings not be fatal for some reason?

Cheers,
peda

> +		if (ret)
> +			goto fail_del_adapters;
> +	}
> +
>  	dev_info(&client->dev,
>  		 "registered %d multiplexed busses for I2C %s %s\n",
>  		 num, data->chip->muxtype == pca954x_ismux
> @@ -430,25 +436,15 @@ static int pca954x_probe(struct i2c_client *client,
>  	return 0;
>  
>  fail_del_adapters:
> -	i2c_mux_del_adapters(muxc);
> +	pca954x_cleanup(muxc);
>  	return ret;
>  }
>  
>  static int pca954x_remove(struct i2c_client *client)
>  {
>  	struct i2c_mux_core *muxc = i2c_get_clientdata(client);
> -	struct pca954x *data = i2c_mux_priv(muxc);
> -	int c, irq;
>  
> -	if (data->irq) {
> -		for (c = 0; c < data->chip->nchans; c++) {
> -			irq = irq_find_mapping(data->irq, c);
> -			irq_dispose_mapping(irq);
> -		}
> -		irq_domain_remove(data->irq);
> -	}
> -
> -	i2c_mux_del_adapters(muxc);
> +	pca954x_cleanup(muxc);
>  	return 0;
>  }
>  
> 

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux