123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /*
- * MEN 14F021P00 Board Management Controller (BMC) LEDs Driver.
- *
- * This is the core LED driver of the MEN 14F021P00 BMC.
- * There are four LEDs available which can be switched on and off.
- * STATUS LED, HOT SWAP LED, USER LED 1, USER LED 2
- *
- * Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/platform_device.h>
- #include <linux/leds.h>
- #include <linux/i2c.h>
- #define BMC_CMD_LED_GET_SET 0xA0
- #define BMC_BIT_LED_STATUS BIT(0)
- #define BMC_BIT_LED_HOTSWAP BIT(1)
- #define BMC_BIT_LED_USER1 BIT(2)
- #define BMC_BIT_LED_USER2 BIT(3)
- struct menf21bmc_led {
- struct led_classdev cdev;
- u8 led_bit;
- const char *name;
- struct i2c_client *i2c_client;
- };
- static struct menf21bmc_led leds[] = {
- {
- .name = "menf21bmc:led_status",
- .led_bit = BMC_BIT_LED_STATUS,
- },
- {
- .name = "menf21bmc:led_hotswap",
- .led_bit = BMC_BIT_LED_HOTSWAP,
- },
- {
- .name = "menf21bmc:led_user1",
- .led_bit = BMC_BIT_LED_USER1,
- },
- {
- .name = "menf21bmc:led_user2",
- .led_bit = BMC_BIT_LED_USER2,
- }
- };
- static DEFINE_MUTEX(led_lock);
- static void
- menf21bmc_led_set(struct led_classdev *led_cdev, enum led_brightness value)
- {
- int led_val;
- struct menf21bmc_led *led = container_of(led_cdev,
- struct menf21bmc_led, cdev);
- mutex_lock(&led_lock);
- led_val = i2c_smbus_read_byte_data(led->i2c_client,
- BMC_CMD_LED_GET_SET);
- if (led_val < 0)
- goto err_out;
- if (value == LED_OFF)
- led_val &= ~led->led_bit;
- else
- led_val |= led->led_bit;
- i2c_smbus_write_byte_data(led->i2c_client,
- BMC_CMD_LED_GET_SET, led_val);
- err_out:
- mutex_unlock(&led_lock);
- }
- static int menf21bmc_led_probe(struct platform_device *pdev)
- {
- int i;
- int ret;
- struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
- for (i = 0; i < ARRAY_SIZE(leds); i++) {
- leds[i].cdev.name = leds[i].name;
- leds[i].cdev.brightness_set = menf21bmc_led_set;
- leds[i].i2c_client = i2c_client;
- ret = devm_led_classdev_register(&pdev->dev, &leds[i].cdev);
- if (ret < 0) {
- dev_err(&pdev->dev, "failed to register LED device\n");
- return ret;
- }
- }
- dev_info(&pdev->dev, "MEN 140F21P00 BMC LED device enabled\n");
- return 0;
- }
- static struct platform_driver menf21bmc_led = {
- .probe = menf21bmc_led_probe,
- .driver = {
- .name = "menf21bmc_led",
- },
- };
- module_platform_driver(menf21bmc_led);
- MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
- MODULE_DESCRIPTION("MEN 14F021P00 BMC led driver");
- MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("platform:menf21bmc_led");
|