Lines Matching +full:bank +full:- +full:ioport
1 // SPDX-License-Identifier: GPL-2.0-or-later
8 * Authors: Shyam Sundar S K <Shyam-sundar.S-[email protected]>
14 #include <linux/devm-helpers.h>
19 #include <linux/ioport.h>
25 #include "i2c-piix4.h"
61 unsigned short piix4_smba = dev->port_addr->start; in amd_asf_process_target()
63 u8 bank, reg, cmd; in amd_asf_process_target() local
71 /* Set bank as full */ in amd_asf_process_target()
76 /* Read data bank */ in amd_asf_process_target()
78 bank = (reg & BIT(3)) ? 1 : 0; in amd_asf_process_target()
80 /* Set read data bank */ in amd_asf_process_target()
81 if (bank) { in amd_asf_process_target()
96 /* Clear data bank status */ in amd_asf_process_target()
97 if (bank) { in amd_asf_process_target()
114 i2c_slave_event(dev->target, I2C_SLAVE_WRITE_REQUESTED, &val); in amd_asf_process_target()
117 i2c_slave_event(dev->target, I2C_SLAVE_WRITE_RECEIVED, &val); in amd_asf_process_target()
119 i2c_slave_event(dev->target, I2C_SLAVE_STOP, &val); in amd_asf_process_target()
136 reg = ioread32(dev->mmio_cfg.addr); in amd_asf_update_mmio_target()
138 iowrite32(reg, dev->mmio_cfg.addr); in amd_asf_update_mmio_target()
143 unsigned short piix4_smba = dev->port_addr->start; in amd_asf_setup_target()
166 unsigned short piix4_smba = dev->port_addr->start; in amd_asf_access()
173 return -EINVAL; in amd_asf_access()
192 unsigned short piix4_smba = dev->port_addr->start; in amd_asf_xfer()
198 if (msgs->flags & I2C_M_RD) { in amd_asf_xfer()
199 dev_err(&adap->dev, "ASF: Read not supported\n"); in amd_asf_xfer()
200 return -EOPNOTSUPP; in amd_asf_xfer()
204 if (msgs->len > ASF_BLOCK_MAX_BYTES - 3) { in amd_asf_xfer()
205 dev_warn(&adap->dev, "ASF: max message length exceeded\n"); in amd_asf_xfer()
206 return -EOPNOTSUPP; in amd_asf_xfer()
209 asf_data[0] = dev_msgs->len; in amd_asf_xfer()
210 memcpy(asf_data + 1, dev_msgs[0].buf, dev_msgs->len); in amd_asf_xfer()
212 ret = piix4_sb800_region_request(&adap->dev, &dev->mmio_cfg); in amd_asf_xfer()
223 prev_port = piix4_sb800_port_sel(0, &dev->mmio_cfg); in amd_asf_xfer()
224 ret = amd_asf_access(adap, msgs->addr, msgs[0].buf[0], asf_data); in amd_asf_xfer()
225 piix4_sb800_port_sel(prev_port, &dev->mmio_cfg); in amd_asf_xfer()
227 piix4_sb800_region_release(&adap->dev, &dev->mmio_cfg); in amd_asf_xfer()
233 struct amd_asf_dev *dev = i2c_get_adapdata(target->adapter); in amd_asf_reg_target()
234 unsigned short piix4_smba = dev->port_addr->start; in amd_asf_reg_target()
238 if (dev->target) in amd_asf_reg_target()
239 return -EBUSY; in amd_asf_reg_target()
241 ret = piix4_sb800_region_request(&target->dev, &dev->mmio_cfg); in amd_asf_reg_target()
245 reg = (target->addr << 1) | I2C_M_RD; in amd_asf_reg_target()
249 dev->target = target; in amd_asf_reg_target()
251 piix4_sb800_region_release(&target->dev, &dev->mmio_cfg); in amd_asf_reg_target()
258 struct amd_asf_dev *dev = i2c_get_adapdata(target->adapter); in amd_asf_unreg_target()
259 unsigned short piix4_smba = dev->port_addr->start; in amd_asf_unreg_target()
263 dev->target = NULL; in amd_asf_unreg_target()
284 unsigned short piix4_smba = dev->port_addr->start; in amd_asf_irq_handler()
290 schedule_delayed_work(&dev->work_buf, HZ); in amd_asf_irq_handler()
296 iowrite32(irq, dev->eoi_base); in amd_asf_irq_handler()
302 struct device *dev = &pdev->dev; in amd_asf_probe()
309 return dev_err_probe(dev, -ENOMEM, "Failed to allocate memory\n"); in amd_asf_probe()
311 asf_dev->mmio_cfg.use_mmio = true; in amd_asf_probe()
312 asf_dev->port_addr = platform_get_resource(pdev, IORESOURCE_IO, 0); in amd_asf_probe()
313 if (!asf_dev->port_addr) in amd_asf_probe()
314 return dev_err_probe(dev, -EINVAL, "missing IO resources\n"); in amd_asf_probe()
325 return dev_err_probe(dev, -EINVAL, "missing MEM resources\n"); in amd_asf_probe()
327 asf_dev->eoi_base = devm_ioremap(dev, eoi_addr->start, resource_size(eoi_addr)); in amd_asf_probe()
328 if (!asf_dev->eoi_base) in amd_asf_probe()
329 return dev_err_probe(dev, -EBUSY, "failed mapping IO region\n"); in amd_asf_probe()
331 ret = devm_delayed_work_autocancel(dev, &asf_dev->work_buf, amd_asf_process_target); in amd_asf_probe()
343 asf_dev->adap.owner = THIS_MODULE; in amd_asf_probe()
344 asf_dev->adap.algo = &amd_asf_smbus_algorithm; in amd_asf_probe()
345 asf_dev->adap.dev.parent = dev; in amd_asf_probe()
347 i2c_set_adapdata(&asf_dev->adap, asf_dev); in amd_asf_probe()
348 snprintf(asf_dev->adap.name, sizeof(asf_dev->adap.name), "AMD ASF adapter"); in amd_asf_probe()
350 return devm_i2c_add_adapter(dev, &asf_dev->adap); in amd_asf_probe()
361 .name = "i2c-amd-asf",