From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7AE3AEB64DC for ; Thu, 15 Jun 2023 07:32:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Content-ID:In-Reply-To: References:Message-ID:Date:Subject:CC:To:From:Reply-To:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=vuoukrD5UUPswXXIFOofmzByljeAinpYOiuC+bdgjGA=; b=BDdqGubTJGmLgJ yspIl4xI2VjU8eGclYg9/hH56QmtmDvqsJbXqI8kn2JjHyU/8L+bErj6o9vQ7eYJPbjygHgBz/LyH DZfKOOejfr1D22WJ8j+FPOjr7yDX1gRO+wX1b5mUJZT8lxxIXrMbOAJHYKFTsMidGYBIai8vuxS10 ZmPXr8tpCjCg6WQWmklhtza17xHr/0BpGlEuIXJncFPjKjIcNjUN/sbxpJCzoBnNifUwsYROWRhjt 84fEqkoeagvb7QbH3el0c13uNhuFpAVmRhmAblSUFn3sqKQc064CwaC8T/G3WXnDHYszmf3u76t/t YXdxGh25oZXSxLZqulnQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q9hSS-00E0Lv-2d; Thu, 15 Jun 2023 07:31:52 +0000 Received: from esa.microchip.iphmx.com ([68.232.153.233]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1q9hSN-00E0Jp-1G for linux-arm-kernel@lists.infradead.org; Thu, 15 Jun 2023 07:31:51 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1686814307; x=1718350307; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=Ngziv/DU6NCnyPMUMgv9f6nk/NZPwu7RnLF9fml+nRM=; b=hV/Y6t/eRgZskOBLie94c1cW+wCPi3exVGq28BeG4w/lyOz+ScVlX/nw 58CPV9hfswztx9sUl6lL/QAIiZd6mmPjn6hAjjOk/IBmbYdd9Kx5MDEwj levB81m7VFnYRamYeyuYbEUFkSwYxEQpD48K6pAnOQv11/wNhhYuQ/dW7 UOAG0hl8Nm7xBP1DFgVSaCNCzelGDBRUuf+EP1jNE8WATsQExysvwpxRf 1T7HBxU9aUXlGtKExQubrko2ZChWA0m/VmLDUA8BHOb7oCW7MQxYOlldW uCdJQ875sK3ZV0VWDEA7o0MoDP+if/ccb5JmWZw7qM53c+VJeuG/Gkd1t w==; X-IronPort-AV: E=Sophos;i="6.00,244,1681196400"; d="scan'208";a="217971713" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa3.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 15 Jun 2023 00:31:44 -0700 Received: from chn-vm-ex01.mchp-main.com (10.10.85.143) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Thu, 15 Jun 2023 00:31:44 -0700 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.87.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21 via Frontend Transport; Thu, 15 Jun 2023 00:31:44 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SIxhRgeDsL9fPDduknXg9o6OwMgwuuoYrWOrEtzIdt7an8gTP9oqBiWCcJLTRqzfNPIVTXvRbu4wq6n62wSN1cv6LFiE9xG8GyEdXKTgTxHfLTwiaTISrsrZnQ05VuMJdnHp3sSOvII+bMkNnvmbwHrKryWqzE/Hio35xYFfgcrCX6Q5ZIacZi+ZQ+UGWggh35sHdwKXa/151yZfyZ9Et/nriATowYDYy/c0rcQK8wFPU/i/IbElv9E4PO/UhZXwjaz0gTicjQ7uSoMYXHdoqngF7OIrlTw1cH8E4k19bpgo9yj+RfECorNaoMcxHB+YhTtZ4s78jekQfsDPGKZwIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Ngziv/DU6NCnyPMUMgv9f6nk/NZPwu7RnLF9fml+nRM=; b=QsyhYTKCFukWLWZI8CDcCboHGFwFripZ76uEDY7sEjI00itKKdcWLrfsEsXh7QKWspEcxVJoaDOsjL6zMglT2WeJiWGwu5iUr4ceKy/Qm8qm5PSXvMS2TIIkgqy+ofPSS4SNj9lvlYOI9xVB4aWyLyFokA9e59X/h7YEvzN5gWND/wM4VOi8Ox2WAjZMnW9yToKojzqL9UpJIy2leDH0nwaU8GGHiLDHnQW79w0QQV6F0rs3XEPtAjMXxW6RoCfbhqGrOiBppFkJGCAXIurdQjX7S4Kq8fW39q6bz/o9ndy17/15QPnMHlyeiwYY9Y30aDE9u78w/JcTVNDnKFS6zw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microchip.com; dmarc=pass action=none header.from=microchip.com; dkim=pass header.d=microchip.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector2-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Ngziv/DU6NCnyPMUMgv9f6nk/NZPwu7RnLF9fml+nRM=; b=JUg/Nr1faOtmTxf1NS8W0vpkqpXJIxEk9P7FPkS2+SgWsi9Y629oGtEza+MexrZ7qtGIIUnbuTQx3EFm/1k/DGFiLTYcT9FrGQ8NGb+Kg4CraKwxBK3I+aOxt6YB1WDIHI9xGDJxg/qlimzTOkWSOan7fC8ntk1eyJySpH2GJDg= Received: from IA1PR11MB6193.namprd11.prod.outlook.com (2603:10b6:208:3eb::19) by CYYPR11MB8387.namprd11.prod.outlook.com (2603:10b6:930:c8::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.42; Thu, 15 Jun 2023 07:31:41 +0000 Received: from IA1PR11MB6193.namprd11.prod.outlook.com ([fe80::fae1:9490:ead6:1009]) by IA1PR11MB6193.namprd11.prod.outlook.com ([fe80::fae1:9490:ead6:1009%4]) with mapi id 15.20.6477.028; Thu, 15 Jun 2023 07:31:41 +0000 From: To: , , , , , , , , , , , , , , CC: , , , , , , Subject: Re: [PATCH 6/9] drm: atmel_hlcdc: Add support for XLCDC in atmel LCD driver Thread-Topic: [PATCH 6/9] drm: atmel_hlcdc: Add support for XLCDC in atmel LCD driver Thread-Index: AQHZncWNOljbIHu8BkqtK5cyDirfCa+J4wCAgAGYTgA= Date: Thu, 15 Jun 2023 07:31:41 +0000 Message-ID: <9abc28a7-ccb7-d3fc-4bbc-c368bd755d23@microchip.com> References: <20230613070426.467389-1-manikandan.m@microchip.com> <20230613070426.467389-7-manikandan.m@microchip.com> In-Reply-To: Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=microchip.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: IA1PR11MB6193:EE_|CYYPR11MB8387:EE_ x-ms-office365-filtering-correlation-id: 1f1ed0f0-21e3-433e-7590-08db6d728ff7 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: nNtBACPu32P2KSEGFauiJ9xjD28FDeswdS8bkhye/MlrLO0ot8yrHb6LKMrIIX5D3HvetugwwZ2Ob0QIBbH8tCAZmAK9ZIob+thJZQ1ZXa1YSjs0XZM36dDxoidBeNguW6QLBfVJblYwgkEUdk4SYHXbDGf3iR/1Qf54bLvNdKb/0b/SUy5V1FXWz8kCt1vRUwQP4sQR0MJu5tv8ywkXAOVOM06OOta961vRTt8eL5Nlqh+7ogvDsz60TexxPzRI9SxnTRlw+l52rBy+832OBh0zFzOjtyJps/P/20MF6oDkjWw+tc6t63k1ew4GwdIrEVIDvvxA1kOb7AH6IRK6toG9Bva3p/1imMF75DqPdaaF4HmbwyjwzE1vQZxKJPcnfxEH1ns2/lriCOOXEh9XO/7/MPjGcn3K+p7Cpg/by9WGjX84G1+ObOMkIzUl7ktl5RP07O6gF+6Y+T6QHgW1qNIOHJK2B80kTw+ZIaZaJtd3pwnxOao2CxpV/GAyMp9x9xqHJoTe0JxQ4whgC0WV+PDhTONniIcBMkGDZimhLskeYG6wstR+BSsRX6cMbhflaWXvWjfxmy+zfmI5LQnH2JlhrTS/0se4QTOIRRHYLGPjrrF0Lf9W10faUVvO5EFLgX5fLwQaGuV3j6w5/OCZU1zU7y++yk6PoA8dMfyTNcVvZOGpKEVCXMEFqf4vflIu x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:IA1PR11MB6193.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(366004)(39860400002)(136003)(376002)(396003)(346002)(451199021)(2616005)(83380400001)(921005)(38100700002)(31696002)(36756003)(122000001)(86362001)(38070700005)(478600001)(4326008)(71200400001)(31686004)(76116006)(110136005)(54906003)(6486002)(2906002)(8936002)(8676002)(30864003)(5660300002)(7416002)(66946007)(66446008)(91956017)(64756008)(66476007)(66556008)(316002)(53546011)(186003)(107886003)(6512007)(6506007)(26005)(41300700001)(21314003)(45980500001)(579004)(559001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?MEdNQUVGSyszeXo0K21uakNWcUU2VHg3MktEek1iMTRISDlqaGhMZVBVOEoz?= =?utf-8?B?ZWcxSU9rNU1sVGNvR1FIK2dwMlY2cnpXOGdZRThCOHlXSFY1WkFORXFxT2Vq?= =?utf-8?B?LzJrMWw2YktHZ29zMFNLMU91ZFB5U2R3TGJXbDBZTGxnY2pvaUdNVlNySDRs?= =?utf-8?B?cDQ2WW5BSFJHeEt6RlFxQkFzaG5mcUx4aGdsQmVYamVZK212eFRvMGV6by9T?= =?utf-8?B?NVZMRGJYYm91Ni8rdXl4QURaZ3ZsMlFzSHdRRXVOR1dHWkQ1RmZTTXFkYVNq?= =?utf-8?B?b0FIQTFTbmZ2TnVTU2F3RTFHc24yM1M2NG5CUHd3aDdiaE9ieWVQSm1obklH?= =?utf-8?B?LzBRMk5WdEJaSEd5RXNyeVEvY0VaS3VGRStRdHFzRDJDZmxDOFFFaHQ0K0la?= =?utf-8?B?N2VQODdKSm4zV3cwUTR0aUxPN3Y5VDMxVXBZUk9SdWcvYVFBMmFGSmJqdUcw?= =?utf-8?B?M2M0MzcwcEExOGlTY3NTV3JSSTdXRGZ1OEFmdFk2OVI4TWhrQnk1ejVnZ3JF?= =?utf-8?B?VU1HQ3pKRTY1bGVheDlZclZuNjVEZ0pLZUM5VHozLzF0cjVDUjJ4R2lycllw?= =?utf-8?B?R0ZtVFRETnBkSjh6d3hwZmhIdkl5ak0zaHMweWV2UzgzdzB6bDBkbnlvODlI?= =?utf-8?B?ZFdiSnIrZElvL1BUSUo3T0RnU3pEWHlCSXNQV2V4MEQ0eGR0YXF3ajNVdXV6?= =?utf-8?B?a2RiZXB4ZHZiV3NLOVAweEQ2bG9GYXM3dHlLVFlxV1lQOFR0TEhTcW5SbFZt?= =?utf-8?B?SS9NSFFkZTRQSVRNTFZWMURuSGFlc2lrOFEvQnJJcnlNYVdwcUZ3VnlvaHZD?= =?utf-8?B?M3EyTnpiWk1YS2tEeUpObmJPb3BFOFY1SVdGcWxGZU5DN1pqTVIwTlNycFVT?= =?utf-8?B?Vk9GZEQyVDVGbUlaaGN6R3UzUFp4MDg5SkRrYlo0aHBtUWRnZ2xraTd1aCtH?= =?utf-8?B?d1NYdDEvMy9pLzBrYmdkcHdiWnYxQ0lpRURBMmNVak1OQW1pOGxFVnJpU1ov?= =?utf-8?B?L1ltVkoxdGtIdUEwSnlQQ3lYNmRUb1ZHVWdMR0xwUkhrTkNYV0pFd2N6UC9J?= =?utf-8?B?cTJKUkx3bGFqbVpRTzRnbWNwVURqVEk1dFE5VTZnbHVGN3ZleVJna3BRMTdX?= =?utf-8?B?ZExFdXNvakgweTJPT1pQU0U1enl2T0JZbnhDUkp3Ulo1RGVoMC9scE5UTzJ4?= =?utf-8?B?T0QzUG5WT1Jyd0krN3hBZ05Wa3cwR3ZMbGgzOHY2ZytmUENYRTBWclNWZkpm?= =?utf-8?B?Qlh1TW5DZ09VVDVMODViMlRWdzY2NktxTXc5N0I2Qy8yaHdJVG1VV2JpU3hn?= =?utf-8?B?M1puODg2S0RqbmY5dFdpSC9USlhUVUUvM0thZHN6T2pmMXpia0xTNVRTTjh2?= =?utf-8?B?bDBVb1FrbUFkMXBSMXYxQTBNY2hnWVRpbXE2WXV4azdaYWpTUXVxLzNKSUMr?= =?utf-8?B?d2Y0emRVMUhZbEgyc05EclBVOEJWcWhSZlNtRFppQXQ4NmFjN3RuZE1xNTB0?= =?utf-8?B?S2xWWTJRL2hDcmdBM0JYeHVFTUxGdFhaKzZZR09ub1FpeFNmdnN4Q3dTQzJ3?= =?utf-8?B?cHRJeThkZi8zQzMzY0Z6cDV1M1RNNHk4Z0R0TmQyTFZIMndNMSswdFMvVW9G?= =?utf-8?B?SldtR2w0S3R3YWZFUnM0S1g3U2VlTjZGTE5yekFydFg0aFNpUFVXS0dyN3Ir?= =?utf-8?B?VDkrcUp0MzlrWVMrcENRQytGTDN5SS9HV3IwWndkbnNsTks5anF0T0pjUGhS?= =?utf-8?B?NVJyaDc5Y1BHU2drZGJXN0RvakxZT0YvdXJJME9GME5laERWOGpDQjl1b09V?= =?utf-8?B?QUdqS0g1M3pFRCtycU9zYlRjRUtNMnhyRnNhZUx3QnFxT1BzLzU4Y1pBbEtq?= =?utf-8?B?VU9oM3Ewbjg5N1FvODhqalZOQmZYRmdteXhJajhMTldnU2VtaUZwQnI1WGxx?= =?utf-8?B?cHlISWpCYnhNT0xWbWVjN1ptTmdxTGtyUDd5L3U3V3RINmJ6VEZJWXB0NkRB?= =?utf-8?B?U1ZUelJmTEFLTmdDdFBqd0hJYVZBVEMrZE1NQkVGamNqc2ZYeU1qQWcvOXZF?= =?utf-8?B?Y2x2SEFkWVBqeWljQzI4eEphOTlVV3RvMGVjdENIRVE2K2FkcXNFYTNZeUZz?= =?utf-8?Q?nXQqMnQIU/CY9cKBT0DXS2Zlo?= Content-ID: <6DE7CFABBF31C946A426C60DE52B884C@namprd11.prod.outlook.com> MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: IA1PR11MB6193.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1f1ed0f0-21e3-433e-7590-08db6d728ff7 X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Jun 2023 07:31:41.1988 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ereAo9rNwrXnngX9TkmaaHxIso/E9/HGrkb0HcLKumAC9HP5C+8MwcA3pKBvxo+aa1Kl9iGlhKgFBdzab2cAw67syzjDgAB0AS1ztSFP7lQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CYYPR11MB8387 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230615_003147_709256_0F2C68FD X-CRM114-Status: GOOD ( 19.31 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 14/06/23 12:40, Claudiu Beznea - M18063 wrote: > On 13.06.2023 10:04, Manikandan Muralidharan wrote: >> - XLCDC in SAM9X7 has different sets of registers and additional >> configuration bits when compared to previous HLCDC IP. Read/write >> operation on the controller registers is now separated using the >> XLCDC status flag. >> - HEO scaling, window resampling, Alpha blending, YUV-to-RGB >> conversion in XLCDC is derived and handled using additional >> configuration bits and registers. >> - Writing one to the Enable fields of each layer in LCD_ATTRE >> is required to reflect the values set in Configuration, FBA, Enable >> registers of each layer >> >> Signed-off-by: Manikandan Muralidharan >> [Hari.PrasathGE@microchip.com: update the attribute field for each layer] >> Signed-off-by: Hari Prasath Gujulan Elango >> [durai.manickamkr@microchip.com: implement status flag to seprate register update] >> Signed-off-by: Durai Manickam KR >> --- >> .../gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 28 +- >> .../gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | 297 ++++++++++++++---- >> 2 files changed, 256 insertions(+), 69 deletions(-) >> >> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c >> index 58184cd6ab0b..7c9cf7c0c75d 100644 >> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c >> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c >> @@ -139,10 +139,10 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) >> state = drm_crtc_state_to_atmel_hlcdc_crtc_state(c->state); >> cfg = state->output_mode << 8; >> >> - if (adj->flags & DRM_MODE_FLAG_NVSYNC) >> + if (!crtc->dc->is_xlcdc && (adj->flags & DRM_MODE_FLAG_NVSYNC)) >> cfg |= ATMEL_HLCDC_VSPOL; >> >> - if (adj->flags & DRM_MODE_FLAG_NHSYNC) >> + if (!crtc->dc->is_xlcdc && (adj->flags & DRM_MODE_FLAG_NHSYNC)) >> cfg |= ATMEL_HLCDC_HSPOL; >> >> regmap_update_bits(regmap, ATMEL_HLCDC_CFG(5), >> @@ -177,6 +177,18 @@ static void atmel_hlcdc_crtc_atomic_disable(struct drm_crtc *c, >> >> pm_runtime_get_sync(dev->dev); >> >> + if (crtc->dc->is_xlcdc) { >> + regmap_write(regmap, ATMEL_HLCDC_DIS, ATMEL_XLCDC_CM); >> + while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) && >> + (status & ATMEL_XLCDC_CM)) >> + cpu_relax(); > > A timeout would be god here to avoid potential infinite loop (for different > reasons). You can check regmap_read_poll_timeout(). Same for the rest of > while loops above. I will address all the comments given, Thank you. > >> + >> + regmap_write(regmap, ATMEL_HLCDC_DIS, ATMEL_XLCDC_SD); >> + while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) && >> + !(status & ATMEL_XLCDC_SD)) >> + cpu_relax(); >> + } >> + >> regmap_write(regmap, ATMEL_HLCDC_DIS, ATMEL_HLCDC_DISP); >> while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) && >> (status & ATMEL_HLCDC_DISP)) >> @@ -231,6 +243,18 @@ static void atmel_hlcdc_crtc_atomic_enable(struct drm_crtc *c, >> !(status & ATMEL_HLCDC_DISP)) >> cpu_relax(); >> >> + if (crtc->dc->is_xlcdc) { >> + regmap_write(regmap, ATMEL_HLCDC_EN, ATMEL_XLCDC_CM); >> + while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) && >> + !(status & ATMEL_XLCDC_CM)) >> + cpu_relax(); >> + >> + regmap_write(regmap, ATMEL_HLCDC_EN, ATMEL_XLCDC_SD); >> + while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) && >> + (status & ATMEL_XLCDC_SD)) >> + cpu_relax(); >> + } >> + >> pm_runtime_put_sync(dev->dev); >> >> } >> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c >> index daa508504f47..fe33476818c4 100644 >> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c >> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c >> @@ -330,11 +330,59 @@ static void atmel_hlcdc_plane_setup_scaler(struct atmel_hlcdc_plane *plane, >> yfactor)); >> } >> >> +static void atmel_xlcdc_plane_setup_scaler(struct atmel_hlcdc_plane *plane, >> + struct atmel_hlcdc_plane_state *state) >> +{ >> + const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; >> + u32 xfactor, yfactor; >> + >> + if (!desc->layout.scaler_config) >> + return; >> + >> + if (state->crtc_w == state->src_w && state->crtc_h == state->src_h) { >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.scaler_config, 0); >> + return; >> + } >> + >> + /* xfactor = round[(2^20 * XMEMSIZE)/XSIZE)] */ >> + xfactor = (1048576 * state->src_w) / state->crtc_w; >> + >> + /* yfactor = round[(2^20 * YMEMSIZE)/YSIZE)] */ >> + yfactor = (1048576 * state->src_h) / state->crtc_h; >> + >> + atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config, >> + ATMEL_XLCDC_LAYER_VSCALER_LUMA_ENABLE | >> + ATMEL_XLCDC_LAYER_VSCALER_CHROMA_ENABLE | >> + ATMEL_XLCDC_LAYER_HSCALER_LUMA_ENABLE | >> + ATMEL_XLCDC_LAYER_HSCALER_CHROMA_ENABLE); >> + >> + atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config + 1, >> + yfactor); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config + 3, >> + xfactor); >> + >> + /* As per YCbCr window resampling configuration */ >> + if (state->base.fb->format->format == DRM_FORMAT_YUV420) { >> + atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config + 2, >> + yfactor / 2); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config + 4, >> + xfactor / 2); >> + } else { >> + /* As per ARGB window resampling configuration */ >> + atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config + 2, >> + yfactor); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config + 4, >> + xfactor); >> + } >> +} >> + >> static void >> atmel_hlcdc_plane_update_pos_and_size(struct atmel_hlcdc_plane *plane, >> struct atmel_hlcdc_plane_state *state) >> { >> const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; >> + struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private; >> >> if (desc->layout.size) >> atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.size, >> @@ -352,7 +400,10 @@ atmel_hlcdc_plane_update_pos_and_size(struct atmel_hlcdc_plane *plane, >> ATMEL_HLCDC_LAYER_POS(state->crtc_x, >> state->crtc_y)); >> >> - atmel_hlcdc_plane_setup_scaler(plane, state); >> + if (!(dc->is_xlcdc)) > > You can reverse the logic here to avoid !dc->is_xlcdc. Also, no need for () > around dc->is_xlcdc > >> + atmel_hlcdc_plane_setup_scaler(plane, state); >> + else >> + atmel_xlcdc_plane_setup_scaler(plane, state); >> } >> >> static void >> @@ -362,33 +413,58 @@ atmel_hlcdc_plane_update_general_settings(struct atmel_hlcdc_plane *plane, >> unsigned int cfg = ATMEL_HLCDC_LAYER_DMA_BLEN_INCR16 | state->ahb_id; >> const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; >> const struct drm_format_info *format = state->base.fb->format; >> - > > extra line > >> + struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private; >> /* >> * Rotation optimization is not working on RGB888 (rotation is still >> * working but without any optimization). >> */ >> - if (format->format == DRM_FORMAT_RGB888) >> + if ((!(dc->is_xlcdc)) && format->format == DRM_FORMAT_RGB888) > > No need for extra (). > >> cfg |= ATMEL_HLCDC_LAYER_DMA_ROTDIS; >> >> - atmel_hlcdc_layer_write_cfg(&plane->layer, ATMEL_HLCDC_LAYER_DMA_CFG, >> - cfg); >> + if (!(dc->is_xlcdc)) { > > no need for extra () > >> + atmel_hlcdc_layer_write_cfg(&plane->layer, ATMEL_HLCDC_LAYER_DMA_CFG, >> + cfg); >> >> - cfg = ATMEL_HLCDC_LAYER_DMA | ATMEL_HLCDC_LAYER_REP; >> + cfg = ATMEL_HLCDC_LAYER_DMA | ATMEL_HLCDC_LAYER_REP; >> + } else { >> + atmel_hlcdc_layer_write_cfg(&plane->layer, ATMEL_XLCDC_LAYER_DMA_CFG, >> + cfg); >> + >> + cfg = ATMEL_XLCDC_LAYER_DMA | ATMEL_XLCDC_LAYER_REP; >> + } >> >> if (plane->base.type != DRM_PLANE_TYPE_PRIMARY) { >> - cfg |= ATMEL_HLCDC_LAYER_OVR | ATMEL_HLCDC_LAYER_ITER2BL | >> - ATMEL_HLCDC_LAYER_ITER; >> + if (!(dc->is_xlcdc)) { > > no need for extra (). Same for the rest of occurencies above. Also, you can > reverse the logic to avoid ! in front of (dc->is_xlcdc) > >> + cfg |= ATMEL_HLCDC_LAYER_OVR | ATMEL_HLCDC_LAYER_ITER2BL | >> + ATMEL_HLCDC_LAYER_ITER; >> + >> + if (format->has_alpha) >> + cfg |= ATMEL_HLCDC_LAYER_LAEN; >> + else >> + cfg |= ATMEL_HLCDC_LAYER_GAEN | >> + ATMEL_HLCDC_LAYER_GA(state->base.alpha); >> + } else { >> + /* >> + * Alpha Blending bits specific to SAM9X7 SoC >> + */ >> + cfg |= ATMEL_XLCDC_LAYER_SFACTC_A0_MULT_AS | >> + ATMEL_XLCDC_LAYER_SFACTA_ONE | >> + ATMEL_XLCDC_LAYER_DFACTC_M_A0_MULT_AS | >> + ATMEL_XLCDC_LAYER_DFACTA_ONE; >> + if (format->has_alpha) >> + cfg |= ATMEL_XLCDC_LAYER_A0(0xff); >> + else >> + cfg |= ATMEL_XLCDC_LAYER_A0(state->base.alpha); >> + } >> + } >> >> - if (format->has_alpha) >> - cfg |= ATMEL_HLCDC_LAYER_LAEN; >> + if (state->disc_h && state->disc_w) { >> + if (!(dc->is_xlcdc)) >> + cfg |= ATMEL_HLCDC_LAYER_DISCEN; >> else >> - cfg |= ATMEL_HLCDC_LAYER_GAEN | >> - ATMEL_HLCDC_LAYER_GA(state->base.alpha); >> + cfg |= ATMEL_XLCDC_LAYER_DISCEN; >> } >> >> - if (state->disc_h && state->disc_w) >> - cfg |= ATMEL_HLCDC_LAYER_DISCEN; >> - >> atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.general_config, >> cfg); >> } >> @@ -441,33 +517,42 @@ static void atmel_hlcdc_plane_update_buffers(struct atmel_hlcdc_plane *plane, >> struct atmel_hlcdc_plane_state *state) >> { >> const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; >> + struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private; >> struct drm_framebuffer *fb = state->base.fb; >> u32 sr; >> int i; >> >> - sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHSR); >> + if (!(dc->is_xlcdc)) > > You can reverse the logic > >> + sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHSR); >> + else >> + sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_XLCDC_LAYER_ENR); >> >> for (i = 0; i < state->nplanes; i++) { >> struct drm_gem_dma_object *gem = drm_fb_dma_get_gem_obj(fb, i); >> >> state->dscrs[i]->addr = gem->dma_addr + state->offsets[i]; >> >> - atmel_hlcdc_layer_write_reg(&plane->layer, >> - ATMEL_HLCDC_LAYER_PLANE_HEAD(i), >> - state->dscrs[i]->self); >> - >> - if (!(sr & ATMEL_HLCDC_LAYER_EN)) { >> - atmel_hlcdc_layer_write_reg(&plane->layer, >> - ATMEL_HLCDC_LAYER_PLANE_ADDR(i), >> - state->dscrs[i]->addr); >> + if (!(dc->is_xlcdc)) { > > you can reverse the logic > >> atmel_hlcdc_layer_write_reg(&plane->layer, >> - ATMEL_HLCDC_LAYER_PLANE_CTRL(i), >> - state->dscrs[i]->ctrl); >> + ATMEL_HLCDC_LAYER_PLANE_HEAD(i), >> + state->dscrs[i]->self); >> + >> + if (!(sr & ATMEL_HLCDC_LAYER_EN)) { >> + atmel_hlcdc_layer_write_reg(&plane->layer, >> + ATMEL_HLCDC_LAYER_PLANE_ADDR(i), >> + state->dscrs[i]->addr); >> + atmel_hlcdc_layer_write_reg(&plane->layer, >> + ATMEL_HLCDC_LAYER_PLANE_CTRL(i), >> + state->dscrs[i]->ctrl); >> + atmel_hlcdc_layer_write_reg(&plane->layer, >> + ATMEL_HLCDC_LAYER_PLANE_NEXT(i), >> + state->dscrs[i]->self); >> + } >> + } else { >> atmel_hlcdc_layer_write_reg(&plane->layer, >> - ATMEL_HLCDC_LAYER_PLANE_NEXT(i), >> - state->dscrs[i]->self); >> + ATMEL_XLCDC_LAYER_PLANE_ADDR(i), >> + state->dscrs[i]->addr); >> } >> - >> if (desc->layout.xstride[i]) >> atmel_hlcdc_layer_write_cfg(&plane->layer, >> desc->layout.xstride[i], >> @@ -716,19 +801,31 @@ static void atmel_hlcdc_plane_atomic_disable(struct drm_plane *p, >> struct drm_atomic_state *state) >> { >> struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p); >> - > > You can keep this line afte the above variable. > >> + struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private; >> /* Disable interrupts */ >> - atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_IDR, >> - 0xffffffff); >> + if (!(dc->is_xlcdc)) > > you can reverse the logic > >> + atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_IDR, >> + 0xffffffff); >> + else >> + atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_XLCDC_LAYER_IDR, >> + 0xffffffff); >> >> /* Disable the layer */ >> - atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHDR, >> - ATMEL_HLCDC_LAYER_RST | >> - ATMEL_HLCDC_LAYER_A2Q | >> - ATMEL_HLCDC_LAYER_UPDATE); >> + if (!(dc->is_xlcdc)) > > same here. > >> + atmel_hlcdc_layer_write_reg(&plane->layer, >> + ATMEL_HLCDC_LAYER_CHDR, >> + ATMEL_HLCDC_LAYER_RST | >> + ATMEL_HLCDC_LAYER_A2Q | >> + ATMEL_HLCDC_LAYER_UPDATE); >> + else >> + atmel_hlcdc_layer_write_reg(&plane->layer, >> + ATMEL_XLCDC_LAYER_ENR, 0); >> >> /* Clear all pending interrupts */ >> - atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_ISR); >> + if (!(dc->is_xlcdc)) >> + atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_ISR); >> + else >> + atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_XLCDC_LAYER_ISR); >> } >> >> static void atmel_hlcdc_plane_atomic_update(struct drm_plane *p, >> @@ -739,6 +836,7 @@ static void atmel_hlcdc_plane_atomic_update(struct drm_plane *p, >> struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p); >> struct atmel_hlcdc_plane_state *hstate = >> drm_plane_state_to_atmel_hlcdc_plane_state(new_s); >> + struct atmel_hlcdc_dc *dc = p->dev->dev_private; >> u32 sr; >> >> if (!new_s->crtc || !new_s->fb) >> @@ -756,23 +854,46 @@ static void atmel_hlcdc_plane_atomic_update(struct drm_plane *p, >> atmel_hlcdc_plane_update_buffers(plane, hstate); >> atmel_hlcdc_plane_update_disc_area(plane, hstate); >> >> - /* Enable the overrun interrupts. */ >> - atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_IER, >> - ATMEL_HLCDC_LAYER_OVR_IRQ(0) | >> - ATMEL_HLCDC_LAYER_OVR_IRQ(1) | >> - ATMEL_HLCDC_LAYER_OVR_IRQ(2)); >> - >> - /* Apply the new config at the next SOF event. */ >> - sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHSR); >> - atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHER, >> - ATMEL_HLCDC_LAYER_UPDATE | >> - (sr & ATMEL_HLCDC_LAYER_EN ? >> - ATMEL_HLCDC_LAYER_A2Q : ATMEL_HLCDC_LAYER_EN)); >> + if (!(dc->is_xlcdc)) { > > same here > >> + /* Enable the overrun interrupts. */ >> + atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_IER, >> + ATMEL_HLCDC_LAYER_OVR_IRQ(0) | >> + ATMEL_HLCDC_LAYER_OVR_IRQ(1) | >> + ATMEL_HLCDC_LAYER_OVR_IRQ(2)); >> + >> + /* Apply the new config at the next SOF event. */ >> + sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHSR); >> + atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHER, >> + ATMEL_HLCDC_LAYER_UPDATE | >> + (sr & ATMEL_HLCDC_LAYER_EN ? >> + ATMEL_HLCDC_LAYER_A2Q : ATMEL_HLCDC_LAYER_EN)); >> + } else { >> + /* Enable the overrun interrupts. */ >> + atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_XLCDC_LAYER_IER, >> + ATMEL_XLCDC_LAYER_OVR_IRQ(0) | >> + ATMEL_XLCDC_LAYER_OVR_IRQ(1) | >> + ATMEL_XLCDC_LAYER_OVR_IRQ(2)); >> + >> + atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_XLCDC_LAYER_ENR, >> + ATMEL_XLCDC_LAYER_EN); >> + } >> + >> + /* >> + * Updating XLCDC_xxxCFGx, XLCDC_xxxFBA and XLCDC_xxxEN, >> + * (where xxx indicates each layer) requires writing one to the >> + * Update Attribute field for each layer in LCDC_ATTRE register for SAM9X7. >> + */ >> + if (dc->is_xlcdc) { >> + regmap_write(dc->hlcdc->regmap, ATMEL_XLCDC_ATTRE, ATMEL_XLCDC_BASE_UPDATE | >> + ATMEL_XLCDC_OVR1_UPDATE | ATMEL_XLCDC_OVR3_UPDATE | >> + ATMEL_XLCDC_HEO_UPDATE); >> + } >> } >> >> static int atmel_hlcdc_plane_init_properties(struct atmel_hlcdc_plane *plane) >> { >> const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; >> + struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private; >> >> if (desc->type == ATMEL_HLCDC_OVERLAY_LAYER || >> desc->type == ATMEL_HLCDC_CURSOR_LAYER) { >> @@ -796,20 +917,50 @@ static int atmel_hlcdc_plane_init_properties(struct atmel_hlcdc_plane *plane) >> return ret; >> } >> >> - if (desc->layout.csc) { >> + if (!(dc->is_xlcdc)) { > > you can reverse the logic > >> + if (desc->layout.csc) { >> + /* >> + * TODO: decare a "yuv-to-rgb-conv-factors" property to let >> + * userspace modify these factors (using a BLOB property ?). >> + */ >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.csc, >> + 0x4c900091); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.csc + 1, >> + 0x7a5f5090); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.csc + 2, >> + 0x40040890); >> + } >> + } else { >> /* >> - * TODO: decare a "yuv-to-rgb-conv-factors" property to let >> - * userspace modify these factors (using a BLOB property ?). >> + * yuv-to-rgb-conv-factors are now defined from LCDC_HEOCFG16 to >> + * LCDC_HEOCFG21 registers in SAM9X7. >> */ >> - atmel_hlcdc_layer_write_cfg(&plane->layer, >> - desc->layout.csc, >> - 0x4c900091); >> - atmel_hlcdc_layer_write_cfg(&plane->layer, >> - desc->layout.csc + 1, >> - 0x7a5f5090); >> - atmel_hlcdc_layer_write_cfg(&plane->layer, >> - desc->layout.csc + 2, >> - 0x40040890); >> + if (desc->layout.csc) { >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.csc, >> + 0x00000488); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.csc + 1, >> + 0x00000648); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.csc + 2, >> + 0x1EA00480); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.csc + 3, >> + 0x00001D28); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.csc + 4, >> + 0x08100480); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.csc + 5, >> + 0x00000000); >> + atmel_hlcdc_layer_write_cfg(&plane->layer, >> + desc->layout.csc + 6, >> + 0x00000007); >> + } >> } >> >> return 0; >> @@ -819,19 +970,31 @@ void atmel_hlcdc_plane_irq(struct atmel_hlcdc_plane *plane) >> { >> const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; >> u32 isr; >> + struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private; >> >> - isr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_ISR); >> + if (!(dc->is_xlcdc)) > > same here. > >> + isr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_ISR); >> + else >> + isr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_XLCDC_LAYER_ISR); >> >> /* >> * There's not much we can do in case of overrun except informing >> * the user. However, we are in interrupt context here, hence the >> * use of dev_dbg(). >> */ >> - if (isr & >> - (ATMEL_HLCDC_LAYER_OVR_IRQ(0) | ATMEL_HLCDC_LAYER_OVR_IRQ(1) | >> - ATMEL_HLCDC_LAYER_OVR_IRQ(2))) >> - dev_dbg(plane->base.dev->dev, "overrun on plane %s\n", >> - desc->name); >> + if (!(dc->is_xlcdc)) { >> + if (isr & >> + (ATMEL_HLCDC_LAYER_OVR_IRQ(0) | ATMEL_HLCDC_LAYER_OVR_IRQ(1) | >> + ATMEL_HLCDC_LAYER_OVR_IRQ(2))) >> + dev_dbg(plane->base.dev->dev, "overrun on plane %s\n", >> + desc->name); >> + } else { >> + if (isr & >> + (ATMEL_XLCDC_LAYER_OVR_IRQ(0) | ATMEL_XLCDC_LAYER_OVR_IRQ(1) | >> + ATMEL_XLCDC_LAYER_OVR_IRQ(2))) >> + dev_dbg(plane->base.dev->dev, "overrun on plane %s\n", >> + desc->name); >> + } >> } >> >> static const struct drm_plane_helper_funcs atmel_hlcdc_layer_plane_helper_funcs = { > -- Thanks and Regards, Manikandan M. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel