Lines Matching refs:ddata
128 static u32 efm32_i2c_read32(struct efm32_i2c_ddata *ddata, unsigned offset) in efm32_i2c_read32() argument
130 return readl(ddata->base + offset); in efm32_i2c_read32()
133 static void efm32_i2c_write32(struct efm32_i2c_ddata *ddata, in efm32_i2c_write32() argument
136 writel(value, ddata->base + offset); in efm32_i2c_write32()
139 static void efm32_i2c_send_next_msg(struct efm32_i2c_ddata *ddata) in efm32_i2c_send_next_msg() argument
141 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; in efm32_i2c_send_next_msg()
143 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_START); in efm32_i2c_send_next_msg()
144 efm32_i2c_write32(ddata, REG_TXDATA, i2c_8bit_addr_from_msg(cur_msg)); in efm32_i2c_send_next_msg()
147 static void efm32_i2c_send_next_byte(struct efm32_i2c_ddata *ddata) in efm32_i2c_send_next_byte() argument
149 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; in efm32_i2c_send_next_byte()
151 if (ddata->current_word >= cur_msg->len) { in efm32_i2c_send_next_byte()
153 ddata->current_word = 0; in efm32_i2c_send_next_byte()
154 ddata->current_msg += 1; in efm32_i2c_send_next_byte()
156 if (ddata->current_msg >= ddata->num_msgs) { in efm32_i2c_send_next_byte()
157 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); in efm32_i2c_send_next_byte()
158 complete(&ddata->done); in efm32_i2c_send_next_byte()
160 efm32_i2c_send_next_msg(ddata); in efm32_i2c_send_next_byte()
163 efm32_i2c_write32(ddata, REG_TXDATA, in efm32_i2c_send_next_byte()
164 cur_msg->buf[ddata->current_word++]); in efm32_i2c_send_next_byte()
168 static void efm32_i2c_recv_next_byte(struct efm32_i2c_ddata *ddata) in efm32_i2c_recv_next_byte() argument
170 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; in efm32_i2c_recv_next_byte()
172 cur_msg->buf[ddata->current_word] = efm32_i2c_read32(ddata, REG_RXDATA); in efm32_i2c_recv_next_byte()
173 ddata->current_word += 1; in efm32_i2c_recv_next_byte()
174 if (ddata->current_word >= cur_msg->len) { in efm32_i2c_recv_next_byte()
176 ddata->current_word = 0; in efm32_i2c_recv_next_byte()
177 ddata->current_msg += 1; in efm32_i2c_recv_next_byte()
179 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_NACK); in efm32_i2c_recv_next_byte()
181 if (ddata->current_msg >= ddata->num_msgs) { in efm32_i2c_recv_next_byte()
182 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); in efm32_i2c_recv_next_byte()
183 complete(&ddata->done); in efm32_i2c_recv_next_byte()
185 efm32_i2c_send_next_msg(ddata); in efm32_i2c_recv_next_byte()
188 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_ACK); in efm32_i2c_recv_next_byte()
194 struct efm32_i2c_ddata *ddata = dev_id; in efm32_i2c_irq() local
195 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; in efm32_i2c_irq()
196 u32 irqflag = efm32_i2c_read32(ddata, REG_IF); in efm32_i2c_irq()
197 u32 state = efm32_i2c_read32(ddata, REG_STATE); in efm32_i2c_irq()
199 efm32_i2c_write32(ddata, REG_IFC, irqflag & REG_IFC__MASK); in efm32_i2c_irq()
204 ddata->retval = -EAGAIN; in efm32_i2c_irq()
205 complete(&ddata->done); in efm32_i2c_irq()
212 ddata->retval = -EIO; in efm32_i2c_irq()
213 efm32_i2c_write32(ddata, REG_CMD, in efm32_i2c_irq()
216 complete(&ddata->done); in efm32_i2c_irq()
226 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); in efm32_i2c_irq()
227 ddata->retval = -ENXIO; in efm32_i2c_irq()
228 complete(&ddata->done); in efm32_i2c_irq()
232 efm32_i2c_send_next_byte(ddata); in efm32_i2c_irq()
237 efm32_i2c_recv_next_byte(ddata); in efm32_i2c_irq()
244 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); in efm32_i2c_irq()
245 complete(&ddata->done); in efm32_i2c_irq()
247 efm32_i2c_send_next_byte(ddata); in efm32_i2c_irq()
257 struct efm32_i2c_ddata *ddata = i2c_get_adapdata(adap); in efm32_i2c_master_xfer() local
260 if (ddata->msgs) in efm32_i2c_master_xfer()
263 ddata->msgs = msgs; in efm32_i2c_master_xfer()
264 ddata->num_msgs = num; in efm32_i2c_master_xfer()
265 ddata->current_word = 0; in efm32_i2c_master_xfer()
266 ddata->current_msg = 0; in efm32_i2c_master_xfer()
267 ddata->retval = -EIO; in efm32_i2c_master_xfer()
269 reinit_completion(&ddata->done); in efm32_i2c_master_xfer()
271 dev_dbg(&ddata->adapter.dev, "state: %08x, status: %08x\n", in efm32_i2c_master_xfer()
272 efm32_i2c_read32(ddata, REG_STATE), in efm32_i2c_master_xfer()
273 efm32_i2c_read32(ddata, REG_STATUS)); in efm32_i2c_master_xfer()
275 efm32_i2c_send_next_msg(ddata); in efm32_i2c_master_xfer()
277 wait_for_completion(&ddata->done); in efm32_i2c_master_xfer()
279 if (ddata->current_msg >= ddata->num_msgs) in efm32_i2c_master_xfer()
280 ret = ddata->num_msgs; in efm32_i2c_master_xfer()
282 ret = ddata->retval; in efm32_i2c_master_xfer()
297 static u32 efm32_i2c_get_configured_location(struct efm32_i2c_ddata *ddata) in efm32_i2c_get_configured_location() argument
299 u32 reg = efm32_i2c_read32(ddata, REG_ROUTE); in efm32_i2c_get_configured_location()
307 struct efm32_i2c_ddata *ddata; in efm32_i2c_probe() local
315 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); in efm32_i2c_probe()
316 if (!ddata) in efm32_i2c_probe()
318 platform_set_drvdata(pdev, ddata); in efm32_i2c_probe()
320 init_completion(&ddata->done); in efm32_i2c_probe()
321 strlcpy(ddata->adapter.name, pdev->name, sizeof(ddata->adapter.name)); in efm32_i2c_probe()
322 ddata->adapter.owner = THIS_MODULE; in efm32_i2c_probe()
323 ddata->adapter.algo = &efm32_i2c_algo; in efm32_i2c_probe()
324 ddata->adapter.dev.parent = &pdev->dev; in efm32_i2c_probe()
325 ddata->adapter.dev.of_node = pdev->dev.of_node; in efm32_i2c_probe()
326 i2c_set_adapdata(&ddata->adapter, ddata); in efm32_i2c_probe()
328 ddata->clk = devm_clk_get(&pdev->dev, NULL); in efm32_i2c_probe()
329 if (IS_ERR(ddata->clk)) { in efm32_i2c_probe()
330 ret = PTR_ERR(ddata->clk); in efm32_i2c_probe()
335 ddata->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in efm32_i2c_probe()
336 if (IS_ERR(ddata->base)) in efm32_i2c_probe()
337 return PTR_ERR(ddata->base); in efm32_i2c_probe()
351 ddata->irq = ret; in efm32_i2c_probe()
353 ret = clk_prepare_enable(ddata->clk); in efm32_i2c_probe()
370 location = efm32_i2c_get_configured_location(ddata); in efm32_i2c_probe()
375 ddata->location = location; in efm32_i2c_probe()
384 ddata->frequency = frequency; in efm32_i2c_probe()
386 rate = clk_get_rate(ddata->clk); in efm32_i2c_probe()
392 clkdiv = DIV_ROUND_UP(rate, 8 * ddata->frequency) - 1; in efm32_i2c_probe()
396 rate, ddata->frequency); in efm32_i2c_probe()
402 rate, ddata->frequency, (unsigned long)clkdiv); in efm32_i2c_probe()
403 efm32_i2c_write32(ddata, REG_CLKDIV, REG_CLKDIV_DIV(clkdiv)); in efm32_i2c_probe()
405 efm32_i2c_write32(ddata, REG_ROUTE, REG_ROUTE_SDAPEN | in efm32_i2c_probe()
407 REG_ROUTE_LOCATION(ddata->location)); in efm32_i2c_probe()
409 efm32_i2c_write32(ddata, REG_CTRL, REG_CTRL_EN | in efm32_i2c_probe()
412 efm32_i2c_write32(ddata, REG_IFC, REG_IFC__MASK); in efm32_i2c_probe()
413 efm32_i2c_write32(ddata, REG_IEN, REG_IF_TXC | REG_IF_ACK | REG_IF_NACK in efm32_i2c_probe()
417 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_ABORT); in efm32_i2c_probe()
419 ret = request_irq(ddata->irq, efm32_i2c_irq, 0, DRIVER_NAME, ddata); in efm32_i2c_probe()
425 ret = i2c_add_adapter(&ddata->adapter); in efm32_i2c_probe()
427 free_irq(ddata->irq, ddata); in efm32_i2c_probe()
430 clk_disable_unprepare(ddata->clk); in efm32_i2c_probe()
437 struct efm32_i2c_ddata *ddata = platform_get_drvdata(pdev); in efm32_i2c_remove() local
439 i2c_del_adapter(&ddata->adapter); in efm32_i2c_remove()
440 free_irq(ddata->irq, ddata); in efm32_i2c_remove()
441 clk_disable_unprepare(ddata->clk); in efm32_i2c_remove()