summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2008-06-06 09:25:13 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2008-06-06 09:30:48 +0200
commitee6d36a5405305f3bbdb0457948c219731b3d9cc (patch)
tree0a328bd96f2cf2f190372b654515e509c694930a /common
parent3f73e61600f8fce0b6fa02e9a82124c1c89937c7 (diff)
downloadbarebox-ee6d36a5405305f3bbdb0457948c219731b3d9cc.tar.gz
barebox-ee6d36a5405305f3bbdb0457948c219731b3d9cc.tar.xz
- introduce ioctl call
- pass open/close/lseek through to drivers
Diffstat (limited to 'common')
-rw-r--r--common/partition.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/common/partition.c b/common/partition.c
index 4942ffdf55..4721bc1c13 100644
--- a/common/partition.c
+++ b/common/partition.c
@@ -32,6 +32,9 @@
#include <errno.h>
#include <partition.h>
#include <xfuncs.h>
+#include <ioctl.h>
+#include <nand.h>
+#include <linux/mtd/mtd-abi.h>
/**
* Add one partition on top of a device, as a device.
@@ -168,6 +171,43 @@ static ssize_t part_write(struct device_d *dev, const void *buf, size_t count,
return dev_write(part->physdev, buf, count, offset + part->offset, flags);
}
+static off_t part_lseek(struct device_d *dev, off_t ofs)
+{
+ struct partition *part = dev->type_data;
+
+ return dev_lseek(part->physdev, ofs);
+}
+
+static int part_open(struct device_d *dev, struct filep *f)
+{
+ struct partition *part = dev->type_data;
+
+ return dev_open(part->physdev, f);
+}
+
+static int part_close(struct device_d *dev, struct filep *f)
+{
+ struct partition *part = dev->type_data;
+
+ return dev_close(part->physdev, f);
+}
+
+static int part_ioctl(struct device_d *dev, int request,
+ void *buf)
+{
+ struct partition *part = dev->type_data;
+ off_t offset;
+
+ switch (request) {
+ case MEMGETBADBLOCK:
+ offset = (off_t)buf;
+ offset += part->offset;
+ return dev_ioctl(part->physdev, request, (void *)offset);
+ }
+
+ return -ENOSYS;
+}
+
/**
* FIXME.
* @param[in] dev The partition info as a device
@@ -201,8 +241,12 @@ struct driver_d part_driver = {
.name = "partition",
.probe = part_probe,
.remove = part_remove,
+ .open = part_open,
+ .close = part_close,
+ .ioctl = part_ioctl,
.read = part_read,
.write = part_write,
+ .lseek = part_lseek,
.erase = part_erase,
.protect= part_protect,
.memmap = part_memmap,