Lines Matching refs:adap
65 struct cht_wc_i2c_adap *adap = data; in cht_wc_i2c_adap_thread_handler() local
68 mutex_lock(&adap->adap_lock); in cht_wc_i2c_adap_thread_handler()
71 ret = regmap_read(adap->regmap, CHT_WC_EXTCHGRIRQ, ®); in cht_wc_i2c_adap_thread_handler()
73 dev_err(&adap->adapter.dev, "Error reading extchgrirq reg\n"); in cht_wc_i2c_adap_thread_handler()
74 mutex_unlock(&adap->adap_lock); in cht_wc_i2c_adap_thread_handler()
78 reg &= ~adap->irq_mask; in cht_wc_i2c_adap_thread_handler()
81 ret = regmap_read(adap->regmap, CHT_WC_I2C_RDDATA, &adap->read_data); in cht_wc_i2c_adap_thread_handler()
83 adap->io_error = true; in cht_wc_i2c_adap_thread_handler()
89 ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ, reg); in cht_wc_i2c_adap_thread_handler()
91 dev_err(&adap->adapter.dev, "Error writing extchgrirq reg\n"); in cht_wc_i2c_adap_thread_handler()
94 adap->io_error |= !!(reg & CHT_WC_EXTCHGRIRQ_NACK_IRQ); in cht_wc_i2c_adap_thread_handler()
95 adap->done = true; in cht_wc_i2c_adap_thread_handler()
98 mutex_unlock(&adap->adap_lock); in cht_wc_i2c_adap_thread_handler()
101 wake_up(&adap->wait); in cht_wc_i2c_adap_thread_handler()
115 generic_handle_irq(adap->client_irq); in cht_wc_i2c_adap_thread_handler()
122 static u32 cht_wc_i2c_adap_master_func(struct i2c_adapter *adap) in cht_wc_i2c_adap_master_func() argument
133 struct cht_wc_i2c_adap *adap = i2c_get_adapdata(_adap); in cht_wc_i2c_adap_smbus_xfer() local
136 mutex_lock(&adap->adap_lock); in cht_wc_i2c_adap_smbus_xfer()
137 adap->io_error = false; in cht_wc_i2c_adap_smbus_xfer()
138 adap->done = false; in cht_wc_i2c_adap_smbus_xfer()
139 mutex_unlock(&adap->adap_lock); in cht_wc_i2c_adap_smbus_xfer()
141 ret = regmap_write(adap->regmap, CHT_WC_I2C_CLIENT_ADDR, addr); in cht_wc_i2c_adap_smbus_xfer()
146 ret = regmap_write(adap->regmap, CHT_WC_I2C_WRDATA, data->byte); in cht_wc_i2c_adap_smbus_xfer()
151 ret = regmap_write(adap->regmap, CHT_WC_I2C_REG_OFFSET, command); in cht_wc_i2c_adap_smbus_xfer()
155 ret = regmap_write(adap->regmap, CHT_WC_I2C_CTRL, in cht_wc_i2c_adap_smbus_xfer()
161 ret = wait_event_timeout(adap->wait, adap->done, msecs_to_jiffies(30)); in cht_wc_i2c_adap_smbus_xfer()
167 cht_wc_i2c_adap_thread_handler(0, adap); in cht_wc_i2c_adap_smbus_xfer()
168 if (!adap->done) in cht_wc_i2c_adap_smbus_xfer()
173 mutex_lock(&adap->adap_lock); in cht_wc_i2c_adap_smbus_xfer()
174 if (adap->io_error) in cht_wc_i2c_adap_smbus_xfer()
177 data->byte = adap->read_data; in cht_wc_i2c_adap_smbus_xfer()
178 mutex_unlock(&adap->adap_lock); in cht_wc_i2c_adap_smbus_xfer()
236 struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data); in cht_wc_i2c_irq_lock() local
238 mutex_lock(&adap->irqchip_lock); in cht_wc_i2c_irq_lock()
243 struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data); in cht_wc_i2c_irq_sync_unlock() local
246 if (adap->irq_mask != adap->old_irq_mask) { in cht_wc_i2c_irq_sync_unlock()
247 ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ_MSK, in cht_wc_i2c_irq_sync_unlock()
248 adap->irq_mask); in cht_wc_i2c_irq_sync_unlock()
250 adap->old_irq_mask = adap->irq_mask; in cht_wc_i2c_irq_sync_unlock()
252 dev_err(&adap->adapter.dev, "Error writing EXTCHGRIRQ_MSK\n"); in cht_wc_i2c_irq_sync_unlock()
255 mutex_unlock(&adap->irqchip_lock); in cht_wc_i2c_irq_sync_unlock()
260 struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data); in cht_wc_i2c_irq_enable() local
262 adap->irq_mask &= ~CHT_WC_EXTCHGRIRQ_CLIENT_IRQ; in cht_wc_i2c_irq_enable()
267 struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data); in cht_wc_i2c_irq_disable() local
269 adap->irq_mask |= CHT_WC_EXTCHGRIRQ_CLIENT_IRQ; in cht_wc_i2c_irq_disable()
290 struct cht_wc_i2c_adap *adap; in cht_wc_i2c_adap_i2c_probe() local
304 adap = devm_kzalloc(&pdev->dev, sizeof(*adap), GFP_KERNEL); in cht_wc_i2c_adap_i2c_probe()
305 if (!adap) in cht_wc_i2c_adap_i2c_probe()
308 init_waitqueue_head(&adap->wait); in cht_wc_i2c_adap_i2c_probe()
309 mutex_init(&adap->adap_lock); in cht_wc_i2c_adap_i2c_probe()
310 mutex_init(&adap->irqchip_lock); in cht_wc_i2c_adap_i2c_probe()
311 adap->irqchip = cht_wc_i2c_irq_chip; in cht_wc_i2c_adap_i2c_probe()
312 adap->regmap = pmic->regmap; in cht_wc_i2c_adap_i2c_probe()
313 adap->adapter.owner = THIS_MODULE; in cht_wc_i2c_adap_i2c_probe()
314 adap->adapter.class = I2C_CLASS_HWMON; in cht_wc_i2c_adap_i2c_probe()
315 adap->adapter.algo = &cht_wc_i2c_adap_algo; in cht_wc_i2c_adap_i2c_probe()
316 adap->adapter.lock_ops = &cht_wc_i2c_adap_lock_ops; in cht_wc_i2c_adap_i2c_probe()
317 strlcpy(adap->adapter.name, "PMIC I2C Adapter", in cht_wc_i2c_adap_i2c_probe()
318 sizeof(adap->adapter.name)); in cht_wc_i2c_adap_i2c_probe()
319 adap->adapter.dev.parent = &pdev->dev; in cht_wc_i2c_adap_i2c_probe()
322 adap->old_irq_mask = adap->irq_mask = ~CHT_WC_EXTCHGRIRQ_ADAP_IRQMASK; in cht_wc_i2c_adap_i2c_probe()
324 ret = regmap_read(adap->regmap, CHT_WC_I2C_RDDATA, ®); in cht_wc_i2c_adap_i2c_probe()
328 ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ, ~adap->irq_mask); in cht_wc_i2c_adap_i2c_probe()
332 ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ_MSK, adap->irq_mask); in cht_wc_i2c_adap_i2c_probe()
337 adap->irq_domain = irq_domain_add_linear(pdev->dev.of_node, 1, in cht_wc_i2c_adap_i2c_probe()
339 if (!adap->irq_domain) in cht_wc_i2c_adap_i2c_probe()
342 adap->client_irq = irq_create_mapping(adap->irq_domain, 0); in cht_wc_i2c_adap_i2c_probe()
343 if (!adap->client_irq) { in cht_wc_i2c_adap_i2c_probe()
348 irq_set_chip_data(adap->client_irq, adap); in cht_wc_i2c_adap_i2c_probe()
349 irq_set_chip_and_handler(adap->client_irq, &adap->irqchip, in cht_wc_i2c_adap_i2c_probe()
354 IRQF_ONESHOT, "PMIC I2C Adapter", adap); in cht_wc_i2c_adap_i2c_probe()
358 i2c_set_adapdata(&adap->adapter, adap); in cht_wc_i2c_adap_i2c_probe()
359 ret = i2c_add_adapter(&adap->adapter); in cht_wc_i2c_adap_i2c_probe()
363 board_info.irq = adap->client_irq; in cht_wc_i2c_adap_i2c_probe()
364 adap->client = i2c_new_device(&adap->adapter, &board_info); in cht_wc_i2c_adap_i2c_probe()
365 if (!adap->client) { in cht_wc_i2c_adap_i2c_probe()
370 platform_set_drvdata(pdev, adap); in cht_wc_i2c_adap_i2c_probe()
374 i2c_del_adapter(&adap->adapter); in cht_wc_i2c_adap_i2c_probe()
376 irq_domain_remove(adap->irq_domain); in cht_wc_i2c_adap_i2c_probe()
382 struct cht_wc_i2c_adap *adap = platform_get_drvdata(pdev); in cht_wc_i2c_adap_i2c_remove() local
384 i2c_unregister_device(adap->client); in cht_wc_i2c_adap_i2c_remove()
385 i2c_del_adapter(&adap->adapter); in cht_wc_i2c_adap_i2c_remove()
386 irq_domain_remove(adap->irq_domain); in cht_wc_i2c_adap_i2c_remove()