1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Intel Elkhart Lake PSE GPIO driver 4 * 5 * Copyright (c) 2023, 2025 Intel Corporation. 6 * 7 * Authors: Pandith N <pandith.n@intel.com> 8 * Raag Jadav <raag.jadav@intel.com> 9 */ 10 11 #include <linux/auxiliary_bus.h> 12 #include <linux/device.h> 13 #include <linux/err.h> 14 #include <linux/module.h> 15 #include <linux/pm.h> 16 17 #include <linux/ehl_pse_io_aux.h> 18 19 #include "gpio-tangier.h" 20 21 /* Each Intel EHL PSE GPIO Controller has 30 GPIO pins */ 22 #define EHL_PSE_NGPIO 30 23 24 static int ehl_gpio_probe(struct auxiliary_device *adev, const struct auxiliary_device_id *id) 25 { 26 struct device *dev = &adev->dev; 27 struct ehl_pse_io_data *data; 28 struct tng_gpio *priv; 29 int ret; 30 31 data = dev_get_platdata(dev); 32 if (!data) 33 return -ENODATA; 34 35 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 36 if (!priv) 37 return -ENOMEM; 38 39 priv->reg_base = devm_ioremap_resource(dev, &data->mem); 40 if (IS_ERR(priv->reg_base)) 41 return PTR_ERR(priv->reg_base); 42 43 priv->dev = dev; 44 priv->irq = data->irq; 45 46 priv->info.base = -1; 47 priv->info.ngpio = EHL_PSE_NGPIO; 48 49 priv->wake_regs.gwmr = GWMR_EHL; 50 priv->wake_regs.gwsr = GWSR_EHL; 51 priv->wake_regs.gsir = GSIR_EHL; 52 53 ret = devm_tng_gpio_probe(dev, priv); 54 if (ret) 55 return dev_err_probe(dev, ret, "tng_gpio_probe error\n"); 56 57 auxiliary_set_drvdata(adev, priv); 58 return 0; 59 } 60 61 static const struct auxiliary_device_id ehl_gpio_ids[] = { 62 { EHL_PSE_IO_NAME "." EHL_PSE_GPIO_NAME }, 63 { } 64 }; 65 MODULE_DEVICE_TABLE(auxiliary, ehl_gpio_ids); 66 67 static struct auxiliary_driver ehl_gpio_driver = { 68 .driver = { 69 .pm = pm_sleep_ptr(&tng_gpio_pm_ops), 70 }, 71 .probe = ehl_gpio_probe, 72 .id_table = ehl_gpio_ids, 73 }; 74 module_auxiliary_driver(ehl_gpio_driver); 75 76 MODULE_AUTHOR("Pandith N <pandith.n@intel.com>"); 77 MODULE_AUTHOR("Raag Jadav <raag.jadav@intel.com>"); 78 MODULE_DESCRIPTION("Intel Elkhart Lake PSE GPIO driver"); 79 MODULE_LICENSE("GPL"); 80 MODULE_IMPORT_NS("GPIO_TANGIER"); 81