// SPDX-License-Identifier: GPL-2.0+ /* * R-Car Display Unit Color Management Module * * Copyright (C) 2019 Jacopo Mondi <[email protected]> */ #include <linux/io.h> #include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> #include <drm/drm_color_mgmt.h> #include "rcar_cmm.h" #define CM2_LUT_CTRL … #define CM2_LUT_CTRL_LUT_EN … #define CM2_LUT_TBL_BASE … #define CM2_LUT_TBL(__i) … struct rcar_cmm { … }; static inline int rcar_cmm_read(struct rcar_cmm *rcmm, u32 reg) { … } static inline void rcar_cmm_write(struct rcar_cmm *rcmm, u32 reg, u32 data) { … } /* * rcar_cmm_lut_write() - Scale the DRM LUT table entries to hardware precision * and write to the CMM registers * @rcmm: Pointer to the CMM device * @drm_lut: Pointer to the DRM LUT table */ static void rcar_cmm_lut_write(struct rcar_cmm *rcmm, const struct drm_color_lut *drm_lut) { … } /* * rcar_cmm_setup() - Configure the CMM unit * @pdev: The platform device associated with the CMM instance * @config: The CMM unit configuration * * Configure the CMM unit with the given configuration. Currently enabling, * disabling and programming of the 1-D LUT unit is supported. * * As rcar_cmm_setup() accesses the CMM registers the unit should be powered * and its functional clock enabled. To guarantee this, before any call to * this function is made, the CMM unit has to be enabled by calling * rcar_cmm_enable() first. * * TODO: Add support for LUT double buffer operations to avoid updating the * LUT table entries while a frame is being displayed. */ int rcar_cmm_setup(struct platform_device *pdev, const struct rcar_cmm_config *config) { … } EXPORT_SYMBOL_GPL(…); /* * rcar_cmm_enable() - Enable the CMM unit * @pdev: The platform device associated with the CMM instance * * When the output of the corresponding DU channel is routed to the CMM unit, * the unit shall be enabled before the DU channel is started, and remain * enabled until the channel is stopped. The CMM unit shall be disabled with * rcar_cmm_disable(). * * Calls to rcar_cmm_enable() and rcar_cmm_disable() are not reference-counted. * It is an error to attempt to enable an already enabled CMM unit, or to * attempt to disable a disabled unit. */ int rcar_cmm_enable(struct platform_device *pdev) { … } EXPORT_SYMBOL_GPL(…); /* * rcar_cmm_disable() - Disable the CMM unit * @pdev: The platform device associated with the CMM instance * * See rcar_cmm_enable() for usage information. * * Disabling the CMM unit disable all the internal processing blocks. The CMM * state shall thus be restored with rcar_cmm_setup() when re-enabling the CMM * unit after the next rcar_cmm_enable() call. */ void rcar_cmm_disable(struct platform_device *pdev) { … } EXPORT_SYMBOL_GPL(…); /* * rcar_cmm_init() - Initialize the CMM unit * @pdev: The platform device associated with the CMM instance * * Return: 0 on success, -EPROBE_DEFER if the CMM is not available yet, * -ENODEV if the DRM_RCAR_CMM config option is disabled */ int rcar_cmm_init(struct platform_device *pdev) { … } EXPORT_SYMBOL_GPL(…); static int rcar_cmm_probe(struct platform_device *pdev) { … } static void rcar_cmm_remove(struct platform_device *pdev) { … } static const struct of_device_id rcar_cmm_of_table[] = …; MODULE_DEVICE_TABLE(of, rcar_cmm_of_table); static struct platform_driver rcar_cmm_platform_driver = …; module_platform_driver(…) …; MODULE_AUTHOR(…) …; MODULE_DESCRIPTION(…) …; MODULE_LICENSE(…) …;