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 A6516EB64D9 for ; Wed, 14 Jun 2023 07:11:05 +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=1f0uFV0U82AVkTmU8J+hJP48qoFjI0WSUoBjUhdPoZk=; b=XnAA+TbG7m0N6+ VAhNXZpsIz8widaZftxLm4v7cp4Qf0uoluxgPpfjgoHff6v8IQ2pwCUgdjjQtCQ4L05FS1CIWrzaB ai5PQg9N369uvh1mLuAgVOpkcGXzxYfIEehoUgy1mehNZxfhNrylaEYuNtkklYEo4jpkg5IH3Z8OF +fgZkiIhH3UHU9/mbZwYTJWibaDI2E7oX1cXi+HfNWE8LQAtcZ9wnpJLPIBARaPC3T5QAFWEBCsEB 7sVBCYZfAokgsTPX37AHe0BDr5+rn9f6IBpN4M7hgXr8VkHK3oDAWI6kptnlxDkZcin+MIDgTa0rQ ndUUDPJpRtYjEmDA/iGg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q9KeS-00AbUR-2o; Wed, 14 Jun 2023 07:10:44 +0000 Received: from esa.microchip.iphmx.com ([68.232.154.123]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1q9KeO-00AbSs-0B for linux-arm-kernel@lists.infradead.org; Wed, 14 Jun 2023 07:10:42 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1686726639; x=1718262639; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=tRp+8M3hEkXmwZKzWj7JgT6nDCu729hergdYPdKPafI=; b=yqUG4bzp0H/vbvaU48cIub6gvc4EY8b9ZlNBbJcIkLEviD0gjWk+WWGJ wR2t8h/Vkx7INT6SSjGzmXXSV4I90fqu7Jbuj3aMifKhc3E6AW5agndrd yOX/YMM06fgNk9sNEGRQNNb3lC+7kFI8DgJvQ+yfGDX3iJqPD7oenZTCy FFeKveFh9p+qaZwLAjSG76UisSae30leUMTDVghpg8KkdVei7X9GrTdHw dKeQRCTl68yT1x8R3FHQLSDs/RWo3YUCqG2/XiknlRxRY79LooVeipD7o MmdN6Z/Jbmu34+0hWUOpHmbgXb9Pkrxjt0TLuLuf3pnmdq6RKyAnYdDtV g==; X-IronPort-AV: E=Sophos;i="6.00,241,1681196400"; d="scan'208";a="220209001" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa2.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 14 Jun 2023 00:10:37 -0700 Received: from chn-vm-ex03.mchp-main.com (10.10.85.151) 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; Wed, 14 Jun 2023 00:10:20 -0700 Received: from NAM04-MW2-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.87.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21 via Frontend Transport; Wed, 14 Jun 2023 00:10:20 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Lykj/TVXJhdT+ixEaGRymxJsFfpEyYMmpAAREBpDfE51kkrwJGuvDPitxMBBeOvmdp5K8qjWsn9JWoPczLxjc8FKIpjddC9wv6OVatQXvQtnv+MF9Os8xhoOXV4Ea0r+t58nnA2tYRoQgzPtqNsFv+KUEa6OhO7SutpgeUdbWSSAynK9GxOkN7uoQ2U2c7f6EbgJg3sT2/9xOq+MCVUBeCNb2A3LH8GVmkTYOkxF+m0cyssoDmRdpoY5WToDB3i1C/o/sRDwzIlrGZBMC9Fl/girq7ksqgXQbs6XQjUEZfqbFYej8YIiUJ+J/WHoOsOSNG7rsG8WPOUhAVG1nuZbnQ== 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=tRp+8M3hEkXmwZKzWj7JgT6nDCu729hergdYPdKPafI=; b=Ra6Pqurmezm5AV+rEp9P4EooNejQvM+Lf5oZLWUchITjvWkHifthcntSVABRUNlIhx4apLOGILxtD22ePnLAM4IBrJ3Iv3JqDK7A3P+tZTKNplQ5Bm6noNZafttFna03GMbBaY77x42NveC1OLSbcTj+yo+NLz9lMfeE8LXpVqqLukZEwcQFdnGwDI0++eL+iBS8NrC566rYftx/8Z61jYvY9sbLGN5kIwg2zyG/JPx4do830eY7L9NkDw0k+HfIsXqlDUqWckg9m+vre0Muy50bzCC2scwulACqihKeg6E/EOuhENb8F1eutMO2LwfzjFZmHzg7Wjvf4AwttEChww== 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=tRp+8M3hEkXmwZKzWj7JgT6nDCu729hergdYPdKPafI=; b=SD/DKPq98JYlgLIQ/LSovH1rKgNz2PwyEoIX8gsh03lgQkM4TOyVFajpaxQQi9TohLJUnSqja+qv9fuMhL7DmAfzZXhtC5tD0sG8iIFHO0ewyPO9hPBP/ukv4G0kXOaHG0Ad++PtIC1ZOBGkL8RWGlTW+YAzKeHch2Yx8i5DfLQ= Received: from SJ2PR11MB7648.namprd11.prod.outlook.com (2603:10b6:a03:4c3::17) by MN0PR11MB6159.namprd11.prod.outlook.com (2603:10b6:208:3c9::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6477.29; Wed, 14 Jun 2023 07:10:17 +0000 Received: from SJ2PR11MB7648.namprd11.prod.outlook.com ([fe80::27bf:a69f:806f:67be]) by SJ2PR11MB7648.namprd11.prod.outlook.com ([fe80::27bf:a69f:806f:67be%5]) with mapi id 15.20.6433.024; Wed, 14 Jun 2023 07:10:17 +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: AQHZno9Ff1Cuco+5VECF25MgwR1ezA== Date: Wed, 14 Jun 2023 07:10:17 +0000 Message-ID: References: <20230613070426.467389-1-manikandan.m@microchip.com> <20230613070426.467389-7-manikandan.m@microchip.com> In-Reply-To: <20230613070426.467389-7-manikandan.m@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 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: SJ2PR11MB7648:EE_|MN0PR11MB6159:EE_ x-ms-office365-filtering-correlation-id: 7b7c7113-99c8-4f8a-4e8d-08db6ca6685f x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 5qA+Gl0DWc3YdAEikCG3mT0+/NMFkmyLgk1IE4fr5Z0vAtJN9SjyBGefcogufgZ9b9bNaqSb6ElR3wRJrv5h7L5384GSGCWFTLoi3ne79IpEhOAf8MHAwm1Ti+VTpdXmo+P1d8hJQfnCZgyT9K1OxIZsHdJaZ0jnc+vhHp8dVQI8M4GJKGcKe811hLDNOojorZjAqLVIdOorvclZD4/JjPXRsB8xw4orxvTskfoFB1Jmbhdc7FDg/axE60eMcflBLj4TSM5sRIHZZjJs3KYXmwKerBK2G66/dnRL+pUXy8OXoRxfahRren+8JsL+1RTdIY9MpLx3Jj0Iz4ooeSoSzV963jxvgSqZUyNPpu4dFoVDNx+i1QngR2by3HaAhTGd4ciesLytueW40SKhnCJWb1bzcRd1qaaT78ke+IdTZt7+Xah72g3BAFGYVOEnjrVDzL9apvfzZeh6H/t1GsXXPRbWMLezM6G0700JPT0Ov4j3xZSSyYf+3OP84QZpD1KNApD55+gYzGDXHhTD5v0HVxcrEEKAzYlLUwjzNkfvYiSn8sqRnlZIFQlO1umeRVflUGwT5GTNgtoLGGAxhwAXN4y6gUztHW/ne85cSTekjrkH2S/OokjUH8SU1KSxDSJ9ruGPmTEy3PnHB8YWkZSmVeRGvBT8IbBvzt3llXqaZ38DYDYT3hlGE/kj4L/09A4laNfzn7rUD3P2RxN1oufje4WHI8DyW8PUJNHPFVU6+rw= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ2PR11MB7648.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(136003)(346002)(376002)(366004)(396003)(39860400002)(451199021)(71200400001)(6486002)(478600001)(6506007)(107886003)(26005)(83380400001)(186003)(6512007)(53546011)(36756003)(31696002)(86362001)(38070700005)(38100700002)(2616005)(921005)(122000001)(66556008)(66946007)(64756008)(66446008)(66476007)(4326008)(76116006)(316002)(91956017)(8936002)(8676002)(31686004)(7416002)(5660300002)(30864003)(2906002)(41300700001)(110136005)(54906003)(21314003)(45980500001)(43740500002)(579004)(559001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?VmVXT2hkQjlHWVp6bGlzTVhvSnpud3ZZdEFyZVgxbS9GaCtxa1FCd3ZUaWtw?= =?utf-8?B?aEtuNEtYVmplYkhqYWJNZGtJYXhzRTdnRENTSVQrWjhhOGF2by9rbVBDYUto?= =?utf-8?B?RGk3ckFXOGg4Y2hvZE9hNEtGbDlIWDY2TUtYT2JibE1rdUxxVzJhZ004WGhn?= =?utf-8?B?OHJ2bWpTU1ZlQUdxYmh3NndZcUpUbUJIbTU2cVgyL2hjMDA4QUFJb1pxTjR2?= =?utf-8?B?bFRYUEtaYVdSZEVXc3UzTlptQUd0QXBJa2d3UU82TE4wZEtZdUZ4VWx5Vzc5?= =?utf-8?B?RUFVRTZSeENVWFRvTmxhaWFQUWxIMWpiaHJRRmM3eWRwdWdCandKSjRDOC9v?= =?utf-8?B?czYvN1RTMUx4UWVFYlNXL3o0VWFkUTVNOEphT0had1YxeHJyakxOYWFRdHgy?= =?utf-8?B?ZUZPVGF3ZS9NMitFSXA4em1ZZUUvSzgzZDNtbFhMdUlVbytUYVVVQzNxVkVz?= =?utf-8?B?Ky9TSFB5VkVpajZUbkFTdUJNbTZBc3E5azhpeUtpVzFwOFdIdzE1WnU2WXVa?= =?utf-8?B?dk9PSlppRjlqQmFuTnlVc2xGbzdaU3FicjFjYTF0cXlkWXNXQ3ZIK1JxbnZ1?= =?utf-8?B?ZVBid2ZFdWJtSFRjcytsVENoM0JyeGNYdzY5d2tBU3FhbWU1a21MU2orSFJ0?= =?utf-8?B?cFlmZHRKQXg5bXhGQmxpNU16ZjR6NkxGZ3R2T1huc0IzL3k4VFUwd0FqcndI?= =?utf-8?B?dDhQV2dOb0RmbjhzNENvUWFPdEhXSHpyOXdSM2NGQ3VnL0pZUlJISnBUTHYv?= =?utf-8?B?eS8zUUJzL3phVXhSTzRjYUdDREF3Y0NhQnRsdFNaY3lmSXNkQjlNK0Vmbm85?= =?utf-8?B?aFBjQ1g4WE1KL1ZIOGxxU0pSSUNOU3VDZ2laRXJnYUtXSU50Tlh4dEs1WSt2?= =?utf-8?B?RE8yQk45ZVFYTFdsWXRhNThyRGFFU1c0aXgwczBTTjQ0OHA2TGMvZkpIWDVP?= =?utf-8?B?NFQxNmx0MXNYanc0TTQ4RkdyUHRzUkc4N2h4cWg5Wnk0eGlwbHBRNnBYbzIz?= =?utf-8?B?Ti9Tc3FRNmx3enlyRzVNOXkrdnlxUGVsWE9jeUtQTnY4ajVpV2lrZWdkbFY0?= =?utf-8?B?bjVqck5SdUFSb1orK3NId3RmcGN5eWhtcTdiS3RYK0lITVZ1aTBmREF2Y09u?= =?utf-8?B?VEQ3WC9Uc0s5OWQ0TEhUcG8xbzBSS0oyOXBvUUlNL0FPSzZTb0pXclFvc1NX?= =?utf-8?B?VzBFemIwT0xNREJVMkRxYldTWG9vNWh0dENMUFM1S1hOTGpSUFlJdFBOeEE1?= =?utf-8?B?N2d0elE5NlZHcmYyVjVqenpLRFZWdGVwNGJrV0x2NFlTSVgzK2ExWVVyR1Vp?= =?utf-8?B?SDhMeTk4VkFpNnZvNEtzRGIwa1BRam9LUktwZk9TSHVBcElpRGZvVm0wcXAy?= =?utf-8?B?NFJ3T0Y5Q05mWUtrVzdjVTNna3NtZUJ2VTZFV1VpL28vZmlXbWdvMk1zTHlx?= =?utf-8?B?a1EraktEM3B5QzdDcmtta0ljYXVvMzBXVk5jTmNsdU9id0t3ZDdGTTFrQWRS?= =?utf-8?B?a0JWWjZqQ1ZNYVR5ZlRROThDVk1jbWJTbW1LVk1aM2dTSUR1RHkza3R1ZTNQ?= =?utf-8?B?MDJkcXNEb0U2NEk5YnJPdUxmMUhSaUNWaFZHek81dXdQekpNS1FyVkRlNUdD?= =?utf-8?B?ck5aVU9KdldINjI4Z2lxeWtaK0dWSS9hdENvOXliem9hV3lxSUs3TXJTRDhO?= =?utf-8?B?aS96V2J1d0IvdmFEZ091d1N0aG40QWJpcU1lQVRlOWcyWWpUakdiamlNWEx6?= =?utf-8?B?QnE0Z0QvcjFzK3dsTUZ4a1owU295K2NMVmVOTHRobkRaYnkyVk1tK0I1aGMx?= =?utf-8?B?RGtoYkUzYXgzQXg1UHZaWWtRU1pxd1VaUVoyeFcwcmpHd3R5ZWU4SGJ3KzhH?= =?utf-8?B?SElLb3FSWUs0TkJweUtUTSs2TGVvY1FSczB6SFp5M3dpRCtKSEN6cUxoUzY5?= =?utf-8?B?SVpBZk8rMW5STmVsdGE1dkNtMzc3azYzQnhSaHYwK0c4NHpMblMvWlB1c3dW?= =?utf-8?B?Q29pNkdHcE9OQlR2SmZXZ3VXcGd0c3k1ZGRQSGFVdkJkdEhDaWRtUW0rSkxC?= =?utf-8?B?MWNUYnlSaHpYQ3BXRHJCV2c0UjAzMUNUNEZwcE1yRk1IbFprSE9IYjFycUpX?= =?utf-8?Q?E2pDjZnHOAzBFiPKsvsaaE/3K?= Content-ID: MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SJ2PR11MB7648.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7b7c7113-99c8-4f8a-4e8d-08db6ca6685f X-MS-Exchange-CrossTenant-originalarrivaltime: 14 Jun 2023 07:10:17.3915 (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: vAOL9XLWQ8MQEn/+xcqMRpWaWguz6frRmUSgHUtjZcFLQx3dyH5+dWq4+6PigIS1vda2UJiHZUOpYtZDe3N/Okiina/dvHcxxqjFvQ8kqjs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN0PR11MB6159 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230614_001040_255392_2431759F X-CRM114-Status: GOOD ( 21.73 ) 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 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. > + > + 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 = { _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel