MIPS: TXx9: Add SRAMC support
authorAtsushi Nemoto <anemo@mba.ocn.ne.jp>
Mon, 25 May 2009 13:04:02 +0000 (22:04 +0900)
committerRalf Baechle <ralf@linux-mips.org>
Wed, 17 Jun 2009 10:06:27 +0000 (11:06 +0100)
Add a sysdev to access SRAM in TXx9 SoCs via sysfs.

Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/txx9/generic.h
arch/mips/include/asm/txx9/tx4938.h
arch/mips/include/asm/txx9/tx4939.h
arch/mips/txx9/generic/setup.c
arch/mips/txx9/generic/setup_tx4938.c
arch/mips/txx9/generic/setup_tx4939.c
arch/mips/txx9/rbtx4938/setup.c
arch/mips/txx9/rbtx4939/setup.c

index 8169477d14754b13c48863c130534c6865e3a11d..827dc22be2ea0f9c343540cde1eb71edf231ddf6 100644 (file)
@@ -95,5 +95,6 @@ void __init txx9_aclc_init(unsigned long baseaddr, int irq,
                           unsigned int dmac_id,
                           unsigned int dma_chan_out,
                           unsigned int dma_chan_in);
+void __init txx9_sramc_init(struct resource *r);
 
 #endif /* __ASM_TXX9_GENERIC_H */
index 54e467410a0257385b5352a20abc70803b8fafaf..8a178f186f7d0d0e56951ec9b6e1a70493f83056 100644 (file)
@@ -307,5 +307,6 @@ struct tx4938ide_platform_info {
 void tx4938_ata_init(unsigned int irq, unsigned int shift, int tune);
 void tx4938_dmac_init(int memcpy_chan0, int memcpy_chan1);
 void tx4938_aclc_init(void);
+void tx4938_sramc_init(void);
 
 #endif
index f13b708de617c7abec9341c07b4e5cc936d5369c..050364d50b7910abf274fe877df7eaa15c29fc4d 100644 (file)
@@ -546,5 +546,6 @@ void tx4939_ndfmc_init(unsigned int hold, unsigned int spw,
                       unsigned char ch_mask, unsigned char wide_mask);
 void tx4939_dmac_init(int memcpy_chan0, int memcpy_chan1);
 void tx4939_aclc_init(void);
+void tx4939_sramc_init(void);
 
 #endif /* __ASM_TXX9_TX4939_H */
index 7f9101257615f7fbc457cc02d30abba50cde2c1a..3b7d77d61ce06f0ee0ccae573f31bef1e555267b 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/serial_core.h>
 #include <linux/mtd/physmap.h>
 #include <linux/leds.h>
+#include <linux/sysdev.h>
 #include <asm/bootinfo.h>
 #include <asm/time.h>
 #include <asm/reboot.h>
@@ -912,3 +913,86 @@ void __init txx9_aclc_init(unsigned long baseaddr, int irq,
                platform_device_put(pdev);
 #endif
 }
+
+static struct sysdev_class txx9_sramc_sysdev_class;
+
+struct txx9_sramc_sysdev {
+       struct sys_device dev;
+       struct bin_attribute bindata_attr;
+       void __iomem *base;
+};
+
+static ssize_t txx9_sram_read(struct kobject *kobj,
+                             struct bin_attribute *bin_attr,
+                             char *buf, loff_t pos, size_t size)
+{
+       struct txx9_sramc_sysdev *dev = bin_attr->private;
+       size_t ramsize = bin_attr->size;
+
+       if (pos >= ramsize)
+               return 0;
+       if (pos + size > ramsize)
+               size = ramsize - pos;
+       memcpy_fromio(buf, dev->base + pos, size);
+       return size;
+}
+
+static ssize_t txx9_sram_write(struct kobject *kobj,
+                              struct bin_attribute *bin_attr,
+                              char *buf, loff_t pos, size_t size)
+{
+       struct txx9_sramc_sysdev *dev = bin_attr->private;
+       size_t ramsize = bin_attr->size;
+
+       if (pos >= ramsize)
+               return 0;
+       if (pos + size > ramsize)
+               size = ramsize - pos;
+       memcpy_toio(dev->base + pos, buf, size);
+       return size;
+}
+
+void __init txx9_sramc_init(struct resource *r)
+{
+       struct txx9_sramc_sysdev *dev;
+       size_t size;
+       int err;
+
+       if (!txx9_sramc_sysdev_class.name) {
+               txx9_sramc_sysdev_class.name = "txx9_sram";
+               err = sysdev_class_register(&txx9_sramc_sysdev_class);
+               if (err) {
+                       txx9_sramc_sysdev_class.name = NULL;
+                       return;
+               }
+       }
+       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+       if (!dev)
+               return;
+       size = resource_size(r);
+       dev->base = ioremap(r->start, size);
+       if (!dev->base)
+               goto exit;
+       dev->dev.cls = &txx9_sramc_sysdev_class;
+       dev->bindata_attr.attr.name = "bindata";
+       dev->bindata_attr.attr.mode = S_IRUSR | S_IWUSR;
+       dev->bindata_attr.read = txx9_sram_read;
+       dev->bindata_attr.write = txx9_sram_write;
+       dev->bindata_attr.size = size;
+       dev->bindata_attr.private = dev;
+       err = sysdev_register(&dev->dev);
+       if (err)
+               goto exit;
+       err = sysfs_create_bin_file(&dev->dev.kobj, &dev->bindata_attr);
+       if (err) {
+               sysdev_unregister(&dev->dev);
+               goto exit;
+       }
+       return;
+exit:
+       if (dev) {
+               if (dev->base)
+                       iounmap(dev->base);
+               kfree(dev);
+       }
+}
index 4dfdb52e86655686a59e0b58e96dacf1086a8343..eb20801102396283aebb1b618e336b95ff3d94f8 100644 (file)
@@ -425,6 +425,12 @@ void __init tx4938_aclc_init(void)
                               1, 0, 1);
 }
 
