From: Marc Kleine-Budde <mkl@pengutronix.de>
To: Vaibhav Hiremath <hvaibhav@ti.com>
Cc: "AnilKumar, Chimata" <anilkumar@ti.com>,
"tony@atomide.com" <tony@atomide.com>,
"linux-omap@vger.kernel.org" <linux-omap@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"wg@grandegger.com" <wg@grandegger.com>,
"linux-can@vger.kernel.org" <linux-can@vger.kernel.org>
Subject: Re: [PATCH 2/4] can: c_can: Add d_can raminit support
Date: Tue, 04 Sep 2012 09:39:20 +0200 [thread overview]
Message-ID: <5045B028.3070503@pengutronix.de> (raw)
In-Reply-To: <5045AF8D.7020208@ti.com>
[-- Attachment #1: Type: text/plain, Size: 5108 bytes --]
On 09/04/2012 09:36 AM, Vaibhav Hiremath wrote:
>
>
> On 9/4/2012 11:44 AM, AnilKumar, Chimata wrote:
>> Hi Marc,
>>
>> On Tue, Sep 04, 2012 at 02:09:15, Marc Kleine-Budde wrote:
>>> On 09/03/2012 01:52 PM, AnilKumar Ch wrote:
>>>> Add D_CAN raminit support to C_CAN driver to enable D_CAN RAM.
>>>> DCAN RAM holds all the message objects during transmission or
>>>> receiving of data. This initialization/de-initialization should
>>>> be done in synchronous with D_CAN clock.
>>>>
>>>> Signed-off-by: AnilKumar Ch <anilkumar@ti.com>
>>>> ---
>>>> drivers/net/can/c_can/c_can.c | 13 ++++++++++++
>>>> drivers/net/can/c_can/c_can.h | 2 ++
>>>> drivers/net/can/c_can/c_can_platform.c | 10 +++++++++
>>>> include/linux/can/platform/c_can.h | 36 ++++++++++++++++++++++++++++++++
>>>> 4 files changed, 61 insertions(+)
>>>> create mode 100644 include/linux/can/platform/c_can.h
>>>>
>>>> diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
>>>> index aa6c5eb..c175410 100644
>>>> --- a/drivers/net/can/c_can/c_can.c
>>>> +++ b/drivers/net/can/c_can/c_can.c
>>>> @@ -214,6 +214,12 @@ static inline void c_can_pm_runtime_put_sync(const struct c_can_priv *priv)
>>>> pm_runtime_put_sync(priv->device);
>>>> }
>>>>
>>>> +static inline void c_can_reset_ram(const struct c_can_priv *priv, bool enable)
>>>> +{
>>>> + if (priv->ram_init)
>>>> + priv->ram_init(priv->instance, enable);
>>>> +}
>>>> +
>>>> static inline int get_tx_next_msg_obj(const struct c_can_priv *priv)
>>>> {
>>>> return (priv->tx_next & C_CAN_NEXT_MSG_OBJ_MASK) +
>>>> @@ -1071,6 +1077,8 @@ static int c_can_open(struct net_device *dev)
>>>> struct c_can_priv *priv = netdev_priv(dev);
>>>>
>>>> c_can_pm_runtime_get_sync(priv);
>>>> + /* Initialize DCAN RAM */
>>>> + c_can_reset_ram(priv, true);
>>>>
>>>> /* open the can device */
>>>> err = open_candev(dev);
>>>> @@ -1099,6 +1107,8 @@ static int c_can_open(struct net_device *dev)
>>>> exit_irq_fail:
>>>> close_candev(dev);
>>>> exit_open_fail:
>>>> + /* De-Initialize DCAN RAM */
>>>> + c_can_reset_ram(priv, false);
>>>> c_can_pm_runtime_put_sync(priv);
>>>> return err;
>>>> }
>>>> @@ -1112,6 +1122,9 @@ static int c_can_close(struct net_device *dev)
>>>> c_can_stop(dev);
>>>> free_irq(dev->irq, dev);
>>>> close_candev(dev);
>>>> +
>>>> + /* De-Initialize DCAN RAM */
>>>> + c_can_reset_ram(priv, false);
>>>> c_can_pm_runtime_put_sync(priv);
>>>>
>>>> return 0;
>>>> diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h
>>>> index 1437a6d..5f6339c 100644
>>>> --- a/drivers/net/can/c_can/c_can.h
>>>> +++ b/drivers/net/can/c_can/c_can.h
>>>> @@ -166,6 +166,8 @@ struct c_can_priv {
>>>> unsigned int tx_echo;
>>>> void *priv; /* for board-specific data */
>>>> u16 irqstatus;
>>>> + unsigned int instance;
>>>> + void (*ram_init) (unsigned int instance, bool enable);
>>>> };
>>>>
>>>> struct net_device *alloc_c_can_dev(void);
>>>> diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c
>>>> index c351975..c6963b2 100644
>>>> --- a/drivers/net/can/c_can/c_can_platform.c
>>>> +++ b/drivers/net/can/c_can/c_can_platform.c
>>>> @@ -34,6 +34,7 @@
>>>> #include <linux/of_device.h>
>>>> #include <linux/pm_runtime.h>
>>>> #include <linux/pinctrl/consumer.h>
>>>> +#include <linux/can/platform/c_can.h>
>>>>
>>>> #include <linux/can/dev.h>
>>>>
>>>> @@ -98,6 +99,7 @@ static int __devinit c_can_plat_probe(struct platform_device *pdev)
>>>> struct net_device *dev;
>>>> struct c_can_priv *priv;
>>>> const struct of_device_id *match;
>>>> + struct c_can_platform_data *pdata = NULL;
>>>> const struct platform_device_id *id;
>>>> struct pinctrl *pinctrl;
>>>> struct resource *mem;
>>>> @@ -179,6 +181,14 @@ static int __devinit c_can_plat_probe(struct platform_device *pdev)
>>>> priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
>>>> priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
>>>> priv->write_reg = c_can_plat_write_reg_aligned_to_16bit;
>>>> + pdata = pdev->dev.platform_data;
>>>> + if (!pdata) {
>>>> + dev_err(&pdev->dev, "d_can platform data missing\n");
>>>> + ret = -EINVAL;
>>>
>>> Is the ram_init mandatory on all d_can? There might be non omap d_can users.
>>
>> As per AM335x specifications d_can module should have ram_init.
>> In that case it's better to print warning and break the switch.
>>
>
> As far as I know, "ram_init" is part of IP spec, how it is controlled
> does varies based on SoC integration.
Thanks for your insight. Leave the code as it is. If there is another
d_can user we know more and will improve/fix the code :)
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: mkl@pengutronix.de (Marc Kleine-Budde)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/4] can: c_can: Add d_can raminit support
Date: Tue, 04 Sep 2012 09:39:20 +0200 [thread overview]
Message-ID: <5045B028.3070503@pengutronix.de> (raw)
In-Reply-To: <5045AF8D.7020208@ti.com>
On 09/04/2012 09:36 AM, Vaibhav Hiremath wrote:
>
>
> On 9/4/2012 11:44 AM, AnilKumar, Chimata wrote:
>> Hi Marc,
>>
>> On Tue, Sep 04, 2012 at 02:09:15, Marc Kleine-Budde wrote:
>>> On 09/03/2012 01:52 PM, AnilKumar Ch wrote:
>>>> Add D_CAN raminit support to C_CAN driver to enable D_CAN RAM.
>>>> DCAN RAM holds all the message objects during transmission or
>>>> receiving of data. This initialization/de-initialization should
>>>> be done in synchronous with D_CAN clock.
>>>>
>>>> Signed-off-by: AnilKumar Ch <anilkumar@ti.com>
>>>> ---
>>>> drivers/net/can/c_can/c_can.c | 13 ++++++++++++
>>>> drivers/net/can/c_can/c_can.h | 2 ++
>>>> drivers/net/can/c_can/c_can_platform.c | 10 +++++++++
>>>> include/linux/can/platform/c_can.h | 36 ++++++++++++++++++++++++++++++++
>>>> 4 files changed, 61 insertions(+)
>>>> create mode 100644 include/linux/can/platform/c_can.h
>>>>
>>>> diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
>>>> index aa6c5eb..c175410 100644
>>>> --- a/drivers/net/can/c_can/c_can.c
>>>> +++ b/drivers/net/can/c_can/c_can.c
>>>> @@ -214,6 +214,12 @@ static inline void c_can_pm_runtime_put_sync(const struct c_can_priv *priv)
>>>> pm_runtime_put_sync(priv->device);
>>>> }
>>>>
>>>> +static inline void c_can_reset_ram(const struct c_can_priv *priv, bool enable)
>>>> +{
>>>> + if (priv->ram_init)
>>>> + priv->ram_init(priv->instance, enable);
>>>> +}
>>>> +
>>>> static inline int get_tx_next_msg_obj(const struct c_can_priv *priv)
>>>> {
>>>> return (priv->tx_next & C_CAN_NEXT_MSG_OBJ_MASK) +
>>>> @@ -1071,6 +1077,8 @@ static int c_can_open(struct net_device *dev)
>>>> struct c_can_priv *priv = netdev_priv(dev);
>>>>
>>>> c_can_pm_runtime_get_sync(priv);
>>>> + /* Initialize DCAN RAM */
>>>> + c_can_reset_ram(priv, true);
>>>>
>>>> /* open the can device */
>>>> err = open_candev(dev);
>>>> @@ -1099,6 +1107,8 @@ static int c_can_open(struct net_device *dev)
>>>> exit_irq_fail:
>>>> close_candev(dev);
>>>> exit_open_fail:
>>>> + /* De-Initialize DCAN RAM */
>>>> + c_can_reset_ram(priv, false);
>>>> c_can_pm_runtime_put_sync(priv);
>>>> return err;
>>>> }
>>>> @@ -1112,6 +1122,9 @@ static int c_can_close(struct net_device *dev)
>>>> c_can_stop(dev);
>>>> free_irq(dev->irq, dev);
>>>> close_candev(dev);
>>>> +
>>>> + /* De-Initialize DCAN RAM */
>>>> + c_can_reset_ram(priv, false);
>>>> c_can_pm_runtime_put_sync(priv);
>>>>
>>>> return 0;
>>>> diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h
>>>> index 1437a6d..5f6339c 100644
>>>> --- a/drivers/net/can/c_can/c_can.h
>>>> +++ b/drivers/net/can/c_can/c_can.h
>>>> @@ -166,6 +166,8 @@ struct c_can_priv {
>>>> unsigned int tx_echo;
>>>> void *priv; /* for board-specific data */
>>>> u16 irqstatus;
>>>> + unsigned int instance;
>>>> + void (*ram_init) (unsigned int instance, bool enable);
>>>> };
>>>>
>>>> struct net_device *alloc_c_can_dev(void);
>>>> diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c
>>>> index c351975..c6963b2 100644
>>>> --- a/drivers/net/can/c_can/c_can_platform.c
>>>> +++ b/drivers/net/can/c_can/c_can_platform.c
>>>> @@ -34,6 +34,7 @@
>>>> #include <linux/of_device.h>
>>>> #include <linux/pm_runtime.h>
>>>> #include <linux/pinctrl/consumer.h>
>>>> +#include <linux/can/platform/c_can.h>
>>>>
>>>> #include <linux/can/dev.h>
>>>>
>>>> @@ -98,6 +99,7 @@ static int __devinit c_can_plat_probe(struct platform_device *pdev)
>>>> struct net_device *dev;
>>>> struct c_can_priv *priv;
>>>> const struct of_device_id *match;
>>>> + struct c_can_platform_data *pdata = NULL;
>>>> const struct platform_device_id *id;
>>>> struct pinctrl *pinctrl;
>>>> struct resource *mem;
>>>> @@ -179,6 +181,14 @@ static int __devinit c_can_plat_probe(struct platform_device *pdev)
>>>> priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
>>>> priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
>>>> priv->write_reg = c_can_plat_write_reg_aligned_to_16bit;
>>>> + pdata = pdev->dev.platform_data;
>>>> + if (!pdata) {
>>>> + dev_err(&pdev->dev, "d_can platform data missing\n");
>>>> + ret = -EINVAL;
>>>
>>> Is the ram_init mandatory on all d_can? There might be non omap d_can users.
>>
>> As per AM335x specifications d_can module should have ram_init.
>> In that case it's better to print warning and break the switch.
>>
>
> As far as I know, "ram_init" is part of IP spec, how it is controlled
> does varies based on SoC integration.
Thanks for your insight. Leave the code as it is. If there is another
d_can user we know more and will improve/fix the code :)
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 259 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120904/b8ea6cca/attachment.sig>
next prev parent reply other threads:[~2012-09-04 7:39 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-03 11:52 [PATCH 0/4] can: c_can: Add suspend/resume and pinctrl support AnilKumar Ch
2012-09-03 11:52 ` AnilKumar Ch
2012-09-03 11:52 ` [PATCH 1/4] can: c_can: Adopt " AnilKumar Ch
2012-09-03 11:52 ` AnilKumar Ch
2012-09-03 20:42 ` Marc Kleine-Budde
2012-09-03 20:42 ` Marc Kleine-Budde
2012-09-04 6:14 ` AnilKumar, Chimata
2012-09-04 6:14 ` AnilKumar, Chimata
2012-09-04 7:42 ` Marc Kleine-Budde
2012-09-04 7:42 ` Marc Kleine-Budde
2012-09-04 8:34 ` AnilKumar, Chimata
2012-09-04 8:34 ` AnilKumar, Chimata
2012-09-03 11:52 ` [PATCH 2/4] can: c_can: Add d_can raminit support AnilKumar Ch
2012-09-03 11:52 ` AnilKumar Ch
2012-09-03 20:39 ` Marc Kleine-Budde
2012-09-03 20:39 ` Marc Kleine-Budde
2012-09-04 6:14 ` AnilKumar, Chimata
2012-09-04 6:14 ` AnilKumar, Chimata
2012-09-04 7:36 ` Vaibhav Hiremath
2012-09-04 7:36 ` Vaibhav Hiremath
2012-09-04 7:39 ` Marc Kleine-Budde [this message]
2012-09-04 7:39 ` Marc Kleine-Budde
2012-09-03 11:52 ` [PATCH 3/4] ARM: AM33XX: board-generic: Add of_dev_auxdata to pass d_can raminit AnilKumar Ch
2012-09-03 11:52 ` AnilKumar Ch
2012-09-03 20:11 ` Marc Kleine-Budde
2012-09-03 20:11 ` Marc Kleine-Budde
2012-09-04 6:26 ` AnilKumar, Chimata
2012-09-04 6:26 ` AnilKumar, Chimata
2012-09-04 7:35 ` Marc Kleine-Budde
2012-09-04 7:35 ` Marc Kleine-Budde
2012-09-03 11:52 ` [PATCH 4/4] can: c_can: Add d_can suspend resume support AnilKumar Ch
2012-09-03 11:52 ` AnilKumar Ch
2012-09-03 20:01 ` Marc Kleine-Budde
2012-09-03 20:01 ` Marc Kleine-Budde
2012-09-04 6:14 ` AnilKumar, Chimata
2012-09-04 6:14 ` AnilKumar, Chimata
2012-09-04 7:27 ` Marc Kleine-Budde
2012-09-04 7:27 ` Marc Kleine-Budde
2012-09-12 12:48 ` AnilKumar, Chimata
2012-09-12 12:48 ` AnilKumar, Chimata
2012-09-12 13:02 ` Marc Kleine-Budde
2012-09-12 13:02 ` Marc Kleine-Budde
2012-09-13 7:24 ` AnilKumar, Chimata
2012-09-13 7:24 ` AnilKumar, Chimata
2012-09-13 8:30 ` Marc Kleine-Budde
2012-09-13 8:30 ` Marc Kleine-Budde
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=5045B028.3070503@pengutronix.de \
--to=mkl@pengutronix.de \
--cc=anilkumar@ti.com \
--cc=hvaibhav@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-can@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=tony@atomide.com \
--cc=wg@grandegger.com \
/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.