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 X-Spam-Level: X-Spam-Status: No, score=-15.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B1C65C433ED for ; Thu, 8 Apr 2021 19:31:32 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1273D608FC for ; Thu, 8 Apr 2021 19:31:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1273D608FC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=i2se.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:Cc:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=M1yT5nR0eSALS3BRVBUs5zatBx9+vER9jUYAnNn9OW4=; b=JfWRVc7AKMGY7bBN2OhKc0E2b LEfyH8WCh6443TVVlZ/mXIAugyjkUpxiZOcSFUDpnp3qn1JEdz+lwWFaL6N+kE7wrB3eoJHW5wr+I P7QCMzZrWgZ0kgE7dWMMp8v4Tofdw3kOwhNuAWx8Fj5zTMgciUMmwsZwh0U7sKedr5wqQNNLLN7BJ wBxHCiRE+S2DMzowuaQw1sv9PzUGyYiMByw26+t8ys9unsqp0ssSoOE9xuCIw7z12ZP7fzLZ+9x5r bfktTMECQFdeQdUwwlXiHTgtSqRTnMensde1hu0tSc+Bs/s+cFZSN6CYAsb+b18ekn6kJHZdi8wVc GVC015Dyg==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lUaLC-0096QC-5E; Thu, 08 Apr 2021 19:29:22 +0000 Received: from mout.kundenserver.de ([212.227.126.134]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lUaL5-0096PH-I6; Thu, 08 Apr 2021 19:29:18 +0000 Received: from [192.168.1.107] ([37.4.249.89]) by mrelayeu.kundenserver.de (mreue009 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MxUfh-1lo9Oc0tWz-00xvyc; Thu, 08 Apr 2021 21:29:07 +0200 Subject: Re: [RFC PATCH] drivers: Raspbery Pi Sense Hat To: Joel Savitz , linux-rpi-kernel@lists.infradead.org Cc: Joel Savitz , Nicolas Saenz Julienne , bcm-kernel-feedback-list@broadcom.com, linux-arm-kernel@lists.infradead.org, fedora-rpi@googlegroups.com, serge@raspberrypi.org References: <20210408000353.3571132-1-jsavitz@redhat.com> From: Stefan Wahren Autocrypt: addr=stefan.wahren@i2se.com; keydata= LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdudVBHIHYy CgptUUlOQkZ0NmdCTUJFQUN1Yi9wQmV2SHhidkplZnlaRzMySklObW4yYnNFUFgyNVY2ZmVq bXlZd21DR0tqRnRMCi9Eb1VNRVZIRHhDSjQ3Qk1YbzM0NGZIVjFDM0FudWRnTjFCZWhMb0J0 TEh4bW5lQ3pnSDNLY1B0V1c3cHRqNEcKdEp2OUNRRFp5MjdTS29FUHh5YUk4Q0YweWdSeEpj NzJNOUk5d21zUFo1YlVIc0x1WVdNcVE3SmNSbVBzNkQ4ZwpCa2srOC95bmdFeU5FeHd4SnBS MXlsajVianhXREh5WVF2dUo1THpaS3VPOUxCM2xYVnNjNGJxWEVqYzZWRnVaCkZDQ2svc3lp by9ZaHNlOE4rUXN4N01RYWd6NHdLVWtRUWJmWGcxVnFrVG5BaXZYczQyVm5Ja211NWd6SXcv MHQKUkp2NTBGUmhIaHhweUtBSThCOG5oTjhRdng3TVZrUGM1dkRmZDN1R1lXNDdKUGhWUUJj VXdKd05rLzQ5RjllQQp2ZzJtdE1QRm5GT1JrV1VSdlArRzZGSmZtNitDdk92N1lmUDF1ZXdB aTRsbitKTzFnK2dqVklXbC9XSnB5MG5UCmlwZGZlSDlkSGtnU2lmUXVuWWN1Y2lzTXlvUmJG OTU1dENna0VZOUVNRWRZMXQ4aUdEaUNnWDZzNTBMSGJpM2sKNDUzdWFjcHhmUVhTYUF3UGtz bDhNa0NPc3YyZUVyNElOQ0hZUUR5WmljbEJ1dUNnOEVOYlI2QUdWdFpTUGNRYgplbnpTektS Wm9POUNhcUlEK2ZhdkxpQi9kaHptSEErOWJnSWhtWGZ2WFJMRFp6ZThwbzFkeXQzRTFzaFhp ZGRaClBBOE51SlZ6RUl0MmxtSTZWOHBaRHBuMjIxcmZLaml2UlFpYW9zNTRUZ1pqak1ZSTdu bko3ZTZ4endBUkFRQUIKdENCVGRHVm1ZVzRnVjJGb2NtVnVJRHgzWVdoeVpXNXpkRUJuYlhn dWJtVjBQb2tDTndRVEFRZ0FJUVVDWElkYwo0Z0liQXdVTENRZ0hBZ1lWQ0FrS0N3SUVGZ0lE QVFJZUFRSVhnQUFLQ1JDVWdld1BFWkR5MjFPVEQvOUdpWkxkCnRSWWNteVJKZ2x0aVFRekFp UWRjSUQ3OGxHb1dwL3grci92Y1U2YjZqdVl1ZVR3Z1Iwclc3djdsMklSQnlEN24KSEp4YSt0 SVNvUVpCZ2hvbE1JZmI5TXRoR09KTENZNzdrL1FoQWhuMzJOR1prZWp3OXR6a3MvNDBtclpT VVQ4NApaeWJzUVhyTE0vSFI2VElJL0RlUEIwbktEM0ppcHBzMlVIUUQ5cUQySWpFd1NRUGxI akNPckVaaDQ1UFo3bTkrClo5M0x6aVRlc1dabFlRdUxpSndzNHJLcHRIVzFkL3dSZWxzaG1t NlFxY0wybDRDL2U0MGVEQjlncTRkU1poOVgKUEVZbGxpeU5RaDdhMkxTZHVtRTFyK2NTd0lq RS91ZHRSdmRPOWFLb0psT2JVSzVkTmpTUEg3d0tUYndkWGRZRApHUHdEaFhkNThOQXdyK1BY QmxQajB0STFMQ3ErTEJ4ZUt6aFdYK0dWcTlEb2pWanlVREV4Rk5Ga1h1b0M3ZzhtClY5VDB0 ZUJpdVpSbm91WEt3VjJGcHRaT0hIN0JVRVd0a0t0aGgxZXRmT1dwaWdCemtVN2JQc2ZJWVQr cnk5dGIKMW9KK3Y0MVBOYXFaRW1QVXBKeHZmek5UN3Ayd01lRDdaajlmMHJ1YlJQdExBSjJR R2pyRkhzdVh3QU9xcHl6ZQoxOEVidHNZazBOMHp1SEVoY2orUEJJQmZoMFlJWWQ1MW9mNkdJ aU95UjlxMFhYdHBsVUo3VDIvSDF1UXFrWGxwCitnVzRWa2lmc2NJckl1eWZueFpXMTJlSXZq NnlicVdMN2FZS0dZbVQ2aUxDUGJIWXlZY2F5bDRFa0ZjckNGN0UKZTBXVC9zY1ZNaE8vNVgv SGFOQTVIQngvcjUycGdMY3Y0aTlNeExRbVUzUmxabUZ1SUZkaGFISmxiaUE4YzNSbApabUZ1 TG5kaGFISmxia0JwTW5ObExtTnZiVDZKQWpnRUV3RUNBQ0lGQWx0NmdCTUNHd01HQ3drSUJ3 TUNCaFVJCkFna0tDd1FXQWdNQkFoNEJBaGVBQUFvSkVKU0I3QThSa1BMYmpic1AvamdqYVNz NUh0bGtBSXZXUytGcm15N2MKaG5jT0F4TFRWL0Q2UkV3SU95R0poRkt3d29pck55UTJnOXZV YTNZQ1lDZjFmSjh3RWhhS09COWQwTHBNUm5MNApkRVQ4ZDgyMzhFL3BLK0hxTktpSXNKaHM2 SnNLOFpnalZRR3JtbWZua0dyWisxdjBIQnV4ZGljZ0duUC9XdHVBClVsOGw2Mi9BTGJheXlq KzYxQ2xyc0V0UklhcU82N0xJWXdQaVBEUkkrWGlNek5pR3pIRi8xUTZHUjAyUkg2YTMKRjg5 ejhhUHhjSGkxWnZDdDJ5a3o2VUVjaHpQMHI1Z3FGSisvTC9VcHU4ME1YaVk0djVlSWFCNTJn VlBnaXlNQQpsTDJkRHMxbUladm5yUkxSWTJ0YjNtQVlOa1Y1QjVJRFQzcGtXeTZrS281T0Nn SytZZFlPUjhGTloyb04ydDhPCnJLK1ZudGFLN01NU0tIbG1ZL3NPd3RSbEVoMU9CbXJjQ3dH d21wLzA1R2tSNDZmL0lzaFJWZUZPUmF3K0dBcXQKUDIrQ0ZhMkNOQS9JSG5aTm95aWtsRHpQ UUhVVUdzck5wcERyaFg5Sm1oQm1nMXYyeXdIMU5YdTFpRGZQMUJBdwpLZ29rdDVmNVVhUkY5 c0FBNTN2V0V2YlVVTjllZXNGR0x6UFdkSkdRNWhwZC9WSDVJUXk5U0JyaC93SWNla3E1Cm4w a042cGJUSHhHRTUyU2kvTVZJa05UdURaM2FwbjJqbERaNHBPdHBCWEkydlAzYlBPK05pcUJa anNVM3R4TGkKV2R2MkZqeXp6NlhMUndlV1JZVkw1SGE2TER0eG9yMnZ1NlVQMDdwOXh6MXhS WmFPRFczb1lsSEZ6WXBhNFc1ZwpMSGIybEVrSXVVZlNjaWNHYmpqQXRDbFRkR1ZtWVc0Z1Yy Rm9jbVZ1SUR4emRHVm1ZVzR1ZDJGb2NtVnVRR2x1CkxYUmxZMmd1WTI5dFBva0NOd1FUQVFn QUlRVUNYSWRlaHdJYkF3VUxDUWdIQWdZVkNBa0tDd0lFRmdJREFRSWUKQVFJWGdBQUtDUkNV Z2V3UEVaRHkyeUhURC85VUY3UWxEa0d4elE3QWFDSTZOOTVpUWY4LzFvU1VhRE51Mlk2SQpL K0R6UXBiMVRiVE9yM1ZKd3dZOGEzT1d6NU5MU09MTVdlVnh0K29zTW1sUUlHdWJEM09EWko4 aXpQbEcvSnJOCnQ1elNkbU41SUE1ZjNlc1dXUVZLdmdoWkFnVERxZHB2K1pIVzJFbXhuQUox dUxGWFhlUWQzVVpjQzVyMy9nL3YKU2FNbzl4ZWszSjVtTnVEbTcxbEVXc0FzL0JBY0ZjK3lu TGh4d0JXQld3c3Z3UjhiSHRKNURPTVd2YUt1RHNrcApJR0ZVZS9LYjJCK2pyYXZRM1RuNnMv SHFKTTBjZXhTSHo1cGUrMHNHdlArdDlKNzIzNEJGUXdlRkV4cmlleThVCkl4T3I0WEFiYWFi U3J5WW5VL3pWSDlVMWkyQUlRWk1XSkFldkN2VmdRL1UrTmVSaFh1ZGU5WVVtRE1EbzJzQjIK VkFGRUFxaUYyUVVIUEEybThhN0VPM3lmTDRyTWswaUh6TElLdmg2L3JIOFFDWThpM1h4VE5M OWlDTHpCV3UvTgpPbkNBYlMremx2TFphaVNNaDVFZnV4VHR2NFBsVmRFamY2MlArWkhJRDE2 Z1VEd0VtYXpMQU1yeDY2NmpINWt1ClVDVFZ5bWJMMFR2Qis2TDZBUmw4QU55TTRBRG1rV2tw eU0yMmtDdUlTWUFFZlFSM3VXWFo5WWd4YVBNcWJWK3cKQnJoSmc0SGFONkM2eFRxR3YzcjRC MmFxYjc3L0NWb1JKMVo5Y3BIQ3dpT3pJYUFtdnl6UFU2TXhDRFhaOEZnWQpsVDR2MjNHNWlt SlAyemdYNXMrRjZBQ1VKOVVRUEQwdVRmK0o5RGEycitza2gvc1dPbloreWNvSE5CUXZvY1pF Ck5BSFFmN2tDRFFSYmVvQVRBUkFBMkhkMGZzRFZLNzJSTFNESGJ5ME9oZ0RjRGxWQk0yTSto WVlwTzNmWDFyKysKc2hpcVBLQ0hWQXNRNWJ4ZTdIbUppbUhhNEtLWXMya3YvbWx0L0NhdUNK Ly9wbWN5Y0JNN0d2d25Lem11WHp1QQpHbVZUWkM2V1I1TGtha0ZydEhPelZtc0VHcE52NVJj OWw2SFlGcExrYlNrVmk1U1BRWkp5K0VNZ01DRmdqclpmClZGNnlvdHdFMWFmN0hOdE1oTlBh TEROMW9VS0Y1aitSeVJnNWl3SnVDRGtuSGp3QlFWNHBndzIvNXZTOEE3WlEKdjJNYlcvVExF eXBLWGlmNzhJaGdBelh0RTJYck0xbi9vNlpINzFvUkZGS096NDJsRmR6ZHJTWDBZc3FYZ0hD WAo1Z0l0TGZxemoxcHNNYTlvMWVpTlRFbTFkVlFyVHFueXMwbDE4b2FsUk5zd1lsUW1uWUJ3 cHdDa2FUSExNSHdLCmZHQmJvNWRMUEVzaHRWb3dJNm5zZ3FMVHlRSG1xSFlxVVpZSXBpZ21t QzNTd0JXWTFWNmZmVUVta3FwQUFDRW4KTDQvZ1Vnbjd5US81ZDBzZXFuQXEycFNCSE1VVW9D Y1R6RVFVV1ZraUR2M1JrN2hURm1oVHNNcTc4eHYyWFJzWApNUjZ5UWhTVFBGWkNZRFVFeEVs RXNTbzlGV0hXcjZ6SHlZY2M4cURMRnZHOUZQaG1RdVQyczlCbHg2Z0kzMjNHCm5FcTFsd1dQ SlZ6UDRqUWtKS0lBWHdGcHYrVzhDV0xxekRXT3ZkbHJEYVRhVk1zY0ZUZUg1VzZVcHJsNjVq cUYKUUdNcGNSR0NzOEdDVVcxM0gwSXlPdFF0d1dYQTRueStTTDgxcHZpQW1hU1hVOGxhS2FS dTkxVk9WYUY5ZjRzQQpFUUVBQVlrQ0h3UVlBUUlBQ1FVQ1czcUFFd0liREFBS0NSQ1VnZXdQ RVpEeTIrb1hELzljSEhSa0JaT2ZrbVNxCjE0U3Z4MDYyUHRVMEtWNDcwVFNucC9qV29ZSm5L SXczRzBtWElSZ3J0SDJkUHdwSWdWanNZeVJTVk1LbVNwdDUKWnJEZjlOdFRiTldnazhWb0xl WnpZRW8rSjNvUHFGclRNczNhWVl2N2U0K0pLNjk1WW5tUSttT0Q5bmlhOTE1dApyNUFaajk1 VWZTVGx5VW15aWMxZDhvdnNmMWZQN1hDVVZSRmNSamZOZkRGMW9ML3BEZ01QNUdaMk93YVRl am15CkN1SGpNOElSMUNpYXZCcFlEbUJuVFlrN1B0aHk2YXRXdllsMGZ5L0NxYWpUS3N4Nytw OXh6aXU4WmZWWCtpS0IKQ2MrSGUrRURFZEdJRGh2TlovSVFIZk9CMlBVWFdHUytzOUZOVHhy L0E2bkxHWG5BOVk2dzkzaVBkWUl3eFM3SwpYTG9LSmVlMTBEamx6c1lzUmZsRk9XMFpPaVNp aElDWGlRVjF1cU02dHpGRzlndFJjaXVzNVVBdGhXYU8xT3dVClNDUW1mQ09tNGZ2TUlKSUE5 cnh0b1M2T3FSUWNpRjNjcm1vMHJKQ3ROMmF3WmZnaThYRWlmN2Q2aGp2MEVLTTkKWFpvaUFa WVpEKy9pTG01VGFLV042b0dJdGkwVmpKdjhaWk9aT2ZDYjZ2cUZJa0pXK2FPdTRvclRMRk16 MjhhbwpVM1F5V3BOQzhGRm1kWXNWdWE4czZnTjFOSWE2eTNxYS9aQjhiQS9pa3k1OUFFejRp RElScmdVek1FZzhBazdUCmZtMUtpWWVpVHRCRENvMjVCdlhqYnFzeXhrUUQxbmtSbTZGQVZ6 RXVPUEllOEp1cVcyeEQ5aXhHWXZqVTVoa1IKZ0pwM2dQNWIrY25HM0xQcXF1UTJFNmdvS1VN TEFia0NEUVJiZmw5REFSQUFzRExjYStMbFAydm5mdEVHaHBjQQpCR1ZOUUVGbkdQckNhdVU2 SGhOODA1V3RQVHRtc1JPdUp6cWdVVDBtcHFXSWZacTZzTXd5dkhLOVRzL0tIM0paClVWYlJD M3oyaDNLZmhIL0RhZjk1cGQ2bVBjL2g5dkYvT3kzK2VUV2hnR25QNmNBNWtsUitmTzFXaEc4 VnJpWHYKck5lUkcyMHN6emplSG9jblNJY1Q1WHVaUjB1REhPaUd4T2l6MXNNUkZUR3h6R095 MTlSOXJ2dTYzdGlJM2Q3dgpnYzc1T0NBZGtlQi9TZUNFbGFSdzBUZjdMWmJQampzRjI2M0JZ bk1mNGtrTkVLdnFXY1UyaWNNcCtxZXpqeW5CCnB2ZXVlMHJDVFFCWUFRbG9GQ1ZUR0hyV1dB NkQ0VzVPMkFmSWRJYzF1MUpDWnAyZjVMV1ZvVUZUVklyUW5RUVUKU0hDaWZyOU1aeExUdFBK ZFU1Mm9TUHczZGs0aExQOGlKSUx1dnYvYXZhakNzUVlIRXR3WXNiZUZaeGl1TGdscApBN1lj Sk5ObXBnQ3BNRDR3VWh2bEN0QUtOQlFXeXIyOTc2OThFUVRuNDZlQmVVNkttMkNpaFhrZ3dD eWY4ZXlLCkxFM3NYZXdhcTVrZ1pXdk5xNml1NXFZSVJCOXl3K2NYYzYwZE9aRE9scTkzWDVT QVJZemFvZXBrSHo0cmtMa1AKUG8rdENIeUhRUHNHblBYYzlXVDgwREM5Tm5KR2R2VWx5NXJk TUk0eHBaeWdlb2tqd293VlFsUFV1Y1M2TXluNwpmOHc4Y2dmQjdDMklBSWNEeDJwUC9IendY dmtDT1FOQTdtVjFsTTA4bitnVmtUcnpweGlwNURicTRDSW9ZeDJNCkpaVDhiR1JINlhqY1VE S2EwOVFoeVpzQUVRRUFBWWtFUkFRWUFRZ0FEd1VDVzM1ZlF3SWJBZ1VKQThKbkFBSXAKQ1JD VWdld1BFWkR5MjhGZElBUVpBUWdBQmdVQ1czNWZRd0FLQ1JCVnhETFBjVk1NamNkc0QvMFJo QXN1UVlPeQpyMTNCbDNOaFhrWUFaR3AyWkZER3VrZTdPU2tWOG9qT09UZFR5ei9jT1JHQ2J5 ZEQrRGd2cUZ5VmRuT1hLZ08wCmxKbUd3ckdlTGRnZ0F2aDBpaHJwNU8wWVVKOWJCU1htR01t UVRZSC9BbUxUR2FkYnVqQ1dqNWZGVWtDeXd4aW0KSHV5MFBiMjRwelR2UzUwR1k1WStxSDBG SE5haWdka2tpV04zcnVnN0haRXUvQ3lsUFpqT1h6K0QxUVBNckV4dwo3ZC9NS2FiVis5YU5i UVlabGRJajk4UXd2VUYxS1N6YThqbFVJdnBoUnEyN0FUOGZER1lHUGZERU1nMmNCT2FlCkty N29uUXM0YjdhV082aWZEbHhRVHB6c3pvK0FuODA3Tk1TdFZFRmYrczNBaFZEM2U3bmY4SkJh dmJWckFlMGsKb20yNm96elBubnh6K2xxVlZ0dzZVazRYTUl6dGl4L0h3SFl3dUNuY1VYWndL MEkzeUFKd2pZd29vck9DaEozUwpFVWJKUVB0R3NneFJERXhWQkZlNk5MUC82MnhQOU82dGFj d09kYjBNbVAxYjM5cFJBVEM3YmdkMWxkVUxpNzVaCmxKckowL1NpVkVyb3FOWXk3OXRmbWdB WjJVeFptczlTckV5Nm85UVNmc24xYVh2K01QTDlKYUNHbWtQNnpiTFEKTm5kajBKY2FRbmtD MHZneWRPMUJtNk11OTZQOXVmbEtaY0FTNndtTE01SWRIT3lqTDg4d0h3anVjakFPQnRjdwpw MG9HVG5WT25Sc05ZU084VzhZWi9LZGJ1Nzg1ZGF6TXFKMmlOakFEdUJiZG02TjRqNUVkTW5r TG4wQklmUEpwCmRnbTR2bDJVcExqd1JHci9NM3dtbTVwdnMrNnVCN2hrL0ZKaUQvNGxsRU5Q NGVNMWg3U200aitWcTZOMSt6VEIKSVhKQWViSXFhc0RwNXlaUzdYcnk0STM2bjg1WEVZZkcw MWx0QXlob05WMkRPOFNJUlFwdWkydHErOVJQM1JLMQpKREJ4eEVKWTJFTzVKWjhNeGFQSFEw RFQwNWxSRmpLMkFsaGRFSXRqTGpwSjNmVW05c3FMeE1XeHpQNlV6M2lpCjJ1YTR1bnJ0Nk9D VHFRd2lqRi8zYlRXaXd2VkFBSG5NRlVpb1hzaEhhb2hWRGNWZm5lSU1mVjBiUUNYWWkzTnAK WTB2MFp3Y2lGSCtnU0M3cUQ2WE51aHBWR1NMNElpbGlGeS9TemNhSkV6QUhlTERTaFpQMkNX ZG5DNHZnbDM3dApocHg4aDU1WWhKbjZIU3VVelBnaGFLdFZCMmsrajdaZXlaK1NGeHA3SXVi SEN3TEhsUWhUNzVSd1EzaUF4S242CjBxajUxY1lUbnF4ZFpYVzZmSDNQa3VNellVNUdwcVIv MU9sNWMvd2ZJNmc2QW04eUtXLzBFVUx0K0tuNExGc1MKbTdZM201SDV2MTJVNkpCWXZWK3Ix M2paaW9zNEVFREU5M0Q1c05IMk1JeVJ6Q0RxMXpkZHQ0WHV5S0ZqUEtXMQo5aWJaRGZGVjdL dUNzdnVMMjNzQmMxc0NNb3ArRTFtVC9ReE9JQTZvRFQxTVFzdHdPVnVReURDdi9PdktTZ2Z6 CjhGWEdMNkFQY2xqQ3FqOEFKaHhReXN4ZG9pUVA4bS92dStialdHR3Z4dzVzMWxncGlSRFRS VVBnY0pKTmFHWTIKVklEclpRaTROU2lOUTBOSWkrZGp1NGZOTW1DcFFxZzh0YkMzY0FhNnl3 bTZvUUIxU0JobURYMmUxMWdSbGx1SQpPblRHUEUwSFRvM2w3MmxoYmc9PQo9cVpNVgotLS0t LUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCg== Message-ID: Date: Thu, 8 Apr 2021 21:29:06 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20210408000353.3571132-1-jsavitz@redhat.com> Content-Language: en-US X-Provags-ID: V03:K1:wGiMY/w8PCNvwKKVEXaahEgl405lZq89U0zUdMpAuIF55BqdUsF XFU1+h06MNCtSfgLSbs2Ukx7wka3Zw0mIwQKyk/2tmkwQaFwgaR5jeG+hq7D0zy27mgBfO/ IBdnOtaOn/A0XbXlwy5PvABR1EMzFX1NS/X8rqKa8tK9ScN7RMTCWYnK8PydDQyobKYDOWQ Y79rRFxhr6Apmq3Qwh/Vw== X-UI-Out-Filterresults: notjunk:1;V03:K0:+nkgGsfdXos=:mq1daINukbd9DtyRASSppg 1suBAOeabLjeG4fCcjqWHnFaGK3BBFwAbLwJbx4WhT8XMZaBiPLvdMofY0QEeJBdnLucNlK4L 87vee0NIav/7DaUmc1QiG6DTDxYqwmvkSbqqAr/8v92eY/lFFxcUuO1qQ2OFUiJ6415NKINIO r6CBHNYKOCiVXxFL1DIH/+2wbUd0GA/jUDryjvKZwArDuDpC0D0TMpFp6P6wc016NcO+cBJqP ffZtUpaNh2pZc+kAQvsenw62TSEyF7FtA62pwOyWQxIMV1MMcvomFg8FR0+g5S8FSgXBSvIWn NPK3qVEO5wnLCF71rTCqILozMJlKxJW2ynLYDyMJ3JHTwUW3bwMbN17zNxi7pYdtrQZZfM+m6 RmUMc76girR2Kko+722YcfksrKDF2fKkyNXJC01I83Bu28bfy5YnUIluGA2xw7c76yJxkHwAN TgSiig8GuhbgXaHEG1oPFqhDHiNrPcjP1g8aQWHjAO5uR9v1oIpZ X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210408_202915_796293_FB69EB64 X-CRM114-Status: GOOD ( 29.86 ) 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 Hi Joel, Am 08.04.21 um 02:03 schrieb Joel Savitz: > From: Joel Savitz > > This is a forward port of the Rapsberry Pi Sense Hat driver from the > downstream Raspberry Pi kernel tree. > > I have slightly consolidated things and done some quick testing of this > driver on Fedora (which comes with the device tree blobs), and I want to > do a bit more testing before submiting the driver for inclusion in > mainline Linux. at first some general comments: - keep in mind that the drivers shouldn't make any assumption of the target platform - always run scripts/checkpatch.pl before submission > > I would like to get some feedback from the community on what may need to > be improved, fixed, or changed as early as possible, so this is a request > for comments. > > Signed-off-by: Joel Savitz > --- > drivers/input/joystick/Kconfig | 8 + > drivers/input/joystick/Makefile | 1 + > drivers/input/joystick/rpisense-js.c | 147 ++++++++++++++ > drivers/mfd/Kconfig | 8 + > drivers/mfd/Makefile | 1 + > drivers/mfd/rpisense-core.c | 162 +++++++++++++++ > drivers/video/fbdev/Kconfig | 13 ++ > drivers/video/fbdev/Makefile | 1 + > drivers/video/fbdev/rpisense-fb.c | 291 +++++++++++++++++++++++++++ > include/linux/mfd/rpisense.h | 66 ++++++ > 10 files changed, 698 insertions(+) > create mode 100644 drivers/input/joystick/rpisense-js.c > create mode 100644 drivers/mfd/rpisense-core.c > create mode 100644 drivers/video/fbdev/rpisense-fb.c > create mode 100644 include/linux/mfd/rpisense.h > > diff --git a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig > index 5e38899058c1..1c0025c22bf4 100644 > --- a/drivers/input/joystick/Kconfig > +++ b/drivers/input/joystick/Kconfig > @@ -389,4 +389,12 @@ config JOYSTICK_N64 > Say Y here if you want enable support for the four > built-in controller ports on the Nintendo 64 console. > > +config JOYSTICK_RPISENSE > + tristate "Raspberry Pi Sense HAT joystick" > + depends on GPIOLIB && INPUT > + select MFD_RPISENSE_CORE > + > + help > + This is the joystick driver for the Raspberry Pi Sense HAT > + > endif > diff --git a/drivers/input/joystick/Makefile b/drivers/input/joystick/Makefile > index 31d720c9e493..b227e98cd179 100644 > --- a/drivers/input/joystick/Makefile > +++ b/drivers/input/joystick/Makefile > @@ -27,6 +27,7 @@ obj-$(CONFIG_JOYSTICK_MAPLE) += maplecontrol.o > obj-$(CONFIG_JOYSTICK_N64) += n64joy.o > obj-$(CONFIG_JOYSTICK_PSXPAD_SPI) += psxpad-spi.o > obj-$(CONFIG_JOYSTICK_PXRC) += pxrc.o > +obj-$(CONFIG_JOYSTICK_RPISENSE) += rpisense-js.o > obj-$(CONFIG_JOYSTICK_SIDEWINDER) += sidewinder.o > obj-$(CONFIG_JOYSTICK_SPACEBALL) += spaceball.o > obj-$(CONFIG_JOYSTICK_SPACEORB) += spaceorb.o > diff --git a/drivers/input/joystick/rpisense-js.c b/drivers/input/joystick/rpisense-js.c > new file mode 100644 > index 000000000000..41d4bd1fed46 > --- /dev/null > +++ b/drivers/input/joystick/rpisense-js.c > @@ -0,0 +1,147 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Raspberry Pi Sense HAT joystick driver > + * http://raspberrypi.org > + * > + * Copyright (C) 2015 Raspberry Pi > + * > + * Author: Serge Schneider > + * Adapted for mainline Linux by: Joel Savitz > + */ > + > +#include > +#include > + > +static struct rpisense *rpisense; please try to avoid such limitation. It's preferred to allow multiple instances of input drivers. > +static unsigned char keymap[5] = {KEY_DOWN, KEY_RIGHT, KEY_UP, KEY_ENTER, KEY_LEFT,}; please try to avoid magic numbers > + > +static void keys_work_fn(struct work_struct *work) > +{ > + int i; > + static s32 prev_keys; > + struct rpisense_js *rpisense_js = &rpisense->joystick; > + s32 keys = rpisense_reg_read(rpisense, RPISENSE_KEYS); > + s32 changes = keys ^ prev_keys; > + > + prev_keys = keys; > + for (i = 0; i < 5; i++) { > + if (changes & 1) { > + input_report_key(rpisense_js->keys_dev, > + keymap[i], keys & 1); > + } > + changes >>= 1; > + keys >>= 1; > + } > + input_sync(rpisense_js->keys_dev); > +} > + > +static irqreturn_t keys_irq_handler(int irq, void *pdev) > +{ > + struct rpisense_js *rpisense_js = &rpisense->joystick; > + > + schedule_work(&rpisense_js->keys_work_s); > + return IRQ_HANDLED; > +} > + > +static int rpisense_js_probe(struct platform_device *pdev) > +{ > + int ret; > + int i; > + struct rpisense_js *rpisense_js; > + > + rpisense = rpisense_get_dev(); > + rpisense_js = &rpisense->joystick; > + > + INIT_WORK(&rpisense_js->keys_work_s, keys_work_fn); > + > + rpisense_js->keys_dev = input_allocate_device(); > + if (!rpisense_js->keys_dev) { > + dev_err(&pdev->dev, "Could not allocate input device.\n"); > + return -ENOMEM; > + } > + > + rpisense_js->keys_dev->evbit[0] = BIT_MASK(EV_KEY); > + for (i = 0; i < ARRAY_SIZE(keymap); i++) { > + set_bit(keymap[i], > + rpisense_js->keys_dev->keybit); > + } > + > + rpisense_js->keys_dev->name = "Raspberry Pi Sense HAT Joystick"; > + rpisense_js->keys_dev->phys = "rpi-sense-joy/input0"; > + rpisense_js->keys_dev->id.bustype = BUS_I2C; > + rpisense_js->keys_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); > + rpisense_js->keys_dev->keycode = keymap; > + rpisense_js->keys_dev->keycodesize = sizeof(unsigned char); > + rpisense_js->keys_dev->keycodemax = ARRAY_SIZE(keymap); > + > + ret = input_register_device(rpisense_js->keys_dev); > + if (ret) { > + dev_err(&pdev->dev, "Could not register input device.\n"); > + goto err_keys_alloc; > + } > + > + ret = gpiod_direction_input(rpisense_js->keys_desc); > + if (ret) { > + dev_err(&pdev->dev, "Could not set keys-int direction.\n"); > + goto err_keys_reg; > + } > + > + rpisense_js->keys_irq = gpiod_to_irq(rpisense_js->keys_desc); > + if (rpisense_js->keys_irq < 0) { > + dev_err(&pdev->dev, "Could not determine keys-int IRQ.\n"); > + ret = rpisense_js->keys_irq; > + goto err_keys_reg; > + } > + > + ret = devm_request_irq(&pdev->dev, rpisense_js->keys_irq, > + keys_irq_handler, IRQF_TRIGGER_RISING, > + "keys", &pdev->dev); > + if (ret) { > + dev_err(&pdev->dev, "IRQ request failed.\n"); > + goto err_keys_reg; > + } > + return 0; > +err_keys_reg: > + input_unregister_device(rpisense_js->keys_dev); > +err_keys_alloc: > + input_free_device(rpisense_js->keys_dev); > + return ret; > +} > + > +static int rpisense_js_remove(struct platform_device *pdev) > +{ > + struct rpisense_js *rpisense_js = &rpisense->joystick; > + > + input_unregister_device(rpisense_js->keys_dev); > + input_free_device(rpisense_js->keys_dev); > + return 0; > +} > + > +#ifdef CONFIG_OF > +static const struct of_device_id rpisense_js_id[] = { > + { .compatible = "raspberrypi,rpi-sense-js" }, > + { }, > +}; > +MODULE_DEVICE_TABLE(of, rpisense_js_id); > +#endif > + > +static struct platform_device_id rpisense_js_device_id[] = { > + { .name = "rpi-sense-js" }, > + { }, > +}; > +MODULE_DEVICE_TABLE(platform, rpisense_js_device_id); > + > +static struct platform_driver rpisense_js_driver = { > + .probe = rpisense_js_probe, > + .remove = rpisense_js_remove, > + .driver = { > + .name = "rpi-sense-js", > + .owner = THIS_MODULE, please drop this line > + }, > +}; > + > +module_platform_driver(rpisense_js_driver); > + > +MODULE_DESCRIPTION("Raspberry Pi Sense HAT joystick driver"); > +MODULE_AUTHOR("Serge Schneider "); > +MODULE_LICENSE("GPL"); > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index b74efa469e90..8c309e389359 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -11,6 +11,14 @@ config MFD_CORE > select IRQ_DOMAIN > default n > > +config MFD_RPISENSE_CORE > + tristate "Raspberry Pi Sense HAT core functions" > + depends on I2C > + select MFD_CORE > + help > + This is the core driver for the Raspberry Pi Sense HAT. This provides > + the necessary functions to communicate with the hardware. > + > config MFD_CS5535 > tristate "AMD CS5535 and CS5536 southbridge core functions" > select MFD_CORE > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index 834f5463af28..7140a8fc36ee 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -263,6 +263,7 @@ obj-$(CONFIG_MFD_ROHM_BD71828) += rohm-bd71828.o > obj-$(CONFIG_MFD_ROHM_BD718XX) += rohm-bd718x7.o > obj-$(CONFIG_MFD_STMFX) += stmfx.o > obj-$(CONFIG_MFD_KHADAS_MCU) += khadas-mcu.o > +obj-$(CONFIG_MFD_RPISENSE_CORE) += rpisense-core.o > obj-$(CONFIG_MFD_ACER_A500_EC) += acer-ec-a500.o > > obj-$(CONFIG_SGI_MFD_IOC3) += ioc3.o > diff --git a/drivers/mfd/rpisense-core.c b/drivers/mfd/rpisense-core.c > new file mode 100644 > index 000000000000..aa2c394c5e67 > --- /dev/null > +++ b/drivers/mfd/rpisense-core.c > @@ -0,0 +1,162 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Raspberry Pi Sense HAT core driver > + * http://raspberrypi.org > + * > + * Copyright (C) 2015 Raspberry Pi > + * > + * Author: Serge Schneider > + * Adapted for mainline Linux by: Joel Savitz > + * > + * This driver is based on wm8350 implementation. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +static struct rpisense *rpisense; > + > +static void rpisense_client_dev_register(struct rpisense *rpisense, > + const char *name, > + struct platform_device **pdev) > +{ > + int ret; > + > + *pdev = platform_device_alloc(name, -1); > + if (*pdev == NULL) { > + dev_err(rpisense->dev, "Failed to allocate %s\n", name); > + return; > + } > + > + (*pdev)->dev.parent = rpisense->dev; > + platform_set_drvdata(*pdev, rpisense); > + ret = platform_device_add(*pdev); > + if (ret != 0) { > + dev_err(rpisense->dev, "Failed to register %s: %d\n", > + name, ret); > + platform_device_put(*pdev); > + *pdev = NULL; > + } > +} > + > +static int rpisense_probe(struct i2c_client *i2c, > + const struct i2c_device_id *id) > +{ > + int ret; > + struct rpisense_js *rpisense_js; > + > + rpisense = devm_kzalloc(&i2c->dev, sizeof(struct rpisense), GFP_KERNEL); > + if (rpisense == NULL) > + return -ENOMEM; > + > + i2c_set_clientdata(i2c, rpisense); > + rpisense->dev = &i2c->dev; > + rpisense->i2c_client = i2c; > + > + ret = rpisense_reg_read(rpisense, RPISENSE_WAI); > + if (ret > 0) { > + if (ret != 's') > + return -EINVAL; this would be a good place for a error message like "Unable to detect Raspberry Pi Sense HAT" > + } else { > + return ret; > + } > + ret = rpisense_reg_read(rpisense, RPISENSE_VER); > + if (ret < 0) > + return ret; > + > + dev_info(rpisense->dev, > + "Raspberry Pi Sense HAT firmware version %i\n", ret); > + > + rpisense_js = &rpisense->joystick; > + rpisense_js->keys_desc = devm_gpiod_get(&i2c->dev, > + "keys-int", GPIOD_IN); > + if (IS_ERR(rpisense_js->keys_desc)) { > + dev_warn(&i2c->dev, "Failed to get keys-int descriptor.\n"); > + rpisense_js->keys_desc = gpio_to_desc(23); Unfortunately we cannot keep this fallback, because it's platform dependent. > + if (rpisense_js->keys_desc == NULL) { > + dev_err(&i2c->dev, "GPIO23 fallback failed.\n"); > + return PTR_ERR(rpisense_js->keys_desc); > + } > + } > + rpisense_client_dev_register(rpisense, "rpi-sense-js", > + &(rpisense->joystick.pdev)); > + rpisense_client_dev_register(rpisense, "rpi-sense-fb", > + &(rpisense->framebuffer.pdev)); > + > + return 0; > +} > + > +static int rpisense_remove(struct i2c_client *i2c) > +{ > + struct rpisense *rpisense = i2c_get_clientdata(i2c); > + > + platform_device_unregister(rpisense->joystick.pdev); > + return 0; > +} > + > +struct rpisense *rpisense_get_dev(void) > +{ > + return rpisense; > +} > +EXPORT_SYMBOL_GPL(rpisense_get_dev); > + > +s32 rpisense_reg_read(struct rpisense *rpisense, int reg) > +{ > + int ret = i2c_smbus_read_byte_data(rpisense->i2c_client, reg); > + > + if (ret < 0) > + dev_err(rpisense->dev, "Read from reg %d failed\n", reg); > + /* Due to the BCM270x I2C clock stretching bug, some values In upstream BCM283x is the more common naming for the SoC > + * may have MSB set. Clear it to avoid incorrect values. > + */ > + return ret & 0x7F; > +} > +EXPORT_SYMBOL_GPL(rpisense_reg_read); > + > +int rpisense_block_write(struct rpisense *rpisense, const char *buf, int count) > +{ > + int ret = i2c_master_send(rpisense->i2c_client, buf, count); > + > + if (ret < 0) > + dev_err(rpisense->dev, "Block write failed\n"); > + return ret; > +} > +EXPORT_SYMBOL_GPL(rpisense_block_write); > + > +static const struct i2c_device_id rpisense_i2c_id[] = { > + { "rpi-sense", 0 }, > + { } > +}; > +MODULE_DEVICE_TABLE(i2c, rpisense_i2c_id); > + > +#ifdef CONFIG_OF > +static const struct of_device_id rpisense_core_id[] = { > + { .compatible = "raspberrypi,rpi-sense" }, > + { }, > +}; > +MODULE_DEVICE_TABLE(of, rpisense_core_id); > +#endif > + > + > +static struct i2c_driver rpisense_driver = { > + .driver = { > + .name = "rpi-sense", > + .owner = THIS_MODULE, please drop this line _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel