1 // SPDX-License-Identifier: GPL-2.0
3 * Microchip KSZ9477 series register access through I2C
5 * Copyright (C) 2018-2019 Microchip Technology Inc.
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/regmap.h>
13 #include "ksz_common.h"
15 KSZ_REGMAP_TABLE(ksz9477
, not_used
, 16, 0, 0);
17 static int ksz9477_i2c_probe(struct i2c_client
*i2c
,
18 const struct i2c_device_id
*i2c_id
)
20 struct regmap_config rc
;
21 struct ksz_device
*dev
;
24 dev
= ksz_switch_alloc(&i2c
->dev
, i2c
);
28 for (i
= 0; i
< ARRAY_SIZE(ksz9477_regmap_config
); i
++) {
29 rc
= ksz9477_regmap_config
[i
];
30 rc
.lock_arg
= &dev
->regmap_mutex
;
31 dev
->regmap
[i
] = devm_regmap_init_i2c(i2c
, &rc
);
32 if (IS_ERR(dev
->regmap
[i
])) {
33 ret
= PTR_ERR(dev
->regmap
[i
]);
35 "Failed to initialize regmap%i: %d\n",
36 ksz9477_regmap_config
[i
].val_bits
, ret
);
41 if (i2c
->dev
.platform_data
)
42 dev
->pdata
= i2c
->dev
.platform_data
;
44 ret
= ksz9477_switch_register(dev
);
46 /* Main DSA driver may not be started yet. */
50 i2c_set_clientdata(i2c
, dev
);
55 static int ksz9477_i2c_remove(struct i2c_client
*i2c
)
57 struct ksz_device
*dev
= i2c_get_clientdata(i2c
);
59 ksz_switch_remove(dev
);
64 static void ksz9477_i2c_shutdown(struct i2c_client
*i2c
)
66 struct ksz_device
*dev
= i2c_get_clientdata(i2c
);
68 if (dev
&& dev
->dev_ops
->shutdown
)
69 dev
->dev_ops
->shutdown(dev
);
72 static const struct i2c_device_id ksz9477_i2c_id
[] = {
73 { "ksz9477-switch", 0 },
77 MODULE_DEVICE_TABLE(i2c
, ksz9477_i2c_id
);
79 static const struct of_device_id ksz9477_dt_ids
[] = {
80 { .compatible
= "microchip,ksz9477" },
81 { .compatible
= "microchip,ksz9897" },
82 { .compatible
= "microchip,ksz9567" },
85 MODULE_DEVICE_TABLE(of
, ksz9477_dt_ids
);
87 static struct i2c_driver ksz9477_i2c_driver
= {
89 .name
= "ksz9477-switch",
90 .of_match_table
= of_match_ptr(ksz9477_dt_ids
),
92 .probe
= ksz9477_i2c_probe
,
93 .remove
= ksz9477_i2c_remove
,
94 .shutdown
= ksz9477_i2c_shutdown
,
95 .id_table
= ksz9477_i2c_id
,
98 module_i2c_driver(ksz9477_i2c_driver
);
100 MODULE_AUTHOR("Tristram Ha <Tristram.Ha@microchip.com>");
101 MODULE_DESCRIPTION("Microchip KSZ9477 Series Switch I2C access Driver");
102 MODULE_LICENSE("GPL v2");