18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Common CPM GPIO wrapper for the CPM GPIO ports
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Author: Christophe Leroy <christophe.leroy@c-s.fr>
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Copyright 2017 CS Systemes d'Information.
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/module.h>
128c2ecf20Sopenharmony_ci#include <linux/of_device.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <asm/cpm.h>
158c2ecf20Sopenharmony_ci#ifdef CONFIG_8xx_GPIO
168c2ecf20Sopenharmony_ci#include <asm/cpm1.h>
178c2ecf20Sopenharmony_ci#endif
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cistatic int cpm_gpio_probe(struct platform_device *ofdev)
208c2ecf20Sopenharmony_ci{
218c2ecf20Sopenharmony_ci	struct device *dev = &ofdev->dev;
228c2ecf20Sopenharmony_ci	int (*gp_add)(struct device *dev) = of_device_get_match_data(dev);
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	if (!gp_add)
258c2ecf20Sopenharmony_ci		return -ENODEV;
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	return gp_add(dev);
288c2ecf20Sopenharmony_ci}
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic const struct of_device_id cpm_gpio_match[] = {
318c2ecf20Sopenharmony_ci#ifdef CONFIG_8xx_GPIO
328c2ecf20Sopenharmony_ci	{
338c2ecf20Sopenharmony_ci		.compatible = "fsl,cpm1-pario-bank-a",
348c2ecf20Sopenharmony_ci		.data = cpm1_gpiochip_add16,
358c2ecf20Sopenharmony_ci	},
368c2ecf20Sopenharmony_ci	{
378c2ecf20Sopenharmony_ci		.compatible = "fsl,cpm1-pario-bank-b",
388c2ecf20Sopenharmony_ci		.data = cpm1_gpiochip_add32,
398c2ecf20Sopenharmony_ci	},
408c2ecf20Sopenharmony_ci	{
418c2ecf20Sopenharmony_ci		.compatible = "fsl,cpm1-pario-bank-c",
428c2ecf20Sopenharmony_ci		.data = cpm1_gpiochip_add16,
438c2ecf20Sopenharmony_ci	},
448c2ecf20Sopenharmony_ci	{
458c2ecf20Sopenharmony_ci		.compatible = "fsl,cpm1-pario-bank-d",
468c2ecf20Sopenharmony_ci		.data = cpm1_gpiochip_add16,
478c2ecf20Sopenharmony_ci	},
488c2ecf20Sopenharmony_ci	/* Port E uses CPM2 layout */
498c2ecf20Sopenharmony_ci	{
508c2ecf20Sopenharmony_ci		.compatible = "fsl,cpm1-pario-bank-e",
518c2ecf20Sopenharmony_ci		.data = cpm2_gpiochip_add32,
528c2ecf20Sopenharmony_ci	},
538c2ecf20Sopenharmony_ci#endif
548c2ecf20Sopenharmony_ci	{
558c2ecf20Sopenharmony_ci		.compatible = "fsl,cpm2-pario-bank",
568c2ecf20Sopenharmony_ci		.data = cpm2_gpiochip_add32,
578c2ecf20Sopenharmony_ci	},
588c2ecf20Sopenharmony_ci	{},
598c2ecf20Sopenharmony_ci};
608c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(of, cpm_gpio_match);
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_cistatic struct platform_driver cpm_gpio_driver = {
638c2ecf20Sopenharmony_ci	.probe		= cpm_gpio_probe,
648c2ecf20Sopenharmony_ci	.driver		= {
658c2ecf20Sopenharmony_ci		.name	= "cpm-gpio",
668c2ecf20Sopenharmony_ci		.of_match_table	= cpm_gpio_match,
678c2ecf20Sopenharmony_ci	},
688c2ecf20Sopenharmony_ci};
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cistatic int __init cpm_gpio_init(void)
718c2ecf20Sopenharmony_ci{
728c2ecf20Sopenharmony_ci	return platform_driver_register(&cpm_gpio_driver);
738c2ecf20Sopenharmony_ci}
748c2ecf20Sopenharmony_ciarch_initcall(cpm_gpio_init);
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ciMODULE_AUTHOR("Christophe Leroy <christophe.leroy@c-s.fr>");
778c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Driver for CPM GPIO");
788c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL");
798c2ecf20Sopenharmony_ciMODULE_ALIAS("platform:cpm-gpio");
80