[2/3] thermal: armada: add support for AP806
diff mbox

Message ID 320800cce532d6ae1927b36f82b007f04c740a15.1511361725.git.baruch@tkos.co.il
State New, archived
Headers show

Commit Message

Baruch Siach Nov. 22, 2017, 2:42 p.m. UTC
The AP806 component is integrated in the Armada 8k and 7k lines of processors.

Signed-off-by: Baruch Siach <baruch@tkos.co.il>
---
 drivers/thermal/armada_thermal.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

Comments

Russell King - ARM Linux admin Nov. 23, 2017, 3:24 p.m. UTC | #1
On Wed, Nov 22, 2017 at 04:42:04PM +0200, Baruch Siach wrote:
> The AP806 component is integrated in the Armada 8k and 7k lines of processors.
> 
> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
> ---
>  drivers/thermal/armada_thermal.c | 32 ++++++++++++++++++++++++++++++++
>  1 file changed, 32 insertions(+)
> 
> diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
> index ae75328945f7..1f7f81628040 100644
> --- a/drivers/thermal/armada_thermal.c
> +++ b/drivers/thermal/armada_thermal.c
> @@ -41,6 +41,10 @@
>  #define A375_HW_RESETn			BIT(8)
>  #define A380_HW_RESET			BIT(8)
>  
> +#define AP806_START			BIT(0)
> +#define AP806_RESET			BIT(1)
> +#define AP806_ENABLE			BIT(2)
> +
>  struct armada_thermal_data;
>  
>  /* Marvell EBU Thermal Sensor Dev Structure */
> @@ -147,6 +151,18 @@ static void armada380_init_sensor(struct platform_device *pdev,
>  	}
>  }
>  
> +static void armada_ap806_init_sensor(struct platform_device *pdev,
> +				     struct armada_thermal_priv *priv)
> +{
> +	u32 reg = readl_relaxed(priv->control);
> +
> +	reg &= ~AP806_RESET;
> +	reg |= AP806_START;
> +	reg |= AP806_ENABLE;
> +	writel(reg, priv->control);
> +	mdelay(10);

Do you really need to make the CPU busy-wait for 10ms here?  This
looks like it's called from a schedulable context, so won't msleep()
do?
Baruch Siach Nov. 23, 2017, 4:35 p.m. UTC | #2
Hi Russell,

On Thu, Nov 23, 2017 at 03:24:17PM +0000, Russell King - ARM Linux wrote:
> On Wed, Nov 22, 2017 at 04:42:04PM +0200, Baruch Siach wrote:
> > The AP806 component is integrated in the Armada 8k and 7k lines of processors.
> > 
> > Signed-off-by: Baruch Siach <baruch@tkos.co.il>
> > ---
> >  drivers/thermal/armada_thermal.c | 32 ++++++++++++++++++++++++++++++++
> >  1 file changed, 32 insertions(+)
> > 
> > diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
> > index ae75328945f7..1f7f81628040 100644
> > --- a/drivers/thermal/armada_thermal.c
> > +++ b/drivers/thermal/armada_thermal.c
> > @@ -41,6 +41,10 @@
> >  #define A375_HW_RESETn			BIT(8)
> >  #define A380_HW_RESET			BIT(8)
> >  
> > +#define AP806_START			BIT(0)
> > +#define AP806_RESET			BIT(1)
> > +#define AP806_ENABLE			BIT(2)
> > +
> >  struct armada_thermal_data;
> >  
> >  /* Marvell EBU Thermal Sensor Dev Structure */
> > @@ -147,6 +151,18 @@ static void armada380_init_sensor(struct platform_device *pdev,
> >  	}
> >  }
> >  
> > +static void armada_ap806_init_sensor(struct platform_device *pdev,
> > +				     struct armada_thermal_priv *priv)
> > +{
> > +	u32 reg = readl_relaxed(priv->control);
> > +
> > +	reg &= ~AP806_RESET;
> > +	reg |= AP806_START;
> > +	reg |= AP806_ENABLE;
> > +	writel(reg, priv->control);
> > +	mdelay(10);
> 
> Do you really need to make the CPU busy-wait for 10ms here?  This
> looks like it's called from a schedulable context, so won't msleep()
> do?

msleep() should be fine as well. I just mindlessly copied this code from the 
vendor kernel. I'll change that in the next iteration.

Thanks for reviewing,
baruch
Eduardo Valentin Nov. 27, 2017, 7:21 p.m. UTC | #3
On Thu, Nov 23, 2017 at 06:35:10PM +0200, Baruch Siach wrote:
> Hi Russell,
> 
> On Thu, Nov 23, 2017 at 03:24:17PM +0000, Russell King - ARM Linux wrote:
> > On Wed, Nov 22, 2017 at 04:42:04PM +0200, Baruch Siach wrote:
> > > The AP806 component is integrated in the Armada 8k and 7k lines of processors.

<cut>

> > > +	mdelay(10);
> > 
> > Do you really need to make the CPU busy-wait for 10ms here?  This
> > looks like it's called from a schedulable context, so won't msleep()
> > do?

Yes, that is schedulable context.

> 
> msleep() should be fine as well. I just mindlessly copied this code from the 
> vendor kernel. I'll change that in the next iteration.
> 

Yes please, send next version without CPU spinning delays.


> Thanks for reviewing,
> baruch
> 
> -- 
>      http://baruch.siach.name/blog/                  ~. .~   Tk Open Systems
> =}------------------------------------------------ooO--U--Ooo------------{=
>    - baruch@tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -

Patch
diff mbox

diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
index ae75328945f7..1f7f81628040 100644
--- a/drivers/thermal/armada_thermal.c
+++ b/drivers/thermal/armada_thermal.c
@@ -41,6 +41,10 @@ 
 #define A375_HW_RESETn			BIT(8)
 #define A380_HW_RESET			BIT(8)
 
+#define AP806_START			BIT(0)
+#define AP806_RESET			BIT(1)
+#define AP806_ENABLE			BIT(2)
+
 struct armada_thermal_data;
 
 /* Marvell EBU Thermal Sensor Dev Structure */
@@ -147,6 +151,18 @@  static void armada380_init_sensor(struct platform_device *pdev,
 	}
 }
 
