2 * GPIO Driver for Loongson 1 SoC
4 * Copyright (C) 2015-2016 Zhang, Keguang <keguang.zhang@gmail.com>
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
11 #include <linux/module.h>
12 #include <linux/gpio/driver.h>
13 #include <linux/platform_device.h>
15 /* Loongson 1 GPIO Register Definitions */
18 #define GPIO_DATA 0x20
19 #define GPIO_OUTPUT 0x30
21 static void __iomem
*gpio_reg_base
;
23 static int ls1x_gpio_request(struct gpio_chip
*gc
, unsigned int offset
)
25 unsigned long pinmask
= gc
->pin2mask(gc
, offset
);
28 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
29 __raw_writel(__raw_readl(gpio_reg_base
+ GPIO_CFG
) | pinmask
,
30 gpio_reg_base
+ GPIO_CFG
);
31 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
36 static void ls1x_gpio_free(struct gpio_chip
*gc
, unsigned int offset
)
38 unsigned long pinmask
= gc
->pin2mask(gc
, offset
);
41 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
42 __raw_writel(__raw_readl(gpio_reg_base
+ GPIO_CFG
) & ~pinmask
,
43 gpio_reg_base
+ GPIO_CFG
);
44 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
47 static int ls1x_gpio_probe(struct platform_device
*pdev
)
49 struct device
*dev
= &pdev
->dev
;
54 gc
= devm_kzalloc(dev
, sizeof(*gc
), GFP_KERNEL
);
58 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
59 gpio_reg_base
= devm_ioremap_resource(dev
, res
);
60 if (IS_ERR(gpio_reg_base
))
61 return PTR_ERR(gpio_reg_base
);
63 ret
= bgpio_init(gc
, dev
, 4, gpio_reg_base
+ GPIO_DATA
,
64 gpio_reg_base
+ GPIO_OUTPUT
, NULL
,
65 NULL
, gpio_reg_base
+ GPIO_DIR
, 0);
69 gc
->owner
= THIS_MODULE
;
70 gc
->request
= ls1x_gpio_request
;
71 gc
->free
= ls1x_gpio_free
;
72 gc
->base
= pdev
->id
* 32;
74 ret
= devm_gpiochip_add_data(dev
, gc
, NULL
);
78 platform_set_drvdata(pdev
, gc
);
79 dev_info(dev
, "Loongson1 GPIO driver registered\n");
83 dev_err(dev
, "failed to register GPIO device\n");
87 static struct platform_driver ls1x_gpio_driver
= {
88 .probe
= ls1x_gpio_probe
,
94 module_platform_driver(ls1x_gpio_driver
);
96 MODULE_AUTHOR("Kelvin Cheung <keguang.zhang@gmail.com>");
97 MODULE_DESCRIPTION("Loongson1 GPIO driver");
98 MODULE_LICENSE("GPL");