From patchwork Mon Oct 24 01:42:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Meng Yi X-Patchwork-Id: 685644 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-ua0-x23a.google.com (mail-ua0-x23a.google.com [IPv6:2607:f8b0:400c:c08::23a]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3t2K9F4TXDz9s65 for ; Mon, 24 Oct 2016 12:54:56 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.b=uu3Rp4t4; dkim-atps=neutral Received: by mail-ua0-x23a.google.com with SMTP id m11sf4539161uab.0 for ; Sun, 23 Oct 2016 18:54:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=sender:from:to:cc:subject:date:message-id:mime-version :spamdiagnosticoutput:spamdiagnosticmetadata:x-original-sender :x-original-authentication-results:reply-to:precedence:mailing-list :list-id:x-spam-checked-in-group:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=3qomUwjEbAuICPFUvPwfSmCtEnHMl+zqbyRsDC46LNQ=; b=uu3Rp4t4K91Wxh8IVCJ9DHbNmVt65cHeZqiSRM8ktwM8nV2Zf2/NPNiBfbnAPrryqp ivm191eBuFnEqT+YPQtXfzt7qVFQbxti5HA72KX3vkDorITckcz70PI+wkQRahwt2P1k GLqsBtU5I4wn2elFd82kzlpwGXceRnfo2SKlQ39SK2CgSxQuSVhWCjbr4Dyx+2c8wtcf 08H31CIC6jbQP9l7dHhVmE2e7dBDMrn9hl4GqjJ1sUCnWlLY71soJtIQNA+5EMO7SW4j GW0hZCocys5fCTaZe5N6fIXMCcCpr+tVPJf2Nd2d/mAVlQQLWjIAd0AQrVjxePYOCOkc gcww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=sender:x-gm-message-state:from:to:cc:subject:date:message-id :mime-version:spamdiagnosticoutput:spamdiagnosticmetadata :x-original-sender:x-original-authentication-results:reply-to :precedence:mailing-list:list-id:x-spam-checked-in-group:list-post :list-help:list-archive:list-subscribe:list-unsubscribe; bh=3qomUwjEbAuICPFUvPwfSmCtEnHMl+zqbyRsDC46LNQ=; b=AtD+bWzYKO13MFqTU/VPFX/NV9KKsqaIPUwfq2TpQc2jheKpz7CzW3ckKpKZaTw+He NSV/1xxiSqVbDOOza6MeNt9rt7FinM4wLuQ/77X4rWp+cNDu2EomtI6YXBtnZDPsNsN9 DlhbuNxOtTuJmYgDuNOUAQfZZlJSZTNlzxEfYbik0VK00Pip/P42kEeVqZ1pV6X/yW/d xulziu2owk6MWRiEizpF1HdMslNmRMEr6toCVPYkJLx2k4Vx+GwJUjWq97toDZonHJJn u9Utl0Oy80uqPyIldM7M2bthLe83ojBYSljfyyuCbrm0mma9oqPAB1Ly9HLeSR8+pDQj xQqA== Sender: rtc-linux@googlegroups.com X-Gm-Message-State: AA6/9RmyWoByWF/PkR55QuZiBZ/knWycFt5OGiuLyl8G6TiSqCXozafRBQnsToLmNLoFCg== X-Received: by 10.157.12.36 with SMTP id 33mr3344936otr.19.1477274095012; Sun, 23 Oct 2016 18:54:55 -0700 (PDT) X-BeenThere: rtc-linux@googlegroups.com Received: by 10.157.62.131 with SMTP id b3ls11312523otc.1.gmail; Sun, 23 Oct 2016 18:54:54 -0700 (PDT) X-Received: by 10.200.51.97 with SMTP id u30mr9538136qta.16.1477274094627; Sun, 23 Oct 2016 18:54:54 -0700 (PDT) Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0067.outbound.protection.outlook.com. [104.47.41.67]) by gmr-mx.google.com with ESMTPS id 7si2011585par.0.2016.10.23.18.54.54 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 23 Oct 2016 18:54:54 -0700 (PDT) Received-SPF: pass (google.com: domain of meng.yi@nxp.com designates 104.47.41.67 as permitted sender) client-ip=104.47.41.67; Received: from BN6PR03CA0022.namprd03.prod.outlook.com (10.168.230.160) by BY2PR0301MB1622.namprd03.prod.outlook.com (10.163.28.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.669.16; Mon, 24 Oct 2016 01:54:52 +0000 Received: from BN1BFFO11FD026.protection.gbl (2a01:111:f400:7c10::1:130) by BN6PR03CA0022.outlook.office365.com (2603:10b6:404:23::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.669.16 via Frontend Transport; Mon, 24 Oct 2016 01:54:51 +0000 Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BN1BFFO11FD026.mail.protection.outlook.com (10.58.144.89) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.669.7 via Frontend Transport; Mon, 24 Oct 2016 01:54:51 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id u9O1smxC016009; Sun, 23 Oct 2016 18:54:49 -0700 From: Meng Yi To: , CC: , , Meng Yi Subject: [rtc-linux] [RFC PATCH] rtc/nxp: add FTM alarm driver as the wakeup source Date: Mon, 24 Oct 2016 09:42:16 +0800 Message-ID: <1477273336-48449-1-git-send-email-meng.yi@nxp.com> X-Mailer: git-send-email 2.1.0.27.g96db324 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131217476920760414; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(50986999)(97736004)(626004)(2906002)(229853001)(47776003)(19580405001)(19580395003)(5660300001)(5001770100001)(50226002)(48376002)(7846002)(305945005)(104016004)(4326007)(8666005)(189998001)(5003940100001)(8936002)(356003)(92566002)(105606002)(87936001)(81166006)(81156014)(11100500001)(68736007)(106466001)(8676002)(6666003)(77096005)(36756003)(85426001)(586003)(50466002)(86362001)(33646002)(7059030)(2004002)(2101003); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR0301MB1622; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD026; 1:WN0AU9jUBxRRcu1mTHy9K8CuyVLR0MZjCkiMYKqoonLRQ5OQ27IWBt9xV4cfsnwP2q5+HtA/2cAEYpEKWvT9zC8C9e43mAEoq+5ugz3LD+APzmUW2uqKZmc9kLELpq98OgyyVbCRxZjdG/txXkzE1j764WSW+F2iysogTSYo00ThAzermm7NGK65f1HIxUTZyh8qRLJ+GouwKIxXm5wDtvVOmBRbAgBckonNOdnadiQ0vyHwdhFMbOR0us/6MnGQKbdIZScf17n4j9CQWNss68F4avwQ/QzROjFCp/U5B91J+E5XcoAC2w/w08iI1/04nSWCpFWVBBfPEvU/z6CGzFJ/PfxbOaeNM9ZGh9Hml6buhA4G+XGYPBSDoamE6ftPd6qU7488c0Y6VhxP9EJl910psJBsZ+wwfStIq6UBdbgPIoCk2fjNFdza9H2qLPfC8NM1GOdE9P/2BsD1mbuU4GjbLFIqz8hnqINHc0l8+2RtSAv0LaoWuHyzwiRQgTQAGlnBqKQiY5e8JZcUeeYBszMpu6ERrXDseUox1vJ8MVAmDR1dVeHE7yhyK/YBy04HsIpGydH3KEng7hiY5oFaJDZ50/PiHFpMfiiFjOoD3js6k8mUdZf6P+1gYefBWwm6Os0OJDmd74y2zYEtzQSfTiSHnG/CeiuhO9vN1XRVfA7cqtYLvlxlvOoboaG39CpIHwEogqOXu1OxyuCfqOsP2MYM7ZNBjZgL4L63FSiHQRQ= MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: b4481bdb-d6c5-42d4-585e-08d3fbb0bea6 X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB1622; 2:BcDW5wgWlYR3SK75x3ksnC9NiEmP+evx1yHl7a4Xzzwqzt6D/N7iX1lVRAlOEA/SpMzjHArt2J7UtDe6EgDX/ZZ2KGHW1c4CDra3OMYpa92edZL7xkyHFVLOH4NbMlcKxeHpy/+PUrZu6RSOImL7F/7ByPFp2Szafl2S8VJno6tsaho5GOws9esIR9+0tFntL6MrW8t2ihbrgIdgoiRO/w==; 3:0kPVxbm7DlNzLUOWwYr9X0fjYpKR/MnqnMrUvn8u9jbkJ5q26F7hBJWLn0fNrrb7gWdW/7WVKK2pVc+gXdjKiGGPLjy27thFNXNPqnI2h9wEkFoo3V3ctTFS6XmW+Q254zfdVaXwXMMzlqOwEEBvPaYuVY2fNPPDrqDNI+lhBK2KIm5QPxcWntKxKsd5qmFIc9fA+4xfDcVl1ClMdSFPazNS22gT5tvkJyfXwNncBicJY9lUHEOrsI+Ww9q6TcL8; 25:u/HNNn54wTi/fCEgq/bwIDjvMXNK31YYCVZGfaUBksAUcDK0xVbIo482yri0gQLuzfKeJFkQv/id1uPWQBOHnlP7gzeucHpgbPgSkRGfemHi6J/k1cn26bceX0QFo99OSV9GkWbKu0YgYlkEZ+gGV357wgGTDTWJRYtNjz5M31mr4UUSJxuzIZpbpd9fgai9xImWwC1odKstMIFx7W48VUiw95diqjsJRS2EhZ8+8oiUn66rQJI1nrHGZ3udKACtrc2UbCJlWVtBlSrJdgMg8m5ZicSSSA9WO9tSTWAxkgDcGc2LoZFefeAAD69P7rnUE9Di2SgCZ0GnyOcEvN9LDmpFGjCa8PGC8YNM7UnMMHSC+Hjs6Ksie38SgFsN4fb4RnBttO7Er92Gu208dNA5ip2SYSjYyQM4o77f8Wr7Mj/DdMDE0R3bs7vTEFjOwtAZJTASFbvI9PEaeg0DWc/PrQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR0301MB1622; X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB1622; 31:zMQNYLudKvOuzE/Ih0xEgmUMVFjTnUc/e5Uev+pI628qLByoCQ9DCihuCcuK9OGyTnlPV6K2LLZx41AzVTtoxHyEKCZKRBHCsMWYsBq7xRvJ0LSKbZKZCCmHfdT4ntE7cWeFjU3sLz15FQMii6gpVQwTbjRJEPznlwOXRTjg80hYLmQ7BTMRLDt8F8XDXeJrNPwpf+Tpi5yEPz/1J1OsG0F8T3DFNg8qmI5kCM14jvpcgqC5m/9NZmzGQQ2Syo5mwjmsUD6xDd9md7ovyE5lQw==; 4:wKwEZNQwS/N28D2Bnhhdo8TnRgNV+5LrWx/d7sady7L6Z7Nz0Sd/wErJ6zeiihjvGaY2u18S23frMPmc0gCGb9gqcLDKWPThIz4YPoI5j4QJAOc34Q47Otk0YbuZs++tlls36bcykvecKyVLwjgtlx/ewPeqg0WVm/65lmHOM3QqgkLlbWtgFzD+YLod8ZYISI60HtchSvRFRyLRPgtZgs2XCzYOlfHDctkQiZUMAyNm22RqCI0Y2SuLyKGQJ2ztJyhjtESbaBlibMYdEqnqnzB8gd0jHOlhBQcx807g7ywzmXM96hTNDe4DyWzbH8mA3GRHBRRn/iO5KraIdJHjhSinPjiUwNmp4LhoWusT8uDS7EEIVfXNIMFhw6EQmD2qw2I7+MiammIfU5tgj3hmRAP9mt0fSzFbataE401INaPAClAi8daPdlScOisa+i7B/83/gUvOLp2vIRk3rsgLXmseQ5BkSgBYctDmTzgrhrI6zLZGJXr1/3DDL61gNEqMsxp0Hy7itmGphg5Y8xNVohLbsGVvCxR3unsxw8IjmtuwtSCzzx+3+7RVDrngLkKh X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(13023025)(13018025)(13017025)(13024025)(13015025)(3002001)(10201501046)(6055026); SRVR:BY2PR0301MB1622; BCL:0; PCL:0; RULEID:(400006); SRVR:BY2PR0301MB1622; X-Forefront-PRVS: 0105DAA385 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR0301MB1622; 23:OFV+EMsKrOuOPKGn5Xq/lKARyYhb4kWTL3JhNmR?= =?us-ascii?Q?2sDoqMNHqLnaga+nv891fNh0e2kUcS+VmAIJ8CYnC7748D14bcww2FvKQHy0?= =?us-ascii?Q?48QR3Hd472Xmy8U6i7Vem5KQb+ql4cfU6B8EVdAjAK2/IPEZLbfuDo/SjUHh?= =?us-ascii?Q?MohptXKZyOqWlqkgR//g3iOjgcYjgYfw+oOLVPNat03A3UzJWu0l2arCxSQF?= =?us-ascii?Q?VogIOV6Y4780reqMgS41RaV9V6KaPbDrnATvG7E284uZluCwWlN2wq6l53DV?= =?us-ascii?Q?lzS9jeOh0YwkofDxSKPIKSy/BJkykfEu95yRKanVDJ+9Ih2SNZ33yKEZYbMV?= =?us-ascii?Q?t0W6YK9DAWP3N3MNpELrVQ00I75F6wK/19ae1prRPWqBNTSPZeVWkgSqF5bj?= =?us-ascii?Q?jFnEmp2Hexr6w/P2CNZtTuP5r/1K2IIfrZ3PFYQ/OmG89unrgRdSYSrddNgr?= =?us-ascii?Q?LQf77XPU80Ix9kpMZUr17GVEq8J4KoNiyQ8AGD80m7E+UN/GI2MYWj5PXVch?= =?us-ascii?Q?bCDiH3UjiyNibktRLFQxuXmuTXoHaCSIiBWxZ9rW16G+ThMItyZPako1zOEZ?= =?us-ascii?Q?l963m+WdyaOkxJ7S4lqonxrc3Q1IHwECE9Iy/mOoIPgXwUWzRP7lVDRrXxm3?= =?us-ascii?Q?pE8D8Fi0/qqn8HLoa1EKbWFTTGt42AEsaAKl8/orzEGMBJnCWESqBzJdjFx8?= =?us-ascii?Q?ZMayMLVbDvg0yC9kEGwNOj8XYsJBXTTfYSwcPFWmGIXhITQnfm3lm7IeAVg6?= =?us-ascii?Q?c4YWpOGR4AmOWPadWWP2P7uUa6cQtgmUSKZFagqbLGTI3St2VghxeAO3bQxr?= =?us-ascii?Q?Ap+VakhoTEdgXd+w9hl8TrGJbPjgtAT5oGnFJS/7Nf2L54fBGo8nrxEZV8aP?= =?us-ascii?Q?g0EscREUrGMZACD2lAvXJkMw5/jKvE4sczzgSHM48WrWb3kuCdzNKx4bwC2z?= =?us-ascii?Q?xr15twnKpjVfU/uBeCLFLMNYiqCYe9PmEwTrmlNbKv/9twy/9hRGrC85C+vM?= =?us-ascii?Q?IyuWdDKvDddNg7miC6Uz9N40PKQWlFVu93Lw36QNX0iC9jkVC16esfTiDLq4?= =?us-ascii?Q?6lyFWgyhNlKriVHc1GbsGPdd0Qh4aFbUdMfMsbiPAISiSXWvVpzLTi6ask4g?= =?us-ascii?Q?/KOF50nWfGgfIjOMD1vYq7nZ+inZL9p/NvWCKBXKwn95XaX4XmjwOyvTxmF4?= =?us-ascii?Q?H2LHgPbddaJ/d3Z4=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB1622; 6:jj+Qj4tX3qdRBBV3p5RRuWSkSKz44zbe2QvU8WEDreH8C0yYrMdl8mOTWHJhkOH9zw8cPe7xoUB8r+80kPQjU7oVSt10aQRfke2sMZQFRU3wWwKf+vr6JsxjEqna+jf2DR122OzmCeuoVz7euCdssCpOtjDeoiYkYgnUVaDg5N9EvgaITo6mnKAXAeBWLGYg3I4UOTFAkmCpTj1+0VcN7nnYiA+ekUnqQ+qi8qTRbdxfIBNxMI7taCw3UkRw6F2I2XYOvFvLtganZJQP3EjDuFuUdIlt5OoaCghknDQlEzo1NF61ziKSTOn9mP9TISUA; 5:mzb/6YHj7sXsXL7b0cEa4ZwNNDyU/w9E1l3JRX+y/U4Lmz49Kcl/slWzb0GRQiwZ1pGQbn0ZENqG6qccIMf4rznLVbdJRjt7LD/QvlYmBrhEbm7ykGybyIh7z3LZl4n+UJzDEio0gGPCdyJ/d6pm4ilqXG+2HteAFDfYGXp6ZIVc3LlYJfP/cmq5maeGQltv; 24:sIPJuq/EG6KMRZWkWS+SdcM4VLFR0qL53hXGay0qtDp9DSf6/wsLATVVqBJ9wsSNRoIU+NsM/fYGyInCuM8Rl+Q5pthwcO3w6lfwAbFfN7Q= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB1622; 7:+yPEEk/PR/X+LLOSwtu9OfTT9DHZYfnqaGpqyAn0A02AOrqKHLB3JKkvS81sUISUponJmwVC7gYQb1HNE1Y+itA7Vb6jgR1mQ3pCPsJiInZikXm0kjXDXtWTSDwUxZ9Xvsoijkiqiygv8ybMJUDV6T2LwDKNvoWyWU/45KxyUj9oqbgJSOTIzJZ+l5+hYoCabOQWHVKa7cSrzKz3aYQ4+e7PQCEqM2Pd2c3ZrH9BRZjZJeQUotp1wArqfp49MPFo/RVVrRZwGci6PNtAYQhSodSK/xpEAeauf3seF/uPdHjoJWcnqmPGv6V1cZqDILQS/BP0mQXSvvBCDN3F3ck+YWmrSOr7/Pjd4TuZY0DvkGA= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Oct 2016 01:54:51.8888 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR0301MB1622 X-Original-Sender: meng.yi@nxp.com X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of meng.yi@nxp.com designates 104.47.41.67 as permitted sender) smtp.mailfrom=meng.yi@nxp.com; dmarc=pass (p=NONE dis=NONE) header.from=nxp.com Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: rtc-linux@googlegroups.com X-Google-Group-Id: 712029733259 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , For the platforms including LS1021A, LS1043A that has the flextimer module, implementing alarm functions within RTC subsystem to wakeup the system when system going to sleep. Only Ftm0 can be used to wakeup the system. Signed-off-by: Meng Yi --- drivers/rtc/Kconfig | 9 ++ drivers/rtc/Makefile | 1 + drivers/rtc/rtc-nxp-ftm.c | 255 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 265 insertions(+) create mode 100644 drivers/rtc/rtc-nxp-ftm.c diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index e859d14..0ba52b3 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -1243,6 +1243,15 @@ config RTC_DRV_IMXDI This driver can also be built as a module, if so, the module will be called "rtc-imxdi". +config RTC_DRV_NXP + tristate "NXP flextimer Real Time Alarm " + help + For the FlexTimer on LS1021A, LS1043A, we can use FTM0 as the wakeup + source. + Say y here to enable FTM alarm support. The FTM alarm provides + alarm functions for wakeup system from deep sleep. There is only + one FTM can be used in ALARM(FTM 0). + config RTC_DRV_OMAP tristate "TI OMAP Real Time Clock" depends on ARCH_OMAP || ARCH_DAVINCI || COMPILE_TEST diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 1ac694a..abbf22c 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -71,6 +71,7 @@ obj-$(CONFIG_RTC_DRV_GENERIC) += rtc-generic.o obj-$(CONFIG_RTC_DRV_HID_SENSOR_TIME) += rtc-hid-sensor-time.o obj-$(CONFIG_RTC_DRV_HYM8563) += rtc-hym8563.o obj-$(CONFIG_RTC_DRV_IMXDI) += rtc-imxdi.o +obj-$(CONFIG_RTC_DRV_NXP) += rtc-nxp-ftm.o obj-$(CONFIG_RTC_DRV_ISL12022) += rtc-isl12022.o obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o obj-$(CONFIG_RTC_DRV_JZ4740) += rtc-jz4740.o diff --git a/drivers/rtc/rtc-nxp-ftm.c b/drivers/rtc/rtc-nxp-ftm.c new file mode 100644 index 0000000..74c4358 --- /dev/null +++ b/drivers/rtc/rtc-nxp-ftm.c @@ -0,0 +1,255 @@ +/* + * Copyright 2016 NXP Semiconductor, Inc. + * + * NXP FTM alarm device driver + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FTM_SC 0x00 +#define FTM_SC_CLK_SHIFT 3 +#define FTM_SC_CLK_MASK (0x3 << FTM_SC_CLK_SHIFT) +#define FTM_SC_CLK(c) ((c) << FTM_SC_CLK_SHIFT) +#define FTM_SC_PS_MASK 0x7 +#define FTM_SC_TOIE BIT(6) +#define FTM_SC_TOF BIT(7) + +#define FTM_SC_CLKS_FIXED_FREQ 0x02 + +#define FTM_CNT 0x04 +#define FTM_MOD 0x08 +#define FTM_CNTIN 0x4C + +#define FIXED_FREQ_CLK 32000 +#define MAX_FREQ_DIV (1 << FTM_SC_PS_MASK) +#define MAX_COUNT_VAL 0xffff + +struct ftm_rtc { + struct rtc_device *rtc_dev; + void __iomem *base; + bool endian; + u32 alarm_freq; +}; + +static struct ftm_rtc rtc; + +static inline u32 ftm_readl(void __iomem *addr) +{ + return rtc.endian ? ioread32be(addr) : ioread32(addr); +} + +static inline void ftm_writel(u32 val, void __iomem *addr) +{ + return rtc.endian ? iowrite32be(val, addr) : iowrite32(val, addr); +} + +static inline void ftm_counter_enable(bool enabled) +{ + u32 val; + + /* select and enable counter clock source */ + val = ftm_readl(rtc.base + FTM_SC); + if (enabled) { + val &= ~(FTM_SC_PS_MASK | FTM_SC_CLK_MASK); + val |= (FTM_SC_PS_MASK | FTM_SC_CLK(FTM_SC_CLKS_FIXED_FREQ)); + } else + val &= ~(FTM_SC_PS_MASK | FTM_SC_CLK_MASK); + ftm_writel(val, rtc.base + FTM_SC); +} + +static int ftm_irq_enable(bool enabled) +{ + u32 val; + + val = ftm_readl(rtc.base + FTM_SC); + if (enabled) + val |= FTM_SC_TOIE; + else + val &= ~FTM_SC_TOIE; + ftm_writel(val, rtc.base + FTM_SC); + + return 0; +} + +static inline void ftm_irq_clear(void) +{ + unsigned long timeout = jiffies + msecs_to_jiffies(100); + + while ((FTM_SC_TOF & ftm_readl(rtc.base + FTM_SC)) && + time_before(jiffies, timeout)) + ftm_writel(ftm_readl(rtc.base + FTM_SC) & (~FTM_SC_TOF), + rtc.base + FTM_SC); +} + +static void ftm_clean_alarm(void) +{ + ftm_counter_enable(false); + + ftm_writel(0x00, rtc.base + FTM_CNTIN); + ftm_writel(~0x00, rtc.base + FTM_MOD); + + /* + * The CNT register contains the FTM counter value. + * Reset clears the CNT register. Writing any value to COUNT + * updates the counter with its initial value, CNTIN. + */ + ftm_writel(0x00, rtc.base + FTM_CNT); +} + +static irqreturn_t ftm_alarm_interrupt(int irq, void *dev_id) +{ + rtc_alarm_irq_enable(rtc.rtc_dev, false); + ftm_irq_clear(); + ftm_irq_enable(false); + ftm_clean_alarm(); + + return IRQ_HANDLED; +} + +static int ftm_alarm_irq_enable(struct device *dev, unsigned int enabled) +{ + if (enabled) + ftm_irq_enable(true); + else + ftm_irq_enable(false); + + return 0; +} + +static int nxp_ftm_rtc_read_time(struct device *dev, struct rtc_time *tm) +{ + struct timeval time; + unsigned long local_time; + + do_gettimeofday(&time); + local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60)); + rtc_time_to_tm(local_time, tm); + + return 0; +} + +/*250Hz, 65536 / 250 = 262 second max*/ +static int nxp_ftm_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) +{ + struct rtc_time tm; + unsigned long now, alm_time, cycle; + + nxp_ftm_rtc_read_time(dev, &tm); + rtc_tm_to_time(&tm, &now); + rtc_tm_to_time(&alm->time, &alm_time); + + ftm_clean_alarm(); + cycle = (alm_time - now) * rtc.alarm_freq; + if (cycle > MAX_COUNT_VAL) { + pr_err("Out of alarm range.\n"); + return -EINVAL; + } + + ftm_irq_enable(false); + /* + * The counter increments until the value of MOD is reached, + * at which point the counter is reloaded with the value of CNTIN. + * The TOF (the overflow flag) bit is set when the FTM counter + * changes from MOD to CNTIN. So we should using the cycle - 1. + */ + ftm_writel(cycle - 1, rtc.base + FTM_MOD); + + ftm_counter_enable(true); + ftm_irq_enable(true); + + return 0; +} + +static int nxp_ftm_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) +{ + return 0; +} + +const struct rtc_class_ops nxp_ftm_rtc_ops = { + .read_time = nxp_ftm_rtc_read_time, + .set_alarm = nxp_ftm_rtc_set_alarm, + .read_alarm = nxp_ftm_rtc_read_alarm, + .alarm_irq_enable = ftm_alarm_irq_enable +}; + +static const struct of_device_id nxp_ftm_rtc_of_match[] = { + { + .compatible = "fsl,ftm-clock", + }, { + /* sentinel */ + } +}; +MODULE_DEVICE_TABLE(of, nxp_ftm_rtc_of_match); + +static int nxp_ftm_rtc_probe(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node; + struct resource *r; + int irq; + int ret; + + rtc.alarm_freq = (u32)FIXED_FREQ_CLK / (u32)MAX_FREQ_DIV; + + r = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!r) + return -ENODEV; + + rtc.base = devm_ioremap_resource(&pdev->dev, r); + if (IS_ERR(rtc.base)) + return PTR_ERR(rtc.base); + + irq = irq_of_parse_and_map(np, 0); + if (irq <= 0) { + pr_err("ftm: unable to get IRQ from DT, %d\n", irq); + return -EINVAL; + } + + rtc.endian = of_property_read_bool(np, "big-endian"); + + ret = devm_request_irq(&pdev->dev, irq, ftm_alarm_interrupt, + IRQF_NO_SUSPEND, dev_name(&pdev->dev), NULL); + if (ret < 0) { + dev_err(&pdev->dev, "failed to request irq\n"); + return ret; + } + + device_init_wakeup(&pdev->dev, true); + rtc.rtc_dev = devm_rtc_device_register(&pdev->dev, "nxp-ftm", + &nxp_ftm_rtc_ops, + THIS_MODULE); + + ftm_clean_alarm(); + + return ret; +} + +static struct platform_driver nxp_ftm_rtc_driver = { + .probe = nxp_ftm_rtc_probe, + .driver = { + .name = "nxp_ftm_rtc", + .of_match_table = nxp_ftm_rtc_of_match, + }, +}; + +module_platform_driver(nxp_ftm_rtc_driver); + +MODULE_DESCRIPTION("NXP/Freescale Flextimer RTC Driver"); +MODULE_LICENSE("GPL");