Lines Matching +full:smc +full:- +full:gpio

1 // SPDX-License-Identifier: GPL-2.0-only OR MIT
3 * Apple SMC GPIO driver
6 * This driver implements basic SMC PMU GPIO support that can read inputs
12 #include <linux/gpio/driver.h>
19 * Commands 0-6 are, presumably, the intended API.
73 struct apple_smc *smc; member
85 return -1; in macsmc_gpio_nr()
97 struct apple_smc *smc = smcgp->smc; in macsmc_gpio_find_first_gpio_index() local
103 ret = apple_smc_get_key_by_index(smc, 0, &first_key); in macsmc_gpio_find_first_gpio_index()
107 return -ENODEV; in macsmc_gpio_find_first_gpio_index()
109 ret = apple_smc_get_key_by_index(smc, smc->key_count - 1, &last_key); in macsmc_gpio_find_first_gpio_index()
113 return -ENODEV; in macsmc_gpio_find_first_gpio_index()
115 /* Binary search to find index of first SMC key bigger or equal to key */ in macsmc_gpio_find_first_gpio_index()
117 count = smc->key_count; in macsmc_gpio_find_first_gpio_index()
120 int pivot = start + ((count - 1) >> 1); in macsmc_gpio_find_first_gpio_index()
122 ret = apple_smc_get_key_by_index(smc, pivot, &pkey); in macsmc_gpio_find_first_gpio_index()
132 count -= pivot - start; in macsmc_gpio_find_first_gpio_index()
135 count = pivot - start; in macsmc_gpio_find_first_gpio_index()
150 ret = apple_smc_rw_u32(smcgp->smc, key, CMD_PINMODE, &val); in macsmc_gpio_get_direction()
158 ret = apple_smc_rw_u32(smcgp->smc, key, CMD_IRQ_MODE, &val); in macsmc_gpio_get_direction()
178 ret = apple_smc_rw_u32(smcgp->smc, key, cmd, &val); in macsmc_gpio_get()
192 ret = apple_smc_write_u32(smcgp->smc, key, CMD_OUTPUT | value); in macsmc_gpio_set()
194 dev_err(smcgp->dev, "GPIO set failed %p4ch = 0x%x\n", in macsmc_gpio_set()
207 count = min(smcgp->smc->key_count, MAX_GPIO); in macsmc_gpio_init_valid_mask()
215 ret = apple_smc_get_key_by_index(smcgp->smc, smcgp->first_index + i, &key); in macsmc_gpio_init_valid_mask()
224 dev_err(smcgp->dev, "Bad GPIO key %p4ch\n", &key); in macsmc_gpio_init_valid_mask()
237 struct apple_smc *smc = dev_get_drvdata(pdev->dev.parent); in macsmc_gpio_probe() local
241 smcgp = devm_kzalloc(&pdev->dev, sizeof(*smcgp), GFP_KERNEL); in macsmc_gpio_probe()
243 return -ENOMEM; in macsmc_gpio_probe()
245 smcgp->dev = &pdev->dev; in macsmc_gpio_probe()
246 smcgp->smc = smc; in macsmc_gpio_probe()
248 smcgp->first_index = macsmc_gpio_find_first_gpio_index(smcgp); in macsmc_gpio_probe()
249 if (smcgp->first_index < 0) in macsmc_gpio_probe()
250 return smcgp->first_index; in macsmc_gpio_probe()
252 ret = apple_smc_get_key_by_index(smc, smcgp->first_index, &key); in macsmc_gpio_probe()
256 if (key > macsmc_gpio_key(MAX_GPIO - 1)) in macsmc_gpio_probe()
257 return -ENODEV; in macsmc_gpio_probe()
259 dev_info(smcgp->dev, "First GPIO key: %p4ch\n", &key); in macsmc_gpio_probe()
261 smcgp->gc.label = "macsmc-pmu-gpio"; in macsmc_gpio_probe()
262 smcgp->gc.owner = THIS_MODULE; in macsmc_gpio_probe()
263 smcgp->gc.get = macsmc_gpio_get; in macsmc_gpio_probe()
264 smcgp->gc.set = macsmc_gpio_set; in macsmc_gpio_probe()
265 smcgp->gc.get_direction = macsmc_gpio_get_direction; in macsmc_gpio_probe()
266 smcgp->gc.init_valid_mask = macsmc_gpio_init_valid_mask; in macsmc_gpio_probe()
267 smcgp->gc.can_sleep = true; in macsmc_gpio_probe()
268 smcgp->gc.ngpio = MAX_GPIO; in macsmc_gpio_probe()
269 smcgp->gc.base = -1; in macsmc_gpio_probe()
270 smcgp->gc.parent = &pdev->dev; in macsmc_gpio_probe()
272 return devm_gpiochip_add_data(&pdev->dev, &smcgp->gc, smcgp); in macsmc_gpio_probe()
276 { .compatible = "apple,smc-gpio", },
283 .name = "macsmc-gpio",
292 MODULE_DESCRIPTION("Apple SMC GPIO driver");