All of lore.kernel.org
 help / color / mirror / Atom feed
From: zhangfei.gao@linaro.org (zhangfei)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 2/3] rc: Introduce hix5hd2 IR transmitter driver
Date: Sat, 30 Aug 2014 21:58:22 +0800	[thread overview]
Message-ID: <5401D87E.6000804@linaro.org> (raw)
In-Reply-To: <53FFF675.7020702@gmail.com>



On 08/29/2014 11:41 AM, Varka Bhadram wrote:
> On 08/28/2014 08:46 PM, Zhangfei Gao wrote:
>> From: Guoxiong Yan <yanguoxiong@huawei.com>
>>
>> IR transmitter driver for Hisilicon hix5hd2 soc
>>
>> By default all protocols are disabled.
>> For example nec decoder can be enabled by either
>> 1. ir-keytable -p nec
>> 2. echo nec > /sys/class/rc/rc0/protocols
>> See see Documentation/ABI/testing/sysfs-class-rc
>>
> (...)
>
>> +static irqreturn_t hix5hd2_ir_rx_interrupt(int irq, void *data)
>> +{
>> +    u32 symb_num, symb_val, symb_time;
>> +    u32 data_l, data_h;
>> +    u32 irq_sr, i;
>> +    struct hix5hd2_ir_priv *priv = data;
>> +
>> +    irq_sr = readl_relaxed(priv->base + IR_INTS);
>> +    if (irq_sr & INTMS_OVERFLOW) {
>> +        /*
>> +         * we must read IR_DATAL first, then we can clean up
>> +         * IR_INTS availably since logic would not clear
>> +         * fifo when overflow, drv do the job
>> +         */
>> +        ir_raw_event_reset(priv->rdev);
>> +        symb_num = readl_relaxed(priv->base + IR_DATAH);
>> +        for (i = 0; i < symb_num; i++)
>> +            readl_relaxed(priv->base + IR_DATAL);
>> +
>> +        writel_relaxed(INT_CLR_OVERFLOW, priv->base + IR_INTC);
>> +        dev_info(priv->dev, "overflow, level=%d\n",
>> +             IR_CFG_INT_THRESHOLD);
>> +    }
>> +
>> +    if ((irq_sr & INTMS_SYMBRCV) || (irq_sr & INTMS_TIMEOUT)) {
>> +        DEFINE_IR_RAW_EVENT(ev);
>> +
>> +        symb_num = readl_relaxed(priv->base + IR_DATAH);
>> +        for (i = 0; i < symb_num; i++) {
>> +            symb_val = readl_relaxed(priv->base + IR_DATAL);
>> +            data_l = ((symb_val & 0xffff) * 10);
>> +            data_h =  ((symb_val >> 16) & 0xffff) * 10;
>> +            symb_time = (data_l + data_h) / 10;
>> +
>> +            ev.duration = US_TO_NS(data_l);
>> +            ev.pulse = true;
>> +            ir_raw_event_store(priv->rdev, &ev);
>> +
>> +            if (symb_time < IR_CFG_SYMBOL_MAXWIDTH) {
>> +                ev.duration = US_TO_NS(data_h);
>> +                ev.pulse = false;
>> +                ir_raw_event_store(priv->rdev, &ev);
>> +            } else {
>> +                hix5hd2_ir_send_lirc_timeout(priv->rdev);
>> +            }
>> +        }
>> +
>> +        if (irq_sr & INTMS_SYMBRCV)
>> +            writel_relaxed(INT_CLR_RCV, priv->base + IR_INTC);
>> +        if (irq_sr & INTMS_TIMEOUT)
>> +            writel_relaxed(INT_CLR_TIMEOUT, priv->base + IR_INTC);
>> +    }
>> +
>> +    /* Empty software fifo */
>> +    ir_raw_event_handle(priv->rdev);
>> +    return IRQ_HANDLED;
>> +}
>> +
>
> It looks good if the entire ISR() above the probe()/remove()
> functionalities
> of the driver. Maximum of the developers follows this structure.
>
> (...)
>
>> +static struct of_device_id hix5hd2_ir_table[] = {
>> +    { .compatible = "hisilicon,hix5hd2-ir", },
>> +    {},
>> +};
>> +MODULE_DEVICE_TABLE(of, hix5hd2_ir_table);
>> +
>
> Every driver put these device ids above *struct platform_driver*
> definition.
> So that we can see the of_match_table....
>
>> +static int hix5hd2_ir_probe(struct platform_device *pdev)
>> +{
>> +    int ret;
>> +    struct rc_dev *rdev;
>> +    struct device *dev = &pdev->dev;
>> +    struct resource *res;
>> +    struct hix5hd2_ir_priv *priv;
>> +    struct device_node *node = pdev->dev.of_node;
>> +
>> +    priv = devm_kzalloc(dev, sizeof(struct hix5hd2_ir_priv),
>> GFP_KERNEL);
>
> sizeof(*priv)...?
>
>> +    if (!priv)
>> +        return -ENOMEM;
>> +
>
> (...)
>
>> +#endif
>> +
>> +static SIMPLE_DEV_PM_OPS(hix5hd2_ir_pm_ops, hix5hd2_ir_suspend,
>> +             hix5hd2_ir_resume);
>> +
>
> We can move the device ids here....

Thanks Varka, will change sequence accordingly.

WARNING: multiple messages have this Message-ID (diff)
From: zhangfei <zhangfei.gao@linaro.org>
To: Varka Bhadram <varkabhadram@gmail.com>,
	Mauro Carvalho Chehab <m.chehab@samsung.com>,
	sean@mess.org, arnd@arndb.de, haifeng.yan@linaro.org,
	jchxue@gmail.com
Cc: linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org,
	linux-media@vger.kernel.org,
	Guoxiong Yan <yanguoxiong@huawei.com>
Subject: Re: [PATCH v3 2/3] rc: Introduce hix5hd2 IR transmitter driver
Date: Sat, 30 Aug 2014 21:58:22 +0800	[thread overview]
Message-ID: <5401D87E.6000804@linaro.org> (raw)
In-Reply-To: <53FFF675.7020702@gmail.com>



On 08/29/2014 11:41 AM, Varka Bhadram wrote:
> On 08/28/2014 08:46 PM, Zhangfei Gao wrote:
>> From: Guoxiong Yan <yanguoxiong@huawei.com>
>>
>> IR transmitter driver for Hisilicon hix5hd2 soc
>>
>> By default all protocols are disabled.
>> For example nec decoder can be enabled by either
>> 1. ir-keytable -p nec
>> 2. echo nec > /sys/class/rc/rc0/protocols
>> See see Documentation/ABI/testing/sysfs-class-rc
>>
> (...)
>
>> +static irqreturn_t hix5hd2_ir_rx_interrupt(int irq, void *data)
>> +{
>> +    u32 symb_num, symb_val, symb_time;
>> +    u32 data_l, data_h;
>> +    u32 irq_sr, i;
>> +    struct hix5hd2_ir_priv *priv = data;
>> +
>> +    irq_sr = readl_relaxed(priv->base + IR_INTS);
>> +    if (irq_sr & INTMS_OVERFLOW) {
>> +        /*
>> +         * we must read IR_DATAL first, then we can clean up
>> +         * IR_INTS availably since logic would not clear
>> +         * fifo when overflow, drv do the job
>> +         */
>> +        ir_raw_event_reset(priv->rdev);
>> +        symb_num = readl_relaxed(priv->base + IR_DATAH);
>> +        for (i = 0; i < symb_num; i++)
>> +            readl_relaxed(priv->base + IR_DATAL);
>> +
>> +        writel_relaxed(INT_CLR_OVERFLOW, priv->base + IR_INTC);
>> +        dev_info(priv->dev, "overflow, level=%d\n",
>> +             IR_CFG_INT_THRESHOLD);
>> +    }
>> +
>> +    if ((irq_sr & INTMS_SYMBRCV) || (irq_sr & INTMS_TIMEOUT)) {
>> +        DEFINE_IR_RAW_EVENT(ev);
>> +
>> +        symb_num = readl_relaxed(priv->base + IR_DATAH);
>> +        for (i = 0; i < symb_num; i++) {
>> +            symb_val = readl_relaxed(priv->base + IR_DATAL);
>> +            data_l = ((symb_val & 0xffff) * 10);
>> +            data_h =  ((symb_val >> 16) & 0xffff) * 10;
>> +            symb_time = (data_l + data_h) / 10;
>> +
>> +            ev.duration = US_TO_NS(data_l);
>> +            ev.pulse = true;
>> +            ir_raw_event_store(priv->rdev, &ev);
>> +
>> +            if (symb_time < IR_CFG_SYMBOL_MAXWIDTH) {
>> +                ev.duration = US_TO_NS(data_h);
>> +                ev.pulse = false;
>> +                ir_raw_event_store(priv->rdev, &ev);
>> +            } else {
>> +                hix5hd2_ir_send_lirc_timeout(priv->rdev);
>> +            }
>> +        }
>> +
>> +        if (irq_sr & INTMS_SYMBRCV)
>> +            writel_relaxed(INT_CLR_RCV, priv->base + IR_INTC);
>> +        if (irq_sr & INTMS_TIMEOUT)
>> +            writel_relaxed(INT_CLR_TIMEOUT, priv->base + IR_INTC);
>> +    }
>> +
>> +    /* Empty software fifo */
>> +    ir_raw_event_handle(priv->rdev);
>> +    return IRQ_HANDLED;
>> +}
>> +
>
> It looks good if the entire ISR() above the probe()/remove()
> functionalities
> of the driver. Maximum of the developers follows this structure.
>
> (...)
>
>> +static struct of_device_id hix5hd2_ir_table[] = {
>> +    { .compatible = "hisilicon,hix5hd2-ir", },
>> +    {},
>> +};
>> +MODULE_DEVICE_TABLE(of, hix5hd2_ir_table);
>> +
>
> Every driver put these device ids above *struct platform_driver*
> definition.
> So that we can see the of_match_table....
>
>> +static int hix5hd2_ir_probe(struct platform_device *pdev)
>> +{
>> +    int ret;
>> +    struct rc_dev *rdev;
>> +    struct device *dev = &pdev->dev;
>> +    struct resource *res;
>> +    struct hix5hd2_ir_priv *priv;
>> +    struct device_node *node = pdev->dev.of_node;
>> +
>> +    priv = devm_kzalloc(dev, sizeof(struct hix5hd2_ir_priv),
>> GFP_KERNEL);
>
> sizeof(*priv)...?
>
>> +    if (!priv)
>> +        return -ENOMEM;
>> +
>
> (...)
>
>> +#endif
>> +
>> +static SIMPLE_DEV_PM_OPS(hix5hd2_ir_pm_ops, hix5hd2_ir_suspend,
>> +             hix5hd2_ir_resume);
>> +
>
> We can move the device ids here....

Thanks Varka, will change sequence accordingly.

  reply	other threads:[~2014-08-30 13:58 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-28 15:16 [PATCH v3 0/3] Introduce hix5hd2 IR transmitter driver Zhangfei Gao
2014-08-28 15:16 ` Zhangfei Gao
2014-08-28 15:16 ` [PATCH v3 1/3] rc: Add DT bindings for hix5hd2 Zhangfei Gao
2014-08-28 15:16   ` Zhangfei Gao
2014-08-29  3:30   ` Varka Bhadram
2014-08-29  3:30     ` Varka Bhadram
2014-08-28 15:16 ` [PATCH v3 2/3] rc: Introduce hix5hd2 IR transmitter driver Zhangfei Gao
2014-08-28 15:16   ` Zhangfei Gao
2014-08-28 16:22   ` Sean Young
2014-08-28 16:22     ` Sean Young
2014-08-30 13:24     ` zhangfei
2014-08-30 13:24       ` zhangfei
2014-08-29  3:41   ` Varka Bhadram
2014-08-29  3:41     ` Varka Bhadram
2014-08-30 13:58     ` zhangfei [this message]
2014-08-30 13:58       ` zhangfei
2014-08-28 15:16 ` [PATCH v3 3/3] ARM: dts: hix5hd2: add ir node Zhangfei Gao
2014-08-28 15:16   ` Zhangfei Gao

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=5401D87E.6000804@linaro.org \
    --to=zhangfei.gao@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.