Lines Matching +full:brcmstb +full:- +full:i2c

17 #include <linux/i2c.h>
31 * size. Cable modem and DSL SoCs with Peripheral i2c cores use 1 byte per
186 __bsc_readl(_dev->base + offsetof(struct bsc_regs, _reg))
189 __bsc_writel(_val, _dev->base + offsetof(struct bsc_regs, _reg))
193 return (N_DATA_REGS * dev->data_regsz); in brcmstb_i2c_get_xfersz()
198 return dev->data_regsz; in brcmstb_i2c_get_data_regsz()
207 dev->bsc_regmap->ctl_reg |= BSC_CTL_REG_INT_EN_MASK; in brcmstb_i2c_enable_disable_irq()
210 dev->bsc_regmap->ctl_reg &= ~BSC_CTL_REG_INT_EN_MASK; in brcmstb_i2c_enable_disable_irq()
213 bsc_writel(dev, dev->bsc_regmap->ctl_reg, ctl_reg); in brcmstb_i2c_enable_disable_irq()
222 dev_dbg(dev->device, "isr CTL_REG %x IIC_EN %x\n", in brcmstb_i2c_isr()
229 complete(&dev->done); in brcmstb_i2c_isr()
231 dev_dbg(dev->device, "isr handled"); in brcmstb_i2c_isr()
242 return -ETIMEDOUT; in brcmstb_i2c_wait_if_busy()
248 /* i2c xfer completion function, handles both irq and polling mode */
254 if (dev->irq >= 0) { in brcmstb_i2c_wait_for_completion()
255 if (!wait_for_completion_timeout(&dev->done, timeout)) in brcmstb_i2c_wait_for_completion()
256 ret = -ETIMEDOUT; in brcmstb_i2c_wait_for_completion()
266 ret = -ETIMEDOUT; in brcmstb_i2c_wait_for_completion()
273 if (dev->irq < 0 || ret == -ETIMEDOUT) in brcmstb_i2c_wait_for_completion()
283 u32 regval = dev->bsc_regmap->iic_enable; in brcmstb_set_i2c_start_stop()
285 dev->bsc_regmap->iic_enable = (regval & ~COND_START_STOP) | cond_flag; in brcmstb_set_i2c_start_stop()
288 /* Send I2C request check completion */
293 struct bsc_regs *pi2creg = dev->bsc_regmap; in brcmstb_send_i2c_cmd()
301 if (dev->irq >= 0) in brcmstb_send_i2c_cmd()
302 reinit_completion(&dev->done); in brcmstb_send_i2c_cmd()
308 pi2creg->iic_enable |= BSC_IIC_EN_ENABLE_MASK; in brcmstb_send_i2c_cmd()
309 bsc_writel(dev, pi2creg->iic_enable, iic_enable); in brcmstb_send_i2c_cmd()
314 dev_dbg(dev->device, "intr timeout for cmd %s\n", in brcmstb_send_i2c_cmd()
321 rc = -EREMOTEIO; in brcmstb_send_i2c_cmd()
322 dev_dbg(dev->device, "controller received NOACK intr for %s\n", in brcmstb_send_i2c_cmd()
341 struct bsc_regs *pi2creg = dev->bsc_regmap; in brcmstb_i2c_xfer_bsc_data()
342 int no_ack = pmsg->flags & I2C_M_IGNORE_NAK; in brcmstb_i2c_xfer_bsc_data()
347 cmd = (pmsg->flags & I2C_M_RD) ? CMD_RD_NOACK in brcmstb_i2c_xfer_bsc_data()
349 pi2creg->ctlhi_reg |= BSC_CTLHI_REG_IGNORE_ACK_MASK; in brcmstb_i2c_xfer_bsc_data()
351 cmd = (pmsg->flags & I2C_M_RD) ? CMD_RD : CMD_WR; in brcmstb_i2c_xfer_bsc_data()
352 pi2creg->ctlhi_reg &= ~BSC_CTLHI_REG_IGNORE_ACK_MASK; in brcmstb_i2c_xfer_bsc_data()
354 bsc_writel(dev, pi2creg->ctlhi_reg, ctlhi_reg); in brcmstb_i2c_xfer_bsc_data()
357 ctl_reg = pi2creg->ctl_reg & ~BSC_CTL_REG_DTF_MASK; in brcmstb_i2c_xfer_bsc_data()
359 pi2creg->ctl_reg = ctl_reg | DTF_WR_MASK; in brcmstb_i2c_xfer_bsc_data()
361 pi2creg->ctl_reg = ctl_reg | DTF_RD_MASK; in brcmstb_i2c_xfer_bsc_data()
377 (BITS_PER_BYTE * (data_regsz - 1)); in brcmstb_i2c_xfer_bsc_data()
387 dev_dbg(dev->device, "%s failure", cmd_string[cmd]); in brcmstb_i2c_xfer_bsc_data()
407 /* Write a single byte of data to the i2c bus */
419 /* Send i2c address */
425 if (msg->flags & I2C_M_TEN) { in brcmstb_i2c_do_addr()
427 addr = 0xF0 | ((msg->addr & 0x300) >> 7); in brcmstb_i2c_do_addr()
431 addr = msg->addr & 0xFF; in brcmstb_i2c_do_addr()
433 return -EREMOTEIO; in brcmstb_i2c_do_addr()
435 if (msg->flags & I2C_M_RD) { in brcmstb_i2c_do_addr()
439 /* Then re-send the first byte with the read bit set */ in brcmstb_i2c_do_addr()
440 addr = 0xF0 | ((msg->addr & 0x300) >> 7) | 0x01; in brcmstb_i2c_do_addr()
442 return -EREMOTEIO; in brcmstb_i2c_do_addr()
471 len = pmsg->len; in brcmstb_i2c_xfer()
472 tmp_buf = pmsg->buf; in brcmstb_i2c_xfer()
474 dev_dbg(dev->device, in brcmstb_i2c_xfer()
476 num - 1, pmsg->flags, in brcmstb_i2c_xfer()
477 pmsg->buf ? pmsg->buf[0] : '0', pmsg->len); in brcmstb_i2c_xfer()
479 if (i < (num - 1) && (msgs[i + 1].flags & I2C_M_NOSTART)) in brcmstb_i2c_xfer()
487 if (!(pmsg->flags & I2C_M_NOSTART)) { in brcmstb_i2c_xfer()
490 dev_dbg(dev->device, in brcmstb_i2c_xfer()
492 pmsg->addr, i, rc); in brcmstb_i2c_xfer()
504 if (i == (num - 1)) in brcmstb_i2c_xfer()
521 len -= bytes_to_xfer; in brcmstb_i2c_xfer()
548 u32 clk_freq_hz = dev->clk_freq_hz; in brcmstb_i2c_set_bus_speed()
552 dev->bsc_regmap->ctl_reg &= ~(BSC_CTL_REG_SCL_SEL_MASK in brcmstb_i2c_set_bus_speed()
554 dev->bsc_regmap->ctl_reg |= (bsc_clk[i].scl_mask | in brcmstb_i2c_set_bus_speed()
556 bsc_writel(dev, dev->bsc_regmap->ctl_reg, ctl_reg); in brcmstb_i2c_set_bus_speed()
565 dev_warn(dev->device, "leaving current clock-frequency @ %dHz\n", in brcmstb_i2c_set_bus_speed()
574 dev->bsc_regmap->ctlhi_reg = BSC_CTLHI_REG_DATAREG_SIZE_MASK; in brcmstb_i2c_set_bsc_reg_defaults()
576 dev->bsc_regmap->ctlhi_reg &= ~BSC_CTLHI_REG_DATAREG_SIZE_MASK; in brcmstb_i2c_set_bsc_reg_defaults()
578 bsc_writel(dev, dev->bsc_regmap->ctlhi_reg, ctlhi_reg); in brcmstb_i2c_set_bsc_reg_defaults()
588 struct platform_device *pdev = to_platform_device(dev->device); in bcm2711_release_bsc()
593 iomem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "auto-i2c"); in bcm2711_release_bsc()
594 autoi2c = devm_ioremap_resource(&pdev->dev, iomem); in bcm2711_release_bsc()
599 devm_iounmap(&pdev->dev, autoi2c); in bcm2711_release_bsc()
602 dev->bsc_regmap->iic_enable = 0; in bcm2711_release_bsc()
603 bsc_writel(dev, dev->bsc_regmap->iic_enable, iic_enable); in bcm2711_release_bsc()
617 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); in brcmstb_i2c_probe()
619 return -ENOMEM; in brcmstb_i2c_probe()
621 dev->bsc_regmap = devm_kzalloc(&pdev->dev, sizeof(*dev->bsc_regmap), GFP_KERNEL); in brcmstb_i2c_probe()
622 if (!dev->bsc_regmap) in brcmstb_i2c_probe()
623 return -ENOMEM; in brcmstb_i2c_probe()
626 dev->device = &pdev->dev; in brcmstb_i2c_probe()
627 init_completion(&dev->done); in brcmstb_i2c_probe()
631 dev->base = devm_ioremap_resource(dev->device, iomem); in brcmstb_i2c_probe()
632 if (IS_ERR(dev->base)) { in brcmstb_i2c_probe()
633 rc = -ENOMEM; in brcmstb_i2c_probe()
637 if (of_device_is_compatible(dev->device->of_node, in brcmstb_i2c_probe()
638 "brcm,bcm2711-hdmi-i2c")) { in brcmstb_i2c_probe()
644 rc = of_property_read_string(dev->device->of_node, "interrupt-names", in brcmstb_i2c_probe()
650 dev->irq = platform_get_irq_optional(pdev, 0); in brcmstb_i2c_probe()
656 if (dev->irq >= 0) { in brcmstb_i2c_probe()
657 rc = devm_request_irq(&pdev->dev, dev->irq, brcmstb_i2c_isr, in brcmstb_i2c_probe()
659 int_name ? int_name : pdev->name, in brcmstb_i2c_probe()
663 dev_dbg(dev->device, "falling back to polling mode"); in brcmstb_i2c_probe()
664 dev->irq = -1; in brcmstb_i2c_probe()
668 if (of_property_read_u32(dev->device->of_node, in brcmstb_i2c_probe()
669 "clock-frequency", &dev->clk_freq_hz)) { in brcmstb_i2c_probe()
670 dev_warn(dev->device, "setting clock-frequency@%dHz\n", in brcmstb_i2c_probe()
672 dev->clk_freq_hz = bsc_clk[0].hz; in brcmstb_i2c_probe()
676 if (of_device_is_compatible(dev->device->of_node, in brcmstb_i2c_probe()
677 "brcmstb,brcmper-i2c")) in brcmstb_i2c_probe()
678 dev->data_regsz = sizeof(u8); in brcmstb_i2c_probe()
680 dev->data_regsz = sizeof(u32); in brcmstb_i2c_probe()
684 /* Add the i2c adapter */ in brcmstb_i2c_probe()
685 adap = &dev->adapter; in brcmstb_i2c_probe()
687 adap->owner = THIS_MODULE; in brcmstb_i2c_probe()
688 strlcpy(adap->name, "Broadcom STB : ", sizeof(adap->name)); in brcmstb_i2c_probe()
690 strlcat(adap->name, int_name, sizeof(adap->name)); in brcmstb_i2c_probe()
691 adap->algo = &brcmstb_i2c_algo; in brcmstb_i2c_probe()
692 adap->dev.parent = &pdev->dev; in brcmstb_i2c_probe()
693 adap->dev.of_node = pdev->dev.of_node; in brcmstb_i2c_probe()
698 dev_info(dev->device, "%s@%dhz registered in %s mode\n", in brcmstb_i2c_probe()
699 int_name ? int_name : " ", dev->clk_freq_hz, in brcmstb_i2c_probe()
700 (dev->irq >= 0) ? "interrupt" : "polling"); in brcmstb_i2c_probe()
712 i2c_del_adapter(&dev->adapter); in brcmstb_i2c_remove()
721 i2c_mark_adapter_suspended(&i2c_dev->adapter); in brcmstb_i2c_suspend()
730 i2c_mark_adapter_resumed(&i2c_dev->adapter); in brcmstb_i2c_resume()
740 {.compatible = "brcm,brcmstb-i2c"},
741 {.compatible = "brcm,brcmper-i2c"},
742 {.compatible = "brcm,bcm2711-hdmi-i2c"},
749 .name = "brcmstb-i2c",
759 MODULE_DESCRIPTION("Broadcom Settop I2C Driver");