+static void armada_ap806_init_sensor(struct platform_device *pdev,
+				     struct armada_thermal_priv *priv)
+{
+	u32 reg = readl_relaxed(priv->control);
+
+	reg &= ~AP806_RESET;
+	reg |= AP806_START;
+	reg |= AP806_ENABLE;
+	writel(reg, priv->control);
+	mdelay(10);
+}
+
 static bool armada_is_valid(struct armada_thermal_priv *priv)
 {
 	unsigned long reg = readl_relaxed(priv->sensor);
@@ -230,6 +246,18 @@  static const struct armada_thermal_data armada380_data = {
 	.inverted = true,
 };
 
+static const struct armada_thermal_data armada_ap806_data = {
+	.is_valid = armada_is_valid,
+	.init_sensor = armada_ap806_init_sensor,
+	.is_valid_shift = 16,
+	.temp_shift = 0,
+	.temp_mask = 0x3ff,
+	.coef_b = 1172499100UL,
+	.coef_m = 2000096UL,
+	.coef_div = 4201,
+	.inverted = true,
+};
+
 static const struct of_device_id armada_thermal_id_table[] = {
 	{
 		.compatible = "marvell,armadaxp-thermal",
@@ -247,6 +275,10 @@  static const struct of_device_id armada_thermal_id_table[] = {
 		.compatible = "marvell,armada380-thermal",
 		.data       = &armada380_data,
 	},
+	{
+		.compatible = "marvell,armada-ap806-thermal",
+		.data       = &armada_ap806_data,
+	},
 	{
 		/* sentinel */
 	},