Lines Matching refs:dev

180 static inline int brcmstb_i2c_get_xfersz(struct brcmstb_i2c_dev *dev)  in brcmstb_i2c_get_xfersz()  argument
182 return (N_DATA_REGS * dev->data_regsz); in brcmstb_i2c_get_xfersz()
185 static inline int brcmstb_i2c_get_data_regsz(struct brcmstb_i2c_dev *dev) in brcmstb_i2c_get_data_regsz() argument
187 return dev->data_regsz; in brcmstb_i2c_get_data_regsz()
190 static void brcmstb_i2c_enable_disable_irq(struct brcmstb_i2c_dev *dev, in brcmstb_i2c_enable_disable_irq() argument
196 dev->bsc_regmap->ctl_reg |= BSC_CTL_REG_INT_EN_MASK; in brcmstb_i2c_enable_disable_irq()
199 dev->bsc_regmap->ctl_reg &= ~BSC_CTL_REG_INT_EN_MASK; in brcmstb_i2c_enable_disable_irq()
202 bsc_writel(dev, dev->bsc_regmap->ctl_reg, ctl_reg); in brcmstb_i2c_enable_disable_irq()
207 struct brcmstb_i2c_dev *dev = devid; in brcmstb_i2c_isr() local
208 u32 status_bsc_ctl = bsc_readl(dev, ctl_reg); in brcmstb_i2c_isr()
209 u32 status_iic_intrp = bsc_readl(dev, iic_enable); in brcmstb_i2c_isr()
211 dev_dbg(dev->device, "isr CTL_REG %x IIC_EN %x\n", in brcmstb_i2c_isr()
217 brcmstb_i2c_enable_disable_irq(dev, INT_DISABLE); in brcmstb_i2c_isr()
218 complete(&dev->done); in brcmstb_i2c_isr()
220 dev_dbg(dev->device, "isr handled"); in brcmstb_i2c_isr()
225 static int brcmstb_i2c_wait_if_busy(struct brcmstb_i2c_dev *dev) in brcmstb_i2c_wait_if_busy() argument
229 while ((bsc_readl(dev, iic_enable) & BSC_IIC_EN_INTRP_MASK)) { in brcmstb_i2c_wait_if_busy()
238 static int brcmstb_i2c_wait_for_completion(struct brcmstb_i2c_dev *dev) in brcmstb_i2c_wait_for_completion() argument
243 if (dev->irq >= 0) { in brcmstb_i2c_wait_for_completion()
244 if (!wait_for_completion_timeout(&dev->done, timeout)) in brcmstb_i2c_wait_for_completion()
252 bsc_intrp = bsc_readl(dev, iic_enable) & in brcmstb_i2c_wait_for_completion()
262 if (dev->irq < 0 || ret == -ETIMEDOUT) in brcmstb_i2c_wait_for_completion()
263 brcmstb_i2c_enable_disable_irq(dev, INT_DISABLE); in brcmstb_i2c_wait_for_completion()
269 static void brcmstb_set_i2c_start_stop(struct brcmstb_i2c_dev *dev, in brcmstb_set_i2c_start_stop() argument
272 u32 regval = dev->bsc_regmap->iic_enable; in brcmstb_set_i2c_start_stop()
274 dev->bsc_regmap->iic_enable = (regval & ~COND_START_STOP) | cond_flag; in brcmstb_set_i2c_start_stop()
278 static int brcmstb_send_i2c_cmd(struct brcmstb_i2c_dev *dev, in brcmstb_send_i2c_cmd() argument
282 struct bsc_regs *pi2creg = dev->bsc_regmap; in brcmstb_send_i2c_cmd()
285 rc = brcmstb_i2c_wait_if_busy(dev); in brcmstb_send_i2c_cmd()
290 if (dev->irq >= 0) in brcmstb_send_i2c_cmd()
291 reinit_completion(&dev->done); in brcmstb_send_i2c_cmd()
294 brcmstb_i2c_enable_disable_irq(dev, INT_ENABLE); in brcmstb_send_i2c_cmd()
298 bsc_writel(dev, pi2creg->iic_enable, iic_enable); in brcmstb_send_i2c_cmd()
301 rc = brcmstb_i2c_wait_for_completion(dev); in brcmstb_send_i2c_cmd()
303 dev_dbg(dev->device, "intr timeout for cmd %s\n", in brcmstb_send_i2c_cmd()
309 bsc_readl(dev, iic_enable) & BSC_IIC_EN_NOACK_MASK) { in brcmstb_send_i2c_cmd()
311 dev_dbg(dev->device, "controller received NOACK intr for %s\n", in brcmstb_send_i2c_cmd()
316 bsc_writel(dev, 0, cnt_reg); in brcmstb_send_i2c_cmd()
317 bsc_writel(dev, 0, iic_enable); in brcmstb_send_i2c_cmd()
323 static int brcmstb_i2c_xfer_bsc_data(struct brcmstb_i2c_dev *dev, in brcmstb_i2c_xfer_bsc_data() argument
330 struct bsc_regs *pi2creg = dev->bsc_regmap; in brcmstb_i2c_xfer_bsc_data()
332 int data_regsz = brcmstb_i2c_get_data_regsz(dev); in brcmstb_i2c_xfer_bsc_data()
343 bsc_writel(dev, pi2creg->ctlhi_reg, ctlhi_reg); in brcmstb_i2c_xfer_bsc_data()
353 bsc_writel(dev, BSC_CNT_REG1_MASK(data_regsz) & in brcmstb_i2c_xfer_bsc_data()
368 bsc_writel(dev, word, data_in[i]); in brcmstb_i2c_xfer_bsc_data()
373 rc = brcmstb_send_i2c_cmd(dev, cmd); in brcmstb_i2c_xfer_bsc_data()
376 dev_dbg(dev->device, "%s failure", cmd_string[cmd]); in brcmstb_i2c_xfer_bsc_data()
383 u32 data = bsc_readl(dev, data_out[i]); in brcmstb_i2c_xfer_bsc_data()
397 static int brcmstb_i2c_write_data_byte(struct brcmstb_i2c_dev *dev, in brcmstb_i2c_write_data_byte() argument
402 bsc_writel(dev, 1, cnt_reg); in brcmstb_i2c_write_data_byte()
403 bsc_writel(dev, *buf, data_in); in brcmstb_i2c_write_data_byte()
405 return brcmstb_send_i2c_cmd(dev, cmd); in brcmstb_i2c_write_data_byte()
409 static int brcmstb_i2c_do_addr(struct brcmstb_i2c_dev *dev, in brcmstb_i2c_do_addr() argument
417 bsc_writel(dev, addr, chip_address); in brcmstb_i2c_do_addr()
421 if (brcmstb_i2c_write_data_byte(dev, &addr, 0) < 0) in brcmstb_i2c_do_addr()
426 brcmstb_set_i2c_start_stop(dev, COND_RESTART in brcmstb_i2c_do_addr()
430 if (brcmstb_i2c_write_data_byte(dev, &addr, 0) < 0) in brcmstb_i2c_do_addr()
437 bsc_writel(dev, addr, chip_address); in brcmstb_i2c_do_addr()
447 struct brcmstb_i2c_dev *dev = i2c_get_adapdata(adapter); in brcmstb_i2c_xfer() local
454 int xfersz = brcmstb_i2c_get_xfersz(dev); in brcmstb_i2c_xfer()
463 dev_dbg(dev->device, in brcmstb_i2c_xfer()
473 brcmstb_set_i2c_start_stop(dev, cond); in brcmstb_i2c_xfer()
477 rc = brcmstb_i2c_do_addr(dev, pmsg); in brcmstb_i2c_xfer()
479 dev_dbg(dev->device, in brcmstb_i2c_xfer()
503 brcmstb_set_i2c_start_stop(dev, cond_per_msg); in brcmstb_i2c_xfer()
505 rc = brcmstb_i2c_xfer_bsc_data(dev, tmp_buf, in brcmstb_i2c_xfer()
534 static void brcmstb_i2c_set_bus_speed(struct brcmstb_i2c_dev *dev) in brcmstb_i2c_set_bus_speed() argument
537 u32 clk_freq_hz = dev->clk_freq_hz; in brcmstb_i2c_set_bus_speed()
541 dev->bsc_regmap->ctl_reg &= ~(BSC_CTL_REG_SCL_SEL_MASK in brcmstb_i2c_set_bus_speed()
543 dev->bsc_regmap->ctl_reg |= (bsc_clk[i].scl_mask | in brcmstb_i2c_set_bus_speed()
545 bsc_writel(dev, dev->bsc_regmap->ctl_reg, ctl_reg); in brcmstb_i2c_set_bus_speed()
552 i = (bsc_readl(dev, ctl_reg) & BSC_CTL_REG_SCL_SEL_MASK) >> in brcmstb_i2c_set_bus_speed()
554 dev_warn(dev->device, "leaving current clock-frequency @ %dHz\n", in brcmstb_i2c_set_bus_speed()
559 static void brcmstb_i2c_set_bsc_reg_defaults(struct brcmstb_i2c_dev *dev) in brcmstb_i2c_set_bsc_reg_defaults() argument
561 if (brcmstb_i2c_get_data_regsz(dev) == sizeof(u32)) in brcmstb_i2c_set_bsc_reg_defaults()
563 dev->bsc_regmap->ctlhi_reg = BSC_CTLHI_REG_DATAREG_SIZE_MASK; in brcmstb_i2c_set_bsc_reg_defaults()
565 dev->bsc_regmap->ctlhi_reg &= ~BSC_CTLHI_REG_DATAREG_SIZE_MASK; in brcmstb_i2c_set_bsc_reg_defaults()
567 bsc_writel(dev, dev->bsc_regmap->ctlhi_reg, ctlhi_reg); in brcmstb_i2c_set_bsc_reg_defaults()
569 brcmstb_i2c_set_bus_speed(dev); in brcmstb_i2c_set_bsc_reg_defaults()
575 static int bcm2711_release_bsc(struct brcmstb_i2c_dev *dev) in bcm2711_release_bsc() argument
577 struct platform_device *pdev = to_platform_device(dev->device); in bcm2711_release_bsc()
586 devm_iounmap(&pdev->dev, autoi2c); in bcm2711_release_bsc()
589 dev->bsc_regmap->iic_enable = 0; in bcm2711_release_bsc()
590 bsc_writel(dev, dev->bsc_regmap->iic_enable, iic_enable); in bcm2711_release_bsc()
597 struct brcmstb_i2c_dev *dev; in brcmstb_i2c_probe() local
603 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); in brcmstb_i2c_probe()
604 if (!dev) in brcmstb_i2c_probe()
607 dev->bsc_regmap = devm_kzalloc(&pdev->dev, sizeof(*dev->bsc_regmap), GFP_KERNEL); in brcmstb_i2c_probe()
608 if (!dev->bsc_regmap) in brcmstb_i2c_probe()
611 platform_set_drvdata(pdev, dev); in brcmstb_i2c_probe()
612 dev->device = &pdev->dev; in brcmstb_i2c_probe()
613 init_completion(&dev->done); in brcmstb_i2c_probe()
616 dev->base = devm_platform_ioremap_resource(pdev, 0); in brcmstb_i2c_probe()
617 if (IS_ERR(dev->base)) in brcmstb_i2c_probe()
618 return PTR_ERR(dev->base); in brcmstb_i2c_probe()
620 if (of_device_is_compatible(dev->device->of_node, in brcmstb_i2c_probe()
622 rc = bcm2711_release_bsc(dev); in brcmstb_i2c_probe()
627 rc = of_property_read_string(dev->device->of_node, "interrupt-names", in brcmstb_i2c_probe()
633 dev->irq = platform_get_irq_optional(pdev, 0); in brcmstb_i2c_probe()
636 brcmstb_i2c_enable_disable_irq(dev, INT_DISABLE); in brcmstb_i2c_probe()
639 if (dev->irq >= 0) { in brcmstb_i2c_probe()
640 rc = devm_request_irq(&pdev->dev, dev->irq, brcmstb_i2c_isr, in brcmstb_i2c_probe()
643 dev); in brcmstb_i2c_probe()
646 dev_dbg(dev->device, "falling back to polling mode"); in brcmstb_i2c_probe()
647 dev->irq = -1; in brcmstb_i2c_probe()
651 if (of_property_read_u32(dev->device->of_node, in brcmstb_i2c_probe()
652 "clock-frequency", &dev->clk_freq_hz)) { in brcmstb_i2c_probe()
653 dev_warn(dev->device, "setting clock-frequency@%dHz\n", in brcmstb_i2c_probe()
655 dev->clk_freq_hz = bsc_clk[0].hz; in brcmstb_i2c_probe()
659 if (of_device_is_compatible(dev->device->of_node, in brcmstb_i2c_probe()
661 dev->data_regsz = sizeof(u8); in brcmstb_i2c_probe()
663 dev->data_regsz = sizeof(u32); in brcmstb_i2c_probe()
665 brcmstb_i2c_set_bsc_reg_defaults(dev); in brcmstb_i2c_probe()
668 adap = &dev->adapter; in brcmstb_i2c_probe()
669 i2c_set_adapdata(adap, dev); in brcmstb_i2c_probe()
671 strscpy(adap->name, dev_name(&pdev->dev), sizeof(adap->name)); in brcmstb_i2c_probe()
673 adap->dev.parent = &pdev->dev; in brcmstb_i2c_probe()
674 adap->dev.of_node = pdev->dev.of_node; in brcmstb_i2c_probe()
679 dev_info(dev->device, "%s@%dhz registered in %s mode\n", in brcmstb_i2c_probe()
680 int_name ? int_name : " ", dev->clk_freq_hz, in brcmstb_i2c_probe()
681 (dev->irq >= 0) ? "interrupt" : "polling"); in brcmstb_i2c_probe()
688 struct brcmstb_i2c_dev *dev = platform_get_drvdata(pdev); in brcmstb_i2c_remove() local
690 i2c_del_adapter(&dev->adapter); in brcmstb_i2c_remove()
693 static int brcmstb_i2c_suspend(struct device *dev) in brcmstb_i2c_suspend() argument
695 struct brcmstb_i2c_dev *i2c_dev = dev_get_drvdata(dev); in brcmstb_i2c_suspend()
701 static int brcmstb_i2c_resume(struct device *dev) in brcmstb_i2c_resume() argument
703 struct brcmstb_i2c_dev *i2c_dev = dev_get_drvdata(dev); in brcmstb_i2c_resume()