• Home
  • Raw
  • Download

Lines Matching refs:i2c

75 static void dc_i2c_cmd(struct dc_i2c *i2c, u8 cmd)  in dc_i2c_cmd()  argument
77 writeb_relaxed(cmd | II_COMMAND_GO, i2c->regs + II_COMMAND); in dc_i2c_cmd()
90 static void dc_i2c_data(struct dc_i2c *i2c, u8 data) in dc_i2c_data() argument
92 writeb_relaxed(data, i2c->regs + II_DATA); in dc_i2c_data()
95 static void dc_i2c_write_byte(struct dc_i2c *i2c, u8 byte) in dc_i2c_write_byte() argument
97 dc_i2c_data(i2c, byte); in dc_i2c_write_byte()
98 dc_i2c_cmd(i2c, II_CMD_SEND_ACK); in dc_i2c_write_byte()
101 static void dc_i2c_write_buf(struct dc_i2c *i2c) in dc_i2c_write_buf() argument
103 dc_i2c_write_byte(i2c, i2c->msg->buf[i2c->msgbuf_ptr++]); in dc_i2c_write_buf()
106 static void dc_i2c_next_read(struct dc_i2c *i2c) in dc_i2c_next_read() argument
108 bool last = (i2c->msgbuf_ptr + 1 == i2c->msg->len); in dc_i2c_next_read()
110 dc_i2c_cmd(i2c, last ? II_CMD_GET_NOACK : II_CMD_GET_ACK); in dc_i2c_next_read()
113 static void dc_i2c_stop(struct dc_i2c *i2c) in dc_i2c_stop() argument
115 i2c->state = STATE_STOP; in dc_i2c_stop()
116 if (i2c->last) in dc_i2c_stop()
117 dc_i2c_cmd(i2c, II_CMD_STOP); in dc_i2c_stop()
119 complete(&i2c->done); in dc_i2c_stop()
122 static u8 dc_i2c_read_byte(struct dc_i2c *i2c) in dc_i2c_read_byte() argument
124 return readb_relaxed(i2c->regs + II_DATA); in dc_i2c_read_byte()
127 static void dc_i2c_read_buf(struct dc_i2c *i2c) in dc_i2c_read_buf() argument
129 i2c->msg->buf[i2c->msgbuf_ptr++] = dc_i2c_read_byte(i2c); in dc_i2c_read_buf()
130 dc_i2c_next_read(i2c); in dc_i2c_read_buf()
133 static void dc_i2c_set_irq(struct dc_i2c *i2c, int enable) in dc_i2c_set_irq() argument
136 writeb_relaxed(1, i2c->regs + II_INTFLAG_CLEAR); in dc_i2c_set_irq()
137 writeb_relaxed(!!enable, i2c->regs + II_INTENABLE); in dc_i2c_set_irq()
140 static int dc_i2c_cmd_status(struct dc_i2c *i2c) in dc_i2c_cmd_status() argument
142 u8 cmd = readb_relaxed(i2c->regs + II_COMMAND); in dc_i2c_cmd_status()
147 static void dc_i2c_start_msg(struct dc_i2c *i2c, int first) in dc_i2c_start_msg() argument
149 struct i2c_msg *msg = i2c->msg; in dc_i2c_start_msg()
152 i2c->state = STATE_START; in dc_i2c_start_msg()
153 dc_i2c_cmd(i2c, first ? II_CMD_START : II_CMD_RESTART); in dc_i2c_start_msg()
155 i2c->state = STATE_READ; in dc_i2c_start_msg()
156 dc_i2c_next_read(i2c); in dc_i2c_start_msg()
158 i2c->state = STATE_WRITE; in dc_i2c_start_msg()
159 dc_i2c_write_buf(i2c); in dc_i2c_start_msg()
165 struct dc_i2c *i2c = dev_id; in dc_i2c_irq() local
166 int cmd_status = dc_i2c_cmd_status(i2c); in dc_i2c_irq()
170 writeb_relaxed(1, i2c->regs + II_INTFLAG_CLEAR); in dc_i2c_irq()
172 spin_lock_irqsave(&i2c->lock, flags); in dc_i2c_irq()
176 i2c->error = -EIO; in dc_i2c_irq()
177 complete(&i2c->done); in dc_i2c_irq()
181 switch (i2c->state) { in dc_i2c_irq()
183 addr_cmd = dc_i2c_addr_cmd(i2c->msg); in dc_i2c_irq()
184 dc_i2c_write_byte(i2c, addr_cmd); in dc_i2c_irq()
185 i2c->state = STATE_ADDR; in dc_i2c_irq()
188 if (i2c->msg->flags & I2C_M_RD) { in dc_i2c_irq()
189 dc_i2c_next_read(i2c); in dc_i2c_irq()
190 i2c->state = STATE_READ; in dc_i2c_irq()
193 i2c->state = STATE_WRITE; in dc_i2c_irq()
196 if (i2c->msgbuf_ptr < i2c->msg->len) in dc_i2c_irq()
197 dc_i2c_write_buf(i2c); in dc_i2c_irq()
199 dc_i2c_stop(i2c); in dc_i2c_irq()
202 if (i2c->msgbuf_ptr < i2c->msg->len) in dc_i2c_irq()
203 dc_i2c_read_buf(i2c); in dc_i2c_irq()
205 dc_i2c_stop(i2c); in dc_i2c_irq()
208 i2c->state = STATE_IDLE; in dc_i2c_irq()
209 complete(&i2c->done); in dc_i2c_irq()
214 spin_unlock_irqrestore(&i2c->lock, flags); in dc_i2c_irq()
218 static int dc_i2c_xfer_msg(struct dc_i2c *i2c, struct i2c_msg *msg, int first, in dc_i2c_xfer_msg() argument
224 spin_lock_irqsave(&i2c->lock, flags); in dc_i2c_xfer_msg()
225 i2c->msg = msg; in dc_i2c_xfer_msg()
226 i2c->msgbuf_ptr = 0; in dc_i2c_xfer_msg()
227 i2c->last = last; in dc_i2c_xfer_msg()
228 i2c->error = 0; in dc_i2c_xfer_msg()
230 reinit_completion(&i2c->done); in dc_i2c_xfer_msg()
231 dc_i2c_set_irq(i2c, 1); in dc_i2c_xfer_msg()
232 dc_i2c_start_msg(i2c, first); in dc_i2c_xfer_msg()
233 spin_unlock_irqrestore(&i2c->lock, flags); in dc_i2c_xfer_msg()
235 timeout = wait_for_completion_timeout(&i2c->done, timeout); in dc_i2c_xfer_msg()
236 dc_i2c_set_irq(i2c, 0); in dc_i2c_xfer_msg()
238 i2c->state = STATE_IDLE; in dc_i2c_xfer_msg()
242 if (i2c->error) in dc_i2c_xfer_msg()
243 return i2c->error; in dc_i2c_xfer_msg()
250 struct dc_i2c *i2c = adap->algo_data; in dc_i2c_xfer() local
254 ret = dc_i2c_xfer_msg(i2c, &msgs[i], i == 0, i == num - 1); in dc_i2c_xfer()
262 static int dc_i2c_init_hw(struct dc_i2c *i2c) in dc_i2c_init_hw() argument
264 unsigned long clk_rate = clk_get_rate(i2c->clk); in dc_i2c_init_hw()
267 writeb_relaxed(II_CONTROL_LOCAL_RESET, i2c->regs + II_CONTROL); in dc_i2c_init_hw()
269 writeb_relaxed(0, i2c->regs + II_CONTROL); in dc_i2c_init_hw()
272 clocktime = DIV_ROUND_UP(clk_rate, 64 * i2c->frequency); in dc_i2c_init_hw()
274 dev_err(i2c->dev, "can't set bus speed of %u Hz\n", in dc_i2c_init_hw()
275 i2c->frequency); in dc_i2c_init_hw()
278 writeb_relaxed(clocktime - 1, i2c->regs + II_CLOCKTIME); in dc_i2c_init_hw()
296 struct dc_i2c *i2c; in dc_i2c_probe() local
300 i2c = devm_kzalloc(&pdev->dev, sizeof(struct dc_i2c), GFP_KERNEL); in dc_i2c_probe()
301 if (!i2c) in dc_i2c_probe()
305 &i2c->frequency)) in dc_i2c_probe()
306 i2c->frequency = DEFAULT_FREQ; in dc_i2c_probe()
308 i2c->dev = &pdev->dev; in dc_i2c_probe()
309 platform_set_drvdata(pdev, i2c); in dc_i2c_probe()
311 spin_lock_init(&i2c->lock); in dc_i2c_probe()
312 init_completion(&i2c->done); in dc_i2c_probe()
314 i2c->clk = devm_clk_get(&pdev->dev, NULL); in dc_i2c_probe()
315 if (IS_ERR(i2c->clk)) in dc_i2c_probe()
316 return PTR_ERR(i2c->clk); in dc_i2c_probe()
319 i2c->regs = devm_ioremap_resource(&pdev->dev, r); in dc_i2c_probe()
320 if (IS_ERR(i2c->regs)) in dc_i2c_probe()
321 return PTR_ERR(i2c->regs); in dc_i2c_probe()
328 dev_name(&pdev->dev), i2c); in dc_i2c_probe()
332 strlcpy(i2c->adap.name, "Conexant Digicolor I2C adapter", in dc_i2c_probe()
333 sizeof(i2c->adap.name)); in dc_i2c_probe()
334 i2c->adap.owner = THIS_MODULE; in dc_i2c_probe()
335 i2c->adap.algo = &dc_i2c_algorithm; in dc_i2c_probe()
336 i2c->adap.dev.parent = &pdev->dev; in dc_i2c_probe()
337 i2c->adap.dev.of_node = np; in dc_i2c_probe()
338 i2c->adap.algo_data = i2c; in dc_i2c_probe()
340 ret = dc_i2c_init_hw(i2c); in dc_i2c_probe()
344 ret = clk_prepare_enable(i2c->clk); in dc_i2c_probe()
348 ret = i2c_add_adapter(&i2c->adap); in dc_i2c_probe()
350 clk_disable_unprepare(i2c->clk); in dc_i2c_probe()
359 struct dc_i2c *i2c = platform_get_drvdata(pdev); in dc_i2c_remove() local
361 i2c_del_adapter(&i2c->adap); in dc_i2c_remove()
362 clk_disable_unprepare(i2c->clk); in dc_i2c_remove()