1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright Intel Corporation (C) 2014-2016. All Rights Reserved
5 * GPIO driver for Altera Arria10 MAX5 System Resource Chip
7 * Adapted from gpio-tps65910.c
10 #include <linux/gpio/driver.h>
11 #include <linux/mfd/altera-a10sr.h>
12 #include <linux/module.h>
15 * struct altr_a10sr_gpio - Altera Max5 GPIO device private data structure
16 * @gp: : instance of the gpio_chip
17 * @regmap: the regmap from the parent device.
19 struct altr_a10sr_gpio
{
21 struct regmap
*regmap
;
24 static int altr_a10sr_gpio_get(struct gpio_chip
*chip
, unsigned int offset
)
26 struct altr_a10sr_gpio
*gpio
= gpiochip_get_data(chip
);
29 ret
= regmap_read(gpio
->regmap
, ALTR_A10SR_PBDSW_REG
, &val
);
33 return !!(val
& BIT(offset
- ALTR_A10SR_LED_VALID_SHIFT
));
36 static void altr_a10sr_gpio_set(struct gpio_chip
*chip
, unsigned int offset
,
39 struct altr_a10sr_gpio
*gpio
= gpiochip_get_data(chip
);
41 regmap_update_bits(gpio
->regmap
, ALTR_A10SR_LED_REG
,
42 BIT(ALTR_A10SR_LED_VALID_SHIFT
+ offset
),
43 value
? BIT(ALTR_A10SR_LED_VALID_SHIFT
+ offset
)
47 static int altr_a10sr_gpio_direction_input(struct gpio_chip
*gc
,
50 if (nr
< (ALTR_A10SR_IN_VALID_RANGE_LO
- ALTR_A10SR_LED_VALID_SHIFT
))
56 static int altr_a10sr_gpio_direction_output(struct gpio_chip
*gc
,
57 unsigned int nr
, int value
)
59 if (nr
> (ALTR_A10SR_OUT_VALID_RANGE_HI
- ALTR_A10SR_LED_VALID_SHIFT
))
62 altr_a10sr_gpio_set(gc
, nr
, value
);
66 static const struct gpio_chip altr_a10sr_gc
= {
67 .label
= "altr_a10sr_gpio",
69 .get
= altr_a10sr_gpio_get
,
70 .set
= altr_a10sr_gpio_set
,
71 .direction_input
= altr_a10sr_gpio_direction_input
,
72 .direction_output
= altr_a10sr_gpio_direction_output
,
78 static int altr_a10sr_gpio_probe(struct platform_device
*pdev
)
80 struct altr_a10sr_gpio
*gpio
;
82 struct altr_a10sr
*a10sr
= dev_get_drvdata(pdev
->dev
.parent
);
84 gpio
= devm_kzalloc(&pdev
->dev
, sizeof(*gpio
), GFP_KERNEL
);
88 gpio
->regmap
= a10sr
->regmap
;
90 gpio
->gp
= altr_a10sr_gc
;
91 gpio
->gp
.parent
= pdev
->dev
.parent
;
92 gpio
->gp
.of_node
= pdev
->dev
.of_node
;
94 ret
= devm_gpiochip_add_data(&pdev
->dev
, &gpio
->gp
, gpio
);
96 dev_err(&pdev
->dev
, "Could not register gpiochip, %d\n", ret
);
100 platform_set_drvdata(pdev
, gpio
);
105 static const struct of_device_id altr_a10sr_gpio_of_match
[] = {
106 { .compatible
= "altr,a10sr-gpio" },
109 MODULE_DEVICE_TABLE(of
, altr_a10sr_gpio_of_match
);
111 static struct platform_driver altr_a10sr_gpio_driver
= {
112 .probe
= altr_a10sr_gpio_probe
,
114 .name
= "altr_a10sr_gpio",
115 .of_match_table
= of_match_ptr(altr_a10sr_gpio_of_match
),
118 module_platform_driver(altr_a10sr_gpio_driver
);
120 MODULE_LICENSE("GPL v2");
121 MODULE_AUTHOR("Thor Thayer <tthayer@opensource.altera.com>");
122 MODULE_DESCRIPTION("Altera Arria10 System Resource Chip GPIO");