162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Bitbanging I2C bus driver using the GPIO API 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2007 Atmel Corporation 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <linux/completion.h> 862306a36Sopenharmony_ci#include <linux/debugfs.h> 962306a36Sopenharmony_ci#include <linux/delay.h> 1062306a36Sopenharmony_ci#include <linux/gpio/consumer.h> 1162306a36Sopenharmony_ci#include <linux/i2c-algo-bit.h> 1262306a36Sopenharmony_ci#include <linux/i2c.h> 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/interrupt.h> 1562306a36Sopenharmony_ci#include <linux/module.h> 1662306a36Sopenharmony_ci#include <linux/platform_data/i2c-gpio.h> 1762306a36Sopenharmony_ci#include <linux/platform_device.h> 1862306a36Sopenharmony_ci#include <linux/property.h> 1962306a36Sopenharmony_ci#include <linux/slab.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistruct i2c_gpio_private_data { 2262306a36Sopenharmony_ci struct gpio_desc *sda; 2362306a36Sopenharmony_ci struct gpio_desc *scl; 2462306a36Sopenharmony_ci struct i2c_adapter adap; 2562306a36Sopenharmony_ci struct i2c_algo_bit_data bit_data; 2662306a36Sopenharmony_ci struct i2c_gpio_platform_data pdata; 2762306a36Sopenharmony_ci#ifdef CONFIG_I2C_GPIO_FAULT_INJECTOR 2862306a36Sopenharmony_ci struct dentry *debug_dir; 2962306a36Sopenharmony_ci /* these must be protected by bus lock */ 3062306a36Sopenharmony_ci struct completion scl_irq_completion; 3162306a36Sopenharmony_ci u64 scl_irq_data; 3262306a36Sopenharmony_ci#endif 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * Toggle SDA by changing the output value of the pin. This is only 3762306a36Sopenharmony_ci * valid for pins configured as open drain (i.e. setting the value 3862306a36Sopenharmony_ci * high effectively turns off the output driver.) 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_cistatic void i2c_gpio_setsda_val(void *data, int state) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = data; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci gpiod_set_value_cansleep(priv->sda, state); 4562306a36Sopenharmony_ci} 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* 4862306a36Sopenharmony_ci * Toggle SCL by changing the output value of the pin. This is used 4962306a36Sopenharmony_ci * for pins that are configured as open drain and for output-only 5062306a36Sopenharmony_ci * pins. The latter case will break the i2c protocol, but it will 5162306a36Sopenharmony_ci * often work in practice. 5262306a36Sopenharmony_ci */ 5362306a36Sopenharmony_cistatic void i2c_gpio_setscl_val(void *data, int state) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = data; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci gpiod_set_value_cansleep(priv->scl, state); 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic int i2c_gpio_getsda(void *data) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = data; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci return gpiod_get_value_cansleep(priv->sda); 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistatic int i2c_gpio_getscl(void *data) 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = data; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci return gpiod_get_value_cansleep(priv->scl); 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#ifdef CONFIG_I2C_GPIO_FAULT_INJECTOR 7562306a36Sopenharmony_cistatic struct dentry *i2c_gpio_debug_dir; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define setsda(bd, val) ((bd)->setsda((bd)->data, val)) 7862306a36Sopenharmony_ci#define setscl(bd, val) ((bd)->setscl((bd)->data, val)) 7962306a36Sopenharmony_ci#define getsda(bd) ((bd)->getsda((bd)->data)) 8062306a36Sopenharmony_ci#define getscl(bd) ((bd)->getscl((bd)->data)) 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci#define WIRE_ATTRIBUTE(wire) \ 8362306a36Sopenharmony_cistatic int fops_##wire##_get(void *data, u64 *val) \ 8462306a36Sopenharmony_ci{ \ 8562306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = data; \ 8662306a36Sopenharmony_ci \ 8762306a36Sopenharmony_ci i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ 8862306a36Sopenharmony_ci *val = get##wire(&priv->bit_data); \ 8962306a36Sopenharmony_ci i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ 9062306a36Sopenharmony_ci return 0; \ 9162306a36Sopenharmony_ci} \ 9262306a36Sopenharmony_cistatic int fops_##wire##_set(void *data, u64 val) \ 9362306a36Sopenharmony_ci{ \ 9462306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = data; \ 9562306a36Sopenharmony_ci \ 9662306a36Sopenharmony_ci i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ 9762306a36Sopenharmony_ci set##wire(&priv->bit_data, val); \ 9862306a36Sopenharmony_ci i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ 9962306a36Sopenharmony_ci return 0; \ 10062306a36Sopenharmony_ci} \ 10162306a36Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_##wire, fops_##wire##_get, fops_##wire##_set, "%llu\n") 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ciWIRE_ATTRIBUTE(scl); 10462306a36Sopenharmony_ciWIRE_ATTRIBUTE(sda); 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistatic void i2c_gpio_incomplete_transfer(struct i2c_gpio_private_data *priv, 10762306a36Sopenharmony_ci u32 pattern, u8 pattern_size) 10862306a36Sopenharmony_ci{ 10962306a36Sopenharmony_ci struct i2c_algo_bit_data *bit_data = &priv->bit_data; 11062306a36Sopenharmony_ci int i; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci /* START condition */ 11562306a36Sopenharmony_ci setsda(bit_data, 0); 11662306a36Sopenharmony_ci udelay(bit_data->udelay); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci /* Send pattern, request ACK, don't send STOP */ 11962306a36Sopenharmony_ci for (i = pattern_size - 1; i >= 0; i--) { 12062306a36Sopenharmony_ci setscl(bit_data, 0); 12162306a36Sopenharmony_ci udelay(bit_data->udelay / 2); 12262306a36Sopenharmony_ci setsda(bit_data, (pattern >> i) & 1); 12362306a36Sopenharmony_ci udelay((bit_data->udelay + 1) / 2); 12462306a36Sopenharmony_ci setscl(bit_data, 1); 12562306a36Sopenharmony_ci udelay(bit_data->udelay); 12662306a36Sopenharmony_ci } 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); 12962306a36Sopenharmony_ci} 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistatic int fops_incomplete_addr_phase_set(void *data, u64 addr) 13262306a36Sopenharmony_ci{ 13362306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = data; 13462306a36Sopenharmony_ci u32 pattern; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci if (addr > 0x7f) 13762306a36Sopenharmony_ci return -EINVAL; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci /* ADDR (7 bit) + RD (1 bit) + Client ACK, keep SDA hi (1 bit) */ 14062306a36Sopenharmony_ci pattern = (addr << 2) | 3; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci i2c_gpio_incomplete_transfer(priv, pattern, 9); 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci return 0; 14562306a36Sopenharmony_ci} 14662306a36Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_incomplete_addr_phase, NULL, fops_incomplete_addr_phase_set, "%llu\n"); 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistatic int fops_incomplete_write_byte_set(void *data, u64 addr) 14962306a36Sopenharmony_ci{ 15062306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = data; 15162306a36Sopenharmony_ci u32 pattern; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci if (addr > 0x7f) 15462306a36Sopenharmony_ci return -EINVAL; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci /* ADDR (7 bit) + WR (1 bit) + Client ACK (1 bit) */ 15762306a36Sopenharmony_ci pattern = (addr << 2) | 1; 15862306a36Sopenharmony_ci /* 0x00 (8 bit) + Client ACK, keep SDA hi (1 bit) */ 15962306a36Sopenharmony_ci pattern = (pattern << 9) | 1; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci i2c_gpio_incomplete_transfer(priv, pattern, 18); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci return 0; 16462306a36Sopenharmony_ci} 16562306a36Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_incomplete_write_byte, NULL, fops_incomplete_write_byte_set, "%llu\n"); 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cistatic int i2c_gpio_fi_act_on_scl_irq(struct i2c_gpio_private_data *priv, 16862306a36Sopenharmony_ci irqreturn_t handler(int, void*)) 16962306a36Sopenharmony_ci{ 17062306a36Sopenharmony_ci int ret, irq = gpiod_to_irq(priv->scl); 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci if (irq < 0) 17362306a36Sopenharmony_ci return irq; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci ret = gpiod_direction_input(priv->scl); 17862306a36Sopenharmony_ci if (ret) 17962306a36Sopenharmony_ci goto unlock; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci reinit_completion(&priv->scl_irq_completion); 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci ret = request_irq(irq, handler, IRQF_TRIGGER_FALLING, 18462306a36Sopenharmony_ci "i2c_gpio_fault_injector_scl_irq", priv); 18562306a36Sopenharmony_ci if (ret) 18662306a36Sopenharmony_ci goto output; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci wait_for_completion_interruptible(&priv->scl_irq_completion); 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci free_irq(irq, priv); 19162306a36Sopenharmony_ci output: 19262306a36Sopenharmony_ci ret = gpiod_direction_output(priv->scl, 1) ?: ret; 19362306a36Sopenharmony_ci unlock: 19462306a36Sopenharmony_ci i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci return ret; 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistatic irqreturn_t lose_arbitration_irq(int irq, void *dev_id) 20062306a36Sopenharmony_ci{ 20162306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = dev_id; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci setsda(&priv->bit_data, 0); 20462306a36Sopenharmony_ci udelay(priv->scl_irq_data); 20562306a36Sopenharmony_ci setsda(&priv->bit_data, 1); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci complete(&priv->scl_irq_completion); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci return IRQ_HANDLED; 21062306a36Sopenharmony_ci} 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_cistatic int fops_lose_arbitration_set(void *data, u64 duration) 21362306a36Sopenharmony_ci{ 21462306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = data; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci if (duration > 100 * 1000) 21762306a36Sopenharmony_ci return -EINVAL; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci priv->scl_irq_data = duration; 22062306a36Sopenharmony_ci /* 22162306a36Sopenharmony_ci * Interrupt on falling SCL. This ensures that the master under test has 22262306a36Sopenharmony_ci * really started the transfer. Interrupt on falling SDA did only 22362306a36Sopenharmony_ci * exercise 'bus busy' detection on some HW but not 'arbitration lost'. 22462306a36Sopenharmony_ci * Note that the interrupt latency may cause the first bits to be 22562306a36Sopenharmony_ci * transmitted correctly. 22662306a36Sopenharmony_ci */ 22762306a36Sopenharmony_ci return i2c_gpio_fi_act_on_scl_irq(priv, lose_arbitration_irq); 22862306a36Sopenharmony_ci} 22962306a36Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_lose_arbitration, NULL, fops_lose_arbitration_set, "%llu\n"); 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_cistatic irqreturn_t inject_panic_irq(int irq, void *dev_id) 23262306a36Sopenharmony_ci{ 23362306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = dev_id; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci udelay(priv->scl_irq_data); 23662306a36Sopenharmony_ci panic("I2C fault injector induced panic"); 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci return IRQ_HANDLED; 23962306a36Sopenharmony_ci} 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistatic int fops_inject_panic_set(void *data, u64 duration) 24262306a36Sopenharmony_ci{ 24362306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = data; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci if (duration > 100 * 1000) 24662306a36Sopenharmony_ci return -EINVAL; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci priv->scl_irq_data = duration; 24962306a36Sopenharmony_ci /* 25062306a36Sopenharmony_ci * Interrupt on falling SCL. This ensures that the master under test has 25162306a36Sopenharmony_ci * really started the transfer. 25262306a36Sopenharmony_ci */ 25362306a36Sopenharmony_ci return i2c_gpio_fi_act_on_scl_irq(priv, inject_panic_irq); 25462306a36Sopenharmony_ci} 25562306a36Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(fops_inject_panic, NULL, fops_inject_panic_set, "%llu\n"); 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_cistatic void i2c_gpio_fault_injector_init(struct platform_device *pdev) 25862306a36Sopenharmony_ci{ 25962306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = platform_get_drvdata(pdev); 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci /* 26262306a36Sopenharmony_ci * If there will be a debugfs-dir per i2c adapter somewhen, put the 26362306a36Sopenharmony_ci * 'fault-injector' dir there. Until then, we have a global dir with 26462306a36Sopenharmony_ci * all adapters as subdirs. 26562306a36Sopenharmony_ci */ 26662306a36Sopenharmony_ci if (!i2c_gpio_debug_dir) { 26762306a36Sopenharmony_ci i2c_gpio_debug_dir = debugfs_create_dir("i2c-fault-injector", NULL); 26862306a36Sopenharmony_ci if (!i2c_gpio_debug_dir) 26962306a36Sopenharmony_ci return; 27062306a36Sopenharmony_ci } 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci priv->debug_dir = debugfs_create_dir(pdev->name, i2c_gpio_debug_dir); 27362306a36Sopenharmony_ci if (!priv->debug_dir) 27462306a36Sopenharmony_ci return; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci init_completion(&priv->scl_irq_completion); 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci debugfs_create_file_unsafe("incomplete_address_phase", 0200, priv->debug_dir, 27962306a36Sopenharmony_ci priv, &fops_incomplete_addr_phase); 28062306a36Sopenharmony_ci debugfs_create_file_unsafe("incomplete_write_byte", 0200, priv->debug_dir, 28162306a36Sopenharmony_ci priv, &fops_incomplete_write_byte); 28262306a36Sopenharmony_ci if (priv->bit_data.getscl) { 28362306a36Sopenharmony_ci debugfs_create_file_unsafe("inject_panic", 0200, priv->debug_dir, 28462306a36Sopenharmony_ci priv, &fops_inject_panic); 28562306a36Sopenharmony_ci debugfs_create_file_unsafe("lose_arbitration", 0200, priv->debug_dir, 28662306a36Sopenharmony_ci priv, &fops_lose_arbitration); 28762306a36Sopenharmony_ci } 28862306a36Sopenharmony_ci debugfs_create_file_unsafe("scl", 0600, priv->debug_dir, priv, &fops_scl); 28962306a36Sopenharmony_ci debugfs_create_file_unsafe("sda", 0600, priv->debug_dir, priv, &fops_sda); 29062306a36Sopenharmony_ci} 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cistatic void i2c_gpio_fault_injector_exit(struct platform_device *pdev) 29362306a36Sopenharmony_ci{ 29462306a36Sopenharmony_ci struct i2c_gpio_private_data *priv = platform_get_drvdata(pdev); 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci debugfs_remove_recursive(priv->debug_dir); 29762306a36Sopenharmony_ci} 29862306a36Sopenharmony_ci#else 29962306a36Sopenharmony_cistatic inline void i2c_gpio_fault_injector_init(struct platform_device *pdev) {} 30062306a36Sopenharmony_cistatic inline void i2c_gpio_fault_injector_exit(struct platform_device *pdev) {} 30162306a36Sopenharmony_ci#endif /* CONFIG_I2C_GPIO_FAULT_INJECTOR*/ 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci/* Get i2c-gpio properties from DT or ACPI table */ 30462306a36Sopenharmony_cistatic void i2c_gpio_get_properties(struct device *dev, 30562306a36Sopenharmony_ci struct i2c_gpio_platform_data *pdata) 30662306a36Sopenharmony_ci{ 30762306a36Sopenharmony_ci u32 reg; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci device_property_read_u32(dev, "i2c-gpio,delay-us", &pdata->udelay); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci if (!device_property_read_u32(dev, "i2c-gpio,timeout-ms", ®)) 31262306a36Sopenharmony_ci pdata->timeout = msecs_to_jiffies(reg); 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci pdata->sda_is_open_drain = 31562306a36Sopenharmony_ci device_property_read_bool(dev, "i2c-gpio,sda-open-drain"); 31662306a36Sopenharmony_ci pdata->scl_is_open_drain = 31762306a36Sopenharmony_ci device_property_read_bool(dev, "i2c-gpio,scl-open-drain"); 31862306a36Sopenharmony_ci pdata->scl_is_output_only = 31962306a36Sopenharmony_ci device_property_read_bool(dev, "i2c-gpio,scl-output-only"); 32062306a36Sopenharmony_ci pdata->sda_is_output_only = 32162306a36Sopenharmony_ci device_property_read_bool(dev, "i2c-gpio,sda-output-only"); 32262306a36Sopenharmony_ci pdata->sda_has_no_pullup = 32362306a36Sopenharmony_ci device_property_read_bool(dev, "i2c-gpio,sda-has-no-pullup"); 32462306a36Sopenharmony_ci pdata->scl_has_no_pullup = 32562306a36Sopenharmony_ci device_property_read_bool(dev, "i2c-gpio,scl-has-no-pullup"); 32662306a36Sopenharmony_ci} 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic struct gpio_desc *i2c_gpio_get_desc(struct device *dev, 32962306a36Sopenharmony_ci const char *con_id, 33062306a36Sopenharmony_ci unsigned int index, 33162306a36Sopenharmony_ci enum gpiod_flags gflags) 33262306a36Sopenharmony_ci{ 33362306a36Sopenharmony_ci struct gpio_desc *retdesc; 33462306a36Sopenharmony_ci int ret; 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci retdesc = devm_gpiod_get(dev, con_id, gflags); 33762306a36Sopenharmony_ci if (!IS_ERR(retdesc)) { 33862306a36Sopenharmony_ci dev_dbg(dev, "got GPIO from name %s\n", con_id); 33962306a36Sopenharmony_ci return retdesc; 34062306a36Sopenharmony_ci } 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci retdesc = devm_gpiod_get_index(dev, NULL, index, gflags); 34362306a36Sopenharmony_ci if (!IS_ERR(retdesc)) { 34462306a36Sopenharmony_ci dev_dbg(dev, "got GPIO from index %u\n", index); 34562306a36Sopenharmony_ci return retdesc; 34662306a36Sopenharmony_ci } 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci ret = PTR_ERR(retdesc); 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci /* FIXME: hack in the old code, is this really necessary? */ 35162306a36Sopenharmony_ci if (ret == -EINVAL) 35262306a36Sopenharmony_ci retdesc = ERR_PTR(-EPROBE_DEFER); 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci /* This happens if the GPIO driver is not yet probed, let's defer */ 35562306a36Sopenharmony_ci if (ret == -ENOENT) 35662306a36Sopenharmony_ci retdesc = ERR_PTR(-EPROBE_DEFER); 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci if (PTR_ERR(retdesc) != -EPROBE_DEFER) 35962306a36Sopenharmony_ci dev_err(dev, "error trying to get descriptor: %d\n", ret); 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci return retdesc; 36262306a36Sopenharmony_ci} 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_cistatic int i2c_gpio_probe(struct platform_device *pdev) 36562306a36Sopenharmony_ci{ 36662306a36Sopenharmony_ci struct i2c_gpio_private_data *priv; 36762306a36Sopenharmony_ci struct i2c_gpio_platform_data *pdata; 36862306a36Sopenharmony_ci struct i2c_algo_bit_data *bit_data; 36962306a36Sopenharmony_ci struct i2c_adapter *adap; 37062306a36Sopenharmony_ci struct device *dev = &pdev->dev; 37162306a36Sopenharmony_ci struct fwnode_handle *fwnode = dev_fwnode(dev); 37262306a36Sopenharmony_ci enum gpiod_flags gflags; 37362306a36Sopenharmony_ci int ret; 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 37662306a36Sopenharmony_ci if (!priv) 37762306a36Sopenharmony_ci return -ENOMEM; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci adap = &priv->adap; 38062306a36Sopenharmony_ci bit_data = &priv->bit_data; 38162306a36Sopenharmony_ci pdata = &priv->pdata; 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci if (fwnode) { 38462306a36Sopenharmony_ci i2c_gpio_get_properties(dev, pdata); 38562306a36Sopenharmony_ci } else { 38662306a36Sopenharmony_ci /* 38762306a36Sopenharmony_ci * If all platform data settings are zero it is OK 38862306a36Sopenharmony_ci * to not provide any platform data from the board. 38962306a36Sopenharmony_ci */ 39062306a36Sopenharmony_ci if (dev_get_platdata(dev)) 39162306a36Sopenharmony_ci memcpy(pdata, dev_get_platdata(dev), sizeof(*pdata)); 39262306a36Sopenharmony_ci } 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci /* 39562306a36Sopenharmony_ci * First get the GPIO pins; if it fails, we'll defer the probe. 39662306a36Sopenharmony_ci * If the SCL/SDA lines are marked "open drain" by platform data or 39762306a36Sopenharmony_ci * device tree then this means that something outside of our control is 39862306a36Sopenharmony_ci * marking these lines to be handled as open drain, and we should just 39962306a36Sopenharmony_ci * handle them as we handle any other output. Else we enforce open 40062306a36Sopenharmony_ci * drain as this is required for an I2C bus. 40162306a36Sopenharmony_ci */ 40262306a36Sopenharmony_ci if (pdata->sda_is_open_drain || pdata->sda_has_no_pullup) 40362306a36Sopenharmony_ci gflags = GPIOD_OUT_HIGH; 40462306a36Sopenharmony_ci else 40562306a36Sopenharmony_ci gflags = GPIOD_OUT_HIGH_OPEN_DRAIN; 40662306a36Sopenharmony_ci priv->sda = i2c_gpio_get_desc(dev, "sda", 0, gflags); 40762306a36Sopenharmony_ci if (IS_ERR(priv->sda)) 40862306a36Sopenharmony_ci return PTR_ERR(priv->sda); 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci if (pdata->scl_is_open_drain || pdata->scl_has_no_pullup) 41162306a36Sopenharmony_ci gflags = GPIOD_OUT_HIGH; 41262306a36Sopenharmony_ci else 41362306a36Sopenharmony_ci gflags = GPIOD_OUT_HIGH_OPEN_DRAIN; 41462306a36Sopenharmony_ci priv->scl = i2c_gpio_get_desc(dev, "scl", 1, gflags); 41562306a36Sopenharmony_ci if (IS_ERR(priv->scl)) 41662306a36Sopenharmony_ci return PTR_ERR(priv->scl); 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci if (gpiod_cansleep(priv->sda) || gpiod_cansleep(priv->scl)) 41962306a36Sopenharmony_ci dev_warn(dev, "Slow GPIO pins might wreak havoc into I2C/SMBus bus timing"); 42062306a36Sopenharmony_ci else 42162306a36Sopenharmony_ci bit_data->can_do_atomic = true; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci bit_data->setsda = i2c_gpio_setsda_val; 42462306a36Sopenharmony_ci bit_data->setscl = i2c_gpio_setscl_val; 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci if (!pdata->scl_is_output_only) 42762306a36Sopenharmony_ci bit_data->getscl = i2c_gpio_getscl; 42862306a36Sopenharmony_ci if (!pdata->sda_is_output_only) 42962306a36Sopenharmony_ci bit_data->getsda = i2c_gpio_getsda; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci if (pdata->udelay) 43262306a36Sopenharmony_ci bit_data->udelay = pdata->udelay; 43362306a36Sopenharmony_ci else if (pdata->scl_is_output_only) 43462306a36Sopenharmony_ci bit_data->udelay = 50; /* 10 kHz */ 43562306a36Sopenharmony_ci else 43662306a36Sopenharmony_ci bit_data->udelay = 5; /* 100 kHz */ 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci if (pdata->timeout) 43962306a36Sopenharmony_ci bit_data->timeout = pdata->timeout; 44062306a36Sopenharmony_ci else 44162306a36Sopenharmony_ci bit_data->timeout = HZ / 10; /* 100 ms */ 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci bit_data->data = priv; 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci adap->owner = THIS_MODULE; 44662306a36Sopenharmony_ci if (fwnode) 44762306a36Sopenharmony_ci strscpy(adap->name, dev_name(dev), sizeof(adap->name)); 44862306a36Sopenharmony_ci else 44962306a36Sopenharmony_ci snprintf(adap->name, sizeof(adap->name), "i2c-gpio%d", pdev->id); 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci adap->algo_data = bit_data; 45262306a36Sopenharmony_ci adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; 45362306a36Sopenharmony_ci adap->dev.parent = dev; 45462306a36Sopenharmony_ci device_set_node(&adap->dev, fwnode); 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci adap->nr = pdev->id; 45762306a36Sopenharmony_ci ret = i2c_bit_add_numbered_bus(adap); 45862306a36Sopenharmony_ci if (ret) 45962306a36Sopenharmony_ci return ret; 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci platform_set_drvdata(pdev, priv); 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci /* 46462306a36Sopenharmony_ci * FIXME: using global GPIO numbers is not helpful. If/when we 46562306a36Sopenharmony_ci * get accessors to get the actual name of the GPIO line, 46662306a36Sopenharmony_ci * from the descriptor, then provide that instead. 46762306a36Sopenharmony_ci */ 46862306a36Sopenharmony_ci dev_info(dev, "using lines %u (SDA) and %u (SCL%s)\n", 46962306a36Sopenharmony_ci desc_to_gpio(priv->sda), desc_to_gpio(priv->scl), 47062306a36Sopenharmony_ci pdata->scl_is_output_only 47162306a36Sopenharmony_ci ? ", no clock stretching" : ""); 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci i2c_gpio_fault_injector_init(pdev); 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci return 0; 47662306a36Sopenharmony_ci} 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_cistatic void i2c_gpio_remove(struct platform_device *pdev) 47962306a36Sopenharmony_ci{ 48062306a36Sopenharmony_ci struct i2c_gpio_private_data *priv; 48162306a36Sopenharmony_ci struct i2c_adapter *adap; 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci i2c_gpio_fault_injector_exit(pdev); 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci priv = platform_get_drvdata(pdev); 48662306a36Sopenharmony_ci adap = &priv->adap; 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_ci i2c_del_adapter(adap); 48962306a36Sopenharmony_ci} 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_cistatic const struct of_device_id i2c_gpio_dt_ids[] = { 49262306a36Sopenharmony_ci { .compatible = "i2c-gpio", }, 49362306a36Sopenharmony_ci { /* sentinel */ } 49462306a36Sopenharmony_ci}; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, i2c_gpio_dt_ids); 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_cistatic const struct acpi_device_id i2c_gpio_acpi_match[] = { 49962306a36Sopenharmony_ci { "LOON0005" }, /* LoongArch */ 50062306a36Sopenharmony_ci { } 50162306a36Sopenharmony_ci}; 50262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(acpi, i2c_gpio_acpi_match); 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_cistatic struct platform_driver i2c_gpio_driver = { 50562306a36Sopenharmony_ci .driver = { 50662306a36Sopenharmony_ci .name = "i2c-gpio", 50762306a36Sopenharmony_ci .of_match_table = i2c_gpio_dt_ids, 50862306a36Sopenharmony_ci .acpi_match_table = i2c_gpio_acpi_match, 50962306a36Sopenharmony_ci }, 51062306a36Sopenharmony_ci .probe = i2c_gpio_probe, 51162306a36Sopenharmony_ci .remove_new = i2c_gpio_remove, 51262306a36Sopenharmony_ci}; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_cistatic int __init i2c_gpio_init(void) 51562306a36Sopenharmony_ci{ 51662306a36Sopenharmony_ci int ret; 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci ret = platform_driver_register(&i2c_gpio_driver); 51962306a36Sopenharmony_ci if (ret) 52062306a36Sopenharmony_ci printk(KERN_ERR "i2c-gpio: probe failed: %d\n", ret); 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ci return ret; 52362306a36Sopenharmony_ci} 52462306a36Sopenharmony_cisubsys_initcall(i2c_gpio_init); 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_cistatic void __exit i2c_gpio_exit(void) 52762306a36Sopenharmony_ci{ 52862306a36Sopenharmony_ci platform_driver_unregister(&i2c_gpio_driver); 52962306a36Sopenharmony_ci} 53062306a36Sopenharmony_cimodule_exit(i2c_gpio_exit); 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_ciMODULE_AUTHOR("Haavard Skinnemoen (Atmel)"); 53362306a36Sopenharmony_ciMODULE_DESCRIPTION("Platform-independent bitbanging I2C driver"); 53462306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 53562306a36Sopenharmony_ciMODULE_ALIAS("platform:i2c-gpio"); 536