brintos

brintos / linux-shallow public Read only

0
0
Text · 4.2 KiB · 5a90633 Raw
185 lines · c
1// SPDX-License-Identifier: GPL-2.0+2#include <linux/module.h>3#include <linux/i2c.h>4#include <linux/of.h>5#include <linux/regmap.h>6#include <linux/regulator/driver.h>7 8static const struct regulator_ops max8893_ops = {9	.is_enabled		= regulator_is_enabled_regmap,10	.enable			= regulator_enable_regmap,11	.disable		= regulator_disable_regmap,12	.get_voltage_sel	= regulator_get_voltage_sel_regmap,13	.set_voltage_sel	= regulator_set_voltage_sel_regmap,14	.list_voltage		= regulator_list_voltage_linear,15	.map_voltage		= regulator_map_voltage_linear,16};17 18static const struct regulator_desc max8893_regulators[] = {19	{20		.name = "BUCK",21		.supply_name = "in-buck",22		.of_match = of_match_ptr("buck"),23		.regulators_node = of_match_ptr("regulators"),24		.n_voltages = 0x11,25		.id = 6,26		.ops = &max8893_ops,27		.type = REGULATOR_VOLTAGE,28		.owner = THIS_MODULE,29		.min_uV = 800000,30		.uV_step = 100000,31		.vsel_reg = 0x4,32		.vsel_mask = 0x1f,33		.enable_reg = 0x0,34		.enable_mask = BIT(7),35	},36	{37		.name = "LDO1",38		.supply_name = "in-ldo1",39		.of_match = of_match_ptr("ldo1"),40		.regulators_node = of_match_ptr("regulators"),41		.n_voltages = 0x12,42		.id = 1,43		.ops = &max8893_ops,44		.type = REGULATOR_VOLTAGE,45		.owner = THIS_MODULE,46		.min_uV = 1600000,47		.uV_step = 100000,48		.vsel_reg = 0x5,49		.vsel_mask = 0x1f,50		.enable_reg = 0x0,51		.enable_mask = BIT(5),52	},53	{54		.name = "LDO2",55		.supply_name = "in-ldo2",56		.of_match = of_match_ptr("ldo2"),57		.regulators_node = of_match_ptr("regulators"),58		.n_voltages = 0x16,59		.id = 2,60		.ops = &max8893_ops,61		.type = REGULATOR_VOLTAGE,62		.owner = THIS_MODULE,63		.min_uV = 1200000,64		.uV_step = 100000,65		.vsel_reg = 0x6,66		.vsel_mask = 0x1f,67		.enable_reg = 0x0,68		.enable_mask = BIT(4),69	},70	{71		.name = "LDO3",72		.supply_name = "in-ldo3",73		.of_match = of_match_ptr("ldo3"),74		.regulators_node = of_match_ptr("regulators"),75		.n_voltages = 0x12,76		.id = 3,77		.ops = &max8893_ops,78		.type = REGULATOR_VOLTAGE,79		.owner = THIS_MODULE,80		.min_uV = 1600000,81		.uV_step = 100000,82		.vsel_reg = 0x7,83		.vsel_mask = 0x1f,84		.enable_reg = 0x0,85		.enable_mask = BIT(3),86	},87	{88		.name = "LDO4",89		.supply_name = "in-ldo4",90		.of_match = of_match_ptr("ldo4"),91		.regulators_node = of_match_ptr("regulators"),92		.n_voltages = 0x1a,93		.id = 4,94		.ops = &max8893_ops,95		.type = REGULATOR_VOLTAGE,96		.owner = THIS_MODULE,97		.min_uV = 800000,98		.uV_step = 100000,99		.vsel_reg = 0x8,100		.vsel_mask = 0x1f,101		.enable_reg = 0x0,102		.enable_mask = BIT(2),103	},104	{105		.name = "LDO5",106		.supply_name = "in-ldo5",107		.of_match = of_match_ptr("ldo5"),108		.regulators_node = of_match_ptr("regulators"),109		.n_voltages = 0x1a,110		.id = 5,111		.ops = &max8893_ops,112		.type = REGULATOR_VOLTAGE,113		.owner = THIS_MODULE,114		.min_uV = 800000,115		.uV_step = 100000,116		.vsel_reg = 0x9,117		.vsel_mask = 0x1f,118		.enable_reg = 0x0,119		.enable_mask = BIT(1),120	}121};122 123static const struct regmap_config max8893_regmap = {124	.reg_bits = 8,125	.val_bits = 8,126};127 128static int max8893_probe(struct i2c_client *i2c)129{130	int id, ret;131	struct regulator_config config = {.dev = &i2c->dev};132	struct regmap *regmap = devm_regmap_init_i2c(i2c, &max8893_regmap);133 134	if (IS_ERR(regmap)) {135		ret = PTR_ERR(regmap);136		dev_err(&i2c->dev, "regmap init failed: %d\n", ret);137		return ret;138	}139 140	for (id = 0; id < ARRAY_SIZE(max8893_regulators); id++) {141		struct regulator_dev *rdev;142		rdev = devm_regulator_register(&i2c->dev,143					       &max8893_regulators[id],144					       &config);145		if (IS_ERR(rdev)) {146			ret = PTR_ERR(rdev);147			dev_err(&i2c->dev, "failed to register %s: %d\n",148				max8893_regulators[id].name, ret);149			return ret;150		}151	}152 153	return 0;154}155 156#ifdef CONFIG_OF157static const struct of_device_id max8893_dt_match[] = {158	{ .compatible = "maxim,max8893" },159	{ /* sentinel */ },160};161MODULE_DEVICE_TABLE(of, max8893_dt_match);162#endif163 164static const struct i2c_device_id max8893_ids[] = {165	{ "max8893" },166	{ }167};168MODULE_DEVICE_TABLE(i2c, max8893_ids);169 170static struct i2c_driver max8893_driver = {171	.probe		= max8893_probe,172	.driver		= {173		.name	= "max8893",174		.probe_type = PROBE_PREFER_ASYNCHRONOUS,175		.of_match_table = of_match_ptr(max8893_dt_match),176	},177	.id_table	= max8893_ids,178};179 180module_i2c_driver(max8893_driver);181 182MODULE_DESCRIPTION("Maxim MAX8893 PMIC driver");183MODULE_AUTHOR("Sergey Larin <cerg2010cerg2010@mail.ru>");184MODULE_LICENSE("GPL");185