brintos

brintos / linux-shallow public Read only

0
0
Text · 2.8 KiB · 9bc5f36 Raw
109 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Siemens SIMATIC IPC driver for GPIO based LEDs4 *5 * Copyright (c) Siemens AG, 20236 *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	case SIMATIC_IPC_DEVICE_BX_59A:60		break;61	default:62		return -ENODEV;63	}64 65	gpiod_add_lookup_table(table);66	simatic_leds_pdev = platform_device_register_resndata(NULL,67		"leds-gpio", PLATFORM_DEVID_NONE, NULL, 0,68		&simatic_ipc_gpio_leds_pdata,69		sizeof(simatic_ipc_gpio_leds_pdata));70	if (IS_ERR(simatic_leds_pdev)) {71		err = PTR_ERR(simatic_leds_pdev);72		goto out;73	}74 75	if (!table_extra)76		return 0;77 78	table_extra->dev_id = dev_name(dev);79	gpiod_add_lookup_table(table_extra);80 81	/* PM_BIOS_BOOT_N */82	gpiod = gpiod_get_index(dev, NULL, 6, GPIOD_OUT_LOW);83	if (IS_ERR(gpiod)) {84		err = PTR_ERR(gpiod);85		goto out;86	}87	gpiod_put(gpiod);88 89	/* PM_WDT_OUT */90	gpiod = gpiod_get_index(dev, NULL, 7, GPIOD_OUT_LOW);91	if (IS_ERR(gpiod)) {92		err = PTR_ERR(gpiod);93		goto out;94	}95	gpiod_put(gpiod);96 97	return 0;98out:99	simatic_ipc_leds_gpio_remove(pdev, table, table_extra);100 101	return err;102}103EXPORT_SYMBOL_GPL(simatic_ipc_leds_gpio_probe);104 105MODULE_DESCRIPTION("Siemens SIMATIC IPC core driver for GPIO based LEDs");106MODULE_LICENSE("GPL v2");107MODULE_SOFTDEP("pre: platform:leds-gpio");108MODULE_AUTHOR("Henning Schild <henning.schild@siemens.com>");109