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>
14 #include <linux/bitops.h>
16 /* Loongson 1 GPIO Register Definitions */
19 #define GPIO_DATA 0x20
20 #define GPIO_OUTPUT 0x30
22 static void __iomem
*gpio_reg_base
;
24 static int ls1x_gpio_request(struct gpio_chip
*gc
, unsigned int offset
)
28 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
29 __raw_writel(__raw_readl(gpio_reg_base
+ GPIO_CFG
) | BIT(offset
),
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
)
40 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
41 __raw_writel(__raw_readl(gpio_reg_base
+ GPIO_CFG
) & ~BIT(offset
),
42 gpio_reg_base
+ GPIO_CFG
);
43 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
46 static int ls1x_gpio_probe(struct platform_device
*pdev
)
48 struct device
*dev
= &pdev
->dev
;
53 gc
= devm_kzalloc(dev
, sizeof(*gc
), GFP_KERNEL
);
57 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
58 gpio_reg_base
= devm_ioremap_resource(dev
, res
);
59 if (IS_ERR(gpio_reg_base
))
60 return PTR_ERR(gpio_reg_base
);
62 ret
= bgpio_init(gc
, dev
, 4, gpio_reg_base
+ GPIO_DATA
,
63 gpio_reg_base
+ GPIO_OUTPUT
, NULL
,
64 NULL
, gpio_reg_base
+ GPIO_DIR
, 0);
68 gc
->owner
= THIS_MODULE
;
69 gc
->request
= ls1x_gpio_request
;
70 gc
->free
= ls1x_gpio_free
;
71 gc
->base
= pdev
->id
* 32;
73 ret
= devm_gpiochip_add_data(dev
, gc
, NULL
);
77 platform_set_drvdata(pdev
, gc
);
78 dev_info(dev
, "Loongson1 GPIO driver registered\n");
82 dev_err(dev
, "failed to register GPIO device\n");
86 static struct platform_driver ls1x_gpio_driver
= {
87 .probe
= ls1x_gpio_probe
,
93 module_platform_driver(ls1x_gpio_driver
);
95 MODULE_AUTHOR("Kelvin Cheung <keguang.zhang@gmail.com>");
96 MODULE_DESCRIPTION("Loongson1 GPIO driver");
97 MODULE_LICENSE("GPL");