[PATCH 3/4 v2] spi: sh-msiof: Add device tree parsing to driver

Bastian Hecht hechtb at gmail.com
Mon Dec 17 06:25:26 EST 2012


Hi Nobuhiro,

2012/12/17 Nobuhiro Iwamatsu <iwamatsu at nigauri.org>:
> Hi, Bastian.
>
> On Wed, Dec 12, 2012 at 8:54 PM, Bastian Hecht <hechtb at gmail.com> wrote:
>> From: Bastian Hecht <hechtb at gmail.com>
>>
>> This adds the capability to retrieve setup data from the device tree
>> node. The usage of platform data is still available.
>>
>> Signed-off-by: Bastian Hecht <hechtb+renesas at gmail.com>
>> ---
>> v2:
>>         - renamed property "chip_select" to "num-cs"
>>         - renamed property "tx_fifo_size" to "renesas,tx-fifo-size"
>>         - renamed property "rx_fifo_size" to "renesas,rx-fifo-size"
>>
>>  drivers/spi/spi-sh-msiof.c |   56 +++++++++++++++++++++++++++++++++++++++++++-
>>  1 file changed, 55 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c
>> index 96358d0..8b40d08 100644
>> --- a/drivers/spi/spi-sh-msiof.c
>> +++ b/drivers/spi/spi-sh-msiof.c
>> @@ -20,6 +20,7 @@
>>  #include <linux/io.h>
>>  #include <linux/kernel.h>
>>  #include <linux/module.h>
>> +#include <linux/of.h>
>>  #include <linux/platform_device.h>
>>  #include <linux/pm_runtime.h>
>>
>> @@ -592,6 +593,37 @@ static u32 sh_msiof_spi_txrx_word(struct spi_device *spi, unsigned nsecs,
>>         return 0;
>>  }
>>
>> +#ifdef CONFIG_OF
>> +static struct sh_msiof_spi_info *sh_msiof_spi_parse_dt(struct device *dev)
>> +{
>> +       struct sh_msiof_spi_info *info;
>> +       struct device_node *np = dev->of_node;
>> +       u32 num_cs = 0;
>> +
>> +       info = devm_kzalloc(dev, sizeof(struct sh_msiof_spi_info), GFP_KERNEL);
>> +       if (!info) {
>> +               dev_err(dev, "failed to allocate setup data\n");
>> +               return NULL;
>> +       }
>> +
>> +       /* Parse the MSIOF properties */
>> +       of_property_read_u32(np, "num-cs", &num_cs);
>> +       of_property_read_u32(np, "renesas,tx-fifo-size",
>> +                                       &info->tx_fifo_override);
>> +       of_property_read_u32(np, "renesas,rx-fifo-size",
>> +                                       &info->rx_fifo_override);
>> +
>> +       info->num_chipselect = num_cs;
>> +
>> +       return info;
>> +}
>> +#else
>> +static struct sh_msiof_spi_info *sh_msiof_spi_parse_dt(struct device *dev)
>> +{
>> +       return NULL;
>> +}
>> +#endif
>> +
>>  static int sh_msiof_spi_probe(struct platform_device *pdev)
>>  {
>>         struct resource *r;
>> @@ -610,7 +642,17 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
>>         p = spi_master_get_devdata(master);
>>
>>         platform_set_drvdata(pdev, p);
>> -       p->info = pdev->dev.platform_data;
>> +       if (pdev->dev.of_node)
>> +               p->info = sh_msiof_spi_parse_dt(&pdev->dev);
>> +       else
>> +               p->info = pdev->dev.platform_data;
>> +
>> +       if (!p->info) {
>> +               dev_err(&pdev->dev, "failed to obtain device info\n");
>> +               ret = -ENXIO;
>> +               goto err1;
>> +       }
>> +
>>         init_completion(&p->done);
>>
>>         p->clk = clk_get(&pdev->dev, NULL);
>> @@ -715,6 +757,17 @@ static int sh_msiof_spi_runtime_nop(struct device *dev)
>>         return 0;
>>  }
>>
>> +#ifdef CONFIG_OF
>> +static const struct of_device_id sh_msiof_match[] = {
>> +       { .compatible = "renesas,sh-msiof", },
>> +       { .compatible = "renesas,sh-mobile-msiof", },
>> +       {},
>> +};
>> +MODULE_DEVICE_TABLE(of, sh_msiof_match);
>> +#else
>> +#define sh_msiof_match NULL
>> +#endif
>
> You can remove ifdef if you use of_match_ptr().
>
>> +
>>  static struct dev_pm_ops sh_msiof_spi_dev_pm_ops = {
>>         .runtime_suspend = sh_msiof_spi_runtime_nop,
>>         .runtime_resume = sh_msiof_spi_runtime_nop,
>> @@ -727,6 +780,7 @@ static struct platform_driver sh_msiof_spi_drv = {
>>                 .name           = "spi_sh_msiof",
>>                 .owner          = THIS_MODULE,
>>                 .pm             = &sh_msiof_spi_dev_pm_ops,
>> +               .of_match_table = sh_msiof_match,
>
> You can use of_match_ptr(sh_msiof_match).
>

Ok very nice, will do so.

Thanks,

 Bastian

>>         },
>>  };
>>  module_platform_driver(sh_msiof_spi_drv);
>> --
>> 1.7.9.5
>
> Best regards,
>   Nobuhiro
>
> --
> Nobuhiro Iwamatsu
>    iwamatsu at {nigauri.org / debian.org}
>    GPG ID: 40AD1FA6



More information about the linux-arm-kernel mailing list