n64cart.c (37772f9136f442a1098d0ae1238def72f1216057) n64cart.c (0d424780852eb60467a6f053d92495bb845ac186)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Support for the N64 cart.
4 *
5 * Copyright (c) 2021 Lauri Kasanen
6 */
7
8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

--- 102 unchanged lines hidden (view full) ---

111
112/*
113 * The target device is embedded and RAM-constrained. We save RAM
114 * by initializing in __init code that gets dropped late in boot.
115 * For the same reason there is no module or unloading support.
116 */
117static int __init n64cart_probe(struct platform_device *pdev)
118{
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Support for the N64 cart.
4 *
5 * Copyright (c) 2021 Lauri Kasanen
6 */
7
8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

--- 102 unchanged lines hidden (view full) ---

111
112/*
113 * The target device is embedded and RAM-constrained. We save RAM
114 * by initializing in __init code that gets dropped late in boot.
115 * For the same reason there is no module or unloading support.
116 */
117static int __init n64cart_probe(struct platform_device *pdev)
118{
119 int err;
120 struct gendisk *disk;
119 struct gendisk *disk;
121 struct request_queue *queue;
122
123 if (!start || !size) {
124 pr_err("start or size not specified\n");
125 return -ENODEV;
126 }
127
128 if (size & 4095) {
129 pr_err("size must be a multiple of 4K\n");
130 return -ENODEV;
131 }
132
120
121 if (!start || !size) {
122 pr_err("start or size not specified\n");
123 return -ENODEV;
124 }
125
126 if (size & 4095) {
127 pr_err("size must be a multiple of 4K\n");
128 return -ENODEV;
129 }
130
133 queue = blk_alloc_queue(NUMA_NO_NODE);
134 if (!queue)
135 return -ENOMEM;
136
137 reg_base = devm_platform_ioremap_resource(pdev, 0);
131 reg_base = devm_platform_ioremap_resource(pdev, 0);
138 if (!reg_base) {
139 err = -EINVAL;
140 goto fail_queue;
141 }
132 if (!reg_base)
133 return -EINVAL;
142
143 disk = alloc_disk(0);
134
135 disk = alloc_disk(0);
144 if (!disk) {
145 err = -ENOMEM;
146 goto fail_queue;
147 }
136 if (!disk)
137 return -ENOMEM;
148
138
139 disk->queue = blk_alloc_queue(NUMA_NO_NODE);
140 if (!disk->queue)
141 return -ENOMEM;
142
149 dev = &pdev->dev;
150
151 disk->first_minor = 0;
143 dev = &pdev->dev;
144
145 disk->first_minor = 0;
152 disk->queue = queue;
153 disk->flags = GENHD_FL_NO_PART_SCAN | GENHD_FL_EXT_DEVT;
154 disk->fops = &n64cart_fops;
155 strcpy(disk->disk_name, "n64cart");
156
157 set_capacity(disk, size >> SECTOR_SHIFT);
158 set_disk_ro(disk, 1);
159
146 disk->flags = GENHD_FL_NO_PART_SCAN | GENHD_FL_EXT_DEVT;
147 disk->fops = &n64cart_fops;
148 strcpy(disk->disk_name, "n64cart");
149
150 set_capacity(disk, size >> SECTOR_SHIFT);
151 set_disk_ro(disk, 1);
152
160 blk_queue_flag_set(QUEUE_FLAG_NONROT, queue);
161 blk_queue_physical_block_size(queue, 4096);
162 blk_queue_logical_block_size(queue, 4096);
153 blk_queue_flag_set(QUEUE_FLAG_NONROT, disk->queue);
154 blk_queue_physical_block_size(disk->queue, 4096);
155 blk_queue_logical_block_size(disk->queue, 4096);
163
164 add_disk(disk);
165
166 pr_info("n64cart: %u kb disk\n", size / 1024);
167
168 return 0;
156
157 add_disk(disk);
158
159 pr_info("n64cart: %u kb disk\n", size / 1024);
160
161 return 0;
169fail_queue:
170 blk_cleanup_queue(queue);
171
172 return err;
173}
174
175static struct platform_driver n64cart_driver = {
176 .driver = {
177 .name = "n64cart",
178 },
179};
180
181static int __init n64cart_init(void)
182{
183 return platform_driver_probe(&n64cart_driver, n64cart_probe);
184}
185
186module_init(n64cart_init);
187
188MODULE_AUTHOR("Lauri Kasanen <cand@gmx.com>");
189MODULE_DESCRIPTION("Driver for the N64 cart");
190MODULE_LICENSE("GPL");
162}
163
164static struct platform_driver n64cart_driver = {
165 .driver = {
166 .name = "n64cart",
167 },
168};
169
170static int __init n64cart_init(void)
171{
172 return platform_driver_probe(&n64cart_driver, n64cart_probe);
173}
174
175module_init(n64cart_init);
176
177MODULE_AUTHOR("Lauri Kasanen <cand@gmx.com>");
178MODULE_DESCRIPTION("Driver for the N64 cart");
179MODULE_LICENSE("GPL");