diff mbox

[5/9] rc: sunxi-cir: Add support for the larger fifo found on sun5i and sun6i

Message ID 1416498928-1300-6-git-send-email-hdegoede@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Hans de Goede Nov. 20, 2014, 3:55 p.m. UTC
Add support for the larger fifo found on sun5i and sun6i, having a separate
compatible for the ir found on sun5i & sun6i also is useful if we ever want
to add ir transmit support, because the sun5i & sun6i version do not have
transmit support.

Note this commits also adds checking for the end-of-packet interrupt flag
(which was already enabled), as the fifo-data-available interrupt flag only
gets set when the trigger-level is exceeded. So far we've been getting away
with not doing this because of the low trigger-level, but this is something
which we should have done since day one.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 .../devicetree/bindings/media/sunxi-ir.txt          |  2 +-
 drivers/media/rc/sunxi-cir.c                        | 21 ++++++++++++---------
 2 files changed, 13 insertions(+), 10 deletions(-)

Comments

Mauro Carvalho Chehab Nov. 20, 2014, 4:28 p.m. UTC | #1
Em Thu, 20 Nov 2014 16:55:24 +0100
Hans de Goede <hdegoede@redhat.com> escreveu:

> Add support for the larger fifo found on sun5i and sun6i, having a separate
> compatible for the ir found on sun5i & sun6i also is useful if we ever want
> to add ir transmit support, because the sun5i & sun6i version do not have
> transmit support.
> 
> Note this commits also adds checking for the end-of-packet interrupt flag
> (which was already enabled), as the fifo-data-available interrupt flag only
> gets set when the trigger-level is exceeded. So far we've been getting away
> with not doing this because of the low trigger-level, but this is something
> which we should have done since day one.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>

As this is meant to be merged via some other tree:

Acked-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>


