linux/drivers/fpga/fpga-mgr.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * FPGA Manager Core
   4 *
   5 *  Copyright (C) 2013-2015 Altera Corporation
   6 *  Copyright (C) 2017 Intel Corporation
   7 *
   8 * With code from the mailing list:
   9 * Copyright (C) 2013 Xilinx, Inc.
  10 */
  11#include <linux/firmware.h>
  12#include <linux/fpga/fpga-mgr.h>
  13#include <linux/idr.h>
  14#include <linux/module.h>
  15#include <linux/of.h>
  16#include <linux/mutex.h>
  17#include <linux/slab.h>
  18#include <linux/scatterlist.h>
  19#include <linux/highmem.h>
  20
  21static DEFINE_IDA(fpga_mgr_ida);
  22static struct class *fpga_mgr_class;
  23
  24/**
  25 * fpga_image_info_alloc - Allocate a FPGA image info struct
  26 * @dev: owning device
  27 *
  28 * Return: struct fpga_image_info or NULL
  29 */
  30struct fpga_image_info *fpga_image_info_alloc(struct device *dev)
  31{
  32        struct fpga_image_info *info;
  33
  34        get_device(dev);
  35
  36        info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
  37        if (!info) {
  38                put_device(dev);
  39                return NULL;
  40        }
  41
  42        info->dev = dev;
  43
  44        return info;
  45}
  46EXPORT_SYMBOL_GPL(fpga_image_info_alloc);
  47
  48/**
  49 * fpga_image_info_free - Free a FPGA image info struct
  50 * @info: FPGA image info struct to free
  51 */
  52void fpga_image_info_free(struct fpga_image_info *info)
  53{
  54        struct device *dev;
  55
  56        if (!info)
  57                return;
  58
  59        dev = info->dev;
  60        if (info->firmware_name)
  61                devm_kfree(dev, info->firmware_name);
  62
  63        devm_kfree(dev, info);
  64        put_device(dev);
  65}
  66EXPORT_SYMBOL_GPL(fpga_image_info_free);
  67
  68/*
  69 * Call the low level driver's write_init function.  This will do the
  70 * device-specific things to get the FPGA into the state where it is ready to
  71 * receive an FPGA image. The low level driver only gets to see the first
  72 * initial_header_size bytes in the buffer.
  73 */
  74static int fpga_mgr_write_init_buf(struct fpga_manager *mgr,
  75                                   struct fpga_image_info *info,
  76                                   const char *buf, size_t count)
  77{
  78        int ret;
  79
  80        mgr->state = FPGA_MGR_STATE_WRITE_INIT;
  81        if (!mgr->mops->initial_header_size)
  82                ret = mgr->mops->write_init(mgr, info, NULL, 0);
  83        else
  84                ret = mgr->mops->write_init(
  85                    mgr, info, buf, min(mgr->mops->initial_header_size, count));
  86
  87        if (ret) {
  88                dev_err(&mgr->dev, "Error preparing FPGA for writing\n");
  89                mgr->state = FPGA_MGR_STATE_WRITE_INIT_ERR;
  90                return ret;
  91        }
  92
  93        return 0;
  94}
  95
  96static int fpga_mgr_write_init_sg(struct fpga_manager *mgr,
  97                                  struct fpga_image_info *info,
  98                                  struct sg_table *sgt)
  99{
 100        struct sg_mapping_iter miter;
 101        size_t len;
 102        char *buf;
 103        int ret;
 104
 105        if (!mgr->mops->initial_header_size)
 106                return fpga_mgr_write_init_buf(mgr, info, NULL, 0);
 107
 108        /*
 109         * First try to use miter to map the first fragment to access the
 110         * header, this is the typical path.
 111         */
 112        sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG);
 113        if (sg_miter_next(&miter) &&
 114            miter.length >= mgr->mops->initial_header_size) {
 115                ret = fpga_mgr_write_init_buf(mgr, info, miter.addr,
 116                                              miter.length);
 117                sg_miter_stop(&miter);
 118                return ret;
 119        }
 120        sg_miter_stop(&miter);
 121
 122        /* Otherwise copy the fragments into temporary memory. */
 123        buf = kmalloc(mgr->mops->initial_header_size, GFP_KERNEL);
 124        if (!buf)
 125                return -ENOMEM;
 126
 127        len = sg_copy_to_buffer(sgt->sgl, sgt->nents, buf,
 128                                mgr->mops->initial_header_size);
 129        ret = fpga_mgr_write_init_buf(mgr, info, buf, len);
 130
 131        kfree(buf);
 132
 133        return ret;
 134}
 135
 136/*
 137 * After all the FPGA image has been written, do the device specific steps to
 138 * finish and set the FPGA into operating mode.
 139 */
 140static int fpga_mgr_write_complete(struct fpga_manager *mgr,
 141                                   struct fpga_image_info *info)
 142{
 143        int ret;
 144
 145        mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE;
 146        ret = mgr->mops->write_complete(mgr, info);
 147        if (ret) {
 148                dev_err(&mgr->dev, "Error after writing image data to FPGA\n");
 149                mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE_ERR;
 150                return ret;
 151        }
 152        mgr->state = FPGA_MGR_STATE_OPERATING;
 153
 154        return 0;
 155}
 156
 157/**
 158 * fpga_mgr_buf_load_sg - load fpga from image in buffer from a scatter list
 159 * @mgr:        fpga manager
 160 * @info:       fpga image specific information
 161 * @sgt:        scatterlist table
 162 *
 163 * Step the low level fpga manager through the device-specific steps of getting
 164 * an FPGA ready to be configured, writing the image to it, then doing whatever
 165 * post-configuration steps necessary.  This code assumes the caller got the
 166 * mgr pointer from of_fpga_mgr_get() or fpga_mgr_get() and checked that it is
 167 * not an error code.
 168 *
 169 * This is the preferred entry point for FPGA programming, it does not require
 170 * any contiguous kernel memory.
 171 *
 172 * Return: 0 on success, negative error code otherwise.
 173 */
 174static int fpga_mgr_buf_load_sg(struct fpga_manager *mgr,
 175                                struct fpga_image_info *info,
 176                                struct sg_table *sgt)
 177{
 178        int ret;
 179
 180        ret = fpga_mgr_write_init_sg(mgr, info, sgt);
 181        if (ret)
 182                return ret;
 183
 184        /* Write the FPGA image to the FPGA. */
 185        mgr->state = FPGA_MGR_STATE_WRITE;
 186        if (mgr->mops->write_sg) {
 187                ret = mgr->mops->write_sg(mgr, sgt);
 188        } else {
 189                struct sg_mapping_iter miter;
 190
 191                sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG);
 192                while (sg_miter_next(&miter)) {
 193                        ret = mgr->mops->write(mgr, miter.addr, miter.length);
 194                        if (ret)
 195                                break;
 196                }
 197                sg_miter_stop(&miter);
 198        }
 199
 200        if (ret) {
 201                dev_err(&mgr->dev, "Error while writing image data to FPGA\n");
 202                mgr->state = FPGA_MGR_STATE_WRITE_ERR;
 203                return ret;
 204        }
 205
 206        return fpga_mgr_write_complete(mgr, info);
 207}
 208
 209static int fpga_mgr_buf_load_mapped(struct fpga_manager *mgr,
 210                                    struct fpga_image_info *info,
 211                                    const char *buf, size_t count)
 212{
 213        int ret;
 214
 215        ret = fpga_mgr_write_init_buf(mgr, info, buf, count);
 216        if (ret)
 217                return ret;
 218
 219        /*
 220         * Write the FPGA image to the FPGA.
 221         */
 222        mgr->state = FPGA_MGR_STATE_WRITE;
 223        ret = mgr->mops->write(mgr, buf, count);
 224        if (ret) {
 225                dev_err(&mgr->dev, "Error while writing image data to FPGA\n");
 226                mgr->state = FPGA_MGR_STATE_WRITE_ERR;
 227                return ret;
 228        }
 229
 230        return fpga_mgr_write_complete(mgr, info);
 231}
 232
 233/**
 234 * fpga_mgr_buf_load - load fpga from image in buffer
 235 * @mgr:        fpga manager
 236 * @info:       fpga image info
 237 * @buf:        buffer contain fpga image
 238 * @count:      byte count of buf
 239 *
 240 * Step the low level fpga manager through the device-specific steps of getting
 241 * an FPGA ready to be configured, writing the image to it, then doing whatever
 242 * post-configuration steps necessary.  This code assumes the caller got the
 243 * mgr pointer from of_fpga_mgr_get() and checked that it is not an error code.
 244 *
 245 * Return: 0 on success, negative error code otherwise.
 246 */
 247static int fpga_mgr_buf_load(struct fpga_manager *mgr,
 248                             struct fpga_image_info *info,
 249                             const char *buf, size_t count)
 250{
 251        struct page **pages;
 252        struct sg_table sgt;
 253        const void *p;
 254        int nr_pages;
 255        int index;
 256        int rc;
 257
 258        /*
 259         * This is just a fast path if the caller has already created a
 260         * contiguous kernel buffer and the driver doesn't require SG, non-SG
 261         * drivers will still work on the slow path.
 262         */
 263        if (mgr->mops->write)
 264                return fpga_mgr_buf_load_mapped(mgr, info, buf, count);
 265
 266        /*
 267         * Convert the linear kernel pointer into a sg_table of pages for use
 268         * by the driver.
 269         */
 270        nr_pages = DIV_ROUND_UP((unsigned long)buf + count, PAGE_SIZE) -
 271                   (unsigned long)buf / PAGE_SIZE;
 272        pages = kmalloc_array(nr_pages, sizeof(struct page *), GFP_KERNEL);
 273        if (!pages)
 274                return -ENOMEM;
 275
 276        p = buf - offset_in_page(buf);
 277        for (index = 0; index < nr_pages; index++) {
 278                if (is_vmalloc_addr(p))
 279                        pages[index] = vmalloc_to_page(p);
 280                else
 281                        pages[index] = kmap_to_page((void *)p);
 282                if (!pages[index]) {
 283                        kfree(pages);
 284                        return -EFAULT;
 285                }
 286                p += PAGE_SIZE;
 287        }
 288
 289        /*
 290         * The temporary pages list is used to code share the merging algorithm
 291         * in sg_alloc_table_from_pages
 292         */
 293        rc = sg_alloc_table_from_pages(&sgt, pages, index, offset_in_page(buf),
 294                                       count, GFP_KERNEL);
 295        kfree(pages);
 296        if (rc)
 297                return rc;
 298
 299        rc = fpga_mgr_buf_load_sg(mgr, info, &sgt);
 300        sg_free_table(&sgt);
 301
 302        return rc;
 303}
 304
 305/**
 306 * fpga_mgr_firmware_load - request firmware and load to fpga
 307 * @mgr:        fpga manager
 308 * @info:       fpga image specific information
 309 * @image_name: name of image file on the firmware search path
 310 *
 311 * Request an FPGA image using the firmware class, then write out to the FPGA.
 312 * Update the state before each step to provide info on what step failed if
 313 * there is a failure.  This code assumes the caller got the mgr pointer
 314 * from of_fpga_mgr_get() or fpga_mgr_get() and checked that it is not an error
 315 * code.
 316 *
 317 * Return: 0 on success, negative error code otherwise.
 318 */
 319static int fpga_mgr_firmware_load(struct fpga_manager *mgr,
 320                                  struct fpga_image_info *info,
 321                                  const char *image_name)
 322{
 323        struct device *dev = &mgr->dev;
 324        const struct firmware *fw;
 325        int ret;
 326
 327        dev_info(dev, "writing %s to %s\n", image_name, mgr->name);
 328
 329        mgr->state = FPGA_MGR_STATE_FIRMWARE_REQ;
 330
 331        ret = request_firmware(&fw, image_name, dev);
 332        if (ret) {
 333                mgr->state = FPGA_MGR_STATE_FIRMWARE_REQ_ERR;
 334                dev_err(dev, "Error requesting firmware %s\n", image_name);
 335                return ret;
 336        }
 337
 338        ret = fpga_mgr_buf_load(mgr, info, fw->data, fw->size);
 339
 340        release_firmware(fw);
 341
 342        return ret;
 343}
 344
 345/**
 346 * fpga_mgr_load - load FPGA from scatter/gather table, buffer, or firmware
 347 * @mgr:        fpga manager
 348 * @info:       fpga image information.
 349 *
 350 * Load the FPGA from an image which is indicated in @info.  If successful, the
 351 * FPGA ends up in operating mode.
 352 *
 353 * Return: 0 on success, negative error code otherwise.
 354 */
 355int fpga_mgr_load(struct fpga_manager *mgr, struct fpga_image_info *info)
 356{
 357        if (info->sgt)
 358                return fpga_mgr_buf_load_sg(mgr, info, info->sgt);
 359        if (info->buf && info->count)
 360                return fpga_mgr_buf_load(mgr, info, info->buf, info->count);
 361        if (info->firmware_name)
 362                return fpga_mgr_firmware_load(mgr, info, info->firmware_name);
 363        return -EINVAL;
 364}
 365EXPORT_SYMBOL_GPL(fpga_mgr_load);
 366
 367static const char * const state_str[] = {
 368        [FPGA_MGR_STATE_UNKNOWN] =              "unknown",
 369        [FPGA_MGR_STATE_POWER_OFF] =            "power off",
 370        [FPGA_MGR_STATE_POWER_UP] =             "power up",
 371        [FPGA_MGR_STATE_RESET] =                "reset",
 372
 373        /* requesting FPGA image from firmware */
 374        [FPGA_MGR_STATE_FIRMWARE_REQ] =         "firmware request",
 375        [FPGA_MGR_STATE_FIRMWARE_REQ_ERR] =     "firmware request error",
 376
 377        /* Preparing FPGA to receive image */
 378        [FPGA_MGR_STATE_WRITE_INIT] =           "write init",
 379        [FPGA_MGR_STATE_WRITE_INIT_ERR] =       "write init error",
 380
 381        /* Writing image to FPGA */
 382        [FPGA_MGR_STATE_WRITE] =                "write",
 383        [FPGA_MGR_STATE_WRITE_ERR] =            "write error",
 384
 385        /* Finishing configuration after image has been written */
 386        [FPGA_MGR_STATE_WRITE_COMPLETE] =       "write complete",
 387        [FPGA_MGR_STATE_WRITE_COMPLETE_ERR] =   "write complete error",
 388
 389        /* FPGA reports to be in normal operating mode */
 390        [FPGA_MGR_STATE_OPERATING] =            "operating",
 391};
 392
 393static ssize_t name_show(struct device *dev,
 394                         struct device_attribute *attr, char *buf)
 395{
 396        struct fpga_manager *mgr = to_fpga_manager(dev);
 397
 398        return sprintf(buf, "%s\n", mgr->name);
 399}
 400
 401static ssize_t state_show(struct device *dev,
 402                          struct device_attribute *attr, char *buf)
 403{
 404        struct fpga_manager *mgr = to_fpga_manager(dev);
 405
 406        return sprintf(buf, "%s\n", state_str[mgr->state]);
 407}
 408
 409static ssize_t status_show(struct device *dev,
 410                           struct device_attribute *attr, char *buf)
 411{
 412        struct fpga_manager *mgr = to_fpga_manager(dev);
 413        u64 status;
 414        int len = 0;
 415
 416        if (!mgr->mops->status)
 417                return -ENOENT;
 418
 419        status = mgr->mops->status(mgr);
 420
 421        if (status & FPGA_MGR_STATUS_OPERATION_ERR)
 422                len += sprintf(buf + len, "reconfig operation error\n");
 423        if (status & FPGA_MGR_STATUS_CRC_ERR)
 424                len += sprintf(buf + len, "reconfig CRC error\n");
 425        if (status & FPGA_MGR_STATUS_INCOMPATIBLE_IMAGE_ERR)
 426                len += sprintf(buf + len, "reconfig incompatible image\n");
 427        if (status & FPGA_MGR_STATUS_IP_PROTOCOL_ERR)
 428                len += sprintf(buf + len, "reconfig IP protocol error\n");
 429        if (status & FPGA_MGR_STATUS_FIFO_OVERFLOW_ERR)
 430                len += sprintf(buf + len, "reconfig fifo overflow error\n");
 431
 432        return len;
 433}
 434
 435static DEVICE_ATTR_RO(name);
 436static DEVICE_ATTR_RO(state);
 437static DEVICE_ATTR_RO(status);
 438
 439static struct attribute *fpga_mgr_attrs[] = {
 440        &dev_attr_name.attr,
 441        &dev_attr_state.attr,
 442        &dev_attr_status.attr,
 443        NULL,
 444};
 445ATTRIBUTE_GROUPS(fpga_mgr);
 446
 447static struct fpga_manager *__fpga_mgr_get(struct device *dev)
 448{
 449        struct fpga_manager *mgr;
 450
 451        mgr = to_fpga_manager(dev);
 452
 453        if (!try_module_get(dev->parent->driver->owner))
 454                goto err_dev;
 455
 456        return mgr;
 457
 458err_dev:
 459        put_device(dev);
 460        return ERR_PTR(-ENODEV);
 461}
 462
 463static int fpga_mgr_dev_match(struct device *dev, const void *data)
 464{
 465        return dev->parent == data;
 466}
 467
 468/**
 469 * fpga_mgr_get - Given a device, get a reference to a fpga mgr.
 470 * @dev:        parent device that fpga mgr was registered with
 471 *
 472 * Return: fpga manager struct or IS_ERR() condition containing error code.
 473 */
 474struct fpga_manager *fpga_mgr_get(struct device *dev)
 475{
 476        struct device *mgr_dev = class_find_device(fpga_mgr_class, NULL, dev,
 477                                                   fpga_mgr_dev_match);
 478        if (!mgr_dev)
 479                return ERR_PTR(-ENODEV);
 480
 481        return __fpga_mgr_get(mgr_dev);
 482}
 483EXPORT_SYMBOL_GPL(fpga_mgr_get);
 484
 485static int fpga_mgr_of_node_match(struct device *dev, const void *data)
 486{
 487        return dev->of_node == data;
 488}
 489
 490/**
 491 * of_fpga_mgr_get - Given a device node, get a reference to a fpga mgr.
 492 *
 493 * @node:       device node
 494 *
 495 * Return: fpga manager struct or IS_ERR() condition containing error code.
 496 */
 497struct fpga_manager *of_fpga_mgr_get(struct device_node *node)
 498{
 499        struct device *dev;
 500
 501        dev = class_find_device(fpga_mgr_class, NULL, node,
 502                                fpga_mgr_of_node_match);
 503        if (!dev)
 504                return ERR_PTR(-ENODEV);
 505
 506        return __fpga_mgr_get(dev);
 507}
 508EXPORT_SYMBOL_GPL(of_fpga_mgr_get);
 509
 510/**
 511 * fpga_mgr_put - release a reference to a fpga manager
 512 * @mgr:        fpga manager structure
 513 */
 514void fpga_mgr_put(struct fpga_manager *mgr)
 515{
 516        module_put(mgr->dev.parent->driver->owner);
 517        put_device(&mgr->dev);
 518}
 519EXPORT_SYMBOL_GPL(fpga_mgr_put);
 520
 521/**
 522 * fpga_mgr_lock - Lock FPGA manager for exclusive use
 523 * @mgr:        fpga manager
 524 *
 525 * Given a pointer to FPGA Manager (from fpga_mgr_get() or
 526 * of_fpga_mgr_put()) attempt to get the mutex. The user should call
 527 * fpga_mgr_lock() and verify that it returns 0 before attempting to
 528 * program the FPGA.  Likewise, the user should call fpga_mgr_unlock
 529 * when done programming the FPGA.
 530 *
 531 * Return: 0 for success or -EBUSY
 532 */
 533int fpga_mgr_lock(struct fpga_manager *mgr)
 534{
 535        if (!mutex_trylock(&mgr->ref_mutex)) {
 536                dev_err(&mgr->dev, "FPGA manager is in use.\n");
 537                return -EBUSY;
 538        }
 539
 540        return 0;
 541}
 542EXPORT_SYMBOL_GPL(fpga_mgr_lock);
 543
 544/**
 545 * fpga_mgr_unlock - Unlock FPGA manager after done programming
 546 * @mgr:        fpga manager
 547 */
 548void fpga_mgr_unlock(struct fpga_manager *mgr)
 549{
 550        mutex_unlock(&mgr->ref_mutex);
 551}
 552EXPORT_SYMBOL_GPL(fpga_mgr_unlock);
 553
 554/**
 555 * fpga_mgr_create - create and initialize a FPGA manager struct
 556 * @dev:        fpga manager device from pdev
 557 * @name:       fpga manager name
 558 * @mops:       pointer to structure of fpga manager ops
 559 * @priv:       fpga manager private data
 560 *
 561 * The caller of this function is responsible for freeing the struct with
 562 * fpga_mgr_free().  Using devm_fpga_mgr_create() instead is recommended.
 563 *
 564 * Return: pointer to struct fpga_manager or NULL
 565 */
 566struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name,
 567                                     const struct fpga_manager_ops *mops,
 568                                     void *priv)
 569{
 570        struct fpga_manager *mgr;
 571        int id, ret;
 572
 573        if (!mops || !mops->write_complete || !mops->state ||
 574            !mops->write_init || (!mops->write && !mops->write_sg) ||
 575            (mops->write && mops->write_sg)) {
 576                dev_err(dev, "Attempt to register without fpga_manager_ops\n");
 577                return NULL;
 578        }
 579
 580        if (!name || !strlen(name)) {
 581                dev_err(dev, "Attempt to register with no name!\n");
 582                return NULL;
 583        }
 584
 585        mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
 586        if (!mgr)
 587                return NULL;
 588
 589        id = ida_simple_get(&fpga_mgr_ida, 0, 0, GFP_KERNEL);
 590        if (id < 0) {
 591                ret = id;
 592                goto error_kfree;
 593        }
 594
 595        mutex_init(&mgr->ref_mutex);
 596
 597        mgr->name = name;
 598        mgr->mops = mops;
 599        mgr->priv = priv;
 600
 601        device_initialize(&mgr->dev);
 602        mgr->dev.class = fpga_mgr_class;
 603        mgr->dev.groups = mops->groups;
 604        mgr->dev.parent = dev;
 605        mgr->dev.of_node = dev->of_node;
 606        mgr->dev.id = id;
 607
 608        ret = dev_set_name(&mgr->dev, "fpga%d", id);
 609        if (ret)
 610                goto error_device;
 611
 612        return mgr;
 613
 614error_device:
 615        ida_simple_remove(&fpga_mgr_ida, id);
 616error_kfree:
 617        kfree(mgr);
 618
 619        return NULL;
 620}
 621EXPORT_SYMBOL_GPL(fpga_mgr_create);
 622
 623/**
 624 * fpga_mgr_free - free a FPGA manager created with fpga_mgr_create()
 625 * @mgr:        fpga manager struct
 626 */
 627void fpga_mgr_free(struct fpga_manager *mgr)
 628{
 629        ida_simple_remove(&fpga_mgr_ida, mgr->dev.id);
 630        kfree(mgr);
 631}
 632EXPORT_SYMBOL_GPL(fpga_mgr_free);
 633
 634static void devm_fpga_mgr_release(struct device *dev, void *res)
 635{
 636        struct fpga_manager *mgr = *(struct fpga_manager **)res;
 637
 638        fpga_mgr_free(mgr);
 639}
 640
 641/**
 642 * devm_fpga_mgr_create - create and initialize a managed FPGA manager struct
 643 * @dev:        fpga manager device from pdev
 644 * @name:       fpga manager name
 645 * @mops:       pointer to structure of fpga manager ops
 646 * @priv:       fpga manager private data
 647 *
 648 * This function is intended for use in a FPGA manager driver's probe function.
 649 * After the manager driver creates the manager struct with
 650 * devm_fpga_mgr_create(), it should register it with fpga_mgr_register().  The
 651 * manager driver's remove function should call fpga_mgr_unregister().  The
 652 * manager struct allocated with this function will be freed automatically on
 653 * driver detach.  This includes the case of a probe function returning error
 654 * before calling fpga_mgr_register(), the struct will still get cleaned up.
 655 *
 656 * Return: pointer to struct fpga_manager or NULL
 657 */
 658struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name,
 659                                          const struct fpga_manager_ops *mops,
 660                                          void *priv)
 661{
 662        struct fpga_manager **ptr, *mgr;
 663
 664        ptr = devres_alloc(devm_fpga_mgr_release, sizeof(*ptr), GFP_KERNEL);
 665        if (!ptr)
 666                return NULL;
 667
 668        mgr = fpga_mgr_create(dev, name, mops, priv);
 669        if (!mgr) {
 670                devres_free(ptr);
 671        } else {
 672                *ptr = mgr;
 673                devres_add(dev, ptr);
 674        }
 675
 676        return mgr;
 677}
 678EXPORT_SYMBOL_GPL(devm_fpga_mgr_create);
 679
 680/**
 681 * fpga_mgr_register - register a FPGA manager
 682 * @mgr: fpga manager struct
 683 *
 684 * Return: 0 on success, negative error code otherwise.
 685 */
 686int fpga_mgr_register(struct fpga_manager *mgr)
 687{
 688        int ret;
 689
 690        /*
 691         * Initialize framework state by requesting low level driver read state
 692         * from device.  FPGA may be in reset mode or may have been programmed
 693         * by bootloader or EEPROM.
 694         */
 695        mgr->state = mgr->mops->state(mgr);
 696
 697        ret = device_add(&mgr->dev);
 698        if (ret)
 699                goto error_device;
 700
 701        dev_info(&mgr->dev, "%s registered\n", mgr->name);
 702
 703        return 0;
 704
 705error_device:
 706        ida_simple_remove(&fpga_mgr_ida, mgr->dev.id);
 707
 708        return ret;
 709}
 710EXPORT_SYMBOL_GPL(fpga_mgr_register);
 711
 712/**
 713 * fpga_mgr_unregister - unregister a FPGA manager
 714 * @mgr: fpga manager struct
 715 *
 716 * This function is intended for use in a FPGA manager driver's remove function.
 717 */
 718void fpga_mgr_unregister(struct fpga_manager *mgr)
 719{
 720        dev_info(&mgr->dev, "%s %s\n", __func__, mgr->name);
 721
 722        /*
 723         * If the low level driver provides a method for putting fpga into
 724         * a desired state upon unregister, do it.
 725         */
 726        if (mgr->mops->fpga_remove)
 727                mgr->mops->fpga_remove(mgr);
 728
 729        device_unregister(&mgr->dev);
 730}
 731EXPORT_SYMBOL_GPL(fpga_mgr_unregister);
 732
 733static void fpga_mgr_dev_release(struct device *dev)
 734{
 735}
 736
 737static int __init fpga_mgr_class_init(void)
 738{
 739        pr_info("FPGA manager framework\n");
 740
 741        fpga_mgr_class = class_create(THIS_MODULE, "fpga_manager");
 742        if (IS_ERR(fpga_mgr_class))
 743                return PTR_ERR(fpga_mgr_class);
 744
 745        fpga_mgr_class->dev_groups = fpga_mgr_groups;
 746        fpga_mgr_class->dev_release = fpga_mgr_dev_release;
 747
 748        return 0;
 749}
 750
 751static void __exit fpga_mgr_class_exit(void)
 752{
 753        class_destroy(fpga_mgr_class);
 754        ida_destroy(&fpga_mgr_ida);
 755}
 756
 757MODULE_AUTHOR("Alan Tull <atull@kernel.org>");
 758MODULE_DESCRIPTION("FPGA manager framework");
 759MODULE_LICENSE("GPL v2");
 760
 761subsys_initcall(fpga_mgr_class_init);
 762module_exit(fpga_mgr_class_exit);
 763