Re: [PATCH v2 2/4] hwmon: (sht15) clean-up the probe function

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

 



On 04/12/11 20:34, Vivien Didelot wrote:
> * Move the creation of sysfs attributes after the end of the
>   initialization, and remove them in the error path.
> * Release regulator in the error path.
> * Add a soft reset command (need to wait 11ms before next command).
Ideally add something to say why this is needed. (the heater issue that
Guenter raised).
> 
> Signed-off-by: Vivien Didelot <vivien.didelot@xxxxxxxxxxxxxxxxxxxx>
Acked-by: Jonathan Cameron <jic23@xxxxxxxxx>
> ---
>  drivers/hwmon/sht15.c |   54 +++++++++++++++++++++++++++++++++++++++++-------
>  1 files changed, 46 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c
> index 5fd880d..42992fe 100644
> --- a/drivers/hwmon/sht15.c
> +++ b/drivers/hwmon/sht15.c
> @@ -33,11 +33,13 @@
>  /* Commands */
>  #define SHT15_MEASURE_TEMP		0x03
>  #define SHT15_MEASURE_RH		0x05
> +#define SHT15_SOFT_RESET		0x1E
>  
>  /* Min timings */
>  #define SHT15_TSCKL			100	/* (nsecs) clock low */
>  #define SHT15_TSCKH			100	/* (nsecs) clock high */
>  #define SHT15_TSU			150	/* (nsecs) data setup time */
> +#define SHT15_TSRST			11	/* (msecs) soft reset time */
>  
>  /* Actions the driver may be doing */
>  enum sht15_state {
> @@ -229,6 +231,24 @@ static int sht15_send_cmd(struct sht15_data *data, u8 cmd)
>  }
>  
>  /**
> + * sht15_soft_reset() - send a soft reset command
> + * @data:	sht15 specific data.
> + *
> + * As described in section 3.2 of the datasheet.
> + */
> +static int sht15_soft_reset(struct sht15_data *data)
> +{
> +	int ret;
> +
> +	ret = sht15_send_cmd(data, SHT15_SOFT_RESET);
> +	if (ret)
> +		return ret;
> +	msleep(SHT15_TSRST);
> +
> +	return 0;
> +}
> +
> +/**
>   * sht15_measurement() - get a new value from device
>   * @data:		device instance specific data
>   * @command:		command sent to request value
> @@ -588,13 +608,20 @@ static int __devinit sht15_probe(struct platform_device *pdev)
>  		 */
>  		data->nb.notifier_call = &sht15_invalidate_voltage;
>  		ret = regulator_register_notifier(data->reg, &data->nb);
> +		if (ret) {
> +			dev_err(&pdev->dev,
> +				"regulator notifier request failed\n");
> +			regulator_disable(data->reg);
> +			regulator_put(data->reg);
> +			goto err_free_data;
> +		}
>  	}
>  
>  	/* Try requesting the GPIOs */
>  	ret = gpio_request(data->pdata->gpio_sck, "SHT15 sck");
>  	if (ret) {
>  		dev_err(&pdev->dev, "gpio request failed\n");
> -		goto err_free_data;
> +		goto err_release_reg;
>  	}
>  	gpio_direction_output(data->pdata->gpio_sck, 0);
>  
> @@ -603,11 +630,6 @@ static int __devinit sht15_probe(struct platform_device *pdev)
>  		dev_err(&pdev->dev, "gpio request failed\n");
>  		goto err_release_gpio_sck;
>  	}
> -	ret = sysfs_create_group(&pdev->dev.kobj, &sht15_attr_group);
> -	if (ret) {
> -		dev_err(&pdev->dev, "sysfs create failed");
> -		goto err_release_gpio_data;
> -	}
>  
>  	ret = request_irq(gpio_to_irq(data->pdata->gpio_data),
>  			  sht15_interrupt_fired,
> @@ -620,22 +642,38 @@ static int __devinit sht15_probe(struct platform_device *pdev)
>  	}
>  	disable_irq_nosync(gpio_to_irq(data->pdata->gpio_data));
>  	sht15_connection_reset(data);
> -	sht15_send_cmd(data, 0x1E);
> +	ret = sht15_soft_reset(data);
> +	if (ret)
> +		goto err_release_irq;
> +
> +	ret = sysfs_create_group(&pdev->dev.kobj, &sht15_attr_group);
> +	if (ret) {
> +		dev_err(&pdev->dev, "sysfs create failed\n");
> +		goto err_release_irq;
> +	}
>  
>  	data->hwmon_dev = hwmon_device_register(data->dev);
>  	if (IS_ERR(data->hwmon_dev)) {
>  		ret = PTR_ERR(data->hwmon_dev);
> -		goto err_release_irq;
> +		goto err_release_sysfs_group;
>  	}
>  
>  	return 0;
>  
> +err_release_sysfs_group:
> +	sysfs_remove_group(&pdev->dev.kobj, &sht15_attr_group);
>  err_release_irq:
>  	free_irq(gpio_to_irq(data->pdata->gpio_data), data);
>  err_release_gpio_data:
>  	gpio_free(data->pdata->gpio_data);
>  err_release_gpio_sck:
>  	gpio_free(data->pdata->gpio_sck);
> +err_release_reg:
> +	if (!IS_ERR(data->reg)) {
> +		regulator_unregister_notifier(data->reg, &data->nb);
> +		regulator_disable(data->reg);
> +		regulator_put(data->reg);
> +	}
>  err_free_data:
>  	kfree(data);
>  error_ret:


_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors


[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux