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>
22 struct rtl9300_i2c *i2c; member
57 int (*select_scl)(struct rtl9300_i2c *i2c, u8 scl);
77 DEFINE_GUARD(rtl9300_i2c, struct rtl9300_i2c *, mutex_lock(&_T->lock), mutex_unlock(&_T->lock))
109 static int rtl9300_i2c_reg_addr_set(struct rtl9300_i2c *i2c, u32 reg, u16 len) in rtl9300_i2c_reg_addr_set() argument
113 ret = regmap_field_write(i2c->fields[F_MEM_ADDR_WIDTH], len); in rtl9300_i2c_reg_addr_set()
117 return regmap_field_write(i2c->fields[F_MEM_ADDR], reg); in rtl9300_i2c_reg_addr_set()
120 static int rtl9300_i2c_select_scl(struct rtl9300_i2c *i2c, u8 scl) in rtl9300_i2c_select_scl() argument
122 return regmap_field_write(i2c->fields[F_SCL_SEL], 1); in rtl9300_i2c_select_scl()
125 static int rtl9310_i2c_select_scl(struct rtl9300_i2c *i2c, u8 scl) in rtl9310_i2c_select_scl() argument
127 return regmap_field_update_bits(i2c->fields[F_SCL_SEL], BIT(scl), BIT(scl)); in rtl9310_i2c_select_scl()
130 static int rtl9300_i2c_config_chan(struct rtl9300_i2c *i2c, struct rtl9300_i2c_chan *chan) in rtl9300_i2c_config_chan() argument
135 if (i2c->sda_num == chan->sda_num) in rtl9300_i2c_config_chan()
138 ret = regmap_field_write(i2c->fields[F_SCL_FREQ], chan->bus_freq); in rtl9300_i2c_config_chan()
142 drv_data = (struct rtl9300_i2c_drv_data *)device_get_match_data(i2c->dev); in rtl9300_i2c_config_chan()
143 ret = drv_data->select_scl(i2c, i2c->scl_num); in rtl9300_i2c_config_chan()
147 ret = regmap_field_update_bits(i2c->fields[F_SDA_SEL], BIT(chan->sda_num), in rtl9300_i2c_config_chan()
148 BIT(chan->sda_num)); in rtl9300_i2c_config_chan()
152 ret = regmap_field_write(i2c->fields[F_SDA_OUT_SEL], chan->sda_num); in rtl9300_i2c_config_chan()
156 i2c->sda_num = chan->sda_num; in rtl9300_i2c_config_chan()
160 static int rtl9300_i2c_read(struct rtl9300_i2c *i2c, u8 *buf, u8 len) in rtl9300_i2c_read() argument
166 return -EIO; in rtl9300_i2c_read()
168 ret = regmap_bulk_read(i2c->regmap, i2c->data_reg, vals, ARRAY_SIZE(vals)); in rtl9300_i2c_read()
180 static int rtl9300_i2c_write(struct rtl9300_i2c *i2c, u8 *buf, u8 len) in rtl9300_i2c_write() argument
186 return -EIO; in rtl9300_i2c_write()
195 return regmap_bulk_write(i2c->regmap, i2c->data_reg, vals, ARRAY_SIZE(vals)); in rtl9300_i2c_write()
198 static int rtl9300_i2c_writel(struct rtl9300_i2c *i2c, u32 data) in rtl9300_i2c_writel() argument
200 return regmap_write(i2c->regmap, i2c->data_reg, data); in rtl9300_i2c_writel()
203 static int rtl9300_i2c_prepare_xfer(struct rtl9300_i2c *i2c, struct rtl9300_i2c_xfer *xfer) in rtl9300_i2c_prepare_xfer() argument
207 if (xfer->data_len < 1 || xfer->data_len > 16) in rtl9300_i2c_prepare_xfer()
208 return -EINVAL; in rtl9300_i2c_prepare_xfer()
210 ret = regmap_field_write(i2c->fields[F_DEV_ADDR], xfer->dev_addr); in rtl9300_i2c_prepare_xfer()
214 ret = rtl9300_i2c_reg_addr_set(i2c, xfer->reg_addr, xfer->reg_addr_len); in rtl9300_i2c_prepare_xfer()
218 ret = regmap_field_write(i2c->fields[F_RWOP], xfer->write); in rtl9300_i2c_prepare_xfer()
222 ret = regmap_field_write(i2c->fields[F_DATA_WIDTH], (xfer->data_len - 1) & 0xf); in rtl9300_i2c_prepare_xfer()
226 if (xfer->write) { in rtl9300_i2c_prepare_xfer()
227 switch (xfer->type) { in rtl9300_i2c_prepare_xfer()
229 ret = rtl9300_i2c_writel(i2c, *xfer->data); in rtl9300_i2c_prepare_xfer()
232 ret = rtl9300_i2c_writel(i2c, get_unaligned((const u16 *)xfer->data)); in rtl9300_i2c_prepare_xfer()
235 ret = rtl9300_i2c_write(i2c, xfer->data, xfer->data_len); in rtl9300_i2c_prepare_xfer()
243 static int rtl9300_i2c_do_xfer(struct rtl9300_i2c *i2c, struct rtl9300_i2c_xfer *xfer) in rtl9300_i2c_do_xfer() argument
248 ret = regmap_field_write(i2c->fields[F_I2C_TRIG], 1); in rtl9300_i2c_do_xfer()
252 ret = regmap_field_read_poll_timeout(i2c->fields[F_I2C_TRIG], val, !val, 100, 100000); in rtl9300_i2c_do_xfer()
256 ret = regmap_field_read(i2c->fields[F_I2C_FAIL], &val); in rtl9300_i2c_do_xfer()
260 return -EIO; in rtl9300_i2c_do_xfer()
262 if (!xfer->write) { in rtl9300_i2c_do_xfer()
263 switch (xfer->type) { in rtl9300_i2c_do_xfer()
265 ret = regmap_read(i2c->regmap, i2c->data_reg, &val); in rtl9300_i2c_do_xfer()
269 *xfer->data = val & 0xff; in rtl9300_i2c_do_xfer()
272 ret = regmap_read(i2c->regmap, i2c->data_reg, &val); in rtl9300_i2c_do_xfer()
276 put_unaligned(val & 0xffff, (u16*)xfer->data); in rtl9300_i2c_do_xfer()
279 ret = rtl9300_i2c_read(i2c, xfer->data, xfer->data_len); in rtl9300_i2c_do_xfer()
294 struct rtl9300_i2c *i2c = chan->i2c; in rtl9300_i2c_smbus_xfer() local
299 return -EINVAL; in rtl9300_i2c_smbus_xfer()
301 guard(rtl9300_i2c)(i2c); in rtl9300_i2c_smbus_xfer()
303 ret = rtl9300_i2c_config_chan(i2c, chan); in rtl9300_i2c_smbus_xfer()
314 xfer.data = (read_write == I2C_SMBUS_READ) ? &data->byte : &command; in rtl9300_i2c_smbus_xfer()
321 xfer.data = &data->byte; in rtl9300_i2c_smbus_xfer()
326 xfer.data = (u8 *)&data->word; in rtl9300_i2c_smbus_xfer()
331 xfer.data = &data->block[0]; in rtl9300_i2c_smbus_xfer()
332 xfer.data_len = data->block[0] + 1; in rtl9300_i2c_smbus_xfer()
336 xfer.data = &data->block[1]; in rtl9300_i2c_smbus_xfer()
337 xfer.data_len = data->block[0]; in rtl9300_i2c_smbus_xfer()
341 dev_err(&adap->dev, "Unsupported transaction %d\n", size); in rtl9300_i2c_smbus_xfer()
342 return -EOPNOTSUPP; in rtl9300_i2c_smbus_xfer()
345 ret = rtl9300_i2c_prepare_xfer(i2c, &xfer); in rtl9300_i2c_smbus_xfer()
349 return rtl9300_i2c_do_xfer(i2c, &xfer); in rtl9300_i2c_smbus_xfer()
372 struct device *dev = &pdev->dev; in rtl9300_i2c_probe()
373 struct rtl9300_i2c *i2c; in rtl9300_i2c_probe() local
380 i2c = devm_kzalloc(dev, sizeof(*i2c), GFP_KERNEL); in rtl9300_i2c_probe()
381 if (!i2c) in rtl9300_i2c_probe()
382 return -ENOMEM; in rtl9300_i2c_probe()
384 i2c->regmap = syscon_node_to_regmap(dev->parent->of_node); in rtl9300_i2c_probe()
385 if (IS_ERR(i2c->regmap)) in rtl9300_i2c_probe()
386 return PTR_ERR(i2c->regmap); in rtl9300_i2c_probe()
387 i2c->dev = dev; in rtl9300_i2c_probe()
389 mutex_init(&i2c->lock); in rtl9300_i2c_probe()
391 ret = device_property_read_u32(dev, "reg", &i2c->reg_base); in rtl9300_i2c_probe()
398 i2c->scl_num = (u8)scl_num; in rtl9300_i2c_probe()
400 platform_set_drvdata(pdev, i2c); in rtl9300_i2c_probe()
402 drv_data = (struct rtl9300_i2c_drv_data *)device_get_match_data(i2c->dev); in rtl9300_i2c_probe()
403 if (device_get_child_node_count(dev) > drv_data->max_nchan) in rtl9300_i2c_probe()
404 return dev_err_probe(dev, -EINVAL, "Too many channels\n"); in rtl9300_i2c_probe()
406 i2c->data_reg = i2c->reg_base + drv_data->data_reg; in rtl9300_i2c_probe()
408 fields[i] = drv_data->field_desc[i].field; in rtl9300_i2c_probe()
409 if (drv_data->field_desc[i].scope == REG_SCOPE_MASTER) in rtl9300_i2c_probe()
410 fields[i].reg += i2c->reg_base; in rtl9300_i2c_probe()
412 ret = devm_regmap_field_bulk_alloc(dev, i2c->regmap, i2c->fields, in rtl9300_i2c_probe()
419 struct rtl9300_i2c_chan *chan = &i2c->chans[i]; in rtl9300_i2c_probe()
420 struct i2c_adapter *adap = &chan->adap; in rtl9300_i2c_probe()
426 ret = fwnode_property_read_u32(child, "clock-frequency", &clock_freq); in rtl9300_i2c_probe()
432 chan->bus_freq = RTL9300_I2C_STD_FREQ; in rtl9300_i2c_probe()
435 chan->bus_freq = RTL9300_I2C_FAST_FREQ; in rtl9300_i2c_probe()
438 dev_warn(i2c->dev, "SDA%d clock-frequency %d not supported using default\n", in rtl9300_i2c_probe()
443 chan->sda_num = sda_num; in rtl9300_i2c_probe()
444 chan->i2c = i2c; in rtl9300_i2c_probe()
445 adap = &i2c->chans[i].adap; in rtl9300_i2c_probe()
446 adap->owner = THIS_MODULE; in rtl9300_i2c_probe()
447 adap->algo = &rtl9300_i2c_algo; in rtl9300_i2c_probe()
448 adap->quirks = &rtl9300_i2c_quirks; in rtl9300_i2c_probe()
449 adap->retries = 3; in rtl9300_i2c_probe()
450 adap->dev.parent = dev; in rtl9300_i2c_probe()
452 adap->dev.of_node = to_of_node(child); in rtl9300_i2c_probe()
453 snprintf(adap->name, sizeof(adap->name), "%s SDA%d\n", dev_name(dev), sda_num); in rtl9300_i2c_probe()
460 i2c->sda_num = 0xff; in rtl9300_i2c_probe()
463 ret = regmap_field_write(i2c->fields[F_RD_MODE], 0); in rtl9300_i2c_probe()
516 { .compatible = "realtek,rtl9301-i2c", .data = (void *) &rtl9300_i2c_drv_data },
517 { .compatible = "realtek,rtl9302b-i2c", .data = (void *) &rtl9300_i2c_drv_data },
518 { .compatible = "realtek,rtl9302c-i2c", .data = (void *) &rtl9300_i2c_drv_data },
519 { .compatible = "realtek,rtl9303-i2c", .data = (void *) &rtl9300_i2c_drv_data },
520 { .compatible = "realtek,rtl9310-i2c", .data = (void *) &rtl9310_i2c_drv_data },
521 { .compatible = "realtek,rtl9311-i2c", .data = (void *) &rtl9310_i2c_drv_data },
522 { .compatible = "realtek,rtl9312-i2c", .data = (void *) &rtl9310_i2c_drv_data },
523 { .compatible = "realtek,rtl9313-i2c", .data = (void *) &rtl9310_i2c_drv_data },
531 .name = "i2c-rtl9300",
538 MODULE_DESCRIPTION("RTL9300 I2C controller driver");