162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2006 - Florian Fainelli <florian@openwrt.org>
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Control the Cobalt Qube/RaQ front LED
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#include <linux/io.h>
862306a36Sopenharmony_ci#include <linux/ioport.h>
962306a36Sopenharmony_ci#include <linux/leds.h>
1062306a36Sopenharmony_ci#include <linux/module.h>
1162306a36Sopenharmony_ci#include <linux/platform_device.h>
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define LED_FRONT_LEFT	0x01
1562306a36Sopenharmony_ci#define LED_FRONT_RIGHT	0x02
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic void __iomem *led_port;
1862306a36Sopenharmony_cistatic u8 led_value;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic void qube_front_led_set(struct led_classdev *led_cdev,
2162306a36Sopenharmony_ci			       enum led_brightness brightness)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	if (brightness)
2462306a36Sopenharmony_ci		led_value = LED_FRONT_LEFT | LED_FRONT_RIGHT;
2562306a36Sopenharmony_ci	else
2662306a36Sopenharmony_ci		led_value = ~(LED_FRONT_LEFT | LED_FRONT_RIGHT);
2762306a36Sopenharmony_ci	writeb(led_value, led_port);
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistatic struct led_classdev qube_front_led = {
3162306a36Sopenharmony_ci	.name			= "qube::front",
3262306a36Sopenharmony_ci	.brightness		= LED_FULL,
3362306a36Sopenharmony_ci	.brightness_set		= qube_front_led_set,
3462306a36Sopenharmony_ci	.default_trigger	= "default-on",
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistatic int cobalt_qube_led_probe(struct platform_device *pdev)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	struct resource *res;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
4262306a36Sopenharmony_ci	if (!res)
4362306a36Sopenharmony_ci		return -EBUSY;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	led_port = devm_ioremap(&pdev->dev, res->start, resource_size(res));
4662306a36Sopenharmony_ci	if (!led_port)
4762306a36Sopenharmony_ci		return -ENOMEM;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	led_value = LED_FRONT_LEFT | LED_FRONT_RIGHT;
5062306a36Sopenharmony_ci	writeb(led_value, led_port);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	return devm_led_classdev_register(&pdev->dev, &qube_front_led);
5362306a36Sopenharmony_ci}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic struct platform_driver cobalt_qube_led_driver = {
5662306a36Sopenharmony_ci	.probe	= cobalt_qube_led_probe,
5762306a36Sopenharmony_ci	.driver	= {
5862306a36Sopenharmony_ci		.name	= "cobalt-qube-leds",
5962306a36Sopenharmony_ci	},
6062306a36Sopenharmony_ci};
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cimodule_platform_driver(cobalt_qube_led_driver);
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciMODULE_LICENSE("GPL");
6562306a36Sopenharmony_ciMODULE_DESCRIPTION("Front LED support for Cobalt Server");
6662306a36Sopenharmony_ciMODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>");
6762306a36Sopenharmony_ciMODULE_ALIAS("platform:cobalt-qube-leds");
68