brintos

brintos / linux-shallow public Read only

0
0
Text · 2.7 KiB · 7d7560f Raw
134 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Microchip KSZ9477 series register access through I2C4 *5 * Copyright (C) 2018-2019 Microchip Technology Inc.6 */7 8#include <linux/i2c.h>9#include <linux/kernel.h>10#include <linux/module.h>11#include <linux/regmap.h>12 13#include "ksz_common.h"14 15KSZ_REGMAP_TABLE(ksz9477, not_used, 16, 0, 0);16 17static int ksz9477_i2c_probe(struct i2c_client *i2c)18{19	struct regmap_config rc;20	struct ksz_device *dev;21	int i, ret;22 23	dev = ksz_switch_alloc(&i2c->dev, i2c);24	if (!dev)25		return -ENOMEM;26 27	for (i = 0; i < __KSZ_NUM_REGMAPS; i++) {28		rc = ksz9477_regmap_config[i];29		rc.lock_arg = &dev->regmap_mutex;30		dev->regmap[i] = devm_regmap_init_i2c(i2c, &rc);31		if (IS_ERR(dev->regmap[i])) {32			return dev_err_probe(&i2c->dev, PTR_ERR(dev->regmap[i]),33					     "Failed to initialize regmap%i\n",34					     ksz9477_regmap_config[i].val_bits);35		}36	}37 38	if (i2c->dev.platform_data)39		dev->pdata = i2c->dev.platform_data;40 41	dev->irq = i2c->irq;42 43	ret = ksz_switch_register(dev);44 45	/* Main DSA driver may not be started yet. */46	if (ret)47		return ret;48 49	i2c_set_clientdata(i2c, dev);50 51	return 0;52}53 54static void ksz9477_i2c_remove(struct i2c_client *i2c)55{56	struct ksz_device *dev = i2c_get_clientdata(i2c);57 58	if (dev)59		ksz_switch_remove(dev);60}61 62static void ksz9477_i2c_shutdown(struct i2c_client *i2c)63{64	struct ksz_device *dev = i2c_get_clientdata(i2c);65 66	if (!dev)67		return;68 69	ksz_switch_shutdown(dev);70 71	i2c_set_clientdata(i2c, NULL);72}73 74static const struct i2c_device_id ksz9477_i2c_id[] = {75	{ "ksz9477-switch" },76	{}77};78 79MODULE_DEVICE_TABLE(i2c, ksz9477_i2c_id);80 81static const struct of_device_id ksz9477_dt_ids[] = {82	{83		.compatible = "microchip,ksz9477",84		.data = &ksz_switch_chips[KSZ9477]85	},86	{87		.compatible = "microchip,ksz9896",88		.data = &ksz_switch_chips[KSZ9896]89	},90	{91		.compatible = "microchip,ksz9897",92		.data = &ksz_switch_chips[KSZ9897]93	},94	{95		.compatible = "microchip,ksz9893",96		.data = &ksz_switch_chips[KSZ9893]97	},98	{99		.compatible = "microchip,ksz9563",100		.data = &ksz_switch_chips[KSZ9563]101	},102	{103		.compatible = "microchip,ksz8563",104		.data = &ksz_switch_chips[KSZ8563]105	},106	{107		.compatible = "microchip,ksz8567",108		.data = &ksz_switch_chips[KSZ8567]109	},110	{111		.compatible = "microchip,ksz9567",112		.data = &ksz_switch_chips[KSZ9567]113	},114	{},115};116MODULE_DEVICE_TABLE(of, ksz9477_dt_ids);117 118static struct i2c_driver ksz9477_i2c_driver = {119	.driver = {120		.name	= "ksz9477-switch",121		.of_match_table = ksz9477_dt_ids,122	},123	.probe = ksz9477_i2c_probe,124	.remove	= ksz9477_i2c_remove,125	.shutdown = ksz9477_i2c_shutdown,126	.id_table = ksz9477_i2c_id,127};128 129module_i2c_driver(ksz9477_i2c_driver);130 131MODULE_AUTHOR("Tristram Ha <Tristram.Ha@microchip.com>");132MODULE_DESCRIPTION("Microchip KSZ9477 Series Switch I2C access Driver");133MODULE_LICENSE("GPL v2");134