> ---
>  .../devicetree/bindings/media/sunxi-ir.txt          |  2 +-
>  drivers/media/rc/sunxi-cir.c                        | 21 ++++++++++++---------
>  2 files changed, 13 insertions(+), 10 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/media/sunxi-ir.txt b/Documentation/devicetree/bindings/media/sunxi-ir.txt
> index 23dd5ad..5767128 100644
> --- a/Documentation/devicetree/bindings/media/sunxi-ir.txt
> +++ b/Documentation/devicetree/bindings/media/sunxi-ir.txt
> @@ -1,7 +1,7 @@
>  Device-Tree bindings for SUNXI IR controller found in sunXi SoC family
>  
>  Required properties:
> -- compatible	    : should be "allwinner,sun4i-a10-ir";
> +- compatible	    : "allwinner,sun4i-a10-ir" or "allwinner,sun5i-a13-ir"
>  - clocks	    : list of clock specifiers, corresponding to
>  		      entries in clock-names property;
>  - clock-names	    : should contain "apb" and "ir" entries;
> diff --git a/drivers/media/rc/sunxi-cir.c b/drivers/media/rc/sunxi-cir.c
> index 895fb65..559b0e3 100644
> --- a/drivers/media/rc/sunxi-cir.c
> +++ b/drivers/media/rc/sunxi-cir.c
> @@ -56,12 +56,12 @@
>  #define REG_RXINT_RAI_EN		BIT(4)
>  
>  /* Rx FIFO available byte level */
> -#define REG_RXINT_RAL(val)    (((val) << 8) & (GENMASK(11, 8)))
> +#define REG_RXINT_RAL(val)    ((val) << 8)
>  
>  /* Rx Interrupt Status */
>  #define SUNXI_IR_RXSTA_REG    0x30
>  /* RX FIFO Get Available Counter */
> -#define REG_RXSTA_GET_AC(val) (((val) >> 8) & (GENMASK(5, 0)))
> +#define REG_RXSTA_GET_AC(val) (((val) >> 8) & (ir->fifo_size * 2 - 1))
>  /* Clear all interrupt status value */
>  #define REG_RXSTA_CLEARALL    0xff
>  
> @@ -72,10 +72,6 @@
>  /* CIR_REG register idle threshold */
>  #define REG_CIR_ITHR(val)    (((val) << 8) & (GENMASK(15, 8)))
>  
> -/* Hardware supported fifo size */
> -#define SUNXI_IR_FIFO_SIZE    16
> -/* How many messages in FIFO trigger IRQ */
> -#define TRIGGER_LEVEL         8
>  /* Required frequency for IR0 or IR1 clock in CIR mode */
>  #define SUNXI_IR_BASE_CLK     8000000
>  /* Frequency after IR internal divider  */
> @@ -94,6 +90,7 @@ struct sunxi_ir {
>  	struct rc_dev   *rc;
>  	void __iomem    *base;
>  	int             irq;
> +	int		fifo_size;
>  	struct clk      *clk;
>  	struct clk      *apb_clk;
>  	struct reset_control *rst;
> @@ -115,11 +112,11 @@ static irqreturn_t sunxi_ir_irq(int irqno, void *dev_id)
>  	/* clean all pending statuses */
>  	writel(status | REG_RXSTA_CLEARALL, ir->base + SUNXI_IR_RXSTA_REG);
>  
> -	if (status & REG_RXINT_RAI_EN) {
> +	if (status & (REG_RXINT_RAI_EN | REG_RXINT_RPEI_EN)) {
>  		/* How many messages in fifo */
>  		rc  = REG_RXSTA_GET_AC(status);
>  		/* Sanity check */
> -		rc = rc > SUNXI_IR_FIFO_SIZE ? SUNXI_IR_FIFO_SIZE : rc;
> +		rc = rc > ir->fifo_size ? ir->fifo_size : rc;
>  		/* If we have data */
>  		for (cnt = 0; cnt < rc; cnt++) {
>  			/* for each bit in fifo */
> @@ -156,6 +153,11 @@ static int sunxi_ir_probe(struct platform_device *pdev)
>  	if (!ir)
>  		return -ENOMEM;
>  
> +	if (of_device_is_compatible(dn, "allwinner,sun5i-a13-ir"))
> +		ir->fifo_size = 64;
> +	else
> +		ir->fifo_size = 16;
> +
>  	/* Clock */
>  	ir->apb_clk = devm_clk_get(dev, "apb");
>  	if (IS_ERR(ir->apb_clk)) {
> @@ -271,7 +273,7 @@ static int sunxi_ir_probe(struct platform_device *pdev)
>  	 * level
>  	 */
>  	writel(REG_RXINT_ROI_EN | REG_RXINT_RPEI_EN |
> -	       REG_RXINT_RAI_EN | REG_RXINT_RAL(TRIGGER_LEVEL - 1),
> +	       REG_RXINT_RAI_EN | REG_RXINT_RAL(ir->fifo_size / 2 - 1),
>  	       ir->base + SUNXI_IR_RXINT_REG);
>  
>  	/* Enable IR Module */
> @@ -319,6 +321,7 @@ static int sunxi_ir_remove(struct platform_device *pdev)
>  
>  static const struct of_device_id sunxi_ir_match[] = {
>  	{ .compatible = "allwinner,sun4i-a10-ir", },
> +	{ .compatible = "allwinner,sun5i-a13-ir", },
>  	{},
>  };
>  
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Maxime Ripard Nov. 21, 2014, 8:26 a.m. UTC | #2
Hi Mauro,

On Thu, Nov 20, 2014 at 02:28:56PM -0200, Mauro Carvalho Chehab wrote:
> Em Thu, 20 Nov 2014 16:55:24 +0100
> Hans de Goede <hdegoede@redhat.com> escreveu:
> 
> > Add support for the larger fifo found on sun5i and sun6i, having a separate
> > compatible for the ir found on sun5i & sun6i also is useful if we ever want
> > to add ir transmit support, because the sun5i & sun6i version do not have
> > transmit support.
> > 
> > Note this commits also adds checking for the end-of-packet interrupt flag
> > (which was already enabled), as the fifo-data-available interrupt flag only
> > gets set when the trigger-level is exceeded. So far we've been getting away
> > with not doing this because of the low trigger-level, but this is something
> > which we should have done since day one.
> > 
> > Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> 
> As this is meant to be merged via some other tree:
> 
> Acked-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

I think merging it through your tree would be just fine.

Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>

Maxime
Hans de Goede Nov. 21, 2014, 8:42 a.m. UTC | #3
Hi,

On 11/21/2014 09:26 AM, Maxime Ripard wrote:
> Hi Mauro,
> 
> On Thu, Nov 20, 2014 at 02:28:56PM -0200, Mauro Carvalho Chehab wrote:
>> Em Thu, 20 Nov 2014 16:55:24 +0100
>> Hans de Goede <hdegoede@redhat.com> escreveu:
>>
>>> Add support for the larger fifo found on sun5i and sun6i, having a separate
>>> compatible for the ir found on sun5i & sun6i also is useful if we ever want
>>> to add ir transmit support, because the sun5i & sun6i version do not have
>>> transmit support.
>>>
>>> Note this commits also adds checking for the end-of-packet interrupt flag
>>> (which was already enabled), as the fifo-data-available interrupt flag only
>>> gets set when the trigger-level is exceeded. So far we've been getting away
>>> with not doing this because of the low trigger-level, but this is something
>>> which we should have done since day one.
>>>
>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>>
>> As this is meant to be merged via some other tree:
>>
>> Acked-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
> 
> I think merging it through your tree would be just fine.
> 
> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>

Heh, I was thinking it would be best if it went through Maxime's tree because
it also has some deps on new clk stuff (well the dts have deps on that), but either
way works for me.

Maxime if you want this go through Mauro's tree, I can send a pull-req to Mauro
(I'm a linux-media sub-maintainer), so if that is the case let me know and I'll
prepare a pull-req (after fixing the missing reset documentation in the bindings).

Regards,

Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Maxime Ripard Nov. 21, 2014, 9:59 a.m. UTC | #4
On Fri, Nov 21, 2014 at 09:42:09AM +0100, Hans de Goede wrote:
> Hi,
> 
> On 11/21/2014 09:26 AM, Maxime Ripard wrote:
> > Hi Mauro,
> > 
> > On Thu, Nov 20, 2014 at 02:28:56PM -0200, Mauro Carvalho Chehab wrote:
> >> Em Thu, 20 Nov 2014 16:55:24 +0100
> >> Hans de Goede <hdegoede@redhat.com> escreveu:
> >>
> >>> Add support for the larger fifo found on sun5i and sun6i, having a separate
> >>> compatible for the ir found on sun5i & sun6i also is useful if we ever want
> >>> to add ir transmit support, because the sun5i & sun6i version do not have
> >>> transmit support.
> >>>
> >>> Note this commits also adds checking for the end-of-packet interrupt flag
> >>> (which was already enabled), as the fifo-data-available interrupt flag only
> >>> gets set when the trigger-level is exceeded. So far we've been getting away
> >>> with not doing this because of the low trigger-level, but this is something
> >>> which we should have done since day one.
> >>>
> >>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> >>
> >> As this is meant to be merged via some other tree:
> >>
> >> Acked-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
> > 
> > I think merging it through your tree would be just fine.
> > 
> > Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> 
> Heh, I was thinking it would be best if it went through Maxime's tree because
> it also has some deps on new clk stuff (well the dts have deps on that), but either
> way works for me.
> 
> Maxime if you want this go through Mauro's tree, I can send a pull-req to Mauro
> (I'm a linux-media sub-maintainer), so if that is the case let me know and I'll
> prepare a pull-req (after fixing the missing reset documentation in the bindings).

So much for not reading the cover letter... Sorry.

We're getting quite close to the end of the ARM merge window, and I
got a couple comments, Lee hasn't commented yet, so I'd say it's a bit
too late for this to come in.

If Mauro is happy with the current patches for him, it's completely
fine to merge it through his tree. The DTS can wait.

Maxime
Hans de Goede Nov. 21, 2014, 10:13 a.m. UTC | #5
Hi,

On 11/21/2014 10:59 AM, Maxime Ripard wrote:
> On Fri, Nov 21, 2014 at 09:42:09AM +0100, Hans de Goede wrote:
>> Hi,
>>
>> On 11/21/2014 09:26 AM, Maxime Ripard wrote:
>>> Hi Mauro,
>>>
>>> On Thu, Nov 20, 2014 at 02:28:56PM -0200, Mauro Carvalho Chehab wrote:
>>>> Em Thu, 20 Nov 2014 16:55:24 +0100
>>>> Hans de Goede <hdegoede@redhat.com> escreveu:
>>>>
>>>>> Add support for the larger fifo found on sun5i and sun6i, having a separate
>>>>> compatible for the ir found on sun5i & sun6i also is useful if we ever want
>>>>> to add ir transmit support, because the sun5i & sun6i version do not have
>>>>> transmit support.
>>>>>
>>>>> Note this commits also adds checking for the end-of-packet interrupt flag
>>>>> (which was already enabled), as the fifo-data-available interrupt flag only
>>>>> gets set when the trigger-level is exceeded. So far we've been getting away
>>>>> with not doing this because of the low trigger-level, but this is something
>>>>> which we should have done since day one.
>>>>>
>>>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>>>>
>>>> As this is meant to be merged via some other tree:
>>>>
>>>> Acked-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
>>>
>>> I think merging it through your tree would be just fine.
>>>
>>> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
>>
>> Heh, I was thinking it would be best if it went through Maxime's tree because
>> it also has some deps on new clk stuff (well the dts have deps on that), but either
>> way works for me.
>>
>> Maxime if you want this go through Mauro's tree, I can send a pull-req to Mauro
>> (I'm a linux-media sub-maintainer), so if that is the case let me know and I'll
>> prepare a pull-req (after fixing the missing reset documentation in the bindings).
> 
> So much for not reading the cover letter... Sorry.
> 
> We're getting quite close to the end of the ARM merge window, and I
> got a couple comments, Lee hasn't commented yet, so I'd say it's a bit
> too late for this to come in.

Oh, but this was not intended for 3.19, this can wait till 3.20 from my pov,
sorry if that was not clear. I was assuming that the merge window was more
or less closed already, so that this going into 3.20 was expected.

Regrrds,

Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Maxime Ripard Nov. 23, 2014, 3:47 p.m. UTC | #6
On Fri, Nov 21, 2014 at 11:13:17AM +0100, Hans de Goede wrote:
> Hi,
> 
> On 11/21/2014 10:59 AM, Maxime Ripard wrote:
> > On Fri, Nov 21, 2014 at 09:42:09AM +0100, Hans de Goede wrote:
> >> Hi,
> >>
> >> On 11/21/2014 09:26 AM, Maxime Ripard wrote:
> >>> Hi Mauro,
> >>>
> >>> On Thu, Nov 20, 2014 at 02:28:56PM -0200, Mauro Carvalho Chehab wrote:
> >>>> Em Thu, 20 Nov 2014 16:55:24 +0100
> >>>> Hans de Goede <hdegoede@redhat.com> escreveu:
> >>>>
> >>>>> Add support for the larger fifo found on sun5i and sun6i, having a separate
> >>>>> compatible for the ir found on sun5i & sun6i also is useful if we ever want
> >>>>> to add ir transmit support, because the sun5i & sun6i version do not have
> >>>>> transmit support.
> >>>>>
> >>>>> Note this commits also adds checking for the end-of-packet interrupt flag
> >>>>> (which was already enabled), as the fifo-data-available interrupt flag only
> >>>>> gets set when the trigger-level is exceeded. So far we've been getting away
> >>>>> with not doing this because of the low trigger-level, but this is something
> >>>>> which we should have done since day one.
> >>>>>
> >>>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> >>>>
> >>>> As this is meant to be merged via some other tree:
> >>>>
> >>>> Acked-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
> >>>
> >>> I think merging it through your tree would be just fine.
> >>>
> >>> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> >>
> >> Heh, I was thinking it would be best if it went through Maxime's tree because
> >> it also has some deps on new clk stuff (well the dts have deps on that), but either
> >> way works for me.
> >>
> >> Maxime if you want this go through Mauro's tree, I can send a pull-req to Mauro
> >> (I'm a linux-media sub-maintainer), so if that is the case let me know and I'll
> >> prepare a pull-req (after fixing the missing reset documentation in the bindings).
> > 
> > So much for not reading the cover letter... Sorry.
> > 
> > We're getting quite close to the end of the ARM merge window, and I
> > got a couple comments, Lee hasn't commented yet, so I'd say it's a bit
> > too late for this to come in.
> 
> Oh, but this was not intended for 3.19, this can wait till 3.20 from my pov,
> sorry if that was not clear. I was assuming that the merge window was more
> or less closed already, so that this going into 3.20 was expected.

Perfect then :)

Maxime
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/media/sunxi-ir.txt b/Documentation/devicetree/bindings/media/sunxi-ir.txt
index 23dd5ad..5767128 100644
--- a/Documentation/devicetree/bindings/media/sunxi-ir.txt
+++ b/Documentation/devicetree/bindings/media/sunxi-ir.txt
@@ -1,7 +1,7 @@ 
 Device-Tree bindings for SUNXI IR controller found in sunXi SoC family
 
 Required properties:
-- compatible	    : should be "allwinner,sun4i-a10-ir";
+- compatible	    : "allwinner,sun4i-a10-ir" or "allwinner,sun5i-a13-ir"
 - clocks	    : list of clock specifiers, corresponding to
 		      entries in clock-names property;
 - clock-names	    : should contain "apb" and "ir" entries;
diff --git a/drivers/media/rc/sunxi-cir.c b/drivers/media/rc/sunxi-cir.c
index 895fb65..559b0e3 100644
--- a/drivers/media/rc/sunxi-cir.c
+++ b/drivers/media/rc/sunxi-cir.c
@@ -56,12 +56,12 @@ 
 #define REG_RXINT_RAI_EN		BIT(4)
 
 /* Rx FIFO available byte level */
-#define REG_RXINT_RAL(val)    (((val) << 8) & (GENMASK(11, 8)))
+#define REG_RXINT_RAL(val)    ((val) << 8)
 
 /* Rx Interrupt Status */
 #define SUNXI_IR_RXSTA_REG    0x30
 /* RX FIFO Get Available Counter */
-#define REG_RXSTA_GET_AC(val) (((val) >> 8) & (GENMASK(5, 0)))
+#define REG_RXSTA_GET_AC(val) (((val) >> 8) & (ir->fifo_size * 2 - 1))
 /* Clear all interrupt status value */
 #define REG_RXSTA_CLEARALL    0xff
 
@@ -72,10 +72,6 @@ 
 /* CIR_REG register idle threshold */
 #define REG_CIR_ITHR(val)    (((val) << 8) & (GENMASK(15, 8)))
 
-/* Hardware supported fifo size */
-#define SUNXI_IR_FIFO_SIZE    16
-/* How many messages in FIFO trigger IRQ */
-#define TRIGGER_LEVEL         8
 /* Required frequency for IR0 or IR1 clock in CIR mode */
 #define SUNXI_IR_BASE_CLK     8000000
 /* Frequency after IR internal divider  */
@@ -94,6 +90,7 @@  struct sunxi_ir {
 	struct rc_dev   *rc;
 	void __iomem    *base;
 	int             irq;
+	int		fifo_size;
 	struct clk      *clk;
 	struct clk      *apb_clk;
 	struct reset_control *rst;
@@ -115,11 +112,11 @@  static irqreturn_t sunxi_ir_irq(int irqno, void *dev_id)
 	/* clean all pending statuses */
 	writel(status | REG_RXSTA_CLEARALL, ir->base + SUNXI_IR_RXSTA_REG);
 
-	if (status & REG_RXINT_RAI_EN) {
+	if (status & (REG_RXINT_RAI_EN | REG_RXINT_RPEI_EN)) {
 		/* How many messages in fifo */
 		rc  = REG_RXSTA_GET_AC(status);
 		/* Sanity check */
-		rc = rc > SUNXI_IR_FIFO_SIZE ? SUNXI_IR_FIFO_SIZE : rc;
+		rc = rc > ir->fifo_size ? ir->fifo_size : rc;
 		/* If we have data */
 		for (cnt = 0; cnt < rc; cnt++) {
 			/* for each bit in fifo */
@@ -156,6 +153,11 @@  static int sunxi_ir_probe(struct platform_device *pdev)
 	if (!ir)
 		return -ENOMEM;
 
+	if (of_device_is_compatible(dn, "allwinner,sun5i-a13-ir"))
+		ir->fifo_size = 64;
+	else
+		ir->fifo_size = 16;
+
 	/* Clock */
 	ir->apb_clk = devm_clk_get(dev, "apb");
 	if (IS_ERR(ir->apb_clk)) {
@@ -271,7 +273,7 @@  static int sunxi_ir_probe(struct platform_device *pdev)
 	 * level
 	 */
 	writel(REG_RXINT_ROI_EN | REG_RXINT_RPEI_EN |
-	       REG_RXINT_RAI_EN | REG_RXINT_RAL(TRIGGER_LEVEL - 1),
+	       REG_RXINT_RAI_EN | REG_RXINT_RAL(ir->fifo_size / 2 - 1),
 	       ir->base + SUNXI_IR_RXINT_REG);
 
 	/* Enable IR Module */
@@ -319,6 +321,7 @@  static int sunxi_ir_remove(struct platform_device *pdev)
 
 static const struct of_device_id sunxi_ir_match[] = {
 	{ .compatible = "allwinner,sun4i-a10-ir", },
+	{ .compatible = "allwinner,sun5i-a13-ir", },
 	{},
 };