linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Cousson, Benoit" <b-cousson@ti.com>
To: eduardo.valentin@ti.com
Cc: amit.kucheria@linaro.org, balbi@ti.com, kishon@ti.com,
	kbaidarov@dev.rtsoft.ru, Keerthy <j-keerthy@ti.com>,
	linux-pm@lists.linux-foundation.org, linux-omap@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [RFC PATCH 09/11] ARM: OMAP4+: thermal: introduce bandgap temperature sensor
Date: Tue, 29 May 2012 15:14:48 +0200	[thread overview]
Message-ID: <4FC4CBC8.2040600@ti.com> (raw)
In-Reply-To: <20120528111624.GC3923@besouro>

On 5/28/2012 1:16 PM, Eduardo Valentin wrote:
> Hello again,
>
> On Fri, May 25, 2012 at 05:49:44PM +0200, Cousson Benoit wrote:
>> On 5/25/2012 10:25 AM, Eduardo Valentin wrote:
>
> <big cut>
>
>>> +
>>> +static const struct omap_bandgap_data omap4460_data = {
>>> +	.has_talert = true,
>>> +	.has_tshut = true,
>>> +	.fclock_name = "bandgap_ts_fclk",
>>> +	.div_ck_name = "div_ts_ck",
>>
>> None of these clock data should be there ideally. You should ensure
>> that the proper device alias will be there using clkdev entries.
>
> In fact, it is a shame that it would be needed to have this entries there :-(
>
>>
>> Except that with DT, it will not work without the clock DT binding :-(
>>
>> I think Rob posted a latest update based on CCF... but for the
>> moment we are stuck :-(
>
> OK. But would it work for BG as well as it seams to be a special case?
>
>>
>>> +	.conv_table = omap4460_adc_to_temp,
>>> +	.sensors = {
>>> +		{
>>> +			.registers =&omap4460_mpu_temp_sensor_registers,
>>> +			.ts_data =&omap4460_mpu_temp_sensor_data,
>>> +			.domain = "cpu",
>>> +		},
>>> +	},
>>> +	.sensor_count = 1,
>>> +};
>>> +
>>> +static const struct omap_bandgap_data omap5430_data = {
>>> +	.has_talert = true,
>>> +	.has_tshut = true,
>>> +	.fclock_name = "ts_clk_div_ck",
>>> +	.div_ck_name = "ts_clk_div_ck",
>>> +	.conv_table = omap5430_adc_to_temp,
>>> +	.sensors = {
>>> +		{
>>> +			.registers =&omap5430_mpu_temp_sensor_registers,
>>> +			.ts_data =&omap5430_mpu_temp_sensor_data,
>>> +			.domain = "cpu",
>>> +		},
>>> +		{
>>> +			.registers =&omap5430_gpu_temp_sensor_registers,
>>> +			.ts_data =&omap5430_gpu_temp_sensor_data,
>>> +			.domain = "gpu",
>>> +		},
>>> +		{
>>> +			.registers =&omap5430_core_temp_sensor_registers,
>>> +			.ts_data =&omap5430_core_temp_sensor_data,
>>> +			.domain = "core",
>>> +		},
>>> +	},
>>> +	.sensor_count = 3,
>>
>> It can probably be replaced by a sizeof.
>
> ARRAY_SIZE prob, will check.

Ah, yes, that's one... I was looking for it for forgot the name :-)

>>> +};
>>> +
>>> +static const struct of_device_id of_omap_bandgap_match[] = {
>>> +	/*
>>> +	 * TODO: Add support to 4430
>>> +	 * { .compatible = "ti,omap4430-bandgap", .data = , },
>>> +	 */
>>> +	{
>>> +		.compatible = "ti,omap4460-bandgap",
>>> +		.data = (void *)&omap4460_data,
>>
>> No need to cast toward a void *.
>
> In this case, there is a need, because the omap4460_data is const but the .data field isn't. So I need to force it.
>
>>
>>> +	},
>>> +	{
>>> +		.compatible = "ti,omap5430-bandgap",
>>> +		.data = (void *)&omap5430_data,
>>> +	},
>>> +	/* Sentinel */
>>> +	{ },
>>> +};
>>> +
>>> +static struct omap_bandgap *omap_bandgap_build(struct platform_device *pdev)
>>> +{
>>> +	struct device_node *node = pdev->dev.of_node;
>>> +	const struct of_device_id *of_id;
>>> +	struct omap_bandgap *bg_ptr;
>>
>> bg_ptr is not a super name.
>
> Got a better name? Just don't want a long one to avoid code bending at 80th column...

My concern was mainly with the _ptr, it looks like a Hungarian notation. 
:-)...

Maybe bg only? Or omap_bg?

>
>>
>>> +	u32 prop;
>>> +
>>> +	/* just for the sake */
>>> +	if (!node) {
>>> +		dev_err(&pdev->dev, "no platform information available\n");
>>> +		return ERR_PTR(-EINVAL);
>>> +	}
>>
>> Not needed, just do the of_match_device here directly.
>
> Indeed...
>
>>
>>> +
>>> +	bg_ptr = devm_kzalloc(&pdev->dev, sizeof(struct omap_bandgap),
>>> +				    GFP_KERNEL);
>>> +	if (!bg_ptr) {
>>> +		dev_err(&pdev->dev, "Unable to allocate mem for driver ref\n");
>>> +		return ERR_PTR(-ENOMEM);
>>> +	}
>>> +
>>> +	of_id = of_match_device(of_omap_bandgap_match,&pdev->dev);
>>> +	if (of_id)
>>> +		bg_ptr->pdata = of_id->data;
>>
>> Nit: This is not really pdata anymore, so you should maybe remove
>> the "p" to avoid confusion.
>
> OK...
>
>>
>>> +
>>> +	if (bg_ptr->pdata->has_tshut) {
>>> +		if (of_property_read_u32(node, "ti,tshut-gpio",&prop)<   0) {
>>> +			dev_err(&pdev->dev, "missing tshut gpio in device tree\n");
>>> +			return ERR_PTR(-EINVAL);
>>> +		}
>>> +		bg_ptr->tshut_gpio = prop;
>>> +		if (!gpio_is_valid(bg_ptr->tshut_gpio)) {
>>> +			dev_err(&pdev->dev, "invalid gpio for tshut (%d)\n",
>>> +				bg_ptr->tshut_gpio);
>>> +			return ERR_PTR(-EINVAL);
>>> +		}
>>> +	}
>>> +
>>> +	return bg_ptr;
>>> +}
>>> +
>>> +static
>>> +int __devinit omap_bandgap_probe(struct platform_device *pdev)
>>> +{
>>> +	struct device *cdev = pdev->dev.parent;
>>> +	struct omap_bandgap *bg_ptr;
>>> +	int clk_rate, ret = 0, i;
>>> +
>>> +	if (!cdev) {
>>> +		dev_err(&pdev->dev, "no omap control ref in our parent\n");
>>> +		return -EINVAL;
>>> +	}
>>> +
>>> +	bg_ptr = omap_bandgap_build(pdev);
>>> +	if (IS_ERR_OR_NULL(bg_ptr)) {
>>> +		dev_err(&pdev->dev, "failed to fetch platform data\n");
>>> +		return PTR_ERR(bg_ptr);
>>> +	}
>>> +
>>> +	if (bg_ptr->pdata->has_talert) {
>>
>> Nit2: Yeah, in fact instead of pdata, "conf" or "settings" seems to
>> be more representative of what this structure really contain.
>
> conf looks good to me.
>
>>
>>> +		ret = omap_bandgap_talert_init(bg_ptr, pdev);
>>> +		if (ret) {
>>> +			dev_err(&pdev->dev, "failed to initialize Talert IRQ\n");
>>> +			return ret;
>>> +		}
>>> +	}
>>> +
>>> +	if (bg_ptr->pdata->has_tshut) {
>>> +		ret = omap_bandgap_tshut_init(bg_ptr, pdev);
>>> +		if (ret) {
>>> +			dev_err(&pdev->dev,
>>> +				"failed to initialize system tshut IRQ\n");
>>> +			goto free_talert;
>>> +		}
>>> +	}
>>> +
>>> +	bg_ptr->fclock = clk_get(NULL, bg_ptr->pdata->fclock_name);
>>
>> That's not good to get a clock without using the local dev alias.
>> But because of lack of clock DT binding yet, I'm not sure we have
>> the choice.
>
> In fact I didn't touch the clk data on purpose and left the clock handling
> as is. On my side I didn't know how the clock struct would look like with DT,
> so, I didn't mess with it.
>
> Do you have a reference to check the work in progress for clock DT ?

Rob sent a pull request, it seems that now it is up to Mike T. :-)

http://lists-archives.com/linux-kernel/27640907-dt-clk-binding-support.html

>
>>
>>> +	ret = IS_ERR_OR_NULL(bg_ptr->fclock);
>>> +	if (ret) {
>>> +		dev_err(&pdev->dev, "failed to request fclock reference\n");
>>> +		goto free_irqs;
>>> +	}
>>> +
>>> +	bg_ptr->div_clk = clk_get(NULL,  bg_ptr->pdata->div_ck_name);
>>> +	ret = IS_ERR_OR_NULL(bg_ptr->div_clk);
>>> +	if (ret) {
>>> +		dev_err(&pdev->dev,
>>> +			"failed to request div_ts_ck clock ref\n");
>>> +		goto free_irqs;
>>> +	}
>>> +
>>> +	bg_ptr->conv_table = bg_ptr->pdata->conv_table;
>>> +	for (i = 0; i<   bg_ptr->pdata->sensor_count; i++) {
>>> +		struct temp_sensor_registers *tsr;
>>> +		u32 val;
>>> +
>>> +		tsr = bg_ptr->pdata->sensors[i].registers;
>>> +		/*
>>> +		 * check if the efuse has a non-zero value if not
>>> +		 * it is an untrimmed sample and the temperatures
>>> +		 * may not be accurate
>>> +		 */
>>> +		ret = omap_control_readl(cdev, tsr->bgap_efuse,&val);
>>> +		if (ret || !val)
>>> +			dev_info(&pdev->dev,
>>> +				 "Non-trimmed BGAP, Temp not accurate\n");
>>> +	}
>>> +
>>> +	clk_rate = clk_round_rate(bg_ptr->div_clk,
>>> +				  bg_ptr->pdata->sensors[0].ts_data->max_freq);
>>> +	if (clk_rate<   bg_ptr->pdata->sensors[0].ts_data->min_freq ||
>>> +	    clk_rate == 0xffffffff) {
>>> +		ret = -ENODEV;
>>> +		goto put_clks;
>>> +	}
>>> +
>>> +	ret = clk_set_rate(bg_ptr->div_clk, clk_rate);
>>> +	if (ret) {
>>> +		dev_err(&pdev->dev, "Cannot set clock rate\n");
>>> +		goto put_clks;
>>> +	}
>>> +
>>> +	bg_ptr->clk_rate = clk_rate;
>>> +	clk_enable(bg_ptr->fclock);
>>> +
>>> +	mutex_init(&bg_ptr->bg_mutex);
>>> +	bg_ptr->dev =&pdev->dev;
>>> +	platform_set_drvdata(pdev, bg_ptr);
>>> +
>>> +	/* 1 clk cycle */
>>
>> What does that mean exactly?
>
> That's indeed a good question. I guess by default we configure the bandgap to
> wait only 1 cycle before it goes to the next read round, if in continuous mode.

OK, so some more explanation in that comment are maybe required.

Thanks,
Benoit

>
> That should get overwritten when we have, for instance, some policy initialized
> and changing the update rate based on the temperature level that the sensor is.
>
> These decisions would go under omapXX-thermal.c, BTW. Check my reply on your
> suggestion for data structure split.
>
>>
>> Regards,
>> Benoit
>>
>>> +	for (i = 0; i<   bg_ptr->pdata->sensor_count; i++)
>>> +		configure_temp_sensor_counter(bg_ptr, i, 1);
>>> +
>>> +	for (i = 0; i<   bg_ptr->pdata->sensor_count; i++) {
>>> +		struct temp_sensor_data *ts_data;
>>> +
>>> +		ts_data = bg_ptr->pdata->sensors[i].ts_data;
>>> +
>>> +		temp_sensor_init_talert_thresholds(bg_ptr, i,
>>> +						   ts_data->t_hot,
>>> +						   ts_data->t_cold);
>>> +		temp_sensor_configure_tshut_hot(bg_ptr, i,
>>> +						ts_data->tshut_hot);
>>> +		temp_sensor_configure_tshut_cold(bg_ptr, i,
>>> +						 ts_data->tshut_cold);
>>> +	}
>>> +
>>> +	enable_continuous_mode(bg_ptr);
>>> +
>>> +	/* Set .250 seconds time as default counter */
>>> +	for (i = 0; i<   bg_ptr->pdata->sensor_count; i++)
>>> +		configure_temp_sensor_counter(bg_ptr, i,
>>> +					      bg_ptr->clk_rate / 4);
>>> +
>>> +	/* Every thing is good? Then expose the sensors */
>>> +	for (i = 0; i<   bg_ptr->pdata->sensor_count; i++) {
>>> +		char *domain;
>>> +
>>> +		domain = bg_ptr->pdata->sensors[i].domain;
>>> +		if (bg_ptr->pdata->expose_sensor)
>>> +			bg_ptr->pdata->expose_sensor(bg_ptr, i, domain);
>>> +	}
>>> +
>>> +	return 0;
>>> +
>>> +put_clks:
>>> +	clk_disable(bg_ptr->fclock);
>>> +	clk_put(bg_ptr->fclock);
>>> +	clk_put(bg_ptr->div_clk);
>>> +free_irqs:
>>> +	free_irq(gpio_to_irq(bg_ptr->tshut_gpio), NULL);
>>> +	gpio_free(bg_ptr->tshut_gpio);
>>> +free_talert:
>>> +	free_irq(bg_ptr->irq, bg_ptr);
>>> +
>>> +	return ret;
>>> +}
>>> +
>>> +static
>>> +int __devexit omap_bandgap_remove(struct platform_device *pdev)
>>> +{
>>> +	struct omap_bandgap *bg_ptr = platform_get_drvdata(pdev);
>>> +
>>> +	clk_disable(bg_ptr->fclock);
>>> +	clk_put(bg_ptr->fclock);
>>> +	clk_put(bg_ptr->div_clk);
>>> +	free_irq(bg_ptr->irq, bg_ptr);
>>> +	free_irq(gpio_to_irq(bg_ptr->tshut_gpio), NULL);
>>> +	gpio_free(bg_ptr->tshut_gpio);
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +#ifdef CONFIG_PM
>>> +static int omap_bandgap_save_ctxt(struct omap_bandgap *bg_ptr)
>>> +{
>>> +	struct device *cdev = bg_ptr->dev->parent;
>>> +	int err = 0;
>>> +	int i;
>>> +
>>> +	for (i = 0; i<   bg_ptr->pdata->sensor_count; i++) {
>>> +		struct temp_sensor_registers *tsr;
>>> +		struct temp_sensor_regval *rval;
>>> +
>>> +		rval = bg_ptr->pdata->sensors[i].regval;
>>> +		tsr = bg_ptr->pdata->sensors[i].registers;
>>> +
>>> +		err = omap_control_readl(cdev, tsr->bgap_mode_ctrl,
>>> +					&rval->bg_mode_ctrl);
>>> +		err |= omap_control_readl(cdev,	tsr->bgap_mask_ctrl,
>>> +					&rval->bg_ctrl);
>>> +		err |= omap_control_readl(cdev,	tsr->bgap_counter,
>>> +					&rval->bg_counter);
>>> +		err |= omap_control_readl(cdev, tsr->bgap_threshold,
>>> +					&rval->bg_threshold);
>>> +		err |= omap_control_readl(cdev, tsr->tshut_threshold,
>>> +					&rval->tshut_threshold);
>>> +
>>> +		if (err)
>>> +			dev_err(bg_ptr->dev, "could not save sensor %d\n", i);
>>> +	}
>>> +
>>> +	return err ? -EIO : 0;
>>> +}
>>> +
>>> +static int
>>> +omap_bandgap_force_single_read(struct omap_bandgap *bg_ptr, int id)
>>> +{
>>> +	struct device *cdev = bg_ptr->dev->parent;
>>> +	struct temp_sensor_registers *tsr;
>>> +	u32 temp = 0, counter = 1000;
>>> +	int err;
>>> +
>>> +	tsr = bg_ptr->pdata->sensors[id].registers;
>>> +	/* Select single conversion mode */
>>> +	err = omap_control_readl(cdev, tsr->bgap_mode_ctrl,&temp);
>>> +	temp&= ~(1<<   __ffs(tsr->mode_ctrl_mask));
>>> +	omap_control_writel(cdev, temp, tsr->bgap_mode_ctrl);
>>> +
>>> +	/* Start of Conversion = 1 */
>>> +	err |= omap_control_readl(cdev, tsr->temp_sensor_ctrl,&temp);
>>> +	temp |= 1<<   __ffs(tsr->bgap_soc_mask);
>>> +	omap_control_writel(cdev, temp, tsr->temp_sensor_ctrl);
>>> +	/* Wait until DTEMP is updated */
>>> +	err |= omap_control_readl(cdev, tsr->temp_sensor_ctrl,&temp);
>>> +	temp&= (tsr->bgap_dtemp_mask);
>>> +	while ((temp == 0)&&   --counter) {
>>> +		err |= omap_control_readl(cdev, tsr->temp_sensor_ctrl,&temp);
>>> +		temp&= (tsr->bgap_dtemp_mask);
>>> +	}
>>> +	/* Start of Conversion = 0 */
>>> +	err |= omap_control_readl(cdev, tsr->temp_sensor_ctrl,&temp);
>>> +	temp&= ~(1<<   __ffs(tsr->bgap_soc_mask));
>>> +	err |= omap_control_writel(cdev, temp, tsr->temp_sensor_ctrl);
>>> +
>>> +	return err ? -EIO : 0;
>>> +}
>>> +
>>> +static int omap_bandgap_restore_ctxt(struct omap_bandgap *bg_ptr)
>>> +{
>>> +	struct device *cdev = bg_ptr->dev->parent;
>>> +	int i, err = 0;
>>> +	u32 temp = 0;
>>> +
>>> +	for (i = 0; i<   bg_ptr->pdata->sensor_count; i++) {
>>> +		struct temp_sensor_registers *tsr;
>>> +		struct temp_sensor_regval *rval;
>>> +		u32 val;
>>> +
>>> +		rval = bg_ptr->pdata->sensors[i].regval;
>>> +		tsr = bg_ptr->pdata->sensors[i].registers;
>>> +
>>> +		err = omap_control_readl(cdev, tsr->bgap_counter,&val);
>>> +		if (val == 0) {
>>> +			err |= omap_control_writel(cdev, rval->bg_threshold,
>>> +						   tsr->bgap_threshold);
>>> +			err |= omap_control_writel(cdev, rval->tshut_threshold,
>>> +						   tsr->tshut_threshold);
>>> +			/* Force immediate temperature measurement and update
>>> +			 * of the DTEMP field
>>> +			 */
>>> +			omap_bandgap_force_single_read(bg_ptr, i);
>>> +			err |= omap_control_writel(cdev, rval->bg_counter,
>>> +						   tsr->bgap_counter);
>>> +			err |= omap_control_writel(cdev, rval->bg_mode_ctrl,
>>> +						   tsr->bgap_mode_ctrl);
>>> +			err |= omap_control_writel(cdev, rval->bg_ctrl,
>>> +						   tsr->bgap_mask_ctrl);
>>> +		} else {
>>> +			err |= omap_control_readl(cdev, tsr->temp_sensor_ctrl,
>>> +						&temp);
>>> +			temp&= (tsr->bgap_dtemp_mask);
>>> +			if (temp == 0) {
>>> +				omap_bandgap_force_single_read(bg_ptr, i);
>>> +				err |= omap_control_readl(cdev,
>>> +							  tsr->bgap_mask_ctrl,
>>> +							&temp);
>>> +				temp |= 1<<   __ffs(tsr->mode_ctrl_mask);
>>> +				err |= omap_control_writel(cdev, temp,
>>> +							   tsr->bgap_mask_ctrl);
>>> +			}
>>> +		}
>>> +		if (err)
>>> +			dev_err(bg_ptr->dev, "could not save sensor %d\n", i);
>>> +	}
>>> +
>>> +	return err ? -EIO : 0;
>>> +}
>>> +
>>> +static int omap_bandgap_suspend(struct device *dev)
>>> +{
>>> +	struct omap_bandgap *bg_ptr = dev_get_drvdata(dev);
>>> +	int err;
>>> +
>>> +	err = omap_bandgap_save_ctxt(bg_ptr);
>>> +	clk_disable(bg_ptr->fclock);
>>> +
>>> +	return err;
>>> +}
>>> +
>>> +static int omap_bandgap_resume(struct device *dev)
>>> +{
>>> +	struct omap_bandgap *bg_ptr = dev_get_drvdata(dev);
>>> +
>>> +	clk_enable(bg_ptr->fclock);
>>> +
>>> +	return omap_bandgap_restore_ctxt(bg_ptr);
>>> +}
>>> +static const struct dev_pm_ops omap_bandgap_dev_pm_ops = {
>>> +	SET_SYSTEM_SLEEP_PM_OPS(omap_bandgap_suspend,
>>> +				omap_bandgap_resume)
>>> +};
>>> +
>>> +#define DEV_PM_OPS	(&omap_bandgap_dev_pm_ops)
>>> +#else
>>> +#define DEV_PM_OPS	NULL
>>> +#endif
>>> +
>>> +static struct platform_driver omap_bandgap_sensor_driver = {
>>> +	.probe = omap_bandgap_probe,
>>> +	.remove = omap_bandgap_remove,
>>> +	.driver = {
>>> +			.name = "omap-bandgap",
>>> +			.pm = DEV_PM_OPS,
>>> +			.of_match_table	= of_omap_bandgap_match,
>>> +	},
>>> +};
>>> +
>>> +module_platform_driver(omap_bandgap_sensor_driver);
>>> +early_platform_init("early_omap_temperature",&omap_bandgap_sensor_driver);
>>> +
>>> +MODULE_DESCRIPTION("OMAP4+ bandgap temperature sensor driver");
>>> +MODULE_LICENSE("GPL v2");
>>> +MODULE_ALIAS("platform:omap-bandgap");
>>> +MODULE_AUTHOR("Texas Instrument Inc.");
>>> diff --git a/drivers/thermal/omap-bandgap.h b/drivers/thermal/omap-bandgap.h
>>> new file mode 100644
>>> index 0000000..12e0d6b
>>> --- /dev/null
>>> +++ b/drivers/thermal/omap-bandgap.h
>>> @@ -0,0 +1,63 @@
>>> +/*
>>> + * OMAP4 Bandgap temperature sensor driver
>>> + *
>>> + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
>>> + * Contact:
>>> + *   Eduardo Valentin<eduardo.valentin@ti.com>
>>> + *
>>> + * This program is free software; you can redistribute it and/or
>>> + * modify it under the terms of the GNU General Public License
>>> + * version 2 as published by the Free Software Foundation.
>>> + *
>>> + * This program is distributed in the hope that it will be useful, but
>>> + * WITHOUT ANY WARRANTY; without even the implied warranty of
>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>>> + * General Public License for more details.
>>> + *
>>> + * You should have received a copy of the GNU General Public License
>>> + * along with this program; if not, write to the Free Software
>>> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
>>> + * 02110-1301 USA
>>> + *
>>> + */
>>> +#ifndef __OMAP_BANDGAP_H
>>> +#define __OMAP_BANDGAP_H
>>> +
>>> +struct omap_bandgap_data;
>>> +
>>> +/**
>>> + * struct omap_bandgap - bandgap device structure
>>> + * @dev: device pointer
>>> + * @pdata: platform data with sensor data
>>> + * @fclock: pointer to functional clock of temperature sensor
>>> + * @div_clk: pointer to parent clock of temperature sensor fclk
>>> + * @conv_table: Pointer to adc to temperature conversion table
>>> + * @bg_mutex: Mutex for sysfs, irq and PM
>>> + * @irq: MPU Irq number for thermal alert
>>> + * @tshut_gpio: GPIO where Tshut signal is routed
>>> + * @clk_rate: Holds current clock rate
>>> + */
>>> +struct omap_bandgap {
>>> +	struct device			*dev;
>>> +	const struct omap_bandgap_data	*pdata;
>>> +	struct clk			*fclock;
>>> +	struct clk			*div_clk;
>>> +	const int			*conv_table;
>>> +	struct mutex			bg_mutex; /* Mutex for irq and PM */
>>> +	int				irq;
>>> +	int				tshut_gpio;
>>> +	u32				clk_rate;
>>> +};
>>> +
>>> +int omap_bandgap_read_thot(struct omap_bandgap *bg_ptr, int id, int *thot);
>>> +int omap_bandgap_write_thot(struct omap_bandgap *bg_ptr, int id, int val);
>>> +int omap_bandgap_read_tcold(struct omap_bandgap *bg_ptr, int id, int *tcold);
>>> +int omap_bandgap_write_tcold(struct omap_bandgap *bg_ptr, int id, int val);
>>> +int omap_bandgap_read_update_interval(struct omap_bandgap *bg_ptr, int id,
>>> +				      int *interval);
>>> +int omap_bandgap_write_update_interval(struct omap_bandgap *bg_ptr, int id,
>>> +				       u32 interval);
>>> +int omap_bandgap_read_temperature(struct omap_bandgap *bg_ptr, int id,
>>> +				  int *temperature);
>>> +
>>> +#endif
>>
>
> ---
> Eduardo

  reply	other threads:[~2012-05-29 13:14 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-25  8:25 [RFC PATCH 00/11] OMAP System Control Module Eduardo Valentin
2012-05-25  8:25 ` [RFC PATCH 01/11] ARM: OMAP4: Remove un-used control module headers and defines Eduardo Valentin
2012-05-28  9:12   ` Shilimkar, Santosh
2012-05-25  8:25 ` [RFC PATCH 02/11] ARM: OMAP: expose control.h to mach area Eduardo Valentin
2012-05-28  9:25   ` Shilimkar, Santosh
2012-05-28 10:30     ` Valentin, Eduardo
2012-06-01 11:19       ` Tony Lindgren
2012-05-25  8:25 ` [RFC PATCH 03/11] arm: omap: device: create a device for system control module Eduardo Valentin
2012-05-25 12:30   ` Cousson, Benoit
2012-05-29  9:44     ` Eduardo Valentin
2012-06-14 13:50       ` Konstantin Baydarov
2012-06-15  9:22         ` Valentin, Eduardo
2012-05-29 13:39   ` Konstantin Baydarov
2012-05-25  8:25 ` [RFC PATCH 04/11] OMAP: Add early " Eduardo Valentin
2012-05-25 11:32   ` Konstantin Baydarov
2012-05-25 11:44     ` Valentin, Eduardo
2012-05-25 11:54   ` Konstantin Baydarov
2012-05-25 12:32   ` Cousson, Benoit
2012-05-28  9:58   ` Shilimkar, Santosh
2012-05-25  8:25 ` [RFC PATCH 05/11] mfd: omap: control: core system control driver Eduardo Valentin
2012-05-25 12:52   ` Cousson, Benoit
2012-05-28 11:35     ` Eduardo Valentin
2012-05-29 13:25       ` Cousson, Benoit
2012-06-01 11:29         ` Tony Lindgren
2012-06-01 12:30           ` Shilimkar, Santosh
2012-06-01 12:43             ` Cousson, Benoit
2012-06-01 17:19               ` Eduardo Valentin
2012-06-01 13:40           ` Konstantin Baydarov
2012-06-01 14:13             ` Tony Lindgren
2012-06-01 14:26               ` Konstantin Baydarov
2012-05-28  9:54   ` Shilimkar, Santosh
2012-05-28 11:42     ` Eduardo Valentin
2012-05-28 13:15       ` Shilimkar, Santosh
2012-05-29 13:31         ` Cousson, Benoit
2012-05-25  8:25 ` [RFC PATCH 06/11] OMAP2+: use control module mfd driver in omap_type Eduardo Valentin
2012-05-25 12:53   ` Cousson, Benoit
2012-05-28 10:02     ` Shilimkar, Santosh
2012-05-28 11:24       ` Eduardo Valentin
2012-06-01 11:35         ` Tony Lindgren
2012-05-25  8:25 ` [RFC PATCH 07/11] mfd: omap: control: usb-phy: introduce the ctrl-module usb driver Eduardo Valentin
2012-05-25 13:35   ` Shubhrajyoti Datta
2012-05-25 15:06   ` Cousson, Benoit
2012-06-01 11:38   ` Tony Lindgren
2012-06-01 13:20     ` [linux-pm] " Tony Lindgren
2012-06-01 14:07       ` Kevin Hilman
2012-06-01 14:15         ` Tony Lindgren
2012-05-25  8:25 ` [RFC PATCH 08/11] ARM: OMAP4+: Adding the temperature sensor register set bit fields Eduardo Valentin
2012-05-25 15:13   ` Cousson, Benoit
2012-05-28 11:17     ` Eduardo Valentin
2012-05-28 10:04   ` Shilimkar, Santosh
2012-05-28 11:18     ` Eduardo Valentin
2012-05-25  8:25 ` [RFC PATCH 09/11] ARM: OMAP4+: thermal: introduce bandgap temperature sensor Eduardo Valentin
2012-05-25 15:49   ` Cousson, Benoit
2012-05-28 11:06     ` Eduardo Valentin
2012-05-28 11:16     ` Eduardo Valentin
2012-05-29 13:14       ` Cousson, Benoit [this message]
2012-05-29 17:51         ` Mike Turquette
2012-05-25 16:39   ` Konstantin Baydarov
2012-05-28 10:55     ` Eduardo Valentin
2012-06-01 11:42   ` Tony Lindgren
2012-05-25  8:26 ` [RFC PATCH 10/11] omap4: thermal: add basic CPU thermal zone Eduardo Valentin
2012-05-28  9:33   ` Shilimkar, Santosh
2012-05-28  9:48     ` Felipe Balbi
2012-05-28 10:26       ` Valentin, Eduardo
2012-05-29 12:54         ` Cousson, Benoit
2012-05-25  8:26 ` [RFC PATCH 11/11] ARM: DT: Add support to system control module for OMAP4 Eduardo Valentin
2012-05-29  9:49   ` Konstantin Baydarov
2012-05-30  8:38     ` Cousson, Benoit
2012-05-30  9:05       ` Konstantin Baydarov
2012-05-30  9:26         ` Cousson, Benoit
2012-05-30 10:17           ` Konstantin Baydarov
2012-05-30 10:22             ` Cousson, Benoit
2012-05-30 10:42               ` Eduardo Valentin
2012-05-30 12:16                 ` Cousson, Benoit
2012-05-31 12:06           ` Konstantin Baydarov
2012-05-31 12:49             ` Eduardo Valentin
2012-05-31 12:52               ` Cousson, Benoit
2012-05-31 14:51                 ` Konstantin Baydarov
2012-05-25  8:35 ` [RFC PATCH 00/11] OMAP System Control Module Eduardo Valentin
2012-05-25 10:50 ` Konstantin Baydarov
2012-05-25 11:11   ` Valentin, Eduardo
2012-05-25 12:21     ` Konstantin Baydarov
2012-06-01  0:12 ` [linux-pm] " Kevin Hilman
2012-06-18 11:32 ` [RFC PATCH v2 01/11] ARM: OMAP4: Remove un-used control module headers and defines Konstantin Baydarov
2012-06-18 11:32 ` [RFC PATCH v2 02/11] ARM: OMAP: expose control.h to mach area Konstantin Baydarov
2012-06-20 10:17   ` Tony Lindgren
2012-06-18 11:32 ` [RFC PATCH v2 03/11] mfd: omap: control: core system control driver Konstantin Baydarov
2012-06-20 10:22   ` Tony Lindgren
2012-06-20 14:13     ` Konstantin Baydarov
2012-06-26 11:17       ` Tony Lindgren
2012-06-18 11:32 ` [RFC PATCH v2 04/11] OMAP2+: use control module mfd driver in omap_type Konstantin Baydarov
2012-06-20 10:24   ` Tony Lindgren
2012-06-18 11:32 ` [RFC PATCH v2 05/11] mfd: omap: control: usb-phy: introduce the ctrl-module usb driver Konstantin Baydarov
2012-06-18 11:32 ` [RFC PATCH v2 06/11] ARM: OMAP4+: Adding the temperature sensor register set bit fields Konstantin Baydarov
2012-06-20 10:25   ` Tony Lindgren
2012-06-18 11:32 ` [RFC PATCH v2 07/11] ARM: OMAP4+: thermal: introduce bandgap temperature sensor Konstantin Baydarov
2012-06-18 11:32 ` [RFC PATCH v2 08/11] omap4: thermal: add basic CPU thermal zone Konstantin Baydarov
2012-06-18 11:32 ` [RFC PATCH v2 09/11] ARM: DT: Add support to system control module for OMAP4 Konstantin Baydarov
2012-06-18 12:13   ` Sergei Shtylyov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4FC4CBC8.2040600@ti.com \
    --to=b-cousson@ti.com \
    --cc=amit.kucheria@linaro.org \
    --cc=balbi@ti.com \
    --cc=eduardo.valentin@ti.com \
    --cc=j-keerthy@ti.com \
    --cc=kbaidarov@dev.rtsoft.ru \
    --cc=kishon@ti.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-pm@lists.linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).