Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * Siemens SIMATIC IPC driver for GPIO based LEDs
  4 *
  5 * Copyright (c) Siemens AG, 2023
  6 *
  7 * Author:
  8 *  Henning Schild <henning.schild@siemens.com>
  9 */
 10
 11#include <linux/gpio/machine.h>
 12#include <linux/gpio/consumer.h>
 13#include <linux/leds.h>
 14#include <linux/module.h>
 15#include <linux/platform_device.h>
 16#include <linux/platform_data/x86/simatic-ipc-base.h>
 17
 18#include "simatic-ipc-leds-gpio.h"
 19
 20static struct platform_device *simatic_leds_pdev;
 21
 22static const struct gpio_led simatic_ipc_gpio_leds[] = {
 23	{ .name = "red:" LED_FUNCTION_STATUS "-1" },
 24	{ .name = "green:" LED_FUNCTION_STATUS "-1" },
 25	{ .name = "red:" LED_FUNCTION_STATUS "-2" },
 26	{ .name = "green:" LED_FUNCTION_STATUS "-2" },
 27	{ .name = "red:" LED_FUNCTION_STATUS "-3" },
 28	{ .name = "green:" LED_FUNCTION_STATUS "-3" },
 29};
 30
 31static const struct gpio_led_platform_data simatic_ipc_gpio_leds_pdata = {
 32	.num_leds	= ARRAY_SIZE(simatic_ipc_gpio_leds),
 33	.leds		= simatic_ipc_gpio_leds,
 34};
 35
 36void simatic_ipc_leds_gpio_remove(struct platform_device *pdev,
 37				 struct gpiod_lookup_table *table,
 38				 struct gpiod_lookup_table *table_extra)
 39{
 40	gpiod_remove_lookup_table(table);
 41	gpiod_remove_lookup_table(table_extra);
 42	platform_device_unregister(simatic_leds_pdev);
 43}
 44EXPORT_SYMBOL_GPL(simatic_ipc_leds_gpio_remove);
 45
 46int simatic_ipc_leds_gpio_probe(struct platform_device *pdev,
 47				struct gpiod_lookup_table *table,
 48				struct gpiod_lookup_table *table_extra)
 49{
 50	const struct simatic_ipc_platform *plat = pdev->dev.platform_data;
 51	struct device *dev = &pdev->dev;
 52	struct gpio_desc *gpiod;
 53	int err;
 54
 55	switch (plat->devmode) {
 56	case SIMATIC_IPC_DEVICE_127E:
 57	case SIMATIC_IPC_DEVICE_227G:
 58	case SIMATIC_IPC_DEVICE_BX_21A:
 59		break;
 60	default:
 61		return -ENODEV;
 62	}
 63
 64	gpiod_add_lookup_table(table);
 65	simatic_leds_pdev = platform_device_register_resndata(NULL,
 66		"leds-gpio", PLATFORM_DEVID_NONE, NULL, 0,
 67		&simatic_ipc_gpio_leds_pdata,
 68		sizeof(simatic_ipc_gpio_leds_pdata));
 69	if (IS_ERR(simatic_leds_pdev)) {
 70		err = PTR_ERR(simatic_leds_pdev);
 71		goto out;
 72	}
 73
 74	if (!table_extra)
 75		return 0;
 76
 77	table_extra->dev_id = dev_name(dev);
 78	gpiod_add_lookup_table(table_extra);
 79
 80	/* PM_BIOS_BOOT_N */
 81	gpiod = gpiod_get_index(dev, NULL, 6, GPIOD_OUT_LOW);
 82	if (IS_ERR(gpiod)) {
 83		err = PTR_ERR(gpiod);
 84		goto out;
 85	}
 86	gpiod_put(gpiod);
 87
 88	/* PM_WDT_OUT */
 89	gpiod = gpiod_get_index(dev, NULL, 7, GPIOD_OUT_LOW);
 90	if (IS_ERR(gpiod)) {
 91		err = PTR_ERR(gpiod);
 92		goto out;
 93	}
 94	gpiod_put(gpiod);
 95
 96	return 0;
 97out:
 98	simatic_ipc_leds_gpio_remove(pdev, table, table_extra);
 99
100	return err;
101}
102EXPORT_SYMBOL_GPL(simatic_ipc_leds_gpio_probe);
103
104MODULE_LICENSE("GPL v2");
105MODULE_SOFTDEP("pre: platform:leds-gpio");
106MODULE_AUTHOR("Henning Schild <henning.schild@siemens.com>");