~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/mips/cavium-octeon/flash_setup.c

Version: ~ [ linux-5.5-rc7 ] ~ [ linux-5.4.13 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.97 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.166 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.210 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.210 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.81 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *   Octeon Bootbus flash setup
  3  *
  4  * This file is subject to the terms and conditions of the GNU General Public
  5  * License.  See the file "COPYING" in the main directory of this archive
  6  * for more details.
  7  *
  8  * Copyright (C) 2007, 2008 Cavium Networks
  9  */
 10 #include <linux/kernel.h>
 11 #include <linux/module.h>
 12 #include <linux/semaphore.h>
 13 #include <linux/mtd/mtd.h>
 14 #include <linux/mtd/map.h>
 15 #include <linux/of_platform.h>
 16 #include <linux/mtd/partitions.h>
 17 
 18 #include <asm/octeon/octeon.h>
 19 
 20 static struct map_info flash_map;
 21 static struct mtd_info *mymtd;
 22 static const char *part_probe_types[] = {
 23         "cmdlinepart",
 24 #ifdef CONFIG_MTD_REDBOOT_PARTS
 25         "RedBoot",
 26 #endif
 27         NULL
 28 };
 29 
 30 static map_word octeon_flash_map_read(struct map_info *map, unsigned long ofs)
 31 {
 32         map_word r;
 33 
 34         down(&octeon_bootbus_sem);
 35         r = inline_map_read(map, ofs);
 36         up(&octeon_bootbus_sem);
 37 
 38         return r;
 39 }
 40 
 41 static void octeon_flash_map_write(struct map_info *map, const map_word datum,
 42                                    unsigned long ofs)
 43 {
 44         down(&octeon_bootbus_sem);
 45         inline_map_write(map, datum, ofs);
 46         up(&octeon_bootbus_sem);
 47 }
 48 
 49 static void octeon_flash_map_copy_from(struct map_info *map, void *to,
 50                                        unsigned long from, ssize_t len)
 51 {
 52         down(&octeon_bootbus_sem);
 53         inline_map_copy_from(map, to, from, len);
 54         up(&octeon_bootbus_sem);
 55 }
 56 
 57 static void octeon_flash_map_copy_to(struct map_info *map, unsigned long to,
 58                                      const void *from, ssize_t len)
 59 {
 60         down(&octeon_bootbus_sem);
 61         inline_map_copy_to(map, to, from, len);
 62         up(&octeon_bootbus_sem);
 63 }
 64 
 65 /**
 66  * Module/ driver initialization.
 67  *
 68  * Returns Zero on success
 69  */
 70 static int octeon_flash_probe(struct platform_device *pdev)
 71 {
 72         union cvmx_mio_boot_reg_cfgx region_cfg;
 73         u32 cs;
 74         int r;
 75         struct device_node *np = pdev->dev.of_node;
 76 
 77         r = of_property_read_u32(np, "reg", &cs);
 78         if (r)
 79                 return r;
 80 
 81         /*
 82          * Read the bootbus region 0 setup to determine the base
 83          * address of the flash.
 84          */
 85         region_cfg.u64 = cvmx_read_csr(CVMX_MIO_BOOT_REG_CFGX(cs));
 86         if (region_cfg.s.en) {
 87                 /*
 88                  * The bootloader always takes the flash and sets its
 89                  * address so the entire flash fits below
 90                  * 0x1fc00000. This way the flash aliases to
 91                  * 0x1fc00000 for booting. Software can access the
 92                  * full flash at the true address, while core boot can
 93                  * access 4MB.
 94                  */
 95                 /* Use this name so old part lines work */
 96                 flash_map.name = "phys_mapped_flash";
 97                 flash_map.phys = region_cfg.s.base << 16;
 98                 flash_map.size = 0x1fc00000 - flash_map.phys;
 99                 /* 8-bit bus (0 + 1) or 16-bit bus (1 + 1) */
100                 flash_map.bankwidth = region_cfg.s.width + 1;
101                 flash_map.virt = ioremap(flash_map.phys, flash_map.size);
102                 pr_notice("Bootbus flash: Setting flash for %luMB flash at "
103                           "0x%08llx\n", flash_map.size >> 20, flash_map.phys);
104                 WARN_ON(!map_bankwidth_supported(flash_map.bankwidth));
105                 flash_map.read = octeon_flash_map_read;
106                 flash_map.write = octeon_flash_map_write;
107                 flash_map.copy_from = octeon_flash_map_copy_from;
108                 flash_map.copy_to = octeon_flash_map_copy_to;
109                 mymtd = do_map_probe("cfi_probe", &flash_map);
110                 if (mymtd) {
111                         mymtd->owner = THIS_MODULE;
112                         mtd_device_parse_register(mymtd, part_probe_types,
113                                                   NULL, NULL, 0);
114                 } else {
115                         pr_err("Failed to register MTD device for flash\n");
116                 }
117         }
118         return 0;
119 }
120 
121 static const struct of_device_id of_flash_match[] = {
122         {
123                 .compatible     = "cfi-flash",
124         },
125         { },
126 };
127 MODULE_DEVICE_TABLE(of, of_flash_match);
128 
129 static struct platform_driver of_flash_driver = {
130         .driver = {
131                 .name = "octeon-of-flash",
132                 .of_match_table = of_flash_match,
133         },
134         .probe          = octeon_flash_probe,
135 };
136 
137 static int octeon_flash_init(void)
138 {
139         return platform_driver_register(&of_flash_driver);
140 }
141 late_initcall(octeon_flash_init);
142 
143 MODULE_LICENSE("GPL");
144 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp