Lines Matching refs:iface
65 static inline u16 i2c_rd16(struct s6i2c_if *iface, unsigned n) in i2c_rd16() argument
67 return readw(iface->reg + (n)); in i2c_rd16()
70 static inline void i2c_wr16(struct s6i2c_if *iface, unsigned n, u16 v) in i2c_wr16() argument
72 writew(v, iface->reg + (n)); in i2c_wr16()
75 static inline u32 i2c_rd32(struct s6i2c_if *iface, unsigned n) in i2c_rd32() argument
77 return readl(iface->reg + (n)); in i2c_rd32()
80 static inline void i2c_wr32(struct s6i2c_if *iface, unsigned n, u32 v) in i2c_wr32() argument
82 writel(v, iface->reg + (n)); in i2c_wr32()
87 static void s6i2c_handle_interrupt(struct s6i2c_if *iface) in s6i2c_handle_interrupt() argument
89 if (i2c_rd16(iface, S6_I2C_INTRSTAT) & (1 << S6_I2C_INTR_TXABRT)) { in s6i2c_handle_interrupt()
90 i2c_rd16(iface, S6_I2C_CLRTXABRT); in s6i2c_handle_interrupt()
91 i2c_wr16(iface, S6_I2C_INTRMASK, 0); in s6i2c_handle_interrupt()
92 complete(&iface->complete); in s6i2c_handle_interrupt()
95 if (iface->msgs_done >= iface->msgs_num) { in s6i2c_handle_interrupt()
96 dev_err(&iface->adap.dev, "s6i2c: spurious I2C irq: %04x\n", in s6i2c_handle_interrupt()
97 i2c_rd16(iface, S6_I2C_INTRSTAT)); in s6i2c_handle_interrupt()
98 i2c_wr16(iface, S6_I2C_INTRMASK, 0); in s6i2c_handle_interrupt()
101 while ((iface->msgs_push < iface->msgs_num) in s6i2c_handle_interrupt()
102 && (i2c_rd16(iface, S6_I2C_STATUS) & (1 << S6_I2C_STATUS_TFNF))) { in s6i2c_handle_interrupt()
103 struct i2c_msg *m = &iface->msgs[iface->msgs_push]; in s6i2c_handle_interrupt()
105 i2c_wr16(iface, S6_I2C_DATACMD, m->buf[iface->push]); in s6i2c_handle_interrupt()
107 i2c_wr16(iface, S6_I2C_DATACMD, in s6i2c_handle_interrupt()
109 if (++iface->push >= m->len) { in s6i2c_handle_interrupt()
110 iface->push = 0; in s6i2c_handle_interrupt()
111 iface->msgs_push += 1; in s6i2c_handle_interrupt()
115 struct i2c_msg *m = &iface->msgs[iface->msgs_done]; in s6i2c_handle_interrupt()
117 if (iface->msgs_done < iface->msgs_push) in s6i2c_handle_interrupt()
118 iface->msgs_done += 1; in s6i2c_handle_interrupt()
121 } else if (i2c_rd16(iface, S6_I2C_STATUS) in s6i2c_handle_interrupt()
123 m->buf[iface->done] = i2c_rd16(iface, S6_I2C_DATACMD); in s6i2c_handle_interrupt()
124 if (++iface->done >= m->len) { in s6i2c_handle_interrupt()
125 iface->done = 0; in s6i2c_handle_interrupt()
126 iface->msgs_done += 1; in s6i2c_handle_interrupt()
131 } while (iface->msgs_done < iface->msgs_num); in s6i2c_handle_interrupt()
132 if (iface->msgs_done >= iface->msgs_num) { in s6i2c_handle_interrupt()
133 i2c_wr16(iface, S6_I2C_INTRMASK, 1 << S6_I2C_INTR_TXABRT); in s6i2c_handle_interrupt()
134 complete(&iface->complete); in s6i2c_handle_interrupt()
135 } else if (iface->msgs_push >= iface->msgs_num) { in s6i2c_handle_interrupt()
136 i2c_wr16(iface, S6_I2C_INTRMASK, (1 << S6_I2C_INTR_TXABRT) | in s6i2c_handle_interrupt()
139 i2c_wr16(iface, S6_I2C_INTRMASK, (1 << S6_I2C_INTR_TXABRT) | in s6i2c_handle_interrupt()
147 struct s6i2c_if *iface = dev_id; in s6i2c_interrupt_entry() local
148 if (!(i2c_rd16(iface, S6_I2C_STATUS) & ((1 << S6_I2C_INTR_RXUNDER) in s6i2c_interrupt_entry()
162 spin_lock(&iface->lock); in s6i2c_interrupt_entry()
163 del_timer(&iface->timeout_timer); in s6i2c_interrupt_entry()
164 s6i2c_handle_interrupt(iface); in s6i2c_interrupt_entry()
165 spin_unlock(&iface->lock); in s6i2c_interrupt_entry()
171 struct s6i2c_if *iface = (struct s6i2c_if *)data; in s6i2c_timeout() local
174 spin_lock_irqsave(&iface->lock, flags); in s6i2c_timeout()
175 s6i2c_handle_interrupt(iface); in s6i2c_timeout()
176 if (--iface->timeout_count > 0) { in s6i2c_timeout()
177 iface->timeout_timer.expires = jiffies + POLL_TIMEOUT; in s6i2c_timeout()
178 add_timer(&iface->timeout_timer); in s6i2c_timeout()
180 complete(&iface->complete); in s6i2c_timeout()
181 i2c_wr16(iface, S6_I2C_INTRMASK, 0); in s6i2c_timeout()
183 spin_unlock_irqrestore(&iface->lock, flags); in s6i2c_timeout()
189 struct s6i2c_if *iface = adap->algo_data; in s6i2c_master_xfer() local
193 if (i2c_rd16(iface, S6_I2C_STATUS) & (1 << S6_I2C_STATUS_ACTIVITY)) in s6i2c_master_xfer()
195 i2c_wr16(iface, S6_I2C_INTRMASK, 0); in s6i2c_master_xfer()
196 i2c_rd16(iface, S6_I2C_CLRINTR); in s6i2c_master_xfer()
215 iface->msgs = msgs; in s6i2c_master_xfer()
216 iface->msgs_num = num; in s6i2c_master_xfer()
217 iface->msgs_push = 0; in s6i2c_master_xfer()
218 iface->msgs_done = 0; in s6i2c_master_xfer()
219 iface->push = 0; in s6i2c_master_xfer()
220 iface->done = 0; in s6i2c_master_xfer()
221 iface->timeout_count = 10; in s6i2c_master_xfer()
222 i2c_wr16(iface, S6_I2C_TAR, msgs[0].addr); in s6i2c_master_xfer()
223 i2c_wr16(iface, S6_I2C_ENABLE, 1); in s6i2c_master_xfer()
224 i2c_wr16(iface, S6_I2C_INTRMASK, (1 << S6_I2C_INTR_TXEMPTY) | in s6i2c_master_xfer()
227 iface->timeout_timer.expires = jiffies + POLL_TIMEOUT; in s6i2c_master_xfer()
228 add_timer(&iface->timeout_timer); in s6i2c_master_xfer()
229 wait_for_completion(&iface->complete); in s6i2c_master_xfer()
230 del_timer_sync(&iface->timeout_timer); in s6i2c_master_xfer()
231 while (i2c_rd32(iface, S6_I2C_TXFLR) > 0) in s6i2c_master_xfer()
233 while (i2c_rd16(iface, S6_I2C_STATUS) & (1 << S6_I2C_STATUS_ACTIVITY)) in s6i2c_master_xfer()
236 i2c_wr16(iface, S6_I2C_INTRMASK, 0); in s6i2c_master_xfer()
237 i2c_wr16(iface, S6_I2C_ENABLE, 0); in s6i2c_master_xfer()
238 return iface->msgs_done; in s6i2c_master_xfer()
251 static u16 nanoseconds_on_clk(struct s6i2c_if *iface, u32 ns) in nanoseconds_on_clk() argument
253 u32 dividend = ((clk_get_rate(iface->clk) / 1000) * ns) / 1000000; in nanoseconds_on_clk()
261 struct s6i2c_if *iface = &s6i2c_if; in s6i2c_probe() local
265 spin_lock_init(&iface->lock); in s6i2c_probe()
266 init_completion(&iface->complete); in s6i2c_probe()
267 iface->irq = platform_get_irq(dev, 0); in s6i2c_probe()
268 if (iface->irq < 0) { in s6i2c_probe()
269 rc = iface->irq; in s6i2c_probe()
272 iface->res = platform_get_resource(dev, IORESOURCE_MEM, 0); in s6i2c_probe()
273 if (!iface->res) { in s6i2c_probe()
277 iface->res = request_mem_region(iface->res->start, in s6i2c_probe()
278 resource_size(iface->res), in s6i2c_probe()
280 if (!iface->res) { in s6i2c_probe()
284 iface->reg = ioremap_nocache(iface->res->start, in s6i2c_probe()
285 resource_size(iface->res)); in s6i2c_probe()
286 if (!iface->reg) { in s6i2c_probe()
298 iface->clk = clk_get(&dev->dev, clock); in s6i2c_probe()
299 if (IS_ERR(iface->clk)) { in s6i2c_probe()
300 rc = PTR_ERR(iface->clk); in s6i2c_probe()
303 rc = clk_enable(iface->clk); in s6i2c_probe()
306 init_timer(&iface->timeout_timer); in s6i2c_probe()
307 iface->timeout_timer.function = s6i2c_timeout; in s6i2c_probe()
308 iface->timeout_timer.data = (unsigned long)iface; in s6i2c_probe()
310 p_adap = &iface->adap; in s6i2c_probe()
313 p_adap->algo_data = iface; in s6i2c_probe()
317 i2c_wr16(iface, S6_I2C_INTRMASK, 0); in s6i2c_probe()
318 rc = request_irq(iface->irq, s6i2c_interrupt_entry, in s6i2c_probe()
319 IRQF_SHARED, dev->name, iface); in s6i2c_probe()
321 dev_err(&p_adap->dev, "s6i2c: can't get IRQ %d\n", iface->irq); in s6i2c_probe()
325 i2c_wr16(iface, S6_I2C_ENABLE, 0); in s6i2c_probe()
327 i2c_wr32(iface, S6_I2C_SRESET, 1 << S6_I2C_SRESET_IC_SRST); in s6i2c_probe()
328 i2c_wr16(iface, S6_I2C_CLRTXABRT, 1); in s6i2c_probe()
329 i2c_wr16(iface, S6_I2C_CON, in s6i2c_probe()
336 i2c_wr16(iface, S6_I2C_SSHCNT, nanoseconds_on_clk(iface, 4000)); in s6i2c_probe()
337 i2c_wr16(iface, S6_I2C_SSLCNT, nanoseconds_on_clk(iface, 4700)); in s6i2c_probe()
338 i2c_wr16(iface, S6_I2C_FSHCNT, nanoseconds_on_clk(iface, 600)); in s6i2c_probe()
339 i2c_wr16(iface, S6_I2C_FSLCNT, nanoseconds_on_clk(iface, 1300)); in s6i2c_probe()
340 i2c_wr16(iface, S6_I2C_RXTL, 0); in s6i2c_probe()
341 i2c_wr16(iface, S6_I2C_TXTL, 0); in s6i2c_probe()
343 platform_set_drvdata(dev, iface); in s6i2c_probe()
350 free_irq(iface->irq, iface); in s6i2c_probe()
352 clk_disable(iface->clk); in s6i2c_probe()
354 clk_put(iface->clk); in s6i2c_probe()
356 iounmap(iface->reg); in s6i2c_probe()
358 release_mem_region(iface->res->start, in s6i2c_probe()
359 resource_size(iface->res)); in s6i2c_probe()
366 struct s6i2c_if *iface = platform_get_drvdata(pdev); in s6i2c_remove() local
367 i2c_wr16(iface, S6_I2C_ENABLE, 0); in s6i2c_remove()
368 i2c_del_adapter(&iface->adap); in s6i2c_remove()
369 free_irq(iface->irq, iface); in s6i2c_remove()
370 clk_disable(iface->clk); in s6i2c_remove()
371 clk_put(iface->clk); in s6i2c_remove()
372 iounmap(iface->reg); in s6i2c_remove()
373 release_mem_region(iface->res->start, in s6i2c_remove()
374 resource_size(iface->res)); in s6i2c_remove()