aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndriy Gapon <avg@FreeBSD.org>2019-05-29 09:08:20 +0000
committerAndriy Gapon <avg@FreeBSD.org>2019-05-29 09:08:20 +0000
commitfec2f12ebdc35b3703360c1f99783f4d331e3d0a (patch)
tree2cbabb41c3ffca7b4a37379d3caeff82d5783bd8
parent93a2d4c92f7b8008041cc5d6cf3052e7a6c106ff (diff)
downloadsrc-fec2f12ebdc35b3703360c1f99783f4d331e3d0a.tar.gz
src-fec2f12ebdc35b3703360c1f99783f4d331e3d0a.zip
revert r273728 and parts of r306589, iicbus no-stop by default feature
Since drm2 removal, there has not been any consumer of the feature in the tree. I am also unaware of any out-of-tree consumer. More importantly, the feature has been broken from the very start, both before and after r306589, because the ivar was set on a device that does not support it and it was read from another device that also does not support it. A bus-wide no-stop flag cannot be implemented as an ivar as iicbus attaches as a child of various drivers. Implementing the ivar in each and every I2C driver is just impractical. If we ever want to implement this feature properly, then probably the easiest way to do it would be via a flag in the softc of iicbus. In fact, we might have to do that in the stable branches if we want to fix the code for them. Reported by: ian (long time ago) MFC after: 1 month (maybe) X-MFC-note: cannot just merge the change, must keep drm2 happy
Notes
Notes: svn path=/head/; revision=348355
-rw-r--r--sys/dev/iicbus/iicbus.c6
-rw-r--r--sys/dev/iicbus/iicbus.h5
-rw-r--r--sys/dev/iicbus/iiconf.c10
3 files changed, 5 insertions, 16 deletions
diff --git a/sys/dev/iicbus/iicbus.c b/sys/dev/iicbus/iicbus.c
index de30c0168901..0795b99dcd69 100644
--- a/sys/dev/iicbus/iicbus.c
+++ b/sys/dev/iicbus/iicbus.c
@@ -194,9 +194,6 @@ iicbus_read_ivar(device_t bus, device_t child, int which, uintptr_t *result)
case IICBUS_IVAR_ADDR:
*result = devi->addr;
break;
- case IICBUS_IVAR_NOSTOP:
- *result = devi->nostop;
- break;
}
return (0);
}
@@ -213,9 +210,6 @@ iicbus_write_ivar(device_t bus, device_t child, int which, uintptr_t value)
if (devi->addr != 0)
return (EINVAL);
devi->addr = value;
- case IICBUS_IVAR_NOSTOP:
- devi->nostop = value;
- break;
}
return (0);
}
diff --git a/sys/dev/iicbus/iicbus.h b/sys/dev/iicbus/iicbus.h
index 018b25113d22..ec033d708aaa 100644
--- a/sys/dev/iicbus/iicbus.h
+++ b/sys/dev/iicbus/iicbus.h
@@ -54,19 +54,16 @@ struct iicbus_ivar
{
uint32_t addr;
struct resource_list rl;
- bool nostop;
};
enum {
- IICBUS_IVAR_ADDR, /* Address or base address */
- IICBUS_IVAR_NOSTOP, /* nostop defaults */
+ IICBUS_IVAR_ADDR /* Address or base address */
};
#define IICBUS_ACCESSOR(A, B, T) \
__BUS_ACCESSOR(iicbus, A, IICBUS, B, T)
IICBUS_ACCESSOR(addr, ADDR, uint32_t)
-IICBUS_ACCESSOR(nostop, NOSTOP, bool)
#define IICBUS_LOCK(sc) mtx_lock(&(sc)->lock)
#define IICBUS_UNLOCK(sc) mtx_unlock(&(sc)->lock)
diff --git a/sys/dev/iicbus/iiconf.c b/sys/dev/iicbus/iiconf.c
index 916baf2dba0c..94ce3d18c70f 100644
--- a/sys/dev/iicbus/iiconf.c
+++ b/sys/dev/iicbus/iiconf.c
@@ -427,7 +427,7 @@ iicbus_transfer_gen(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
{
int i, error, lenread, lenwrote, nkid, rpstart, addr;
device_t *children, bus;
- bool nostop, started;
+ bool started;
if ((error = device_get_children(dev, &children, &nkid)) != 0)
return (IIC_ERESOURCE);
@@ -438,7 +438,6 @@ iicbus_transfer_gen(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
bus = children[0];
rpstart = 0;
free(children, M_TEMP);
- nostop = iicbus_get_nostop(dev);
started = false;
for (i = 0, error = 0; i < nmsgs && error == 0; i++) {
addr = msgs[i].slave;
@@ -466,12 +465,11 @@ iicbus_transfer_gen(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
if (error != 0)
break;
- if ((msgs[i].flags & IIC_M_NOSTOP) != 0 ||
- (nostop && i + 1 < nmsgs)) {
- rpstart = 1; /* Next message gets repeated start */
- } else {
+ if (!(msgs[i].flags & IIC_M_NOSTOP)) {
rpstart = 0;
iicbus_stop(bus);
+ } else {
+ rpstart = 1; /* Next message gets repeated start */
}
}
if (error != 0 && started)