|
16 | 16 | #define GPIO_DATA 0x20 |
17 | 17 | #define GPIO_OUTPUT 0x30 |
18 | 18 |
|
19 | | -static void __iomem *gpio_reg_base; |
| 19 | +struct ls1x_gpio_chip { |
| 20 | + struct gpio_chip gc; |
| 21 | + void __iomem *reg_base; |
| 22 | +}; |
20 | 23 |
|
21 | 24 | static int ls1x_gpio_request(struct gpio_chip *gc, unsigned int offset) |
22 | 25 | { |
| 26 | + struct ls1x_gpio_chip *ls1x_gc = gpiochip_get_data(gc); |
23 | 27 | unsigned long flags; |
24 | 28 |
|
25 | 29 | raw_spin_lock_irqsave(&gc->bgpio_lock, flags); |
26 | | - __raw_writel(__raw_readl(gpio_reg_base + GPIO_CFG) | BIT(offset), |
27 | | - gpio_reg_base + GPIO_CFG); |
| 30 | + __raw_writel(__raw_readl(ls1x_gc->reg_base + GPIO_CFG) | BIT(offset), |
| 31 | + ls1x_gc->reg_base + GPIO_CFG); |
28 | 32 | raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags); |
29 | 33 |
|
30 | 34 | return 0; |
31 | 35 | } |
32 | 36 |
|
33 | 37 | static void ls1x_gpio_free(struct gpio_chip *gc, unsigned int offset) |
34 | 38 | { |
| 39 | + struct ls1x_gpio_chip *ls1x_gc = gpiochip_get_data(gc); |
35 | 40 | unsigned long flags; |
36 | 41 |
|
37 | 42 | raw_spin_lock_irqsave(&gc->bgpio_lock, flags); |
38 | | - __raw_writel(__raw_readl(gpio_reg_base + GPIO_CFG) & ~BIT(offset), |
39 | | - gpio_reg_base + GPIO_CFG); |
| 43 | + __raw_writel(__raw_readl(ls1x_gc->reg_base + GPIO_CFG) & ~BIT(offset), |
| 44 | + ls1x_gc->reg_base + GPIO_CFG); |
40 | 45 | raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags); |
41 | 46 | } |
42 | 47 |
|
43 | 48 | static int ls1x_gpio_probe(struct platform_device *pdev) |
44 | 49 | { |
45 | 50 | struct device *dev = &pdev->dev; |
46 | | - struct gpio_chip *gc; |
| 51 | + struct ls1x_gpio_chip *ls1x_gc; |
47 | 52 | int ret; |
48 | 53 |
|
49 | | - gc = devm_kzalloc(dev, sizeof(*gc), GFP_KERNEL); |
50 | | - if (!gc) |
| 54 | + ls1x_gc = devm_kzalloc(dev, sizeof(*ls1x_gc), GFP_KERNEL); |
| 55 | + if (!ls1x_gc) |
51 | 56 | return -ENOMEM; |
52 | 57 |
|
53 | | - gpio_reg_base = devm_platform_ioremap_resource(pdev, 0); |
54 | | - if (IS_ERR(gpio_reg_base)) |
55 | | - return PTR_ERR(gpio_reg_base); |
| 58 | + ls1x_gc->reg_base = devm_platform_ioremap_resource(pdev, 0); |
| 59 | + if (IS_ERR(ls1x_gc->reg_base)) |
| 60 | + return PTR_ERR(ls1x_gc->reg_base); |
56 | 61 |
|
57 | | - ret = bgpio_init(gc, dev, 4, gpio_reg_base + GPIO_DATA, |
58 | | - gpio_reg_base + GPIO_OUTPUT, NULL, |
59 | | - NULL, gpio_reg_base + GPIO_DIR, 0); |
| 62 | + ret = bgpio_init(&ls1x_gc->gc, dev, 4, ls1x_gc->reg_base + GPIO_DATA, |
| 63 | + ls1x_gc->reg_base + GPIO_OUTPUT, NULL, |
| 64 | + NULL, ls1x_gc->reg_base + GPIO_DIR, 0); |
60 | 65 | if (ret) |
61 | 66 | goto err; |
62 | 67 |
|
63 | | - gc->owner = THIS_MODULE; |
64 | | - gc->request = ls1x_gpio_request; |
65 | | - gc->free = ls1x_gpio_free; |
66 | | - gc->base = pdev->id * 32; |
| 68 | + ls1x_gc->gc.owner = THIS_MODULE; |
| 69 | + ls1x_gc->gc.request = ls1x_gpio_request; |
| 70 | + ls1x_gc->gc.free = ls1x_gpio_free; |
| 71 | + ls1x_gc->gc.base = pdev->id * 32; |
67 | 72 |
|
68 | | - ret = devm_gpiochip_add_data(dev, gc, NULL); |
| 73 | + ret = devm_gpiochip_add_data(dev, &ls1x_gc->gc, ls1x_gc); |
69 | 74 | if (ret) |
70 | 75 | goto err; |
71 | 76 |
|
72 | | - platform_set_drvdata(pdev, gc); |
| 77 | + platform_set_drvdata(pdev, ls1x_gc); |
73 | 78 | dev_info(dev, "Loongson1 GPIO driver registered\n"); |
74 | 79 |
|
75 | 80 | return 0; |
|
0 commit comments