From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S941949AbcLWEzH (ORCPT ); Thu, 22 Dec 2016 23:55:07 -0500 Received: from mail-by2nam03on0052.outbound.protection.outlook.com ([104.47.42.52]:43840 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S938503AbcLWEzE (ORCPT ); Thu, 22 Dec 2016 23:55:04 -0500 X-Greylist: delayed 5582 seconds by postgrey-1.27 at vger.kernel.org; Thu, 22 Dec 2016 23:55:03 EST Authentication-Results: spf=none (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; roeck-us.net; dkim=none (message not signed) header.d=none;roeck-us.net; dmarc=permerror action=none header.from=amd.com; Date: Fri, 23 Dec 2016 11:23:17 +0800 From: Huang Rui To: Julia Lawall CC: , Jean Delvare , Guenter Roeck , , Subject: Re: [PATCH 65/66] hwmon: (fam15h_power) use permission-specific DEVICE_ATTR variants Message-ID: <20161223032316.GA11339@hr-amur2> References: <1482408335-3435-1-git-send-email-Julia.Lawall@lip6.fr> <1482408335-3435-66-git-send-email-Julia.Lawall@lip6.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1482408335-3435-66-git-send-email-Julia.Lawall@lip6.fr> User-Agent: Mutt/1.5.21 (2010-09-15) X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:165.204.84.17;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(39850400002)(39410400002)(39840400002)(39450400003)(39860400002)(2980300002)(428002)(189002)(199003)(24454002)(4326007)(77096006)(50986999)(76176999)(101416001)(81166006)(86362001)(33656002)(97756001)(8936002)(8676002)(54356999)(81156014)(2906002)(38730400001)(33716001)(46406003)(229853002)(23726003)(97736004)(6666003)(6916009)(4001350100001)(2950100002)(1076002)(47776003)(626004)(305945005)(110136003)(92566002)(83506001)(356003)(9686002)(106466001)(189998001)(5660300001)(68736007)(50466002)(105586002)(18370500001)(107986001);DIR:OUT;SFP:1101;SCL:1;SRVR:DM2PR12MB0298;H:SATLEXCHOV01.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CO1NAM03FT032;1:8xTCuyLn5+KUe8lg2duXRPCtdW+zCDeeOliKU8/ex0/v0LwoKrFN6I0tgnUA5Tr02qjeaJjh1lvmLjLVqNHby8L1hhkUi2KWwP+4qPOxHbdMDufP/oRs08+bLUGXcwn9w/mf96V1CJ1vfIofB3DjvJT8SlhysyjHu7xCserlcBvqEyNKX4PW3cRQ0nqTavvAA4ThXbipcPdn3eOfLmQD5N404kPEH642SnVnhW1ZazQ/OHJuhzHkiZ+/GI5t+wk1BejXgO4QIdFKFw93PZQ4XW5Y1bIg03kiNY4SfmVQKhp3OUO6b8HAiNqIJIsDWYlZAs72TG8sDiFHND4WxybVvjlGVHuFLIyrF9deIpMeVhCPXPgoTc6FuYzZ+V6vEj/QOvEJXLQpSvw2yUaNhmGCWelYhrrpX/2TZZVqvCRSfORoCue3QaIO6FYU3nCKT4gWPpFiNnEpA058hAVPaQL8K8QT1iZ5uMmhBkiTtDuaEVh+e53uHRmTBS2R0vrNfPnwO6iJ8E6gR1SMpHvUOsRUwg== X-MS-Office365-Filtering-Correlation-Id: 37a1da66-b03a-4c2c-4fcd-08d42ae2dabc X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:DM2PR12MB0298; X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0298;3:AfIF5usqKHMq9EKlSJQmc6X0ve683gl2Oj0QVtsRZUvjLkoyz3kl9Isl9t9+bpaAYrF96VIA7qpG/WXF10WYTSxsx30cPvrhCplg+txW+1tM0g16cls/A/hLXPYzIKX6KUAG8eTJ6rHjvw0RDduEmKA/Mc5lEYKc2p3EhPCamSazRmWNCeYmS4CsMOUpp9fqZBSrC/kWmTYgwIKieXCOMmW90djAcAyfzIe4ChGiuVZYmaAUCvVUaRFeaP9WzqicIgdyiSXWBW555KHdnNrLrqcqWOaNI+s0hCtLO0msZM7IdOqooZotx2dHHmgTKfpgxNDlhwZwdeaa6gncB1a5NaZH/HP0kdzEPxyA9irMtCFMzCUobledQ3hiRN1fyBB6 X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0298;25:a9+p4E543WqVP4l9S4vbdNo+ZExGV8eKS6n7CVF1A82tNaLTr+t8csE8ri/UD8+bvaW6ox85HJXIBbIEB1/+Z0C82/0YKfQQr5vHOxi5x7EOdEomUVRncfstNawC1m8X5LHWgDFtlRXsO4FqDGNFTYns4bHKK4hWi2svID9KI0ZQCH4J4DRc+u/InfU19d0z6rzOLdDcZl/hDv0sdbIFhIVY/VlOiFLd7hEaCPpyclIewLJuVWH1n8k8RbBwsAukZSbNiueWeR29yiI8DaW6Cc+4QVHerE9AlfZArh7jf1+eW5Mr/yQHvnejoZmEALMNPdlFdIpWjhbMggJGdWuam6y6U/yYQgmZiE5VJ+UhTEBzQhkoGPkYDpZ/IsFRuGwy/Aor6ixHZbUPzQmCzjCzRcMB6T49tkL5tKX5Y5qOsNyfND67yrqtGlZlel/v/zHyD6keotMB7VgseW9xXj6BkhIqdNiWhuE93QOYRd6zMH9lE2Qs+XFjE4dYNqZEeNXoNs+wRvtRq6Ft7KeZ/CJS8TAp/dXz3iJTReyFdCG2bmPTJ49DqzQksMDq5vhI8qY31lMoiEr1wrduHYXvi8GamFKkvJveQW7tmvSA17ZKgmiFBQ7In1fdEyzcLsv8mLtskCHg7zCbfNaPcUw+c74bm2q5DyChFix9K34y7r3oK71/4dPDcc/V6eY8Jr8I3UXKXH/L87le1SKpVgc9iA+y2qMkiLgUVG4J6mqi1AlBAGGvAHTQLZVT6TY78WqQ7Ihj28vVWkR7sSOixkVf26GfIf820nupBrdcwV70fVTVD9Z+U04KaujCzJRvOGxWs+h9B1lZxqg8aaU9JmwJFPV1r0hv8HLO2w+t2HfaE0L+oT1Gb+uifHVKbs8Ib19Pvni6 X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0298;31:RHHUezamFcDPQbtieX+w3yRlXPtP4x72KvbWtbsLkK+KsYZH0GtDlUIxxaM95bZSOhq8Red6Plr7FM06lwRe1dL1CS2lwfI+TWtIu4A78UUvSPsdAUdUXCHqouRIBCFIcs0NewYwXSoNd7ROiPzY1/5J5tjeitHkwOcqBAQGrL4QVDWew31SBIYMDgk6S0lTvAFMY5d4qQTSQFrazO3UdgX/hDMMg82ig5YwgqP19OKAQgNvJqHoQlFgtB3DWsZLNS4AVzLU5JmCxVaVttHvyw==;20:gN7e0Iml8hOcK7dQh/pf70+N9yPwtvp/9UAJFx0myzlNlLo9h5Z5ax0cAkNzCIJ4oSaVh9v7YloYuqWe5AOGRyoryksod7l/EO5CYxEujL/COguOQfqhhy65y0U2EKupVK0Gcoyo52UzjNWZ/nSrR+Y5D4Jf6H3Jh5eNu4Y5flMGdoE92+wbEvhvXiMPIobppXbNoOTgJlpz6mdogxiLGirQWiRxhtnbRUpIktb0Lp4JOZ/3hABzgjs+GH2DhGSdHpKh1BjDI7bejxZ53uPpSbwMIZLDXJfanZrDZLijKQRqfO+sZX4VKcuXo0xpIgInt1/AM1rLSC09BuQp8a5Zo36WEjGf8ZnCV9qgdQ5bdCdF2zdJ/zNYyMZfMpBGe8zDwuHEPaaw0DokjSpuGNaluDwfPW7zBmq177yLH4pMcPzV59anQxsjNmYuo6ZAAejEFO3u9IO/MRXIm7ToUDCcFYtrzW3NyUeYx1MKykuH3mjFktxXF0Hu89XWUQTUV+fi X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(13016025)(5005006)(8121501046)(13018025)(10201501046)(3002001)(6055026)(6041248)(20161123555025)(20161123562025)(20161123560025)(20161123564025)(6072148);SRVR:DM2PR12MB0298;BCL:0;PCL:0;RULEID:;SRVR:DM2PR12MB0298; X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0298;4:0Hw39Pa3/uu3AdBZgmxfH3BHfGT+kRmAwivXr0I8PZ9q3m3eUAfN9gxU4TgHiqE/F115JAdtiVvX0wgy6TIWlQpNlaBooa2O9+OVYHrBXUK2D0+6AN/msKO9Ezyy3qIZdPiN/W3OrfOUDnsvihk50pNh9qGp/ievRmhuyS8nsO9onCVklPNChtDqJJ6m256SUnXVkbOj4wHWerDnn88Amp/vbT1G7smZEkwQByUzm1MTh095REoVD6dFbhtj24FP9Lgt8e8HONOEU/Dn0nDE2Ad3KtPFiAYmNqmJOWw5mjKOba3fqZxH83uqW2S/z4D21LhKgUQM+i89wr71iXxYKF/YH/WuBOtgM4XV4W256+QnLwcyHr3/5zJO3fONxaAqLLPmkl0MvB+UcUSvsBHNLVpKCLThJj2itbe/Hz9hgngD6Jyb+eYZqufzicVFO0jkA6pY+GUVg4RaSChs/gEcBLpkRYc1+x91HrDebAXnuSYDOb66LjR8ukUdXGHAThhFhUdgrcijdfxU5ap7pQTD2yYh2umTrPRnNPa8Rwsh9NSIXrpssrOWfW4sBwpj9sbpP+PfQzAp6tBYStcN/Ex6RZoldd4LcQOprQ2cVmi/sQEwECyoxkn5TFwP+p3KbdRMfGEHEAJm9AFtpJgKTfGLBnXcJSOlSLqjACd0hoJeAI0= X-Forefront-PRVS: 016572D96D X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM2PR12MB0298;23:ypZgV21o2NunKVW8jTOtnPSMTXFZJoXUXqpgzViYE?= =?us-ascii?Q?vljfyB+dhgm0DdoyEjftqKOG2llxZHa8fu9P4GRk+KmtfbFGpnCBRcdVDvFM?= =?us-ascii?Q?GQB4Ncz4SOvubXSLLQ7nNG4JFuV9WpfT5d/pZW0JlIyDa440JaxXaMwknAxn?= =?us-ascii?Q?uib9XOLmZ/FJJ8agyTFJrEGu7nn2lfHR2bravScQyWiVjBF3WfpK5TQuadrr?= =?us-ascii?Q?eSWR09Za3ni7zq08G6Gvae24mk9lH5Jw+zsZTG/5tkmqcxAbfBWm6h05nr4A?= =?us-ascii?Q?RciRlOsOy7OxrK33kEoUUMBLP56yFnSxbJlQQkpyviPBJewD2w8Mj0YH1X3D?= =?us-ascii?Q?DunGrLnuilslwyyc/KAs6KK4Tvs7yIjvQ9k+PM/KU9dqVb1aIBh3og96+tgm?= =?us-ascii?Q?MGJGwqs9SaxD+QJjKhGxP9ZIAbJrJ0fd2eeLUPKy1Dd+kRbUmRNwI1wOfS9/?= =?us-ascii?Q?vpnxJU+zHis0lZ2Gx9RvLXo7/+ZAfLyu+RAXyt798l/uDH4YqATEATuijufm?= =?us-ascii?Q?jfLZa3WZ+rDL4/+Ljo6w3UU5XUExqypS4bx5MDQ23dE1+Va/O4HuN++l4gEw?= =?us-ascii?Q?X3o6mjuokF2tva5ei1jf/FZtxP56saFhSyH5Bbvn2nfZdrGX8waJDxfzCfsG?= =?us-ascii?Q?w78i6rrOC2RHAI9MgUmKnEeISxB2ijOPadLqEEijGu6klI2AX+EZHz3+aOif?= =?us-ascii?Q?/PXANYcp+s6zPWTQ97RL4TTImxlwUhuzZqZ6RxvQIYaStOakmfw3RQfrsN4F?= =?us-ascii?Q?jfo8rF7wWEaWmwf18q2vi4+HxXY6fyt2NCAvaWVNJ12hiJvHTu1AKxW97nZG?= =?us-ascii?Q?FWON7rxFhvJgdx9lYpv1TfBrLwDCyIxx3CsNXd4jeLn4lkmpioXCDZSdPlYB?= =?us-ascii?Q?SceeietHLYzGlVUXPzoxuhy+DFwHMLfGMiIEdIrunt7YgiPSzVeBFlcZlTr7?= =?us-ascii?Q?pHGkCtFJ4uKBKsAryGBDjnhUx7uUemnc20PeBf3XLPF55XlffahGGCJ4qXzq?= =?us-ascii?Q?klBDOIfhmGAa87GrZ4fOHvuw9LNqOf2wvyIhKsjRyvLBggZfvVibdPsndPmg?= =?us-ascii?Q?H5AV1CiYR85u2rIF91BbESVSzNbgebtcmtyaGHC0Ucdf1P+HIGIbXBuNtBJn?= =?us-ascii?Q?nVebrQu+b1on9SxW4ZRHZ2lb9LBwGDLgt7FZsz7h6KEgftaIHH9zGqUInaHh?= =?us-ascii?Q?EbWPiljJQwbmxGHEqteANGs/UKefFQpqVzZv9TckVrZ25wP1g1kYks5bf/+C?= =?us-ascii?Q?3HrtPYB634c/rblz9D+j78qvVjFkO814NTdpLN4cQA5JtZZkBuR+sabtzYM5?= =?us-ascii?B?UT09?= X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0298;6:XtzuZ/nEubrFM+B+BEzzANohNqllrewmkC1ZyzyTREWwnS59CZHiAyblUkudA1vdzqtfHMv51HE6Xqh6C0lzzZqD1P+1IiB28Ml2nsw7atE55xUlRwZCc+rw2/D2sNsZ/oGeqQ2CMt3kpJMRPVeTSHrEVAs6eM5gBXvVcAu6ID3zQMBXwI5NwWoPvw22tXECJ5NqRs7Mn1qFD8DuXZmHN00++bpwdPDqce5Bw/G2gBkBCZ9d+9Y3wMtER7A5LPRmgxXZS1TTWRNBw8bmfm9XQWOc5h1ASWOSx6lMhAv87GKwYAT47cgTYV1aARKB6Ai6s5ZHufkCKd/ZwPavLKtp4Hj0nJDW6uqWSYIRU672CK39Id4zybMEFeQuC0/SLJlaZLV56eERXSaDK+M0XGXH/Ksyew/DDuzP+XeDpq1BGQY5bHpbtmFnzmtskkfoPAR6b3fhlUnn7ThSdwyT1NJmJA==;5:9znmJbbHgKvYUTKjdEWFgPIBVCYyvn7b4HW34Meg0v9e4ecTz2kios1ENrJ/ofFu85shngcaZTUAA8BVK29B18j059zHcgRZQY8O1nqdB32yb6ikciEGtWpjhHMq4ONRqcPxD7MepsSLgLRzgsUwYg==;24:PcjaYsdb0efF6zQ2NjrdJ7Q4gtTJxbTe+OedoXqw2lZIa6sXUiVat3uFjHsi6JqFCpaqPvI6TO00aba8L2kmK76DEdlWXIvMx2ap8rqrNtw= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DM2PR12MB0298;7:+jluWQO3ILa/TXY7RjZvhtnHeefsYs7xhWg+nOwpe/U33/IqYSgOajqt3mA2tzD//WIKkYelSM19okCGVWYH4pAq+PdXIt0RYpHpHPUoFZuZNJwUAVvxazcCz1GkmjOFBJ8JaCWAy6mDONVMtex7qGq8Whg5zizAEVwQPCgQVVp4pNYiT9Ul9SXjOEWkSF0ZRs78xLPPo4vEtt1PZ4P4M5WN3AdwLcTz6JD0mIqsr5ArIsGCigkAvM5RMAO/4MlEZnOj7UykdxEkkl4/llbTkGnTYWFHgpCZ30YFJf7A/neCrjf2S4jiGUNo4SzA5fWCEcuplPJEmKvHej4ozJn5zPv5yBZJMV2FsENyRZw8k74+DAonr3lzxquC2wmDFu1vaOIo5ylbnZ4K2Wg4IX7SUkJXG4zhAusJGZuF0tcXttn3Wz9q2gtIeL7S2J7fsfzlQ6amSDNIc9mSTr3kk9ohJg==;20:Lb1EYtLVHnHluLK6DFX+LCvtKxxx9fqf8+MZO7/drZk+/GHSOHdbjKZcSCl5zKz1WK2FKwRiD5Fh/4+H19t7dPnp53PfbWI3qMhVbTe2lOORLwBYq1TwYyjkVsaElzA2xgo7SsngT3WVxBHbzokyz8newHFsyEj2r+XvIZFkY4ONweoSVLQpJKGY+OBnYAE9pMkAvTjis6T/U5mvtdZEEu1w59nvuAfFMMf7us07rikRM/ClsX5hcj5vbuwHKOzb X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Dec 2016 03:21:58.3550 (UTC) X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXCHOV01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR12MB0298 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Dec 22, 2016 at 01:05:34PM +0100, Julia Lawall wrote: > Use DEVICE_ATTR_RO etc. for read only attributes etc. This simplifies the > source code, improves readbility, and reduces the chance of > inconsistencies. > > The semantic patch for the RO case, in the case where the show function > already has the expected name, is as follows: > (http://coccinelle.lip6.fr/) > > // > @ro@ > declarer name DEVICE_ATTR; > identifier x,x_show; > @@ > > DEVICE_ATTR(x, \(0444\|S_IRUGO\), x_show, NULL); > > @script:ocaml@ > x << ro.x; > x_show << ro.x_show; > @@ > > if not (x^"_show" = x_show) then Coccilib.include_match false > > @@ > declarer name DEVICE_ATTR_RO; > identifier ro.x,ro.x_show; > @@ > > - DEVICE_ATTR(x, \(0444\|S_IRUGO\), x_show, NULL); > + DEVICE_ATTR_RO(x); > // > > Signed-off-by: Julia Lawall > Acked-by: Huang Rui Thanks, Rui > --- > drivers/hwmon/fam15h_power.c | 34 ++++++++++++++++------------------ > 1 file changed, 16 insertions(+), 18 deletions(-) > > diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c > index 15aa49d..9545a34 100644 > --- a/drivers/hwmon/fam15h_power.c > +++ b/drivers/hwmon/fam15h_power.c > @@ -83,8 +83,8 @@ static bool is_carrizo_or_later(void) > return boot_cpu_data.x86 == 0x15 && boot_cpu_data.x86_model >= 0x60; > } > > -static ssize_t show_power(struct device *dev, > - struct device_attribute *attr, char *buf) > +static ssize_t power1_input_show(struct device *dev, > + struct device_attribute *attr, char *buf) > { > u32 val, tdp_limit, running_avg_range; > s32 running_avg_capture; > @@ -136,16 +136,16 @@ static ssize_t show_power(struct device *dev, > curr_pwr_watts = (curr_pwr_watts * 15625) >> (10 + running_avg_range); > return sprintf(buf, "%u\n", (unsigned int) curr_pwr_watts); > } > -static DEVICE_ATTR(power1_input, S_IRUGO, show_power, NULL); > +static DEVICE_ATTR_RO(power1_input); > > -static ssize_t show_power_crit(struct device *dev, > - struct device_attribute *attr, char *buf) > +static ssize_t power1_crit_show(struct device *dev, > + struct device_attribute *attr, char *buf) > { > struct fam15h_power_data *data = dev_get_drvdata(dev); > > return sprintf(buf, "%u\n", data->processor_pwr_watts); > } > -static DEVICE_ATTR(power1_crit, S_IRUGO, show_power_crit, NULL); > +static DEVICE_ATTR_RO(power1_crit); > > static void do_read_registers_on_cu(void *_data) > { > @@ -212,9 +212,8 @@ static int read_registers(struct fam15h_power_data *data) > return 0; > } > > -static ssize_t acc_show_power(struct device *dev, > - struct device_attribute *attr, > - char *buf) > +static ssize_t power1_average_show(struct device *dev, > + struct device_attribute *attr, char *buf) > { > struct fam15h_power_data *data = dev_get_drvdata(dev); > u64 prev_cu_acc_power[MAX_CUS], prev_ptsc[MAX_CUS], > @@ -267,20 +266,20 @@ static ssize_t acc_show_power(struct device *dev, > > return sprintf(buf, "%llu\n", (unsigned long long)avg_acc); > } > -static DEVICE_ATTR(power1_average, S_IRUGO, acc_show_power, NULL); > +static DEVICE_ATTR_RO(power1_average); > > -static ssize_t acc_show_power_period(struct device *dev, > - struct device_attribute *attr, > - char *buf) > +static ssize_t power1_average_interval_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > { > struct fam15h_power_data *data = dev_get_drvdata(dev); > > return sprintf(buf, "%lu\n", data->power_period); > } > > -static ssize_t acc_set_power_period(struct device *dev, > - struct device_attribute *attr, > - const char *buf, size_t count) > +static ssize_t power1_average_interval_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t count) > { > struct fam15h_power_data *data = dev_get_drvdata(dev); > unsigned long temp; > @@ -301,8 +300,7 @@ static ssize_t acc_set_power_period(struct device *dev, > > return count; > } > -static DEVICE_ATTR(power1_average_interval, S_IRUGO | S_IWUSR, > - acc_show_power_period, acc_set_power_period); > +static DEVICE_ATTR_RW(power1_average_interval); > > static int fam15h_power_init_attrs(struct pci_dev *pdev, > struct fam15h_power_data *data) >