xref: /openbmc/linux/drivers/leds/leds-ip30.c (revision 7a72f33b)
164d7e231SThomas Bogendoerfer // SPDX-License-Identifier: GPL-2.0
264d7e231SThomas Bogendoerfer /*
364d7e231SThomas Bogendoerfer  * LED Driver for SGI Octane machines
464d7e231SThomas Bogendoerfer  */
564d7e231SThomas Bogendoerfer 
62aebb780SMarek Behún #include <asm/io.h>
764d7e231SThomas Bogendoerfer #include <linux/module.h>
864d7e231SThomas Bogendoerfer #include <linux/kernel.h>
964d7e231SThomas Bogendoerfer #include <linux/platform_device.h>
1064d7e231SThomas Bogendoerfer #include <linux/leds.h>
1164d7e231SThomas Bogendoerfer 
1264d7e231SThomas Bogendoerfer #define IP30_LED_SYSTEM	0
1364d7e231SThomas Bogendoerfer #define IP30_LED_FAULT	1
1464d7e231SThomas Bogendoerfer 
1564d7e231SThomas Bogendoerfer struct ip30_led {
1664d7e231SThomas Bogendoerfer 	struct led_classdev cdev;
1764d7e231SThomas Bogendoerfer 	u32 __iomem *reg;
1864d7e231SThomas Bogendoerfer };
1964d7e231SThomas Bogendoerfer 
ip30led_set(struct led_classdev * led_cdev,enum led_brightness value)2064d7e231SThomas Bogendoerfer static void ip30led_set(struct led_classdev *led_cdev,
2164d7e231SThomas Bogendoerfer 			enum led_brightness value)
2264d7e231SThomas Bogendoerfer {
2364d7e231SThomas Bogendoerfer 	struct ip30_led *led = container_of(led_cdev, struct ip30_led, cdev);
2464d7e231SThomas Bogendoerfer 
2564d7e231SThomas Bogendoerfer 	writel(value, led->reg);
2664d7e231SThomas Bogendoerfer }
2764d7e231SThomas Bogendoerfer 
ip30led_create(struct platform_device * pdev,int num)2864d7e231SThomas Bogendoerfer static int ip30led_create(struct platform_device *pdev, int num)
2964d7e231SThomas Bogendoerfer {
3064d7e231SThomas Bogendoerfer 	struct ip30_led *data;
3164d7e231SThomas Bogendoerfer 
3264d7e231SThomas Bogendoerfer 	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
3364d7e231SThomas Bogendoerfer 	if (!data)
3464d7e231SThomas Bogendoerfer 		return -ENOMEM;
3564d7e231SThomas Bogendoerfer 
36*7a72f33bSYangtao Li 	data->reg = devm_platform_ioremap_resource(pdev, num);
3764d7e231SThomas Bogendoerfer 	if (IS_ERR(data->reg))
3864d7e231SThomas Bogendoerfer 		return PTR_ERR(data->reg);
3964d7e231SThomas Bogendoerfer 
4064d7e231SThomas Bogendoerfer 	switch (num) {
4164d7e231SThomas Bogendoerfer 	case IP30_LED_SYSTEM:
4219aa9840SPavel Machek 		data->cdev.name = "white:power";
4364d7e231SThomas Bogendoerfer 		break;
4464d7e231SThomas Bogendoerfer 	case IP30_LED_FAULT:
4564d7e231SThomas Bogendoerfer 		data->cdev.name = "red:fault";
4664d7e231SThomas Bogendoerfer 		break;
4764d7e231SThomas Bogendoerfer 	default:
4864d7e231SThomas Bogendoerfer 		return -EINVAL;
4964d7e231SThomas Bogendoerfer 	}
5064d7e231SThomas Bogendoerfer 
5164d7e231SThomas Bogendoerfer 	data->cdev.brightness = readl(data->reg);
5264d7e231SThomas Bogendoerfer 	data->cdev.max_brightness = 1;
5364d7e231SThomas Bogendoerfer 	data->cdev.brightness_set = ip30led_set;
5464d7e231SThomas Bogendoerfer 
5564d7e231SThomas Bogendoerfer 	return devm_led_classdev_register(&pdev->dev, &data->cdev);
5664d7e231SThomas Bogendoerfer }
5764d7e231SThomas Bogendoerfer 
ip30led_probe(struct platform_device * pdev)5864d7e231SThomas Bogendoerfer static int ip30led_probe(struct platform_device *pdev)
5964d7e231SThomas Bogendoerfer {
6064d7e231SThomas Bogendoerfer 	int ret;
6164d7e231SThomas Bogendoerfer 
6264d7e231SThomas Bogendoerfer 	ret = ip30led_create(pdev, IP30_LED_SYSTEM);
6364d7e231SThomas Bogendoerfer 	if (ret < 0)
6464d7e231SThomas Bogendoerfer 		return ret;
6564d7e231SThomas Bogendoerfer 
6664d7e231SThomas Bogendoerfer 	return ip30led_create(pdev, IP30_LED_FAULT);
6764d7e231SThomas Bogendoerfer }
6864d7e231SThomas Bogendoerfer 
6964d7e231SThomas Bogendoerfer static struct platform_driver ip30led_driver = {
7064d7e231SThomas Bogendoerfer 	.probe		= ip30led_probe,
7164d7e231SThomas Bogendoerfer 	.driver		= {
7264d7e231SThomas Bogendoerfer 		.name		= "ip30-leds",
7364d7e231SThomas Bogendoerfer 	},
7464d7e231SThomas Bogendoerfer };
7564d7e231SThomas Bogendoerfer 
7664d7e231SThomas Bogendoerfer module_platform_driver(ip30led_driver);
7764d7e231SThomas Bogendoerfer 
7864d7e231SThomas Bogendoerfer MODULE_AUTHOR("Thomas Bogendoerfer <tbogendoerfer@suse.de>");
7964d7e231SThomas Bogendoerfer MODULE_DESCRIPTION("SGI Octane LED driver");
8064d7e231SThomas Bogendoerfer MODULE_LICENSE("GPL");
8164d7e231SThomas Bogendoerfer MODULE_ALIAS("platform:ip30-leds");
82