brintos

brintos / linux-shallow public Read only

0
0
Text · 2.5 KiB · f5367a7 Raw
101 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Hardware monitoring driver for Maxim MAX153014 *5 * Copyright (c) 2021 Flextronics International Sweden AB6 *7 * Even though the specification does not specifically mention it,8 * extensive empirical testing has revealed that auto-detection of9 * limit-registers will fail in a random fashion unless the delay10 * parameter is set to above about 80us. The default delay is set11 * to 100us to include some safety margin.12 */13 14#include <linux/kernel.h>15#include <linux/module.h>16#include <linux/init.h>17#include <linux/err.h>18#include <linux/slab.h>19#include <linux/i2c.h>20#include <linux/ktime.h>21#include <linux/delay.h>22#include <linux/pmbus.h>23#include "pmbus.h"24 25static const struct i2c_device_id max15301_id[] = {26	{ "bmr461" },27	{ "max15301" },28	{}29};30MODULE_DEVICE_TABLE(i2c, max15301_id);31 32struct max15301_data {33	int id;34	struct pmbus_driver_info info;35};36 37#define to_max15301_data(x)  container_of(x, struct max15301_data, info)38 39#define MAX15301_WAIT_TIME		100	/* us	*/40 41static ushort delay = MAX15301_WAIT_TIME;42module_param(delay, ushort, 0644);43MODULE_PARM_DESC(delay, "Delay between chip accesses in us");44 45static struct max15301_data max15301_data = {46	.info = {47		.pages = 1,48		.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT49			| PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT50			| PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP251			| PMBUS_HAVE_STATUS_TEMP52			| PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,53	}54};55 56static int max15301_probe(struct i2c_client *client)57{58	int status;59	u8 device_id[I2C_SMBUS_BLOCK_MAX + 1];60	const struct i2c_device_id *mid;61	struct pmbus_driver_info *info = &max15301_data.info;62 63	if (!i2c_check_functionality(client->adapter,64				     I2C_FUNC_SMBUS_READ_BYTE_DATA65				     | I2C_FUNC_SMBUS_BLOCK_DATA))66		return -ENODEV;67 68	status = i2c_smbus_read_block_data(client, PMBUS_IC_DEVICE_ID, device_id);69	if (status < 0) {70		dev_err(&client->dev, "Failed to read Device Id\n");71		return status;72	}73	for (mid = max15301_id; mid->name[0]; mid++) {74		if (!strncasecmp(mid->name, device_id, strlen(mid->name)))75			break;76	}77	if (!mid->name[0]) {78		dev_err(&client->dev, "Unsupported device\n");79		return -ENODEV;80	}81 82	info->access_delay = delay;83 84	return pmbus_do_probe(client, info);85}86 87static struct i2c_driver max15301_driver = {88	.driver = {89		   .name = "max15301",90		   },91	.probe = max15301_probe,92	.id_table = max15301_id,93};94 95module_i2c_driver(max15301_driver);96 97MODULE_AUTHOR("Erik Rosen <erik.rosen@metormote.com>");98MODULE_DESCRIPTION("PMBus driver for Maxim MAX15301");99MODULE_LICENSE("GPL");100MODULE_IMPORT_NS(PMBUS);101