+void __init tx4938_sramc_init(void)
+{
+       if (tx4938_sram_resource.start)
+               txx9_sramc_init(&tx4938_sram_resource);
+}
+
 static void __init tx4938_stop_unused_modules(void)
 {
        __u64 pcfg, rst = 0, ckd = 0;
index 71396863f54e0f6cd75e4c28ac02f498ae6f6782..df13a891fb4b790d324da39f96050707ad184a69 100644 (file)
@@ -494,6 +494,12 @@ void __init tx4939_aclc_init(void)
                               TXX9_IRQ_BASE + TX4939_IR_ACLC, 1, 0, 1);
 }
 
+void __init tx4939_sramc_init(void)
+{
+       if (tx4939_sram_resource.start)
+               txx9_sramc_init(&tx4939_sram_resource);
+}
+
 static void __init tx4939_stop_unused_modules(void)
 {
        __u64 pcfg, rst = 0, ckd = 0;
index 8da66e956ee621896f555f7e3d37005b387a1a64..d66509b1428460653e5334a4f2de4cdce3eede73 100644 (file)
@@ -358,6 +358,7 @@ static void __init rbtx4938_device_init(void)
        tx4938_dmac_init(0, 2);
        tx4938_aclc_init();
        platform_device_register_simple("txx9aclc-generic", -1, NULL, 0);
+       tx4938_sramc_init();
        txx9_iocled_init(RBTX4938_LED_ADDR - IO_BASE, -1, 8, 1, "green", NULL);
 }
 
index d5ad5abb80dafc37bf24759d2409fd13b3336ade..b9196966447bca96247e89c377f4c54c5ddbad7a 100644 (file)
@@ -501,6 +501,7 @@ static void __init rbtx4939_device_init(void)
        tx4939_dmac_init(0, 2);
        tx4939_aclc_init();
        platform_device_register_simple("txx9aclc-generic", -1, NULL, 0);
+       tx4939_sramc_init();
 }
 
 static void __init rbtx4939_setup(void)