Lines Matching +full:rtl9301 +full:- +full:i2c
1 // SPDX-License-Identifier: GPL-2.0-only
4 #include <linux/i2c.h>
5 #include <linux/i2c-mux.h>
21 struct rtl9300_i2c *i2c; member
63 static int rtl9300_i2c_reg_addr_set(struct rtl9300_i2c *i2c, u32 reg, u16 len) in rtl9300_i2c_reg_addr_set() argument
71 ret = regmap_update_bits(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CTRL2, mask, val); in rtl9300_i2c_reg_addr_set()
78 return regmap_update_bits(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CTRL1, mask, val); in rtl9300_i2c_reg_addr_set()
81 static int rtl9300_i2c_config_io(struct rtl9300_i2c *i2c, u8 sda_pin) in rtl9300_i2c_config_io() argument
86 ret = regmap_update_bits(i2c->regmap, RTL9300_I2C_MST_GLB_CTRL, BIT(sda_pin), BIT(sda_pin)); in rtl9300_i2c_config_io()
94 return regmap_update_bits(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CTRL1, mask, val); in rtl9300_i2c_config_io()
97 static int rtl9300_i2c_config_xfer(struct rtl9300_i2c *i2c, struct rtl9300_i2c_chan *chan, in rtl9300_i2c_config_xfer() argument
102 val = chan->bus_freq << RTL9300_I2C_MST_CTRL2_SCL_FREQ_OFS; in rtl9300_i2c_config_xfer()
108 val |= ((len - 1) & 0xf) << RTL9300_I2C_MST_CTRL2_DATA_WIDTH_OFS; in rtl9300_i2c_config_xfer()
113 return regmap_update_bits(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CTRL2, mask, val); in rtl9300_i2c_config_xfer()
116 static int rtl9300_i2c_read(struct rtl9300_i2c *i2c, u8 *buf, int len) in rtl9300_i2c_read() argument
122 return -EIO; in rtl9300_i2c_read()
124 ret = regmap_bulk_read(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_DATA_WORD0, in rtl9300_i2c_read()
137 static int rtl9300_i2c_write(struct rtl9300_i2c *i2c, u8 *buf, int len) in rtl9300_i2c_write() argument
143 return -EIO; in rtl9300_i2c_write()
152 return regmap_bulk_write(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_DATA_WORD0, in rtl9300_i2c_write()
156 static int rtl9300_i2c_writel(struct rtl9300_i2c *i2c, u32 data) in rtl9300_i2c_writel() argument
158 return regmap_write(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_DATA_WORD0, data); in rtl9300_i2c_writel()
161 static int rtl9300_i2c_execute_xfer(struct rtl9300_i2c *i2c, char read_write, in rtl9300_i2c_execute_xfer() argument
173 ret = regmap_update_bits(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CTRL1, mask, val); in rtl9300_i2c_execute_xfer()
177 ret = regmap_read_poll_timeout(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CTRL1, in rtl9300_i2c_execute_xfer()
183 return -EIO; in rtl9300_i2c_execute_xfer()
187 ret = regmap_read(i2c->regmap, in rtl9300_i2c_execute_xfer()
188 i2c->reg_base + RTL9300_I2C_MST_DATA_WORD0, &val); in rtl9300_i2c_execute_xfer()
191 data->byte = val & 0xff; in rtl9300_i2c_execute_xfer()
193 ret = regmap_read(i2c->regmap, in rtl9300_i2c_execute_xfer()
194 i2c->reg_base + RTL9300_I2C_MST_DATA_WORD0, &val); in rtl9300_i2c_execute_xfer()
197 data->word = val & 0xffff; in rtl9300_i2c_execute_xfer()
199 ret = rtl9300_i2c_read(i2c, &data->block[0], len); in rtl9300_i2c_execute_xfer()
213 struct rtl9300_i2c *i2c = chan->i2c; in rtl9300_i2c_smbus_xfer() local
216 mutex_lock(&i2c->lock); in rtl9300_i2c_smbus_xfer()
217 if (chan->sda_pin != i2c->sda_pin) { in rtl9300_i2c_smbus_xfer()
218 ret = rtl9300_i2c_config_io(i2c, chan->sda_pin); in rtl9300_i2c_smbus_xfer()
221 i2c->sda_pin = chan->sda_pin; in rtl9300_i2c_smbus_xfer()
226 ret = rtl9300_i2c_config_xfer(i2c, chan, addr, 0); in rtl9300_i2c_smbus_xfer()
229 ret = rtl9300_i2c_reg_addr_set(i2c, 0, 0); in rtl9300_i2c_smbus_xfer()
236 ret = rtl9300_i2c_config_xfer(i2c, chan, addr, 0); in rtl9300_i2c_smbus_xfer()
239 ret = rtl9300_i2c_reg_addr_set(i2c, command, 1); in rtl9300_i2c_smbus_xfer()
243 ret = rtl9300_i2c_config_xfer(i2c, chan, addr, 1); in rtl9300_i2c_smbus_xfer()
246 ret = rtl9300_i2c_reg_addr_set(i2c, 0, 0); in rtl9300_i2c_smbus_xfer()
253 ret = rtl9300_i2c_reg_addr_set(i2c, command, 1); in rtl9300_i2c_smbus_xfer()
256 ret = rtl9300_i2c_config_xfer(i2c, chan, addr, 1); in rtl9300_i2c_smbus_xfer()
260 ret = rtl9300_i2c_writel(i2c, data->byte); in rtl9300_i2c_smbus_xfer()
267 ret = rtl9300_i2c_reg_addr_set(i2c, command, 1); in rtl9300_i2c_smbus_xfer()
270 ret = rtl9300_i2c_config_xfer(i2c, chan, addr, 2); in rtl9300_i2c_smbus_xfer()
274 ret = rtl9300_i2c_writel(i2c, data->word); in rtl9300_i2c_smbus_xfer()
281 ret = rtl9300_i2c_reg_addr_set(i2c, command, 1); in rtl9300_i2c_smbus_xfer()
284 ret = rtl9300_i2c_config_xfer(i2c, chan, addr, data->block[0]); in rtl9300_i2c_smbus_xfer()
288 ret = rtl9300_i2c_write(i2c, &data->block[1], data->block[0]); in rtl9300_i2c_smbus_xfer()
292 len = data->block[0]; in rtl9300_i2c_smbus_xfer()
296 dev_err(&adap->dev, "Unsupported transaction %d\n", size); in rtl9300_i2c_smbus_xfer()
297 ret = -EOPNOTSUPP; in rtl9300_i2c_smbus_xfer()
301 ret = rtl9300_i2c_execute_xfer(i2c, read_write, size, data, len); in rtl9300_i2c_smbus_xfer()
304 mutex_unlock(&i2c->lock); in rtl9300_i2c_smbus_xfer()
329 struct device *dev = &pdev->dev; in rtl9300_i2c_probe()
330 struct rtl9300_i2c *i2c; in rtl9300_i2c_probe() local
335 i2c = devm_kzalloc(dev, sizeof(*i2c), GFP_KERNEL); in rtl9300_i2c_probe()
336 if (!i2c) in rtl9300_i2c_probe()
337 return -ENOMEM; in rtl9300_i2c_probe()
339 i2c->regmap = syscon_node_to_regmap(dev->parent->of_node); in rtl9300_i2c_probe()
340 if (IS_ERR(i2c->regmap)) in rtl9300_i2c_probe()
341 return PTR_ERR(i2c->regmap); in rtl9300_i2c_probe()
342 i2c->dev = dev; in rtl9300_i2c_probe()
344 mutex_init(&i2c->lock); in rtl9300_i2c_probe()
346 ret = device_property_read_u32(dev, "reg", &i2c->reg_base); in rtl9300_i2c_probe()
350 platform_set_drvdata(pdev, i2c); in rtl9300_i2c_probe()
353 return dev_err_probe(dev, -EINVAL, "Too many channels\n"); in rtl9300_i2c_probe()
356 struct rtl9300_i2c_chan *chan = &i2c->chans[i]; in rtl9300_i2c_probe()
357 struct i2c_adapter *adap = &chan->adap; in rtl9300_i2c_probe()
363 ret = fwnode_property_read_u32(child, "clock-frequency", &clock_freq); in rtl9300_i2c_probe()
369 chan->bus_freq = RTL9300_I2C_STD_FREQ; in rtl9300_i2c_probe()
373 chan->bus_freq = RTL9300_I2C_FAST_FREQ; in rtl9300_i2c_probe()
376 dev_warn(i2c->dev, "SDA%d clock-frequency %d not supported using default\n", in rtl9300_i2c_probe()
381 chan->sda_pin = sda_pin; in rtl9300_i2c_probe()
382 chan->i2c = i2c; in rtl9300_i2c_probe()
383 adap = &i2c->chans[i].adap; in rtl9300_i2c_probe()
384 adap->owner = THIS_MODULE; in rtl9300_i2c_probe()
385 adap->algo = &rtl9300_i2c_algo; in rtl9300_i2c_probe()
386 adap->quirks = &rtl9300_i2c_quirks; in rtl9300_i2c_probe()
387 adap->retries = 3; in rtl9300_i2c_probe()
388 adap->dev.parent = dev; in rtl9300_i2c_probe()
390 adap->dev.of_node = to_of_node(child); in rtl9300_i2c_probe()
391 snprintf(adap->name, sizeof(adap->name), "%s SDA%d\n", dev_name(dev), sda_pin); in rtl9300_i2c_probe()
398 i2c->sda_pin = 0xff; in rtl9300_i2c_probe()
404 { .compatible = "realtek,rtl9301-i2c" },
405 { .compatible = "realtek,rtl9302b-i2c" },
406 { .compatible = "realtek,rtl9302c-i2c" },
407 { .compatible = "realtek,rtl9303-i2c" },
415 .name = "i2c-rtl9300",
422 MODULE_DESCRIPTION("RTL9300 I2C controller driver");