Lines Matching refs:i2cd
61 static void gpu_enable_i2c_bus(struct gpu_i2c_dev *i2cd) in gpu_enable_i2c_bus() argument
66 val = readl(i2cd->regs + I2C_MST_HYBRID_PADCTL); in gpu_enable_i2c_bus()
70 writel(val, i2cd->regs + I2C_MST_HYBRID_PADCTL); in gpu_enable_i2c_bus()
77 writel(val, i2cd->regs + I2C_MST_I2C0_TIMING); in gpu_enable_i2c_bus()
80 static int gpu_i2c_check_status(struct gpu_i2c_dev *i2cd) in gpu_i2c_check_status() argument
85 ret = readl_poll_timeout(i2cd->regs + I2C_MST_CNTL, val, in gpu_i2c_check_status()
91 dev_err(i2cd->dev, "i2c timeout error %x\n", val); in gpu_i2c_check_status()
95 val = readl(i2cd->regs + I2C_MST_CNTL); in gpu_i2c_check_status()
108 static int gpu_i2c_read(struct gpu_i2c_dev *i2cd, u8 *data, u16 len) in gpu_i2c_read() argument
116 writel(val, i2cd->regs + I2C_MST_CNTL); in gpu_i2c_read()
118 status = gpu_i2c_check_status(i2cd); in gpu_i2c_read()
122 val = readl(i2cd->regs + I2C_MST_DATA); in gpu_i2c_read()
142 static int gpu_i2c_start(struct gpu_i2c_dev *i2cd) in gpu_i2c_start() argument
144 writel(I2C_MST_CNTL_GEN_START, i2cd->regs + I2C_MST_CNTL); in gpu_i2c_start()
145 return gpu_i2c_check_status(i2cd); in gpu_i2c_start()
148 static int gpu_i2c_stop(struct gpu_i2c_dev *i2cd) in gpu_i2c_stop() argument
150 writel(I2C_MST_CNTL_GEN_STOP, i2cd->regs + I2C_MST_CNTL); in gpu_i2c_stop()
151 return gpu_i2c_check_status(i2cd); in gpu_i2c_stop()
154 static int gpu_i2c_write(struct gpu_i2c_dev *i2cd, u8 data) in gpu_i2c_write() argument
158 writel(data, i2cd->regs + I2C_MST_DATA); in gpu_i2c_write()
161 writel(val, i2cd->regs + I2C_MST_CNTL); in gpu_i2c_write()
163 return gpu_i2c_check_status(i2cd); in gpu_i2c_write()
169 struct gpu_i2c_dev *i2cd = i2c_get_adapdata(adap); in gpu_i2c_master_xfer() local
178 pm_runtime_get_sync(i2cd->dev); in gpu_i2c_master_xfer()
182 writel(msgs[i].addr, i2cd->regs + I2C_MST_ADDR); in gpu_i2c_master_xfer()
184 status = gpu_i2c_read(i2cd, msgs[i].buf, msgs[i].len); in gpu_i2c_master_xfer()
190 status = gpu_i2c_start(i2cd); in gpu_i2c_master_xfer()
197 status = gpu_i2c_write(i2cd, addr); in gpu_i2c_master_xfer()
202 status = gpu_i2c_write(i2cd, msgs[i].buf[j]); in gpu_i2c_master_xfer()
209 status = gpu_i2c_stop(i2cd); in gpu_i2c_master_xfer()
216 status2 = gpu_i2c_stop(i2cd); in gpu_i2c_master_xfer()
218 dev_err(i2cd->dev, "i2c stop failed %d\n", status2); in gpu_i2c_master_xfer()
220 pm_runtime_mark_last_busy(i2cd->dev); in gpu_i2c_master_xfer()
221 pm_runtime_put_autosuspend(i2cd->dev); in gpu_i2c_master_xfer()
277 struct gpu_i2c_dev *i2cd; in gpu_i2c_probe() local
280 i2cd = devm_kzalloc(dev, sizeof(*i2cd), GFP_KERNEL); in gpu_i2c_probe()
281 if (!i2cd) in gpu_i2c_probe()
284 i2cd->dev = dev; in gpu_i2c_probe()
285 dev_set_drvdata(dev, i2cd); in gpu_i2c_probe()
293 i2cd->regs = pcim_iomap(pdev, 0, 0); in gpu_i2c_probe()
294 if (!i2cd->regs) in gpu_i2c_probe()
301 gpu_enable_i2c_bus(i2cd); in gpu_i2c_probe()
303 i2c_set_adapdata(&i2cd->adapter, i2cd); in gpu_i2c_probe()
304 i2cd->adapter.owner = THIS_MODULE; in gpu_i2c_probe()
305 strscpy(i2cd->adapter.name, "NVIDIA GPU I2C adapter", in gpu_i2c_probe()
306 sizeof(i2cd->adapter.name)); in gpu_i2c_probe()
307 i2cd->adapter.algo = &gpu_i2c_algorithm; in gpu_i2c_probe()
308 i2cd->adapter.quirks = &gpu_i2c_quirks; in gpu_i2c_probe()
309 i2cd->adapter.dev.parent = dev; in gpu_i2c_probe()
310 status = i2c_add_adapter(&i2cd->adapter); in gpu_i2c_probe()
314 i2cd->ccgx_client = i2c_new_ccgx_ucsi(&i2cd->adapter, pdev->irq, &ccgx_node); in gpu_i2c_probe()
315 if (IS_ERR(i2cd->ccgx_client)) { in gpu_i2c_probe()
316 status = dev_err_probe(dev, PTR_ERR(i2cd->ccgx_client), "register UCSI failed\n"); in gpu_i2c_probe()
328 i2c_del_adapter(&i2cd->adapter); in gpu_i2c_probe()
336 struct gpu_i2c_dev *i2cd = pci_get_drvdata(pdev); in gpu_i2c_remove() local
338 pm_runtime_get_noresume(i2cd->dev); in gpu_i2c_remove()
339 i2c_del_adapter(&i2cd->adapter); in gpu_i2c_remove()
347 struct gpu_i2c_dev *i2cd = dev_get_drvdata(dev); in gpu_i2c_resume() local
349 gpu_enable_i2c_bus(i2cd); in gpu_i2c_resume()
356 pm_request_resume(&i2cd->ccgx_client->dev); in gpu_i2c_resume()