Lines Matching refs:ctx
141 struct slimpro_i2c_dev *ctx = to_slimpro_i2c_dev(cl);
149 if (ctx->resp_msg)
150 *ctx->resp_msg = ((u32 *)mssg)[1];
152 if (ctx->mbox_client.tx_block)
153 complete(&ctx->rd_complete);
158 struct slimpro_i2c_dev *ctx = to_slimpro_i2c_dev(cl);
159 struct acpi_pcct_shared_memory *generic_comm_base = ctx->pcc_comm_addr;
171 if (ctx->resp_msg)
172 *ctx->resp_msg = ((u32 *)msg)[1];
174 complete(&ctx->rd_complete);
178 static void slimpro_i2c_pcc_tx_prepare(struct slimpro_i2c_dev *ctx, u32 *msg)
180 struct acpi_pcct_shared_memory *generic_comm_base = ctx->pcc_comm_addr;
186 cpu_to_le32(PCC_SIGNATURE | ctx->mbox_idx));
200 static int start_i2c_msg_xfer(struct slimpro_i2c_dev *ctx)
202 if (ctx->mbox_client.tx_block || !acpi_disabled) {
203 if (!wait_for_completion_timeout(&ctx->rd_complete,
209 if (*ctx->resp_msg == 0xffffffff)
215 static int slimpro_i2c_send_msg(struct slimpro_i2c_dev *ctx,
221 ctx->resp_msg = data;
224 reinit_completion(&ctx->rd_complete);
225 slimpro_i2c_pcc_tx_prepare(ctx, msg);
228 rc = mbox_send_message(ctx->mbox_chan, msg);
232 rc = start_i2c_msg_xfer(ctx);
236 mbox_chan_txdone(ctx->mbox_chan, 0);
238 ctx->resp_msg = NULL;
243 static int slimpro_i2c_rd(struct slimpro_i2c_dev *ctx, u32 chip,
254 return slimpro_i2c_send_msg(ctx, msg, data);
257 static int slimpro_i2c_wr(struct slimpro_i2c_dev *ctx, u32 chip,
268 return slimpro_i2c_send_msg(ctx, msg, msg);
271 static int slimpro_i2c_blkrd(struct slimpro_i2c_dev *ctx, u32 chip, u32 addr,
279 paddr = dma_map_single(ctx->dev, ctx->dma_buffer, readlen, DMA_FROM_DEVICE);
280 if (dma_mapping_error(ctx->dev, paddr)) {
281 dev_err(&ctx->adapter.dev, "Error in mapping dma buffer %p\n",
282 ctx->dma_buffer);
294 rc = slimpro_i2c_send_msg(ctx, msg, msg);
297 memcpy(data, ctx->dma_buffer, readlen);
299 dma_unmap_single(ctx->dev, paddr, readlen, DMA_FROM_DEVICE);
303 static int slimpro_i2c_blkwr(struct slimpro_i2c_dev *ctx, u32 chip,
314 memcpy(ctx->dma_buffer, data, writelen);
315 paddr = dma_map_single(ctx->dev, ctx->dma_buffer, writelen,
317 if (dma_mapping_error(ctx->dev, paddr)) {
318 dev_err(&ctx->adapter.dev, "Error in mapping dma buffer %p\n",
319 ctx->dma_buffer);
330 if (ctx->mbox_client.tx_block)
331 reinit_completion(&ctx->rd_complete);
333 rc = slimpro_i2c_send_msg(ctx, msg, msg);
335 dma_unmap_single(ctx->dev, paddr, writelen, DMA_TO_DEVICE);
344 struct slimpro_i2c_dev *ctx = i2c_get_adapdata(adap);
351 ret = slimpro_i2c_rd(ctx, addr, 0, 0,
356 ret = slimpro_i2c_wr(ctx, addr, command, SMBUS_CMD_LEN,
363 ret = slimpro_i2c_rd(ctx, addr, command, SMBUS_CMD_LEN,
369 ret = slimpro_i2c_wr(ctx, addr, command, SMBUS_CMD_LEN,
376 ret = slimpro_i2c_rd(ctx, addr, command, SMBUS_CMD_LEN,
382 ret = slimpro_i2c_wr(ctx, addr, command, SMBUS_CMD_LEN,
389 ret = slimpro_i2c_blkrd(ctx, addr, command,
397 ret = slimpro_i2c_blkwr(ctx, addr, command,
406 ret = slimpro_i2c_blkrd(ctx, addr,
414 ret = slimpro_i2c_blkwr(ctx, addr, command,
446 struct slimpro_i2c_dev *ctx;
451 ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
452 if (!ctx)
455 ctx->dev = &pdev->dev;
456 platform_set_drvdata(pdev, ctx);
457 cl = &ctx->mbox_client;
461 init_completion(&ctx->rd_complete);
467 ctx->mbox_chan = mbox_request_channel(cl, MAILBOX_I2C_INDEX);
468 if (IS_ERR(ctx->mbox_chan)) {
470 return PTR_ERR(ctx->mbox_chan);
485 &ctx->mbox_idx))
486 ctx->mbox_idx = MAILBOX_I2C_INDEX;
490 pcc_chan = pcc_mbox_request_channel(cl, ctx->mbox_idx);
496 ctx->pcc_chan = pcc_chan;
497 ctx->mbox_chan = pcc_chan->mchan;
499 if (!ctx->mbox_chan->mbox->txdone_irq) {
509 ctx->comm_base_addr = pcc_chan->shmem_base_addr;
510 if (ctx->comm_base_addr) {
512 ctx->pcc_comm_addr = memremap(
513 ctx->comm_base_addr,
517 ctx->pcc_comm_addr = memremap(
518 ctx->comm_base_addr,
527 if (!ctx->pcc_comm_addr) {
539 adapter = &ctx->adapter;
546 i2c_set_adapdata(adapter, ctx);
556 mbox_free_channel(ctx->mbox_chan);
558 pcc_mbox_free_channel(ctx->pcc_chan);
565 struct slimpro_i2c_dev *ctx = platform_get_drvdata(pdev);
567 i2c_del_adapter(&ctx->adapter);
570 mbox_free_channel(ctx->mbox_chan);
572 pcc_mbox_free_channel(ctx->pcc_chan);