[PATCHv3 1/4] drm/exynos: add device tree support for rotator

Inki Dae inki.dae at samsung.com
Sun Aug 18 19:03:31 PDT 2013


2013년 8월 19일 월요일에 Kukjin Kim<kgene.kim at samsung.com>님이 작성:
> On 08/13/13 14:12, Chanho Park wrote:
>>
>> The exynos4 platform is only dt-based since 3.10, we should convert
driver data
>> and ids to dt-based parsing methods. The rotator driver has a limit
table to get
>> size limit of input picture. Each SoCs has slightly different limit value
>> compared with any others.
>> For example, exynos4210's max_size of RGB888 is 16k x 16k. But, others
have
>> 8k x 8k. Another example the exynos5250 should have multiple of 2 pixel
size
>> for its X/Y axis. Thus, we should keep different tables for each of them.
>> This patch also includes desciptions of each nodes for the rotator and
specifies
>> a example how to bind it.
>>
>> Signed-off-by: Chanho Park<chanho61.park at samsung.com>
>> Cc: Inki Dae<inki.dae at samsung.com>
>
> Inki, do you OK on this? If so, let me take this whole series into the
samsung tree.

Signed-off-by: Inki Dae <inki.dae at samsung.com>

Thanks,
Inki Dae

>
> Thanks,
> Kukjin
>
>> Signed-off-by: Kyungmin Park<kyungmin.park at samsung.com>
>> ---
>>   .../devicetree/bindings/gpu/samsung-rotator.txt    |   27 +++++
>>   drivers/gpu/drm/exynos/exynos_drm_rotator.c        |  108
+++++++++++++++-----
>>   2 files changed, 107 insertions(+), 28 deletions(-)
>>   create mode 100644
Documentation/devicetree/bindings/gpu/samsung-rotator.txt
>>
>> diff --git a/Documentation/devicetree/bindings/gpu/samsung-rotator.txt
b/Documentation/devicetree/bindings/gpu/samsung-rotator.txt
>> new file mode 100644
>> index 0000000..82cd1ed
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/gpu/samsung-rotator.txt
>> @@ -0,0 +1,27 @@
>> +* Samsung Image Rotator
>> +
>> +Required properties:
>> +  - compatible : value should be one of the following:
>> +       (a) "samsung,exynos4210-rotator" for Rotator IP in Exynos4210
>> +       (b) "samsung,exynos4212-rotator" for Rotator IP in
Exynos4212/4412
>> +       (c) "samsung,exynos5250-rotator" for Rotator IP in Exynos5250
>> +
>> +  - reg : Physical base address of the IP registers and length of memory
>> +         mapped region.
>> +
>> +  - interrupts : Interrupt specifier for rotator interrupt, according
to format
>> +                specific to interrupt parent.
>> +
>> +  - clocks : Clock specifier for rotator clock, according to generic
clock
>> +            bindings. (See
Documentation/devicetree/bindings/clock/exynos*.txt)
>> +
>> +  - clock-names : Names of clocks. For exynos rotator, it should be
"rotator".
>> +
>> +Example:
>> +       rotator at 12810000 {
>> +               compatible = "samsung,exynos4210-rotator";
>> +               reg =<0x12810000 0x1000>;
>> +               interrupts =<0 83 0>;
>> +               clocks =<&clock 278>;
>> +               clock-names = "rotator";
>> +       };
>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_rotator.c
b/drivers/gpu/drm/exynos/exynos_drm_rotator.c
>> index 427640a..0485aea5 100644
>> --- a/drivers/gpu/drm/exynos/exynos_drm_rotator.c
>> +++ b/drivers/gpu/drm/exynos/exynos_drm_rotator.c
>> @@ -632,21 +632,98 @@ static int rotator_ippdrv_start(struct device
*dev, enum drm_exynos_ipp_cmd cmd)
>>         return 0;
>>   }
>>
>> +static struct rot_limit_table rot_limit_tbl_4210 = {
>> +       .ycbcr420_2p = {
>> +               .min_w = 32,
>> +               .min_h = 32,
>> +               .max_w = SZ_64K,
>> +               .max_h = SZ_64K,
>> +               .align = 3,
>> +       },
>> +       .rgb888 = {
>> +               .min_w = 8,
>> +               .min_h = 8,
>> +               .max_w = SZ_16K,
>> +               .max_h = SZ_16K,
>> +               .align = 2,
>> +       },
>> +};
>> +
>> +static struct rot_limit_table rot_limit_tbl_4x12 = {
>> +       .ycbcr420_2p = {
>> +               .min_w = 32,
>> +               .min_h = 32,
>> +               .max_w = SZ_32K,
>> +               .max_h = SZ_32K,
>> +               .align = 3,
>> +       },
>> +       .rgb888 = {
>> +               .min_w = 8,
>> +               .min_h = 8,
>> +               .max_w = SZ_8K,
>> +               .max_h = SZ_8K,
>> +               .align = 2,
>> +       },
>> +};
>> +
>> +static struct rot_limit_table rot_limit_tbl_5250 = {
>> +       .ycbcr420_2p = {
>> +               .min_w = 32,
>> +               .min_h = 32,
>> +               .max_w = SZ_32K,
>> +               .max_h = SZ_32K,
>> +               .align = 3,
>> +       },
>> +       .rgb888 = {
>> +               .min_w = 8,
>> +               .min_h = 8,
>> +               .max_w = SZ_8K,
>> +               .max_h = SZ_8K,
>> +               .align = 1,
>> +       },
>> +};
>> +
>> +static const struct of_device_id exynos_rotator_match[] = {
>> +       {
>> +               .compatible = "samsung,exynos4210-rotator",
>> +               .data =&rot_limit_tbl_4210,
>> +       },
>> +       {
>> +               .compatible = "samsung,exynos4212-rotator",
>> +               .data =&rot_limit_tbl_4x12,
>> +       },
>> +       {
>> +               .compatible = "samsung,exynos5250-rotator",
>> +               .data =&rot_limit_tbl_5250,
>> +       },
>> +       {},
>> +};
>> +
>>   static int rotator_probe(struct platform_device *pdev)
>>   {
>>         struct device *dev =&pdev->dev;
>>         struct rot_context *rot;
>>         struct exynos_drm_ippdrv *ippdrv;
>> +       const struct of_device_id *match;
>>         int ret;
>>
>> +       if (!dev->of_node) {
>> +               dev_err(dev, "cannot find of_node.\n");
>> +               return -ENODEV;
>> +       }
>> +
>>         rot = devm_kzalloc(dev, sizeof(*rot), GFP_KERNEL);
>>         if (!rot) {
>>                 dev_err(dev, "failed to allocate rot\n");
>>                 return -ENOMEM;
>>         }
>>
>> -       rot->limit_tbl = (struct rot_limit_table *)
>> -
platform_get_device_id(pdev)->driver_data;
>> +       match = of_match_node(exynos_rotator_match, dev->of_node);
>> +       if (!match) {
>> +               dev_err(dev, "failed to match node\n");
>> +               return -ENODEV;
>> +       }
>> +       rot->limit_tbl = (struct rot_limit_table *)match->data;
>>
>>         rot->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>         rot->regs = devm_ioremap_resource(dev, rot->regs_res);
>> @@ -718,31 +795,6 @@ static int rotator_remove(struct platform_device
*pdev)
>>         return 0;
>>   }
>>
>> -static struct rot_limit_table rot_limit_tbl = {
>> -       .ycbcr420_2p = {
>> -               .min_w = 32,
>> -               .min_h = 32,
>> -               .max_w = SZ_32K,
>> -               .max_h = SZ_32K,
>> -               .align = 3,
>> -       },
>> -       .rgb888 = {
>> -               .min_w = 8,
>> -               .min_h = 8,
>> -               .max_w = SZ_8K,
>> -               .max_h = SZ_8K,
>> -               .align = 2,
>> -       },
>> -};
>> -
>> -static struct platform_device_id rotator_driver_ids[] = {
>> -       {
>> -               .name           = "exynos-rot",
>> -               .driver_data    = (unsigned long)&rot_limit_tbl,
>> -       },
>> -       {},
>> -};
>> -
>>   static int rotator_clk_crtl(struct rot_context *rot, bool enable)
>>   {
>>         if (enable) {
>> @@ -804,10 +856,10 @@ static const struct dev_pm_ops rotator_pm_ops = {
>>   struct platform_driver rotator_driver = {
>>         .probe          = rotator_probe,
>>         .remove         = rotator_remove,
>> -       .id_table       = rotator_driver_ids,
>>         .driver         = {
>>                 .name   = "exynos-rot",
>>                 .owner  = THIS_MODULE,
>>                 .pm     =&rotator_pm_ops,
>> +               .of_match_table = exynos_rotator_match,
>>         },
>>   };
>
> --
> To unsubscribe from this list: send the line "unsubscribe
linux-samsung-soc" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20130819/e240b33d/attachment.html>


More information about the dri-devel mailing list