Lines Matching refs:i2c_dev
67 static inline void bcm2835_i2c_writel(struct bcm2835_i2c_dev *i2c_dev, in bcm2835_i2c_writel() argument
70 writel(val, i2c_dev->regs + reg); in bcm2835_i2c_writel()
73 static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg) in bcm2835_i2c_readl() argument
75 return readl(i2c_dev->regs + reg); in bcm2835_i2c_readl()
78 static void bcm2835_fill_txfifo(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_fill_txfifo() argument
82 while (i2c_dev->msg_buf_remaining) { in bcm2835_fill_txfifo()
83 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_fill_txfifo()
86 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_FIFO, in bcm2835_fill_txfifo()
87 *i2c_dev->msg_buf); in bcm2835_fill_txfifo()
88 i2c_dev->msg_buf++; in bcm2835_fill_txfifo()
89 i2c_dev->msg_buf_remaining--; in bcm2835_fill_txfifo()
93 static void bcm2835_drain_rxfifo(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_drain_rxfifo() argument
97 while (i2c_dev->msg_buf_remaining) { in bcm2835_drain_rxfifo()
98 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_drain_rxfifo()
101 *i2c_dev->msg_buf = bcm2835_i2c_readl(i2c_dev, in bcm2835_drain_rxfifo()
103 i2c_dev->msg_buf++; in bcm2835_drain_rxfifo()
104 i2c_dev->msg_buf_remaining--; in bcm2835_drain_rxfifo()
110 struct bcm2835_i2c_dev *i2c_dev = data; in bcm2835_i2c_isr() local
113 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_i2c_isr()
114 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_S, val); in bcm2835_i2c_isr()
118 i2c_dev->msg_err = err; in bcm2835_i2c_isr()
119 complete(&i2c_dev->completion); in bcm2835_i2c_isr()
124 bcm2835_drain_rxfifo(i2c_dev); in bcm2835_i2c_isr()
130 if (i2c_dev->msg_buf_remaining) in bcm2835_i2c_isr()
131 i2c_dev->msg_err = BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
133 i2c_dev->msg_err = 0; in bcm2835_i2c_isr()
134 complete(&i2c_dev->completion); in bcm2835_i2c_isr()
139 bcm2835_fill_txfifo(i2c_dev); in bcm2835_i2c_isr()
146 static int bcm2835_i2c_xfer_msg(struct bcm2835_i2c_dev *i2c_dev, in bcm2835_i2c_xfer_msg() argument
152 i2c_dev->msg_buf = msg->buf; in bcm2835_i2c_xfer_msg()
153 i2c_dev->msg_buf_remaining = msg->len; in bcm2835_i2c_xfer_msg()
154 reinit_completion(&i2c_dev->completion); in bcm2835_i2c_xfer_msg()
156 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR); in bcm2835_i2c_xfer_msg()
162 bcm2835_fill_txfifo(i2c_dev); in bcm2835_i2c_xfer_msg()
166 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_A, msg->addr); in bcm2835_i2c_xfer_msg()
167 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len); in bcm2835_i2c_xfer_msg()
168 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c); in bcm2835_i2c_xfer_msg()
170 time_left = wait_for_completion_timeout(&i2c_dev->completion, in bcm2835_i2c_xfer_msg()
172 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR); in bcm2835_i2c_xfer_msg()
174 dev_err(i2c_dev->dev, "i2c transfer timed out\n"); in bcm2835_i2c_xfer_msg()
178 if (likely(!i2c_dev->msg_err)) in bcm2835_i2c_xfer_msg()
181 if ((i2c_dev->msg_err & BCM2835_I2C_S_ERR) && in bcm2835_i2c_xfer_msg()
185 dev_err(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err); in bcm2835_i2c_xfer_msg()
187 if (i2c_dev->msg_err & BCM2835_I2C_S_ERR) in bcm2835_i2c_xfer_msg()
196 struct bcm2835_i2c_dev *i2c_dev = i2c_get_adapdata(adap); in bcm2835_i2c_xfer() local
201 ret = bcm2835_i2c_xfer_msg(i2c_dev, &msgs[i]); in bcm2835_i2c_xfer()
221 struct bcm2835_i2c_dev *i2c_dev; in bcm2835_i2c_probe() local
227 i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); in bcm2835_i2c_probe()
228 if (!i2c_dev) in bcm2835_i2c_probe()
230 platform_set_drvdata(pdev, i2c_dev); in bcm2835_i2c_probe()
231 i2c_dev->dev = &pdev->dev; in bcm2835_i2c_probe()
232 init_completion(&i2c_dev->completion); in bcm2835_i2c_probe()
235 i2c_dev->regs = devm_ioremap_resource(&pdev->dev, mem); in bcm2835_i2c_probe()
236 if (IS_ERR(i2c_dev->regs)) in bcm2835_i2c_probe()
237 return PTR_ERR(i2c_dev->regs); in bcm2835_i2c_probe()
239 i2c_dev->clk = devm_clk_get(&pdev->dev, NULL); in bcm2835_i2c_probe()
240 if (IS_ERR(i2c_dev->clk)) { in bcm2835_i2c_probe()
242 return PTR_ERR(i2c_dev->clk); in bcm2835_i2c_probe()
253 divider = DIV_ROUND_UP(clk_get_rate(i2c_dev->clk), bus_clk_rate); in bcm2835_i2c_probe()
261 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DIV, divider); in bcm2835_i2c_probe()
268 i2c_dev->irq = irq->start; in bcm2835_i2c_probe()
270 ret = request_irq(i2c_dev->irq, bcm2835_i2c_isr, IRQF_SHARED, in bcm2835_i2c_probe()
271 dev_name(&pdev->dev), i2c_dev); in bcm2835_i2c_probe()
277 adap = &i2c_dev->adapter; in bcm2835_i2c_probe()
278 i2c_set_adapdata(adap, i2c_dev); in bcm2835_i2c_probe()
286 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0); in bcm2835_i2c_probe()
290 free_irq(i2c_dev->irq, i2c_dev); in bcm2835_i2c_probe()
297 struct bcm2835_i2c_dev *i2c_dev = platform_get_drvdata(pdev); in bcm2835_i2c_remove() local
299 free_irq(i2c_dev->irq, i2c_dev); in bcm2835_i2c_remove()
300 i2c_del_adapter(&i2c_dev->adapter); in bcm2835_i2c_remove()