Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756088AbcKVQVw (ORCPT ); Tue, 22 Nov 2016 11:21:52 -0500 Received: from mail-ve1eur01on0092.outbound.protection.outlook.com ([104.47.1.92]:35136 "EHLO EUR01-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754704AbcKVQVu (ORCPT ); Tue, 22 Nov 2016 11:21:50 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peda@axentia.se; From: Peter Rosin To: CC: Peter Rosin , Linus Walleij , Andrey Smirnov , Neil Armstrong , Subject: [PATCH 2/2] pinctrl: sx150x: support setting multiple pins at once Date: Tue, 22 Nov 2016 17:06:02 +0100 Message-ID: <1479830762-1839-3-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1479830762-1839-1-git-send-email-peda@axentia.se> References: <1479830762-1839-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [217.210.101.82] X-ClientProxiedBy: HE1PR0402CA0024.eurprd04.prod.outlook.com (10.175.27.34) To AM5PR0201MB2308.eurprd02.prod.outlook.com (10.169.243.7) X-Microsoft-Exchange-Diagnostics: 1;AM5PR0201MB2308;2:TvGGkMEBR/dkdSnYXscwIP6+IAOeqnPsusKhtZY53QF9Ebzxt3sP/Cxp47bBa5lZzupRF2SCJiHFNLuYVVAGWyVB6nE/gOU+kBYMu3oEk+veI9dzLMg5P8GbtsQ8XmblW2RjvtKujc7ZVytwjmrCsXo2qDm+rTFDRTpxYzzEQOk=;3:Ugnyzkvvt+OO51KGURegRIt08Yk4HE+XP9c+q4L0crURgAtl4UKndwq9kcDha7qf+u9CjTw1NzNXApew+0VPTR38PQbCSAJlQFZE930SZn8+1Tx5RWDYJINSuR9UCHwJNqY2plMcI0xC6O5RJNTvSQv1iazif8V8OBTYUzYHCT8= X-MS-Office365-Filtering-Correlation-Id: 77355c43-1edd-4132-5d95-08d412f183ef X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:AM5PR0201MB2308; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0201MB2308;25:aKiD+acmcoTOolKW3akVpzNDUBHgm18+DFwOJ4gTjdZiNvUhxD9M5RYySkafxRnV2F6d3exvOaqeATY0i1UnXFoA9CHqhoVgcVu3TjBhuTVcpQ1VuffPCTHBbooes4uOJCCd5i8oAn9XyoabB53eIcCfSMhd3aatsUoZXxkUjvbeZ1w6NnvsB96p6d3iSJxPnZMPH8N+55BJxqqPeirp7mvOmu1qOxCTesjZiYMP20C69NQtt1XjceS4+yn8JpXaP96JZsjpkMWZ537coS5wOt8biNeUQAUR4qCZm36TcGUgHNAWz7RyPW9vMfSHyex/yUqGyHINtqIMcO+ci5EhpPJmKcx8EDauSbD51RbEhBLVdibHuWWH0aow41uQrFPV70oGQGT1x9eHjY8L5F/vs2TEpNeliUd+sFYs1ZWgqe7N/yru+wj1rNTa3Iy8GXiFNcA0CyJIhGuF/1+VKLKtW3BKtuD6eGwRKVUFVwklgAnedhMFeCO7tvnJaTcYAlPCKPIT9fOFBJwoKadUx+0exREH4TE3qNBYqxZRKfZruVTVXSja0zHtFSAdkW3EE7isc8Iof7EYxX2lcCbbYsiJfko5XaIJ7TaMMd9mlBiwO7lmdJz2ENAZJy3T5Tq0YnqrumdM9Xc7Qc3V7rvi8H9f1cBB0alAeS7ROW05wnt8OlwNbp8mpUCQg3MuGtCmuQZ19AK89nDrrLJf32rhkynBdfj1Uqk3xLaJseAWf4A8XaEFeVzqp9BFW/abR/7KTYQ+xFhv1LBnjsuuEAt44c0kLIqBiKu47+RiJw9PYYauAFY= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0201MB2308;31:+wTScRXNsliThupbTg2fk3kA4oDhvgLxI/zjMHNTltkZUV01l8or2npxl1o1ryzzFnJkqZ8Qc4C5/VExNu/SbppevXoG0JmiTuVKV5E2Nk3jrFMXAUM0r/EzElzPB4ZsouYvvUMY+WzgAjaOAFR4nPmD5FS4CQ4bGb4MOJuw7iDKnDD+2Y94mINed+Z4IBpWZYXW7QPYJh/3y+q9N3vfJOMdSBQoskz9AWILdQIyh6A/R7ZGd9vubktgbvQofdQSs2czgmh/gQA3Kov+LIgnXQ==;4:idFd0GAmil3ofKBJjFKFGVhIr7osanX1RJlfgQHJc7z0vhwFXMbyiCvEKWhWDKafwPueknzDXo0/HqNPRVoMhjxbOWfhnpItsGHEmsWWCWisBesUzC07CcB/NCzTOl4u4w3CVJYGz36Lmnaqc4lytxhpufFmQNA2ppBY4C0w60MTk9jhoO8dh4XJXgKgfbqjl1FWwSGUdUWpiXuHUKF3kD7OdwCVF1Jv1IUMKm8UbKT8adpG9OSLf/Xi7b1nGTSbXEFkmA2uk3ksP+TkPaHLfbDy9riZpYctodNWMHcEYsjuy63nzIGjX3JXq+SVi9upYVDonbU0smy+4wGbi8FAxO1fVNlL4DujJEXepMeK2ypFBnUvMIRHSGipiQKXx4CmBsEmG2QvQUCH7MVjckSpv0v0uxvzZRSRaflXQDDQJdvaKr3IpfMqUje3mSBw8msE58pVseDImBdbKNBlM1vafMlHebA3HAfFLh7dghcqytRqRCkgOyD3AnV86z48xouGzODr0fIhmzG/AfMqvpk+5g== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040307)(6060326)(6045199)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6041248)(6061324)(2016111802025)(6043046);SRVR:AM5PR0201MB2308;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0201MB2308; X-Forefront-PRVS: 0134AD334F X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6069001)(7916002)(199003)(189002)(92566002)(3846002)(50226002)(68736007)(50466002)(189998001)(6116002)(2906002)(81166006)(97736004)(5660300001)(77096005)(8676002)(4326007)(81156014)(33646002)(6916009)(2950100002)(36756003)(5003940100001)(6666003)(86362001)(74482002)(101416001)(575784001)(42186005)(47776003)(66066001)(38730400001)(7846002)(106356001)(50986999)(110136003)(2351001)(305945005)(76176999)(7736002)(105586002)(48376002)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:AM5PR0201MB2308;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM5PR0201MB2308;23:vI2TeR2HQvLAuPvzMgB1yCPya0cD2SEtTe4hJIT?= =?us-ascii?Q?ZIa4uvO9QABpEEIpi/YXW5J+wV5Em7G6zUpT1+mPdWh5KPdgDz3nXZwH9S9o?= =?us-ascii?Q?F7rlQDcimjVWMzp68tdMCZxU0EaPKsvZ48GYuKEbzxSQ2NI9qOaJDEty/AKM?= =?us-ascii?Q?IQSl9LfDA//MeQZMhOhEaw86UB67YslOM4U4xbmklDDAVgsK3Hx62IZcLX7q?= =?us-ascii?Q?MMhMzKcWNBxX9pM/lckVsh/pGbZQRNOyaWeh69umCRtrmWKP+dVeokJXh7fj?= =?us-ascii?Q?zYuaJ3H+hXRiost+Boygiq/VKW95Ma7zOCyzGP0saEGm4rLfHgC5lOed3V6/?= =?us-ascii?Q?+TE8p7mKQPOy3zvYlH6BZ+DY+BQZ0kmB1Ya40KbokfbQUBq+skp6AJnOKL1u?= =?us-ascii?Q?kYDLXud974VjPlsWckLucMR3qU2cqk5mc156JrVRjTAk/JI63noIhaeVu/NK?= =?us-ascii?Q?EAETo2sbXVSIQRAlGZa+EUnMxct1cvWUWBsp+g6pJfSelE3jTumPXSP3e81u?= =?us-ascii?Q?hjAjVIBIkB6R/qFRLg2bnDU54dcZctLjI9n2mBSjUiBtL8lPqr7rNrox4doc?= =?us-ascii?Q?YN34DjEwhI7sMbx+Msr7He/7kbpqc6Dd5IZiuYbLdPNaJUql1n9eurFLOOVa?= =?us-ascii?Q?caSxplqXwyH/gnO8Wnq6Nb3108PsnE7866iN2GmVp1Yi/+G49NsVrkeHo7Re?= =?us-ascii?Q?SLL8xHVXAFZlIH1vTb+9xgYEf76z2xx8qbKrht6FrutS6mMwi+1LxGADuPFs?= =?us-ascii?Q?ho/0P0jDXKEwVMg72+NH9M5uyXi0iDlhSXOu/rCr+csyqIaeSUKbNUDHAt35?= =?us-ascii?Q?/SUlKrY6JPakCXnUdW4dzhSeECgq/2koXt2HjtU/IXMC/cmiVB1lS3EFRdvE?= =?us-ascii?Q?7lkDSOvI5TubjB+EFKjQ4Dwk4RJzEHfKF2nFNdFBlvdp3ER+Ic2JGxpg3Wqe?= =?us-ascii?Q?TX5oDWL7G7tSQKEZPwU4FznxN4L0FVgrepwL2Yb2MxEfzCiirWKVxRgQvNGo?= =?us-ascii?Q?SpUylkcwdlWvXJ5hkTU3FKEDVciBm/qDulwwKvijBkReL5ReL5zBkE+eQySz?= =?us-ascii?Q?eHanJ4gvCWgf5KvoA+Wyv70Cd88ZCGuh1zFTjmkKkFtkac9eVcBda6ccDEGJ?= =?us-ascii?Q?J1SrKhTxW5Pk=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0201MB2308;6:y5WM5cLogEfY9e3Ib5uSGuaOMW6n7QN9UEbmGymifSAm3usP4+njL6jhTF49W10YXjyXYavcQG+UDCgcw7dBdp8tVYqAzUxDbYvn8FTlBpMXuT7wTJNNjbBx5m+NNaGIzY29vQF4TcWTAf7K3yE7VIVwEsXnktgBCPYR6bMeXtSoa0nr5gqPp8/oAqnJWQThf55SjBa08mdISYjZsAbnidkosWQG+ygNbiPCWs7bN/kUyftTZJUxqsCDg1GDmolGvHrOZzabL8nBnDMtVwzEQsrrYpBRPMuEHDXPmYJZVlx+PpaxYrslD/LQz2AFU/UWsK2QoOwfCEbS53pAwPyJyHQADHYfcsS++yjv1rhah10VrXUHRTHsWj/ibP7+LcBQ;5:NoCCRlvjgqXXld18RVsmGmUhM6qFtr1GXwbv58iCoFYBD4DJjtnnza/NdVblQl7vEyfNIQVPEnY/uQR+3yv+W2BwrHOIBznkuavRBYOAnQtunYkJfOTTLnxpcHA02rerpCmng1/D77BadHNe0v3JzA==;24:XUY4vXRwJqFXVnctXyX+uDA/Hb+6ZtIAUtZMYWpGLib8rXUjgC3jpttXeV/zMsHYSrgy0AY6WxFC0EX1amxl0aVKVzPaXaYoSFxeVTHVQDw= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM5PR0201MB2308;7:33jjk076G6fHo6ZA5HskfqD3CThj2MryhQT2ggaHO3exJFe0NwyTpmeXMPOIIWMjUDVOQvZ5dFcLlDOCFot+3QpDJDOOvw4RudYNidLj9hd40T4++Fxg9wlrIi/Q/W2VIWJfNh5xXtrX3nmTaXlm2bVIHkmj2ujc7bNPsnhoXJFiYKV03CSdAvhWT5TW1WiKL4ZB0Eq2vI1nH3F07kl7Ktuk9mRenfOYsfeYriGuF3/a0jJpRdJCel4ieFVD6FHLUjXkC3UOyJAc9+d6Ygurk8s9RtSokKXjtHIpnN+qAF6JjhPwT1M7QZpm+dg082TL4Xp6FaxIa1DfmQ8RCQdMAbokNopkrU9zIS/fRG9Uo3Y= X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Nov 2016 16:06:26.7916 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0201MB2308 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2865 Lines: 93 The mask of a possible oscio pin is cached, making it easier to test for the exception. Signed-off-by: Peter Rosin --- drivers/pinctrl/pinctrl-sx150x.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/drivers/pinctrl/pinctrl-sx150x.c b/drivers/pinctrl/pinctrl-sx150x.c index ef4ef88e0ee9..5bcede2b2cd8 100644 --- a/drivers/pinctrl/pinctrl-sx150x.c +++ b/drivers/pinctrl/pinctrl-sx150x.c @@ -114,6 +114,7 @@ struct sx150x_pinctrl { } irq; struct mutex lock; const struct sx150x_device_data *data; + unsigned long oscio_mask; }; static const struct pinctrl_pin_desc sx150x_8_pins[] = { @@ -290,14 +291,7 @@ static const struct pinctrl_ops sx150x_pinctrl_ops = { static bool sx150x_pin_is_oscio(struct sx150x_pinctrl *pctl, unsigned int pin) { - if (pin >= pctl->data->npins) - return false; - - /* OSCIO pin is only present in 789 devices */ - if (pctl->data->model != SX150X_789) - return false; - - return !strcmp(pctl->data->pins[pin].name, "oscio"); + return !!(BIT(pin) & pctl->oscio_mask); } static int sx150x_gpio_get_direction(struct gpio_chip *chip, @@ -395,6 +389,15 @@ static void sx150x_gpio_set(struct gpio_chip *chip, unsigned int offset, } +static void sx150x_gpio_set_multiple(struct gpio_chip *chip, + unsigned long *mask, + unsigned long *bits) +{ + struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); + + regmap_write_bits(pctl->regmap, pctl->data->reg_data, *mask, *bits); +} + static int sx150x_gpio_direction_input(struct gpio_chip *chip, unsigned int offset) { @@ -996,6 +999,20 @@ static int sx150x_regmap_reg_write(void *context, unsigned int reg, return 0; } +static void sx150x_oscio_mask_init(struct sx150x_pinctrl *pctl) +{ + int pin; + + /* OSCIO pin is only present in 789 devices */ + if (pctl->data->model != SX150X_789) + return; + + for (pin = 0; pin < pctl->data->npins; ++pin) { + if (!strcmp(pctl->data->pins[pin].name, "oscio")) + pctl->oscio_mask |= BIT(pin); + } +} + static bool sx150x_reg_volatile(struct device *dev, unsigned int reg) { struct sx150x_pinctrl *pctl = i2c_get_clientdata(to_i2c_client(dev)); @@ -1045,6 +1062,8 @@ static int sx150x_probe(struct i2c_client *client, if (!pctl->data) return -EINVAL; + sx150x_oscio_mask_init(pctl); + pctl->regmap = devm_regmap_init(dev, NULL, pctl, &sx150x_regmap_config); if (IS_ERR(pctl->regmap)) { @@ -1069,6 +1088,8 @@ static int sx150x_probe(struct i2c_client *client, pctl->gpio.direction_output = sx150x_gpio_direction_output; pctl->gpio.get = sx150x_gpio_get; pctl->gpio.set = sx150x_gpio_set; + if (!pctl->oscio_mask) + pctl->gpio.set_multiple = sx150x_gpio_set_multiple; pctl->gpio.set_single_ended = sx150x_gpio_set_single_ended; pctl->gpio.parent = dev; #ifdef CONFIG_OF_GPIO -- 2.1.4