Merge tag 'defconfig-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / drivers / fpga / fpga-mgr.c
index ecb4c3c..aa30889 100644 (file)
@@ -25,6 +25,72 @@ struct fpga_mgr_devres {
        struct fpga_manager *mgr;
 };
 
+static inline void fpga_mgr_fpga_remove(struct fpga_manager *mgr)
+{
+       if (mgr->mops->fpga_remove)
+               mgr->mops->fpga_remove(mgr);
+}
+
+static inline enum fpga_mgr_states fpga_mgr_state(struct fpga_manager *mgr)
+{
+       if (mgr->mops->state)
+               return  mgr->mops->state(mgr);
+       return FPGA_MGR_STATE_UNKNOWN;
+}
+
+static inline u64 fpga_mgr_status(struct fpga_manager *mgr)
+{
+       if (mgr->mops->status)
+               return mgr->mops->status(mgr);
+       return 0;
+}
+
+static inline int fpga_mgr_write(struct fpga_manager *mgr, const char *buf, size_t count)
+{
+       if (mgr->mops->write)
+               return  mgr->mops->write(mgr, buf, count);
+       return -EOPNOTSUPP;
+}
+
+/*
+ * After all the FPGA image has been written, do the device specific steps to
+ * finish and set the FPGA into operating mode.
+ */
+static inline int fpga_mgr_write_complete(struct fpga_manager *mgr,
+                                         struct fpga_image_info *info)
+{
+       int ret = 0;
+
+       mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE;
+       if (mgr->mops->write_complete)
+               ret = mgr->mops->write_complete(mgr, info);
+       if (ret) {
+               dev_err(&mgr->dev, "Error after writing image data to FPGA\n");
+               mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE_ERR;
+               return ret;
+       }
+       mgr->state = FPGA_MGR_STATE_OPERATING;
+
+       return 0;
+}
+
+static inline int fpga_mgr_write_init(struct fpga_manager *mgr,
+                                     struct fpga_image_info *info,
+                                     const char *buf, size_t count)
+{
+       if (mgr->mops->write_init)
+               return  mgr->mops->write_init(mgr, info, buf, count);
+       return 0;
+}
+
+static inline int fpga_mgr_write_sg(struct fpga_manager *mgr,
+                                   struct sg_table *sgt)
+{
+       if (mgr->mops->write_sg)
+               return  mgr->mops->write_sg(mgr, sgt);
+       return -EOPNOTSUPP;
+}
+
 /**
  * fpga_image_info_alloc - Allocate an FPGA image info struct
  * @dev: owning device
@@ -83,9 +149,9 @@ static int fpga_mgr_write_init_buf(struct fpga_manager *mgr,
 
        mgr->state = FPGA_MGR_STATE_WRITE_INIT;
        if (!mgr->mops->initial_header_size)
-               ret = mgr->mops->write_init(mgr, info, NULL, 0);
+               ret = fpga_mgr_write_init(mgr, info, NULL, 0);
        else
-               ret = mgr->mops->write_init(
+               ret = fpga_mgr_write_init(
                    mgr, info, buf, min(mgr->mops->initial_header_size, count));
 
        if (ret) {
@@ -137,27 +203,6 @@ static int fpga_mgr_write_init_sg(struct fpga_manager *mgr,
        return ret;
 }
 
-/*
- * After all the FPGA image has been written, do the device specific steps to
- * finish and set the FPGA into operating mode.
- */
-static int fpga_mgr_write_complete(struct fpga_manager *mgr,
-                                  struct fpga_image_info *info)
-{
-       int ret;
-
-       mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE;
-       ret = mgr->mops->write_complete(mgr, info);
-       if (ret) {
-               dev_err(&mgr->dev, "Error after writing image data to FPGA\n");
-               mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE_ERR;
-               return ret;
-       }
-       mgr->state = FPGA_MGR_STATE_OPERATING;
-
-       return 0;
-}
-
 /**
  * fpga_mgr_buf_load_sg - load fpga from image in buffer from a scatter list
  * @mgr:       fpga manager
@@ -188,13 +233,13 @@ static int fpga_mgr_buf_load_sg(struct fpga_manager *mgr,
        /* Write the FPGA image to the FPGA. */
        mgr->state = FPGA_MGR_STATE_WRITE;
        if (mgr->mops->write_sg) {
-               ret = mgr->mops->write_sg(mgr, sgt);
+               ret = fpga_mgr_write_sg(mgr, sgt);
        } else {
                struct sg_mapping_iter miter;
 
                sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG);
                while (sg_miter_next(&miter)) {
-                       ret = mgr->mops->write(mgr, miter.addr, miter.length);
+                       ret = fpga_mgr_write(mgr, miter.addr, miter.length);
                        if (ret)
                                break;
                }
@@ -224,7 +269,7 @@ static int fpga_mgr_buf_load_mapped(struct fpga_manager *mgr,
         * Write the FPGA image to the FPGA.
         */
        mgr->state = FPGA_MGR_STATE_WRITE;
-       ret = mgr->mops->write(mgr, buf, count);
+       ret = fpga_mgr_write(mgr, buf, count);
        if (ret) {
                dev_err(&mgr->dev, "Error while writing image data to FPGA\n");
                mgr->state = FPGA_MGR_STATE_WRITE_ERR;
@@ -417,10 +462,7 @@ static ssize_t status_show(struct device *dev,
        u64 status;
        int len = 0;
 
-       if (!mgr->mops->status)
-               return -ENOENT;
-
-       status = mgr->mops->status(mgr);
+       status = fpga_mgr_status(mgr);
 
        if (status & FPGA_MGR_STATUS_OPERATION_ERR)
                len += sprintf(buf + len, "reconfig operation error\n");
@@ -568,9 +610,7 @@ struct fpga_manager *fpga_mgr_create(struct device *parent, const char *name,
        struct fpga_manager *mgr;
        int id, ret;
 
-       if (!mops || !mops->write_complete || !mops->state ||
-           !mops->write_init || (!mops->write && !mops->write_sg) ||
-           (mops->write && mops->write_sg)) {
+       if (!mops) {
                dev_err(parent, "Attempt to register without fpga_manager_ops\n");
                return NULL;
        }
@@ -688,7 +728,7 @@ int fpga_mgr_register(struct fpga_manager *mgr)
         * from device.  FPGA may be in reset mode or may have been programmed
         * by bootloader or EEPROM.
         */
-       mgr->state = mgr->mops->state(mgr);
+       mgr->state = fpga_mgr_state(mgr);
 
        ret = device_add(&mgr->dev);
        if (ret)
@@ -719,8 +759,7 @@ void fpga_mgr_unregister(struct fpga_manager *mgr)
         * If the low level driver provides a method for putting fpga into
         * a desired state upon unregister, do it.
         */
-       if (mgr->mops->fpga_remove)
-               mgr->mops->fpga_remove(mgr);
+       fpga_mgr_fpga_remove(mgr);
 
        device_unregister(&mgr->dev);
 }