brintos

brintos / linux-shallow public Read only

0
0
Text · 2.3 KiB · 09fd88a Raw
90 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (C) 2019 Sven Van Asbroeck4 */5 6#include <linux/leds.h>7#include <linux/module.h>8#include <linux/platform_device.h>9#include <linux/mfd/tps6105x.h>10#include <linux/regmap.h>11 12struct tps6105x_priv {13	struct regmap *regmap;14	struct led_classdev cdev;15	struct fwnode_handle *fwnode;16};17 18static void tps6105x_handle_put(void *data)19{20	struct tps6105x_priv *priv = data;21 22	fwnode_handle_put(priv->fwnode);23}24 25static int tps6105x_brightness_set(struct led_classdev *cdev,26				  enum led_brightness brightness)27{28	struct tps6105x_priv *priv = container_of(cdev, struct tps6105x_priv,29							cdev);30 31	return regmap_update_bits(priv->regmap, TPS6105X_REG_0,32				  TPS6105X_REG0_TORCHC_MASK,33				  brightness << TPS6105X_REG0_TORCHC_SHIFT);34}35 36static int tps6105x_led_probe(struct platform_device *pdev)37{38	struct tps6105x *tps6105x = dev_get_platdata(&pdev->dev);39	struct tps6105x_platform_data *pdata = tps6105x->pdata;40	struct led_init_data init_data = { };41	struct tps6105x_priv *priv;42	int ret;43 44	/* This instance is not set for torch mode so bail out */45	if (pdata->mode != TPS6105X_MODE_TORCH) {46		dev_info(&pdev->dev,47			"chip not in torch mode, exit probe");48		return -EINVAL;49	}50 51	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);52	if (!priv)53		return -ENOMEM;54	/* fwnode/devicetree is optional. NULL is allowed for priv->fwnode */55	priv->fwnode = device_get_next_child_node(pdev->dev.parent, NULL);56	ret = devm_add_action_or_reset(&pdev->dev, tps6105x_handle_put, priv);57	if (ret)58		return ret;59	priv->regmap = tps6105x->regmap;60	priv->cdev.brightness_set_blocking = tps6105x_brightness_set;61	priv->cdev.max_brightness = 7;62	init_data.devicename = "tps6105x";63	init_data.default_label = ":torch";64	init_data.fwnode = priv->fwnode;65 66	ret = regmap_update_bits(tps6105x->regmap, TPS6105X_REG_0,67				 TPS6105X_REG0_MODE_MASK |68					TPS6105X_REG0_TORCHC_MASK,69				 TPS6105X_REG0_MODE_TORCH <<70					TPS6105X_REG0_MODE_SHIFT);71	if (ret)72		return ret;73 74	return devm_led_classdev_register_ext(&pdev->dev, &priv->cdev,75					      &init_data);76}77 78static struct platform_driver led_driver = {79	.probe = tps6105x_led_probe,80	.driver = {81		.name = "tps6105x-leds",82	},83};84 85module_platform_driver(led_driver);86 87MODULE_DESCRIPTION("TPS6105x LED driver");88MODULE_AUTHOR("Sven Van Asbroeck <TheSven73@gmail.com>");89MODULE_LICENSE("GPL v2");90