#include <linux/workqueue.h>
#include <linux/regmap.h>
#include <linux/mfd/core.h>
#include <linux/mfd/smsc.h>
#include <linux/of_platform.h>
static const struct regmap_config smsc_regmap_config = {
.max_register = SMSC_VEN_ID_H,
.cache_type = REGCACHE_RBTREE,
static int smsc_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
int devid, rev, venid_l, venid_h;
smsc = devm_kzalloc(&i2c->dev, sizeof(*smsc), GFP_KERNEL);
smsc->regmap = devm_regmap_init_i2c(i2c, &smsc_regmap_config);
if (IS_ERR(smsc->regmap))
return PTR_ERR(smsc->regmap);
i2c_set_clientdata(i2c, smsc);
of_property_read_u32(i2c->dev.of_node, "clock", &smsc->clk);
regmap_read(smsc->regmap, SMSC_DEV_ID, &devid);
regmap_read(smsc->regmap, SMSC_DEV_REV, &rev);
regmap_read(smsc->regmap, SMSC_VEN_ID_L, &venid_l);
regmap_read(smsc->regmap, SMSC_VEN_ID_H, &venid_h);
dev_info(&i2c->dev, "SMSCxxx devid: %02x rev: %02x venid: %02x\n",
devid, rev, (venid_h << 8) | venid_l);
ret = regmap_write(smsc->regmap, SMSC_CLK_CTRL, smsc->clk);