mirror of
https://github.com/Fishwaldo/build.git
synced 2025-07-23 05:18:55 +00:00
Attach Meson64 CURRENT to 5.6.y and make DEV = CURRENT at this point. (#1956)
* Attach Meson64 CURRENT to 5.6.y and make DEV = CURRENT at this point. There is a lot of changes to 5.7.y and can be done after release or by someone that feels a need for this right now. * Delete meson64_fclk_div3.patch this fix has been upstream for some time, I had issues with it on 5.4, which is why it had been removed there. * [ meson64 current ] kconfig tweak disable Rockchip SoC drivers * [ meson64 current ] remove rockchip patches * [ meson64 current ] disable CMA patch GX * [ meson64 current] add libretech cc audio patch This brings the dts even with the khilman 5.8/integ branch which includes all of the audio changes. The kernel is registering audio devices, however nothing comes out. committed in case someone wants to spend time debugging/testing theories. * fix permissions was editing from another machine, accidental change of permissions in the patch * Set default mixer settings Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com> * [ meson64 current ] GXL audio commit This moves to the mainline patches and covers le potato and la frite. Adjusted asound config to handle a commonized sound card name. * [ meson64 current ] add gxbb audio WIP Playback is too fast, a clock setting is off somewhere. * Update kernel configs Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com> Co-authored-by: Tony <tonymckahan@gmail.com>
This commit is contained in:
parent
3da7f698ce
commit
99f6bef7de
165 changed files with 16923 additions and 26310 deletions
|
@ -5,3 +5,4 @@ BOOTCONFIG="libretech-ac_defconfig"
|
||||||
BOOT_FDT_FILE="amlogic/meson-gxl-s805x-libretech-ac.dtb"
|
BOOT_FDT_FILE="amlogic/meson-gxl-s805x-libretech-ac.dtb"
|
||||||
KERNEL_TARGET="current,dev"
|
KERNEL_TARGET="current,dev"
|
||||||
FULL_DESKTOP="yes"
|
FULL_DESKTOP="yes"
|
||||||
|
ASOUND_STATE="asound.state.mesongx"
|
||||||
|
|
|
@ -5,3 +5,4 @@ BOOTCONFIG="libretech-cc_defconfig"
|
||||||
KERNEL_TARGET="current,dev"
|
KERNEL_TARGET="current,dev"
|
||||||
SERIALCON="ttyAML0"
|
SERIALCON="ttyAML0"
|
||||||
FULL_DESKTOP="yes"
|
FULL_DESKTOP="yes"
|
||||||
|
ASOUND_STATE="asound.state.mesongx"
|
||||||
|
|
|
@ -3,4 +3,5 @@ BOARD_NAME="NanoPi K2"
|
||||||
BOARDFAMILY="meson-gxbb"
|
BOARDFAMILY="meson-gxbb"
|
||||||
BOOTCONFIG="nanopi-k2_defconfig"
|
BOOTCONFIG="nanopi-k2_defconfig"
|
||||||
KERNEL_TARGET="current,dev"
|
KERNEL_TARGET="current,dev"
|
||||||
|
FULL_DESKTOP="yes"
|
||||||
|
ASOUND_STATE="asound.state.mesongx"
|
||||||
|
|
|
@ -4,3 +4,4 @@ BOARDFAMILY="meson-gxbb"
|
||||||
BOOTCONFIG="odroid-c2_defconfig"
|
BOOTCONFIG="odroid-c2_defconfig"
|
||||||
KERNEL_TARGET="current,dev"
|
KERNEL_TARGET="current,dev"
|
||||||
FULL_DESKTOP="yes"
|
FULL_DESKTOP="yes"
|
||||||
|
ASOUND_STATE="asound.state.mesongx"
|
||||||
|
|
|
@ -5,3 +5,4 @@ BOOTCONFIG="odroid-c4_defconfig"
|
||||||
KERNEL_TARGET="current,dev"
|
KERNEL_TARGET="current,dev"
|
||||||
FULL_DESKTOP="yes"
|
FULL_DESKTOP="yes"
|
||||||
SERIALCON="ttyAML0"
|
SERIALCON="ttyAML0"
|
||||||
|
ASOUND_STATE="asound.state.meson64"
|
||||||
|
|
|
@ -6,3 +6,4 @@ MODULES_LEGACY="media_clock firmware #decoder_common #stream_input #amvdec_mh264
|
||||||
KERNEL_TARGET="legacy,current,dev"
|
KERNEL_TARGET="legacy,current,dev"
|
||||||
FULL_DESKTOP="yes"
|
FULL_DESKTOP="yes"
|
||||||
FORCE_BOOTSCRIPT_UPDATE="yes"
|
FORCE_BOOTSCRIPT_UPDATE="yes"
|
||||||
|
ASOUND_STATE="asound.state.meson64"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#
|
#
|
||||||
# Automatically generated file; DO NOT EDIT.
|
# Automatically generated file; DO NOT EDIT.
|
||||||
# Linux/arm 5.6.13 Kernel Configuration
|
# Linux/arm 5.6.14 Kernel Configuration
|
||||||
#
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -12,7 +12,6 @@ CONFIG_CLANG_VERSION=0
|
||||||
CONFIG_CC_CAN_LINK=y
|
CONFIG_CC_CAN_LINK=y
|
||||||
CONFIG_CC_HAS_ASM_GOTO=y
|
CONFIG_CC_HAS_ASM_GOTO=y
|
||||||
CONFIG_CC_HAS_ASM_INLINE=y
|
CONFIG_CC_HAS_ASM_INLINE=y
|
||||||
CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y
|
|
||||||
CONFIG_IRQ_WORK=y
|
CONFIG_IRQ_WORK=y
|
||||||
CONFIG_BUILDTIME_TABLE_SORT=y
|
CONFIG_BUILDTIME_TABLE_SORT=y
|
||||||
|
|
||||||
|
@ -1436,7 +1435,7 @@ CONFIG_BRIDGE_VLAN_FILTERING=y
|
||||||
CONFIG_HAVE_NET_DSA=y
|
CONFIG_HAVE_NET_DSA=y
|
||||||
CONFIG_NET_DSA=m
|
CONFIG_NET_DSA=m
|
||||||
CONFIG_NET_DSA_TAG_8021Q=m
|
CONFIG_NET_DSA_TAG_8021Q=m
|
||||||
# CONFIG_NET_DSA_TAG_AR9331 is not set
|
CONFIG_NET_DSA_TAG_AR9331=m
|
||||||
CONFIG_NET_DSA_TAG_BRCM_COMMON=m
|
CONFIG_NET_DSA_TAG_BRCM_COMMON=m
|
||||||
CONFIG_NET_DSA_TAG_BRCM=m
|
CONFIG_NET_DSA_TAG_BRCM=m
|
||||||
CONFIG_NET_DSA_TAG_BRCM_PREPEND=m
|
CONFIG_NET_DSA_TAG_BRCM_PREPEND=m
|
||||||
|
@ -1445,7 +1444,7 @@ CONFIG_NET_DSA_TAG_DSA=m
|
||||||
CONFIG_NET_DSA_TAG_EDSA=m
|
CONFIG_NET_DSA_TAG_EDSA=m
|
||||||
CONFIG_NET_DSA_TAG_MTK=m
|
CONFIG_NET_DSA_TAG_MTK=m
|
||||||
CONFIG_NET_DSA_TAG_KSZ=m
|
CONFIG_NET_DSA_TAG_KSZ=m
|
||||||
# CONFIG_NET_DSA_TAG_OCELOT is not set
|
CONFIG_NET_DSA_TAG_OCELOT=m
|
||||||
CONFIG_NET_DSA_TAG_QCA=m
|
CONFIG_NET_DSA_TAG_QCA=m
|
||||||
CONFIG_NET_DSA_TAG_LAN9303=m
|
CONFIG_NET_DSA_TAG_LAN9303=m
|
||||||
CONFIG_NET_DSA_TAG_SJA1105=m
|
CONFIG_NET_DSA_TAG_SJA1105=m
|
||||||
|
@ -2128,7 +2127,7 @@ CONFIG_MTD_NAND_BRCMNAND=m
|
||||||
# CONFIG_MTD_NAND_MESON is not set
|
# CONFIG_MTD_NAND_MESON is not set
|
||||||
# CONFIG_MTD_NAND_GPIO is not set
|
# CONFIG_MTD_NAND_GPIO is not set
|
||||||
# CONFIG_MTD_NAND_PLATFORM is not set
|
# CONFIG_MTD_NAND_PLATFORM is not set
|
||||||
# CONFIG_MTD_NAND_CADENCE is not set
|
CONFIG_MTD_NAND_CADENCE=m
|
||||||
|
|
||||||
#
|
#
|
||||||
# Misc
|
# Misc
|
||||||
|
@ -2606,7 +2605,7 @@ CONFIG_NET_DSA_MICROCHIP_KSZ8795=m
|
||||||
CONFIG_NET_DSA_MV88E6XXX=m
|
CONFIG_NET_DSA_MV88E6XXX=m
|
||||||
CONFIG_NET_DSA_MV88E6XXX_GLOBAL2=y
|
CONFIG_NET_DSA_MV88E6XXX_GLOBAL2=y
|
||||||
CONFIG_NET_DSA_MV88E6XXX_PTP=y
|
CONFIG_NET_DSA_MV88E6XXX_PTP=y
|
||||||
# CONFIG_NET_DSA_AR9331 is not set
|
CONFIG_NET_DSA_AR9331=m
|
||||||
CONFIG_NET_DSA_SJA1105=m
|
CONFIG_NET_DSA_SJA1105=m
|
||||||
# CONFIG_NET_DSA_SJA1105_PTP is not set
|
# CONFIG_NET_DSA_SJA1105_PTP is not set
|
||||||
CONFIG_NET_DSA_QCA8K=m
|
CONFIG_NET_DSA_QCA8K=m
|
||||||
|
@ -2818,7 +2817,7 @@ CONFIG_NET_VENDOR_TI=y
|
||||||
CONFIG_TI_DAVINCI_MDIO=y
|
CONFIG_TI_DAVINCI_MDIO=y
|
||||||
CONFIG_TI_CPSW_PHY_SEL=y
|
CONFIG_TI_CPSW_PHY_SEL=y
|
||||||
CONFIG_TI_CPSW=y
|
CONFIG_TI_CPSW=y
|
||||||
# CONFIG_TI_CPSW_SWITCHDEV is not set
|
CONFIG_TI_CPSW_SWITCHDEV=m
|
||||||
# CONFIG_TI_CPTS is not set
|
# CONFIG_TI_CPTS is not set
|
||||||
# CONFIG_TLAN is not set
|
# CONFIG_TLAN is not set
|
||||||
CONFIG_NET_VENDOR_VIA=y
|
CONFIG_NET_VENDOR_VIA=y
|
||||||
|
@ -2868,7 +2867,7 @@ CONFIG_BROADCOM_PHY=y
|
||||||
# CONFIG_DP83TC811_PHY is not set
|
# CONFIG_DP83TC811_PHY is not set
|
||||||
# CONFIG_DP83848_PHY is not set
|
# CONFIG_DP83848_PHY is not set
|
||||||
# CONFIG_DP83867_PHY is not set
|
# CONFIG_DP83867_PHY is not set
|
||||||
# CONFIG_DP83869_PHY is not set
|
CONFIG_DP83869_PHY=m
|
||||||
CONFIG_FIXED_PHY=y
|
CONFIG_FIXED_PHY=y
|
||||||
CONFIG_ICPLUS_PHY=y
|
CONFIG_ICPLUS_PHY=y
|
||||||
# CONFIG_INTEL_XWAY_PHY is not set
|
# CONFIG_INTEL_XWAY_PHY is not set
|
||||||
|
@ -3081,7 +3080,7 @@ CONFIG_WLAN_VENDOR_TI=y
|
||||||
# CONFIG_WL12XX is not set
|
# CONFIG_WL12XX is not set
|
||||||
# CONFIG_WL18XX is not set
|
# CONFIG_WL18XX is not set
|
||||||
# CONFIG_WLCORE is not set
|
# CONFIG_WLCORE is not set
|
||||||
# CONFIG_RTL8723DS is not set
|
CONFIG_RTL8723DS=m
|
||||||
CONFIG_RTL8822BU=m
|
CONFIG_RTL8822BU=m
|
||||||
CONFIG_RTL8188EU=m
|
CONFIG_RTL8188EU=m
|
||||||
CONFIG_RTL8821CU=m
|
CONFIG_RTL8821CU=m
|
||||||
|
@ -3696,7 +3695,7 @@ CONFIG_PPS_CLIENT_GPIO=m
|
||||||
CONFIG_PTP_1588_CLOCK=y
|
CONFIG_PTP_1588_CLOCK=y
|
||||||
CONFIG_DP83640_PHY=m
|
CONFIG_DP83640_PHY=m
|
||||||
CONFIG_PTP_1588_CLOCK_INES=m
|
CONFIG_PTP_1588_CLOCK_INES=m
|
||||||
# CONFIG_PTP_1588_CLOCK_IDTCM is not set
|
CONFIG_PTP_1588_CLOCK_IDTCM=m
|
||||||
# end of PTP clock support
|
# end of PTP clock support
|
||||||
|
|
||||||
CONFIG_PINCTRL=y
|
CONFIG_PINCTRL=y
|
||||||
|
@ -3727,7 +3726,7 @@ CONFIG_PINCTRL_CS47L35=y
|
||||||
CONFIG_PINCTRL_CS47L85=y
|
CONFIG_PINCTRL_CS47L85=y
|
||||||
CONFIG_PINCTRL_CS47L90=y
|
CONFIG_PINCTRL_CS47L90=y
|
||||||
CONFIG_PINCTRL_CS47L92=y
|
CONFIG_PINCTRL_CS47L92=y
|
||||||
# CONFIG_PINCTRL_EQUILIBRIUM is not set
|
CONFIG_PINCTRL_EQUILIBRIUM=m
|
||||||
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
|
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
|
||||||
CONFIG_GPIOLIB=y
|
CONFIG_GPIOLIB=y
|
||||||
CONFIG_GPIOLIB_FASTPATH_LIMIT=512
|
CONFIG_GPIOLIB_FASTPATH_LIMIT=512
|
||||||
|
@ -3750,7 +3749,7 @@ CONFIG_GPIO_EXAR=m
|
||||||
CONFIG_GPIO_GENERIC_PLATFORM=y
|
CONFIG_GPIO_GENERIC_PLATFORM=y
|
||||||
# CONFIG_GPIO_GRGPIO is not set
|
# CONFIG_GPIO_GRGPIO is not set
|
||||||
# CONFIG_GPIO_HLWD is not set
|
# CONFIG_GPIO_HLWD is not set
|
||||||
# CONFIG_GPIO_LOGICVC is not set
|
CONFIG_GPIO_LOGICVC=m
|
||||||
# CONFIG_GPIO_MB86S7X is not set
|
# CONFIG_GPIO_MB86S7X is not set
|
||||||
# CONFIG_GPIO_MPC8XXX is not set
|
# CONFIG_GPIO_MPC8XXX is not set
|
||||||
CONFIG_GPIO_OMAP=y
|
CONFIG_GPIO_OMAP=y
|
||||||
|
@ -3781,6 +3780,7 @@ CONFIG_GPIO_TPIC2810=m
|
||||||
#
|
#
|
||||||
CONFIG_GPIO_ARIZONA=m
|
CONFIG_GPIO_ARIZONA=m
|
||||||
# CONFIG_GPIO_BD70528 is not set
|
# CONFIG_GPIO_BD70528 is not set
|
||||||
|
CONFIG_GPIO_BD71828=m
|
||||||
CONFIG_GPIO_DA9052=m
|
CONFIG_GPIO_DA9052=m
|
||||||
CONFIG_GPIO_DA9055=m
|
CONFIG_GPIO_DA9055=m
|
||||||
CONFIG_GPIO_DLN2=m
|
CONFIG_GPIO_DLN2=m
|
||||||
|
@ -3858,7 +3858,7 @@ CONFIG_W1_SLAVE_DS2413=m
|
||||||
CONFIG_W1_SLAVE_DS2406=m
|
CONFIG_W1_SLAVE_DS2406=m
|
||||||
CONFIG_W1_SLAVE_DS2423=m
|
CONFIG_W1_SLAVE_DS2423=m
|
||||||
CONFIG_W1_SLAVE_DS2805=m
|
CONFIG_W1_SLAVE_DS2805=m
|
||||||
# CONFIG_W1_SLAVE_DS2430 is not set
|
CONFIG_W1_SLAVE_DS2430=m
|
||||||
CONFIG_W1_SLAVE_DS2431=m
|
CONFIG_W1_SLAVE_DS2431=m
|
||||||
CONFIG_W1_SLAVE_DS2433=m
|
CONFIG_W1_SLAVE_DS2433=m
|
||||||
# CONFIG_W1_SLAVE_DS2433_CRC is not set
|
# CONFIG_W1_SLAVE_DS2433_CRC is not set
|
||||||
|
@ -3871,7 +3871,7 @@ CONFIG_W1_SLAVE_DS28E17=m
|
||||||
# end of 1-wire Slaves
|
# end of 1-wire Slaves
|
||||||
|
|
||||||
CONFIG_POWER_AVS=y
|
CONFIG_POWER_AVS=y
|
||||||
# CONFIG_QCOM_CPR is not set
|
CONFIG_QCOM_CPR=m
|
||||||
CONFIG_POWER_RESET=y
|
CONFIG_POWER_RESET=y
|
||||||
CONFIG_POWER_RESET_AS3722=y
|
CONFIG_POWER_RESET_AS3722=y
|
||||||
CONFIG_POWER_RESET_BRCMKONA=y
|
CONFIG_POWER_RESET_BRCMKONA=y
|
||||||
|
@ -3968,7 +3968,7 @@ CONFIG_SENSORS_ADM1025=m
|
||||||
CONFIG_SENSORS_ADM1026=m
|
CONFIG_SENSORS_ADM1026=m
|
||||||
CONFIG_SENSORS_ADM1029=m
|
CONFIG_SENSORS_ADM1029=m
|
||||||
CONFIG_SENSORS_ADM1031=m
|
CONFIG_SENSORS_ADM1031=m
|
||||||
# CONFIG_SENSORS_ADM1177 is not set
|
CONFIG_SENSORS_ADM1177=m
|
||||||
CONFIG_SENSORS_ADM9240=m
|
CONFIG_SENSORS_ADM9240=m
|
||||||
CONFIG_SENSORS_ADT7X10=m
|
CONFIG_SENSORS_ADT7X10=m
|
||||||
CONFIG_SENSORS_ADT7310=m
|
CONFIG_SENSORS_ADT7310=m
|
||||||
|
@ -3981,7 +3981,7 @@ CONFIG_SENSORS_AS370=m
|
||||||
CONFIG_SENSORS_ASC7621=m
|
CONFIG_SENSORS_ASC7621=m
|
||||||
CONFIG_SENSORS_ASPEED=m
|
CONFIG_SENSORS_ASPEED=m
|
||||||
CONFIG_SENSORS_ATXP1=m
|
CONFIG_SENSORS_ATXP1=m
|
||||||
# CONFIG_SENSORS_DRIVETEMP is not set
|
CONFIG_SENSORS_DRIVETEMP=m
|
||||||
CONFIG_SENSORS_DS620=m
|
CONFIG_SENSORS_DS620=m
|
||||||
CONFIG_SENSORS_DS1621=m
|
CONFIG_SENSORS_DS1621=m
|
||||||
CONFIG_SENSORS_DA9052_ADC=m
|
CONFIG_SENSORS_DA9052_ADC=m
|
||||||
|
@ -4006,8 +4006,9 @@ CONFIG_SENSORS_JC42=m
|
||||||
CONFIG_SENSORS_POWR1220=m
|
CONFIG_SENSORS_POWR1220=m
|
||||||
CONFIG_SENSORS_LINEAGE=m
|
CONFIG_SENSORS_LINEAGE=m
|
||||||
CONFIG_SENSORS_LTC2945=m
|
CONFIG_SENSORS_LTC2945=m
|
||||||
# CONFIG_SENSORS_LTC2947_I2C is not set
|
CONFIG_SENSORS_LTC2947=m
|
||||||
# CONFIG_SENSORS_LTC2947_SPI is not set
|
CONFIG_SENSORS_LTC2947_I2C=m
|
||||||
|
CONFIG_SENSORS_LTC2947_SPI=m
|
||||||
CONFIG_SENSORS_LTC2990=m
|
CONFIG_SENSORS_LTC2990=m
|
||||||
CONFIG_SENSORS_LTC4151=m
|
CONFIG_SENSORS_LTC4151=m
|
||||||
CONFIG_SENSORS_LTC4215=m
|
CONFIG_SENSORS_LTC4215=m
|
||||||
|
@ -4021,7 +4022,7 @@ CONFIG_SENSORS_MAX1619=m
|
||||||
CONFIG_SENSORS_MAX1668=m
|
CONFIG_SENSORS_MAX1668=m
|
||||||
CONFIG_SENSORS_MAX197=m
|
CONFIG_SENSORS_MAX197=m
|
||||||
CONFIG_SENSORS_MAX31722=m
|
CONFIG_SENSORS_MAX31722=m
|
||||||
# CONFIG_SENSORS_MAX31730 is not set
|
CONFIG_SENSORS_MAX31730=m
|
||||||
CONFIG_SENSORS_MAX6621=m
|
CONFIG_SENSORS_MAX6621=m
|
||||||
CONFIG_SENSORS_MAX6639=m
|
CONFIG_SENSORS_MAX6639=m
|
||||||
CONFIG_SENSORS_MAX6642=m
|
CONFIG_SENSORS_MAX6642=m
|
||||||
|
@ -4061,7 +4062,7 @@ CONFIG_SENSORS_PCF8591=m
|
||||||
CONFIG_PMBUS=m
|
CONFIG_PMBUS=m
|
||||||
CONFIG_SENSORS_PMBUS=m
|
CONFIG_SENSORS_PMBUS=m
|
||||||
CONFIG_SENSORS_ADM1275=m
|
CONFIG_SENSORS_ADM1275=m
|
||||||
# CONFIG_SENSORS_BEL_PFE is not set
|
CONFIG_SENSORS_BEL_PFE=m
|
||||||
CONFIG_SENSORS_IBM_CFFPS=m
|
CONFIG_SENSORS_IBM_CFFPS=m
|
||||||
CONFIG_SENSORS_INSPUR_IPSPS=m
|
CONFIG_SENSORS_INSPUR_IPSPS=m
|
||||||
CONFIG_SENSORS_IR35221=m
|
CONFIG_SENSORS_IR35221=m
|
||||||
|
@ -4073,7 +4074,7 @@ CONFIG_SENSORS_LTC2978=m
|
||||||
CONFIG_SENSORS_LTC2978_REGULATOR=y
|
CONFIG_SENSORS_LTC2978_REGULATOR=y
|
||||||
CONFIG_SENSORS_LTC3815=m
|
CONFIG_SENSORS_LTC3815=m
|
||||||
CONFIG_SENSORS_MAX16064=m
|
CONFIG_SENSORS_MAX16064=m
|
||||||
# CONFIG_SENSORS_MAX20730 is not set
|
CONFIG_SENSORS_MAX20730=m
|
||||||
CONFIG_SENSORS_MAX20751=m
|
CONFIG_SENSORS_MAX20751=m
|
||||||
CONFIG_SENSORS_MAX31785=m
|
CONFIG_SENSORS_MAX31785=m
|
||||||
CONFIG_SENSORS_MAX34440=m
|
CONFIG_SENSORS_MAX34440=m
|
||||||
|
@ -4083,7 +4084,7 @@ CONFIG_SENSORS_TPS40422=m
|
||||||
CONFIG_SENSORS_TPS53679=m
|
CONFIG_SENSORS_TPS53679=m
|
||||||
CONFIG_SENSORS_UCD9000=m
|
CONFIG_SENSORS_UCD9000=m
|
||||||
CONFIG_SENSORS_UCD9200=m
|
CONFIG_SENSORS_UCD9200=m
|
||||||
# CONFIG_SENSORS_XDPE122 is not set
|
CONFIG_SENSORS_XDPE122=m
|
||||||
CONFIG_SENSORS_ZL6100=m
|
CONFIG_SENSORS_ZL6100=m
|
||||||
CONFIG_SENSORS_PWM_FAN=m
|
CONFIG_SENSORS_PWM_FAN=m
|
||||||
CONFIG_SENSORS_SHT15=m
|
CONFIG_SENSORS_SHT15=m
|
||||||
|
@ -4117,7 +4118,7 @@ CONFIG_SENSORS_TMP103=m
|
||||||
CONFIG_SENSORS_TMP108=m
|
CONFIG_SENSORS_TMP108=m
|
||||||
CONFIG_SENSORS_TMP401=m
|
CONFIG_SENSORS_TMP401=m
|
||||||
CONFIG_SENSORS_TMP421=m
|
CONFIG_SENSORS_TMP421=m
|
||||||
# CONFIG_SENSORS_TMP513 is not set
|
CONFIG_SENSORS_TMP513=m
|
||||||
# CONFIG_SENSORS_VEXPRESS is not set
|
# CONFIG_SENSORS_VEXPRESS is not set
|
||||||
CONFIG_SENSORS_VIA686A=m
|
CONFIG_SENSORS_VIA686A=m
|
||||||
CONFIG_SENSORS_VT1211=m
|
CONFIG_SENSORS_VT1211=m
|
||||||
|
@ -4383,7 +4384,7 @@ CONFIG_MFD_WM8350_I2C=y
|
||||||
CONFIG_MFD_WM8994=m
|
CONFIG_MFD_WM8994=m
|
||||||
# CONFIG_MFD_ROHM_BD718XX is not set
|
# CONFIG_MFD_ROHM_BD718XX is not set
|
||||||
CONFIG_MFD_ROHM_BD70528=m
|
CONFIG_MFD_ROHM_BD70528=m
|
||||||
# CONFIG_MFD_ROHM_BD71828 is not set
|
CONFIG_MFD_ROHM_BD71828=m
|
||||||
# CONFIG_MFD_STPMIC1 is not set
|
# CONFIG_MFD_STPMIC1 is not set
|
||||||
CONFIG_MFD_STMFX=m
|
CONFIG_MFD_STMFX=m
|
||||||
CONFIG_MFD_VEXPRESS_SYSREG=y
|
CONFIG_MFD_VEXPRESS_SYSREG=y
|
||||||
|
@ -4409,6 +4410,7 @@ CONFIG_REGULATOR_AS3722=y
|
||||||
CONFIG_REGULATOR_AXP20X=m
|
CONFIG_REGULATOR_AXP20X=m
|
||||||
CONFIG_REGULATOR_BCM590XX=m
|
CONFIG_REGULATOR_BCM590XX=m
|
||||||
CONFIG_REGULATOR_BD70528=m
|
CONFIG_REGULATOR_BD70528=m
|
||||||
|
CONFIG_REGULATOR_BD71828=m
|
||||||
CONFIG_REGULATOR_CPCAP=y
|
CONFIG_REGULATOR_CPCAP=y
|
||||||
CONFIG_REGULATOR_DA903X=m
|
CONFIG_REGULATOR_DA903X=m
|
||||||
CONFIG_REGULATOR_DA9052=m
|
CONFIG_REGULATOR_DA9052=m
|
||||||
|
@ -4448,8 +4450,8 @@ CONFIG_REGULATOR_MC13XXX_CORE=m
|
||||||
CONFIG_REGULATOR_MC13783=m
|
CONFIG_REGULATOR_MC13783=m
|
||||||
CONFIG_REGULATOR_MC13892=m
|
CONFIG_REGULATOR_MC13892=m
|
||||||
CONFIG_REGULATOR_MCP16502=m
|
CONFIG_REGULATOR_MCP16502=m
|
||||||
# CONFIG_REGULATOR_MP8859 is not set
|
CONFIG_REGULATOR_MP8859=m
|
||||||
# CONFIG_REGULATOR_MPQ7920 is not set
|
CONFIG_REGULATOR_MPQ7920=m
|
||||||
# CONFIG_REGULATOR_MT6311 is not set
|
# CONFIG_REGULATOR_MT6311 is not set
|
||||||
CONFIG_REGULATOR_PALMAS=m
|
CONFIG_REGULATOR_PALMAS=m
|
||||||
CONFIG_REGULATOR_PBIAS=y
|
CONFIG_REGULATOR_PBIAS=y
|
||||||
|
@ -4461,6 +4463,7 @@ CONFIG_REGULATOR_PWM=m
|
||||||
# CONFIG_REGULATOR_QCOM_SPMI is not set
|
# CONFIG_REGULATOR_QCOM_SPMI is not set
|
||||||
CONFIG_REGULATOR_RK808=y
|
CONFIG_REGULATOR_RK808=y
|
||||||
CONFIG_REGULATOR_RN5T618=y
|
CONFIG_REGULATOR_RN5T618=y
|
||||||
|
CONFIG_REGULATOR_ROHM=m
|
||||||
# CONFIG_REGULATOR_S2MPA01 is not set
|
# CONFIG_REGULATOR_S2MPA01 is not set
|
||||||
CONFIG_REGULATOR_S2MPS11=m
|
CONFIG_REGULATOR_S2MPS11=m
|
||||||
CONFIG_REGULATOR_S5M8767=m
|
CONFIG_REGULATOR_S5M8767=m
|
||||||
|
@ -5358,7 +5361,7 @@ CONFIG_DRM_PANEL=y
|
||||||
# Display Panels
|
# Display Panels
|
||||||
#
|
#
|
||||||
# CONFIG_DRM_PANEL_ARM_VERSATILE is not set
|
# CONFIG_DRM_PANEL_ARM_VERSATILE is not set
|
||||||
# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set
|
CONFIG_DRM_PANEL_BOE_HIMAX8279D=m
|
||||||
# CONFIG_DRM_PANEL_LVDS is not set
|
# CONFIG_DRM_PANEL_LVDS is not set
|
||||||
CONFIG_DRM_PANEL_SIMPLE=y
|
CONFIG_DRM_PANEL_SIMPLE=y
|
||||||
CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D=m
|
CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D=m
|
||||||
|
@ -5367,7 +5370,7 @@ CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D=m
|
||||||
# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set
|
# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set
|
||||||
# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set
|
# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set
|
||||||
# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set
|
# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set
|
||||||
# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set
|
CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829=m
|
||||||
CONFIG_DRM_PANEL_SAMSUNG_LD9040=m
|
CONFIG_DRM_PANEL_SAMSUNG_LD9040=m
|
||||||
# CONFIG_DRM_PANEL_LG_LB035Q02 is not set
|
# CONFIG_DRM_PANEL_LG_LB035Q02 is not set
|
||||||
# CONFIG_DRM_PANEL_LG_LG4573 is not set
|
# CONFIG_DRM_PANEL_LG_LG4573 is not set
|
||||||
|
@ -5393,13 +5396,13 @@ CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0=m
|
||||||
# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set
|
# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set
|
||||||
CONFIG_DRM_PANEL_SITRONIX_ST7701=m
|
CONFIG_DRM_PANEL_SITRONIX_ST7701=m
|
||||||
# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set
|
# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set
|
||||||
# CONFIG_DRM_PANEL_SONY_ACX424AKP is not set
|
CONFIG_DRM_PANEL_SONY_ACX424AKP=m
|
||||||
# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set
|
# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set
|
||||||
# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set
|
# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set
|
||||||
# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set
|
# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set
|
||||||
CONFIG_DRM_PANEL_TPO_TPG110=m
|
CONFIG_DRM_PANEL_TPO_TPG110=m
|
||||||
CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA=m
|
CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA=m
|
||||||
# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set
|
CONFIG_DRM_PANEL_XINPENG_XPP055C272=m
|
||||||
# end of Display Panels
|
# end of Display Panels
|
||||||
|
|
||||||
CONFIG_DRM_BRIDGE=y
|
CONFIG_DRM_BRIDGE=y
|
||||||
|
@ -5410,7 +5413,7 @@ CONFIG_DRM_PANEL_BRIDGE=y
|
||||||
#
|
#
|
||||||
# CONFIG_DRM_CDNS_DSI is not set
|
# CONFIG_DRM_CDNS_DSI is not set
|
||||||
CONFIG_DRM_DUMB_VGA_DAC=m
|
CONFIG_DRM_DUMB_VGA_DAC=m
|
||||||
# CONFIG_DRM_LVDS_CODEC is not set
|
CONFIG_DRM_LVDS_CODEC=m
|
||||||
# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set
|
# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set
|
||||||
CONFIG_DRM_NXP_PTN3460=m
|
CONFIG_DRM_NXP_PTN3460=m
|
||||||
CONFIG_DRM_PARADE_PS8622=m
|
CONFIG_DRM_PARADE_PS8622=m
|
||||||
|
@ -5706,7 +5709,7 @@ CONFIG_SND_ATMEL_SOC=m
|
||||||
#
|
#
|
||||||
# CONFIG_SND_SOC_FSL_ASRC is not set
|
# CONFIG_SND_SOC_FSL_ASRC is not set
|
||||||
CONFIG_SND_SOC_FSL_SAI=m
|
CONFIG_SND_SOC_FSL_SAI=m
|
||||||
# CONFIG_SND_SOC_FSL_MQS is not set
|
CONFIG_SND_SOC_FSL_MQS=m
|
||||||
CONFIG_SND_SOC_FSL_AUDMIX=m
|
CONFIG_SND_SOC_FSL_AUDMIX=m
|
||||||
# CONFIG_SND_SOC_FSL_SSI is not set
|
# CONFIG_SND_SOC_FSL_SSI is not set
|
||||||
# CONFIG_SND_SOC_FSL_SPDIF is not set
|
# CONFIG_SND_SOC_FSL_SPDIF is not set
|
||||||
|
@ -5780,8 +5783,9 @@ CONFIG_SND_SOC_I2C_AND_SPI=m
|
||||||
# CONFIG_SND_SOC_ADAU1761_I2C is not set
|
# CONFIG_SND_SOC_ADAU1761_I2C is not set
|
||||||
# CONFIG_SND_SOC_ADAU1761_SPI is not set
|
# CONFIG_SND_SOC_ADAU1761_SPI is not set
|
||||||
# CONFIG_SND_SOC_ADAU7002 is not set
|
# CONFIG_SND_SOC_ADAU7002 is not set
|
||||||
# CONFIG_SND_SOC_ADAU7118_HW is not set
|
CONFIG_SND_SOC_ADAU7118=m
|
||||||
# CONFIG_SND_SOC_ADAU7118_I2C is not set
|
CONFIG_SND_SOC_ADAU7118_HW=m
|
||||||
|
CONFIG_SND_SOC_ADAU7118_I2C=m
|
||||||
# CONFIG_SND_SOC_AK4104 is not set
|
# CONFIG_SND_SOC_AK4104 is not set
|
||||||
CONFIG_SND_SOC_AK4118=m
|
CONFIG_SND_SOC_AK4118=m
|
||||||
# CONFIG_SND_SOC_AK4458 is not set
|
# CONFIG_SND_SOC_AK4458 is not set
|
||||||
|
@ -5815,7 +5819,7 @@ CONFIG_SND_SOC_CPCAP=m
|
||||||
# CONFIG_SND_SOC_CS4349 is not set
|
# CONFIG_SND_SOC_CS4349 is not set
|
||||||
# CONFIG_SND_SOC_CS53L30 is not set
|
# CONFIG_SND_SOC_CS53L30 is not set
|
||||||
# CONFIG_SND_SOC_CX2072X is not set
|
# CONFIG_SND_SOC_CX2072X is not set
|
||||||
# CONFIG_SND_SOC_DA7213 is not set
|
CONFIG_SND_SOC_DA7213=m
|
||||||
CONFIG_SND_SOC_DMIC=m
|
CONFIG_SND_SOC_DMIC=m
|
||||||
CONFIG_SND_SOC_HDMI_CODEC=m
|
CONFIG_SND_SOC_HDMI_CODEC=m
|
||||||
# CONFIG_SND_SOC_ES7134 is not set
|
# CONFIG_SND_SOC_ES7134 is not set
|
||||||
|
@ -5862,8 +5866,8 @@ CONFIG_SND_SOC_SPDIF=m
|
||||||
# CONFIG_SND_SOC_STA350 is not set
|
# CONFIG_SND_SOC_STA350 is not set
|
||||||
CONFIG_SND_SOC_STI_SAS=m
|
CONFIG_SND_SOC_STI_SAS=m
|
||||||
# CONFIG_SND_SOC_TAS2552 is not set
|
# CONFIG_SND_SOC_TAS2552 is not set
|
||||||
# CONFIG_SND_SOC_TAS2562 is not set
|
CONFIG_SND_SOC_TAS2562=m
|
||||||
# CONFIG_SND_SOC_TAS2770 is not set
|
CONFIG_SND_SOC_TAS2770=m
|
||||||
# CONFIG_SND_SOC_TAS5086 is not set
|
# CONFIG_SND_SOC_TAS5086 is not set
|
||||||
# CONFIG_SND_SOC_TAS571X is not set
|
# CONFIG_SND_SOC_TAS571X is not set
|
||||||
# CONFIG_SND_SOC_TAS5720 is not set
|
# CONFIG_SND_SOC_TAS5720 is not set
|
||||||
|
@ -5909,7 +5913,7 @@ CONFIG_SND_SOC_WM8978=m
|
||||||
# CONFIG_SND_SOC_MAX9759 is not set
|
# CONFIG_SND_SOC_MAX9759 is not set
|
||||||
# CONFIG_SND_SOC_MT6351 is not set
|
# CONFIG_SND_SOC_MT6351 is not set
|
||||||
# CONFIG_SND_SOC_MT6358 is not set
|
# CONFIG_SND_SOC_MT6358 is not set
|
||||||
# CONFIG_SND_SOC_MT6660 is not set
|
CONFIG_SND_SOC_MT6660=m
|
||||||
# CONFIG_SND_SOC_NAU8540 is not set
|
# CONFIG_SND_SOC_NAU8540 is not set
|
||||||
# CONFIG_SND_SOC_NAU8810 is not set
|
# CONFIG_SND_SOC_NAU8810 is not set
|
||||||
CONFIG_SND_SOC_NAU8822=m
|
CONFIG_SND_SOC_NAU8822=m
|
||||||
|
@ -6424,7 +6428,7 @@ CONFIG_MMC_SDHCI_PLTFM=y
|
||||||
CONFIG_MMC_SDHCI_OF_DWCMSHC=m
|
CONFIG_MMC_SDHCI_OF_DWCMSHC=m
|
||||||
# CONFIG_MMC_SDHCI_CADENCE is not set
|
# CONFIG_MMC_SDHCI_CADENCE is not set
|
||||||
# CONFIG_MMC_SDHCI_F_SDH30 is not set
|
# CONFIG_MMC_SDHCI_F_SDH30 is not set
|
||||||
# CONFIG_MMC_SDHCI_MILBEAUT is not set
|
CONFIG_MMC_SDHCI_MILBEAUT=m
|
||||||
# CONFIG_MMC_MESON_GX is not set
|
# CONFIG_MMC_MESON_GX is not set
|
||||||
CONFIG_MMC_MESON_MX_SDIO=y
|
CONFIG_MMC_MESON_MX_SDIO=y
|
||||||
# CONFIG_MMC_OMAP is not set
|
# CONFIG_MMC_OMAP is not set
|
||||||
|
@ -6713,7 +6717,7 @@ CONFIG_DW_DMAC=y
|
||||||
# CONFIG_DW_DMAC_PCI is not set
|
# CONFIG_DW_DMAC_PCI is not set
|
||||||
CONFIG_DW_EDMA=m
|
CONFIG_DW_EDMA=m
|
||||||
# CONFIG_DW_EDMA_PCIE is not set
|
# CONFIG_DW_EDMA_PCIE is not set
|
||||||
# CONFIG_SF_PDMA is not set
|
CONFIG_SF_PDMA=m
|
||||||
CONFIG_TI_CPPI41=m
|
CONFIG_TI_CPPI41=m
|
||||||
CONFIG_TI_EDMA=y
|
CONFIG_TI_EDMA=y
|
||||||
CONFIG_DMA_OMAP=y
|
CONFIG_DMA_OMAP=y
|
||||||
|
@ -6916,7 +6920,13 @@ CONFIG_ARCX_ANYBUS_CONTROLLER=m
|
||||||
CONFIG_HMS_PROFINET=m
|
CONFIG_HMS_PROFINET=m
|
||||||
# CONFIG_USB_WUSB_CBAF is not set
|
# CONFIG_USB_WUSB_CBAF is not set
|
||||||
# CONFIG_UWB is not set
|
# CONFIG_UWB is not set
|
||||||
# CONFIG_STAGING_EXFAT_FS is not set
|
CONFIG_STAGING_EXFAT_FS=m
|
||||||
|
CONFIG_STAGING_EXFAT_DISCARD=y
|
||||||
|
# CONFIG_STAGING_EXFAT_DELAYED_SYNC is not set
|
||||||
|
# CONFIG_STAGING_EXFAT_KERNEL_DEBUG is not set
|
||||||
|
# CONFIG_STAGING_EXFAT_DEBUG_MSG is not set
|
||||||
|
CONFIG_STAGING_EXFAT_DEFAULT_CODEPAGE=437
|
||||||
|
CONFIG_STAGING_EXFAT_DEFAULT_IOCHARSET="utf8"
|
||||||
# CONFIG_QLGE is not set
|
# CONFIG_QLGE is not set
|
||||||
CONFIG_NET_VENDOR_HP=y
|
CONFIG_NET_VENDOR_HP=y
|
||||||
# CONFIG_HP100 is not set
|
# CONFIG_HP100 is not set
|
||||||
|
@ -7147,7 +7157,8 @@ CONFIG_ADXL372_SPI=m
|
||||||
CONFIG_ADXL372_I2C=m
|
CONFIG_ADXL372_I2C=m
|
||||||
# CONFIG_BMA180 is not set
|
# CONFIG_BMA180 is not set
|
||||||
# CONFIG_BMA220 is not set
|
# CONFIG_BMA220 is not set
|
||||||
# CONFIG_BMA400 is not set
|
CONFIG_BMA400=m
|
||||||
|
CONFIG_BMA400_I2C=m
|
||||||
# CONFIG_BMC150_ACCEL is not set
|
# CONFIG_BMC150_ACCEL is not set
|
||||||
# CONFIG_DA280 is not set
|
# CONFIG_DA280 is not set
|
||||||
# CONFIG_DA311 is not set
|
# CONFIG_DA311 is not set
|
||||||
|
@ -7175,7 +7186,7 @@ CONFIG_ADXL372_I2C=m
|
||||||
# Analog to digital converters
|
# Analog to digital converters
|
||||||
#
|
#
|
||||||
CONFIG_AD_SIGMA_DELTA=m
|
CONFIG_AD_SIGMA_DELTA=m
|
||||||
# CONFIG_AD7091R5 is not set
|
CONFIG_AD7091R5=m
|
||||||
CONFIG_AD7124=m
|
CONFIG_AD7124=m
|
||||||
CONFIG_AD7266=m
|
CONFIG_AD7266=m
|
||||||
CONFIG_AD7291=m
|
CONFIG_AD7291=m
|
||||||
|
@ -7400,8 +7411,9 @@ CONFIG_ADIS16460=m
|
||||||
# CONFIG_ADIS16480 is not set
|
# CONFIG_ADIS16480 is not set
|
||||||
# CONFIG_BMI160_I2C is not set
|
# CONFIG_BMI160_I2C is not set
|
||||||
# CONFIG_BMI160_SPI is not set
|
# CONFIG_BMI160_SPI is not set
|
||||||
# CONFIG_FXOS8700_I2C is not set
|
CONFIG_FXOS8700=m
|
||||||
# CONFIG_FXOS8700_SPI is not set
|
CONFIG_FXOS8700_I2C=m
|
||||||
|
CONFIG_FXOS8700_SPI=m
|
||||||
# CONFIG_KMX61 is not set
|
# CONFIG_KMX61 is not set
|
||||||
# CONFIG_INV_MPU6050_I2C is not set
|
# CONFIG_INV_MPU6050_I2C is not set
|
||||||
# CONFIG_INV_MPU6050_SPI is not set
|
# CONFIG_INV_MPU6050_SPI is not set
|
||||||
|
@ -7551,7 +7563,7 @@ CONFIG_DPS310=m
|
||||||
CONFIG_ISL29501=m
|
CONFIG_ISL29501=m
|
||||||
# CONFIG_LIDAR_LITE_V2 is not set
|
# CONFIG_LIDAR_LITE_V2 is not set
|
||||||
CONFIG_MB1232=m
|
CONFIG_MB1232=m
|
||||||
# CONFIG_PING is not set
|
CONFIG_PING=m
|
||||||
# CONFIG_RFD77402 is not set
|
# CONFIG_RFD77402 is not set
|
||||||
# CONFIG_SRF04 is not set
|
# CONFIG_SRF04 is not set
|
||||||
# CONFIG_SX9500 is not set
|
# CONFIG_SX9500 is not set
|
||||||
|
@ -7569,7 +7581,7 @@ CONFIG_VL53L0X_I2C=m
|
||||||
#
|
#
|
||||||
# Temperature sensors
|
# Temperature sensors
|
||||||
#
|
#
|
||||||
# CONFIG_LTC2983 is not set
|
CONFIG_LTC2983=m
|
||||||
# CONFIG_MAXIM_THERMOCOUPLE is not set
|
# CONFIG_MAXIM_THERMOCOUPLE is not set
|
||||||
# CONFIG_MLX90614 is not set
|
# CONFIG_MLX90614 is not set
|
||||||
# CONFIG_MLX90632 is not set
|
# CONFIG_MLX90632 is not set
|
||||||
|
@ -7655,7 +7667,7 @@ CONFIG_TI_PIPE3=y
|
||||||
# CONFIG_PHY_TUSB1210 is not set
|
# CONFIG_PHY_TUSB1210 is not set
|
||||||
CONFIG_TWL4030_USB=m
|
CONFIG_TWL4030_USB=m
|
||||||
CONFIG_PHY_TI_GMII_SEL=y
|
CONFIG_PHY_TI_GMII_SEL=y
|
||||||
# CONFIG_PHY_INTEL_EMMC is not set
|
CONFIG_PHY_INTEL_EMMC=m
|
||||||
# end of PHY Subsystem
|
# end of PHY Subsystem
|
||||||
|
|
||||||
# CONFIG_POWERCAP is not set
|
# CONFIG_POWERCAP is not set
|
||||||
|
@ -7682,7 +7694,7 @@ CONFIG_RAS=y
|
||||||
CONFIG_DAX=m
|
CONFIG_DAX=m
|
||||||
CONFIG_NVMEM=y
|
CONFIG_NVMEM=y
|
||||||
CONFIG_NVMEM_SYSFS=y
|
CONFIG_NVMEM_SYSFS=y
|
||||||
# CONFIG_NVMEM_SPMI_SDAM is not set
|
CONFIG_NVMEM_SPMI_SDAM=m
|
||||||
CONFIG_MESON_MX_EFUSE=y
|
CONFIG_MESON_MX_EFUSE=y
|
||||||
# CONFIG_RAVE_SP_EEPROM is not set
|
# CONFIG_RAVE_SP_EEPROM is not set
|
||||||
|
|
||||||
|
@ -7722,6 +7734,7 @@ CONFIG_EXT4_FS=y
|
||||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||||
CONFIG_EXT4_FS_SECURITY=y
|
CONFIG_EXT4_FS_SECURITY=y
|
||||||
# CONFIG_EXT4_DEBUG is not set
|
# CONFIG_EXT4_DEBUG is not set
|
||||||
|
CONFIG_EXT4_KUNIT_TESTS=m
|
||||||
CONFIG_JBD2=y
|
CONFIG_JBD2=y
|
||||||
# CONFIG_JBD2_DEBUG is not set
|
# CONFIG_JBD2_DEBUG is not set
|
||||||
CONFIG_FS_MBCACHE=y
|
CONFIG_FS_MBCACHE=y
|
||||||
|
@ -8222,7 +8235,7 @@ CONFIG_CRYPTO_CRYPTD=y
|
||||||
CONFIG_CRYPTO_AUTHENC=y
|
CONFIG_CRYPTO_AUTHENC=y
|
||||||
CONFIG_CRYPTO_TEST=m
|
CONFIG_CRYPTO_TEST=m
|
||||||
CONFIG_CRYPTO_SIMD=m
|
CONFIG_CRYPTO_SIMD=m
|
||||||
CONFIG_CRYPTO_ENGINE=y
|
CONFIG_CRYPTO_ENGINE=m
|
||||||
|
|
||||||
#
|
#
|
||||||
# Public-key cryptography
|
# Public-key cryptography
|
||||||
|
@ -8376,9 +8389,9 @@ CONFIG_CRYPTO_HW=y
|
||||||
# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set
|
# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set
|
||||||
# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set
|
# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set
|
||||||
CONFIG_CRYPTO_DEV_VIRTIO=m
|
CONFIG_CRYPTO_DEV_VIRTIO=m
|
||||||
# CONFIG_CRYPTO_DEV_SAFEXCEL is not set
|
CONFIG_CRYPTO_DEV_SAFEXCEL=m
|
||||||
# CONFIG_CRYPTO_DEV_CCREE is not set
|
CONFIG_CRYPTO_DEV_CCREE=m
|
||||||
CONFIG_CRYPTO_DEV_AMLOGIC_GXL=y
|
CONFIG_CRYPTO_DEV_AMLOGIC_GXL=m
|
||||||
# CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG is not set
|
# CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG is not set
|
||||||
CONFIG_ASYMMETRIC_KEY_TYPE=y
|
CONFIG_ASYMMETRIC_KEY_TYPE=y
|
||||||
CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
|
CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
|
||||||
|
@ -8731,7 +8744,9 @@ CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||||
#
|
#
|
||||||
# Kernel Testing and Coverage
|
# Kernel Testing and Coverage
|
||||||
#
|
#
|
||||||
# CONFIG_KUNIT is not set
|
CONFIG_KUNIT=m
|
||||||
|
CONFIG_KUNIT_TEST=m
|
||||||
|
CONFIG_KUNIT_EXAMPLE_TEST=m
|
||||||
# CONFIG_NOTIFIER_ERROR_INJECTION is not set
|
# CONFIG_NOTIFIER_ERROR_INJECTION is not set
|
||||||
# CONFIG_FAULT_INJECTION is not set
|
# CONFIG_FAULT_INJECTION is not set
|
||||||
CONFIG_ARCH_HAS_KCOV=y
|
CONFIG_ARCH_HAS_KCOV=y
|
||||||
|
@ -8769,6 +8784,8 @@ CONFIG_TEST_VMALLOC=m
|
||||||
# CONFIG_FIND_BIT_BENCHMARK is not set
|
# CONFIG_FIND_BIT_BENCHMARK is not set
|
||||||
# CONFIG_TEST_FIRMWARE is not set
|
# CONFIG_TEST_FIRMWARE is not set
|
||||||
# CONFIG_TEST_SYSCTL is not set
|
# CONFIG_TEST_SYSCTL is not set
|
||||||
|
CONFIG_SYSCTL_KUNIT_TEST=m
|
||||||
|
CONFIG_LIST_KUNIT_TEST=m
|
||||||
# CONFIG_TEST_UDELAY is not set
|
# CONFIG_TEST_UDELAY is not set
|
||||||
# CONFIG_TEST_STATIC_KEYS is not set
|
# CONFIG_TEST_STATIC_KEYS is not set
|
||||||
# CONFIG_TEST_KMOD is not set
|
# CONFIG_TEST_KMOD is not set
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
1
config/kernel/linux-meson64-dev.config
Symbolic link
1
config/kernel/linux-meson64-dev.config
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
linux-meson64-current.config
|
|
@ -20,10 +20,10 @@ GOVERNOR=conservative
|
||||||
|
|
||||||
case $BRANCH in
|
case $BRANCH in
|
||||||
|
|
||||||
dev)
|
current|dev)
|
||||||
|
|
||||||
KERNELBRANCH='branch:linux-5.6.y'
|
KERNELBRANCH='branch:linux-5.6.y'
|
||||||
|
KERNELPATCHDIR='meson64-current'
|
||||||
;;
|
;;
|
||||||
|
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -22,7 +22,7 @@ case $BRANCH in
|
||||||
current)
|
current)
|
||||||
|
|
||||||
KERNELBRANCH="branch:linux-5.6.y"
|
KERNELBRANCH="branch:linux-5.6.y"
|
||||||
KERNELPATCHDIR='meson-'$BRANCH
|
KERNELPATCHDIR='meson-current'
|
||||||
|
|
||||||
;;
|
;;
|
||||||
dev)
|
dev)
|
||||||
|
|
196
packages/blobs/asound.state/asound.state.meson64
Normal file
196
packages/blobs/asound.state/asound.state.meson64
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
state.GXLLIBRETECHS90 {
|
||||||
|
control.1 {
|
||||||
|
iface MIXER
|
||||||
|
name 'AIU ACODEC I2S Lane Select'
|
||||||
|
value 0
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type INTEGER
|
||||||
|
count 1
|
||||||
|
range '0 - 3'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.2 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Playback Mute'
|
||||||
|
value false
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type BOOLEAN
|
||||||
|
count 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.3 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Playback Volume'
|
||||||
|
value.0 0
|
||||||
|
value.1 0
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type INTEGER
|
||||||
|
count 2
|
||||||
|
range '0 - 255'
|
||||||
|
dbmin -9999999
|
||||||
|
dbmax 0
|
||||||
|
dbvalue.0 -9999999
|
||||||
|
dbvalue.1 -9999999
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.4 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Ramp Rate'
|
||||||
|
value Fast
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 Fast
|
||||||
|
item.1 Slow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.5 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Volume Ramp Enable'
|
||||||
|
value 0
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type INTEGER
|
||||||
|
count 1
|
||||||
|
range '0 - 1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.6 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Mute Ramp Enable'
|
||||||
|
value false
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type BOOLEAN
|
||||||
|
count 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.7 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Unmute Ramp Enable'
|
||||||
|
value false
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type BOOLEAN
|
||||||
|
count 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.8 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Right DAC Source'
|
||||||
|
value Right
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 Right
|
||||||
|
item.1 Left
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.9 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Left DAC Source'
|
||||||
|
value Left
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 Left
|
||||||
|
item.1 Right
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.10 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Channel Mode'
|
||||||
|
value Stereo
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 Stereo
|
||||||
|
item.1 Mono
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.11 {
|
||||||
|
iface PCM
|
||||||
|
device 2
|
||||||
|
name 'Playback Channel Map'
|
||||||
|
value.0 0
|
||||||
|
value.1 0
|
||||||
|
value.2 0
|
||||||
|
value.3 0
|
||||||
|
value.4 0
|
||||||
|
value.5 0
|
||||||
|
value.6 0
|
||||||
|
value.7 0
|
||||||
|
comment {
|
||||||
|
access read
|
||||||
|
type INTEGER
|
||||||
|
count 8
|
||||||
|
range '0 - 36'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.12 {
|
||||||
|
iface PCM
|
||||||
|
device 2
|
||||||
|
name ELD
|
||||||
|
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
|
||||||
|
comment {
|
||||||
|
access 'read volatile'
|
||||||
|
type BYTES
|
||||||
|
count 128
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.13 {
|
||||||
|
iface MIXER
|
||||||
|
name 'AIU SPDIF SRC SEL'
|
||||||
|
value SPDIF
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 SPDIF
|
||||||
|
item.1 I2S
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.14 {
|
||||||
|
iface MIXER
|
||||||
|
name 'AIU HDMI CTRL SRC'
|
||||||
|
value I2S
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 DISABLED
|
||||||
|
item.1 PCM
|
||||||
|
item.2 I2S
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.15 {
|
||||||
|
iface MIXER
|
||||||
|
name 'AIU ACODEC SRC'
|
||||||
|
value DISABLED
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 DISABLED
|
||||||
|
item.1 I2S
|
||||||
|
item.2 PCM
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.16 {
|
||||||
|
iface MIXER
|
||||||
|
name 'AIU ACODEC OUT EN Switch'
|
||||||
|
value false
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type BOOLEAN
|
||||||
|
count 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
196
packages/blobs/asound.state/asound.state.mesongx
Normal file
196
packages/blobs/asound.state/asound.state.mesongx
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
state.GXSOUNDCARD {
|
||||||
|
control.1 {
|
||||||
|
iface MIXER
|
||||||
|
name 'AIU ACODEC I2S Lane Select'
|
||||||
|
value 0
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type INTEGER
|
||||||
|
count 1
|
||||||
|
range '0 - 3'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.2 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Playback Mute'
|
||||||
|
value false
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type BOOLEAN
|
||||||
|
count 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.3 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Playback Volume'
|
||||||
|
value.0 0
|
||||||
|
value.1 0
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type INTEGER
|
||||||
|
count 2
|
||||||
|
range '0 - 255'
|
||||||
|
dbmin -9999999
|
||||||
|
dbmax 0
|
||||||
|
dbvalue.0 -9999999
|
||||||
|
dbvalue.1 -9999999
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.4 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Ramp Rate'
|
||||||
|
value Fast
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 Fast
|
||||||
|
item.1 Slow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.5 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Volume Ramp Enable'
|
||||||
|
value 0
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type INTEGER
|
||||||
|
count 1
|
||||||
|
range '0 - 1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.6 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Mute Ramp Enable'
|
||||||
|
value false
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type BOOLEAN
|
||||||
|
count 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.7 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Unmute Ramp Enable'
|
||||||
|
value false
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type BOOLEAN
|
||||||
|
count 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.8 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Right DAC Source'
|
||||||
|
value Right
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 Right
|
||||||
|
item.1 Left
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.9 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Left DAC Source'
|
||||||
|
value Left
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 Left
|
||||||
|
item.1 Right
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.10 {
|
||||||
|
iface MIXER
|
||||||
|
name 'ACODEC Channel Mode'
|
||||||
|
value Stereo
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 Stereo
|
||||||
|
item.1 Mono
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.11 {
|
||||||
|
iface PCM
|
||||||
|
device 2
|
||||||
|
name 'Playback Channel Map'
|
||||||
|
value.0 0
|
||||||
|
value.1 0
|
||||||
|
value.2 0
|
||||||
|
value.3 0
|
||||||
|
value.4 0
|
||||||
|
value.5 0
|
||||||
|
value.6 0
|
||||||
|
value.7 0
|
||||||
|
comment {
|
||||||
|
access read
|
||||||
|
type INTEGER
|
||||||
|
count 8
|
||||||
|
range '0 - 36'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.12 {
|
||||||
|
iface PCM
|
||||||
|
device 2
|
||||||
|
name ELD
|
||||||
|
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
|
||||||
|
comment {
|
||||||
|
access 'read volatile'
|
||||||
|
type BYTES
|
||||||
|
count 128
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.13 {
|
||||||
|
iface MIXER
|
||||||
|
name 'AIU SPDIF SRC SEL'
|
||||||
|
value SPDIF
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 SPDIF
|
||||||
|
item.1 I2S
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.14 {
|
||||||
|
iface MIXER
|
||||||
|
name 'AIU HDMI CTRL SRC'
|
||||||
|
value I2S
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 DISABLED
|
||||||
|
item.1 PCM
|
||||||
|
item.2 I2S
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.15 {
|
||||||
|
iface MIXER
|
||||||
|
name 'AIU ACODEC SRC'
|
||||||
|
value DISABLED
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type ENUMERATED
|
||||||
|
count 1
|
||||||
|
item.0 DISABLED
|
||||||
|
item.1 I2S
|
||||||
|
item.2 PCM
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.16 {
|
||||||
|
iface MIXER
|
||||||
|
name 'AIU ACODEC OUT EN Switch'
|
||||||
|
value false
|
||||||
|
comment {
|
||||||
|
access 'read write'
|
||||||
|
type BOOLEAN
|
||||||
|
count 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
From 777e8dfded4da5939d79b9f7dfe67b86e173673a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Qiang Yu <yuq825@gmail.com>
|
||||||
|
Date: Thu, 16 Jan 2020 21:11:53 +0800
|
||||||
|
Subject: [PATCH 001/101] FROMGIT: drm/lima: update register info
|
||||||
|
|
||||||
|
From Mali r10p0 kernel driver source code.
|
||||||
|
|
||||||
|
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||||
|
Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
|
||||||
|
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
||||||
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-2-yuq825@gmail.com
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/lima/lima_regs.h | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_regs.h b/drivers/gpu/drm/lima/lima_regs.h
|
||||||
|
index ace8ecefbe90..0124c90e0153 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_regs.h
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_regs.h
|
||||||
|
@@ -239,6 +239,7 @@
|
||||||
|
#define LIMA_MMU_STATUS_REPLAY_BUFFER_EMPTY BIT(4)
|
||||||
|
#define LIMA_MMU_STATUS_PAGE_FAULT_IS_WRITE BIT(5)
|
||||||
|
#define LIMA_MMU_STATUS_BUS_ID(x) ((x >> 6) & 0x1F)
|
||||||
|
+#define LIMA_MMU_STATUS_STALL_NOT_ACTIVE BIT(31)
|
||||||
|
#define LIMA_MMU_COMMAND 0x0008
|
||||||
|
#define LIMA_MMU_COMMAND_ENABLE_PAGING 0x00
|
||||||
|
#define LIMA_MMU_COMMAND_DISABLE_PAGING 0x01
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,988 +0,0 @@
|
||||||
From 40093b7713c77f0a49f4942f9f1fdf62abcc8adf Mon Sep 17 00:00:00 2001
|
|
||||||
From: Corentin Labbe <clabbe@baylibre.com>
|
|
||||||
Date: Thu, 17 Oct 2019 05:06:25 +0000
|
|
||||||
Subject: [PATCH 3/4] crypto: amlogic: Add crypto accelerator for amlogic GXL
|
|
||||||
|
|
||||||
This patch adds support for the amlogic GXL cryptographic offloader present
|
|
||||||
on GXL SoCs.
|
|
||||||
|
|
||||||
This driver supports AES cipher in CBC/ECB mode.
|
|
||||||
|
|
||||||
Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
|
|
||||||
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
||||||
---
|
|
||||||
drivers/crypto/Kconfig | 2 +
|
|
||||||
drivers/crypto/Makefile | 1 +
|
|
||||||
drivers/crypto/amlogic/Kconfig | 24 ++
|
|
||||||
drivers/crypto/amlogic/Makefile | 2 +
|
|
||||||
drivers/crypto/amlogic/amlogic-gxl-cipher.c | 381 ++++++++++++++++++++
|
|
||||||
drivers/crypto/amlogic/amlogic-gxl-core.c | 331 +++++++++++++++++
|
|
||||||
drivers/crypto/amlogic/amlogic-gxl.h | 170 +++++++++
|
|
||||||
7 files changed, 911 insertions(+)
|
|
||||||
create mode 100644 drivers/crypto/amlogic/Kconfig
|
|
||||||
create mode 100644 drivers/crypto/amlogic/Makefile
|
|
||||||
create mode 100644 drivers/crypto/amlogic/amlogic-gxl-cipher.c
|
|
||||||
create mode 100644 drivers/crypto/amlogic/amlogic-gxl-core.c
|
|
||||||
create mode 100644 drivers/crypto/amlogic/amlogic-gxl.h
|
|
||||||
|
|
||||||
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig
|
|
||||||
index 1fb622f2a87d..359a34ee7370 100644
|
|
||||||
--- a/drivers/crypto/Kconfig
|
|
||||||
+++ b/drivers/crypto/Kconfig
|
|
||||||
@@ -805,4 +805,6 @@ config CRYPTO_DEV_CCREE
|
|
||||||
|
|
||||||
source "drivers/crypto/hisilicon/Kconfig"
|
|
||||||
|
|
||||||
+source "drivers/crypto/amlogic/Kconfig"
|
|
||||||
+
|
|
||||||
endif # CRYPTO_HW
|
|
||||||
diff --git a/drivers/crypto/Makefile b/drivers/crypto/Makefile
|
|
||||||
index afc4753b5d28..9919fbe0e1d4 100644
|
|
||||||
--- a/drivers/crypto/Makefile
|
|
||||||
+++ b/drivers/crypto/Makefile
|
|
||||||
@@ -48,3 +48,4 @@ obj-$(CONFIG_CRYPTO_DEV_BCM_SPU) += bcm/
|
|
||||||
obj-$(CONFIG_CRYPTO_DEV_SAFEXCEL) += inside-secure/
|
|
||||||
obj-$(CONFIG_CRYPTO_DEV_ARTPEC6) += axis/
|
|
||||||
obj-y += hisilicon/
|
|
||||||
+obj-$(CONFIG_CRYPTO_DEV_AMLOGIC_GXL) += amlogic/
|
|
||||||
diff --git a/drivers/crypto/amlogic/Kconfig b/drivers/crypto/amlogic/Kconfig
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000000..5c81a4ad0fae
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/crypto/amlogic/Kconfig
|
|
||||||
@@ -0,0 +1,24 @@
|
|
||||||
+config CRYPTO_DEV_AMLOGIC_GXL
|
|
||||||
+ tristate "Support for amlogic cryptographic offloader"
|
|
||||||
+ default y if ARCH_MESON
|
|
||||||
+ select CRYPTO_BLKCIPHER
|
|
||||||
+ select CRYPTO_ENGINE
|
|
||||||
+ select CRYPTO_ECB
|
|
||||||
+ select CRYPTO_CBC
|
|
||||||
+ select CRYPTO_AES
|
|
||||||
+ help
|
|
||||||
+ Select y here to have support for the cryptographic offloader
|
|
||||||
+ available on Amlogic GXL SoC.
|
|
||||||
+ This hardware handles AES ciphers in ECB/CBC mode.
|
|
||||||
+
|
|
||||||
+ To compile this driver as a module, choose M here: the module
|
|
||||||
+ will be called amlogic-gxl-crypto.
|
|
||||||
+
|
|
||||||
+config CRYPTO_DEV_AMLOGIC_GXL_DEBUG
|
|
||||||
+ bool "Enable amlogic stats"
|
|
||||||
+ depends on CRYPTO_DEV_AMLOGIC_GXL
|
|
||||||
+ depends on DEBUG_FS
|
|
||||||
+ help
|
|
||||||
+ Say y to enable amlogic-crypto debug stats.
|
|
||||||
+ This will create /sys/kernel/debug/gxl-crypto/stats for displaying
|
|
||||||
+ the number of requests per flow and per algorithm.
|
|
||||||
diff --git a/drivers/crypto/amlogic/Makefile b/drivers/crypto/amlogic/Makefile
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000000..39057e62c13e
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/crypto/amlogic/Makefile
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+obj-$(CONFIG_CRYPTO_DEV_AMLOGIC_GXL) += amlogic-gxl-crypto.o
|
|
||||||
+amlogic-gxl-crypto-y := amlogic-gxl-core.o amlogic-gxl-cipher.o
|
|
||||||
diff --git a/drivers/crypto/amlogic/amlogic-gxl-cipher.c b/drivers/crypto/amlogic/amlogic-gxl-cipher.c
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000000..e9283ffdbd23
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/crypto/amlogic/amlogic-gxl-cipher.c
|
|
||||||
@@ -0,0 +1,381 @@
|
|
||||||
+// SPDX-License-Identifier: GPL-2.0
|
|
||||||
+/*
|
|
||||||
+ * amlogic-cipher.c - hardware cryptographic offloader for Amlogic GXL SoC
|
|
||||||
+ *
|
|
||||||
+ * Copyright (C) 2018-2019 Corentin LABBE <clabbe@baylibre.com>
|
|
||||||
+ *
|
|
||||||
+ * This file add support for AES cipher with 128,192,256 bits keysize in
|
|
||||||
+ * CBC and ECB mode.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#include <linux/crypto.h>
|
|
||||||
+#include <linux/delay.h>
|
|
||||||
+#include <linux/io.h>
|
|
||||||
+#include <crypto/scatterwalk.h>
|
|
||||||
+#include <linux/scatterlist.h>
|
|
||||||
+#include <linux/dma-mapping.h>
|
|
||||||
+#include <crypto/internal/skcipher.h>
|
|
||||||
+#include "amlogic-gxl.h"
|
|
||||||
+
|
|
||||||
+static int get_engine_number(struct meson_dev *mc)
|
|
||||||
+{
|
|
||||||
+ return atomic_inc_return(&mc->flow) % MAXFLOW;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static bool meson_cipher_need_fallback(struct skcipher_request *areq)
|
|
||||||
+{
|
|
||||||
+ struct scatterlist *src_sg = areq->src;
|
|
||||||
+ struct scatterlist *dst_sg = areq->dst;
|
|
||||||
+
|
|
||||||
+ if (areq->cryptlen == 0)
|
|
||||||
+ return true;
|
|
||||||
+
|
|
||||||
+ if (sg_nents(src_sg) != sg_nents(dst_sg))
|
|
||||||
+ return true;
|
|
||||||
+
|
|
||||||
+ /* KEY/IV descriptors use 3 desc */
|
|
||||||
+ if (sg_nents(src_sg) > MAXDESC - 3 || sg_nents(dst_sg) > MAXDESC - 3)
|
|
||||||
+ return true;
|
|
||||||
+
|
|
||||||
+ while (src_sg && dst_sg) {
|
|
||||||
+ if ((src_sg->length % 16) != 0)
|
|
||||||
+ return true;
|
|
||||||
+ if ((dst_sg->length % 16) != 0)
|
|
||||||
+ return true;
|
|
||||||
+ if (src_sg->length != dst_sg->length)
|
|
||||||
+ return true;
|
|
||||||
+ if (!IS_ALIGNED(src_sg->offset, sizeof(u32)))
|
|
||||||
+ return true;
|
|
||||||
+ if (!IS_ALIGNED(dst_sg->offset, sizeof(u32)))
|
|
||||||
+ return true;
|
|
||||||
+ src_sg = sg_next(src_sg);
|
|
||||||
+ dst_sg = sg_next(dst_sg);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return false;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int meson_cipher_do_fallback(struct skcipher_request *areq)
|
|
||||||
+{
|
|
||||||
+ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
|
|
||||||
+ struct meson_cipher_tfm_ctx *op = crypto_skcipher_ctx(tfm);
|
|
||||||
+ struct meson_cipher_req_ctx *rctx = skcipher_request_ctx(areq);
|
|
||||||
+ int err;
|
|
||||||
+#ifdef CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG
|
|
||||||
+ struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
|
|
||||||
+ struct meson_alg_template *algt;
|
|
||||||
+#endif
|
|
||||||
+ SYNC_SKCIPHER_REQUEST_ON_STACK(req, op->fallback_tfm);
|
|
||||||
+
|
|
||||||
+#ifdef CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG
|
|
||||||
+ algt = container_of(alg, struct meson_alg_template, alg.skcipher);
|
|
||||||
+ algt->stat_fb++;
|
|
||||||
+#endif
|
|
||||||
+ skcipher_request_set_sync_tfm(req, op->fallback_tfm);
|
|
||||||
+ skcipher_request_set_callback(req, areq->base.flags, NULL, NULL);
|
|
||||||
+ skcipher_request_set_crypt(req, areq->src, areq->dst,
|
|
||||||
+ areq->cryptlen, areq->iv);
|
|
||||||
+ if (rctx->op_dir == MESON_DECRYPT)
|
|
||||||
+ err = crypto_skcipher_decrypt(req);
|
|
||||||
+ else
|
|
||||||
+ err = crypto_skcipher_encrypt(req);
|
|
||||||
+ skcipher_request_zero(req);
|
|
||||||
+ return err;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int meson_cipher(struct skcipher_request *areq)
|
|
||||||
+{
|
|
||||||
+ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
|
|
||||||
+ struct meson_cipher_tfm_ctx *op = crypto_skcipher_ctx(tfm);
|
|
||||||
+ struct meson_cipher_req_ctx *rctx = skcipher_request_ctx(areq);
|
|
||||||
+ struct meson_dev *mc = op->mc;
|
|
||||||
+ struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
|
|
||||||
+ struct meson_alg_template *algt;
|
|
||||||
+ int flow = rctx->flow;
|
|
||||||
+ unsigned int todo, eat, len;
|
|
||||||
+ struct scatterlist *src_sg = areq->src;
|
|
||||||
+ struct scatterlist *dst_sg = areq->dst;
|
|
||||||
+ struct meson_desc *desc;
|
|
||||||
+ int nr_sgs, nr_sgd;
|
|
||||||
+ int i, err = 0;
|
|
||||||
+ unsigned int keyivlen, ivsize, offset, tloffset;
|
|
||||||
+ dma_addr_t phykeyiv;
|
|
||||||
+ void *backup_iv = NULL, *bkeyiv;
|
|
||||||
+
|
|
||||||
+ algt = container_of(alg, struct meson_alg_template, alg.skcipher);
|
|
||||||
+
|
|
||||||
+ dev_dbg(mc->dev, "%s %s %u %x IV(%u) key=%u flow=%d\n", __func__,
|
|
||||||
+ crypto_tfm_alg_name(areq->base.tfm),
|
|
||||||
+ areq->cryptlen,
|
|
||||||
+ rctx->op_dir, crypto_skcipher_ivsize(tfm),
|
|
||||||
+ op->keylen, flow);
|
|
||||||
+
|
|
||||||
+#ifdef CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG
|
|
||||||
+ algt->stat_req++;
|
|
||||||
+ mc->chanlist[flow].stat_req++;
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * The hardware expect a list of meson_desc structures.
|
|
||||||
+ * The 2 first structures store key
|
|
||||||
+ * The third stores IV
|
|
||||||
+ */
|
|
||||||
+ bkeyiv = kzalloc(48, GFP_KERNEL | GFP_DMA);
|
|
||||||
+ if (!bkeyiv)
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+
|
|
||||||
+ memcpy(bkeyiv, op->key, op->keylen);
|
|
||||||
+ keyivlen = op->keylen;
|
|
||||||
+
|
|
||||||
+ ivsize = crypto_skcipher_ivsize(tfm);
|
|
||||||
+ if (areq->iv && ivsize > 0) {
|
|
||||||
+ if (ivsize > areq->cryptlen) {
|
|
||||||
+ dev_err(mc->dev, "invalid ivsize=%d vs len=%d\n", ivsize, areq->cryptlen);
|
|
||||||
+ return -EINVAL;
|
|
||||||
+ }
|
|
||||||
+ memcpy(bkeyiv + 32, areq->iv, ivsize);
|
|
||||||
+ keyivlen = 48;
|
|
||||||
+ if (rctx->op_dir == MESON_DECRYPT) {
|
|
||||||
+ backup_iv = kzalloc(ivsize, GFP_KERNEL);
|
|
||||||
+ if (!backup_iv) {
|
|
||||||
+ err = -ENOMEM;
|
|
||||||
+ goto theend;
|
|
||||||
+ }
|
|
||||||
+ offset = areq->cryptlen - ivsize;
|
|
||||||
+ scatterwalk_map_and_copy(backup_iv, areq->src, offset,
|
|
||||||
+ ivsize, 0);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (keyivlen == 24)
|
|
||||||
+ keyivlen = 32;
|
|
||||||
+
|
|
||||||
+ phykeyiv = dma_map_single(mc->dev, bkeyiv, keyivlen,
|
|
||||||
+ DMA_TO_DEVICE);
|
|
||||||
+ if (dma_mapping_error(mc->dev, phykeyiv)) {
|
|
||||||
+ dev_err(mc->dev, "Cannot DMA MAP KEY IV\n");
|
|
||||||
+ return -EFAULT;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ tloffset = 0;
|
|
||||||
+ eat = 0;
|
|
||||||
+ i = 0;
|
|
||||||
+ while (keyivlen > eat) {
|
|
||||||
+ desc = &mc->chanlist[flow].tl[tloffset];
|
|
||||||
+ memset(desc, 0, sizeof(struct meson_desc));
|
|
||||||
+ todo = min(keyivlen - eat, 16u);
|
|
||||||
+ desc->t_src = phykeyiv + i * 16;
|
|
||||||
+ desc->t_dst = i * 16;
|
|
||||||
+ desc->len = 16;
|
|
||||||
+ desc->mode = MODE_KEY;
|
|
||||||
+ desc->owner = 1;
|
|
||||||
+ eat += todo;
|
|
||||||
+ i++;
|
|
||||||
+ tloffset++;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (areq->src == areq->dst) {
|
|
||||||
+ nr_sgs = dma_map_sg(mc->dev, areq->src, sg_nents(areq->src),
|
|
||||||
+ DMA_BIDIRECTIONAL);
|
|
||||||
+ if (nr_sgs < 0) {
|
|
||||||
+ dev_err(mc->dev, "Invalid SG count %d\n", nr_sgs);
|
|
||||||
+ err = -EINVAL;
|
|
||||||
+ goto theend;
|
|
||||||
+ }
|
|
||||||
+ nr_sgd = nr_sgs;
|
|
||||||
+ } else {
|
|
||||||
+ nr_sgs = dma_map_sg(mc->dev, areq->src, sg_nents(areq->src),
|
|
||||||
+ DMA_TO_DEVICE);
|
|
||||||
+ if (nr_sgs < 0 || nr_sgs > MAXDESC - 3) {
|
|
||||||
+ dev_err(mc->dev, "Invalid SG count %d\n", nr_sgs);
|
|
||||||
+ err = -EINVAL;
|
|
||||||
+ goto theend;
|
|
||||||
+ }
|
|
||||||
+ nr_sgd = dma_map_sg(mc->dev, areq->dst, sg_nents(areq->dst),
|
|
||||||
+ DMA_FROM_DEVICE);
|
|
||||||
+ if (nr_sgd < 0 || nr_sgd > MAXDESC - 3) {
|
|
||||||
+ dev_err(mc->dev, "Invalid SG count %d\n", nr_sgd);
|
|
||||||
+ err = -EINVAL;
|
|
||||||
+ goto theend;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ src_sg = areq->src;
|
|
||||||
+ dst_sg = areq->dst;
|
|
||||||
+ len = areq->cryptlen;
|
|
||||||
+ while (src_sg) {
|
|
||||||
+ desc = &mc->chanlist[flow].tl[tloffset];
|
|
||||||
+ memset(desc, 0, sizeof(struct meson_desc));
|
|
||||||
+
|
|
||||||
+ desc->t_src = sg_dma_address(src_sg);
|
|
||||||
+ desc->t_dst = sg_dma_address(dst_sg);
|
|
||||||
+ todo = min(len, sg_dma_len(src_sg));
|
|
||||||
+ desc->owner = 1;
|
|
||||||
+ desc->len = todo;
|
|
||||||
+ desc->mode = op->keymode;
|
|
||||||
+ desc->op_mode = algt->blockmode;
|
|
||||||
+ desc->enc = rctx->op_dir;
|
|
||||||
+ len -= todo;
|
|
||||||
+
|
|
||||||
+ if (!sg_next(src_sg))
|
|
||||||
+ desc->eoc = 1;
|
|
||||||
+ tloffset++;
|
|
||||||
+ src_sg = sg_next(src_sg);
|
|
||||||
+ dst_sg = sg_next(dst_sg);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ reinit_completion(&mc->chanlist[flow].complete);
|
|
||||||
+ mc->chanlist[flow].status = 0;
|
|
||||||
+ writel(mc->chanlist[flow].t_phy | 2, mc->base + (flow << 2));
|
|
||||||
+ wait_for_completion_interruptible_timeout(&mc->chanlist[flow].complete,
|
|
||||||
+ msecs_to_jiffies(500));
|
|
||||||
+ if (mc->chanlist[flow].status == 0) {
|
|
||||||
+ dev_err(mc->dev, "DMA timeout for flow %d\n", flow);
|
|
||||||
+ err = -EINVAL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ dma_unmap_single(mc->dev, phykeyiv, keyivlen, DMA_TO_DEVICE);
|
|
||||||
+
|
|
||||||
+ if (areq->src == areq->dst) {
|
|
||||||
+ dma_unmap_sg(mc->dev, areq->src, nr_sgs, DMA_BIDIRECTIONAL);
|
|
||||||
+ } else {
|
|
||||||
+ dma_unmap_sg(mc->dev, areq->src, nr_sgs, DMA_TO_DEVICE);
|
|
||||||
+ dma_unmap_sg(mc->dev, areq->dst, nr_sgd, DMA_FROM_DEVICE);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (areq->iv && ivsize > 0) {
|
|
||||||
+ if (rctx->op_dir == MESON_DECRYPT) {
|
|
||||||
+ memcpy(areq->iv, backup_iv, ivsize);
|
|
||||||
+ kzfree(backup_iv);
|
|
||||||
+ } else {
|
|
||||||
+ scatterwalk_map_and_copy(areq->iv, areq->dst,
|
|
||||||
+ areq->cryptlen - ivsize,
|
|
||||||
+ ivsize, 0);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+theend:
|
|
||||||
+ kzfree(bkeyiv);
|
|
||||||
+
|
|
||||||
+ return err;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int meson_handle_cipher_request(struct crypto_engine *engine,
|
|
||||||
+ void *areq)
|
|
||||||
+{
|
|
||||||
+ int err;
|
|
||||||
+ struct skcipher_request *breq = container_of(areq, struct skcipher_request, base);
|
|
||||||
+
|
|
||||||
+ err = meson_cipher(breq);
|
|
||||||
+ crypto_finalize_skcipher_request(engine, breq, err);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int meson_skdecrypt(struct skcipher_request *areq)
|
|
||||||
+{
|
|
||||||
+ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
|
|
||||||
+ struct meson_cipher_tfm_ctx *op = crypto_skcipher_ctx(tfm);
|
|
||||||
+ struct meson_cipher_req_ctx *rctx = skcipher_request_ctx(areq);
|
|
||||||
+ struct crypto_engine *engine;
|
|
||||||
+ int e;
|
|
||||||
+
|
|
||||||
+ rctx->op_dir = MESON_DECRYPT;
|
|
||||||
+ if (meson_cipher_need_fallback(areq))
|
|
||||||
+ return meson_cipher_do_fallback(areq);
|
|
||||||
+ e = get_engine_number(op->mc);
|
|
||||||
+ engine = op->mc->chanlist[e].engine;
|
|
||||||
+ rctx->flow = e;
|
|
||||||
+
|
|
||||||
+ return crypto_transfer_skcipher_request_to_engine(engine, areq);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int meson_skencrypt(struct skcipher_request *areq)
|
|
||||||
+{
|
|
||||||
+ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
|
|
||||||
+ struct meson_cipher_tfm_ctx *op = crypto_skcipher_ctx(tfm);
|
|
||||||
+ struct meson_cipher_req_ctx *rctx = skcipher_request_ctx(areq);
|
|
||||||
+ struct crypto_engine *engine;
|
|
||||||
+ int e;
|
|
||||||
+
|
|
||||||
+ rctx->op_dir = MESON_ENCRYPT;
|
|
||||||
+ if (meson_cipher_need_fallback(areq))
|
|
||||||
+ return meson_cipher_do_fallback(areq);
|
|
||||||
+ e = get_engine_number(op->mc);
|
|
||||||
+ engine = op->mc->chanlist[e].engine;
|
|
||||||
+ rctx->flow = e;
|
|
||||||
+
|
|
||||||
+ return crypto_transfer_skcipher_request_to_engine(engine, areq);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int meson_cipher_init(struct crypto_tfm *tfm)
|
|
||||||
+{
|
|
||||||
+ struct meson_cipher_tfm_ctx *op = crypto_tfm_ctx(tfm);
|
|
||||||
+ struct meson_alg_template *algt;
|
|
||||||
+ const char *name = crypto_tfm_alg_name(tfm);
|
|
||||||
+ struct crypto_skcipher *sktfm = __crypto_skcipher_cast(tfm);
|
|
||||||
+ struct skcipher_alg *alg = crypto_skcipher_alg(sktfm);
|
|
||||||
+
|
|
||||||
+ memset(op, 0, sizeof(struct meson_cipher_tfm_ctx));
|
|
||||||
+
|
|
||||||
+ algt = container_of(alg, struct meson_alg_template, alg.skcipher);
|
|
||||||
+ op->mc = algt->mc;
|
|
||||||
+
|
|
||||||
+ sktfm->reqsize = sizeof(struct meson_cipher_req_ctx);
|
|
||||||
+
|
|
||||||
+ op->fallback_tfm = crypto_alloc_sync_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
|
|
||||||
+ if (IS_ERR(op->fallback_tfm)) {
|
|
||||||
+ dev_err(op->mc->dev, "ERROR: Cannot allocate fallback for %s %ld\n",
|
|
||||||
+ name, PTR_ERR(op->fallback_tfm));
|
|
||||||
+ return PTR_ERR(op->fallback_tfm);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ op->enginectx.op.do_one_request = meson_handle_cipher_request;
|
|
||||||
+ op->enginectx.op.prepare_request = NULL;
|
|
||||||
+ op->enginectx.op.unprepare_request = NULL;
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void meson_cipher_exit(struct crypto_tfm *tfm)
|
|
||||||
+{
|
|
||||||
+ struct meson_cipher_tfm_ctx *op = crypto_tfm_ctx(tfm);
|
|
||||||
+
|
|
||||||
+ if (op->key) {
|
|
||||||
+ memzero_explicit(op->key, op->keylen);
|
|
||||||
+ kfree(op->key);
|
|
||||||
+ }
|
|
||||||
+ crypto_free_sync_skcipher(op->fallback_tfm);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int meson_aes_setkey(struct crypto_skcipher *tfm, const u8 *key,
|
|
||||||
+ unsigned int keylen)
|
|
||||||
+{
|
|
||||||
+ struct meson_cipher_tfm_ctx *op = crypto_skcipher_ctx(tfm);
|
|
||||||
+ struct meson_dev *mc = op->mc;
|
|
||||||
+
|
|
||||||
+ switch (keylen) {
|
|
||||||
+ case 128 / 8:
|
|
||||||
+ op->keymode = MODE_AES_128;
|
|
||||||
+ break;
|
|
||||||
+ case 192 / 8:
|
|
||||||
+ op->keymode = MODE_AES_192;
|
|
||||||
+ break;
|
|
||||||
+ case 256 / 8:
|
|
||||||
+ op->keymode = MODE_AES_256;
|
|
||||||
+ break;
|
|
||||||
+ default:
|
|
||||||
+ dev_dbg(mc->dev, "ERROR: Invalid keylen %u\n", keylen);
|
|
||||||
+ crypto_skcipher_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
|
|
||||||
+ return -EINVAL;
|
|
||||||
+ }
|
|
||||||
+ if (op->key) {
|
|
||||||
+ memzero_explicit(op->key, op->keylen);
|
|
||||||
+ kfree(op->key);
|
|
||||||
+ }
|
|
||||||
+ op->keylen = keylen;
|
|
||||||
+ op->key = kmalloc(keylen, GFP_KERNEL | GFP_DMA);
|
|
||||||
+ if (!op->key)
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+ memcpy(op->key, key, keylen);
|
|
||||||
+
|
|
||||||
+ return crypto_sync_skcipher_setkey(op->fallback_tfm, key, keylen);
|
|
||||||
+}
|
|
||||||
diff --git a/drivers/crypto/amlogic/amlogic-gxl-core.c b/drivers/crypto/amlogic/amlogic-gxl-core.c
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000000..db5b421e88d8
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/crypto/amlogic/amlogic-gxl-core.c
|
|
||||||
@@ -0,0 +1,331 @@
|
|
||||||
+// SPDX-License-Identifier: GPL-2.0
|
|
||||||
+/*
|
|
||||||
+ * amlgoic-core.c - hardware cryptographic offloader for Amlogic GXL SoC
|
|
||||||
+ *
|
|
||||||
+ * Copyright (C) 2018-2019 Corentin Labbe <clabbe@baylibre.com>
|
|
||||||
+ *
|
|
||||||
+ * Core file which registers crypto algorithms supported by the hardware.
|
|
||||||
+ */
|
|
||||||
+#include <linux/clk.h>
|
|
||||||
+#include <linux/crypto.h>
|
|
||||||
+#include <linux/io.h>
|
|
||||||
+#include <linux/interrupt.h>
|
|
||||||
+#include <linux/irq.h>
|
|
||||||
+#include <linux/module.h>
|
|
||||||
+#include <linux/of.h>
|
|
||||||
+#include <linux/of_device.h>
|
|
||||||
+#include <linux/platform_device.h>
|
|
||||||
+#include <crypto/internal/skcipher.h>
|
|
||||||
+#include <linux/dma-mapping.h>
|
|
||||||
+
|
|
||||||
+#include "amlogic-gxl.h"
|
|
||||||
+
|
|
||||||
+static irqreturn_t meson_irq_handler(int irq, void *data)
|
|
||||||
+{
|
|
||||||
+ struct meson_dev *mc = (struct meson_dev *)data;
|
|
||||||
+ int flow;
|
|
||||||
+ u32 p;
|
|
||||||
+
|
|
||||||
+ for (flow = 0; flow < MAXFLOW; flow++) {
|
|
||||||
+ if (mc->irqs[flow] == irq) {
|
|
||||||
+ p = readl(mc->base + ((0x04 + flow) << 2));
|
|
||||||
+ if (p) {
|
|
||||||
+ writel_relaxed(0xF, mc->base + ((0x4 + flow) << 2));
|
|
||||||
+ mc->chanlist[flow].status = 1;
|
|
||||||
+ complete(&mc->chanlist[flow].complete);
|
|
||||||
+ return IRQ_HANDLED;
|
|
||||||
+ }
|
|
||||||
+ dev_err(mc->dev, "%s %d Got irq for flow %d but ctrl is empty\n", __func__, irq, flow);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ dev_err(mc->dev, "%s %d from unknown irq\n", __func__, irq);
|
|
||||||
+ return IRQ_HANDLED;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static struct meson_alg_template mc_algs[] = {
|
|
||||||
+{
|
|
||||||
+ .type = CRYPTO_ALG_TYPE_SKCIPHER,
|
|
||||||
+ .blockmode = MESON_OPMODE_CBC,
|
|
||||||
+ .alg.skcipher = {
|
|
||||||
+ .base = {
|
|
||||||
+ .cra_name = "cbc(aes)",
|
|
||||||
+ .cra_driver_name = "cbc-aes-gxl",
|
|
||||||
+ .cra_priority = 400,
|
|
||||||
+ .cra_blocksize = AES_BLOCK_SIZE,
|
|
||||||
+ .cra_flags = CRYPTO_ALG_TYPE_SKCIPHER |
|
|
||||||
+ CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
|
|
||||||
+ .cra_ctxsize = sizeof(struct meson_cipher_tfm_ctx),
|
|
||||||
+ .cra_module = THIS_MODULE,
|
|
||||||
+ .cra_alignmask = 0xf,
|
|
||||||
+ .cra_init = meson_cipher_init,
|
|
||||||
+ .cra_exit = meson_cipher_exit,
|
|
||||||
+ },
|
|
||||||
+ .min_keysize = AES_MIN_KEY_SIZE,
|
|
||||||
+ .max_keysize = AES_MAX_KEY_SIZE,
|
|
||||||
+ .ivsize = AES_BLOCK_SIZE,
|
|
||||||
+ .setkey = meson_aes_setkey,
|
|
||||||
+ .encrypt = meson_skencrypt,
|
|
||||||
+ .decrypt = meson_skdecrypt,
|
|
||||||
+ }
|
|
||||||
+},
|
|
||||||
+{
|
|
||||||
+ .type = CRYPTO_ALG_TYPE_SKCIPHER,
|
|
||||||
+ .blockmode = MESON_OPMODE_ECB,
|
|
||||||
+ .alg.skcipher = {
|
|
||||||
+ .base = {
|
|
||||||
+ .cra_name = "ecb(aes)",
|
|
||||||
+ .cra_driver_name = "ecb-aes-gxl",
|
|
||||||
+ .cra_priority = 400,
|
|
||||||
+ .cra_blocksize = AES_BLOCK_SIZE,
|
|
||||||
+ .cra_flags = CRYPTO_ALG_TYPE_SKCIPHER |
|
|
||||||
+ CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
|
|
||||||
+ .cra_ctxsize = sizeof(struct meson_cipher_tfm_ctx),
|
|
||||||
+ .cra_module = THIS_MODULE,
|
|
||||||
+ .cra_alignmask = 0xf,
|
|
||||||
+ .cra_init = meson_cipher_init,
|
|
||||||
+ .cra_exit = meson_cipher_exit,
|
|
||||||
+ },
|
|
||||||
+ .min_keysize = AES_MIN_KEY_SIZE,
|
|
||||||
+ .max_keysize = AES_MAX_KEY_SIZE,
|
|
||||||
+ .setkey = meson_aes_setkey,
|
|
||||||
+ .encrypt = meson_skencrypt,
|
|
||||||
+ .decrypt = meson_skdecrypt,
|
|
||||||
+ }
|
|
||||||
+},
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+#ifdef CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG
|
|
||||||
+static int meson_dbgfs_read(struct seq_file *seq, void *v)
|
|
||||||
+{
|
|
||||||
+ struct meson_dev *mc = seq->private;
|
|
||||||
+ int i;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < MAXFLOW; i++)
|
|
||||||
+ seq_printf(seq, "Channel %d: nreq %lu\n", i, mc->chanlist[i].stat_req);
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < ARRAY_SIZE(mc_algs); i++) {
|
|
||||||
+ switch (mc_algs[i].type) {
|
|
||||||
+ case CRYPTO_ALG_TYPE_SKCIPHER:
|
|
||||||
+ seq_printf(seq, "%s %s %lu %lu\n",
|
|
||||||
+ mc_algs[i].alg.skcipher.base.cra_driver_name,
|
|
||||||
+ mc_algs[i].alg.skcipher.base.cra_name,
|
|
||||||
+ mc_algs[i].stat_req, mc_algs[i].stat_fb);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int meson_dbgfs_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, meson_dbgfs_read, inode->i_private);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations meson_debugfs_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = meson_dbgfs_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+static void meson_free_chanlist(struct meson_dev *mc, int i)
|
|
||||||
+{
|
|
||||||
+ while (i >= 0) {
|
|
||||||
+ crypto_engine_exit(mc->chanlist[i].engine);
|
|
||||||
+ if (mc->chanlist[i].tl)
|
|
||||||
+ dma_free_coherent(mc->dev, sizeof(struct meson_desc) * MAXDESC,
|
|
||||||
+ mc->chanlist[i].tl,
|
|
||||||
+ mc->chanlist[i].t_phy);
|
|
||||||
+ i--;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * Allocate the channel list structure
|
|
||||||
+ */
|
|
||||||
+static int meson_allocate_chanlist(struct meson_dev *mc)
|
|
||||||
+{
|
|
||||||
+ int i, err;
|
|
||||||
+
|
|
||||||
+ mc->chanlist = devm_kcalloc(mc->dev, MAXFLOW,
|
|
||||||
+ sizeof(struct meson_flow), GFP_KERNEL);
|
|
||||||
+ if (!mc->chanlist)
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < MAXFLOW; i++) {
|
|
||||||
+ init_completion(&mc->chanlist[i].complete);
|
|
||||||
+
|
|
||||||
+ mc->chanlist[i].engine = crypto_engine_alloc_init(mc->dev, true);
|
|
||||||
+ if (!mc->chanlist[i].engine) {
|
|
||||||
+ dev_err(mc->dev, "Cannot allocate engine\n");
|
|
||||||
+ i--;
|
|
||||||
+ goto error_engine;
|
|
||||||
+ }
|
|
||||||
+ err = crypto_engine_start(mc->chanlist[i].engine);
|
|
||||||
+ if (err) {
|
|
||||||
+ dev_err(mc->dev, "Cannot start engine\n");
|
|
||||||
+ goto error_engine;
|
|
||||||
+ }
|
|
||||||
+ mc->chanlist[i].tl = dma_alloc_coherent(mc->dev,
|
|
||||||
+ sizeof(struct meson_desc) * MAXDESC,
|
|
||||||
+ &mc->chanlist[i].t_phy,
|
|
||||||
+ GFP_KERNEL);
|
|
||||||
+ if (!mc->chanlist[i].tl) {
|
|
||||||
+ err = -ENOMEM;
|
|
||||||
+ goto error_engine;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ return 0;
|
|
||||||
+error_engine:
|
|
||||||
+ meson_free_chanlist(mc, i);
|
|
||||||
+ return err;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int meson_register_algs(struct meson_dev *mc)
|
|
||||||
+{
|
|
||||||
+ int err, i;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < ARRAY_SIZE(mc_algs); i++) {
|
|
||||||
+ mc_algs[i].mc = mc;
|
|
||||||
+ switch (mc_algs[i].type) {
|
|
||||||
+ case CRYPTO_ALG_TYPE_SKCIPHER:
|
|
||||||
+ err = crypto_register_skcipher(&mc_algs[i].alg.skcipher);
|
|
||||||
+ if (err) {
|
|
||||||
+ dev_err(mc->dev, "Fail to register %s\n",
|
|
||||||
+ mc_algs[i].alg.skcipher.base.cra_name);
|
|
||||||
+ mc_algs[i].mc = NULL;
|
|
||||||
+ return err;
|
|
||||||
+ }
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void meson_unregister_algs(struct meson_dev *mc)
|
|
||||||
+{
|
|
||||||
+ int i;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < ARRAY_SIZE(mc_algs); i++) {
|
|
||||||
+ if (!mc_algs[i].mc)
|
|
||||||
+ continue;
|
|
||||||
+ switch (mc_algs[i].type) {
|
|
||||||
+ case CRYPTO_ALG_TYPE_SKCIPHER:
|
|
||||||
+ crypto_unregister_skcipher(&mc_algs[i].alg.skcipher);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int meson_crypto_probe(struct platform_device *pdev)
|
|
||||||
+{
|
|
||||||
+ struct meson_dev *mc;
|
|
||||||
+ int err, i;
|
|
||||||
+
|
|
||||||
+ if (!pdev->dev.of_node)
|
|
||||||
+ return -ENODEV;
|
|
||||||
+
|
|
||||||
+ mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL);
|
|
||||||
+ if (!mc)
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+
|
|
||||||
+ mc->dev = &pdev->dev;
|
|
||||||
+ platform_set_drvdata(pdev, mc);
|
|
||||||
+
|
|
||||||
+ mc->base = devm_platform_ioremap_resource(pdev, 0);
|
|
||||||
+ if (IS_ERR(mc->base)) {
|
|
||||||
+ err = PTR_ERR(mc->base);
|
|
||||||
+ dev_err(&pdev->dev, "Cannot request MMIO err=%d\n", err);
|
|
||||||
+ return err;
|
|
||||||
+ }
|
|
||||||
+ mc->busclk = devm_clk_get(&pdev->dev, "blkmv");
|
|
||||||
+ if (IS_ERR(mc->busclk)) {
|
|
||||||
+ err = PTR_ERR(mc->busclk);
|
|
||||||
+ dev_err(&pdev->dev, "Cannot get core clock err=%d\n", err);
|
|
||||||
+ return err;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ mc->irqs = devm_kcalloc(mc->dev, MAXFLOW, sizeof(int), GFP_KERNEL);
|
|
||||||
+ for (i = 0; i < MAXFLOW; i++) {
|
|
||||||
+ mc->irqs[i] = platform_get_irq(pdev, i);
|
|
||||||
+ if (mc->irqs[i] < 0) {
|
|
||||||
+ dev_err(mc->dev, "Cannot get IRQ for flow %d\n", i);
|
|
||||||
+ return mc->irqs[i];
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ err = devm_request_irq(&pdev->dev, mc->irqs[i], meson_irq_handler, 0,
|
|
||||||
+ "gxl-crypto", mc);
|
|
||||||
+ if (err < 0) {
|
|
||||||
+ dev_err(mc->dev, "Cannot request IRQ for flow %d\n", i);
|
|
||||||
+ return err;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ err = clk_prepare_enable(mc->busclk);
|
|
||||||
+ if (err != 0) {
|
|
||||||
+ dev_err(&pdev->dev, "Cannot prepare_enable busclk\n");
|
|
||||||
+ return err;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ err = meson_allocate_chanlist(mc);
|
|
||||||
+ if (err)
|
|
||||||
+ goto error_flow;
|
|
||||||
+
|
|
||||||
+ err = meson_register_algs(mc);
|
|
||||||
+ if (err)
|
|
||||||
+ goto error_alg;
|
|
||||||
+
|
|
||||||
+#ifdef CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG
|
|
||||||
+ mc->dbgfs_dir = debugfs_create_dir("gxl-crypto", NULL);
|
|
||||||
+ debugfs_create_file("stats", 0444, mc->dbgfs_dir, mc, &meson_debugfs_fops);
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+error_alg:
|
|
||||||
+ meson_unregister_algs(mc);
|
|
||||||
+error_flow:
|
|
||||||
+ meson_free_chanlist(mc, MAXFLOW);
|
|
||||||
+ clk_disable_unprepare(mc->busclk);
|
|
||||||
+ return err;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int meson_crypto_remove(struct platform_device *pdev)
|
|
||||||
+{
|
|
||||||
+ struct meson_dev *mc = platform_get_drvdata(pdev);
|
|
||||||
+
|
|
||||||
+#ifdef CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG
|
|
||||||
+ debugfs_remove_recursive(mc->dbgfs_dir);
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+ meson_unregister_algs(mc);
|
|
||||||
+
|
|
||||||
+ meson_free_chanlist(mc, MAXFLOW);
|
|
||||||
+
|
|
||||||
+ clk_disable_unprepare(mc->busclk);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct of_device_id meson_crypto_of_match_table[] = {
|
|
||||||
+ { .compatible = "amlogic,gxl-crypto", },
|
|
||||||
+ {}
|
|
||||||
+};
|
|
||||||
+MODULE_DEVICE_TABLE(of, meson_crypto_of_match_table);
|
|
||||||
+
|
|
||||||
+static struct platform_driver meson_crypto_driver = {
|
|
||||||
+ .probe = meson_crypto_probe,
|
|
||||||
+ .remove = meson_crypto_remove,
|
|
||||||
+ .driver = {
|
|
||||||
+ .name = "gxl-crypto",
|
|
||||||
+ .of_match_table = meson_crypto_of_match_table,
|
|
||||||
+ },
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+module_platform_driver(meson_crypto_driver);
|
|
||||||
+
|
|
||||||
+MODULE_DESCRIPTION("Amlogic GXL cryptographic offloader");
|
|
||||||
+MODULE_LICENSE("GPL");
|
|
||||||
+MODULE_AUTHOR("Corentin Labbe <clabbe@baylibre.com>");
|
|
||||||
diff --git a/drivers/crypto/amlogic/amlogic-gxl.h b/drivers/crypto/amlogic/amlogic-gxl.h
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000000..fd9192b4050b
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/crypto/amlogic/amlogic-gxl.h
|
|
||||||
@@ -0,0 +1,170 @@
|
|
||||||
+/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
+/*
|
|
||||||
+ * amlogic.h - hardware cryptographic offloader for Amlogic SoC
|
|
||||||
+ *
|
|
||||||
+ * Copyright (C) 2018-2019 Corentin LABBE <clabbe@baylibre.com>
|
|
||||||
+ */
|
|
||||||
+#include <crypto/aes.h>
|
|
||||||
+#include <crypto/engine.h>
|
|
||||||
+#include <crypto/skcipher.h>
|
|
||||||
+#include <linux/debugfs.h>
|
|
||||||
+#include <linux/crypto.h>
|
|
||||||
+#include <linux/scatterlist.h>
|
|
||||||
+
|
|
||||||
+#define MODE_KEY 1
|
|
||||||
+#define MODE_AES_128 0x8
|
|
||||||
+#define MODE_AES_192 0x9
|
|
||||||
+#define MODE_AES_256 0xa
|
|
||||||
+
|
|
||||||
+#define MESON_DECRYPT 0
|
|
||||||
+#define MESON_ENCRYPT 1
|
|
||||||
+
|
|
||||||
+#define MESON_OPMODE_ECB 0
|
|
||||||
+#define MESON_OPMODE_CBC 1
|
|
||||||
+
|
|
||||||
+#define MAXFLOW 2
|
|
||||||
+
|
|
||||||
+#define MAXDESC 64
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * struct meson_desc - Descriptor for DMA operations
|
|
||||||
+ * Note that without datasheet, some are unknown
|
|
||||||
+ * @len: length of data to operate
|
|
||||||
+ * @irq: Ignored by hardware
|
|
||||||
+ * @eoc: End of descriptor
|
|
||||||
+ * @loop: Unknown
|
|
||||||
+ * @mode: Type of algorithm (AES, SHA)
|
|
||||||
+ * @begin: Unknown
|
|
||||||
+ * @end: Unknown
|
|
||||||
+ * @op_mode: Blockmode (CBC, ECB)
|
|
||||||
+ * @block: Unknown
|
|
||||||
+ * @error: Unknown
|
|
||||||
+ * @owner: owner of the descriptor, 1 own by HW
|
|
||||||
+ * @t_src: Physical address of data to read
|
|
||||||
+ * @t_dst: Physical address of data to write
|
|
||||||
+ */
|
|
||||||
+struct meson_desc {
|
|
||||||
+ union {
|
|
||||||
+ u32 t_status;
|
|
||||||
+ struct {
|
|
||||||
+ u32 len:17;
|
|
||||||
+ u32 irq:1;
|
|
||||||
+ u32 eoc:1;
|
|
||||||
+ u32 loop:1;
|
|
||||||
+ u32 mode:4;
|
|
||||||
+ u32 begin:1;
|
|
||||||
+ u32 end:1;
|
|
||||||
+ u32 op_mode:2;
|
|
||||||
+ u32 enc:1;
|
|
||||||
+ u32 block:1;
|
|
||||||
+ u32 error:1;
|
|
||||||
+ u32 owner:1;
|
|
||||||
+ };
|
|
||||||
+ };
|
|
||||||
+ u32 t_src;
|
|
||||||
+ u32 t_dst;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * struct meson_flow - Information used by each flow
|
|
||||||
+ * @engine: ptr to the crypto_engine for this flow
|
|
||||||
+ * @keylen: keylen for this flow operation
|
|
||||||
+ * @complete: completion for the current task on this flow
|
|
||||||
+ * @status: set to 1 by interrupt if task is done
|
|
||||||
+ * @t_phy: Physical address of task
|
|
||||||
+ * @tl: pointer to the current ce_task for this flow
|
|
||||||
+ * @stat_req: number of request done by this flow
|
|
||||||
+ */
|
|
||||||
+struct meson_flow {
|
|
||||||
+ struct crypto_engine *engine;
|
|
||||||
+ struct completion complete;
|
|
||||||
+ int status;
|
|
||||||
+ unsigned int keylen;
|
|
||||||
+ dma_addr_t t_phy;
|
|
||||||
+ struct meson_desc *tl;
|
|
||||||
+#ifdef CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG
|
|
||||||
+ unsigned long stat_req;
|
|
||||||
+#endif
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * struct meson_dev - main container for all this driver information
|
|
||||||
+ * @base: base address of amlogic-crypto
|
|
||||||
+ * @busclk: bus clock for amlogic-crypto
|
|
||||||
+ * @dev: the platform device
|
|
||||||
+ * @chanlist: array of all flow
|
|
||||||
+ * @flow: flow to use in next request
|
|
||||||
+ * @irqs: IRQ numbers for amlogic-crypto
|
|
||||||
+ * @dbgfs_dir: Debugfs dentry for statistic directory
|
|
||||||
+ * @dbgfs_stats: Debugfs dentry for statistic counters
|
|
||||||
+ */
|
|
||||||
+struct meson_dev {
|
|
||||||
+ void __iomem *base;
|
|
||||||
+ struct clk *busclk;
|
|
||||||
+ struct device *dev;
|
|
||||||
+ struct meson_flow *chanlist;
|
|
||||||
+ atomic_t flow;
|
|
||||||
+ int *irqs;
|
|
||||||
+#ifdef CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG
|
|
||||||
+ struct dentry *dbgfs_dir;
|
|
||||||
+#endif
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * struct meson_cipher_req_ctx - context for a skcipher request
|
|
||||||
+ * @op_dir: direction (encrypt vs decrypt) for this request
|
|
||||||
+ * @flow: the flow to use for this request
|
|
||||||
+ */
|
|
||||||
+struct meson_cipher_req_ctx {
|
|
||||||
+ u32 op_dir;
|
|
||||||
+ int flow;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * struct meson_cipher_tfm_ctx - context for a skcipher TFM
|
|
||||||
+ * @enginectx: crypto_engine used by this TFM
|
|
||||||
+ * @key: pointer to key data
|
|
||||||
+ * @keylen: len of the key
|
|
||||||
+ * @keymode: The keymode(type and size of key) associated with this TFM
|
|
||||||
+ * @mc: pointer to the private data of driver handling this TFM
|
|
||||||
+ * @fallback_tfm: pointer to the fallback TFM
|
|
||||||
+ */
|
|
||||||
+struct meson_cipher_tfm_ctx {
|
|
||||||
+ struct crypto_engine_ctx enginectx;
|
|
||||||
+ u32 *key;
|
|
||||||
+ u32 keylen;
|
|
||||||
+ u32 keymode;
|
|
||||||
+ struct meson_dev *mc;
|
|
||||||
+ struct crypto_sync_skcipher *fallback_tfm;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * struct meson_alg_template - crypto_alg template
|
|
||||||
+ * @type: the CRYPTO_ALG_TYPE for this template
|
|
||||||
+ * @blockmode: the type of block operation
|
|
||||||
+ * @mc: pointer to the meson_dev structure associated with this template
|
|
||||||
+ * @alg: one of sub struct must be used
|
|
||||||
+ * @stat_req: number of request done on this template
|
|
||||||
+ * @stat_fb: total of all data len done on this template
|
|
||||||
+ */
|
|
||||||
+struct meson_alg_template {
|
|
||||||
+ u32 type;
|
|
||||||
+ u32 blockmode;
|
|
||||||
+ union {
|
|
||||||
+ struct skcipher_alg skcipher;
|
|
||||||
+ } alg;
|
|
||||||
+ struct meson_dev *mc;
|
|
||||||
+#ifdef CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG
|
|
||||||
+ unsigned long stat_req;
|
|
||||||
+ unsigned long stat_fb;
|
|
||||||
+#endif
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+int meson_enqueue(struct crypto_async_request *areq, u32 type);
|
|
||||||
+
|
|
||||||
+int meson_aes_setkey(struct crypto_skcipher *tfm, const u8 *key,
|
|
||||||
+ unsigned int keylen);
|
|
||||||
+int meson_cipher_init(struct crypto_tfm *tfm);
|
|
||||||
+void meson_cipher_exit(struct crypto_tfm *tfm);
|
|
||||||
+int meson_skdecrypt(struct skcipher_request *areq);
|
|
||||||
+int meson_skencrypt(struct skcipher_request *areq);
|
|
||||||
--
|
|
||||||
2.20.1
|
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
From cd070709d9920ca0d74391ece22be1ecb35bc32f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Qiang Yu <yuq825@gmail.com>
|
||||||
|
Date: Thu, 16 Jan 2020 21:11:54 +0800
|
||||||
|
Subject: [PATCH 002/101] FROMGIT: drm/lima: add lima_vm_map_bo
|
||||||
|
|
||||||
|
For dynamically mapping added backup memory of lima_bo to vm.
|
||||||
|
This is a preparation for adding heap buffer support.
|
||||||
|
|
||||||
|
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||||
|
Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
|
||||||
|
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
||||||
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-3-yuq825@gmail.com
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/lima/lima_vm.c | 42 ++++++++++++++++++++++++++++++++++
|
||||||
|
drivers/gpu/drm/lima/lima_vm.h | 1 +
|
||||||
|
2 files changed, 43 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_vm.c b/drivers/gpu/drm/lima/lima_vm.c
|
||||||
|
index 840e2350d872..2e513841de6c 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_vm.c
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_vm.c
|
||||||
|
@@ -277,3 +277,45 @@ void lima_vm_print(struct lima_vm *vm)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+int lima_vm_map_bo(struct lima_vm *vm, struct lima_bo *bo, int pageoff)
|
||||||
|
+{
|
||||||
|
+ struct lima_bo_va *bo_va;
|
||||||
|
+ struct sg_dma_page_iter sg_iter;
|
||||||
|
+ int offset = 0, err;
|
||||||
|
+ u32 base;
|
||||||
|
+
|
||||||
|
+ mutex_lock(&bo->lock);
|
||||||
|
+
|
||||||
|
+ bo_va = lima_vm_bo_find(vm, bo);
|
||||||
|
+ if (!bo_va) {
|
||||||
|
+ err = -ENOENT;
|
||||||
|
+ goto err_out0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mutex_lock(&vm->lock);
|
||||||
|
+
|
||||||
|
+ base = bo_va->node.start + (pageoff << PAGE_SHIFT);
|
||||||
|
+ for_each_sg_dma_page(bo->base.sgt->sgl, &sg_iter,
|
||||||
|
+ bo->base.sgt->nents, pageoff) {
|
||||||
|
+ err = lima_vm_map_page(vm, sg_page_iter_dma_address(&sg_iter),
|
||||||
|
+ base + offset);
|
||||||
|
+ if (err)
|
||||||
|
+ goto err_out1;
|
||||||
|
+
|
||||||
|
+ offset += PAGE_SIZE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&vm->lock);
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&bo->lock);
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+err_out1:
|
||||||
|
+ if (offset)
|
||||||
|
+ lima_vm_unmap_range(vm, base, base + offset - 1);
|
||||||
|
+ mutex_unlock(&vm->lock);
|
||||||
|
+err_out0:
|
||||||
|
+ mutex_unlock(&bo->lock);
|
||||||
|
+ return err;
|
||||||
|
+}
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_vm.h b/drivers/gpu/drm/lima/lima_vm.h
|
||||||
|
index e0bdedcf14dd..22aeec77d84d 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_vm.h
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_vm.h
|
||||||
|
@@ -58,5 +58,6 @@ static inline void lima_vm_put(struct lima_vm *vm)
|
||||||
|
}
|
||||||
|
|
||||||
|
void lima_vm_print(struct lima_vm *vm);
|
||||||
|
+int lima_vm_map_bo(struct lima_vm *vm, struct lima_bo *bo, int pageoff);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
From e2ee8474ca020935d2dee7cf3493a5d5084dc975 Mon Sep 17 00:00:00 2001
|
From db954006ffe8ce711f43ed562b7fe93ad26bef7d Mon Sep 17 00:00:00 2001
|
||||||
From: Dongjin Kim <tobetter@gmail.com>
|
From: Dongjin Kim <tobetter@gmail.com>
|
||||||
Date: Sun, 15 Mar 2020 02:15:06 +0900
|
Date: Sun, 15 Mar 2020 02:15:06 +0900
|
||||||
Subject: [PATCH] arm64: dts: meson-sm1: add support for Hardkernel ODROID-C4
|
Subject: [PATCH 2/2] arm64: dts: meson-sm1: add support for Hardkernel
|
||||||
|
ODROID-C4
|
||||||
|
|
||||||
Add the board support for the Hardkernel Odroid-C4 single board computer.
|
Add the board support for the Hardkernel Odroid-C4 single board computer.
|
||||||
|
|
||||||
|
@ -14,20 +15,21 @@ Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
arch/arm64/boot/dts/amlogic/Makefile | 1 +
|
arch/arm64/boot/dts/amlogic/Makefile | 1 +
|
||||||
.../boot/dts/amlogic/meson-sm1-odroid-c4.dts | 399 ++++++++++++++++++
|
.../boot/dts/amlogic/meson-sm1-odroid-c4.dts | 399 ++++++++++++++++++
|
||||||
2 files changed, 400 insertions(+)
|
2 files changed, 400 insertions(+)
|
||||||
create mode 100755 arch/arm64/boot/dts/amlogic/meson-sm1-odroid-c4.dts
|
create mode 100644 arch/arm64/boot/dts/amlogic/meson-sm1-odroid-c4.dts
|
||||||
|
|
||||||
diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile
|
diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile
|
||||||
index 84afecba9..1d2fe850e 100644
|
index eef0045320f2..5daab72f5639 100644
|
||||||
--- a/arch/arm64/boot/dts/amlogic/Makefile
|
--- a/arch/arm64/boot/dts/amlogic/Makefile
|
||||||
+++ b/arch/arm64/boot/dts/amlogic/Makefile
|
+++ b/arch/arm64/boot/dts/amlogic/Makefile
|
||||||
@@ -36,3 +36,4 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxm-rbox-pro.dtb
|
@@ -40,4 +40,5 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxm-s912-libretech-pc.dtb
|
||||||
dtb-$(CONFIG_ARCH_MESON) += meson-gxm-vega-s96.dtb
|
dtb-$(CONFIG_ARCH_MESON) += meson-gxm-vega-s96.dtb
|
||||||
dtb-$(CONFIG_ARCH_MESON) += meson-sm1-sei610.dtb
|
dtb-$(CONFIG_ARCH_MESON) += meson-sm1-sei610.dtb
|
||||||
dtb-$(CONFIG_ARCH_MESON) += meson-sm1-khadas-vim3l.dtb
|
dtb-$(CONFIG_ARCH_MESON) += meson-sm1-khadas-vim3l.dtb
|
||||||
+dtb-$(CONFIG_ARCH_MESON) += meson-sm1-odroid-c4.dtb
|
+dtb-$(CONFIG_ARCH_MESON) += meson-sm1-odroid-c4.dtb
|
||||||
|
dtb-$(CONFIG_ARCH_MESON) += meson-a1-ad401.dtb
|
||||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-c4.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-c4.dts
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-c4.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-c4.dts
|
||||||
new file mode 100755
|
new file mode 100644
|
||||||
index 000000000..221572a77
|
index 000000000000..4882c604a7e0
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-c4.dts
|
+++ b/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-c4.dts
|
||||||
@@ -0,0 +1,398 @@
|
@@ -0,0 +1,398 @@
|
||||||
|
@ -394,7 +396,7 @@ index 000000000..221572a77
|
||||||
+/* eMMC */
|
+/* eMMC */
|
||||||
+&sd_emmc_c {
|
+&sd_emmc_c {
|
||||||
+ status = "okay";
|
+ status = "okay";
|
||||||
+ pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>;
|
+ pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>;
|
||||||
+ pinctrl-1 = <&emmc_clk_gate_pins>;
|
+ pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
+ pinctrl-names = "default", "clk-gate";
|
+ pinctrl-names = "default", "clk-gate";
|
||||||
+
|
+
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
From 17bafa64f603b316eed80a0c0fa8c1b66b2ca3c5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Corentin Labbe <clabbe@baylibre.com>
|
|
||||||
Date: Thu, 17 Oct 2019 05:06:26 +0000
|
|
||||||
Subject: [PATCH 4/4] ARM64: dts: amlogic: adds crypto hardware node
|
|
||||||
|
|
||||||
This patch adds the GXL crypto hardware node for all GXL SoCs.
|
|
||||||
|
|
||||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
|
||||||
Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
|
|
||||||
---
|
|
||||||
arch/arm64/boot/dts/amlogic/meson-gxl.dtsi | 10 ++++++++++
|
|
||||||
1 file changed, 10 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
|
|
||||||
index 49ff0a7d0210..ed33d8efaf62 100644
|
|
||||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
|
|
||||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
|
|
||||||
@@ -36,6 +36,16 @@
|
|
||||||
phys = <&usb3_phy>, <&usb2_phy0>, <&usb2_phy1>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
+
|
|
||||||
+ crypto: crypto@c883e000 {
|
|
||||||
+ compatible = "amlogic,gxl-crypto";
|
|
||||||
+ reg = <0x0 0xc883e000 0x0 0x36>;
|
|
||||||
+ interrupts = <GIC_SPI 188 IRQ_TYPE_EDGE_RISING>,
|
|
||||||
+ <GIC_SPI 189 IRQ_TYPE_EDGE_RISING>;
|
|
||||||
+ clocks = <&clkc CLKID_BLKMV>;
|
|
||||||
+ clock-names = "blkmv";
|
|
||||||
+ status = "okay";
|
|
||||||
+ };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
--
|
|
||||||
2.20.1
|
|
||||||
|
|
|
@ -0,0 +1,327 @@
|
||||||
|
From 05408dc5c95dc3dcb7a8f65a7fe99e144e2b18ac Mon Sep 17 00:00:00 2001
|
||||||
|
From: Qiang Yu <yuq825@gmail.com>
|
||||||
|
Date: Thu, 16 Jan 2020 21:11:55 +0800
|
||||||
|
Subject: [PATCH 003/101] FROMGIT: drm/lima: support heap buffer creation
|
||||||
|
|
||||||
|
heap buffer is used as output of GP and input of PP for
|
||||||
|
Mali Utgard GPU. Size of heap buffer depends on the task
|
||||||
|
so is a runtime variable.
|
||||||
|
|
||||||
|
Previously we just create a large enough buffer as heap
|
||||||
|
buffer. Now we add a heap buffer type to be able to
|
||||||
|
increase the backup memory dynamically when GP fail due
|
||||||
|
to lack of heap memory.
|
||||||
|
|
||||||
|
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||||
|
Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
|
||||||
|
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
||||||
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-4-yuq825@gmail.com
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/lima/lima_drv.c | 6 +-
|
||||||
|
drivers/gpu/drm/lima/lima_drv.h | 1 +
|
||||||
|
drivers/gpu/drm/lima/lima_gem.c | 134 ++++++++++++++++++++++++++++++--
|
||||||
|
drivers/gpu/drm/lima/lima_gem.h | 4 +
|
||||||
|
drivers/gpu/drm/lima/lima_vm.c | 4 +-
|
||||||
|
include/uapi/drm/lima_drm.h | 9 ++-
|
||||||
|
6 files changed, 147 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c
|
||||||
|
index 124efe4fa97b..18f88aaef1a2 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_drv.c
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_drv.c
|
||||||
|
@@ -15,10 +15,14 @@
|
||||||
|
#include "lima_vm.h"
|
||||||
|
|
||||||
|
int lima_sched_timeout_ms;
|
||||||
|
+uint lima_heap_init_nr_pages = 8;
|
||||||
|
|
||||||
|
MODULE_PARM_DESC(sched_timeout_ms, "task run timeout in ms");
|
||||||
|
module_param_named(sched_timeout_ms, lima_sched_timeout_ms, int, 0444);
|
||||||
|
|
||||||
|
+MODULE_PARM_DESC(heap_init_nr_pages, "heap buffer init number of pages");
|
||||||
|
+module_param_named(heap_init_nr_pages, lima_heap_init_nr_pages, uint, 0444);
|
||||||
|
+
|
||||||
|
static int lima_ioctl_get_param(struct drm_device *dev, void *data, struct drm_file *file)
|
||||||
|
{
|
||||||
|
struct drm_lima_get_param *args = data;
|
||||||
|
@@ -68,7 +72,7 @@ static int lima_ioctl_gem_create(struct drm_device *dev, void *data, struct drm_
|
||||||
|
if (args->pad)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
- if (args->flags)
|
||||||
|
+ if (args->flags & ~(LIMA_BO_FLAG_HEAP))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (args->size == 0)
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_drv.h b/drivers/gpu/drm/lima/lima_drv.h
|
||||||
|
index 69c7344715c9..f492ecc6a5d9 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_drv.h
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_drv.h
|
||||||
|
@@ -9,6 +9,7 @@
|
||||||
|
#include "lima_ctx.h"
|
||||||
|
|
||||||
|
extern int lima_sched_timeout_ms;
|
||||||
|
+extern uint lima_heap_init_nr_pages;
|
||||||
|
|
||||||
|
struct lima_vm;
|
||||||
|
struct lima_bo;
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_gem.c b/drivers/gpu/drm/lima/lima_gem.c
|
||||||
|
index d0059d8c97d8..5404e0d668db 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_gem.c
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_gem.c
|
||||||
|
@@ -4,6 +4,8 @@
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <linux/sync_file.h>
|
||||||
|
#include <linux/pagemap.h>
|
||||||
|
+#include <linux/shmem_fs.h>
|
||||||
|
+#include <linux/dma-mapping.h>
|
||||||
|
|
||||||
|
#include <drm/drm_file.h>
|
||||||
|
#include <drm/drm_syncobj.h>
|
||||||
|
@@ -15,6 +17,83 @@
|
||||||
|
#include "lima_gem.h"
|
||||||
|
#include "lima_vm.h"
|
||||||
|
|
||||||
|
+int lima_heap_alloc(struct lima_bo *bo, struct lima_vm *vm)
|
||||||
|
+{
|
||||||
|
+ struct page **pages;
|
||||||
|
+ struct address_space *mapping = bo->base.base.filp->f_mapping;
|
||||||
|
+ struct device *dev = bo->base.base.dev->dev;
|
||||||
|
+ size_t old_size = bo->heap_size;
|
||||||
|
+ size_t new_size = bo->heap_size ? bo->heap_size * 2 :
|
||||||
|
+ (lima_heap_init_nr_pages << PAGE_SHIFT);
|
||||||
|
+ struct sg_table sgt;
|
||||||
|
+ int i, ret;
|
||||||
|
+
|
||||||
|
+ if (bo->heap_size >= bo->base.base.size)
|
||||||
|
+ return -ENOSPC;
|
||||||
|
+
|
||||||
|
+ new_size = min(new_size, bo->base.base.size);
|
||||||
|
+
|
||||||
|
+ mutex_lock(&bo->base.pages_lock);
|
||||||
|
+
|
||||||
|
+ if (bo->base.pages) {
|
||||||
|
+ pages = bo->base.pages;
|
||||||
|
+ } else {
|
||||||
|
+ pages = kvmalloc_array(bo->base.base.size >> PAGE_SHIFT,
|
||||||
|
+ sizeof(*pages), GFP_KERNEL | __GFP_ZERO);
|
||||||
|
+ if (!pages) {
|
||||||
|
+ mutex_unlock(&bo->base.pages_lock);
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ bo->base.pages = pages;
|
||||||
|
+ bo->base.pages_use_count = 1;
|
||||||
|
+
|
||||||
|
+ mapping_set_unevictable(mapping);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (i = old_size >> PAGE_SHIFT; i < new_size >> PAGE_SHIFT; i++) {
|
||||||
|
+ struct page *page = shmem_read_mapping_page(mapping, i);
|
||||||
|
+
|
||||||
|
+ if (IS_ERR(page)) {
|
||||||
|
+ mutex_unlock(&bo->base.pages_lock);
|
||||||
|
+ return PTR_ERR(page);
|
||||||
|
+ }
|
||||||
|
+ pages[i] = page;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&bo->base.pages_lock);
|
||||||
|
+
|
||||||
|
+ ret = sg_alloc_table_from_pages(&sgt, pages, i, 0,
|
||||||
|
+ new_size, GFP_KERNEL);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ if (bo->base.sgt) {
|
||||||
|
+ dma_unmap_sg(dev, bo->base.sgt->sgl,
|
||||||
|
+ bo->base.sgt->nents, DMA_BIDIRECTIONAL);
|
||||||
|
+ sg_free_table(bo->base.sgt);
|
||||||
|
+ } else {
|
||||||
|
+ bo->base.sgt = kmalloc(sizeof(*bo->base.sgt), GFP_KERNEL);
|
||||||
|
+ if (!bo->base.sgt) {
|
||||||
|
+ sg_free_table(&sgt);
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ dma_map_sg(dev, sgt.sgl, sgt.nents, DMA_BIDIRECTIONAL);
|
||||||
|
+
|
||||||
|
+ *bo->base.sgt = sgt;
|
||||||
|
+
|
||||||
|
+ if (vm) {
|
||||||
|
+ ret = lima_vm_map_bo(vm, bo, old_size >> PAGE_SHIFT);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ bo->heap_size = new_size;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int lima_gem_create_handle(struct drm_device *dev, struct drm_file *file,
|
||||||
|
u32 size, u32 flags, u32 *handle)
|
||||||
|
{
|
||||||
|
@@ -22,7 +101,8 @@ int lima_gem_create_handle(struct drm_device *dev, struct drm_file *file,
|
||||||
|
gfp_t mask;
|
||||||
|
struct drm_gem_shmem_object *shmem;
|
||||||
|
struct drm_gem_object *obj;
|
||||||
|
- struct sg_table *sgt;
|
||||||
|
+ struct lima_bo *bo;
|
||||||
|
+ bool is_heap = flags & LIMA_BO_FLAG_HEAP;
|
||||||
|
|
||||||
|
shmem = drm_gem_shmem_create(dev, size);
|
||||||
|
if (IS_ERR(shmem))
|
||||||
|
@@ -36,10 +116,18 @@ int lima_gem_create_handle(struct drm_device *dev, struct drm_file *file,
|
||||||
|
mask |= __GFP_DMA32;
|
||||||
|
mapping_set_gfp_mask(obj->filp->f_mapping, mask);
|
||||||
|
|
||||||
|
- sgt = drm_gem_shmem_get_pages_sgt(obj);
|
||||||
|
- if (IS_ERR(sgt)) {
|
||||||
|
- err = PTR_ERR(sgt);
|
||||||
|
- goto out;
|
||||||
|
+ if (is_heap) {
|
||||||
|
+ bo = to_lima_bo(obj);
|
||||||
|
+ err = lima_heap_alloc(bo, NULL);
|
||||||
|
+ if (err)
|
||||||
|
+ goto out;
|
||||||
|
+ } else {
|
||||||
|
+ struct sg_table *sgt = drm_gem_shmem_get_pages_sgt(obj);
|
||||||
|
+
|
||||||
|
+ if (IS_ERR(sgt)) {
|
||||||
|
+ err = PTR_ERR(sgt);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
err = drm_gem_handle_create(file, obj, handle);
|
||||||
|
@@ -79,17 +167,47 @@ static void lima_gem_object_close(struct drm_gem_object *obj, struct drm_file *f
|
||||||
|
lima_vm_bo_del(vm, bo);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int lima_gem_pin(struct drm_gem_object *obj)
|
||||||
|
+{
|
||||||
|
+ struct lima_bo *bo = to_lima_bo(obj);
|
||||||
|
+
|
||||||
|
+ if (bo->heap_size)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ return drm_gem_shmem_pin(obj);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void *lima_gem_vmap(struct drm_gem_object *obj)
|
||||||
|
+{
|
||||||
|
+ struct lima_bo *bo = to_lima_bo(obj);
|
||||||
|
+
|
||||||
|
+ if (bo->heap_size)
|
||||||
|
+ return ERR_PTR(-EINVAL);
|
||||||
|
+
|
||||||
|
+ return drm_gem_shmem_vmap(obj);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lima_gem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
|
||||||
|
+{
|
||||||
|
+ struct lima_bo *bo = to_lima_bo(obj);
|
||||||
|
+
|
||||||
|
+ if (bo->heap_size)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ return drm_gem_shmem_mmap(obj, vma);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static const struct drm_gem_object_funcs lima_gem_funcs = {
|
||||||
|
.free = lima_gem_free_object,
|
||||||
|
.open = lima_gem_object_open,
|
||||||
|
.close = lima_gem_object_close,
|
||||||
|
.print_info = drm_gem_shmem_print_info,
|
||||||
|
- .pin = drm_gem_shmem_pin,
|
||||||
|
+ .pin = lima_gem_pin,
|
||||||
|
.unpin = drm_gem_shmem_unpin,
|
||||||
|
.get_sg_table = drm_gem_shmem_get_sg_table,
|
||||||
|
- .vmap = drm_gem_shmem_vmap,
|
||||||
|
+ .vmap = lima_gem_vmap,
|
||||||
|
.vunmap = drm_gem_shmem_vunmap,
|
||||||
|
- .mmap = drm_gem_shmem_mmap,
|
||||||
|
+ .mmap = lima_gem_mmap,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_gem_object *lima_gem_create_object(struct drm_device *dev, size_t size)
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_gem.h b/drivers/gpu/drm/lima/lima_gem.h
|
||||||
|
index 1800feb3e47f..ccea06142f4b 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_gem.h
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_gem.h
|
||||||
|
@@ -7,12 +7,15 @@
|
||||||
|
#include <drm/drm_gem_shmem_helper.h>
|
||||||
|
|
||||||
|
struct lima_submit;
|
||||||
|
+struct lima_vm;
|
||||||
|
|
||||||
|
struct lima_bo {
|
||||||
|
struct drm_gem_shmem_object base;
|
||||||
|
|
||||||
|
struct mutex lock;
|
||||||
|
struct list_head va;
|
||||||
|
+
|
||||||
|
+ size_t heap_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline struct lima_bo *
|
||||||
|
@@ -31,6 +34,7 @@ static inline struct dma_resv *lima_bo_resv(struct lima_bo *bo)
|
||||||
|
return bo->base.base.resv;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int lima_heap_alloc(struct lima_bo *bo, struct lima_vm *vm);
|
||||||
|
struct drm_gem_object *lima_gem_create_object(struct drm_device *dev, size_t size);
|
||||||
|
int lima_gem_create_handle(struct drm_device *dev, struct drm_file *file,
|
||||||
|
u32 size, u32 flags, u32 *handle);
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_vm.c b/drivers/gpu/drm/lima/lima_vm.c
|
||||||
|
index 2e513841de6c..5b92fb82674a 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_vm.c
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_vm.c
|
||||||
|
@@ -155,6 +155,7 @@ int lima_vm_bo_add(struct lima_vm *vm, struct lima_bo *bo, bool create)
|
||||||
|
void lima_vm_bo_del(struct lima_vm *vm, struct lima_bo *bo)
|
||||||
|
{
|
||||||
|
struct lima_bo_va *bo_va;
|
||||||
|
+ u32 size;
|
||||||
|
|
||||||
|
mutex_lock(&bo->lock);
|
||||||
|
|
||||||
|
@@ -166,8 +167,9 @@ void lima_vm_bo_del(struct lima_vm *vm, struct lima_bo *bo)
|
||||||
|
|
||||||
|
mutex_lock(&vm->lock);
|
||||||
|
|
||||||
|
+ size = bo->heap_size ? bo->heap_size : bo_va->node.size;
|
||||||
|
lima_vm_unmap_range(vm, bo_va->node.start,
|
||||||
|
- bo_va->node.start + bo_va->node.size - 1);
|
||||||
|
+ bo_va->node.start + size - 1);
|
||||||
|
|
||||||
|
drm_mm_remove_node(&bo_va->node);
|
||||||
|
|
||||||
|
diff --git a/include/uapi/drm/lima_drm.h b/include/uapi/drm/lima_drm.h
|
||||||
|
index 95a00fb867e6..1ec58d652a5a 100644
|
||||||
|
--- a/include/uapi/drm/lima_drm.h
|
||||||
|
+++ b/include/uapi/drm/lima_drm.h
|
||||||
|
@@ -32,12 +32,19 @@ struct drm_lima_get_param {
|
||||||
|
__u64 value; /* out, parameter value */
|
||||||
|
};
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * heap buffer dynamically increase backup memory size when GP task fail
|
||||||
|
+ * due to lack of heap memory. size field of heap buffer is an up bound of
|
||||||
|
+ * the backup memory which can be set to a fairly large value.
|
||||||
|
+ */
|
||||||
|
+#define LIMA_BO_FLAG_HEAP (1 << 0)
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* create a buffer for used by GPU
|
||||||
|
*/
|
||||||
|
struct drm_lima_gem_create {
|
||||||
|
__u32 size; /* in, buffer size */
|
||||||
|
- __u32 flags; /* in, currently no flags, must be zero */
|
||||||
|
+ __u32 flags; /* in, buffer flags */
|
||||||
|
__u32 handle; /* out, GEM buffer handle */
|
||||||
|
__u32 pad; /* pad, must be zero */
|
||||||
|
};
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,247 @@
|
||||||
|
From 8873c9b22a0309985a994eaf82b5475d91cd3b51 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Qiang Yu <yuq825@gmail.com>
|
||||||
|
Date: Thu, 16 Jan 2020 21:11:56 +0800
|
||||||
|
Subject: [PATCH 004/101] FROMGIT: drm/lima: recover task by enlarging heap
|
||||||
|
buffer
|
||||||
|
|
||||||
|
Increase heap buffer backup memory when GP receive PLBU
|
||||||
|
out of memory interrupt, then resume the task.
|
||||||
|
|
||||||
|
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||||
|
Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
|
||||||
|
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
||||||
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-5-yuq825@gmail.com
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/lima/lima_gp.c | 58 +++++++++++++++++++++++++++++--
|
||||||
|
drivers/gpu/drm/lima/lima_mmu.c | 5 +++
|
||||||
|
drivers/gpu/drm/lima/lima_mmu.h | 1 +
|
||||||
|
drivers/gpu/drm/lima/lima_sched.c | 35 ++++++++++++++++---
|
||||||
|
drivers/gpu/drm/lima/lima_sched.h | 6 ++++
|
||||||
|
5 files changed, 98 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_gp.c b/drivers/gpu/drm/lima/lima_gp.c
|
||||||
|
index ccf49faedebf..52b210f9a605 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_gp.c
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_gp.c
|
||||||
|
@@ -11,6 +11,8 @@
|
||||||
|
#include "lima_device.h"
|
||||||
|
#include "lima_gp.h"
|
||||||
|
#include "lima_regs.h"
|
||||||
|
+#include "lima_gem.h"
|
||||||
|
+#include "lima_vm.h"
|
||||||
|
|
||||||
|
#define gp_write(reg, data) writel(data, ip->iomem + reg)
|
||||||
|
#define gp_read(reg) readl(ip->iomem + reg)
|
||||||
|
@@ -20,6 +22,7 @@ static irqreturn_t lima_gp_irq_handler(int irq, void *data)
|
||||||
|
struct lima_ip *ip = data;
|
||||||
|
struct lima_device *dev = ip->dev;
|
||||||
|
struct lima_sched_pipe *pipe = dev->pipe + lima_pipe_gp;
|
||||||
|
+ struct lima_sched_task *task = pipe->current_task;
|
||||||
|
u32 state = gp_read(LIMA_GP_INT_STAT);
|
||||||
|
u32 status = gp_read(LIMA_GP_STATUS);
|
||||||
|
bool done = false;
|
||||||
|
@@ -29,8 +32,16 @@ static irqreturn_t lima_gp_irq_handler(int irq, void *data)
|
||||||
|
return IRQ_NONE;
|
||||||
|
|
||||||
|
if (state & LIMA_GP_IRQ_MASK_ERROR) {
|
||||||
|
- dev_err(dev->dev, "gp error irq state=%x status=%x\n",
|
||||||
|
- state, status);
|
||||||
|
+ if ((state & LIMA_GP_IRQ_MASK_ERROR) ==
|
||||||
|
+ LIMA_GP_IRQ_PLBU_OUT_OF_MEM) {
|
||||||
|
+ dev_dbg(dev->dev, "gp out of heap irq status=%x\n",
|
||||||
|
+ status);
|
||||||
|
+ } else {
|
||||||
|
+ dev_err(dev->dev, "gp error irq state=%x status=%x\n",
|
||||||
|
+ state, status);
|
||||||
|
+ if (task)
|
||||||
|
+ task->recoverable = false;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* mask all interrupts before hard reset */
|
||||||
|
gp_write(LIMA_GP_INT_MASK, 0);
|
||||||
|
@@ -43,6 +54,7 @@ static irqreturn_t lima_gp_irq_handler(int irq, void *data)
|
||||||
|
bool active = status & (LIMA_GP_STATUS_VS_ACTIVE |
|
||||||
|
LIMA_GP_STATUS_PLBU_ACTIVE);
|
||||||
|
done = valid && !active;
|
||||||
|
+ pipe->error = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
gp_write(LIMA_GP_INT_CLEAR, state);
|
||||||
|
@@ -121,6 +133,22 @@ static void lima_gp_task_run(struct lima_sched_pipe *pipe,
|
||||||
|
u32 cmd = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
+ /* update real heap buffer size for GP */
|
||||||
|
+ for (i = 0; i < task->num_bos; i++) {
|
||||||
|
+ struct lima_bo *bo = task->bos[i];
|
||||||
|
+
|
||||||
|
+ if (bo->heap_size &&
|
||||||
|
+ lima_vm_get_va(task->vm, bo) ==
|
||||||
|
+ f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2]) {
|
||||||
|
+ f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2] =
|
||||||
|
+ f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2] +
|
||||||
|
+ bo->heap_size;
|
||||||
|
+ task->recoverable = true;
|
||||||
|
+ task->heap = bo;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (f[LIMA_GP_VSCL_START_ADDR >> 2] !=
|
||||||
|
f[LIMA_GP_VSCL_END_ADDR >> 2])
|
||||||
|
cmd |= LIMA_GP_CMD_START_VS;
|
||||||
|
@@ -184,6 +212,31 @@ static void lima_gp_task_mmu_error(struct lima_sched_pipe *pipe)
|
||||||
|
lima_sched_pipe_task_done(pipe);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int lima_gp_task_recover(struct lima_sched_pipe *pipe)
|
||||||
|
+{
|
||||||
|
+ struct lima_ip *ip = pipe->processor[0];
|
||||||
|
+ struct lima_sched_task *task = pipe->current_task;
|
||||||
|
+ struct drm_lima_gp_frame *frame = task->frame;
|
||||||
|
+ u32 *f = frame->frame;
|
||||||
|
+ size_t fail_size =
|
||||||
|
+ f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2] -
|
||||||
|
+ f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2];
|
||||||
|
+
|
||||||
|
+ if (fail_size == task->heap->heap_size) {
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = lima_heap_alloc(task->heap, task->vm);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ gp_write(LIMA_GP_INT_MASK, LIMA_GP_IRQ_MASK_USED);
|
||||||
|
+ gp_write(LIMA_GP_PLBU_ALLOC_END_ADDR,
|
||||||
|
+ f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2] + task->heap->heap_size);
|
||||||
|
+ gp_write(LIMA_GP_CMD, LIMA_GP_CMD_UPDATE_PLBU_ALLOC);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void lima_gp_print_version(struct lima_ip *ip)
|
||||||
|
{
|
||||||
|
u32 version, major, minor;
|
||||||
|
@@ -270,6 +323,7 @@ int lima_gp_pipe_init(struct lima_device *dev)
|
||||||
|
pipe->task_fini = lima_gp_task_fini;
|
||||||
|
pipe->task_error = lima_gp_task_error;
|
||||||
|
pipe->task_mmu_error = lima_gp_task_mmu_error;
|
||||||
|
+ pipe->task_recover = lima_gp_task_recover;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_mmu.c b/drivers/gpu/drm/lima/lima_mmu.c
|
||||||
|
index 97ec09dee572..f79d2af427e7 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_mmu.c
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_mmu.c
|
||||||
|
@@ -99,6 +99,11 @@ void lima_mmu_fini(struct lima_ip *ip)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
+void lima_mmu_flush_tlb(struct lima_ip *ip)
|
||||||
|
+{
|
||||||
|
+ mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_ZAP_CACHE);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void lima_mmu_switch_vm(struct lima_ip *ip, struct lima_vm *vm)
|
||||||
|
{
|
||||||
|
struct lima_device *dev = ip->dev;
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_mmu.h b/drivers/gpu/drm/lima/lima_mmu.h
|
||||||
|
index 8c78319bcc8e..4f8ccbebcba1 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_mmu.h
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_mmu.h
|
||||||
|
@@ -10,6 +10,7 @@ struct lima_vm;
|
||||||
|
int lima_mmu_init(struct lima_ip *ip);
|
||||||
|
void lima_mmu_fini(struct lima_ip *ip);
|
||||||
|
|
||||||
|
+void lima_mmu_flush_tlb(struct lima_ip *ip);
|
||||||
|
void lima_mmu_switch_vm(struct lima_ip *ip, struct lima_vm *vm);
|
||||||
|
void lima_mmu_page_fault_resume(struct lima_ip *ip);
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_sched.c b/drivers/gpu/drm/lima/lima_sched.c
|
||||||
|
index b561dd05bd62..3886999b4533 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_sched.c
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_sched.c
|
||||||
|
@@ -313,6 +313,26 @@ static const struct drm_sched_backend_ops lima_sched_ops = {
|
||||||
|
.free_job = lima_sched_free_job,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static void lima_sched_recover_work(struct work_struct *work)
|
||||||
|
+{
|
||||||
|
+ struct lima_sched_pipe *pipe =
|
||||||
|
+ container_of(work, struct lima_sched_pipe, recover_work);
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < pipe->num_l2_cache; i++)
|
||||||
|
+ lima_l2_cache_flush(pipe->l2_cache[i]);
|
||||||
|
+
|
||||||
|
+ if (pipe->bcast_mmu) {
|
||||||
|
+ lima_mmu_flush_tlb(pipe->bcast_mmu);
|
||||||
|
+ } else {
|
||||||
|
+ for (i = 0; i < pipe->num_mmu; i++)
|
||||||
|
+ lima_mmu_flush_tlb(pipe->mmu[i]);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (pipe->task_recover(pipe))
|
||||||
|
+ drm_sched_fault(&pipe->base);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name)
|
||||||
|
{
|
||||||
|
unsigned int timeout = lima_sched_timeout_ms > 0 ?
|
||||||
|
@@ -321,6 +341,8 @@ int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name)
|
||||||
|
pipe->fence_context = dma_fence_context_alloc(1);
|
||||||
|
spin_lock_init(&pipe->fence_lock);
|
||||||
|
|
||||||
|
+ INIT_WORK(&pipe->recover_work, lima_sched_recover_work);
|
||||||
|
+
|
||||||
|
return drm_sched_init(&pipe->base, &lima_sched_ops, 1, 0,
|
||||||
|
msecs_to_jiffies(timeout), name);
|
||||||
|
}
|
||||||
|
@@ -332,11 +354,14 @@ void lima_sched_pipe_fini(struct lima_sched_pipe *pipe)
|
||||||
|
|
||||||
|
void lima_sched_pipe_task_done(struct lima_sched_pipe *pipe)
|
||||||
|
{
|
||||||
|
- if (pipe->error)
|
||||||
|
- drm_sched_fault(&pipe->base);
|
||||||
|
- else {
|
||||||
|
- struct lima_sched_task *task = pipe->current_task;
|
||||||
|
-
|
||||||
|
+ struct lima_sched_task *task = pipe->current_task;
|
||||||
|
+
|
||||||
|
+ if (pipe->error) {
|
||||||
|
+ if (task && task->recoverable)
|
||||||
|
+ schedule_work(&pipe->recover_work);
|
||||||
|
+ else
|
||||||
|
+ drm_sched_fault(&pipe->base);
|
||||||
|
+ } else {
|
||||||
|
pipe->task_fini(pipe);
|
||||||
|
dma_fence_signal(task->fence);
|
||||||
|
}
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_sched.h b/drivers/gpu/drm/lima/lima_sched.h
|
||||||
|
index 1d814fecbcc0..d64393fb50a9 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_sched.h
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_sched.h
|
||||||
|
@@ -20,6 +20,9 @@ struct lima_sched_task {
|
||||||
|
struct lima_bo **bos;
|
||||||
|
int num_bos;
|
||||||
|
|
||||||
|
+ bool recoverable;
|
||||||
|
+ struct lima_bo *heap;
|
||||||
|
+
|
||||||
|
/* pipe fence */
|
||||||
|
struct dma_fence *fence;
|
||||||
|
};
|
||||||
|
@@ -68,6 +71,9 @@ struct lima_sched_pipe {
|
||||||
|
void (*task_fini)(struct lima_sched_pipe *pipe);
|
||||||
|
void (*task_error)(struct lima_sched_pipe *pipe);
|
||||||
|
void (*task_mmu_error)(struct lima_sched_pipe *pipe);
|
||||||
|
+ int (*task_recover)(struct lima_sched_pipe *pipe);
|
||||||
|
+
|
||||||
|
+ struct work_struct recover_work;
|
||||||
|
};
|
||||||
|
|
||||||
|
int lima_sched_task_init(struct lima_sched_task *task,
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
From 8d0bdbb99d053622078e1e8484ac2e40dc153c10 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Qiang Yu <yuq825@gmail.com>
|
||||||
|
Date: Thu, 16 Jan 2020 21:11:57 +0800
|
||||||
|
Subject: [PATCH 005/101] FROMGIT: drm/lima: increase driver version to 1.1
|
||||||
|
|
||||||
|
Increase driver version for mesa driver to identify
|
||||||
|
the support of new heap buffer interface.
|
||||||
|
|
||||||
|
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||||
|
Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
|
||||||
|
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
||||||
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-6-yuq825@gmail.com
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/lima/lima_drv.c | 10 ++++++++--
|
||||||
|
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c
|
||||||
|
index 18f88aaef1a2..2daac64d8955 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_drv.c
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_drv.c
|
||||||
|
@@ -245,6 +245,12 @@ static const struct drm_ioctl_desc lima_drm_driver_ioctls[] = {
|
||||||
|
|
||||||
|
DEFINE_DRM_GEM_FOPS(lima_drm_driver_fops);
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * Changelog:
|
||||||
|
+ *
|
||||||
|
+ * - 1.1.0 - add heap buffer support
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
static struct drm_driver lima_drm_driver = {
|
||||||
|
.driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ,
|
||||||
|
.open = lima_drm_driver_open,
|
||||||
|
@@ -254,9 +260,9 @@ static struct drm_driver lima_drm_driver = {
|
||||||
|
.fops = &lima_drm_driver_fops,
|
||||||
|
.name = "lima",
|
||||||
|
.desc = "lima DRM",
|
||||||
|
- .date = "20190217",
|
||||||
|
+ .date = "20191231",
|
||||||
|
.major = 1,
|
||||||
|
- .minor = 0,
|
||||||
|
+ .minor = 1,
|
||||||
|
.patchlevel = 0,
|
||||||
|
|
||||||
|
.gem_create_object = lima_gem_create_object,
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
From 163430e4f35fdf9d6232faffa7b5641d3406b45c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||||
|
Date: Tue, 18 Feb 2020 22:09:52 +0000
|
||||||
|
Subject: [PATCH 006/101] FROMGIT: drm/lima: fix recovering from PLBU out of
|
||||||
|
memory
|
||||||
|
|
||||||
|
It looks like on PLBU_OUT_OF_MEM interrupt we need to resume from where we
|
||||||
|
stopped, i.e. new PLBU heap start is old end. Also update end address
|
||||||
|
in GP frame to grow heap on 2nd and subsequent out of memory interrupts.
|
||||||
|
|
||||||
|
Fixes: 2081e8dcf1ee ("drm/lima: recover task by enlarging heap buffer")
|
||||||
|
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/lima/lima_gp.c | 7 ++++++-
|
||||||
|
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/lima/lima_gp.c b/drivers/gpu/drm/lima/lima_gp.c
|
||||||
|
index 52b210f9a605..d8841c870d90 100644
|
||||||
|
--- a/drivers/gpu/drm/lima/lima_gp.c
|
||||||
|
+++ b/drivers/gpu/drm/lima/lima_gp.c
|
||||||
|
@@ -231,8 +231,13 @@ static int lima_gp_task_recover(struct lima_sched_pipe *pipe)
|
||||||
|
}
|
||||||
|
|
||||||
|
gp_write(LIMA_GP_INT_MASK, LIMA_GP_IRQ_MASK_USED);
|
||||||
|
+ /* Resume from where we stopped, i.e. new start is old end */
|
||||||
|
+ gp_write(LIMA_GP_PLBU_ALLOC_START_ADDR,
|
||||||
|
+ f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2]);
|
||||||
|
+ f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2] =
|
||||||
|
+ f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2] + task->heap->heap_size;
|
||||||
|
gp_write(LIMA_GP_PLBU_ALLOC_END_ADDR,
|
||||||
|
- f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2] + task->heap->heap_size);
|
||||||
|
+ f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2]);
|
||||||
|
gp_write(LIMA_GP_CMD, LIMA_GP_CMD_UPDATE_PLBU_ALLOC);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
From 20d3765e4048e7cd6ce3722d03fdc0ed28a73975 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Wed, 22 Jan 2020 10:25:26 +0100
|
||||||
|
Subject: [PATCH 007/101] FROMGIT: dt-bindings: reset: meson: add gxl internal
|
||||||
|
dac reset
|
||||||
|
|
||||||
|
Add the reset line of the internal DAC found on the amlogic gxl SoC family
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
include/dt-bindings/reset/amlogic,meson-gxbb-reset.h | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/include/dt-bindings/reset/amlogic,meson-gxbb-reset.h b/include/dt-bindings/reset/amlogic,meson-gxbb-reset.h
|
||||||
|
index ea5058618863..883bfd3bcbad 100644
|
||||||
|
--- a/include/dt-bindings/reset/amlogic,meson-gxbb-reset.h
|
||||||
|
+++ b/include/dt-bindings/reset/amlogic,meson-gxbb-reset.h
|
||||||
|
@@ -69,7 +69,7 @@
|
||||||
|
#define RESET_SYS_CPU_L2 58
|
||||||
|
#define RESET_SYS_CPU_P 59
|
||||||
|
#define RESET_SYS_CPU_MBIST 60
|
||||||
|
-/* 61 */
|
||||||
|
+#define RESET_ACODEC 61
|
||||||
|
/* 62 */
|
||||||
|
/* 63 */
|
||||||
|
/* RESET2 */
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
From 392220081b02cd07ddb0ff3cd123f2fc51c90799 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Wed, 22 Jan 2020 11:04:49 +0100
|
||||||
|
Subject: [PATCH 008/101] FROMGIT: dt-bindings: clk: meson: add the gxl
|
||||||
|
internal dac gate
|
||||||
|
|
||||||
|
Add the gxl ACODEC clock id to the gxbb clock controller bindings
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
include/dt-bindings/clock/gxbb-clkc.h | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/include/dt-bindings/clock/gxbb-clkc.h b/include/dt-bindings/clock/gxbb-clkc.h
|
||||||
|
index db0763e96173..4073eb7a9da1 100644
|
||||||
|
--- a/include/dt-bindings/clock/gxbb-clkc.h
|
||||||
|
+++ b/include/dt-bindings/clock/gxbb-clkc.h
|
||||||
|
@@ -146,5 +146,6 @@
|
||||||
|
#define CLKID_CTS_VDAC 201
|
||||||
|
#define CLKID_HDMI_TX 202
|
||||||
|
#define CLKID_HDMI 205
|
||||||
|
+#define CLKID_ACODEC 206
|
||||||
|
|
||||||
|
#endif /* __GXBB_CLKC_H */
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
From 96386f4cf59030ce3add25fafdb877a7bb4e6779 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Wed, 22 Jan 2020 11:04:50 +0100
|
||||||
|
Subject: [PATCH 009/101] FROMGIT: clk: meson: gxbb: add the gxl internal dac
|
||||||
|
gate
|
||||||
|
|
||||||
|
Add the ACODEC clock gate to the gxl clk controller driver
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
drivers/clk/meson/gxbb.c | 3 +++
|
||||||
|
drivers/clk/meson/gxbb.h | 2 +-
|
||||||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
|
||||||
|
index 1f9c056e684c..47916c4f1700 100644
|
||||||
|
--- a/drivers/clk/meson/gxbb.c
|
||||||
|
+++ b/drivers/clk/meson/gxbb.c
|
||||||
|
@@ -2613,6 +2613,7 @@ static MESON_GATE(gxbb_assist_misc, HHI_GCLK_MPEG0, 23);
|
||||||
|
static MESON_GATE(gxbb_emmc_a, HHI_GCLK_MPEG0, 24);
|
||||||
|
static MESON_GATE(gxbb_emmc_b, HHI_GCLK_MPEG0, 25);
|
||||||
|
static MESON_GATE(gxbb_emmc_c, HHI_GCLK_MPEG0, 26);
|
||||||
|
+static MESON_GATE(gxl_acodec, HHI_GCLK_MPEG0, 28);
|
||||||
|
static MESON_GATE(gxbb_spi, HHI_GCLK_MPEG0, 30);
|
||||||
|
|
||||||
|
static MESON_GATE(gxbb_i2s_spdif, HHI_GCLK_MPEG1, 2);
|
||||||
|
@@ -3100,6 +3101,7 @@ static struct clk_hw_onecell_data gxl_hw_onecell_data = {
|
||||||
|
[CLKID_HDMI_SEL] = &gxbb_hdmi_sel.hw,
|
||||||
|
[CLKID_HDMI_DIV] = &gxbb_hdmi_div.hw,
|
||||||
|
[CLKID_HDMI] = &gxbb_hdmi.hw,
|
||||||
|
+ [CLKID_ACODEC] = &gxl_acodec.hw,
|
||||||
|
[NR_CLKS] = NULL,
|
||||||
|
},
|
||||||
|
.num = NR_CLKS,
|
||||||
|
@@ -3491,6 +3493,7 @@ static struct clk_regmap *const gxl_clk_regmaps[] = {
|
||||||
|
&gxl_hdmi_pll_od,
|
||||||
|
&gxl_hdmi_pll_od2,
|
||||||
|
&gxl_hdmi_pll_dco,
|
||||||
|
+ &gxl_acodec,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct meson_eeclkc_data gxbb_clkc_data = {
|
||||||
|
diff --git a/drivers/clk/meson/gxbb.h b/drivers/clk/meson/gxbb.h
|
||||||
|
index b53584fe66cf..1ee8cb7e2f5a 100644
|
||||||
|
--- a/drivers/clk/meson/gxbb.h
|
||||||
|
+++ b/drivers/clk/meson/gxbb.h
|
||||||
|
@@ -188,7 +188,7 @@
|
||||||
|
#define CLKID_HDMI_SEL 203
|
||||||
|
#define CLKID_HDMI_DIV 204
|
||||||
|
|
||||||
|
-#define NR_CLKS 206
|
||||||
|
+#define NR_CLKS 207
|
||||||
|
|
||||||
|
/* include the CLKIDs that have been made part of the DT binding */
|
||||||
|
#include <dt-bindings/clock/gxbb-clkc.h>
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
From 8c8e834c5cdc62445813c1be4c06c1b3c0dabedc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Wed, 22 Jan 2020 11:04:51 +0100
|
||||||
|
Subject: [PATCH 010/101] FROMGIT: clk: meson: gxbb: set audio output clock
|
||||||
|
hierarchy
|
||||||
|
|
||||||
|
The aiu devices peripheral clocks needs the aiu and aiu_glue clocks to
|
||||||
|
operate. Reflect this hierarchy in the gxbb clock tree.
|
||||||
|
|
||||||
|
Fixes: 738f66d3211d ("clk: gxbb: add AmLogic GXBB clk controller driver")
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
drivers/clk/meson/gxbb.c | 18 ++++++++++--------
|
||||||
|
1 file changed, 10 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
|
||||||
|
index 47916c4f1700..5fd6a574f8c3 100644
|
||||||
|
--- a/drivers/clk/meson/gxbb.c
|
||||||
|
+++ b/drivers/clk/meson/gxbb.c
|
||||||
|
@@ -2619,14 +2619,6 @@ static MESON_GATE(gxbb_spi, HHI_GCLK_MPEG0, 30);
|
||||||
|
static MESON_GATE(gxbb_i2s_spdif, HHI_GCLK_MPEG1, 2);
|
||||||
|
static MESON_GATE(gxbb_eth, HHI_GCLK_MPEG1, 3);
|
||||||
|
static MESON_GATE(gxbb_demux, HHI_GCLK_MPEG1, 4);
|
||||||
|
-static MESON_GATE(gxbb_aiu_glue, HHI_GCLK_MPEG1, 6);
|
||||||
|
-static MESON_GATE(gxbb_iec958, HHI_GCLK_MPEG1, 7);
|
||||||
|
-static MESON_GATE(gxbb_i2s_out, HHI_GCLK_MPEG1, 8);
|
||||||
|
-static MESON_GATE(gxbb_amclk, HHI_GCLK_MPEG1, 9);
|
||||||
|
-static MESON_GATE(gxbb_aififo2, HHI_GCLK_MPEG1, 10);
|
||||||
|
-static MESON_GATE(gxbb_mixer, HHI_GCLK_MPEG1, 11);
|
||||||
|
-static MESON_GATE(gxbb_mixer_iface, HHI_GCLK_MPEG1, 12);
|
||||||
|
-static MESON_GATE(gxbb_adc, HHI_GCLK_MPEG1, 13);
|
||||||
|
static MESON_GATE(gxbb_blkmv, HHI_GCLK_MPEG1, 14);
|
||||||
|
static MESON_GATE(gxbb_aiu, HHI_GCLK_MPEG1, 15);
|
||||||
|
static MESON_GATE(gxbb_uart1, HHI_GCLK_MPEG1, 16);
|
||||||
|
@@ -2681,6 +2673,16 @@ static MESON_GATE(gxbb_ao_ahb_bus, HHI_GCLK_AO, 2);
|
||||||
|
static MESON_GATE(gxbb_ao_iface, HHI_GCLK_AO, 3);
|
||||||
|
static MESON_GATE(gxbb_ao_i2c, HHI_GCLK_AO, 4);
|
||||||
|
|
||||||
|
+/* AIU gates */
|
||||||
|
+static MESON_PCLK(gxbb_aiu_glue, HHI_GCLK_MPEG1, 6, &gxbb_aiu.hw);
|
||||||
|
+static MESON_PCLK(gxbb_iec958, HHI_GCLK_MPEG1, 7, &gxbb_aiu_glue.hw);
|
||||||
|
+static MESON_PCLK(gxbb_i2s_out, HHI_GCLK_MPEG1, 8, &gxbb_aiu_glue.hw);
|
||||||
|
+static MESON_PCLK(gxbb_amclk, HHI_GCLK_MPEG1, 9, &gxbb_aiu_glue.hw);
|
||||||
|
+static MESON_PCLK(gxbb_aififo2, HHI_GCLK_MPEG1, 10, &gxbb_aiu_glue.hw);
|
||||||
|
+static MESON_PCLK(gxbb_mixer, HHI_GCLK_MPEG1, 11, &gxbb_aiu_glue.hw);
|
||||||
|
+static MESON_PCLK(gxbb_mixer_iface, HHI_GCLK_MPEG1, 12, &gxbb_aiu_glue.hw);
|
||||||
|
+static MESON_PCLK(gxbb_adc, HHI_GCLK_MPEG1, 13, &gxbb_aiu_glue.hw);
|
||||||
|
+
|
||||||
|
/* Array of all clocks provided by this provider */
|
||||||
|
|
||||||
|
static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
|
|
||||||
From 61fd036d01111679b01e4b92e6bd0cdd33809aea Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ricardo Ribalda Delgado <ribalda@kernel.org>
|
|
||||||
Date: Mon, 7 Oct 2019 12:06:33 -0300
|
|
||||||
Subject: [PATCH] media: add V4L2_CID_UNIT_CELL_SIZE control
|
|
||||||
|
|
||||||
This control returns the unit cell size in nanometres. The struct provides
|
|
||||||
the width and the height in separated fields to take into consideration
|
|
||||||
asymmetric pixels and/or hardware binning.
|
|
||||||
This control is required for automatic calibration of sensors/cameras.
|
|
||||||
|
|
||||||
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
|
|
||||||
Signed-off-by: Ricardo Ribalda Delgado <ribalda@kernel.org>
|
|
||||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
|
||||||
---
|
|
||||||
drivers/media/v4l2-core/v4l2-ctrls.c | 5 +++++
|
|
||||||
include/uapi/linux/v4l2-controls.h | 1 +
|
|
||||||
2 files changed, 6 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
|
|
||||||
index 96cab2e173d3..bf50d37ef6c1 100644
|
|
||||||
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
|
|
||||||
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
|
|
||||||
@@ -996,6 +996,7 @@ const char *v4l2_ctrl_get_name(u32 id)
|
|
||||||
case V4L2_CID_AUTO_FOCUS_RANGE: return "Auto Focus, Range";
|
|
||||||
case V4L2_CID_PAN_SPEED: return "Pan, Speed";
|
|
||||||
case V4L2_CID_TILT_SPEED: return "Tilt, Speed";
|
|
||||||
+ case V4L2_CID_UNIT_CELL_SIZE: return "Unit Cell Size";
|
|
||||||
|
|
||||||
/* FM Radio Modulator controls */
|
|
||||||
/* Keep the order of the 'case's the same as in v4l2-controls.h! */
|
|
||||||
@@ -1377,6 +1378,10 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
|
|
||||||
case V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER:
|
|
||||||
*type = V4L2_CTRL_TYPE_VP8_FRAME_HEADER;
|
|
||||||
break;
|
|
||||||
+ case V4L2_CID_UNIT_CELL_SIZE:
|
|
||||||
+ *type = V4L2_CTRL_TYPE_AREA;
|
|
||||||
+ *flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
|
||||||
+ break;
|
|
||||||
default:
|
|
||||||
*type = V4L2_CTRL_TYPE_INTEGER;
|
|
||||||
break;
|
|
||||||
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
|
|
||||||
index a2669b79b294..5a7bedee2b0e 100644
|
|
||||||
--- a/include/uapi/linux/v4l2-controls.h
|
|
||||||
+++ b/include/uapi/linux/v4l2-controls.h
|
|
||||||
@@ -1034,6 +1034,7 @@ enum v4l2_jpeg_chroma_subsampling {
|
|
||||||
#define V4L2_CID_TEST_PATTERN_GREENR (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 5)
|
|
||||||
#define V4L2_CID_TEST_PATTERN_BLUE (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 6)
|
|
||||||
#define V4L2_CID_TEST_PATTERN_GREENB (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 7)
|
|
||||||
+#define V4L2_CID_UNIT_CELL_SIZE (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 8)
|
|
||||||
|
|
||||||
|
|
||||||
/* Image processing controls */
|
|
||||||
--
|
|
||||||
2.23.0
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
From dc11cd4def83817faebd97368da4652c9f0fe17e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Thu, 13 Feb 2020 16:51:51 +0100
|
||||||
|
Subject: [PATCH 011/101] FROMGIT: ASoC: core: allow a dt node to provide
|
||||||
|
several components
|
||||||
|
|
||||||
|
At the moment, querying the dai_name will stop of the first component
|
||||||
|
matching the dt node. This does not allow a device (single dt node) to
|
||||||
|
provide several ASoC components which could then be used through DT.
|
||||||
|
|
||||||
|
This change let the search go on if the xlate function of the component
|
||||||
|
returns an error, giving the possibility to another component to match
|
||||||
|
and return the dai_name.
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/soc-core.c | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
|
||||||
|
index 068d809c349a..03b87427faa7 100644
|
||||||
|
--- a/sound/soc/soc-core.c
|
||||||
|
+++ b/sound/soc/soc-core.c
|
||||||
|
@@ -3102,6 +3102,14 @@ int snd_soc_get_dai_name(struct of_phandle_args *args,
|
||||||
|
*dai_name = dai->driver->name;
|
||||||
|
if (!*dai_name)
|
||||||
|
*dai_name = pos->name;
|
||||||
|
+ } else if (ret) {
|
||||||
|
+ /*
|
||||||
|
+ * if another error than ENOTSUPP is returned go on and
|
||||||
|
+ * check if another component is provided with the same
|
||||||
|
+ * node. This may happen if a device provides several
|
||||||
|
+ * components
|
||||||
|
+ */
|
||||||
|
+ continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,165 +0,0 @@
|
||||||
|
|
||||||
From d1dc49370f8371b00e682ac409aa1987ce641e93 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ricardo Ribalda Delgado <ribalda@kernel.org>
|
|
||||||
Date: Mon, 7 Oct 2019 12:06:31 -0300
|
|
||||||
Subject: [PATCH] media: add V4L2_CTRL_TYPE_AREA control type
|
|
||||||
|
|
||||||
This type contains the width and the height of a rectangular area.
|
|
||||||
|
|
||||||
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
|
|
||||||
Signed-off-by: Ricardo Ribalda Delgado <ribalda@kernel.org>
|
|
||||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
|
||||||
---
|
|
||||||
drivers/media/v4l2-core/v4l2-ctrls.c | 21 ++++++++++++++
|
|
||||||
include/media/v4l2-ctrls.h | 42 ++++++++++++++++++++++++++++
|
|
||||||
include/uapi/linux/videodev2.h | 6 ++++
|
|
||||||
3 files changed, 69 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
|
|
||||||
index 219d8aeefa20..96cab2e173d3 100644
|
|
||||||
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
|
|
||||||
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
|
|
||||||
@@ -1677,6 +1677,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
|
|
||||||
{
|
|
||||||
struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
|
|
||||||
struct v4l2_ctrl_vp8_frame_header *p_vp8_frame_header;
|
|
||||||
+ struct v4l2_area *area;
|
|
||||||
void *p = ptr.p + idx * ctrl->elem_size;
|
|
||||||
|
|
||||||
switch ((u32)ctrl->type) {
|
|
||||||
@@ -1753,6 +1754,11 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
|
|
||||||
zero_padding(p_vp8_frame_header->entropy_header);
|
|
||||||
zero_padding(p_vp8_frame_header->coder_state);
|
|
||||||
break;
|
|
||||||
+ case V4L2_CTRL_TYPE_AREA:
|
|
||||||
+ area = p;
|
|
||||||
+ if (!area->width || !area->height)
|
|
||||||
+ return -EINVAL;
|
|
||||||
+ break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
@@ -2427,6 +2433,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
|
|
||||||
case V4L2_CTRL_TYPE_VP8_FRAME_HEADER:
|
|
||||||
elem_size = sizeof(struct v4l2_ctrl_vp8_frame_header);
|
|
||||||
break;
|
|
||||||
+ case V4L2_CTRL_TYPE_AREA:
|
|
||||||
+ elem_size = sizeof(struct v4l2_area);
|
|
||||||
+ break;
|
|
||||||
default:
|
|
||||||
if (type < V4L2_CTRL_COMPOUND_TYPES)
|
|
||||||
elem_size = sizeof(s32);
|
|
||||||
@@ -4116,6 +4125,18 @@ int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_string);
|
|
||||||
|
|
||||||
+int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
|
|
||||||
+ const struct v4l2_area *area)
|
|
||||||
+{
|
|
||||||
+ lockdep_assert_held(ctrl->handler->lock);
|
|
||||||
+
|
|
||||||
+ /* It's a driver bug if this happens. */
|
|
||||||
+ WARN_ON(ctrl->type != V4L2_CTRL_TYPE_AREA);
|
|
||||||
+ *ctrl->p_new.p_area = *area;
|
|
||||||
+ return set_ctrl(NULL, ctrl, 0);
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_area);
|
|
||||||
+
|
|
||||||
void v4l2_ctrl_request_complete(struct media_request *req,
|
|
||||||
struct v4l2_ctrl_handler *main_hdl)
|
|
||||||
{
|
|
||||||
diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
|
|
||||||
index fb0883836548..c9ca867ef32b 100644
|
|
||||||
--- a/include/media/v4l2-ctrls.h
|
|
||||||
+++ b/include/media/v4l2-ctrls.h
|
|
||||||
@@ -50,6 +50,7 @@ struct poll_table_struct;
|
|
||||||
* @p_h264_slice_params: Pointer to a struct v4l2_ctrl_h264_slice_params.
|
|
||||||
* @p_h264_decode_params: Pointer to a struct v4l2_ctrl_h264_decode_params.
|
|
||||||
* @p_vp8_frame_header: Pointer to a VP8 frame header structure.
|
|
||||||
+ * @p_area: Pointer to an area.
|
|
||||||
* @p: Pointer to a compound value.
|
|
||||||
*/
|
|
||||||
union v4l2_ctrl_ptr {
|
|
||||||
@@ -68,6 +69,7 @@ union v4l2_ctrl_ptr {
|
|
||||||
struct v4l2_ctrl_h264_slice_params *p_h264_slice_params;
|
|
||||||
struct v4l2_ctrl_h264_decode_params *p_h264_decode_params;
|
|
||||||
struct v4l2_ctrl_vp8_frame_header *p_vp8_frame_header;
|
|
||||||
+ struct v4l2_area *p_area;
|
|
||||||
void *p;
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -1087,6 +1089,46 @@ static inline int v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
|
|
||||||
return rval;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * __v4l2_ctrl_s_ctrl_area() - Unlocked variant of v4l2_ctrl_s_ctrl_area().
|
|
||||||
+ *
|
|
||||||
+ * @ctrl: The control.
|
|
||||||
+ * @area: The new area.
|
|
||||||
+ *
|
|
||||||
+ * This sets the control's new area safely by going through the control
|
|
||||||
+ * framework. This function assumes the control's handler is already locked,
|
|
||||||
+ * allowing it to be used from within the &v4l2_ctrl_ops functions.
|
|
||||||
+ *
|
|
||||||
+ * This function is for area type controls only.
|
|
||||||
+ */
|
|
||||||
+int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
|
|
||||||
+ const struct v4l2_area *area);
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * v4l2_ctrl_s_ctrl_area() - Helper function to set a control's area value
|
|
||||||
+ * from within a driver.
|
|
||||||
+ *
|
|
||||||
+ * @ctrl: The control.
|
|
||||||
+ * @area: The new area.
|
|
||||||
+ *
|
|
||||||
+ * This sets the control's new area safely by going through the control
|
|
||||||
+ * framework. This function will lock the control's handler, so it cannot be
|
|
||||||
+ * used from within the &v4l2_ctrl_ops functions.
|
|
||||||
+ *
|
|
||||||
+ * This function is for area type controls only.
|
|
||||||
+ */
|
|
||||||
+static inline int v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
|
|
||||||
+ const struct v4l2_area *area)
|
|
||||||
+{
|
|
||||||
+ int rval;
|
|
||||||
+
|
|
||||||
+ v4l2_ctrl_lock(ctrl);
|
|
||||||
+ rval = __v4l2_ctrl_s_ctrl_area(ctrl, area);
|
|
||||||
+ v4l2_ctrl_unlock(ctrl);
|
|
||||||
+
|
|
||||||
+ return rval;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* Internal helper functions that deal with control events. */
|
|
||||||
extern const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops;
|
|
||||||
|
|
||||||
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
|
|
||||||
index 530638dffd93..b3c0961b62a0 100644
|
|
||||||
--- a/include/uapi/linux/videodev2.h
|
|
||||||
+++ b/include/uapi/linux/videodev2.h
|
|
||||||
@@ -422,6 +422,11 @@ struct v4l2_fract {
|
|
||||||
__u32 denominator;
|
|
||||||
};
|
|
||||||
|
|
||||||
+struct v4l2_area {
|
|
||||||
+ __u32 width;
|
|
||||||
+ __u32 height;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* struct v4l2_capability - Describes V4L2 device caps returned by VIDIOC_QUERYCAP
|
|
||||||
*
|
|
||||||
@@ -1720,6 +1725,7 @@ enum v4l2_ctrl_type {
|
|
||||||
V4L2_CTRL_TYPE_U8 = 0x0100,
|
|
||||||
V4L2_CTRL_TYPE_U16 = 0x0101,
|
|
||||||
V4L2_CTRL_TYPE_U32 = 0x0102,
|
|
||||||
+ V4L2_CTRL_TYPE_AREA = 0x0106,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
From 012945ce90302cd41203fab68ab6d31399e774a9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Fri, 14 Feb 2020 14:47:04 +0100
|
||||||
|
Subject: [PATCH 012/101] FROMGIT: ASoC: core: ensure component names are
|
||||||
|
unique
|
||||||
|
|
||||||
|
Make sure each ASoC component is registered with a unique name.
|
||||||
|
The component is derived from the device name. If a device registers more
|
||||||
|
than one component, the component names will be the same.
|
||||||
|
|
||||||
|
This usually brings up a warning about the debugfs directory creation of
|
||||||
|
the component since directory already exists.
|
||||||
|
|
||||||
|
In such case, start numbering the component of the device so the names
|
||||||
|
don't collide anymore.
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Link: https://lore.kernel.org/r/20200214134704.342501-1-jbrunet@baylibre.com
|
||||||
|
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||||
|
---
|
||||||
|
sound/soc/soc-core.c | 29 ++++++++++++++++++++++++++++-
|
||||||
|
1 file changed, 28 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
|
||||||
|
index 03b87427faa7..6a58a8f6e3c4 100644
|
||||||
|
--- a/sound/soc/soc-core.c
|
||||||
|
+++ b/sound/soc/soc-core.c
|
||||||
|
@@ -2446,6 +2446,33 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static char *snd_soc_component_unique_name(struct device *dev,
|
||||||
|
+ struct snd_soc_component *component)
|
||||||
|
+{
|
||||||
|
+ struct snd_soc_component *pos;
|
||||||
|
+ int count = 0;
|
||||||
|
+ char *name, *unique;
|
||||||
|
+
|
||||||
|
+ name = fmt_single_name(dev, &component->id);
|
||||||
|
+ if (!name)
|
||||||
|
+ return name;
|
||||||
|
+
|
||||||
|
+ /* Count the number of components registred by the device */
|
||||||
|
+ for_each_component(pos) {
|
||||||
|
+ if (dev == pos->dev)
|
||||||
|
+ count++;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Keep naming as it is for the 1st component */
|
||||||
|
+ if (!count)
|
||||||
|
+ return name;
|
||||||
|
+
|
||||||
|
+ unique = devm_kasprintf(dev, GFP_KERNEL, "%s-%d", name, count);
|
||||||
|
+ devm_kfree(dev, name);
|
||||||
|
+
|
||||||
|
+ return unique;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int snd_soc_component_initialize(struct snd_soc_component *component,
|
||||||
|
const struct snd_soc_component_driver *driver, struct device *dev)
|
||||||
|
{
|
||||||
|
@@ -2454,7 +2481,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
|
||||||
|
INIT_LIST_HEAD(&component->card_list);
|
||||||
|
mutex_init(&component->io_mutex);
|
||||||
|
|
||||||
|
- component->name = fmt_single_name(dev, &component->id);
|
||||||
|
+ component->name = snd_soc_component_unique_name(dev, component);
|
||||||
|
if (!component->name) {
|
||||||
|
dev_err(dev, "ASoC: Failed to allocate name\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,567 @@
|
||||||
|
From b6d117415a253a6d5c999be0f88a2742ca518d10 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Thu, 13 Feb 2020 16:51:52 +0100
|
||||||
|
Subject: [PATCH 013/101] FROMGIT: ASoC: meson: g12a: extract codec-to-codec
|
||||||
|
utils
|
||||||
|
|
||||||
|
The hdmi routing mechanism used on g12a hdmi is also used:
|
||||||
|
* other Amlogic SoC types
|
||||||
|
* for the internal DAC path
|
||||||
|
|
||||||
|
Each of these codec glues are slightly different but the idea
|
||||||
|
behind it remains the same. This change extract some helper functions
|
||||||
|
from the g12a-tohdmitx driver to make them available for other Amlogic
|
||||||
|
codecs.
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/Kconfig | 4 +
|
||||||
|
sound/soc/meson/Makefile | 2 +
|
||||||
|
sound/soc/meson/g12a-tohdmitx.c | 219 ++++++-----------------------
|
||||||
|
sound/soc/meson/meson-codec-glue.c | 149 ++++++++++++++++++++
|
||||||
|
sound/soc/meson/meson-codec-glue.h | 32 +++++
|
||||||
|
5 files changed, 230 insertions(+), 176 deletions(-)
|
||||||
|
create mode 100644 sound/soc/meson/meson-codec-glue.c
|
||||||
|
create mode 100644 sound/soc/meson/meson-codec-glue.h
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/Kconfig b/sound/soc/meson/Kconfig
|
||||||
|
index 2e3676147cea..ee6d53949d45 100644
|
||||||
|
--- a/sound/soc/meson/Kconfig
|
||||||
|
+++ b/sound/soc/meson/Kconfig
|
||||||
|
@@ -85,9 +85,13 @@ config SND_MESON_AXG_PDM
|
||||||
|
Select Y or M to add support for PDM input embedded
|
||||||
|
in the Amlogic AXG SoC family
|
||||||
|
|
||||||
|
+config SND_MESON_CODEC_GLUE
|
||||||
|
+ tristate
|
||||||
|
+
|
||||||
|
config SND_MESON_G12A_TOHDMITX
|
||||||
|
tristate "Amlogic G12A To HDMI TX Control Support"
|
||||||
|
select REGMAP_MMIO
|
||||||
|
+ select SND_MESON_CODEC_GLUE
|
||||||
|
imply SND_SOC_HDMI_CODEC
|
||||||
|
help
|
||||||
|
Select Y or M to add support for HDMI audio on the g12a SoC
|
||||||
|
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||||
|
index 1a8b1470ed84..529a807b3f37 100644
|
||||||
|
--- a/sound/soc/meson/Makefile
|
||||||
|
+++ b/sound/soc/meson/Makefile
|
||||||
|
@@ -11,6 +11,7 @@ snd-soc-meson-axg-sound-card-objs := axg-card.o
|
||||||
|
snd-soc-meson-axg-spdifin-objs := axg-spdifin.o
|
||||||
|
snd-soc-meson-axg-spdifout-objs := axg-spdifout.o
|
||||||
|
snd-soc-meson-axg-pdm-objs := axg-pdm.o
|
||||||
|
+snd-soc-meson-codec-glue-objs := meson-codec-glue.o
|
||||||
|
snd-soc-meson-g12a-tohdmitx-objs := g12a-tohdmitx.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_SND_MESON_AXG_FIFO) += snd-soc-meson-axg-fifo.o
|
||||||
|
@@ -24,4 +25,5 @@ obj-$(CONFIG_SND_MESON_AXG_SOUND_CARD) += snd-soc-meson-axg-sound-card.o
|
||||||
|
obj-$(CONFIG_SND_MESON_AXG_SPDIFIN) += snd-soc-meson-axg-spdifin.o
|
||||||
|
obj-$(CONFIG_SND_MESON_AXG_SPDIFOUT) += snd-soc-meson-axg-spdifout.o
|
||||||
|
obj-$(CONFIG_SND_MESON_AXG_PDM) += snd-soc-meson-axg-pdm.o
|
||||||
|
+obj-$(CONFIG_SND_MESON_CODEC_GLUE) += snd-soc-meson-codec-glue.o
|
||||||
|
obj-$(CONFIG_SND_MESON_G12A_TOHDMITX) += snd-soc-meson-g12a-tohdmitx.o
|
||||||
|
diff --git a/sound/soc/meson/g12a-tohdmitx.c b/sound/soc/meson/g12a-tohdmitx.c
|
||||||
|
index 8a0db28a6a40..9b2b59536ced 100644
|
||||||
|
--- a/sound/soc/meson/g12a-tohdmitx.c
|
||||||
|
+++ b/sound/soc/meson/g12a-tohdmitx.c
|
||||||
|
@@ -13,112 +13,51 @@
|
||||||
|
#include <sound/soc-dai.h>
|
||||||
|
|
||||||
|
#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
|
||||||
|
+#include "meson-codec-glue.h"
|
||||||
|
|
||||||
|
#define G12A_TOHDMITX_DRV_NAME "g12a-tohdmitx"
|
||||||
|
|
||||||
|
#define TOHDMITX_CTRL0 0x0
|
||||||
|
#define CTRL0_ENABLE_SHIFT 31
|
||||||
|
-#define CTRL0_I2S_DAT_SEL GENMASK(13, 12)
|
||||||
|
+#define CTRL0_I2S_DAT_SEL_SHIFT 12
|
||||||
|
+#define CTRL0_I2S_DAT_SEL (0x3 << CTRL0_I2S_DAT_SEL_SHIFT)
|
||||||
|
#define CTRL0_I2S_LRCLK_SEL GENMASK(9, 8)
|
||||||
|
#define CTRL0_I2S_BLK_CAP_INV BIT(7)
|
||||||
|
#define CTRL0_I2S_BCLK_O_INV BIT(6)
|
||||||
|
#define CTRL0_I2S_BCLK_SEL GENMASK(5, 4)
|
||||||
|
#define CTRL0_SPDIF_CLK_CAP_INV BIT(3)
|
||||||
|
#define CTRL0_SPDIF_CLK_O_INV BIT(2)
|
||||||
|
-#define CTRL0_SPDIF_SEL BIT(1)
|
||||||
|
+#define CTRL0_SPDIF_SEL_SHIFT 1
|
||||||
|
+#define CTRL0_SPDIF_SEL (0x1 << CTRL0_SPDIF_SEL_SHIFT)
|
||||||
|
#define CTRL0_SPDIF_CLK_SEL BIT(0)
|
||||||
|
|
||||||
|
-struct g12a_tohdmitx_input {
|
||||||
|
- struct snd_soc_pcm_stream params;
|
||||||
|
- unsigned int fmt;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-static struct snd_soc_dapm_widget *
|
||||||
|
-g12a_tohdmitx_get_input(struct snd_soc_dapm_widget *w)
|
||||||
|
-{
|
||||||
|
- struct snd_soc_dapm_path *p = NULL;
|
||||||
|
- struct snd_soc_dapm_widget *in;
|
||||||
|
-
|
||||||
|
- snd_soc_dapm_widget_for_each_source_path(w, p) {
|
||||||
|
- if (!p->connect)
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- /* Check that we still are in the same component */
|
||||||
|
- if (snd_soc_dapm_to_component(w->dapm) !=
|
||||||
|
- snd_soc_dapm_to_component(p->source->dapm))
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- if (p->source->id == snd_soc_dapm_dai_in)
|
||||||
|
- return p->source;
|
||||||
|
-
|
||||||
|
- in = g12a_tohdmitx_get_input(p->source);
|
||||||
|
- if (in)
|
||||||
|
- return in;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return NULL;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static struct g12a_tohdmitx_input *
|
||||||
|
-g12a_tohdmitx_get_input_data(struct snd_soc_dapm_widget *w)
|
||||||
|
-{
|
||||||
|
- struct snd_soc_dapm_widget *in =
|
||||||
|
- g12a_tohdmitx_get_input(w);
|
||||||
|
- struct snd_soc_dai *dai;
|
||||||
|
-
|
||||||
|
- if (WARN_ON(!in))
|
||||||
|
- return NULL;
|
||||||
|
-
|
||||||
|
- dai = in->priv;
|
||||||
|
-
|
||||||
|
- return dai->playback_dma_data;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static const char * const g12a_tohdmitx_i2s_mux_texts[] = {
|
||||||
|
"I2S A", "I2S B", "I2S C",
|
||||||
|
};
|
||||||
|
|
||||||
|
-static SOC_ENUM_SINGLE_EXT_DECL(g12a_tohdmitx_i2s_mux_enum,
|
||||||
|
- g12a_tohdmitx_i2s_mux_texts);
|
||||||
|
-
|
||||||
|
-static int g12a_tohdmitx_get_input_val(struct snd_soc_component *component,
|
||||||
|
- unsigned int mask)
|
||||||
|
-{
|
||||||
|
- unsigned int val;
|
||||||
|
-
|
||||||
|
- snd_soc_component_read(component, TOHDMITX_CTRL0, &val);
|
||||||
|
- return (val & mask) >> __ffs(mask);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static int g12a_tohdmitx_i2s_mux_get_enum(struct snd_kcontrol *kcontrol,
|
||||||
|
- struct snd_ctl_elem_value *ucontrol)
|
||||||
|
-{
|
||||||
|
- struct snd_soc_component *component =
|
||||||
|
- snd_soc_dapm_kcontrol_component(kcontrol);
|
||||||
|
-
|
||||||
|
- ucontrol->value.enumerated.item[0] =
|
||||||
|
- g12a_tohdmitx_get_input_val(component, CTRL0_I2S_DAT_SEL);
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static int g12a_tohdmitx_i2s_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||||
|
- struct snd_ctl_elem_value *ucontrol)
|
||||||
|
+ struct snd_ctl_elem_value *ucontrol)
|
||||||
|
{
|
||||||
|
struct snd_soc_component *component =
|
||||||
|
snd_soc_dapm_kcontrol_component(kcontrol);
|
||||||
|
struct snd_soc_dapm_context *dapm =
|
||||||
|
snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||||
|
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||||
|
- unsigned int mux = ucontrol->value.enumerated.item[0];
|
||||||
|
- unsigned int val = g12a_tohdmitx_get_input_val(component,
|
||||||
|
- CTRL0_I2S_DAT_SEL);
|
||||||
|
+ unsigned int mux, changed;
|
||||||
|
+
|
||||||
|
+ mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||||
|
+ changed = snd_soc_component_test_bits(component, e->reg,
|
||||||
|
+ CTRL0_I2S_DAT_SEL,
|
||||||
|
+ FIELD_PREP(CTRL0_I2S_DAT_SEL,
|
||||||
|
+ mux));
|
||||||
|
+
|
||||||
|
+ if (!changed)
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
/* Force disconnect of the mux while updating */
|
||||||
|
- if (val != mux)
|
||||||
|
- snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||||
|
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||||
|
|
||||||
|
- snd_soc_component_update_bits(component, TOHDMITX_CTRL0,
|
||||||
|
+ snd_soc_component_update_bits(component, e->reg,
|
||||||
|
CTRL0_I2S_DAT_SEL |
|
||||||
|
CTRL0_I2S_LRCLK_SEL |
|
||||||
|
CTRL0_I2S_BCLK_SEL,
|
||||||
|
@@ -131,30 +70,19 @@ static int g12a_tohdmitx_i2s_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static SOC_ENUM_SINGLE_DECL(g12a_tohdmitx_i2s_mux_enum, TOHDMITX_CTRL0,
|
||||||
|
+ CTRL0_I2S_DAT_SEL_SHIFT,
|
||||||
|
+ g12a_tohdmitx_i2s_mux_texts);
|
||||||
|
+
|
||||||
|
static const struct snd_kcontrol_new g12a_tohdmitx_i2s_mux =
|
||||||
|
SOC_DAPM_ENUM_EXT("I2S Source", g12a_tohdmitx_i2s_mux_enum,
|
||||||
|
- g12a_tohdmitx_i2s_mux_get_enum,
|
||||||
|
+ snd_soc_dapm_get_enum_double,
|
||||||
|
g12a_tohdmitx_i2s_mux_put_enum);
|
||||||
|
|
||||||
|
static const char * const g12a_tohdmitx_spdif_mux_texts[] = {
|
||||||
|
"SPDIF A", "SPDIF B",
|
||||||
|
};
|
||||||
|
|
||||||
|
-static SOC_ENUM_SINGLE_EXT_DECL(g12a_tohdmitx_spdif_mux_enum,
|
||||||
|
- g12a_tohdmitx_spdif_mux_texts);
|
||||||
|
-
|
||||||
|
-static int g12a_tohdmitx_spdif_mux_get_enum(struct snd_kcontrol *kcontrol,
|
||||||
|
- struct snd_ctl_elem_value *ucontrol)
|
||||||
|
-{
|
||||||
|
- struct snd_soc_component *component =
|
||||||
|
- snd_soc_dapm_kcontrol_component(kcontrol);
|
||||||
|
-
|
||||||
|
- ucontrol->value.enumerated.item[0] =
|
||||||
|
- g12a_tohdmitx_get_input_val(component, CTRL0_SPDIF_SEL);
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static int g12a_tohdmitx_spdif_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||||
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
|
{
|
||||||
|
@@ -163,13 +91,18 @@ static int g12a_tohdmitx_spdif_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||||
|
struct snd_soc_dapm_context *dapm =
|
||||||
|
snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||||
|
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||||
|
- unsigned int mux = ucontrol->value.enumerated.item[0];
|
||||||
|
- unsigned int val = g12a_tohdmitx_get_input_val(component,
|
||||||
|
- CTRL0_SPDIF_SEL);
|
||||||
|
+ unsigned int mux, changed;
|
||||||
|
+
|
||||||
|
+ mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||||
|
+ changed = snd_soc_component_test_bits(component, TOHDMITX_CTRL0,
|
||||||
|
+ CTRL0_SPDIF_SEL,
|
||||||
|
+ FIELD_PREP(CTRL0_SPDIF_SEL, mux));
|
||||||
|
+
|
||||||
|
+ if (!changed)
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
/* Force disconnect of the mux while updating */
|
||||||
|
- if (val != mux)
|
||||||
|
- snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||||
|
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||||
|
|
||||||
|
snd_soc_component_update_bits(component, TOHDMITX_CTRL0,
|
||||||
|
CTRL0_SPDIF_SEL |
|
||||||
|
@@ -182,9 +115,13 @@ static int g12a_tohdmitx_spdif_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static SOC_ENUM_SINGLE_DECL(g12a_tohdmitx_spdif_mux_enum, TOHDMITX_CTRL0,
|
||||||
|
+ CTRL0_SPDIF_SEL_SHIFT,
|
||||||
|
+ g12a_tohdmitx_spdif_mux_texts);
|
||||||
|
+
|
||||||
|
static const struct snd_kcontrol_new g12a_tohdmitx_spdif_mux =
|
||||||
|
SOC_DAPM_ENUM_EXT("SPDIF Source", g12a_tohdmitx_spdif_mux_enum,
|
||||||
|
- g12a_tohdmitx_spdif_mux_get_enum,
|
||||||
|
+ snd_soc_dapm_get_enum_double,
|
||||||
|
g12a_tohdmitx_spdif_mux_put_enum);
|
||||||
|
|
||||||
|
static const struct snd_kcontrol_new g12a_tohdmitx_out_enable =
|
||||||
|
@@ -202,83 +139,13 @@ static const struct snd_soc_dapm_widget g12a_tohdmitx_widgets[] = {
|
||||||
|
&g12a_tohdmitx_out_enable),
|
||||||
|
};
|
||||||
|
|
||||||
|
-static int g12a_tohdmitx_input_probe(struct snd_soc_dai *dai)
|
||||||
|
-{
|
||||||
|
- struct g12a_tohdmitx_input *data;
|
||||||
|
-
|
||||||
|
- data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||||
|
- if (!data)
|
||||||
|
- return -ENOMEM;
|
||||||
|
-
|
||||||
|
- dai->playback_dma_data = data;
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static int g12a_tohdmitx_input_remove(struct snd_soc_dai *dai)
|
||||||
|
-{
|
||||||
|
- kfree(dai->playback_dma_data);
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static int g12a_tohdmitx_input_hw_params(struct snd_pcm_substream *substream,
|
||||||
|
- struct snd_pcm_hw_params *params,
|
||||||
|
- struct snd_soc_dai *dai)
|
||||||
|
-{
|
||||||
|
- struct g12a_tohdmitx_input *data = dai->playback_dma_data;
|
||||||
|
-
|
||||||
|
- data->params.rates = snd_pcm_rate_to_rate_bit(params_rate(params));
|
||||||
|
- data->params.rate_min = params_rate(params);
|
||||||
|
- data->params.rate_max = params_rate(params);
|
||||||
|
- data->params.formats = 1 << params_format(params);
|
||||||
|
- data->params.channels_min = params_channels(params);
|
||||||
|
- data->params.channels_max = params_channels(params);
|
||||||
|
- data->params.sig_bits = dai->driver->playback.sig_bits;
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-static int g12a_tohdmitx_input_set_fmt(struct snd_soc_dai *dai,
|
||||||
|
- unsigned int fmt)
|
||||||
|
-{
|
||||||
|
- struct g12a_tohdmitx_input *data = dai->playback_dma_data;
|
||||||
|
-
|
||||||
|
- /* Save the source stream format for the downstream link */
|
||||||
|
- data->fmt = fmt;
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static int g12a_tohdmitx_output_startup(struct snd_pcm_substream *substream,
|
||||||
|
- struct snd_soc_dai *dai)
|
||||||
|
-{
|
||||||
|
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
|
- struct g12a_tohdmitx_input *in_data =
|
||||||
|
- g12a_tohdmitx_get_input_data(dai->capture_widget);
|
||||||
|
-
|
||||||
|
- if (!in_data)
|
||||||
|
- return -ENODEV;
|
||||||
|
-
|
||||||
|
- if (WARN_ON(!rtd->dai_link->params)) {
|
||||||
|
- dev_warn(dai->dev, "codec2codec link expected\n");
|
||||||
|
- return -EINVAL;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Replace link params with the input params */
|
||||||
|
- rtd->dai_link->params = &in_data->params;
|
||||||
|
-
|
||||||
|
- if (!in_data->fmt)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- return snd_soc_runtime_set_dai_fmt(rtd, in_data->fmt);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static const struct snd_soc_dai_ops g12a_tohdmitx_input_ops = {
|
||||||
|
- .hw_params = g12a_tohdmitx_input_hw_params,
|
||||||
|
- .set_fmt = g12a_tohdmitx_input_set_fmt,
|
||||||
|
+ .hw_params = meson_codec_glue_input_hw_params,
|
||||||
|
+ .set_fmt = meson_codec_glue_input_set_fmt,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct snd_soc_dai_ops g12a_tohdmitx_output_ops = {
|
||||||
|
- .startup = g12a_tohdmitx_output_startup,
|
||||||
|
+ .startup = meson_codec_glue_output_startup,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TOHDMITX_SPDIF_FORMATS \
|
||||||
|
@@ -305,8 +172,8 @@ static const struct snd_soc_dai_ops g12a_tohdmitx_output_ops = {
|
||||||
|
.id = (xid), \
|
||||||
|
.playback = TOHDMITX_STREAM(xname, "Playback", xfmt, xchmax), \
|
||||||
|
.ops = &g12a_tohdmitx_input_ops, \
|
||||||
|
- .probe = g12a_tohdmitx_input_probe, \
|
||||||
|
- .remove = g12a_tohdmitx_input_remove, \
|
||||||
|
+ .probe = meson_codec_glue_input_dai_probe, \
|
||||||
|
+ .remove = meson_codec_glue_input_dai_remove, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TOHDMITX_OUT(xname, xid, xfmt, xchmax) { \
|
||||||
|
diff --git a/sound/soc/meson/meson-codec-glue.c b/sound/soc/meson/meson-codec-glue.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..97bbc967e176
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sound/soc/meson/meson-codec-glue.c
|
||||||
|
@@ -0,0 +1,149 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+//
|
||||||
|
+// Copyright (c) 2019 BayLibre, SAS.
|
||||||
|
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <sound/pcm_params.h>
|
||||||
|
+#include <sound/soc.h>
|
||||||
|
+#include <sound/soc-dai.h>
|
||||||
|
+
|
||||||
|
+#include "meson-codec-glue.h"
|
||||||
|
+
|
||||||
|
+static struct snd_soc_dapm_widget *
|
||||||
|
+meson_codec_glue_get_input(struct snd_soc_dapm_widget *w)
|
||||||
|
+{
|
||||||
|
+ struct snd_soc_dapm_path *p = NULL;
|
||||||
|
+ struct snd_soc_dapm_widget *in;
|
||||||
|
+
|
||||||
|
+ snd_soc_dapm_widget_for_each_source_path(w, p) {
|
||||||
|
+ if (!p->connect)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ /* Check that we still are in the same component */
|
||||||
|
+ if (snd_soc_dapm_to_component(w->dapm) !=
|
||||||
|
+ snd_soc_dapm_to_component(p->source->dapm))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ if (p->source->id == snd_soc_dapm_dai_in)
|
||||||
|
+ return p->source;
|
||||||
|
+
|
||||||
|
+ in = meson_codec_glue_get_input(p->source);
|
||||||
|
+ if (in)
|
||||||
|
+ return in;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void meson_codec_glue_input_set_data(struct snd_soc_dai *dai,
|
||||||
|
+ struct meson_codec_glue_input *data)
|
||||||
|
+{
|
||||||
|
+ dai->playback_dma_data = data;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+struct meson_codec_glue_input *
|
||||||
|
+meson_codec_glue_input_get_data(struct snd_soc_dai *dai)
|
||||||
|
+{
|
||||||
|
+ return dai->playback_dma_data;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(meson_codec_glue_input_get_data);
|
||||||
|
+
|
||||||
|
+static struct meson_codec_glue_input *
|
||||||
|
+meson_codec_glue_output_get_input_data(struct snd_soc_dapm_widget *w)
|
||||||
|
+{
|
||||||
|
+ struct snd_soc_dapm_widget *in =
|
||||||
|
+ meson_codec_glue_get_input(w);
|
||||||
|
+ struct snd_soc_dai *dai;
|
||||||
|
+
|
||||||
|
+ if (WARN_ON(!in))
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ dai = in->priv;
|
||||||
|
+
|
||||||
|
+ return meson_codec_glue_input_get_data(dai);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int meson_codec_glue_input_hw_params(struct snd_pcm_substream *substream,
|
||||||
|
+ struct snd_pcm_hw_params *params,
|
||||||
|
+ struct snd_soc_dai *dai)
|
||||||
|
+{
|
||||||
|
+ struct meson_codec_glue_input *data =
|
||||||
|
+ meson_codec_glue_input_get_data(dai);
|
||||||
|
+
|
||||||
|
+ data->params.rates = snd_pcm_rate_to_rate_bit(params_rate(params));
|
||||||
|
+ data->params.rate_min = params_rate(params);
|
||||||
|
+ data->params.rate_max = params_rate(params);
|
||||||
|
+ data->params.formats = 1 << params_format(params);
|
||||||
|
+ data->params.channels_min = params_channels(params);
|
||||||
|
+ data->params.channels_max = params_channels(params);
|
||||||
|
+ data->params.sig_bits = dai->driver->playback.sig_bits;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(meson_codec_glue_input_hw_params);
|
||||||
|
+
|
||||||
|
+int meson_codec_glue_input_set_fmt(struct snd_soc_dai *dai,
|
||||||
|
+ unsigned int fmt)
|
||||||
|
+{
|
||||||
|
+ struct meson_codec_glue_input *data =
|
||||||
|
+ meson_codec_glue_input_get_data(dai);
|
||||||
|
+
|
||||||
|
+ /* Save the source stream format for the downstream link */
|
||||||
|
+ data->fmt = fmt;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(meson_codec_glue_input_set_fmt);
|
||||||
|
+
|
||||||
|
+int meson_codec_glue_output_startup(struct snd_pcm_substream *substream,
|
||||||
|
+ struct snd_soc_dai *dai)
|
||||||
|
+{
|
||||||
|
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
|
+ struct meson_codec_glue_input *in_data =
|
||||||
|
+ meson_codec_glue_output_get_input_data(dai->capture_widget);
|
||||||
|
+
|
||||||
|
+ if (!in_data)
|
||||||
|
+ return -ENODEV;
|
||||||
|
+
|
||||||
|
+ if (WARN_ON(!rtd->dai_link->params)) {
|
||||||
|
+ dev_warn(dai->dev, "codec2codec link expected\n");
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Replace link params with the input params */
|
||||||
|
+ rtd->dai_link->params = &in_data->params;
|
||||||
|
+
|
||||||
|
+ if (!in_data->fmt)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ return snd_soc_runtime_set_dai_fmt(rtd, in_data->fmt);
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(meson_codec_glue_output_startup);
|
||||||
|
+
|
||||||
|
+int meson_codec_glue_input_dai_probe(struct snd_soc_dai *dai)
|
||||||
|
+{
|
||||||
|
+ struct meson_codec_glue_input *data;
|
||||||
|
+
|
||||||
|
+ data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||||
|
+ if (!data)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ meson_codec_glue_input_set_data(dai, data);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(meson_codec_glue_input_dai_probe);
|
||||||
|
+
|
||||||
|
+int meson_codec_glue_input_dai_remove(struct snd_soc_dai *dai)
|
||||||
|
+{
|
||||||
|
+ struct meson_codec_glue_input *data =
|
||||||
|
+ meson_codec_glue_input_get_data(dai);
|
||||||
|
+
|
||||||
|
+ kfree(data);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(meson_codec_glue_input_dai_remove);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
|
||||||
|
+MODULE_DESCRIPTION("Amlogic Codec Glue Helpers");
|
||||||
|
+MODULE_LICENSE("GPL v2");
|
||||||
|
+
|
||||||
|
diff --git a/sound/soc/meson/meson-codec-glue.h b/sound/soc/meson/meson-codec-glue.h
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..07f99446c0c6
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sound/soc/meson/meson-codec-glue.h
|
||||||
|
@@ -0,0 +1,32 @@
|
||||||
|
+/* SPDX-License-Identifier: GPL-2.0
|
||||||
|
+ *
|
||||||
|
+ * Copyright (c) 2018 Baylibre SAS.
|
||||||
|
+ * Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef _MESON_CODEC_GLUE_H
|
||||||
|
+#define _MESON_CODEC_GLUE_H
|
||||||
|
+
|
||||||
|
+#include <sound/soc.h>
|
||||||
|
+
|
||||||
|
+struct meson_codec_glue_input {
|
||||||
|
+ struct snd_soc_pcm_stream params;
|
||||||
|
+ unsigned int fmt;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* Input helpers */
|
||||||
|
+struct meson_codec_glue_input *
|
||||||
|
+meson_codec_glue_input_get_data(struct snd_soc_dai *dai);
|
||||||
|
+int meson_codec_glue_input_hw_params(struct snd_pcm_substream *substream,
|
||||||
|
+ struct snd_pcm_hw_params *params,
|
||||||
|
+ struct snd_soc_dai *dai);
|
||||||
|
+int meson_codec_glue_input_set_fmt(struct snd_soc_dai *dai,
|
||||||
|
+ unsigned int fmt);
|
||||||
|
+int meson_codec_glue_input_dai_probe(struct snd_soc_dai *dai);
|
||||||
|
+int meson_codec_glue_input_dai_remove(struct snd_soc_dai *dai);
|
||||||
|
+
|
||||||
|
+/* Output helpers */
|
||||||
|
+int meson_codec_glue_output_startup(struct snd_pcm_substream *substream,
|
||||||
|
+ struct snd_soc_dai *dai);
|
||||||
|
+
|
||||||
|
+#endif /* _MESON_CODEC_GLUE_H */
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,265 +0,0 @@
|
||||||
|
|
||||||
From f8cca8c97a63d77f48334cde81d15014f43530ef Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Date: Fri, 11 Oct 2019 06:32:41 -0300
|
|
||||||
Subject: [PATCH] media: v4l2-mem2mem: support held capture buffers
|
|
||||||
|
|
||||||
Check for held buffers that are ready to be returned to vb2 in
|
|
||||||
__v4l2_m2m_try_queue(). This avoids drivers having to handle this
|
|
||||||
case.
|
|
||||||
|
|
||||||
Add v4l2_m2m_buf_done_and_job_finish() to correctly return source
|
|
||||||
and destination buffers and mark the job as finished while taking
|
|
||||||
a held destination buffer into account (i.e. that buffer won't be
|
|
||||||
returned). This has to be done while job_spinlock is held to avoid
|
|
||||||
race conditions.
|
|
||||||
|
|
||||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
|
||||||
---
|
|
||||||
drivers/media/v4l2-core/v4l2-mem2mem.c | 130 ++++++++++++++++++-------
|
|
||||||
include/media/v4l2-mem2mem.h | 33 ++++++-
|
|
||||||
2 files changed, 128 insertions(+), 35 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
index 19937dd3c6f6..79c3656f24f7 100644
|
|
||||||
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
@@ -284,7 +284,8 @@ static void v4l2_m2m_try_run(struct v4l2_m2m_dev *m2m_dev)
|
|
||||||
static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
struct v4l2_m2m_ctx *m2m_ctx)
|
|
||||||
{
|
|
||||||
- unsigned long flags_job, flags_out, flags_cap;
|
|
||||||
+ unsigned long flags_job;
|
|
||||||
+ struct vb2_v4l2_buffer *dst, *src;
|
|
||||||
|
|
||||||
dprintk("Trying to schedule a job for m2m_ctx: %p\n", m2m_ctx);
|
|
||||||
|
|
||||||
@@ -307,20 +308,30 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
goto job_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
- spin_lock_irqsave(&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out);
|
|
||||||
- if (list_empty(&m2m_ctx->out_q_ctx.rdy_queue)
|
|
||||||
- && !m2m_ctx->out_q_ctx.buffered) {
|
|
||||||
+ src = v4l2_m2m_next_src_buf(m2m_ctx);
|
|
||||||
+ dst = v4l2_m2m_next_dst_buf(m2m_ctx);
|
|
||||||
+ if (!src && !m2m_ctx->out_q_ctx.buffered) {
|
|
||||||
dprintk("No input buffers available\n");
|
|
||||||
- goto out_unlock;
|
|
||||||
+ goto job_unlock;
|
|
||||||
}
|
|
||||||
- spin_lock_irqsave(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap);
|
|
||||||
- if (list_empty(&m2m_ctx->cap_q_ctx.rdy_queue)
|
|
||||||
- && !m2m_ctx->cap_q_ctx.buffered) {
|
|
||||||
+ if (!dst && !m2m_ctx->cap_q_ctx.buffered) {
|
|
||||||
dprintk("No output buffers available\n");
|
|
||||||
- goto cap_unlock;
|
|
||||||
+ goto job_unlock;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (src && dst &&
|
|
||||||
+ dst->is_held && dst->vb2_buf.copied_timestamp &&
|
|
||||||
+ dst->vb2_buf.timestamp != src->vb2_buf.timestamp) {
|
|
||||||
+ dst->is_held = false;
|
|
||||||
+ v4l2_m2m_dst_buf_remove(m2m_ctx);
|
|
||||||
+ v4l2_m2m_buf_done(dst, VB2_BUF_STATE_DONE);
|
|
||||||
+ dst = v4l2_m2m_next_dst_buf(m2m_ctx);
|
|
||||||
+
|
|
||||||
+ if (!dst && !m2m_ctx->cap_q_ctx.buffered) {
|
|
||||||
+ dprintk("No output buffers available after returning held buffer\n");
|
|
||||||
+ goto job_unlock;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
- spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap);
|
|
||||||
- spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out);
|
|
||||||
|
|
||||||
if (m2m_dev->m2m_ops->job_ready
|
|
||||||
&& (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) {
|
|
||||||
@@ -331,13 +342,6 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
list_add_tail(&m2m_ctx->queue, &m2m_dev->job_queue);
|
|
||||||
m2m_ctx->job_flags |= TRANS_QUEUED;
|
|
||||||
|
|
||||||
- spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job);
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
-cap_unlock:
|
|
||||||
- spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap);
|
|
||||||
-out_unlock:
|
|
||||||
- spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out);
|
|
||||||
job_unlock:
|
|
||||||
spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job);
|
|
||||||
}
|
|
||||||
@@ -412,37 +416,97 @@ static void v4l2_m2m_cancel_job(struct v4l2_m2m_ctx *m2m_ctx)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
- struct v4l2_m2m_ctx *m2m_ctx)
|
|
||||||
+/*
|
|
||||||
+ * Schedule the next job, called from v4l2_m2m_job_finish() or
|
|
||||||
+ * v4l2_m2m_buf_done_and_job_finish().
|
|
||||||
+ */
|
|
||||||
+static void v4l2_m2m_schedule_next_job(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
+ struct v4l2_m2m_ctx *m2m_ctx)
|
|
||||||
{
|
|
||||||
- unsigned long flags;
|
|
||||||
+ /*
|
|
||||||
+ * This instance might have more buffers ready, but since we do not
|
|
||||||
+ * allow more than one job on the job_queue per instance, each has
|
|
||||||
+ * to be scheduled separately after the previous one finishes.
|
|
||||||
+ */
|
|
||||||
+ __v4l2_m2m_try_queue(m2m_dev, m2m_ctx);
|
|
||||||
|
|
||||||
- spin_lock_irqsave(&m2m_dev->job_spinlock, flags);
|
|
||||||
+ /*
|
|
||||||
+ * We might be running in atomic context,
|
|
||||||
+ * but the job must be run in non-atomic context.
|
|
||||||
+ */
|
|
||||||
+ schedule_work(&m2m_dev->job_work);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * Assumes job_spinlock is held, called from v4l2_m2m_job_finish() or
|
|
||||||
+ * v4l2_m2m_buf_done_and_job_finish().
|
|
||||||
+ */
|
|
||||||
+static bool _v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
+ struct v4l2_m2m_ctx *m2m_ctx)
|
|
||||||
+{
|
|
||||||
if (!m2m_dev->curr_ctx || m2m_dev->curr_ctx != m2m_ctx) {
|
|
||||||
- spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags);
|
|
||||||
dprintk("Called by an instance not currently running\n");
|
|
||||||
- return;
|
|
||||||
+ return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
list_del(&m2m_dev->curr_ctx->queue);
|
|
||||||
m2m_dev->curr_ctx->job_flags &= ~(TRANS_QUEUED | TRANS_RUNNING);
|
|
||||||
wake_up(&m2m_dev->curr_ctx->finished);
|
|
||||||
m2m_dev->curr_ctx = NULL;
|
|
||||||
+ return true;
|
|
||||||
+}
|
|
||||||
|
|
||||||
- spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags);
|
|
||||||
-
|
|
||||||
- /* This instance might have more buffers ready, but since we do not
|
|
||||||
- * allow more than one job on the job_queue per instance, each has
|
|
||||||
- * to be scheduled separately after the previous one finishes. */
|
|
||||||
- __v4l2_m2m_try_queue(m2m_dev, m2m_ctx);
|
|
||||||
+void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
+ struct v4l2_m2m_ctx *m2m_ctx)
|
|
||||||
+{
|
|
||||||
+ unsigned long flags;
|
|
||||||
+ bool schedule_next;
|
|
||||||
|
|
||||||
- /* We might be running in atomic context,
|
|
||||||
- * but the job must be run in non-atomic context.
|
|
||||||
+ /*
|
|
||||||
+ * This function should not be used for drivers that support
|
|
||||||
+ * holding capture buffers. Those should use
|
|
||||||
+ * v4l2_m2m_buf_done_and_job_finish() instead.
|
|
||||||
*/
|
|
||||||
- schedule_work(&m2m_dev->job_work);
|
|
||||||
+ WARN_ON(m2m_ctx->cap_q_ctx.q.subsystem_flags &
|
|
||||||
+ VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF);
|
|
||||||
+ spin_lock_irqsave(&m2m_dev->job_spinlock, flags);
|
|
||||||
+ schedule_next = _v4l2_m2m_job_finish(m2m_dev, m2m_ctx);
|
|
||||||
+ spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags);
|
|
||||||
+
|
|
||||||
+ if (schedule_next)
|
|
||||||
+ v4l2_m2m_schedule_next_job(m2m_dev, m2m_ctx);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(v4l2_m2m_job_finish);
|
|
||||||
|
|
||||||
+void v4l2_m2m_buf_done_and_job_finish(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
+ struct v4l2_m2m_ctx *m2m_ctx,
|
|
||||||
+ enum vb2_buffer_state state)
|
|
||||||
+{
|
|
||||||
+ struct vb2_v4l2_buffer *src_buf, *dst_buf;
|
|
||||||
+ bool schedule_next = false;
|
|
||||||
+ unsigned long flags;
|
|
||||||
+
|
|
||||||
+ spin_lock_irqsave(&m2m_dev->job_spinlock, flags);
|
|
||||||
+ src_buf = v4l2_m2m_src_buf_remove(m2m_ctx);
|
|
||||||
+ dst_buf = v4l2_m2m_next_dst_buf(m2m_ctx);
|
|
||||||
+
|
|
||||||
+ if (WARN_ON(!src_buf || !dst_buf))
|
|
||||||
+ goto unlock;
|
|
||||||
+ v4l2_m2m_buf_done(src_buf, state);
|
|
||||||
+ dst_buf->is_held = src_buf->flags & V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF;
|
|
||||||
+ if (!dst_buf->is_held) {
|
|
||||||
+ v4l2_m2m_dst_buf_remove(m2m_ctx);
|
|
||||||
+ v4l2_m2m_buf_done(dst_buf, state);
|
|
||||||
+ }
|
|
||||||
+ schedule_next = _v4l2_m2m_job_finish(m2m_dev, m2m_ctx);
|
|
||||||
+unlock:
|
|
||||||
+ spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags);
|
|
||||||
+
|
|
||||||
+ if (schedule_next)
|
|
||||||
+ v4l2_m2m_schedule_next_job(m2m_dev, m2m_ctx);
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL(v4l2_m2m_buf_done_and_job_finish);
|
|
||||||
+
|
|
||||||
int v4l2_m2m_reqbufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
||||||
struct v4l2_requestbuffers *reqbufs)
|
|
||||||
{
|
|
||||||
diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h
|
|
||||||
index 0b9c3a287061..229d9f5d4370 100644
|
|
||||||
--- a/include/media/v4l2-mem2mem.h
|
|
||||||
+++ b/include/media/v4l2-mem2mem.h
|
|
||||||
@@ -21,7 +21,8 @@
|
|
||||||
* callback.
|
|
||||||
* The job does NOT have to end before this callback returns
|
|
||||||
* (and it will be the usual case). When the job finishes,
|
|
||||||
- * v4l2_m2m_job_finish() has to be called.
|
|
||||||
+ * v4l2_m2m_job_finish() or v4l2_m2m_buf_done_and_job_finish()
|
|
||||||
+ * has to be called.
|
|
||||||
* @job_ready: optional. Should return 0 if the driver does not have a job
|
|
||||||
* fully prepared to run yet (i.e. it will not be able to finish a
|
|
||||||
* transaction without sleeping). If not provided, it will be
|
|
||||||
@@ -33,7 +34,8 @@
|
|
||||||
* stop the device safely; e.g. in the next interrupt handler),
|
|
||||||
* even if the transaction would not have been finished by then.
|
|
||||||
* After the driver performs the necessary steps, it has to call
|
|
||||||
- * v4l2_m2m_job_finish() (as if the transaction ended normally).
|
|
||||||
+ * v4l2_m2m_job_finish() or v4l2_m2m_buf_done_and_job_finish() as
|
|
||||||
+ * if the transaction ended normally.
|
|
||||||
* This function does not have to (and will usually not) wait
|
|
||||||
* until the device enters a state when it can be stopped.
|
|
||||||
*/
|
|
||||||
@@ -173,6 +175,33 @@ void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx);
|
|
||||||
void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
struct v4l2_m2m_ctx *m2m_ctx);
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * v4l2_m2m_buf_done_and_job_finish() - return source/destination buffers with
|
|
||||||
+ * state and inform the framework that a job has been finished and have it
|
|
||||||
+ * clean up
|
|
||||||
+ *
|
|
||||||
+ * @m2m_dev: opaque pointer to the internal data to handle M2M context
|
|
||||||
+ * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
|
|
||||||
+ * @state: vb2 buffer state passed to v4l2_m2m_buf_done().
|
|
||||||
+ *
|
|
||||||
+ * Drivers that set V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF must use this
|
|
||||||
+ * function instead of job_finish() to take held buffers into account. It is
|
|
||||||
+ * optional for other drivers.
|
|
||||||
+ *
|
|
||||||
+ * This function removes the source buffer from the ready list and returns
|
|
||||||
+ * it with the given state. The same is done for the destination buffer, unless
|
|
||||||
+ * it is marked 'held'. In that case the buffer is kept on the ready list.
|
|
||||||
+ *
|
|
||||||
+ * After that the job is finished (see job_finish()).
|
|
||||||
+ *
|
|
||||||
+ * This allows for multiple output buffers to be used to fill in a single
|
|
||||||
+ * capture buffer. This is typically used by stateless decoders where
|
|
||||||
+ * multiple e.g. H.264 slices contribute to a single decoded frame.
|
|
||||||
+ */
|
|
||||||
+void v4l2_m2m_buf_done_and_job_finish(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
+ struct v4l2_m2m_ctx *m2m_ctx,
|
|
||||||
+ enum vb2_buffer_state state);
|
|
||||||
+
|
|
||||||
static inline void
|
|
||||||
v4l2_m2m_buf_done(struct vb2_v4l2_buffer *buf, enum vb2_buffer_state state)
|
|
||||||
{
|
|
||||||
--
|
|
||||||
2.23.0
|
|
|
@ -0,0 +1,163 @@
|
||||||
|
From 54d8d12deb2dd6dde34de0c4b3e7d537e711fb25 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Thu, 13 Feb 2020 16:51:53 +0100
|
||||||
|
Subject: [PATCH 014/101] FROMGIT: ASoC: meson: aiu: add audio output
|
||||||
|
dt-bindings
|
||||||
|
|
||||||
|
Add the dt-bindings and documentation of the AIU audio controller.
|
||||||
|
This component provides most of the audio outputs found on the Amlogic
|
||||||
|
Gx SoC family.
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,aiu.yaml | 111 ++++++++++++++++++
|
||||||
|
include/dt-bindings/sound/meson-aiu.h | 18 +++
|
||||||
|
2 files changed, 129 insertions(+)
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,aiu.yaml
|
||||||
|
create mode 100644 include/dt-bindings/sound/meson-aiu.h
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,aiu.yaml b/Documentation/devicetree/bindings/sound/amlogic,aiu.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..3ef7632dcb59
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,aiu.yaml
|
||||||
|
@@ -0,0 +1,111 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,aiu.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic AIU audio output controller
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ $nodename:
|
||||||
|
+ pattern: "^audio-controller@.*"
|
||||||
|
+
|
||||||
|
+ "#sound-dai-cells":
|
||||||
|
+ const: 2
|
||||||
|
+
|
||||||
|
+ compatible:
|
||||||
|
+ items:
|
||||||
|
+ - enum:
|
||||||
|
+ - amlogic,aiu-gxbb
|
||||||
|
+ - amlogic,aiu-gxl
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,aiu
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ items:
|
||||||
|
+ - description: AIU peripheral clock
|
||||||
|
+ - description: I2S peripheral clock
|
||||||
|
+ - description: I2S output clock
|
||||||
|
+ - description: I2S master clock
|
||||||
|
+ - description: I2S mixer clock
|
||||||
|
+ - description: SPDIF peripheral clock
|
||||||
|
+ - description: SPDIF output clock
|
||||||
|
+ - description: SPDIF master clock
|
||||||
|
+ - description: SPDIF master clock multiplexer
|
||||||
|
+
|
||||||
|
+ clock-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: pclk
|
||||||
|
+ - const: i2s_pclk
|
||||||
|
+ - const: i2s_aoclk
|
||||||
|
+ - const: i2s_mclk
|
||||||
|
+ - const: i2s_mixer
|
||||||
|
+ - const: spdif_pclk
|
||||||
|
+ - const: spdif_aoclk
|
||||||
|
+ - const: spdif_mclk
|
||||||
|
+ - const: spdif_mclk_sel
|
||||||
|
+
|
||||||
|
+ interrupts:
|
||||||
|
+ items:
|
||||||
|
+ - description: I2S interrupt line
|
||||||
|
+ - description: SPDIF interrupt line
|
||||||
|
+
|
||||||
|
+ interrupt-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: i2s
|
||||||
|
+ - const: spdif
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ resets:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - "#sound-dai-cells"
|
||||||
|
+ - compatible
|
||||||
|
+ - clocks
|
||||||
|
+ - clock-names
|
||||||
|
+ - interrupts
|
||||||
|
+ - interrupt-names
|
||||||
|
+ - reg
|
||||||
|
+ - resets
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/gxbb-clkc.h>
|
||||||
|
+ #include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
+ #include <dt-bindings/reset/amlogic,meson-gxbb-reset.h>
|
||||||
|
+
|
||||||
|
+ aiu: audio-controller@5400 {
|
||||||
|
+ compatible = "amlogic,aiu-gxl", "amlogic,aiu";
|
||||||
|
+ #sound-dai-cells = <2>;
|
||||||
|
+ reg = <0x0 0x5400 0x0 0x2ac>;
|
||||||
|
+ interrupts = <GIC_SPI 48 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 50 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
+ interrupt-names = "i2s", "spdif";
|
||||||
|
+ clocks = <&clkc CLKID_AIU_GLUE>,
|
||||||
|
+ <&clkc CLKID_I2S_OUT>,
|
||||||
|
+ <&clkc CLKID_AOCLK_GATE>,
|
||||||
|
+ <&clkc CLKID_CTS_AMCLK>,
|
||||||
|
+ <&clkc CLKID_MIXER_IFACE>,
|
||||||
|
+ <&clkc CLKID_IEC958>,
|
||||||
|
+ <&clkc CLKID_IEC958_GATE>,
|
||||||
|
+ <&clkc CLKID_CTS_MCLK_I958>,
|
||||||
|
+ <&clkc CLKID_CTS_I958>;
|
||||||
|
+ clock-names = "pclk",
|
||||||
|
+ "i2s_pclk",
|
||||||
|
+ "i2s_aoclk",
|
||||||
|
+ "i2s_mclk",
|
||||||
|
+ "i2s_mixer",
|
||||||
|
+ "spdif_pclk",
|
||||||
|
+ "spdif_aoclk",
|
||||||
|
+ "spdif_mclk",
|
||||||
|
+ "spdif_mclk_sel";
|
||||||
|
+ resets = <&reset RESET_AIU>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
diff --git a/include/dt-bindings/sound/meson-aiu.h b/include/dt-bindings/sound/meson-aiu.h
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..1051b8af298b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/include/dt-bindings/sound/meson-aiu.h
|
||||||
|
@@ -0,0 +1,18 @@
|
||||||
|
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
+#ifndef __DT_MESON_AIU_H
|
||||||
|
+#define __DT_MESON_AIU_H
|
||||||
|
+
|
||||||
|
+#define AIU_CPU 0
|
||||||
|
+#define AIU_HDMI 1
|
||||||
|
+#define AIU_ACODEC 2
|
||||||
|
+
|
||||||
|
+#define CPU_I2S_FIFO 0
|
||||||
|
+#define CPU_SPDIF_FIFO 1
|
||||||
|
+#define CPU_I2S_ENCODER 2
|
||||||
|
+#define CPU_SPDIF_ENCODER 3
|
||||||
|
+
|
||||||
|
+#define CTRL_I2S 0
|
||||||
|
+#define CTRL_PCM 1
|
||||||
|
+#define CTRL_OUT 2
|
||||||
|
+
|
||||||
|
+#endif /* __DT_MESON_AIU_H */
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,101 +0,0 @@
|
||||||
|
|
||||||
From bef41d93aac64b54c3008ca6170bec54f85784f5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
|
||||||
Date: Fri, 11 Oct 2019 06:32:43 -0300
|
|
||||||
Subject: [PATCH] media: v4l2-mem2mem: add stateless_(try_)decoder_cmd ioctl
|
|
||||||
helpers
|
|
||||||
|
|
||||||
These helpers are used by stateless codecs when they support multiple
|
|
||||||
slices per frame and hold capture buffer flag is set. It's expected that
|
|
||||||
all such codecs will use this code.
|
|
||||||
|
|
||||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
|
||||||
Co-developed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
|
||||||
---
|
|
||||||
drivers/media/v4l2-core/v4l2-mem2mem.c | 53 ++++++++++++++++++++++++++
|
|
||||||
include/media/v4l2-mem2mem.h | 4 ++
|
|
||||||
2 files changed, 57 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
index 79c3656f24f7..b46d2c388349 100644
|
|
||||||
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
@@ -1218,6 +1218,59 @@ int v4l2_m2m_ioctl_try_decoder_cmd(struct file *file, void *fh,
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_try_decoder_cmd);
|
|
||||||
|
|
||||||
+int v4l2_m2m_ioctl_stateless_try_decoder_cmd(struct file *file, void *fh,
|
|
||||||
+ struct v4l2_decoder_cmd *dc)
|
|
||||||
+{
|
|
||||||
+ if (dc->cmd != V4L2_DEC_CMD_FLUSH)
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ dc->flags = 0;
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_stateless_try_decoder_cmd);
|
|
||||||
+
|
|
||||||
+int v4l2_m2m_ioctl_stateless_decoder_cmd(struct file *file, void *priv,
|
|
||||||
+ struct v4l2_decoder_cmd *dc)
|
|
||||||
+{
|
|
||||||
+ struct v4l2_fh *fh = file->private_data;
|
|
||||||
+ struct vb2_v4l2_buffer *out_vb, *cap_vb;
|
|
||||||
+ struct v4l2_m2m_dev *m2m_dev = fh->m2m_ctx->m2m_dev;
|
|
||||||
+ unsigned long flags;
|
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ ret = v4l2_m2m_ioctl_stateless_try_decoder_cmd(file, priv, dc);
|
|
||||||
+ if (ret < 0)
|
|
||||||
+ return ret;
|
|
||||||
+
|
|
||||||
+ spin_lock_irqsave(&m2m_dev->job_spinlock, flags);
|
|
||||||
+ out_vb = v4l2_m2m_last_src_buf(fh->m2m_ctx);
|
|
||||||
+ cap_vb = v4l2_m2m_last_dst_buf(fh->m2m_ctx);
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * If there is an out buffer pending, then clear any HOLD flag.
|
|
||||||
+ *
|
|
||||||
+ * By clearing this flag we ensure that when this output
|
|
||||||
+ * buffer is processed any held capture buffer will be released.
|
|
||||||
+ */
|
|
||||||
+ if (out_vb) {
|
|
||||||
+ out_vb->flags &= ~V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF;
|
|
||||||
+ } else if (cap_vb && cap_vb->is_held) {
|
|
||||||
+ /*
|
|
||||||
+ * If there were no output buffers, but there is a
|
|
||||||
+ * capture buffer that is held, then release that
|
|
||||||
+ * buffer.
|
|
||||||
+ */
|
|
||||||
+ cap_vb->is_held = false;
|
|
||||||
+ v4l2_m2m_dst_buf_remove(fh->m2m_ctx);
|
|
||||||
+ v4l2_m2m_buf_done(cap_vb, VB2_BUF_STATE_DONE);
|
|
||||||
+ }
|
|
||||||
+ spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_stateless_decoder_cmd);
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* v4l2_file_operations helpers. It is assumed here same lock is used
|
|
||||||
* for the output and the capture buffer queue.
|
|
||||||
diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h
|
|
||||||
index 229d9f5d4370..3d9e48ed8817 100644
|
|
||||||
--- a/include/media/v4l2-mem2mem.h
|
|
||||||
+++ b/include/media/v4l2-mem2mem.h
|
|
||||||
@@ -701,6 +701,10 @@ int v4l2_m2m_ioctl_try_encoder_cmd(struct file *file, void *fh,
|
|
||||||
struct v4l2_encoder_cmd *ec);
|
|
||||||
int v4l2_m2m_ioctl_try_decoder_cmd(struct file *file, void *fh,
|
|
||||||
struct v4l2_decoder_cmd *dc);
|
|
||||||
+int v4l2_m2m_ioctl_stateless_try_decoder_cmd(struct file *file, void *fh,
|
|
||||||
+ struct v4l2_decoder_cmd *dc);
|
|
||||||
+int v4l2_m2m_ioctl_stateless_decoder_cmd(struct file *file, void *priv,
|
|
||||||
+ struct v4l2_decoder_cmd *dc);
|
|
||||||
int v4l2_m2m_fop_mmap(struct file *file, struct vm_area_struct *vma);
|
|
||||||
__poll_t v4l2_m2m_fop_poll(struct file *file, poll_table *wait);
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,74 +0,0 @@
|
||||||
|
|
||||||
From f07602ac388723233e9e3c5a05b54baf34e0a3e9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Date: Fri, 11 Oct 2019 06:32:44 -0300
|
|
||||||
Subject: [PATCH] media: v4l2-mem2mem: add new_frame detection
|
|
||||||
|
|
||||||
Drivers that support VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF
|
|
||||||
typically want to know if a new frame is started (i.e. the first
|
|
||||||
slice is about to be processed). Add a new_frame bool to v4l2_m2m_ctx
|
|
||||||
and set it accordingly.
|
|
||||||
|
|
||||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
|
||||||
---
|
|
||||||
drivers/media/v4l2-core/v4l2-mem2mem.c | 11 +++++++++--
|
|
||||||
include/media/v4l2-mem2mem.h | 7 +++++++
|
|
||||||
2 files changed, 16 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
index b46d2c388349..db07ef3bf3d0 100644
|
|
||||||
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
@@ -319,8 +319,10 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
goto job_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (src && dst &&
|
|
||||||
- dst->is_held && dst->vb2_buf.copied_timestamp &&
|
|
||||||
+ m2m_ctx->new_frame = true;
|
|
||||||
+
|
|
||||||
+ if (src && dst && dst->is_held &&
|
|
||||||
+ dst->vb2_buf.copied_timestamp &&
|
|
||||||
dst->vb2_buf.timestamp != src->vb2_buf.timestamp) {
|
|
||||||
dst->is_held = false;
|
|
||||||
v4l2_m2m_dst_buf_remove(m2m_ctx);
|
|
||||||
@@ -333,6 +335,11 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (src && dst && (m2m_ctx->cap_q_ctx.q.subsystem_flags &
|
|
||||||
+ VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF))
|
|
||||||
+ m2m_ctx->new_frame = !dst->vb2_buf.copied_timestamp ||
|
|
||||||
+ dst->vb2_buf.timestamp != src->vb2_buf.timestamp;
|
|
||||||
+
|
|
||||||
if (m2m_dev->m2m_ops->job_ready
|
|
||||||
&& (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) {
|
|
||||||
dprintk("Driver not ready\n");
|
|
||||||
diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h
|
|
||||||
index 3d9e48ed8817..1d85e24791e4 100644
|
|
||||||
--- a/include/media/v4l2-mem2mem.h
|
|
||||||
+++ b/include/media/v4l2-mem2mem.h
|
|
||||||
@@ -75,6 +75,11 @@ struct v4l2_m2m_queue_ctx {
|
|
||||||
* struct v4l2_m2m_ctx - Memory to memory context structure
|
|
||||||
*
|
|
||||||
* @q_lock: struct &mutex lock
|
|
||||||
+ * @new_frame: valid in the device_run callback: if true, then this
|
|
||||||
+ * starts a new frame; if false, then this is a new slice
|
|
||||||
+ * for an existing frame. This is always true unless
|
|
||||||
+ * V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF is set, which
|
|
||||||
+ * indicates slicing support.
|
|
||||||
* @m2m_dev: opaque pointer to the internal data to handle M2M context
|
|
||||||
* @cap_q_ctx: Capture (output to memory) queue context
|
|
||||||
* @out_q_ctx: Output (input from memory) queue context
|
|
||||||
@@ -91,6 +96,8 @@ struct v4l2_m2m_ctx {
|
|
||||||
/* optional cap/out vb2 queues lock */
|
|
||||||
struct mutex *q_lock;
|
|
||||||
|
|
||||||
+ bool new_frame;
|
|
||||||
+
|
|
||||||
/* internal use only */
|
|
||||||
struct v4l2_m2m_dev *m2m_dev;
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
|
@ -0,0 +1,281 @@
|
||||||
|
From 9f5f213c7a2ff61f25ebba0906a9598983cf1e9e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Thu, 13 Feb 2020 16:51:55 +0100
|
||||||
|
Subject: [PATCH 016/101] FROMGIT: ASoC: meson: aiu: add hdmi codec control
|
||||||
|
support
|
||||||
|
|
||||||
|
Add the codec to codec component which handles the routing between
|
||||||
|
the audio producers (PCM and I2S) and the synopsys hdmi controller
|
||||||
|
on the amlogic GX SoC family
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/Kconfig | 2 +
|
||||||
|
sound/soc/meson/Makefile | 1 +
|
||||||
|
sound/soc/meson/aiu-codec-ctrl.c | 152 +++++++++++++++++++++++++++++++
|
||||||
|
sound/soc/meson/aiu.c | 34 ++++++-
|
||||||
|
sound/soc/meson/aiu.h | 8 ++
|
||||||
|
5 files changed, 196 insertions(+), 1 deletion(-)
|
||||||
|
create mode 100644 sound/soc/meson/aiu-codec-ctrl.c
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/Kconfig b/sound/soc/meson/Kconfig
|
||||||
|
index ca269dedfc7f..19de97ae4ce9 100644
|
||||||
|
--- a/sound/soc/meson/Kconfig
|
||||||
|
+++ b/sound/soc/meson/Kconfig
|
||||||
|
@@ -4,7 +4,9 @@ menu "ASoC support for Amlogic platforms"
|
||||||
|
|
||||||
|
config SND_MESON_AIU
|
||||||
|
tristate "Amlogic AIU"
|
||||||
|
+ select SND_MESON_CODEC_GLUE
|
||||||
|
select SND_PCM_IEC958
|
||||||
|
+ imply SND_SOC_HDMI_CODEC if DRM_MESON_DW_HDMI
|
||||||
|
help
|
||||||
|
Select Y or M to add support for the Audio output subsystem found
|
||||||
|
in the Amlogic GX SoC family
|
||||||
|
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||||
|
index a7b79d717288..3b21f648e322 100644
|
||||||
|
--- a/sound/soc/meson/Makefile
|
||||||
|
+++ b/sound/soc/meson/Makefile
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||||
|
|
||||||
|
snd-soc-meson-aiu-objs := aiu.o
|
||||||
|
+snd-soc-meson-aiu-objs += aiu-codec-ctrl.o
|
||||||
|
snd-soc-meson-aiu-objs += aiu-encoder-i2s.o
|
||||||
|
snd-soc-meson-aiu-objs += aiu-encoder-spdif.o
|
||||||
|
snd-soc-meson-aiu-objs += aiu-fifo.o
|
||||||
|
diff --git a/sound/soc/meson/aiu-codec-ctrl.c b/sound/soc/meson/aiu-codec-ctrl.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..8646a953e3b3
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sound/soc/meson/aiu-codec-ctrl.c
|
||||||
|
@@ -0,0 +1,152 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+//
|
||||||
|
+// Copyright (c) 2020 BayLibre, SAS.
|
||||||
|
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+#include <linux/bitfield.h>
|
||||||
|
+#include <sound/pcm_params.h>
|
||||||
|
+#include <sound/soc.h>
|
||||||
|
+#include <sound/soc-dai.h>
|
||||||
|
+
|
||||||
|
+#include <dt-bindings/sound/meson-aiu.h>
|
||||||
|
+#include "aiu.h"
|
||||||
|
+#include "meson-codec-glue.h"
|
||||||
|
+
|
||||||
|
+#define CTRL_CLK_SEL GENMASK(1, 0)
|
||||||
|
+#define CTRL_DATA_SEL_SHIFT 4
|
||||||
|
+#define CTRL_DATA_SEL (0x3 << CTRL_DATA_SEL_SHIFT)
|
||||||
|
+
|
||||||
|
+static const char * const aiu_codec_ctrl_mux_texts[] = {
|
||||||
|
+ "DISABLED", "PCM", "I2S",
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int aiu_codec_ctrl_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||||
|
+ struct snd_ctl_elem_value *ucontrol)
|
||||||
|
+{
|
||||||
|
+ struct snd_soc_component *component =
|
||||||
|
+ snd_soc_dapm_kcontrol_component(kcontrol);
|
||||||
|
+ struct snd_soc_dapm_context *dapm =
|
||||||
|
+ snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||||
|
+ struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||||
|
+ unsigned int mux, changed;
|
||||||
|
+
|
||||||
|
+ mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||||
|
+ changed = snd_soc_component_test_bits(component, e->reg,
|
||||||
|
+ CTRL_DATA_SEL,
|
||||||
|
+ FIELD_PREP(CTRL_DATA_SEL, mux));
|
||||||
|
+
|
||||||
|
+ if (!changed)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ /* Force disconnect of the mux while updating */
|
||||||
|
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||||
|
+
|
||||||
|
+ /* Reset the source first */
|
||||||
|
+ snd_soc_component_update_bits(component, e->reg,
|
||||||
|
+ CTRL_CLK_SEL |
|
||||||
|
+ CTRL_DATA_SEL,
|
||||||
|
+ FIELD_PREP(CTRL_CLK_SEL, 0) |
|
||||||
|
+ FIELD_PREP(CTRL_DATA_SEL, 0));
|
||||||
|
+
|
||||||
|
+ /* Set the appropriate source */
|
||||||
|
+ snd_soc_component_update_bits(component, e->reg,
|
||||||
|
+ CTRL_CLK_SEL |
|
||||||
|
+ CTRL_DATA_SEL,
|
||||||
|
+ FIELD_PREP(CTRL_CLK_SEL, mux) |
|
||||||
|
+ FIELD_PREP(CTRL_DATA_SEL, mux));
|
||||||
|
+
|
||||||
|
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static SOC_ENUM_SINGLE_DECL(aiu_hdmi_ctrl_mux_enum, AIU_HDMI_CLK_DATA_CTRL,
|
||||||
|
+ CTRL_DATA_SEL_SHIFT,
|
||||||
|
+ aiu_codec_ctrl_mux_texts);
|
||||||
|
+
|
||||||
|
+static const struct snd_kcontrol_new aiu_hdmi_ctrl_mux =
|
||||||
|
+ SOC_DAPM_ENUM_EXT("HDMI Source", aiu_hdmi_ctrl_mux_enum,
|
||||||
|
+ snd_soc_dapm_get_enum_double,
|
||||||
|
+ aiu_codec_ctrl_mux_put_enum);
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dapm_widget aiu_hdmi_ctrl_widgets[] = {
|
||||||
|
+ SND_SOC_DAPM_MUX("HDMI CTRL SRC", SND_SOC_NOPM, 0, 0,
|
||||||
|
+ &aiu_hdmi_ctrl_mux),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dai_ops aiu_codec_ctrl_input_ops = {
|
||||||
|
+ .hw_params = meson_codec_glue_input_hw_params,
|
||||||
|
+ .set_fmt = meson_codec_glue_input_set_fmt,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dai_ops aiu_codec_ctrl_output_ops = {
|
||||||
|
+ .startup = meson_codec_glue_output_startup,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+#define AIU_CODEC_CTRL_FORMATS \
|
||||||
|
+ (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
|
||||||
|
+ SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE | \
|
||||||
|
+ SNDRV_PCM_FMTBIT_S32_LE)
|
||||||
|
+
|
||||||
|
+#define AIU_CODEC_CTRL_STREAM(xname, xsuffix) \
|
||||||
|
+{ \
|
||||||
|
+ .stream_name = xname " " xsuffix, \
|
||||||
|
+ .channels_min = 1, \
|
||||||
|
+ .channels_max = 8, \
|
||||||
|
+ .rate_min = 5512, \
|
||||||
|
+ .rate_max = 192000, \
|
||||||
|
+ .formats = AIU_CODEC_CTRL_FORMATS, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define AIU_CODEC_CTRL_INPUT(xname) { \
|
||||||
|
+ .name = "CODEC CTRL " xname, \
|
||||||
|
+ .playback = AIU_CODEC_CTRL_STREAM(xname, "Playback"), \
|
||||||
|
+ .ops = &aiu_codec_ctrl_input_ops, \
|
||||||
|
+ .probe = meson_codec_glue_input_dai_probe, \
|
||||||
|
+ .remove = meson_codec_glue_input_dai_remove, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define AIU_CODEC_CTRL_OUTPUT(xname) { \
|
||||||
|
+ .name = "CODEC CTRL " xname, \
|
||||||
|
+ .capture = AIU_CODEC_CTRL_STREAM(xname, "Capture"), \
|
||||||
|
+ .ops = &aiu_codec_ctrl_output_ops, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct snd_soc_dai_driver aiu_hdmi_ctrl_dai_drv[] = {
|
||||||
|
+ [CTRL_I2S] = AIU_CODEC_CTRL_INPUT("HDMI I2S IN"),
|
||||||
|
+ [CTRL_PCM] = AIU_CODEC_CTRL_INPUT("HDMI PCM IN"),
|
||||||
|
+ [CTRL_OUT] = AIU_CODEC_CTRL_OUTPUT("HDMI OUT"),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dapm_route aiu_hdmi_ctrl_routes[] = {
|
||||||
|
+ { "HDMI CTRL SRC", "I2S", "HDMI I2S IN Playback" },
|
||||||
|
+ { "HDMI CTRL SRC", "PCM", "HDMI PCM IN Playback" },
|
||||||
|
+ { "HDMI OUT Capture", NULL, "HDMI CTRL SRC" },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int aiu_hdmi_of_xlate_dai_name(struct snd_soc_component *component,
|
||||||
|
+ struct of_phandle_args *args,
|
||||||
|
+ const char **dai_name)
|
||||||
|
+{
|
||||||
|
+ return aiu_of_xlate_dai_name(component, args, dai_name, AIU_HDMI);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_component_driver aiu_hdmi_ctrl_component = {
|
||||||
|
+ .name = "AIU HDMI Codec Control",
|
||||||
|
+ .dapm_widgets = aiu_hdmi_ctrl_widgets,
|
||||||
|
+ .num_dapm_widgets = ARRAY_SIZE(aiu_hdmi_ctrl_widgets),
|
||||||
|
+ .dapm_routes = aiu_hdmi_ctrl_routes,
|
||||||
|
+ .num_dapm_routes = ARRAY_SIZE(aiu_hdmi_ctrl_routes),
|
||||||
|
+ .of_xlate_dai_name = aiu_hdmi_of_xlate_dai_name,
|
||||||
|
+ .endianness = 1,
|
||||||
|
+ .non_legacy_dai_naming = 1,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+int aiu_hdmi_ctrl_register_component(struct device *dev)
|
||||||
|
+{
|
||||||
|
+ return aiu_add_component(dev, &aiu_hdmi_ctrl_component,
|
||||||
|
+ aiu_hdmi_ctrl_dai_drv,
|
||||||
|
+ ARRAY_SIZE(aiu_hdmi_ctrl_dai_drv),
|
||||||
|
+ "hdmi");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
|
||||||
|
index a62aced9b687..b765dfb70726 100644
|
||||||
|
--- a/sound/soc/meson/aiu.c
|
||||||
|
+++ b/sound/soc/meson/aiu.c
|
||||||
|
@@ -71,6 +71,26 @@ int aiu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int aiu_add_component(struct device *dev,
|
||||||
|
+ const struct snd_soc_component_driver *component_driver,
|
||||||
|
+ struct snd_soc_dai_driver *dai_drv,
|
||||||
|
+ int num_dai,
|
||||||
|
+ const char *debugfs_prefix)
|
||||||
|
+{
|
||||||
|
+ struct snd_soc_component *component;
|
||||||
|
+
|
||||||
|
+ component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL);
|
||||||
|
+ if (!component)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_DEBUG_FS
|
||||||
|
+ component->debugfs_prefix = debugfs_prefix;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+ return snd_soc_add_component(dev, component, component_driver,
|
||||||
|
+ dai_drv, num_dai);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int aiu_cpu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||||
|
struct of_phandle_args *args,
|
||||||
|
const char **dai_name)
|
||||||
|
@@ -313,9 +333,21 @@ static int aiu_probe(struct platform_device *pdev)
|
||||||
|
ret = snd_soc_register_component(dev, &aiu_cpu_component,
|
||||||
|
aiu_cpu_dai_drv,
|
||||||
|
ARRAY_SIZE(aiu_cpu_dai_drv));
|
||||||
|
- if (ret)
|
||||||
|
+ if (ret) {
|
||||||
|
dev_err(dev, "Failed to register cpu component\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
+ /* Register the hdmi codec control component */
|
||||||
|
+ ret = aiu_hdmi_ctrl_register_component(dev);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(dev, "Failed to register hdmi control component\n");
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+err:
|
||||||
|
+ snd_soc_unregister_component(dev);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/aiu.h b/sound/soc/meson/aiu.h
|
||||||
|
index a3488027b9d5..9242ab1ab64b 100644
|
||||||
|
--- a/sound/soc/meson/aiu.h
|
||||||
|
+++ b/sound/soc/meson/aiu.h
|
||||||
|
@@ -45,6 +45,14 @@ int aiu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||||
|
const char **dai_name,
|
||||||
|
unsigned int component_id);
|
||||||
|
|
||||||
|
+int aiu_add_component(struct device *dev,
|
||||||
|
+ const struct snd_soc_component_driver *component_driver,
|
||||||
|
+ struct snd_soc_dai_driver *dai_drv,
|
||||||
|
+ int num_dai,
|
||||||
|
+ const char *debugfs_prefix);
|
||||||
|
+
|
||||||
|
+int aiu_hdmi_ctrl_register_component(struct device *dev);
|
||||||
|
+
|
||||||
|
int aiu_fifo_i2s_dai_probe(struct snd_soc_dai *dai);
|
||||||
|
int aiu_fifo_spdif_dai_probe(struct snd_soc_dai *dai);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,199 +0,0 @@
|
||||||
|
|
||||||
From 137272cdf7cc5be835f44216e6003769d1638480 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Date: Fri, 11 Oct 2019 06:32:40 -0300
|
|
||||||
Subject: [PATCH] media: vb2: add V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF
|
|
||||||
|
|
||||||
This patch adds support for the V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF
|
|
||||||
flag.
|
|
||||||
|
|
||||||
It also adds a new V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF
|
|
||||||
capability.
|
|
||||||
|
|
||||||
Drivers should set vb2_queue->subsystem_flags to
|
|
||||||
VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF to indicate support
|
|
||||||
for this flag.
|
|
||||||
|
|
||||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
|
||||||
---
|
|
||||||
Documentation/media/uapi/v4l/buffer.rst | 13 +++++++++++++
|
|
||||||
Documentation/media/uapi/v4l/vidioc-reqbufs.rst | 6 ++++++
|
|
||||||
drivers/media/common/videobuf2/videobuf2-v4l2.c | 12 ++++++++++--
|
|
||||||
include/media/videobuf2-core.h | 3 +++
|
|
||||||
include/media/videobuf2-v4l2.h | 5 +++++
|
|
||||||
include/uapi/linux/videodev2.h | 13 ++++++++-----
|
|
||||||
6 files changed, 45 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/Documentation/media/uapi/v4l/buffer.rst b/Documentation/media/uapi/v4l/buffer.rst
|
|
||||||
index 1cbd9cde57f3..9149b57728e5 100644
|
|
||||||
--- a/Documentation/media/uapi/v4l/buffer.rst
|
|
||||||
+++ b/Documentation/media/uapi/v4l/buffer.rst
|
|
||||||
@@ -607,6 +607,19 @@ Buffer Flags
|
|
||||||
applications shall use this flag for output buffers if the data in
|
|
||||||
this buffer has not been created by the CPU but by some
|
|
||||||
DMA-capable unit, in which case caches have not been used.
|
|
||||||
+ * .. _`V4L2-BUF-FLAG-M2M-HOLD-CAPTURE-BUF`:
|
|
||||||
+
|
|
||||||
+ - ``V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF``
|
|
||||||
+ - 0x00000200
|
|
||||||
+ - Only valid if ``V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF`` is
|
|
||||||
+ set. It is typically used with stateless decoders where multiple
|
|
||||||
+ output buffers each decode to a slice of the decoded frame.
|
|
||||||
+ Applications can set this flag when queueing the output buffer
|
|
||||||
+ to prevent the driver from dequeueing the capture buffer after
|
|
||||||
+ the output buffer has been decoded (i.e. the capture buffer is
|
|
||||||
+ 'held'). If the timestamp of this output buffer differs from that
|
|
||||||
+ of the previous output buffer, then that indicates the start of a
|
|
||||||
+ new frame and the previously held capture buffer is dequeued.
|
|
||||||
* .. _`V4L2-BUF-FLAG-LAST`:
|
|
||||||
|
|
||||||
- ``V4L2_BUF_FLAG_LAST``
|
|
||||||
diff --git a/Documentation/media/uapi/v4l/vidioc-reqbufs.rst b/Documentation/media/uapi/v4l/vidioc-reqbufs.rst
|
|
||||||
index d7faef10e39b..d0c643db477a 100644
|
|
||||||
--- a/Documentation/media/uapi/v4l/vidioc-reqbufs.rst
|
|
||||||
+++ b/Documentation/media/uapi/v4l/vidioc-reqbufs.rst
|
|
||||||
@@ -125,6 +125,7 @@ aborting or finishing any DMA in progress, an implicit
|
|
||||||
.. _V4L2-BUF-CAP-SUPPORTS-DMABUF:
|
|
||||||
.. _V4L2-BUF-CAP-SUPPORTS-REQUESTS:
|
|
||||||
.. _V4L2-BUF-CAP-SUPPORTS-ORPHANED-BUFS:
|
|
||||||
+.. _V4L2-BUF-CAP-SUPPORTS-M2M-HOLD-CAPTURE-BUF:
|
|
||||||
|
|
||||||
.. cssclass:: longtable
|
|
||||||
|
|
||||||
@@ -150,6 +151,11 @@ aborting or finishing any DMA in progress, an implicit
|
|
||||||
- The kernel allows calling :ref:`VIDIOC_REQBUFS` while buffers are still
|
|
||||||
mapped or exported via DMABUF. These orphaned buffers will be freed
|
|
||||||
when they are unmapped or when the exported DMABUF fds are closed.
|
|
||||||
+ * - ``V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF``
|
|
||||||
+ - 0x00000020
|
|
||||||
+ - Only valid for stateless decoders. If set, then userspace can set the
|
|
||||||
+ ``V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF`` flag to hold off on returning the
|
|
||||||
+ capture buffer until the OUTPUT timestamp changes.
|
|
||||||
|
|
||||||
Return Value
|
|
||||||
============
|
|
||||||
diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c
|
|
||||||
index 5a9ba3846f0a..e652f4318284 100644
|
|
||||||
--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
|
|
||||||
+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
|
|
||||||
@@ -49,8 +49,11 @@ module_param(debug, int, 0644);
|
|
||||||
V4L2_BUF_FLAG_REQUEST_FD | \
|
|
||||||
V4L2_BUF_FLAG_TIMESTAMP_MASK)
|
|
||||||
/* Output buffer flags that should be passed on to the driver */
|
|
||||||
-#define V4L2_BUFFER_OUT_FLAGS (V4L2_BUF_FLAG_PFRAME | V4L2_BUF_FLAG_BFRAME | \
|
|
||||||
- V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_TIMECODE)
|
|
||||||
+#define V4L2_BUFFER_OUT_FLAGS (V4L2_BUF_FLAG_PFRAME | \
|
|
||||||
+ V4L2_BUF_FLAG_BFRAME | \
|
|
||||||
+ V4L2_BUF_FLAG_KEYFRAME | \
|
|
||||||
+ V4L2_BUF_FLAG_TIMECODE | \
|
|
||||||
+ V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* __verify_planes_array() - verify that the planes array passed in struct
|
|
||||||
@@ -194,6 +197,7 @@ static int vb2_fill_vb2_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b
|
|
||||||
}
|
|
||||||
vbuf->sequence = 0;
|
|
||||||
vbuf->request_fd = -1;
|
|
||||||
+ vbuf->is_held = false;
|
|
||||||
|
|
||||||
if (V4L2_TYPE_IS_MULTIPLANAR(b->type)) {
|
|
||||||
switch (b->memory) {
|
|
||||||
@@ -321,6 +325,8 @@ static int vb2_fill_vb2_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b
|
|
||||||
*/
|
|
||||||
vbuf->flags &= ~V4L2_BUF_FLAG_TIMECODE;
|
|
||||||
vbuf->field = b->field;
|
|
||||||
+ if (!(q->subsystem_flags & VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF))
|
|
||||||
+ vbuf->flags &= ~V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF;
|
|
||||||
} else {
|
|
||||||
/* Zero any output buffer flags as this is a capture buffer */
|
|
||||||
vbuf->flags &= ~V4L2_BUFFER_OUT_FLAGS;
|
|
||||||
@@ -654,6 +660,8 @@ static void fill_buf_caps(struct vb2_queue *q, u32 *caps)
|
|
||||||
*caps |= V4L2_BUF_CAP_SUPPORTS_USERPTR;
|
|
||||||
if (q->io_modes & VB2_DMABUF)
|
|
||||||
*caps |= V4L2_BUF_CAP_SUPPORTS_DMABUF;
|
|
||||||
+ if (q->subsystem_flags & VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF)
|
|
||||||
+ *caps |= V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF;
|
|
||||||
#ifdef CONFIG_MEDIA_CONTROLLER_REQUEST_API
|
|
||||||
if (q->supports_requests)
|
|
||||||
*caps |= V4L2_BUF_CAP_SUPPORTS_REQUESTS;
|
|
||||||
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
|
|
||||||
index 640aabe69450..a2b2208b02da 100644
|
|
||||||
--- a/include/media/videobuf2-core.h
|
|
||||||
+++ b/include/media/videobuf2-core.h
|
|
||||||
@@ -505,6 +505,8 @@ struct vb2_buf_ops {
|
|
||||||
* @buf_ops: callbacks to deliver buffer information.
|
|
||||||
* between user-space and kernel-space.
|
|
||||||
* @drv_priv: driver private data.
|
|
||||||
+ * @subsystem_flags: Flags specific to the subsystem (V4L2/DVB/etc.). Not used
|
|
||||||
+ * by the vb2 core.
|
|
||||||
* @buf_struct_size: size of the driver-specific buffer structure;
|
|
||||||
* "0" indicates the driver doesn't want to use a custom buffer
|
|
||||||
* structure type. for example, ``sizeof(struct vb2_v4l2_buffer)``
|
|
||||||
@@ -571,6 +573,7 @@ struct vb2_queue {
|
|
||||||
const struct vb2_buf_ops *buf_ops;
|
|
||||||
|
|
||||||
void *drv_priv;
|
|
||||||
+ u32 subsystem_flags;
|
|
||||||
unsigned int buf_struct_size;
|
|
||||||
u32 timestamp_flags;
|
|
||||||
gfp_t gfp_flags;
|
|
||||||
diff --git a/include/media/videobuf2-v4l2.h b/include/media/videobuf2-v4l2.h
|
|
||||||
index 8a10889dc2fd..59bf33a12648 100644
|
|
||||||
--- a/include/media/videobuf2-v4l2.h
|
|
||||||
+++ b/include/media/videobuf2-v4l2.h
|
|
||||||
@@ -33,6 +33,7 @@
|
|
||||||
* @timecode: frame timecode.
|
|
||||||
* @sequence: sequence count of this frame.
|
|
||||||
* @request_fd: the request_fd associated with this buffer
|
|
||||||
+ * @is_held: if true, then this capture buffer was held
|
|
||||||
* @planes: plane information (userptr/fd, length, bytesused, data_offset).
|
|
||||||
*
|
|
||||||
* Should contain enough information to be able to cover all the fields
|
|
||||||
@@ -46,9 +47,13 @@ struct vb2_v4l2_buffer {
|
|
||||||
struct v4l2_timecode timecode;
|
|
||||||
__u32 sequence;
|
|
||||||
__s32 request_fd;
|
|
||||||
+ bool is_held;
|
|
||||||
struct vb2_plane planes[VB2_MAX_PLANES];
|
|
||||||
};
|
|
||||||
|
|
||||||
+/* VB2 V4L2 flags as set in vb2_queue.subsystem_flags */
|
|
||||||
+#define VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF (1 << 0)
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* to_vb2_v4l2_buffer() - cast struct vb2_buffer * to struct vb2_v4l2_buffer *
|
|
||||||
*/
|
|
||||||
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
|
|
||||||
index b3c0961b62a0..9f4e66affac4 100644
|
|
||||||
--- a/include/uapi/linux/videodev2.h
|
|
||||||
+++ b/include/uapi/linux/videodev2.h
|
|
||||||
@@ -920,11 +920,12 @@ struct v4l2_requestbuffers {
|
|
||||||
};
|
|
||||||
|
|
||||||
/* capabilities for struct v4l2_requestbuffers and v4l2_create_buffers */
|
|
||||||
-#define V4L2_BUF_CAP_SUPPORTS_MMAP (1 << 0)
|
|
||||||
-#define V4L2_BUF_CAP_SUPPORTS_USERPTR (1 << 1)
|
|
||||||
-#define V4L2_BUF_CAP_SUPPORTS_DMABUF (1 << 2)
|
|
||||||
-#define V4L2_BUF_CAP_SUPPORTS_REQUESTS (1 << 3)
|
|
||||||
-#define V4L2_BUF_CAP_SUPPORTS_ORPHANED_BUFS (1 << 4)
|
|
||||||
+#define V4L2_BUF_CAP_SUPPORTS_MMAP (1 << 0)
|
|
||||||
+#define V4L2_BUF_CAP_SUPPORTS_USERPTR (1 << 1)
|
|
||||||
+#define V4L2_BUF_CAP_SUPPORTS_DMABUF (1 << 2)
|
|
||||||
+#define V4L2_BUF_CAP_SUPPORTS_REQUESTS (1 << 3)
|
|
||||||
+#define V4L2_BUF_CAP_SUPPORTS_ORPHANED_BUFS (1 << 4)
|
|
||||||
+#define V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF (1 << 5)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* struct v4l2_plane - plane info for multi-planar buffers
|
|
||||||
@@ -1046,6 +1047,8 @@ static inline __u64 v4l2_timeval_to_ns(const struct timeval *tv)
|
|
||||||
#define V4L2_BUF_FLAG_IN_REQUEST 0x00000080
|
|
||||||
/* timecode field is valid */
|
|
||||||
#define V4L2_BUF_FLAG_TIMECODE 0x00000100
|
|
||||||
+/* Don't return the capture buffer until OUTPUT timestamp changes */
|
|
||||||
+#define V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF 0x00000200
|
|
||||||
/* Buffer is prepared for queuing */
|
|
||||||
#define V4L2_BUF_FLAG_PREPARED 0x00000400
|
|
||||||
/* Cache handling flags */
|
|
||||||
--
|
|
||||||
2.23.0
|
|
|
@ -0,0 +1,279 @@
|
||||||
|
From 8f4eaa1f4e359f2f9847ce1af45e8b17d151c388 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Thu, 13 Feb 2020 16:51:56 +0100
|
||||||
|
Subject: [PATCH 017/101] FROMGIT: ASoC: meson: aiu: add internal dac codec
|
||||||
|
control support
|
||||||
|
|
||||||
|
Add the codec to codec component which handles the routing between
|
||||||
|
the audio producers and the internal audio DAC found on the amlogic GXL
|
||||||
|
SoC family
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/Makefile | 1 +
|
||||||
|
sound/soc/meson/aiu-acodec-ctrl.c | 205 ++++++++++++++++++++++++++++++
|
||||||
|
sound/soc/meson/aiu.c | 10 ++
|
||||||
|
sound/soc/meson/aiu.h | 1 +
|
||||||
|
4 files changed, 217 insertions(+)
|
||||||
|
create mode 100644 sound/soc/meson/aiu-acodec-ctrl.c
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||||
|
index 3b21f648e322..80f9113701b3 100644
|
||||||
|
--- a/sound/soc/meson/Makefile
|
||||||
|
+++ b/sound/soc/meson/Makefile
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||||
|
|
||||||
|
snd-soc-meson-aiu-objs := aiu.o
|
||||||
|
+snd-soc-meson-aiu-objs += aiu-acodec-ctrl.o
|
||||||
|
snd-soc-meson-aiu-objs += aiu-codec-ctrl.o
|
||||||
|
snd-soc-meson-aiu-objs += aiu-encoder-i2s.o
|
||||||
|
snd-soc-meson-aiu-objs += aiu-encoder-spdif.o
|
||||||
|
diff --git a/sound/soc/meson/aiu-acodec-ctrl.c b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..12d8a4d351a1
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||||
|
@@ -0,0 +1,205 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+//
|
||||||
|
+// Copyright (c) 2020 BayLibre, SAS.
|
||||||
|
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+#include <linux/bitfield.h>
|
||||||
|
+#include <sound/pcm_params.h>
|
||||||
|
+#include <sound/soc.h>
|
||||||
|
+#include <sound/soc-dai.h>
|
||||||
|
+
|
||||||
|
+#include <dt-bindings/sound/meson-aiu.h>
|
||||||
|
+#include "aiu.h"
|
||||||
|
+#include "meson-codec-glue.h"
|
||||||
|
+
|
||||||
|
+#define CTRL_DIN_EN 15
|
||||||
|
+#define CTRL_CLK_INV BIT(14)
|
||||||
|
+#define CTRL_LRCLK_INV BIT(13)
|
||||||
|
+#define CTRL_I2S_IN_BCLK_SRC BIT(11)
|
||||||
|
+#define CTRL_DIN_LRCLK_SRC_SHIFT 6
|
||||||
|
+#define CTRL_DIN_LRCLK_SRC (0x3 << CTRL_DIN_LRCLK_SRC_SHIFT)
|
||||||
|
+#define CTRL_BCLK_MCLK_SRC GENMASK(5, 4)
|
||||||
|
+#define CTRL_DIN_SKEW GENMASK(3, 2)
|
||||||
|
+#define CTRL_I2S_OUT_LANE_SRC 0
|
||||||
|
+
|
||||||
|
+#define AIU_ACODEC_OUT_CHMAX 2
|
||||||
|
+
|
||||||
|
+static const char * const aiu_acodec_ctrl_mux_texts[] = {
|
||||||
|
+ "DISABLED", "I2S", "PCM",
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int aiu_acodec_ctrl_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||||
|
+ struct snd_ctl_elem_value *ucontrol)
|
||||||
|
+{
|
||||||
|
+ struct snd_soc_component *component =
|
||||||
|
+ snd_soc_dapm_kcontrol_component(kcontrol);
|
||||||
|
+ struct snd_soc_dapm_context *dapm =
|
||||||
|
+ snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||||
|
+ struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||||
|
+ unsigned int mux, changed;
|
||||||
|
+
|
||||||
|
+ mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||||
|
+ changed = snd_soc_component_test_bits(component, e->reg,
|
||||||
|
+ CTRL_DIN_LRCLK_SRC,
|
||||||
|
+ FIELD_PREP(CTRL_DIN_LRCLK_SRC,
|
||||||
|
+ mux));
|
||||||
|
+
|
||||||
|
+ if (!changed)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ /* Force disconnect of the mux while updating */
|
||||||
|
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||||
|
+
|
||||||
|
+ snd_soc_component_update_bits(component, e->reg,
|
||||||
|
+ CTRL_DIN_LRCLK_SRC |
|
||||||
|
+ CTRL_BCLK_MCLK_SRC,
|
||||||
|
+ FIELD_PREP(CTRL_DIN_LRCLK_SRC, mux) |
|
||||||
|
+ FIELD_PREP(CTRL_BCLK_MCLK_SRC, mux));
|
||||||
|
+
|
||||||
|
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static SOC_ENUM_SINGLE_DECL(aiu_acodec_ctrl_mux_enum, AIU_ACODEC_CTRL,
|
||||||
|
+ CTRL_DIN_LRCLK_SRC_SHIFT,
|
||||||
|
+ aiu_acodec_ctrl_mux_texts);
|
||||||
|
+
|
||||||
|
+static const struct snd_kcontrol_new aiu_acodec_ctrl_mux =
|
||||||
|
+ SOC_DAPM_ENUM_EXT("ACodec Source", aiu_acodec_ctrl_mux_enum,
|
||||||
|
+ snd_soc_dapm_get_enum_double,
|
||||||
|
+ aiu_acodec_ctrl_mux_put_enum);
|
||||||
|
+
|
||||||
|
+static const struct snd_kcontrol_new aiu_acodec_ctrl_out_enable =
|
||||||
|
+ SOC_DAPM_SINGLE_AUTODISABLE("Switch", AIU_ACODEC_CTRL,
|
||||||
|
+ CTRL_DIN_EN, 1, 0);
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dapm_widget aiu_acodec_ctrl_widgets[] = {
|
||||||
|
+ SND_SOC_DAPM_MUX("ACODEC SRC", SND_SOC_NOPM, 0, 0,
|
||||||
|
+ &aiu_acodec_ctrl_mux),
|
||||||
|
+ SND_SOC_DAPM_SWITCH("ACODEC OUT EN", SND_SOC_NOPM, 0, 0,
|
||||||
|
+ &aiu_acodec_ctrl_out_enable),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int aiu_acodec_ctrl_input_hw_params(struct snd_pcm_substream *substream,
|
||||||
|
+ struct snd_pcm_hw_params *params,
|
||||||
|
+ struct snd_soc_dai *dai)
|
||||||
|
+{
|
||||||
|
+ struct meson_codec_glue_input *data;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = meson_codec_glue_input_hw_params(substream, params, dai);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ /* The glue will provide 1 lane out of the 4 to the output */
|
||||||
|
+ data = meson_codec_glue_input_get_data(dai);
|
||||||
|
+ data->params.channels_min = min_t(unsigned int, AIU_ACODEC_OUT_CHMAX,
|
||||||
|
+ data->params.channels_min);
|
||||||
|
+ data->params.channels_max = min_t(unsigned int, AIU_ACODEC_OUT_CHMAX,
|
||||||
|
+ data->params.channels_max);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dai_ops aiu_acodec_ctrl_input_ops = {
|
||||||
|
+ .hw_params = aiu_acodec_ctrl_input_hw_params,
|
||||||
|
+ .set_fmt = meson_codec_glue_input_set_fmt,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dai_ops aiu_acodec_ctrl_output_ops = {
|
||||||
|
+ .startup = meson_codec_glue_output_startup,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+#define AIU_ACODEC_CTRL_FORMATS \
|
||||||
|
+ (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
|
||||||
|
+ SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE | \
|
||||||
|
+ SNDRV_PCM_FMTBIT_S32_LE)
|
||||||
|
+
|
||||||
|
+#define AIU_ACODEC_STREAM(xname, xsuffix, xchmax) \
|
||||||
|
+{ \
|
||||||
|
+ .stream_name = xname " " xsuffix, \
|
||||||
|
+ .channels_min = 1, \
|
||||||
|
+ .channels_max = (xchmax), \
|
||||||
|
+ .rate_min = 5512, \
|
||||||
|
+ .rate_max = 192000, \
|
||||||
|
+ .formats = AIU_ACODEC_CTRL_FORMATS, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define AIU_ACODEC_INPUT(xname) { \
|
||||||
|
+ .name = "ACODEC CTRL " xname, \
|
||||||
|
+ .name = xname, \
|
||||||
|
+ .playback = AIU_ACODEC_STREAM(xname, "Playback", 8), \
|
||||||
|
+ .ops = &aiu_acodec_ctrl_input_ops, \
|
||||||
|
+ .probe = meson_codec_glue_input_dai_probe, \
|
||||||
|
+ .remove = meson_codec_glue_input_dai_remove, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define AIU_ACODEC_OUTPUT(xname) { \
|
||||||
|
+ .name = "ACODEC CTRL " xname, \
|
||||||
|
+ .capture = AIU_ACODEC_STREAM(xname, "Capture", AIU_ACODEC_OUT_CHMAX), \
|
||||||
|
+ .ops = &aiu_acodec_ctrl_output_ops, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct snd_soc_dai_driver aiu_acodec_ctrl_dai_drv[] = {
|
||||||
|
+ [CTRL_I2S] = AIU_ACODEC_INPUT("ACODEC I2S IN"),
|
||||||
|
+ [CTRL_PCM] = AIU_ACODEC_INPUT("ACODEC PCM IN"),
|
||||||
|
+ [CTRL_OUT] = AIU_ACODEC_OUTPUT("ACODEC OUT"),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dapm_route aiu_acodec_ctrl_routes[] = {
|
||||||
|
+ { "ACODEC SRC", "I2S", "ACODEC I2S IN Playback" },
|
||||||
|
+ { "ACODEC SRC", "PCM", "ACODEC PCM IN Playback" },
|
||||||
|
+ { "ACODEC OUT EN", "Switch", "ACODEC SRC" },
|
||||||
|
+ { "ACODEC OUT Capture", NULL, "ACODEC OUT EN" },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_kcontrol_new aiu_acodec_ctrl_controls[] = {
|
||||||
|
+ SOC_SINGLE("ACODEC I2S Lane Select", AIU_ACODEC_CTRL,
|
||||||
|
+ CTRL_I2S_OUT_LANE_SRC, 3, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int aiu_acodec_of_xlate_dai_name(struct snd_soc_component *component,
|
||||||
|
+ struct of_phandle_args *args,
|
||||||
|
+ const char **dai_name)
|
||||||
|
+{
|
||||||
|
+ return aiu_of_xlate_dai_name(component, args, dai_name, AIU_ACODEC);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int aiu_acodec_ctrl_component_probe(struct snd_soc_component *component)
|
||||||
|
+{
|
||||||
|
+ /*
|
||||||
|
+ * NOTE: Din Skew setting
|
||||||
|
+ * According to the documentation, the following update adds one delay
|
||||||
|
+ * to the din line. Without this, the output saturates. This happens
|
||||||
|
+ * regardless of the link format (i2s or left_j) so it is not clear what
|
||||||
|
+ * it actually does but it seems to be required
|
||||||
|
+ */
|
||||||
|
+ snd_soc_component_update_bits(component, AIU_ACODEC_CTRL,
|
||||||
|
+ CTRL_DIN_SKEW,
|
||||||
|
+ FIELD_PREP(CTRL_DIN_SKEW, 2));
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_component_driver aiu_acodec_ctrl_component = {
|
||||||
|
+ .name = "AIU Internal DAC Codec Control",
|
||||||
|
+ .probe = aiu_acodec_ctrl_component_probe,
|
||||||
|
+ .controls = aiu_acodec_ctrl_controls,
|
||||||
|
+ .num_controls = ARRAY_SIZE(aiu_acodec_ctrl_controls),
|
||||||
|
+ .dapm_widgets = aiu_acodec_ctrl_widgets,
|
||||||
|
+ .num_dapm_widgets = ARRAY_SIZE(aiu_acodec_ctrl_widgets),
|
||||||
|
+ .dapm_routes = aiu_acodec_ctrl_routes,
|
||||||
|
+ .num_dapm_routes = ARRAY_SIZE(aiu_acodec_ctrl_routes),
|
||||||
|
+ .of_xlate_dai_name = aiu_acodec_of_xlate_dai_name,
|
||||||
|
+ .endianness = 1,
|
||||||
|
+ .non_legacy_dai_naming = 1,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+int aiu_acodec_ctrl_register_component(struct device *dev)
|
||||||
|
+{
|
||||||
|
+ return aiu_add_component(dev, &aiu_acodec_ctrl_component,
|
||||||
|
+ aiu_acodec_ctrl_dai_drv,
|
||||||
|
+ ARRAY_SIZE(aiu_acodec_ctrl_dai_drv),
|
||||||
|
+ "acodec");
|
||||||
|
+}
|
||||||
|
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
|
||||||
|
index b765dfb70726..5c4845a23a34 100644
|
||||||
|
--- a/sound/soc/meson/aiu.c
|
||||||
|
+++ b/sound/soc/meson/aiu.c
|
||||||
|
@@ -345,6 +345,16 @@ static int aiu_probe(struct platform_device *pdev)
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Register the internal dac control component on gxl */
|
||||||
|
+ if (of_device_is_compatible(dev->of_node, "amlogic,aiu-gxl")) {
|
||||||
|
+ ret = aiu_acodec_ctrl_register_component(dev);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(dev,
|
||||||
|
+ "Failed to register acodec control component\n");
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
err:
|
||||||
|
snd_soc_unregister_component(dev);
|
||||||
|
diff --git a/sound/soc/meson/aiu.h b/sound/soc/meson/aiu.h
|
||||||
|
index 9242ab1ab64b..a65a576e3400 100644
|
||||||
|
--- a/sound/soc/meson/aiu.h
|
||||||
|
+++ b/sound/soc/meson/aiu.h
|
||||||
|
@@ -52,6 +52,7 @@ int aiu_add_component(struct device *dev,
|
||||||
|
const char *debugfs_prefix);
|
||||||
|
|
||||||
|
int aiu_hdmi_ctrl_register_component(struct device *dev);
|
||||||
|
+int aiu_acodec_ctrl_register_component(struct device *dev);
|
||||||
|
|
||||||
|
int aiu_fifo_i2s_dai_probe(struct snd_soc_dai *dai);
|
||||||
|
int aiu_fifo_spdif_dai_probe(struct snd_soc_dai *dai);
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
|
|
||||||
From bac06ec36ea2012ff0daa9767d0f77bf9c6064ec Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Date: Fri, 11 Oct 2019 06:32:42 -0300
|
|
||||||
Subject: [PATCH] media: videodev2.h: add V4L2_DEC_CMD_FLUSH
|
|
||||||
|
|
||||||
Add this new V4L2_DEC_CMD_FLUSH decoder command and document it.
|
|
||||||
|
|
||||||
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
|
|
||||||
Reviewed-by: Alexandre Courbot <acourbot@chromium.org>
|
|
||||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
|
||||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
|
||||||
---
|
|
||||||
Documentation/media/uapi/v4l/vidioc-decoder-cmd.rst | 10 +++++++++-
|
|
||||||
Documentation/media/videodev2.h.rst.exceptions | 1 +
|
|
||||||
include/uapi/linux/videodev2.h | 1 +
|
|
||||||
3 files changed, 11 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/Documentation/media/uapi/v4l/vidioc-decoder-cmd.rst b/Documentation/media/uapi/v4l/vidioc-decoder-cmd.rst
|
|
||||||
index 57f0066f4cff..f1a504836f31 100644
|
|
||||||
--- a/Documentation/media/uapi/v4l/vidioc-decoder-cmd.rst
|
|
||||||
+++ b/Documentation/media/uapi/v4l/vidioc-decoder-cmd.rst
|
|
||||||
@@ -208,7 +208,15 @@ introduced in Linux 3.3. They are, however, mandatory for stateful mem2mem decod
|
|
||||||
been started yet, the driver will return an ``EPERM`` error code. When
|
|
||||||
the decoder is already running, this command does nothing. No
|
|
||||||
flags are defined for this command.
|
|
||||||
-
|
|
||||||
+ * - ``V4L2_DEC_CMD_FLUSH``
|
|
||||||
+ - 4
|
|
||||||
+ - Flush any held capture buffers. Only valid for stateless decoders.
|
|
||||||
+ This command is typically used when the application reached the
|
|
||||||
+ end of the stream and the last output buffer had the
|
|
||||||
+ ``V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF`` flag set. This would prevent
|
|
||||||
+ dequeueing the capture buffer containing the last decoded frame.
|
|
||||||
+ So this command can be used to explicitly flush that final decoded
|
|
||||||
+ frame. This command does nothing if there are no held capture buffers.
|
|
||||||
|
|
||||||
Return Value
|
|
||||||
============
|
|
||||||
diff --git a/Documentation/media/videodev2.h.rst.exceptions b/Documentation/media/videodev2.h.rst.exceptions
|
|
||||||
index b58e381bdf7b..c23e5ef30c78 100644
|
|
||||||
--- a/Documentation/media/videodev2.h.rst.exceptions
|
|
||||||
+++ b/Documentation/media/videodev2.h.rst.exceptions
|
|
||||||
@@ -435,6 +435,7 @@ replace define V4L2_DEC_CMD_START decoder-cmds
|
|
||||||
replace define V4L2_DEC_CMD_STOP decoder-cmds
|
|
||||||
replace define V4L2_DEC_CMD_PAUSE decoder-cmds
|
|
||||||
replace define V4L2_DEC_CMD_RESUME decoder-cmds
|
|
||||||
+replace define V4L2_DEC_CMD_FLUSH decoder-cmds
|
|
||||||
|
|
||||||
replace define V4L2_DEC_CMD_START_MUTE_AUDIO decoder-cmds
|
|
||||||
replace define V4L2_DEC_CMD_PAUSE_TO_BLACK decoder-cmds
|
|
||||||
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
|
|
||||||
index 9f4e66affac4..d969842bbfe2 100644
|
|
||||||
--- a/include/uapi/linux/videodev2.h
|
|
||||||
+++ b/include/uapi/linux/videodev2.h
|
|
||||||
@@ -1984,6 +1984,7 @@ struct v4l2_encoder_cmd {
|
|
||||||
#define V4L2_DEC_CMD_STOP (1)
|
|
||||||
#define V4L2_DEC_CMD_PAUSE (2)
|
|
||||||
#define V4L2_DEC_CMD_RESUME (3)
|
|
||||||
+#define V4L2_DEC_CMD_FLUSH (4)
|
|
||||||
|
|
||||||
/* Flags for V4L2_DEC_CMD_START */
|
|
||||||
#define V4L2_DEC_CMD_START_MUTE_AUDIO (1 << 0)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,39 +0,0 @@
|
||||||
|
|
||||||
From 7119ecef4e5ec51e45e6fbe1b5da4385fcae8ded Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
|
||||||
Date: Wed, 6 Nov 2019 08:02:53 +0100
|
|
||||||
Subject: [PATCH] media: v4l2-mem2mem: Fix hold buf flag checks
|
|
||||||
|
|
||||||
Hold buf flag is set on output queue, not capture. Fix that.
|
|
||||||
|
|
||||||
Fixes: f07602ac3887 ("media: v4l2-mem2mem: add new_frame detection")
|
|
||||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
|
||||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
||||||
---
|
|
||||||
drivers/media/v4l2-core/v4l2-mem2mem.c | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
index db07ef3bf3d0..1afd9c6ad908 100644
|
|
||||||
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
@@ -335,7 +335,7 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (src && dst && (m2m_ctx->cap_q_ctx.q.subsystem_flags &
|
|
||||||
+ if (src && dst && (m2m_ctx->out_q_ctx.q.subsystem_flags &
|
|
||||||
VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF))
|
|
||||||
m2m_ctx->new_frame = !dst->vb2_buf.copied_timestamp ||
|
|
||||||
dst->vb2_buf.timestamp != src->vb2_buf.timestamp;
|
|
||||||
@@ -474,7 +474,7 @@ void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev,
|
|
||||||
* holding capture buffers. Those should use
|
|
||||||
* v4l2_m2m_buf_done_and_job_finish() instead.
|
|
||||||
*/
|
|
||||||
- WARN_ON(m2m_ctx->cap_q_ctx.q.subsystem_flags &
|
|
||||||
+ WARN_ON(m2m_ctx->out_q_ctx.q.subsystem_flags &
|
|
||||||
VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF);
|
|
||||||
spin_lock_irqsave(&m2m_dev->job_spinlock, flags);
|
|
||||||
schedule_next = _v4l2_m2m_job_finish(m2m_dev, m2m_ctx);
|
|
||||||
--
|
|
||||||
2.24.0
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
From 8801f9ef8160ffcd4c742eae11ffc4a51ae6ab5b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Thu, 13 Feb 2020 16:51:58 +0100
|
||||||
|
Subject: [PATCH 019/101] FROMGIT: ASoC: meson: gx: add sound card dt-binding
|
||||||
|
documentation
|
||||||
|
|
||||||
|
Add the dt-binding documentation of sound card supporting the amlogic
|
||||||
|
GX SoC family
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,gx-sound-card.yaml | 113 ++++++++++++++++++
|
||||||
|
1 file changed, 113 insertions(+)
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,gx-sound-card.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,gx-sound-card.yaml b/Documentation/devicetree/bindings/sound/amlogic,gx-sound-card.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..fb374c659be1
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,gx-sound-card.yaml
|
||||||
|
@@ -0,0 +1,113 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,gx-sound-card.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic GX sound card
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ compatible:
|
||||||
|
+ items:
|
||||||
|
+ - const: amlogic,gx-sound-card
|
||||||
|
+
|
||||||
|
+ audio-aux-devs:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/phandle-array
|
||||||
|
+ description: list of auxiliary devices
|
||||||
|
+
|
||||||
|
+ audio-routing:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||||
|
+ minItems: 2
|
||||||
|
+ description: |-
|
||||||
|
+ A list of the connections between audio components. Each entry is a
|
||||||
|
+ pair of strings, the first being the connection's sink, the second
|
||||||
|
+ being the connection's source.
|
||||||
|
+
|
||||||
|
+ audio-widgets:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||||
|
+ minItems: 2
|
||||||
|
+ description: |-
|
||||||
|
+ A list off component DAPM widget. Each entry is a pair of strings,
|
||||||
|
+ the first being the widget type, the second being the widget name
|
||||||
|
+
|
||||||
|
+ model:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/string
|
||||||
|
+ description: User specified audio sound card name
|
||||||
|
+
|
||||||
|
+patternProperties:
|
||||||
|
+ "^dai-link-[0-9]+$":
|
||||||
|
+ type: object
|
||||||
|
+ description: |-
|
||||||
|
+ dai-link child nodes:
|
||||||
|
+ Container for dai-link level properties and the CODEC sub-nodes.
|
||||||
|
+ There should be at least one (and probably more) subnode of this type
|
||||||
|
+
|
||||||
|
+ properties:
|
||||||
|
+ dai-format:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/string
|
||||||
|
+ enum: [ i2s, left-j, dsp_a ]
|
||||||
|
+
|
||||||
|
+ mclk-fs:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
+ description: |-
|
||||||
|
+ Multiplication factor between the frame rate and master clock
|
||||||
|
+ rate
|
||||||
|
+
|
||||||
|
+ sound-dai:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
+ description: phandle of the CPU DAI
|
||||||
|
+
|
||||||
|
+ patternProperties:
|
||||||
|
+ "^codec-[0-9]+$":
|
||||||
|
+ type: object
|
||||||
|
+ description: |-
|
||||||
|
+ Codecs:
|
||||||
|
+ dai-link representing backend links should have at least one subnode.
|
||||||
|
+ One subnode for each codec of the dai-link. dai-link representing
|
||||||
|
+ frontend links have no codec, therefore have no subnodes
|
||||||
|
+
|
||||||
|
+ properties:
|
||||||
|
+ sound-dai:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
+ description: phandle of the codec DAI
|
||||||
|
+
|
||||||
|
+ required:
|
||||||
|
+ - sound-dai
|
||||||
|
+
|
||||||
|
+ required:
|
||||||
|
+ - sound-dai
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - model
|
||||||
|
+ - dai-link-0
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ sound {
|
||||||
|
+ compatible = "amlogic,gx-sound-card";
|
||||||
|
+ model = "GXL-ACME-S905X-FOO";
|
||||||
|
+ audio-aux-devs = <&>;
|
||||||
|
+ audio-routing = "I2S ENCODER I2S IN", "I2S FIFO Playback";
|
||||||
|
+
|
||||||
|
+ dai-link-0 {
|
||||||
|
+ sound-dai = <&i2s_fifo>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-1 {
|
||||||
|
+ sound-dai = <&i2s_encoder>;
|
||||||
|
+ dai-format = "i2s";
|
||||||
|
+ mclk-fs = <256>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&codec0>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ codec-1 {
|
||||||
|
+ sound-dai = <&codec1>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
Add DPB entry flags to help indicate when a reference frame is a field picture
|
|
||||||
and how the DPB entry is referenced, top or bottom field or full frame.
|
|
||||||
|
|
||||||
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
|
|
||||||
---
|
|
||||||
Documentation/media/uapi/v4l/ext-ctrls-codec.rst | 12 ++++++++++++
|
|
||||||
include/media/h264-ctrls.h | 4 ++++
|
|
||||||
2 files changed, 16 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst
|
|
||||||
index bc5dd8e76567..eb6c32668ad7 100644
|
|
||||||
--- a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst
|
|
||||||
+++ b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst
|
|
||||||
@@ -2022,6 +2022,18 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
|
|
||||||
* - ``V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM``
|
|
||||||
- 0x00000004
|
|
||||||
- The DPB entry is a long term reference frame
|
|
||||||
+ * - ``V4L2_H264_DPB_ENTRY_FLAG_FIELD_PICTURE``
|
|
||||||
+ - 0x00000008
|
|
||||||
+ - The DPB entry is a field picture
|
|
||||||
+ * - ``V4L2_H264_DPB_ENTRY_FLAG_REF_TOP``
|
|
||||||
+ - 0x00000010
|
|
||||||
+ - The DPB entry is a top field reference
|
|
||||||
+ * - ``V4L2_H264_DPB_ENTRY_FLAG_REF_BOTTOM``
|
|
||||||
+ - 0x00000020
|
|
||||||
+ - The DPB entry is a bottom field reference
|
|
||||||
+ * - ``V4L2_H264_DPB_ENTRY_FLAG_REF_FRAME``
|
|
||||||
+ - 0x00000030
|
|
||||||
+ - The DPB entry is a reference frame
|
|
||||||
|
|
||||||
``V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE (enum)``
|
|
||||||
Specifies the decoding mode to use. Currently exposes slice-based and
|
|
||||||
diff --git a/include/media/h264-ctrls.h b/include/media/h264-ctrls.h
|
|
||||||
index e877bf1d537c..76020ebd1e6c 100644
|
|
||||||
--- a/include/media/h264-ctrls.h
|
|
||||||
+++ b/include/media/h264-ctrls.h
|
|
||||||
@@ -185,6 +185,10 @@ struct v4l2_ctrl_h264_slice_params {
|
|
||||||
#define V4L2_H264_DPB_ENTRY_FLAG_VALID 0x01
|
|
||||||
#define V4L2_H264_DPB_ENTRY_FLAG_ACTIVE 0x02
|
|
||||||
#define V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM 0x04
|
|
||||||
+#define V4L2_H264_DPB_ENTRY_FLAG_FIELD_PICTURE 0x08
|
|
||||||
+#define V4L2_H264_DPB_ENTRY_FLAG_REF_TOP 0x10
|
|
||||||
+#define V4L2_H264_DPB_ENTRY_FLAG_REF_BOTTOM 0x20
|
|
||||||
+#define V4L2_H264_DPB_ENTRY_FLAG_REF_FRAME 0x30
|
|
||||||
|
|
||||||
struct v4l2_h264_dpb_entry {
|
|
||||||
__u64 reference_ts;
|
|
|
@ -0,0 +1,202 @@
|
||||||
|
From 4507cab01100fbe8e85b1c2ae362830c26b9f1e2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Thu, 13 Feb 2020 16:51:59 +0100
|
||||||
|
Subject: [PATCH 020/101] FROMGIT: ASoC: meson: gx: add sound card support
|
||||||
|
|
||||||
|
Add support for the sound card used on the amlogic GX SoC family
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/Kconfig | 7 ++
|
||||||
|
sound/soc/meson/Makefile | 2 +
|
||||||
|
sound/soc/meson/gx-card.c | 141 ++++++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 150 insertions(+)
|
||||||
|
create mode 100644 sound/soc/meson/gx-card.c
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/Kconfig b/sound/soc/meson/Kconfig
|
||||||
|
index 347fa78e309a..22d2af75b59e 100644
|
||||||
|
--- a/sound/soc/meson/Kconfig
|
||||||
|
+++ b/sound/soc/meson/Kconfig
|
||||||
|
@@ -101,6 +101,13 @@ config SND_MESON_CARD_UTILS
|
||||||
|
config SND_MESON_CODEC_GLUE
|
||||||
|
tristate
|
||||||
|
|
||||||
|
+config SND_MESON_GX_SOUND_CARD
|
||||||
|
+ tristate "Amlogic GX Sound Card Support"
|
||||||
|
+ select SND_MESON_CARD_UTILS
|
||||||
|
+ imply SND_MESON_AIU
|
||||||
|
+ help
|
||||||
|
+ Select Y or M to add support for the GXBB/GXL SoC sound card
|
||||||
|
+
|
||||||
|
config SND_MESON_G12A_TOHDMITX
|
||||||
|
tristate "Amlogic G12A To HDMI TX Control Support"
|
||||||
|
select REGMAP_MMIO
|
||||||
|
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||||
|
index bef2b72fd7a7..f9c90c391498 100644
|
||||||
|
--- a/sound/soc/meson/Makefile
|
||||||
|
+++ b/sound/soc/meson/Makefile
|
||||||
|
@@ -21,6 +21,7 @@ snd-soc-meson-axg-spdifout-objs := axg-spdifout.o
|
||||||
|
snd-soc-meson-axg-pdm-objs := axg-pdm.o
|
||||||
|
snd-soc-meson-card-utils-objs := meson-card-utils.o
|
||||||
|
snd-soc-meson-codec-glue-objs := meson-codec-glue.o
|
||||||
|
+snd-soc-meson-gx-sound-card-objs := gx-card.o
|
||||||
|
snd-soc-meson-g12a-tohdmitx-objs := g12a-tohdmitx.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_SND_MESON_AIU) += snd-soc-meson-aiu.o
|
||||||
|
@@ -37,4 +38,5 @@ obj-$(CONFIG_SND_MESON_AXG_SPDIFOUT) += snd-soc-meson-axg-spdifout.o
|
||||||
|
obj-$(CONFIG_SND_MESON_AXG_PDM) += snd-soc-meson-axg-pdm.o
|
||||||
|
obj-$(CONFIG_SND_MESON_CARD_UTILS) += snd-soc-meson-card-utils.o
|
||||||
|
obj-$(CONFIG_SND_MESON_CODEC_GLUE) += snd-soc-meson-codec-glue.o
|
||||||
|
+obj-$(CONFIG_SND_MESON_GX_SOUND_CARD) += snd-soc-meson-gx-sound-card.o
|
||||||
|
obj-$(CONFIG_SND_MESON_G12A_TOHDMITX) += snd-soc-meson-g12a-tohdmitx.o
|
||||||
|
diff --git a/sound/soc/meson/gx-card.c b/sound/soc/meson/gx-card.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..7b01dcb73e5e
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sound/soc/meson/gx-card.c
|
||||||
|
@@ -0,0 +1,141 @@
|
||||||
|
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||||
|
+//
|
||||||
|
+// Copyright (c) 2020 BayLibre, SAS.
|
||||||
|
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/of_platform.h>
|
||||||
|
+#include <sound/soc.h>
|
||||||
|
+#include <sound/soc-dai.h>
|
||||||
|
+
|
||||||
|
+#include "meson-card.h"
|
||||||
|
+
|
||||||
|
+struct gx_dai_link_i2s_data {
|
||||||
|
+ unsigned int mclk_fs;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Base params for the codec to codec links
|
||||||
|
+ * Those will be over-written by the CPU side of the link
|
||||||
|
+ */
|
||||||
|
+static const struct snd_soc_pcm_stream codec_params = {
|
||||||
|
+ .formats = SNDRV_PCM_FMTBIT_S24_LE,
|
||||||
|
+ .rate_min = 5525,
|
||||||
|
+ .rate_max = 192000,
|
||||||
|
+ .channels_min = 1,
|
||||||
|
+ .channels_max = 8,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int gx_card_i2s_be_hw_params(struct snd_pcm_substream *substream,
|
||||||
|
+ struct snd_pcm_hw_params *params)
|
||||||
|
+{
|
||||||
|
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
|
+ struct meson_card *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||||
|
+ struct gx_dai_link_i2s_data *be =
|
||||||
|
+ (struct gx_dai_link_i2s_data *)priv->link_data[rtd->num];
|
||||||
|
+
|
||||||
|
+ return meson_card_i2s_set_sysclk(substream, params, be->mclk_fs);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_ops gx_card_i2s_be_ops = {
|
||||||
|
+ .hw_params = gx_card_i2s_be_hw_params,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int gx_card_parse_i2s(struct snd_soc_card *card,
|
||||||
|
+ struct device_node *node,
|
||||||
|
+ int *index)
|
||||||
|
+{
|
||||||
|
+ struct meson_card *priv = snd_soc_card_get_drvdata(card);
|
||||||
|
+ struct snd_soc_dai_link *link = &card->dai_link[*index];
|
||||||
|
+ struct gx_dai_link_i2s_data *be;
|
||||||
|
+
|
||||||
|
+ /* Allocate i2s link parameters */
|
||||||
|
+ be = devm_kzalloc(card->dev, sizeof(*be), GFP_KERNEL);
|
||||||
|
+ if (!be)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ priv->link_data[*index] = be;
|
||||||
|
+
|
||||||
|
+ /* Setup i2s link */
|
||||||
|
+ link->ops = &gx_card_i2s_be_ops;
|
||||||
|
+ link->dai_fmt = meson_card_parse_daifmt(node, link->cpus->of_node);
|
||||||
|
+
|
||||||
|
+ of_property_read_u32(node, "mclk-fs", &be->mclk_fs);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int gx_card_cpu_identify(struct snd_soc_dai_link_component *c,
|
||||||
|
+ char *match)
|
||||||
|
+{
|
||||||
|
+ if (of_device_is_compatible(c->of_node, DT_PREFIX "aiu")) {
|
||||||
|
+ if (strstr(c->dai_name, match))
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* dai not matched */
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int gx_card_add_link(struct snd_soc_card *card, struct device_node *np,
|
||||||
|
+ int *index)
|
||||||
|
+{
|
||||||
|
+ struct snd_soc_dai_link *dai_link = &card->dai_link[*index];
|
||||||
|
+ struct snd_soc_dai_link_component *cpu;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ cpu = devm_kzalloc(card->dev, sizeof(*cpu), GFP_KERNEL);
|
||||||
|
+ if (!cpu)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ dai_link->cpus = cpu;
|
||||||
|
+ dai_link->num_cpus = 1;
|
||||||
|
+
|
||||||
|
+ ret = meson_card_parse_dai(card, np, &dai_link->cpus->of_node,
|
||||||
|
+ &dai_link->cpus->dai_name);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ if (gx_card_cpu_identify(dai_link->cpus, "FIFO"))
|
||||||
|
+ ret = meson_card_set_fe_link(card, dai_link, np, true);
|
||||||
|
+ else
|
||||||
|
+ ret = meson_card_set_be_link(card, dai_link, np);
|
||||||
|
+
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ /* Check if the cpu is the i2s encoder and parse i2s data */
|
||||||
|
+ if (gx_card_cpu_identify(dai_link->cpus, "I2S Encoder"))
|
||||||
|
+ ret = gx_card_parse_i2s(card, np, index);
|
||||||
|
+
|
||||||
|
+ /* Or apply codec to codec params if necessary */
|
||||||
|
+ else if (gx_card_cpu_identify(dai_link->cpus, "CODEC CTRL"))
|
||||||
|
+ dai_link->params = &codec_params;
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct meson_card_match_data gx_card_match_data = {
|
||||||
|
+ .add_link = gx_card_add_link,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct of_device_id gx_card_of_match[] = {
|
||||||
|
+ {
|
||||||
|
+ .compatible = "amlogic,gx-sound-card",
|
||||||
|
+ .data = &gx_card_match_data,
|
||||||
|
+ }, {}
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, gx_card_of_match);
|
||||||
|
+
|
||||||
|
+static struct platform_driver gx_card_pdrv = {
|
||||||
|
+ .probe = meson_card_probe,
|
||||||
|
+ .remove = meson_card_remove,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "gx-sound-card",
|
||||||
|
+ .of_match_table = gx_card_of_match,
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+module_platform_driver(gx_card_pdrv);
|
||||||
|
+
|
||||||
|
+MODULE_DESCRIPTION("Amlogic GX ALSA machine driver");
|
||||||
|
+MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
|
||||||
|
+MODULE_LICENSE("GPL v2");
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,145 +0,0 @@
|
||||||
|
|
||||||
If a decoder needs a minimal buffer count to be queued on it's CAPTURE
|
|
||||||
queue, if a CMD_STOP is sent after a STREAMON but before all the required
|
|
||||||
buffers are queued, it should comply to the drain sequence and mark the
|
|
||||||
last queued buffer with V4L2_BUF_FLAG_LAST and mark it done to be dequeued.
|
|
||||||
|
|
||||||
This introduces a v4l2-mem2mem ioctl decoder command to track the command
|
|
||||||
sent to the decoder, and should be called by the affected drivers.
|
|
||||||
|
|
||||||
Suggested-by: Hans Verkuil <hverkuil@xs4all.nl>
|
|
||||||
Suggested-by: Maxime Jourdan <mjourdan@baylibre.com>
|
|
||||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
||||||
---
|
|
||||||
drivers/media/v4l2-core/v4l2-mem2mem.c | 61 +++++++++++++++++++++++++-
|
|
||||||
include/media/v4l2-mem2mem.h | 14 ++++++
|
|
||||||
2 files changed, 73 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
index 1afd9c6ad908..b09616f9f102 100644
|
|
||||||
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
||||||
@@ -556,6 +556,28 @@ int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(v4l2_m2m_querybuf);
|
|
||||||
|
|
||||||
+static void v4l2_m2m_flag_last_buf_done(struct vb2_queue *q)
|
|
||||||
+{
|
|
||||||
+ struct vb2_buffer *vb;
|
|
||||||
+ struct vb2_v4l2_buffer *vbuf;
|
|
||||||
+ unsigned int i;
|
|
||||||
+
|
|
||||||
+ if (WARN_ON(q->is_output))
|
|
||||||
+ return;
|
|
||||||
+ if (list_empty(&q->queued_list))
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ vb = list_first_entry(&q->queued_list, struct vb2_buffer, queued_entry);
|
|
||||||
+ for (i = 0; i < vb->num_planes; i++)
|
|
||||||
+ vb2_set_plane_payload(vb, i, 0);
|
|
||||||
+
|
|
||||||
+ vb->state = VB2_BUF_STATE_ACTIVE;
|
|
||||||
+ atomic_inc(&q->owned_by_drv_count);
|
|
||||||
+ vbuf = to_vb2_v4l2_buffer(vb);
|
|
||||||
+ vbuf->flags |= V4L2_BUF_FLAG_LAST;
|
|
||||||
+ vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
||||||
struct v4l2_buffer *buf)
|
|
||||||
{
|
|
||||||
@@ -570,11 +592,22 @@ int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
||||||
__func__);
|
|
||||||
return -EPERM;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
ret = vb2_qbuf(vq, vdev->v4l2_dev->mdev, buf);
|
|
||||||
- if (!ret && !(buf->flags & V4L2_BUF_FLAG_IN_REQUEST))
|
|
||||||
+ if (ret)
|
|
||||||
+ return ret;
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * If the capture queue isn't streaming and we were asked to
|
|
||||||
+ * stop, DONE the buffer instantly and flag as LAST
|
|
||||||
+ */
|
|
||||||
+ if (!V4L2_TYPE_IS_OUTPUT(vq->type) && m2m_ctx->stopped &&
|
|
||||||
+ vb2_is_streaming(vq) && !vb2_start_streaming_called(vq))
|
|
||||||
+ v4l2_m2m_flag_last_buf_done(vq);
|
|
||||||
+ else if ((buf->flags & V4L2_BUF_FLAG_IN_REQUEST))
|
|
||||||
v4l2_m2m_try_schedule(m2m_ctx);
|
|
||||||
|
|
||||||
- return ret;
|
|
||||||
+ return 0;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(v4l2_m2m_qbuf);
|
|
||||||
|
|
||||||
@@ -1225,6 +1258,30 @@ int v4l2_m2m_ioctl_try_decoder_cmd(struct file *file, void *fh,
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_try_decoder_cmd);
|
|
||||||
|
|
||||||
+int v4l2_m2m_decoder_cmd(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
||||||
+ struct v4l2_decoder_cmd *dc)
|
|
||||||
+{
|
|
||||||
+ if (dc->cmd != V4L2_DEC_CMD_STOP && dc->cmd != V4L2_DEC_CMD_START)
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ if (dc->cmd == V4L2_DEC_CMD_STOP)
|
|
||||||
+ m2m_ctx->stopped = true;
|
|
||||||
+ else
|
|
||||||
+ m2m_ctx->stopped = false;
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL_GPL(v4l2_m2m_decoder_cmd);
|
|
||||||
+
|
|
||||||
+int v4l2_m2m_ioctl_decoder_cmd(struct file *file, void *priv,
|
|
||||||
+ struct v4l2_decoder_cmd *dc)
|
|
||||||
+{
|
|
||||||
+ struct v4l2_fh *fh = file->private_data;
|
|
||||||
+
|
|
||||||
+ return v4l2_m2m_decoder_cmd(file, fh->m2m_ctx, dc);
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_decoder_cmd);
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* v4l2_file_operations helpers. It is assumed here same lock is used
|
|
||||||
* for the output and the capture buffer queue.
|
|
||||||
diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h
|
|
||||||
index 1d85e24791e4..4c083cffdd86 100644
|
|
||||||
--- a/include/media/v4l2-mem2mem.h
|
|
||||||
+++ b/include/media/v4l2-mem2mem.h
|
|
||||||
@@ -98,6 +98,8 @@ struct v4l2_m2m_ctx {
|
|
||||||
|
|
||||||
bool new_frame;
|
|
||||||
|
|
||||||
+ bool stopped;
|
|
||||||
+
|
|
||||||
/* internal use only */
|
|
||||||
struct v4l2_m2m_dev *m2m_dev;
|
|
||||||
|
|
||||||
@@ -312,6 +314,16 @@ int v4l2_m2m_streamon(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
||||||
int v4l2_m2m_streamoff(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
||||||
enum v4l2_buf_type type);
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * v4l2_m2m_decoder_cmd() - execute a decoder command
|
|
||||||
+ *
|
|
||||||
+ * @file: pointer to struct &file
|
|
||||||
+ * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
|
|
||||||
+ * @dc: pointer to the decoder command
|
|
||||||
+ */
|
|
||||||
+int v4l2_m2m_decoder_cmd(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
||||||
+ struct v4l2_decoder_cmd *dc);
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* v4l2_m2m_poll() - poll replacement, for destination buffers only
|
|
||||||
*
|
|
||||||
@@ -704,6 +716,8 @@ int v4l2_m2m_ioctl_streamon(struct file *file, void *fh,
|
|
||||||
enum v4l2_buf_type type);
|
|
||||||
int v4l2_m2m_ioctl_streamoff(struct file *file, void *fh,
|
|
||||||
enum v4l2_buf_type type);
|
|
||||||
+int v4l2_m2m_ioctl_decoder_cmd(struct file *file, void *fh,
|
|
||||||
+ struct v4l2_decoder_cmd *dc);
|
|
||||||
int v4l2_m2m_ioctl_try_encoder_cmd(struct file *file, void *fh,
|
|
||||||
struct v4l2_encoder_cmd *ec);
|
|
||||||
int v4l2_m2m_ioctl_try_decoder_cmd(struct file *file, void *fh,
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
From 0fcdfa1683d3fcc471860fbd476ac463203add2e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Mon, 17 Feb 2020 02:47:55 +0000
|
||||||
|
Subject: [PATCH 021/101] FROMGIT: ASoC: meson: aiu: remove unused encoder
|
||||||
|
structure
|
||||||
|
|
||||||
|
Remove an unused structure definition which slipped through the initial
|
||||||
|
driver submission.
|
||||||
|
|
||||||
|
Fixes: 6ae9ca9ce986 ("ASoC: meson: aiu: add i2s and spdif support")
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/aiu-encoder-i2s.c | 7 -------
|
||||||
|
1 file changed, 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/aiu-encoder-i2s.c b/sound/soc/meson/aiu-encoder-i2s.c
|
||||||
|
index 13bf029086a9..4900e38e7e49 100644
|
||||||
|
--- a/sound/soc/meson/aiu-encoder-i2s.c
|
||||||
|
+++ b/sound/soc/meson/aiu-encoder-i2s.c
|
||||||
|
@@ -28,13 +28,6 @@
|
||||||
|
#define AIU_CLK_CTRL_MORE_I2S_DIV GENMASK(5, 0)
|
||||||
|
#define AIU_CODEC_DAC_LRCLK_CTRL_DIV GENMASK(11, 0)
|
||||||
|
|
||||||
|
-struct aiu_encoder_i2s {
|
||||||
|
- struct clk *aoclk;
|
||||||
|
- struct clk *mclk;
|
||||||
|
- struct clk *mixer;
|
||||||
|
- struct clk *pclk;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
static void aiu_encoder_i2s_divider_enable(struct snd_soc_component *component,
|
||||||
|
bool enable)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
From 47918c96161708c5ff4476e5e251edbb0df85baf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Mon, 17 Feb 2020 02:51:14 +0000
|
||||||
|
Subject: [PATCH 022/101] FROMGIT: ASoC: meson: aiu: fix clk bulk size
|
||||||
|
allocation
|
||||||
|
|
||||||
|
Fix the size of allocated memory for the clock bulk data
|
||||||
|
|
||||||
|
Fixes: 6ae9ca9ce986 ("ASoC: meson: aiu: add i2s and spdif support")
|
||||||
|
Reported-by: kbuild test robot <lkp@intel.com>
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/aiu.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
|
||||||
|
index 5c4845a23a34..de678a9d5cab 100644
|
||||||
|
--- a/sound/soc/meson/aiu.c
|
||||||
|
+++ b/sound/soc/meson/aiu.c
|
||||||
|
@@ -203,7 +203,7 @@ static int aiu_clk_bulk_get(struct device *dev,
|
||||||
|
struct clk_bulk_data *clks;
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
|
- clks = devm_kcalloc(dev, num, sizeof(clks), GFP_KERNEL);
|
||||||
|
+ clks = devm_kcalloc(dev, num, sizeof(*clks), GFP_KERNEL);
|
||||||
|
if (!clks)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
From 48b720064dfd0f38c953b09c71b308b8cc991205 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Mon, 17 Feb 2020 02:52:13 +0000
|
||||||
|
Subject: [PATCH 023/101] FROMGIT: ASoC: meson: aiu: fix irq registration
|
||||||
|
|
||||||
|
The aiu stored the irq in an unsigned integer which may have discarded an
|
||||||
|
error returned by platform_get_irq_byname(). This is incorrect and should
|
||||||
|
have been a signed integer.
|
||||||
|
|
||||||
|
Also drop the irq error traces from the probe function as this is already
|
||||||
|
done by platform_get_irq_byname().
|
||||||
|
|
||||||
|
Fixes: 6ae9ca9ce986 ("ASoC: meson: aiu: add i2s and spdif support")
|
||||||
|
Reported-by: kbuild test robot <lkp@intel.com>
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/aiu.c | 8 ++------
|
||||||
|
sound/soc/meson/aiu.h | 2 +-
|
||||||
|
2 files changed, 3 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
|
||||||
|
index de678a9d5cab..34b40b8b8299 100644
|
||||||
|
--- a/sound/soc/meson/aiu.c
|
||||||
|
+++ b/sound/soc/meson/aiu.c
|
||||||
|
@@ -314,16 +314,12 @@ static int aiu_probe(struct platform_device *pdev)
|
||||||
|
}
|
||||||
|
|
||||||
|
aiu->i2s.irq = platform_get_irq_byname(pdev, "i2s");
|
||||||
|
- if (aiu->i2s.irq < 0) {
|
||||||
|
- dev_err(dev, "Can't get i2s irq\n");
|
||||||
|
+ if (aiu->i2s.irq < 0)
|
||||||
|
return aiu->i2s.irq;
|
||||||
|
- }
|
||||||
|
|
||||||
|
aiu->spdif.irq = platform_get_irq_byname(pdev, "spdif");
|
||||||
|
- if (aiu->spdif.irq < 0) {
|
||||||
|
- dev_err(dev, "Can't get spdif irq\n");
|
||||||
|
+ if (aiu->spdif.irq < 0)
|
||||||
|
return aiu->spdif.irq;
|
||||||
|
- }
|
||||||
|
|
||||||
|
ret = aiu_clk_get(dev);
|
||||||
|
if (ret)
|
||||||
|
diff --git a/sound/soc/meson/aiu.h b/sound/soc/meson/aiu.h
|
||||||
|
index a65a576e3400..097c26de7b7c 100644
|
||||||
|
--- a/sound/soc/meson/aiu.h
|
||||||
|
+++ b/sound/soc/meson/aiu.h
|
||||||
|
@@ -26,7 +26,7 @@ enum aiu_clk_ids {
|
||||||
|
struct aiu_interface {
|
||||||
|
struct clk_bulk_data *clks;
|
||||||
|
unsigned int clk_num;
|
||||||
|
- unsigned int irq;
|
||||||
|
+ int irq;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct aiu {
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
From 529833095960c9eebefd028b70bff7e6d282b69a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Mon, 17 Feb 2020 02:53:13 +0000
|
||||||
|
Subject: [PATCH 024/101] FROMGIT: ASoC: meson: aiu: fix acodec dai input name
|
||||||
|
init
|
||||||
|
|
||||||
|
Remove the double initialization of the dai input name as reported by
|
||||||
|
sparse.
|
||||||
|
|
||||||
|
Fixes: 65816025d461 ("ASoC: meson: aiu: add internal dac codec control support")
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/aiu-acodec-ctrl.c | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/aiu-acodec-ctrl.c b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||||
|
index 12d8a4d351a1..b8e88b1a4fc8 100644
|
||||||
|
--- a/sound/soc/meson/aiu-acodec-ctrl.c
|
||||||
|
+++ b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||||
|
@@ -128,7 +128,6 @@ static const struct snd_soc_dai_ops aiu_acodec_ctrl_output_ops = {
|
||||||
|
|
||||||
|
#define AIU_ACODEC_INPUT(xname) { \
|
||||||
|
.name = "ACODEC CTRL " xname, \
|
||||||
|
- .name = xname, \
|
||||||
|
.playback = AIU_ACODEC_STREAM(xname, "Playback", 8), \
|
||||||
|
.ops = &aiu_acodec_ctrl_input_ops, \
|
||||||
|
.probe = meson_codec_glue_input_dai_probe, \
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
From 4776e65b21b55cd429dfe6168df4b22adc2caa52 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Mon, 17 Feb 2020 02:54:18 +0000
|
||||||
|
Subject: [PATCH 025/101] FROMGIT: ASoC: meson: codec-glue: fix pcm format cast
|
||||||
|
warning
|
||||||
|
|
||||||
|
Clarify the cast of snd_pcm_format_t and fix the sparse warning:
|
||||||
|
restricted snd_pcm_format_t degrades to integer
|
||||||
|
|
||||||
|
Fixes: 9c29fd9bdf92 ("ASoC: meson: g12a: extract codec-to-codec utils")
|
||||||
|
Reported-by: kbuild test robot <lkp@intel.com>
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/meson-codec-glue.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/meson-codec-glue.c b/sound/soc/meson/meson-codec-glue.c
|
||||||
|
index 97bbc967e176..524a33472337 100644
|
||||||
|
--- a/sound/soc/meson/meson-codec-glue.c
|
||||||
|
+++ b/sound/soc/meson/meson-codec-glue.c
|
||||||
|
@@ -74,7 +74,7 @@ int meson_codec_glue_input_hw_params(struct snd_pcm_substream *substream,
|
||||||
|
data->params.rates = snd_pcm_rate_to_rate_bit(params_rate(params));
|
||||||
|
data->params.rate_min = params_rate(params);
|
||||||
|
data->params.rate_max = params_rate(params);
|
||||||
|
- data->params.formats = 1 << params_format(params);
|
||||||
|
+ data->params.formats = 1ULL << (__force int) params_format(params);
|
||||||
|
data->params.channels_min = params_channels(params);
|
||||||
|
data->params.channels_max = params_channels(params);
|
||||||
|
data->params.sig_bits = dai->driver->playback.sig_bits;
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
From 79bf504bff5167b244e1e86cd6e85c6a6c87764f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Mon, 17 Feb 2020 17:16:47 +0000
|
||||||
|
Subject: [PATCH 026/101] FROMGIT: ASoC: meson: aiu: simplify component
|
||||||
|
addition
|
||||||
|
|
||||||
|
Now that the component name is unique within ASoC, there is no need to
|
||||||
|
hack the debugfs prefix to add more than one ASoC component to a linux
|
||||||
|
device. Remove the unnecessary function and use
|
||||||
|
snd_soc_register_component() directly.
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/aiu-acodec-ctrl.c | 7 +++----
|
||||||
|
sound/soc/meson/aiu-codec-ctrl.c | 7 +++----
|
||||||
|
sound/soc/meson/aiu.c | 20 --------------------
|
||||||
|
sound/soc/meson/aiu.h | 8 --------
|
||||||
|
4 files changed, 6 insertions(+), 36 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/aiu-acodec-ctrl.c b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||||
|
index b8e88b1a4fc8..7078197e0cc5 100644
|
||||||
|
--- a/sound/soc/meson/aiu-acodec-ctrl.c
|
||||||
|
+++ b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||||
|
@@ -197,8 +197,7 @@ static const struct snd_soc_component_driver aiu_acodec_ctrl_component = {
|
||||||
|
|
||||||
|
int aiu_acodec_ctrl_register_component(struct device *dev)
|
||||||
|
{
|
||||||
|
- return aiu_add_component(dev, &aiu_acodec_ctrl_component,
|
||||||
|
- aiu_acodec_ctrl_dai_drv,
|
||||||
|
- ARRAY_SIZE(aiu_acodec_ctrl_dai_drv),
|
||||||
|
- "acodec");
|
||||||
|
+ return snd_soc_register_component(dev, &aiu_acodec_ctrl_component,
|
||||||
|
+ aiu_acodec_ctrl_dai_drv,
|
||||||
|
+ ARRAY_SIZE(aiu_acodec_ctrl_dai_drv));
|
||||||
|
}
|
||||||
|
diff --git a/sound/soc/meson/aiu-codec-ctrl.c b/sound/soc/meson/aiu-codec-ctrl.c
|
||||||
|
index 8646a953e3b3..4b773d3e8b07 100644
|
||||||
|
--- a/sound/soc/meson/aiu-codec-ctrl.c
|
||||||
|
+++ b/sound/soc/meson/aiu-codec-ctrl.c
|
||||||
|
@@ -144,9 +144,8 @@ static const struct snd_soc_component_driver aiu_hdmi_ctrl_component = {
|
||||||
|
|
||||||
|
int aiu_hdmi_ctrl_register_component(struct device *dev)
|
||||||
|
{
|
||||||
|
- return aiu_add_component(dev, &aiu_hdmi_ctrl_component,
|
||||||
|
- aiu_hdmi_ctrl_dai_drv,
|
||||||
|
- ARRAY_SIZE(aiu_hdmi_ctrl_dai_drv),
|
||||||
|
- "hdmi");
|
||||||
|
+ return snd_soc_register_component(dev, &aiu_hdmi_ctrl_component,
|
||||||
|
+ aiu_hdmi_ctrl_dai_drv,
|
||||||
|
+ ARRAY_SIZE(aiu_hdmi_ctrl_dai_drv));
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
|
||||||
|
index 34b40b8b8299..d3e2d40e9562 100644
|
||||||
|
--- a/sound/soc/meson/aiu.c
|
||||||
|
+++ b/sound/soc/meson/aiu.c
|
||||||
|
@@ -71,26 +71,6 @@ int aiu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int aiu_add_component(struct device *dev,
|
||||||
|
- const struct snd_soc_component_driver *component_driver,
|
||||||
|
- struct snd_soc_dai_driver *dai_drv,
|
||||||
|
- int num_dai,
|
||||||
|
- const char *debugfs_prefix)
|
||||||
|
-{
|
||||||
|
- struct snd_soc_component *component;
|
||||||
|
-
|
||||||
|
- component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL);
|
||||||
|
- if (!component)
|
||||||
|
- return -ENOMEM;
|
||||||
|
-
|
||||||
|
-#ifdef CONFIG_DEBUG_FS
|
||||||
|
- component->debugfs_prefix = debugfs_prefix;
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
- return snd_soc_add_component(dev, component, component_driver,
|
||||||
|
- dai_drv, num_dai);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static int aiu_cpu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||||
|
struct of_phandle_args *args,
|
||||||
|
const char **dai_name)
|
||||||
|
diff --git a/sound/soc/meson/aiu.h b/sound/soc/meson/aiu.h
|
||||||
|
index 097c26de7b7c..06a968c55728 100644
|
||||||
|
--- a/sound/soc/meson/aiu.h
|
||||||
|
+++ b/sound/soc/meson/aiu.h
|
||||||
|
@@ -11,9 +11,7 @@ struct clk;
|
||||||
|
struct clk_bulk_data;
|
||||||
|
struct device;
|
||||||
|
struct of_phandle_args;
|
||||||
|
-struct snd_soc_component_driver;
|
||||||
|
struct snd_soc_dai;
|
||||||
|
-struct snd_soc_dai_driver;
|
||||||
|
struct snd_soc_dai_ops;
|
||||||
|
|
||||||
|
enum aiu_clk_ids {
|
||||||
|
@@ -45,12 +43,6 @@ int aiu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||||
|
const char **dai_name,
|
||||||
|
unsigned int component_id);
|
||||||
|
|
||||||
|
-int aiu_add_component(struct device *dev,
|
||||||
|
- const struct snd_soc_component_driver *component_driver,
|
||||||
|
- struct snd_soc_dai_driver *dai_drv,
|
||||||
|
- int num_dai,
|
||||||
|
- const char *debugfs_prefix);
|
||||||
|
-
|
||||||
|
int aiu_hdmi_ctrl_register_component(struct device *dev);
|
||||||
|
int aiu_acodec_ctrl_register_component(struct device *dev);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
From 98e4e706fe67ed6e1b7e2b49a0d48ddb6be1a136 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
Date: Wed, 15 Jan 2020 19:30:28 +0800
|
||||||
|
Subject: [PATCH 027/101] FROMGIT: firmware: meson_sm: Add secure power domain
|
||||||
|
support
|
||||||
|
|
||||||
|
The Amlogic Meson A1/C1 Secure Monitor implements calls to control power
|
||||||
|
domain.
|
||||||
|
|
||||||
|
Signed-off-by: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||||
|
Link: https://lore.kernel.org/r/1579087831-94965-2-git-send-email-jianxin.pan@amlogic.com
|
||||||
|
---
|
||||||
|
drivers/firmware/meson/meson_sm.c | 2 ++
|
||||||
|
include/linux/firmware/meson/meson_sm.h | 2 ++
|
||||||
|
2 files changed, 4 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/firmware/meson/meson_sm.c b/drivers/firmware/meson/meson_sm.c
|
||||||
|
index 1d5b4d74f96d..2854b56f6e0b 100644
|
||||||
|
--- a/drivers/firmware/meson/meson_sm.c
|
||||||
|
+++ b/drivers/firmware/meson/meson_sm.c
|
||||||
|
@@ -44,6 +44,8 @@ static const struct meson_sm_chip gxbb_chip = {
|
||||||
|
CMD(SM_EFUSE_WRITE, 0x82000031),
|
||||||
|
CMD(SM_EFUSE_USER_MAX, 0x82000033),
|
||||||
|
CMD(SM_GET_CHIP_ID, 0x82000044),
|
||||||
|
+ CMD(SM_A1_PWRC_SET, 0x82000093),
|
||||||
|
+ CMD(SM_A1_PWRC_GET, 0x82000095),
|
||||||
|
{ /* sentinel */ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
diff --git a/include/linux/firmware/meson/meson_sm.h b/include/linux/firmware/meson/meson_sm.h
|
||||||
|
index 6669e2a1d5fd..95b0da2326a9 100644
|
||||||
|
--- a/include/linux/firmware/meson/meson_sm.h
|
||||||
|
+++ b/include/linux/firmware/meson/meson_sm.h
|
||||||
|
@@ -12,6 +12,8 @@ enum {
|
||||||
|
SM_EFUSE_WRITE,
|
||||||
|
SM_EFUSE_USER_MAX,
|
||||||
|
SM_GET_CHIP_ID,
|
||||||
|
+ SM_A1_PWRC_SET,
|
||||||
|
+ SM_A1_PWRC_GET,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct meson_sm_firmware;
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
From 842a328b53d5ebb7dc6a63a15a9e15935aac55b0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
Date: Wed, 15 Jan 2020 19:30:29 +0800
|
||||||
|
Subject: [PATCH 028/101] FROMGIT: dt-bindings: power: add Amlogic secure power
|
||||||
|
domains bindings
|
||||||
|
|
||||||
|
Add the bindings for the Amlogic Secure power domains, controlling the
|
||||||
|
secure power domains.
|
||||||
|
|
||||||
|
The bindings targets the Amlogic A1 and C1 compatible SoCs, in which the
|
||||||
|
power domain registers are in secure world.
|
||||||
|
|
||||||
|
Signed-off-by: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||||
|
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||||
|
Link: https://lore.kernel.org/r/1579087831-94965-3-git-send-email-jianxin.pan@amlogic.com
|
||||||
|
---
|
||||||
|
.../power/amlogic,meson-sec-pwrc.yaml | 40 +++++++++++++++++++
|
||||||
|
include/dt-bindings/power/meson-a1-power.h | 32 +++++++++++++++
|
||||||
|
2 files changed, 72 insertions(+)
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/power/amlogic,meson-sec-pwrc.yaml
|
||||||
|
create mode 100644 include/dt-bindings/power/meson-a1-power.h
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/power/amlogic,meson-sec-pwrc.yaml b/Documentation/devicetree/bindings/power/amlogic,meson-sec-pwrc.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..af32209218bb
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/power/amlogic,meson-sec-pwrc.yaml
|
||||||
|
@@ -0,0 +1,40 @@
|
||||||
|
+# SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||||
|
+# Copyright (c) 2019 Amlogic, Inc
|
||||||
|
+# Author: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: "http://devicetree.org/schemas/power/amlogic,meson-sec-pwrc.yaml#"
|
||||||
|
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||||
|
+
|
||||||
|
+title: Amlogic Meson Secure Power Domains
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
+
|
||||||
|
+description: |+
|
||||||
|
+ Secure Power Domains used in Meson A1/C1 SoCs, and should be the child node
|
||||||
|
+ of secure-monitor.
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ compatible:
|
||||||
|
+ enum:
|
||||||
|
+ - amlogic,meson-a1-pwrc
|
||||||
|
+
|
||||||
|
+ "#power-domain-cells":
|
||||||
|
+ const: 1
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - compatible
|
||||||
|
+ - "#power-domain-cells"
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ secure-monitor {
|
||||||
|
+ compatible = "amlogic,meson-gxbb-sm";
|
||||||
|
+
|
||||||
|
+ pwrc: power-controller {
|
||||||
|
+ compatible = "amlogic,meson-a1-pwrc";
|
||||||
|
+ #power-domain-cells = <1>;
|
||||||
|
+ };
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
diff --git a/include/dt-bindings/power/meson-a1-power.h b/include/dt-bindings/power/meson-a1-power.h
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..6cf50bfb8ccf
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/include/dt-bindings/power/meson-a1-power.h
|
||||||
|
@@ -0,0 +1,32 @@
|
||||||
|
+/* SPDX-License-Identifier: (GPL-2.0+ or MIT) */
|
||||||
|
+/*
|
||||||
|
+ * Copyright (c) 2019 Amlogic, Inc.
|
||||||
|
+ * Author: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef _DT_BINDINGS_MESON_A1_POWER_H
|
||||||
|
+#define _DT_BINDINGS_MESON_A1_POWER_H
|
||||||
|
+
|
||||||
|
+#define PWRC_DSPA_ID 8
|
||||||
|
+#define PWRC_DSPB_ID 9
|
||||||
|
+#define PWRC_UART_ID 10
|
||||||
|
+#define PWRC_DMC_ID 11
|
||||||
|
+#define PWRC_I2C_ID 12
|
||||||
|
+#define PWRC_PSRAM_ID 13
|
||||||
|
+#define PWRC_ACODEC_ID 14
|
||||||
|
+#define PWRC_AUDIO_ID 15
|
||||||
|
+#define PWRC_OTP_ID 16
|
||||||
|
+#define PWRC_DMA_ID 17
|
||||||
|
+#define PWRC_SD_EMMC_ID 18
|
||||||
|
+#define PWRC_RAMA_ID 19
|
||||||
|
+#define PWRC_RAMB_ID 20
|
||||||
|
+#define PWRC_IR_ID 21
|
||||||
|
+#define PWRC_SPICC_ID 22
|
||||||
|
+#define PWRC_SPIFC_ID 23
|
||||||
|
+#define PWRC_USB_ID 24
|
||||||
|
+#define PWRC_NIC_ID 25
|
||||||
|
+#define PWRC_PDMIN_ID 26
|
||||||
|
+#define PWRC_RSA_ID 27
|
||||||
|
+#define PWRC_MAX_ID 28
|
||||||
|
+
|
||||||
|
+#endif
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,265 @@
|
||||||
|
From 2f228dc09c2383fa804ad8a9f81271b9ec3e5f59 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
Date: Wed, 15 Jan 2020 19:30:30 +0800
|
||||||
|
Subject: [PATCH 029/101] FROMGIT: soc: amlogic: Add support for Secure power
|
||||||
|
domains controller
|
||||||
|
|
||||||
|
Add support for the Amlogic Secure Power controller. In A1/C1 series, power
|
||||||
|
control registers are in secure domain, and should be accessed by smc.
|
||||||
|
|
||||||
|
Signed-off-by: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||||
|
Link: https://lore.kernel.org/r/1579087831-94965-4-git-send-email-jianxin.pan@amlogic.com
|
||||||
|
---
|
||||||
|
drivers/soc/amlogic/Kconfig | 13 ++
|
||||||
|
drivers/soc/amlogic/Makefile | 1 +
|
||||||
|
drivers/soc/amlogic/meson-secure-pwrc.c | 204 ++++++++++++++++++++++++
|
||||||
|
3 files changed, 218 insertions(+)
|
||||||
|
create mode 100644 drivers/soc/amlogic/meson-secure-pwrc.c
|
||||||
|
|
||||||
|
diff --git a/drivers/soc/amlogic/Kconfig b/drivers/soc/amlogic/Kconfig
|
||||||
|
index bc2c912949bd..6cb06e7b5e63 100644
|
||||||
|
--- a/drivers/soc/amlogic/Kconfig
|
||||||
|
+++ b/drivers/soc/amlogic/Kconfig
|
||||||
|
@@ -48,6 +48,19 @@ config MESON_EE_PM_DOMAINS
|
||||||
|
Say yes to expose Amlogic Meson Everything-Else Power Domains as
|
||||||
|
Generic Power Domains.
|
||||||
|
|
||||||
|
+config MESON_SECURE_PM_DOMAINS
|
||||||
|
+ bool "Amlogic Meson Secure Power Domains driver"
|
||||||
|
+ depends on ARCH_MESON || COMPILE_TEST
|
||||||
|
+ depends on PM && OF
|
||||||
|
+ depends on HAVE_ARM_SMCCC
|
||||||
|
+ default ARCH_MESON
|
||||||
|
+ select PM_GENERIC_DOMAINS
|
||||||
|
+ select PM_GENERIC_DOMAINS_OF
|
||||||
|
+ help
|
||||||
|
+ Support for the power controller on Amlogic A1/C1 series.
|
||||||
|
+ Say yes to expose Amlogic Meson Secure Power Domains as Generic
|
||||||
|
+ Power Domains.
|
||||||
|
+
|
||||||
|
config MESON_MX_SOCINFO
|
||||||
|
bool "Amlogic Meson MX SoC Information driver"
|
||||||
|
depends on ARCH_MESON || COMPILE_TEST
|
||||||
|
diff --git a/drivers/soc/amlogic/Makefile b/drivers/soc/amlogic/Makefile
|
||||||
|
index de79d044b545..7b8c5d323f5c 100644
|
||||||
|
--- a/drivers/soc/amlogic/Makefile
|
||||||
|
+++ b/drivers/soc/amlogic/Makefile
|
||||||
|
@@ -5,3 +5,4 @@ obj-$(CONFIG_MESON_GX_SOCINFO) += meson-gx-socinfo.o
|
||||||
|
obj-$(CONFIG_MESON_GX_PM_DOMAINS) += meson-gx-pwrc-vpu.o
|
||||||
|
obj-$(CONFIG_MESON_MX_SOCINFO) += meson-mx-socinfo.o
|
||||||
|
obj-$(CONFIG_MESON_EE_PM_DOMAINS) += meson-ee-pwrc.o
|
||||||
|
+obj-$(CONFIG_MESON_SECURE_PM_DOMAINS) += meson-secure-pwrc.o
|
||||||
|
diff --git a/drivers/soc/amlogic/meson-secure-pwrc.c b/drivers/soc/amlogic/meson-secure-pwrc.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..5fb29a475879
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/soc/amlogic/meson-secure-pwrc.c
|
||||||
|
@@ -0,0 +1,204 @@
|
||||||
|
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||||
|
+/*
|
||||||
|
+ * Copyright (c) 2019 Amlogic, Inc.
|
||||||
|
+ * Author: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
|
+
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/of_device.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+#include <linux/pm_domain.h>
|
||||||
|
+#include <dt-bindings/power/meson-a1-power.h>
|
||||||
|
+#include <linux/arm-smccc.h>
|
||||||
|
+#include <linux/firmware/meson/meson_sm.h>
|
||||||
|
+
|
||||||
|
+#define PWRC_ON 1
|
||||||
|
+#define PWRC_OFF 0
|
||||||
|
+
|
||||||
|
+struct meson_secure_pwrc_domain {
|
||||||
|
+ struct generic_pm_domain base;
|
||||||
|
+ unsigned int index;
|
||||||
|
+ struct meson_secure_pwrc *pwrc;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct meson_secure_pwrc {
|
||||||
|
+ struct meson_secure_pwrc_domain *domains;
|
||||||
|
+ struct genpd_onecell_data xlate;
|
||||||
|
+ struct meson_sm_firmware *fw;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct meson_secure_pwrc_domain_desc {
|
||||||
|
+ unsigned int index;
|
||||||
|
+ unsigned int flags;
|
||||||
|
+ char *name;
|
||||||
|
+ bool (*is_off)(struct meson_secure_pwrc_domain *pwrc_domain);
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct meson_secure_pwrc_domain_data {
|
||||||
|
+ unsigned int count;
|
||||||
|
+ struct meson_secure_pwrc_domain_desc *domains;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static bool pwrc_secure_is_off(struct meson_secure_pwrc_domain *pwrc_domain)
|
||||||
|
+{
|
||||||
|
+ int is_off = 1;
|
||||||
|
+
|
||||||
|
+ if (meson_sm_call(pwrc_domain->pwrc->fw, SM_A1_PWRC_GET, &is_off,
|
||||||
|
+ pwrc_domain->index, 0, 0, 0, 0) < 0)
|
||||||
|
+ pr_err("failed to get power domain status\n");
|
||||||
|
+
|
||||||
|
+ return is_off;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int meson_secure_pwrc_off(struct generic_pm_domain *domain)
|
||||||
|
+{
|
||||||
|
+ int ret = 0;
|
||||||
|
+ struct meson_secure_pwrc_domain *pwrc_domain =
|
||||||
|
+ container_of(domain, struct meson_secure_pwrc_domain, base);
|
||||||
|
+
|
||||||
|
+ if (meson_sm_call(pwrc_domain->pwrc->fw, SM_A1_PWRC_SET, NULL,
|
||||||
|
+ pwrc_domain->index, PWRC_OFF, 0, 0, 0) < 0) {
|
||||||
|
+ pr_err("failed to set power domain off\n");
|
||||||
|
+ ret = -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int meson_secure_pwrc_on(struct generic_pm_domain *domain)
|
||||||
|
+{
|
||||||
|
+ int ret = 0;
|
||||||
|
+ struct meson_secure_pwrc_domain *pwrc_domain =
|
||||||
|
+ container_of(domain, struct meson_secure_pwrc_domain, base);
|
||||||
|
+
|
||||||
|
+ if (meson_sm_call(pwrc_domain->pwrc->fw, SM_A1_PWRC_SET, NULL,
|
||||||
|
+ pwrc_domain->index, PWRC_ON, 0, 0, 0) < 0) {
|
||||||
|
+ pr_err("failed to set power domain on\n");
|
||||||
|
+ ret = -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define SEC_PD(__name, __flag) \
|
||||||
|
+[PWRC_##__name##_ID] = \
|
||||||
|
+{ \
|
||||||
|
+ .name = #__name, \
|
||||||
|
+ .index = PWRC_##__name##_ID, \
|
||||||
|
+ .is_off = pwrc_secure_is_off, \
|
||||||
|
+ .flags = __flag, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct meson_secure_pwrc_domain_desc a1_pwrc_domains[] = {
|
||||||
|
+ SEC_PD(DSPA, 0),
|
||||||
|
+ SEC_PD(DSPB, 0),
|
||||||
|
+ /* UART should keep working in ATF after suspend and before resume */
|
||||||
|
+ SEC_PD(UART, GENPD_FLAG_ALWAYS_ON),
|
||||||
|
+ /* DMC is for DDR PHY ana/dig and DMC, and should be always on */
|
||||||
|
+ SEC_PD(DMC, GENPD_FLAG_ALWAYS_ON),
|
||||||
|
+ SEC_PD(I2C, 0),
|
||||||
|
+ SEC_PD(PSRAM, 0),
|
||||||
|
+ SEC_PD(ACODEC, 0),
|
||||||
|
+ SEC_PD(AUDIO, 0),
|
||||||
|
+ SEC_PD(OTP, 0),
|
||||||
|
+ SEC_PD(DMA, 0),
|
||||||
|
+ SEC_PD(SD_EMMC, 0),
|
||||||
|
+ SEC_PD(RAMA, 0),
|
||||||
|
+ /* SRAMB is used as ATF runtime memory, and should be always on */
|
||||||
|
+ SEC_PD(RAMB, GENPD_FLAG_ALWAYS_ON),
|
||||||
|
+ SEC_PD(IR, 0),
|
||||||
|
+ SEC_PD(SPICC, 0),
|
||||||
|
+ SEC_PD(SPIFC, 0),
|
||||||
|
+ SEC_PD(USB, 0),
|
||||||
|
+ /* NIC is for the Arm NIC-400 interconnect, and should be always on */
|
||||||
|
+ SEC_PD(NIC, GENPD_FLAG_ALWAYS_ON),
|
||||||
|
+ SEC_PD(PDMIN, 0),
|
||||||
|
+ SEC_PD(RSA, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int meson_secure_pwrc_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ struct device_node *sm_np;
|
||||||
|
+ struct meson_secure_pwrc *pwrc;
|
||||||
|
+ const struct meson_secure_pwrc_domain_data *match;
|
||||||
|
+
|
||||||
|
+ match = of_device_get_match_data(&pdev->dev);
|
||||||
|
+ if (!match) {
|
||||||
|
+ dev_err(&pdev->dev, "failed to get match data\n");
|
||||||
|
+ return -ENODEV;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ sm_np = of_find_compatible_node(NULL, NULL, "amlogic,meson-gxbb-sm");
|
||||||
|
+ if (!sm_np) {
|
||||||
|
+ dev_err(&pdev->dev, "no secure-monitor node\n");
|
||||||
|
+ return -ENODEV;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ pwrc = devm_kzalloc(&pdev->dev, sizeof(*pwrc), GFP_KERNEL);
|
||||||
|
+ if (!pwrc)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ pwrc->fw = meson_sm_get(sm_np);
|
||||||
|
+ of_node_put(sm_np);
|
||||||
|
+ if (!pwrc->fw)
|
||||||
|
+ return -EPROBE_DEFER;
|
||||||
|
+
|
||||||
|
+ pwrc->xlate.domains = devm_kcalloc(&pdev->dev, match->count,
|
||||||
|
+ sizeof(*pwrc->xlate.domains),
|
||||||
|
+ GFP_KERNEL);
|
||||||
|
+ if (!pwrc->xlate.domains)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ pwrc->domains = devm_kcalloc(&pdev->dev, match->count,
|
||||||
|
+ sizeof(*pwrc->domains), GFP_KERNEL);
|
||||||
|
+ if (!pwrc->domains)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ pwrc->xlate.num_domains = match->count;
|
||||||
|
+ platform_set_drvdata(pdev, pwrc);
|
||||||
|
+
|
||||||
|
+ for (i = 0 ; i < match->count ; ++i) {
|
||||||
|
+ struct meson_secure_pwrc_domain *dom = &pwrc->domains[i];
|
||||||
|
+
|
||||||
|
+ if (!match->domains[i].index)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ dom->pwrc = pwrc;
|
||||||
|
+ dom->index = match->domains[i].index;
|
||||||
|
+ dom->base.name = match->domains[i].name;
|
||||||
|
+ dom->base.flags = match->domains[i].flags;
|
||||||
|
+ dom->base.power_on = meson_secure_pwrc_on;
|
||||||
|
+ dom->base.power_off = meson_secure_pwrc_off;
|
||||||
|
+
|
||||||
|
+ pm_genpd_init(&dom->base, NULL, match->domains[i].is_off(dom));
|
||||||
|
+
|
||||||
|
+ pwrc->xlate.domains[i] = &dom->base;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return of_genpd_add_provider_onecell(pdev->dev.of_node, &pwrc->xlate);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct meson_secure_pwrc_domain_data meson_secure_a1_pwrc_data = {
|
||||||
|
+ .domains = a1_pwrc_domains,
|
||||||
|
+ .count = ARRAY_SIZE(a1_pwrc_domains),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct of_device_id meson_secure_pwrc_match_table[] = {
|
||||||
|
+ {
|
||||||
|
+ .compatible = "amlogic,meson-a1-pwrc",
|
||||||
|
+ .data = &meson_secure_a1_pwrc_data,
|
||||||
|
+ },
|
||||||
|
+ { /* sentinel */ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct platform_driver meson_secure_pwrc_driver = {
|
||||||
|
+ .probe = meson_secure_pwrc_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "meson_secure_pwrc",
|
||||||
|
+ .of_match_table = meson_secure_pwrc_match_table,
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+builtin_platform_driver(meson_secure_pwrc_driver);
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
From 180f97e03557fdf4fd5b899b6d7e44b77b1ae5bf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
Date: Wed, 15 Jan 2020 19:30:31 +0800
|
||||||
|
Subject: [PATCH 030/101] FROMGIT: arm64: dts: meson: a1: add secure power
|
||||||
|
domain controller
|
||||||
|
|
||||||
|
Enable power domain controller for Meson A1 SoC.
|
||||||
|
|
||||||
|
Signed-off-by: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
|
Link: https://lore.kernel.org/r/1579087831-94965-5-git-send-email-jianxin.pan@amlogic.com
|
||||||
|
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/amlogic/meson-a1.dtsi | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-a1.dtsi b/arch/arm64/boot/dts/amlogic/meson-a1.dtsi
|
||||||
|
index 4dec518c4dde..755b4ad15184 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-a1.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-a1.dtsi
|
||||||
|
@@ -60,6 +60,12 @@
|
||||||
|
|
||||||
|
sm: secure-monitor {
|
||||||
|
compatible = "amlogic,meson-gxbb-sm";
|
||||||
|
+
|
||||||
|
+ pwrc: power-controller {
|
||||||
|
+ compatible = "amlogic,meson-a1-pwrc";
|
||||||
|
+ #power-domain-cells = <1>;
|
||||||
|
+ status = "okay";
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
soc {
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
From bb440ae7b97aa966416e305405fbab9c7ec83bf3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Fri, 15 Feb 2019 14:21:27 +0100
|
||||||
|
Subject: [PATCH 031/101] WIP: clk: meson: g12a: fix gp0 and hifi ranges
|
||||||
|
|
||||||
|
While some SoC samples are able to lock with a PLL factor of 55, others
|
||||||
|
samples can't. ATM, a minimum of 60 appears to work on all the samples
|
||||||
|
I have tried.
|
||||||
|
|
||||||
|
Even with 60, it sometimes takes a long time for the PLL to eventually
|
||||||
|
lock. The documentation says that the minimum rate of these PLLs DCO
|
||||||
|
should be 3GHz, a factor of 125. Let's use that to be on the safe side.
|
||||||
|
|
||||||
|
With factor range changed, the PLL seems to lock quickly (enough) so far.
|
||||||
|
It is still unclear if the range was the only reason for the delay.
|
||||||
|
|
||||||
|
Fixes: 085a4ea93d54 ("clk: meson: g12a: add peripheral clock controller")
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
drivers/clk/meson/g12a.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c
|
||||||
|
index d2760a021301..cd1de3e004e4 100644
|
||||||
|
--- a/drivers/clk/meson/g12a.c
|
||||||
|
+++ b/drivers/clk/meson/g12a.c
|
||||||
|
@@ -1591,7 +1591,7 @@ static struct clk_regmap g12b_cpub_clk_trace = {
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct pll_mult_range g12a_gp0_pll_mult_range = {
|
||||||
|
- .min = 55,
|
||||||
|
+ .min = 125,
|
||||||
|
.max = 255,
|
||||||
|
};
|
||||||
|
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
From b99a66756e3c7d9959c58488c6ebfcb77ea0b020 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Tue, 28 Jan 2020 13:38:38 +0100
|
||||||
|
Subject: [PATCH 032/101] FROMLIST: ASoC: meson: add t9015 internal codec
|
||||||
|
binding documentation
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,t9015.yaml | 58 +++++++++++++++++++
|
||||||
|
1 file changed, 58 insertions(+)
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,t9015.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,t9015.yaml b/Documentation/devicetree/bindings/sound/amlogic,t9015.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..b7c38c2b5b54
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,t9015.yaml
|
||||||
|
@@ -0,0 +1,58 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,t9015.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic T9015 Internal Audio DAC
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ $nodename:
|
||||||
|
+ pattern: "^audio-controller@.*"
|
||||||
|
+
|
||||||
|
+ "#sound-dai-cells":
|
||||||
|
+ const: 0
|
||||||
|
+
|
||||||
|
+ compatible:
|
||||||
|
+ items:
|
||||||
|
+ - const: amlogic,t9015
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ items:
|
||||||
|
+ - description: Peripheral clock
|
||||||
|
+
|
||||||
|
+ clock-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: pclk
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ resets:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - "#sound-dai-cells"
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - clocks
|
||||||
|
+ - clock-names
|
||||||
|
+ - resets
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/g12a-clkc.h>
|
||||||
|
+ #include <dt-bindings/reset/amlogic,meson-g12a-reset.h>
|
||||||
|
+
|
||||||
|
+ acodec: audio-controller@32000 {
|
||||||
|
+ compatible = "amlogic,t9015";
|
||||||
|
+ reg = <0x0 0x32000 0x0 0x14>;
|
||||||
|
+ #sound-dai-cells = <0>;
|
||||||
|
+ clocks = <&clkc CLKID_AUDIO_CODEC>;
|
||||||
|
+ clock-names = "pclk";
|
||||||
|
+ resets = <&reset RESET_AUDIO_CODEC>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,392 @@
|
||||||
|
From 289992cf645e81397dad1c3ec5780f209989f747 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Wed, 14 Aug 2019 17:09:18 +0200
|
||||||
|
Subject: [PATCH 033/101] FROMLIST: ASoC: meson: add t9015 internal DAC driver
|
||||||
|
|
||||||
|
Add the codec driver of the internal DAC found on Amlogic gxl, g12a and
|
||||||
|
sm1 family.
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/Kconfig | 8 +
|
||||||
|
sound/soc/meson/Makefile | 2 +
|
||||||
|
sound/soc/meson/t9015.c | 326 +++++++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 336 insertions(+)
|
||||||
|
create mode 100644 sound/soc/meson/t9015.c
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/Kconfig b/sound/soc/meson/Kconfig
|
||||||
|
index 22d2af75b59e..897a706dcda0 100644
|
||||||
|
--- a/sound/soc/meson/Kconfig
|
||||||
|
+++ b/sound/soc/meson/Kconfig
|
||||||
|
@@ -6,6 +6,7 @@ config SND_MESON_AIU
|
||||||
|
tristate "Amlogic AIU"
|
||||||
|
select SND_MESON_CODEC_GLUE
|
||||||
|
select SND_PCM_IEC958
|
||||||
|
+ imply SND_SOC_MESON_T9015
|
||||||
|
imply SND_SOC_HDMI_CODEC if DRM_MESON_DW_HDMI
|
||||||
|
help
|
||||||
|
Select Y or M to add support for the Audio output subsystem found
|
||||||
|
@@ -116,4 +117,11 @@ config SND_MESON_G12A_TOHDMITX
|
||||||
|
help
|
||||||
|
Select Y or M to add support for HDMI audio on the g12a SoC
|
||||||
|
family
|
||||||
|
+
|
||||||
|
+config SND_SOC_MESON_T9015
|
||||||
|
+ tristate "Amlogic T9015 DAC"
|
||||||
|
+ select REGMAP_MMIO
|
||||||
|
+ help
|
||||||
|
+ Say Y or M if you want to add support for the internal DAC found
|
||||||
|
+ on GXL, G12 and SM1 SoC family.
|
||||||
|
endmenu
|
||||||
|
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||||
|
index f9c90c391498..3c9d48846816 100644
|
||||||
|
--- a/sound/soc/meson/Makefile
|
||||||
|
+++ b/sound/soc/meson/Makefile
|
||||||
|
@@ -23,6 +23,7 @@ snd-soc-meson-card-utils-objs := meson-card-utils.o
|
||||||
|
snd-soc-meson-codec-glue-objs := meson-codec-glue.o
|
||||||
|
snd-soc-meson-gx-sound-card-objs := gx-card.o
|
||||||
|
snd-soc-meson-g12a-tohdmitx-objs := g12a-tohdmitx.o
|
||||||
|
+snd-soc-meson-t9015-objs := t9015.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_SND_MESON_AIU) += snd-soc-meson-aiu.o
|
||||||
|
obj-$(CONFIG_SND_MESON_AXG_FIFO) += snd-soc-meson-axg-fifo.o
|
||||||
|
@@ -40,3 +41,4 @@ obj-$(CONFIG_SND_MESON_CARD_UTILS) += snd-soc-meson-card-utils.o
|
||||||
|
obj-$(CONFIG_SND_MESON_CODEC_GLUE) += snd-soc-meson-codec-glue.o
|
||||||
|
obj-$(CONFIG_SND_MESON_GX_SOUND_CARD) += snd-soc-meson-gx-sound-card.o
|
||||||
|
obj-$(CONFIG_SND_MESON_G12A_TOHDMITX) += snd-soc-meson-g12a-tohdmitx.o
|
||||||
|
+obj-$(CONFIG_SND_SOC_MESON_T9015) += snd-soc-meson-t9015.o
|
||||||
|
diff --git a/sound/soc/meson/t9015.c b/sound/soc/meson/t9015.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..4f26708b6adc
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sound/soc/meson/t9015.c
|
||||||
|
@@ -0,0 +1,326 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+//
|
||||||
|
+// Copyright (c) 2020 BayLibre, SAS.
|
||||||
|
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+#include <linux/clk.h>
|
||||||
|
+#include <linux/delay.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/regmap.h>
|
||||||
|
+#include <linux/regulator/consumer.h>
|
||||||
|
+#include <linux/reset.h>
|
||||||
|
+#include <sound/soc.h>
|
||||||
|
+#include <sound/tlv.h>
|
||||||
|
+
|
||||||
|
+#define BLOCK_EN 0x00
|
||||||
|
+#define LORN_EN 0
|
||||||
|
+#define LORP_EN 1
|
||||||
|
+#define LOLN_EN 2
|
||||||
|
+#define LOLP_EN 3
|
||||||
|
+#define DACR_EN 4
|
||||||
|
+#define DACL_EN 5
|
||||||
|
+
|
||||||
|
+#define DACR_INV 20
|
||||||
|
+#define DACL_INV 21
|
||||||
|
+#define DACR_SRC 22
|
||||||
|
+#define DACL_SRC 23
|
||||||
|
+#define REFP_BUF_EN BIT(12)
|
||||||
|
+#define BIAS_CURRENT_EN BIT(13)
|
||||||
|
+#define VMID_GEN_FAST BIT(14)
|
||||||
|
+#define VMID_GEN_EN BIT(15)
|
||||||
|
+#define I2S_MODE BIT(30)
|
||||||
|
+#define VOL_CTRL0 0x04
|
||||||
|
+#define GAIN_H 31
|
||||||
|
+#define GAIN_L 23
|
||||||
|
+#define VOL_CTRL1 0x08
|
||||||
|
+#define DAC_MONO 8
|
||||||
|
+#define RAMP_RATE 10
|
||||||
|
+#define VC_RAMP_MODE 12
|
||||||
|
+#define MUTE_MODE 13
|
||||||
|
+#define UNMUTE_MODE 14
|
||||||
|
+#define DAC_SOFT_MUTE 15
|
||||||
|
+#define DACR_VC 16
|
||||||
|
+#define DACL_VC 24
|
||||||
|
+#define LINEOUT_CFG 0x0c
|
||||||
|
+#define LORN_POL 0
|
||||||
|
+#define LORP_POL 4
|
||||||
|
+#define LOLN_POL 8
|
||||||
|
+#define LOLP_POL 12
|
||||||
|
+#define POWER_CFG 0x10
|
||||||
|
+
|
||||||
|
+struct t9015 {
|
||||||
|
+ struct clk *pclk;
|
||||||
|
+ struct regulator *avdd;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int t9015_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||||
|
+{
|
||||||
|
+ struct snd_soc_component *component = dai->component;
|
||||||
|
+ unsigned int val;
|
||||||
|
+
|
||||||
|
+ switch(fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||||
|
+ case SND_SOC_DAIFMT_CBM_CFM:
|
||||||
|
+ val = I2S_MODE;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case SND_SOC_DAIFMT_CBS_CFS:
|
||||||
|
+ val = 0;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ snd_soc_component_update_bits(component, BLOCK_EN, I2S_MODE, val);
|
||||||
|
+
|
||||||
|
+ if (((fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_I2S) &&
|
||||||
|
+ ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_LEFT_J))
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dai_ops t9015_dai_ops = {
|
||||||
|
+ .set_fmt = t9015_dai_set_fmt,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct snd_soc_dai_driver t9015_dai = {
|
||||||
|
+ .name = "t9015-hifi",
|
||||||
|
+ .playback = {
|
||||||
|
+ .stream_name = "Playback",
|
||||||
|
+ .channels_min = 1,
|
||||||
|
+ .channels_max = 2,
|
||||||
|
+ .rates = SNDRV_PCM_RATE_8000_96000,
|
||||||
|
+ .formats = (SNDRV_PCM_FMTBIT_S8 |
|
||||||
|
+ SNDRV_PCM_FMTBIT_S16_LE |
|
||||||
|
+ SNDRV_PCM_FMTBIT_S20_LE |
|
||||||
|
+ SNDRV_PCM_FMTBIT_S24_LE),
|
||||||
|
+ },
|
||||||
|
+ .ops = &t9015_dai_ops,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const DECLARE_TLV_DB_MINMAX_MUTE(dac_vol_tlv, -9525, 0);
|
||||||
|
+
|
||||||
|
+static const char * const ramp_rate_txt[] = { "Fast", "Slow" };
|
||||||
|
+static SOC_ENUM_SINGLE_DECL(ramp_rate_enum, VOL_CTRL1, RAMP_RATE,
|
||||||
|
+ ramp_rate_txt);
|
||||||
|
+
|
||||||
|
+static const char * const dacr_in_txt[] = { "Right", "Left" };
|
||||||
|
+static SOC_ENUM_SINGLE_DECL(dacr_in_enum, BLOCK_EN, DACR_SRC, dacr_in_txt);
|
||||||
|
+
|
||||||
|
+static const char * const dacl_in_txt[] = { "Left", "Right" };
|
||||||
|
+static SOC_ENUM_SINGLE_DECL(dacl_in_enum, BLOCK_EN, DACL_SRC, dacl_in_txt);
|
||||||
|
+
|
||||||
|
+static const char * const mono_txt[] = { "Stereo", "Mono"};
|
||||||
|
+static SOC_ENUM_SINGLE_DECL(mono_enum, VOL_CTRL1, DAC_MONO, mono_txt);
|
||||||
|
+
|
||||||
|
+static const struct snd_kcontrol_new t9015_snd_controls[] = {
|
||||||
|
+ /* Volume Controls */
|
||||||
|
+ SOC_SINGLE("Playback Mute", VOL_CTRL1, DAC_SOFT_MUTE, 1, 0),
|
||||||
|
+ SOC_DOUBLE_TLV("Playback Volume", VOL_CTRL1, DACL_VC, DACR_VC,
|
||||||
|
+ 0xff, 0, dac_vol_tlv),
|
||||||
|
+
|
||||||
|
+ /* Ramp Controls */
|
||||||
|
+ SOC_ENUM("Ramp Rate", ramp_rate_enum),
|
||||||
|
+ SOC_SINGLE("Volume Ramp Enable", VOL_CTRL1, VC_RAMP_MODE, 1, 0),
|
||||||
|
+ SOC_SINGLE("Mute Ramp Enable", VOL_CTRL1, MUTE_MODE, 1, 0),
|
||||||
|
+ SOC_SINGLE("Unmute Ramp Enable", VOL_CTRL1, UNMUTE_MODE, 1, 0),
|
||||||
|
+
|
||||||
|
+ /* Channel Src */
|
||||||
|
+ SOC_ENUM("Right DAC Source", dacr_in_enum),
|
||||||
|
+ SOC_ENUM("Left DAC Source", dacl_in_enum),
|
||||||
|
+ SOC_ENUM("Channel Mode", mono_enum),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dapm_widget t9015_dapm_widgets[] = {
|
||||||
|
+ SND_SOC_DAPM_DAC("Right DAC", NULL, BLOCK_EN, DACR_EN, 0),
|
||||||
|
+ SND_SOC_DAPM_DAC("Left DAC", NULL, BLOCK_EN, DACL_EN, 0),
|
||||||
|
+ SND_SOC_DAPM_OUT_DRV("Right- Driver", BLOCK_EN, LORN_EN, 0,
|
||||||
|
+ NULL, 0),
|
||||||
|
+ SND_SOC_DAPM_OUT_DRV("Right+ Driver", BLOCK_EN, LORP_EN, 0,
|
||||||
|
+ NULL, 0),
|
||||||
|
+ SND_SOC_DAPM_OUT_DRV("Left- Driver", BLOCK_EN, LOLN_EN, 0,
|
||||||
|
+ NULL, 0),
|
||||||
|
+ SND_SOC_DAPM_OUT_DRV("Left+ Driver", BLOCK_EN, LOLP_EN, 0,
|
||||||
|
+ NULL, 0),
|
||||||
|
+ SND_SOC_DAPM_OUTPUT("LORN"),
|
||||||
|
+ SND_SOC_DAPM_OUTPUT("LORP"),
|
||||||
|
+ SND_SOC_DAPM_OUTPUT("LOLN"),
|
||||||
|
+ SND_SOC_DAPM_OUTPUT("LOLP"),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dapm_route t9015_dapm_routes[] = {
|
||||||
|
+ { "Right DAC", NULL, "Playback" },
|
||||||
|
+ { "Left DAC", NULL, "Playback" },
|
||||||
|
+ { "Right- Driver", NULL, "Right DAC" },
|
||||||
|
+ { "Right+ Driver", NULL, "Right DAC" },
|
||||||
|
+ { "Left- Driver", NULL, "Left DAC" },
|
||||||
|
+ { "Left+ Driver", NULL, "Left DAC" },
|
||||||
|
+ { "LORN", NULL, "Right- Driver", },
|
||||||
|
+ { "LORP", NULL, "Right+ Driver", },
|
||||||
|
+ { "LOLN", NULL, "Left- Driver", },
|
||||||
|
+ { "LOLP", NULL, "Left+ Driver", },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int t9015_set_bias_level(struct snd_soc_component *component,
|
||||||
|
+ enum snd_soc_bias_level level)
|
||||||
|
+{
|
||||||
|
+ struct t9015 *priv = snd_soc_component_get_drvdata(component);
|
||||||
|
+ enum snd_soc_bias_level now =
|
||||||
|
+ snd_soc_component_get_bias_level(component);
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ switch (level) {
|
||||||
|
+ case SND_SOC_BIAS_ON:
|
||||||
|
+ snd_soc_component_update_bits(component, BLOCK_EN,
|
||||||
|
+ BIAS_CURRENT_EN,
|
||||||
|
+ BIAS_CURRENT_EN);
|
||||||
|
+ break;
|
||||||
|
+ case SND_SOC_BIAS_PREPARE:
|
||||||
|
+ snd_soc_component_update_bits(component, BLOCK_EN,
|
||||||
|
+ BIAS_CURRENT_EN,
|
||||||
|
+ 0);
|
||||||
|
+ break;
|
||||||
|
+ case SND_SOC_BIAS_STANDBY:
|
||||||
|
+ ret = regulator_enable(priv->avdd);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(component->dev, "AVDD enable failed\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (now == SND_SOC_BIAS_OFF) {
|
||||||
|
+ snd_soc_component_update_bits(component, BLOCK_EN,
|
||||||
|
+ VMID_GEN_EN | VMID_GEN_FAST | REFP_BUF_EN,
|
||||||
|
+ VMID_GEN_EN | VMID_GEN_FAST | REFP_BUF_EN);
|
||||||
|
+
|
||||||
|
+ mdelay(200);
|
||||||
|
+ snd_soc_component_update_bits(component, BLOCK_EN,
|
||||||
|
+ VMID_GEN_FAST,
|
||||||
|
+ 0);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ break;
|
||||||
|
+ case SND_SOC_BIAS_OFF:
|
||||||
|
+ snd_soc_component_update_bits(component, BLOCK_EN,
|
||||||
|
+ VMID_GEN_EN | VMID_GEN_FAST | REFP_BUF_EN,
|
||||||
|
+ 0);
|
||||||
|
+
|
||||||
|
+ regulator_disable(priv->avdd);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int t9015_component_probe(struct snd_soc_component *c)
|
||||||
|
+{
|
||||||
|
+ /* FIXME */
|
||||||
|
+ return snd_soc_component_write(c, LINEOUT_CFG, 0x00001111);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_component_driver t9015_codec_driver = {
|
||||||
|
+ .probe = t9015_component_probe,
|
||||||
|
+ .set_bias_level = t9015_set_bias_level,
|
||||||
|
+ .controls = t9015_snd_controls,
|
||||||
|
+ .num_controls = ARRAY_SIZE(t9015_snd_controls),
|
||||||
|
+ .dapm_widgets = t9015_dapm_widgets,
|
||||||
|
+ .num_dapm_widgets = ARRAY_SIZE(t9015_dapm_widgets),
|
||||||
|
+ .dapm_routes = t9015_dapm_routes,
|
||||||
|
+ .num_dapm_routes = ARRAY_SIZE(t9015_dapm_routes),
|
||||||
|
+ .suspend_bias_off = 1,
|
||||||
|
+ .idle_bias_on = 1,
|
||||||
|
+ .endianness = 1,
|
||||||
|
+ .non_legacy_dai_naming = 1,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct regmap_config t9015_regmap_config = {
|
||||||
|
+ .reg_bits = 32,
|
||||||
|
+ .reg_stride = 4,
|
||||||
|
+ .val_bits = 32,
|
||||||
|
+ .max_register = POWER_CFG,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int t9015_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &pdev->dev;
|
||||||
|
+ struct t9015 *priv;
|
||||||
|
+ void __iomem *regs;
|
||||||
|
+ struct regmap *regmap;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||||
|
+ if (!priv)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ platform_set_drvdata(pdev, priv);
|
||||||
|
+
|
||||||
|
+ priv->pclk = devm_clk_get(dev, "pclk");
|
||||||
|
+ if (IS_ERR(priv->pclk)) {
|
||||||
|
+ if (PTR_ERR(priv->pclk) != -EPROBE_DEFER)
|
||||||
|
+ dev_err(dev, "failed to get core clock\n");
|
||||||
|
+ return PTR_ERR(priv->pclk);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ priv->avdd = devm_regulator_get(dev, "AVDD");
|
||||||
|
+ if (IS_ERR(priv->avdd)) {
|
||||||
|
+ if (PTR_ERR(priv->avdd) != -EPROBE_DEFER)
|
||||||
|
+ dev_err(dev, "failed to AVDD\n");
|
||||||
|
+ return PTR_ERR(priv->avdd);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = clk_prepare_enable(priv->pclk);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(dev, "core clock enable failed\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = devm_add_action_or_reset(dev,
|
||||||
|
+ (void(*)(void *))clk_disable_unprepare,
|
||||||
|
+ priv->pclk);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ ret = device_reset(dev);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(dev, "reset failed\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ regs = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(regs)) {
|
||||||
|
+ dev_err(dev, "register map failed\n");
|
||||||
|
+ return PTR_ERR(regs);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ regmap = devm_regmap_init_mmio(dev, regs, &t9015_regmap_config);
|
||||||
|
+ if (IS_ERR(regmap)) {
|
||||||
|
+ dev_err(dev, "regmap init failed\n");
|
||||||
|
+ return PTR_ERR(regmap);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Add polarity parsing here */
|
||||||
|
+
|
||||||
|
+ return devm_snd_soc_register_component(dev, &t9015_codec_driver,
|
||||||
|
+ &t9015_dai, 1);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id t9015_ids[] = {
|
||||||
|
+ { .compatible = "amlogic,t9015", },
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, t9015_ids);
|
||||||
|
+
|
||||||
|
+static struct platform_driver t9015_driver = {
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "t9015-codec",
|
||||||
|
+ .of_match_table = of_match_ptr(t9015_ids),
|
||||||
|
+ },
|
||||||
|
+ .probe = t9015_probe,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+module_platform_driver(t9015_driver);
|
||||||
|
+
|
||||||
|
+MODULE_DESCRIPTION("ASoC Amlogic T9015 codec driver");
|
||||||
|
+MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
|
||||||
|
+MODULE_LICENSE("GPL");
|
||||||
|
+
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
From ea2bee83aa1bb6a88d6862756b9e1602324ca78b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Fri, 24 Jan 2020 11:08:09 +0100
|
||||||
|
Subject: [PATCH 034/101] WIP: ASoC: meson: convert axg tdm interface to schema
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,axg-tdm-iface.txt | 22 -------
|
||||||
|
.../bindings/sound/amlogic,axg-tdm-iface.yaml | 57 +++++++++++++++++++
|
||||||
|
2 files changed, 57 insertions(+), 22 deletions(-)
|
||||||
|
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.txt
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.txt
|
||||||
|
deleted file mode 100644
|
||||||
|
index cabfb26a5f22..000000000000
|
||||||
|
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.txt
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,22 +0,0 @@
|
||||||
|
-* Amlogic Audio TDM Interfaces
|
||||||
|
-
|
||||||
|
-Required properties:
|
||||||
|
-- compatible: 'amlogic,axg-tdm-iface'
|
||||||
|
-- clocks: list of clock phandle, one for each entry clock-names.
|
||||||
|
-- clock-names: should contain the following:
|
||||||
|
- * "sclk" : bit clock.
|
||||||
|
- * "lrclk": sample clock
|
||||||
|
- * "mclk" : master clock
|
||||||
|
- -> optional if the interface is in clock slave mode.
|
||||||
|
-- #sound-dai-cells: must be 0.
|
||||||
|
-
|
||||||
|
-Example of TDM_A on the A113 SoC:
|
||||||
|
-
|
||||||
|
-tdmif_a: audio-controller@0 {
|
||||||
|
- compatible = "amlogic,axg-tdm-iface";
|
||||||
|
- #sound-dai-cells = <0>;
|
||||||
|
- clocks = <&clkc_audio AUD_CLKID_MST_A_MCLK>,
|
||||||
|
- <&clkc_audio AUD_CLKID_MST_A_SCLK>,
|
||||||
|
- <&clkc_audio AUD_CLKID_MST_A_LRCLK>;
|
||||||
|
- clock-names = "mclk", "sclk", "lrclk";
|
||||||
|
-};
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..5f04f9cf30a0
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.yaml
|
||||||
|
@@ -0,0 +1,57 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic Audio TDM Interfaces
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ $nodename:
|
||||||
|
+ pattern: "^audio-controller-.*"
|
||||||
|
+
|
||||||
|
+ "#sound-dai-cells":
|
||||||
|
+ const: 0
|
||||||
|
+
|
||||||
|
+ compatible:
|
||||||
|
+ items:
|
||||||
|
+ - const: 'amlogic,axg-tdm-iface'
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ minItems: 2
|
||||||
|
+ maxItems: 3
|
||||||
|
+ items:
|
||||||
|
+ - description: Bit clock
|
||||||
|
+ - description: Sample clock
|
||||||
|
+ - description: Master clock #optional
|
||||||
|
+
|
||||||
|
+ clock-names:
|
||||||
|
+ minItems: 2
|
||||||
|
+ maxItems: 3
|
||||||
|
+ items:
|
||||||
|
+ - const: sclk
|
||||||
|
+ - const: lrclk
|
||||||
|
+ - const: mclk
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - "#sound-dai-cells"
|
||||||
|
+ - compatible
|
||||||
|
+ - clocks
|
||||||
|
+ - clock-names
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||||
|
+
|
||||||
|
+ tdmif_a: audio-controller-0 {
|
||||||
|
+ compatible = "amlogic,axg-tdm-iface";
|
||||||
|
+ #sound-dai-cells = <0>;
|
||||||
|
+ clocks = <&clkc_audio AUD_CLKID_MST_A_SCLK>,
|
||||||
|
+ <&clkc_audio AUD_CLKID_MST_A_LRCLK>,
|
||||||
|
+ <&clkc_audio AUD_CLKID_MST_A_MCLK>;
|
||||||
|
+ clock-names = "sclk", "lrclk", "mclk";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,166 @@
|
||||||
|
From 222de230f3cb9c1452441001807c4ab876e0c959 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Fri, 24 Jan 2020 12:00:01 +0100
|
||||||
|
Subject: [PATCH 035/101] WIP: ASoC: meson: convert axg tdm formatters to
|
||||||
|
schema
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../sound/amlogic,axg-tdm-formatters.txt | 36 -------
|
||||||
|
.../sound/amlogic,axg-tdm-formatters.yaml | 101 ++++++++++++++++++
|
||||||
|
2 files changed, 101 insertions(+), 36 deletions(-)
|
||||||
|
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.txt
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.txt
|
||||||
|
deleted file mode 100644
|
||||||
|
index 5996c0cd89c2..000000000000
|
||||||
|
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.txt
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,36 +0,0 @@
|
||||||
|
-* Amlogic Audio TDM formatters
|
||||||
|
-
|
||||||
|
-Required properties:
|
||||||
|
-- compatible: 'amlogic,axg-tdmin' or
|
||||||
|
- 'amlogic,axg-tdmout' or
|
||||||
|
- 'amlogic,g12a-tdmin' or
|
||||||
|
- 'amlogic,g12a-tdmout' or
|
||||||
|
- 'amlogic,sm1-tdmin' or
|
||||||
|
- 'amlogic,sm1-tdmout
|
||||||
|
-- reg: physical base address of the controller and length of memory
|
||||||
|
- mapped region.
|
||||||
|
-- clocks: list of clock phandle, one for each entry clock-names.
|
||||||
|
-- clock-names: should contain the following:
|
||||||
|
- * "pclk" : peripheral clock.
|
||||||
|
- * "sclk" : bit clock.
|
||||||
|
- * "sclk_sel" : bit clock input multiplexer.
|
||||||
|
- * "lrclk" : sample clock
|
||||||
|
- * "lrclk_sel": sample clock input multiplexer
|
||||||
|
-
|
||||||
|
-Optional property:
|
||||||
|
-- resets: phandle to the dedicated reset line of the tdm formatter.
|
||||||
|
-
|
||||||
|
-Example of TDMOUT_A on the S905X2 SoC:
|
||||||
|
-
|
||||||
|
-tdmout_a: audio-controller@500 {
|
||||||
|
- compatible = "amlogic,axg-tdmout";
|
||||||
|
- reg = <0x0 0x500 0x0 0x40>;
|
||||||
|
- resets = <&clkc_audio AUD_RESET_TDMOUT_A>;
|
||||||
|
- clocks = <&clkc_audio AUD_CLKID_TDMOUT_A>,
|
||||||
|
- <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK>,
|
||||||
|
- <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK_SEL>,
|
||||||
|
- <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>,
|
||||||
|
- <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>;
|
||||||
|
- clock-names = "pclk", "sclk", "sclk_sel",
|
||||||
|
- "lrclk", "lrclk_sel";
|
||||||
|
-};
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..77b994df0c84
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.yaml
|
||||||
|
@@ -0,0 +1,101 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-formatters.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic Audio AXG TDM formatters
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ $nodename:
|
||||||
|
+ pattern: "^audio-controller@.*"
|
||||||
|
+
|
||||||
|
+ "#sound-dai-cells":
|
||||||
|
+ const: 0
|
||||||
|
+
|
||||||
|
+ compatible:
|
||||||
|
+ oneOf:
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - amlogic,g12a-tdmout
|
||||||
|
+ - amlogic,sm1-tdmout
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-tdmout
|
||||||
|
+ - items:
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-tdmout
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - amlogic,g12a-tdmin
|
||||||
|
+ - amlogic,sm1-tdmin
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-tdmin
|
||||||
|
+ - items:
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-tdmin
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ items:
|
||||||
|
+ - description: Peripheral clock
|
||||||
|
+ - description: Bit clock
|
||||||
|
+ - description: Bit clock input multiplexer
|
||||||
|
+ - description: Sample clock
|
||||||
|
+ - description: Sample clock input multiplexer
|
||||||
|
+
|
||||||
|
+ clock-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: pclk
|
||||||
|
+ - const: sclk
|
||||||
|
+ - const: sclk_sel
|
||||||
|
+ - const: lrclk
|
||||||
|
+ - const: lrclk_sel
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ resets:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - "#sound-dai-cells"
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - clocks
|
||||||
|
+ - clock-names
|
||||||
|
+
|
||||||
|
+if:
|
||||||
|
+ properties:
|
||||||
|
+ compatible:
|
||||||
|
+ contains:
|
||||||
|
+ enum:
|
||||||
|
+ - amlogic,g12a-tdmin
|
||||||
|
+ - amlogic,sm1-tdmin
|
||||||
|
+ - amlogic,g12a-tdmout
|
||||||
|
+ - amlogic,sm1-tdmout
|
||||||
|
+then:
|
||||||
|
+ required:
|
||||||
|
+ - resets
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||||
|
+ #include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
|
||||||
|
+
|
||||||
|
+ tdmout_a: audio-controller@500 {
|
||||||
|
+ compatible = "amlogic,g12a-tdmout",
|
||||||
|
+ "amlogic,axg-tdmout";
|
||||||
|
+ #sound-dai-cells = <0>;
|
||||||
|
+ reg = <0x0 0x500 0x0 0x40>;
|
||||||
|
+ resets = <&clkc_audio AUD_RESET_TDMOUT_A>;
|
||||||
|
+ clocks = <&clkc_audio AUD_CLKID_TDMOUT_A>,
|
||||||
|
+ <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK>,
|
||||||
|
+ <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK_SEL>,
|
||||||
|
+ <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>,
|
||||||
|
+ <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>;
|
||||||
|
+ clock-names = "pclk", "sclk", "sclk_sel",
|
||||||
|
+ "lrclk", "lrclk_sel";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
From 74524d2255deea105d57a441b266655a304b27f5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Fri, 24 Jan 2020 12:13:40 +0100
|
||||||
|
Subject: [PATCH 036/101] WIP: ASoC: meson: convert axg pdm to schema
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,axg-pdm.txt | 29 -------
|
||||||
|
.../bindings/sound/amlogic,axg-pdm.yaml | 79 +++++++++++++++++++
|
||||||
|
2 files changed, 79 insertions(+), 29 deletions(-)
|
||||||
|
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-pdm.txt
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-pdm.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.txt
|
||||||
|
deleted file mode 100644
|
||||||
|
index 716878107a24..000000000000
|
||||||
|
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.txt
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,29 +0,0 @@
|
||||||
|
-* Amlogic Audio PDM input
|
||||||
|
-
|
||||||
|
-Required properties:
|
||||||
|
-- compatible: 'amlogic,axg-pdm' or
|
||||||
|
- 'amlogic,g12a-pdm' or
|
||||||
|
- 'amlogic,sm1-pdm'
|
||||||
|
-- reg: physical base address of the controller and length of memory
|
||||||
|
- mapped region.
|
||||||
|
-- clocks: list of clock phandle, one for each entry clock-names.
|
||||||
|
-- clock-names: should contain the following:
|
||||||
|
- * "pclk" : peripheral clock.
|
||||||
|
- * "dclk" : pdm digital clock
|
||||||
|
- * "sysclk" : dsp system clock
|
||||||
|
-- #sound-dai-cells: must be 0.
|
||||||
|
-
|
||||||
|
-Optional property:
|
||||||
|
-- resets: phandle to the dedicated reset line of the pdm input.
|
||||||
|
-
|
||||||
|
-Example of PDM on the A113 SoC:
|
||||||
|
-
|
||||||
|
-pdm: audio-controller@ff632000 {
|
||||||
|
- compatible = "amlogic,axg-pdm";
|
||||||
|
- reg = <0x0 0xff632000 0x0 0x34>;
|
||||||
|
- #sound-dai-cells = <0>;
|
||||||
|
- clocks = <&clkc_audio AUD_CLKID_PDM>,
|
||||||
|
- <&clkc_audio AUD_CLKID_PDM_DCLK>,
|
||||||
|
- <&clkc_audio AUD_CLKID_PDM_SYSCLK>;
|
||||||
|
- clock-names = "pclk", "dclk", "sysclk";
|
||||||
|
-};
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..aa90b77e593d
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.yaml
|
||||||
|
@@ -0,0 +1,79 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,axg-pdm.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic Audio AXG PDM input
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ $nodename:
|
||||||
|
+ pattern: "^audio-controller@.*"
|
||||||
|
+
|
||||||
|
+ "#sound-dai-cells":
|
||||||
|
+ const: 0
|
||||||
|
+
|
||||||
|
+ compatible:
|
||||||
|
+ oneOf:
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - amlogic,g12a-pdm
|
||||||
|
+ - amlogic,sm1-pdm
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-pdm
|
||||||
|
+ - items:
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-pdm
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ items:
|
||||||
|
+ - description: Peripheral clock
|
||||||
|
+ - description: PDM digital clock
|
||||||
|
+ - description: DSP system clock
|
||||||
|
+
|
||||||
|
+ clock-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: pclk
|
||||||
|
+ - const: dclk
|
||||||
|
+ - const: sysclk
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ resets:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - "#sound-dai-cells"
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - clocks
|
||||||
|
+ - clock-names
|
||||||
|
+
|
||||||
|
+if:
|
||||||
|
+ properties:
|
||||||
|
+ compatible:
|
||||||
|
+ contains:
|
||||||
|
+ enum:
|
||||||
|
+ - amlogic,g12a-pdm
|
||||||
|
+ - amlogic,sm1-pdm
|
||||||
|
+then:
|
||||||
|
+ required:
|
||||||
|
+ - resets
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||||
|
+
|
||||||
|
+ pdm: audio-controller@ff632000 {
|
||||||
|
+ compatible = "amlogic,axg-pdm";
|
||||||
|
+ reg = <0x0 0xff632000 0x0 0x34>;
|
||||||
|
+ #sound-dai-cells = <0>;
|
||||||
|
+ clocks = <&clkc_audio AUD_CLKID_PDM>,
|
||||||
|
+ <&clkc_audio AUD_CLKID_PDM_DCLK>,
|
||||||
|
+ <&clkc_audio AUD_CLKID_PDM_SYSCLK>;
|
||||||
|
+ clock-names = "pclk", "dclk", "sysclk";
|
||||||
|
+ };
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,173 @@
|
||||||
|
From a97f73e2f405892e47e27b7382b18a055c9cfec5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Fri, 24 Jan 2020 15:40:25 +0100
|
||||||
|
Subject: [PATCH 037/101] WIP: ASoC: meson: convert axg fifo to schema
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,axg-fifo.txt | 34 ------
|
||||||
|
.../bindings/sound/amlogic,axg-fifo.yaml | 111 ++++++++++++++++++
|
||||||
|
2 files changed, 111 insertions(+), 34 deletions(-)
|
||||||
|
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-fifo.txt
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-fifo.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.txt
|
||||||
|
deleted file mode 100644
|
||||||
|
index fa4545ed81ca..000000000000
|
||||||
|
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.txt
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,34 +0,0 @@
|
||||||
|
-* Amlogic Audio FIFO controllers
|
||||||
|
-
|
||||||
|
-Required properties:
|
||||||
|
-- compatible: 'amlogic,axg-toddr' or
|
||||||
|
- 'amlogic,axg-toddr' or
|
||||||
|
- 'amlogic,g12a-frddr' or
|
||||||
|
- 'amlogic,g12a-toddr' or
|
||||||
|
- 'amlogic,sm1-frddr' or
|
||||||
|
- 'amlogic,sm1-toddr'
|
||||||
|
-- reg: physical base address of the controller and length of memory
|
||||||
|
- mapped region.
|
||||||
|
-- interrupts: interrupt specifier for the fifo.
|
||||||
|
-- clocks: phandle to the fifo peripheral clock provided by the audio
|
||||||
|
- clock controller.
|
||||||
|
-- resets: list of reset phandle, one for each entry reset-names.
|
||||||
|
-- reset-names: should contain the following:
|
||||||
|
- * "arb" : memory ARB line (required)
|
||||||
|
- * "rst" : dedicated device reset line (optional)
|
||||||
|
-- #sound-dai-cells: must be 0.
|
||||||
|
-- amlogic,fifo-depth: The size of the controller's fifo in bytes. This
|
||||||
|
- is useful for determining certain configuration such
|
||||||
|
- as the flush threshold of the fifo
|
||||||
|
-
|
||||||
|
-Example of FRDDR A on the A113 SoC:
|
||||||
|
-
|
||||||
|
-frddr_a: audio-controller@1c0 {
|
||||||
|
- compatible = "amlogic,axg-frddr";
|
||||||
|
- reg = <0x0 0x1c0 0x0 0x1c>;
|
||||||
|
- #sound-dai-cells = <0>;
|
||||||
|
- interrupts = <GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
- clocks = <&clkc_audio AUD_CLKID_FRDDR_A>;
|
||||||
|
- resets = <&arb AXG_ARB_FRDDR_A>;
|
||||||
|
- fifo-depth = <512>;
|
||||||
|
-};
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..d9fe4f624784
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.yaml
|
||||||
|
@@ -0,0 +1,111 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,axg-fifo.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic AXG Audio FIFO controllers
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ $nodename:
|
||||||
|
+ pattern: "^audio-controller@.*"
|
||||||
|
+
|
||||||
|
+ "#sound-dai-cells":
|
||||||
|
+ const: 0
|
||||||
|
+
|
||||||
|
+ compatible:
|
||||||
|
+ oneOf:
|
||||||
|
+ - items:
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-toddr
|
||||||
|
+ - items:
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-frddr
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - amlogic,g12a-toddr
|
||||||
|
+ - amlogic,sm1-toddr
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-toddr
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - amlogic,g12a-frddr
|
||||||
|
+ - amlogic,sm1-frddr
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-frddr
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ items:
|
||||||
|
+ - description: Peripheral clock
|
||||||
|
+
|
||||||
|
+ interrupts:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ resets:
|
||||||
|
+ minItems: 1
|
||||||
|
+ items:
|
||||||
|
+ - description: Memory ARB line
|
||||||
|
+ - description: Dedicated device reset line
|
||||||
|
+
|
||||||
|
+ reset-names:
|
||||||
|
+ minItems: 1
|
||||||
|
+ items:
|
||||||
|
+ - const: arb
|
||||||
|
+ - const: rst
|
||||||
|
+
|
||||||
|
+ amlogic,fifo-depth:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
+ description: Size of the controller's fifo in bytes
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - "#sound-dai-cells"
|
||||||
|
+ - compatible
|
||||||
|
+ - interrupts
|
||||||
|
+ - reg
|
||||||
|
+ - clocks
|
||||||
|
+ - resets
|
||||||
|
+ - amlogic,fifo-depth
|
||||||
|
+
|
||||||
|
+if:
|
||||||
|
+ properties:
|
||||||
|
+ compatible:
|
||||||
|
+ contains:
|
||||||
|
+ enum:
|
||||||
|
+ - amlogic,g12a-toddr
|
||||||
|
+ - amlogic,sm1-toddr
|
||||||
|
+ - amlogic,g12a-frddr
|
||||||
|
+ - amlogic,sm1-frddr
|
||||||
|
+then:
|
||||||
|
+ properties:
|
||||||
|
+ resets:
|
||||||
|
+ minItems: 2
|
||||||
|
+ reset-names:
|
||||||
|
+ minItems: 2
|
||||||
|
+ required:
|
||||||
|
+ - reset-names
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||||
|
+ #include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
+ #include <dt-bindings/reset/amlogic,meson-axg-audio-arb.h>
|
||||||
|
+ #include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
|
||||||
|
+
|
||||||
|
+ frddr_a: audio-controller@1c0 {
|
||||||
|
+ compatible = "amlogic,g12a-frddr", "amlogic,axg-frddr";
|
||||||
|
+ reg = <0x0 0x1c0 0x0 0x1c>;
|
||||||
|
+ #sound-dai-cells = <0>;
|
||||||
|
+ interrupts = <GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
+ clocks = <&clkc_audio AUD_CLKID_FRDDR_A>;
|
||||||
|
+ resets = <&arb AXG_ARB_FRDDR_A>, <&clkc_audio AUD_RESET_FRDDR_A>;
|
||||||
|
+ reset-names = "arb", "rst";
|
||||||
|
+ amlogic,fifo-depth = <512>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,139 @@
|
||||||
|
From d44d6ce650b53d6a05279113e77634405e87e589 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Fri, 24 Jan 2020 15:52:03 +0100
|
||||||
|
Subject: [PATCH 038/101] WIP: ASoC: meson: convert axg spdif input to schema
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,axg-spdifin.txt | 27 ------
|
||||||
|
.../bindings/sound/amlogic,axg-spdifin.yaml | 84 +++++++++++++++++++
|
||||||
|
2 files changed, 84 insertions(+), 27 deletions(-)
|
||||||
|
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.txt
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.txt
|
||||||
|
deleted file mode 100644
|
||||||
|
index df92a4ecf288..000000000000
|
||||||
|
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.txt
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,27 +0,0 @@
|
||||||
|
-* Amlogic Audio SPDIF Input
|
||||||
|
-
|
||||||
|
-Required properties:
|
||||||
|
-- compatible: 'amlogic,axg-spdifin' or
|
||||||
|
- 'amlogic,g12a-spdifin' or
|
||||||
|
- 'amlogic,sm1-spdifin'
|
||||||
|
-- interrupts: interrupt specifier for the spdif input.
|
||||||
|
-- clocks: list of clock phandle, one for each entry clock-names.
|
||||||
|
-- clock-names: should contain the following:
|
||||||
|
- * "pclk" : peripheral clock.
|
||||||
|
- * "refclk" : spdif input reference clock
|
||||||
|
-- #sound-dai-cells: must be 0.
|
||||||
|
-
|
||||||
|
-Optional property:
|
||||||
|
-- resets: phandle to the dedicated reset line of the spdif input.
|
||||||
|
-
|
||||||
|
-Example on the A113 SoC:
|
||||||
|
-
|
||||||
|
-spdifin: audio-controller@400 {
|
||||||
|
- compatible = "amlogic,axg-spdifin";
|
||||||
|
- reg = <0x0 0x400 0x0 0x30>;
|
||||||
|
- #sound-dai-cells = <0>;
|
||||||
|
- interrupts = <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
- clocks = <&clkc_audio AUD_CLKID_SPDIFIN>,
|
||||||
|
- <&clkc_audio AUD_CLKID_SPDIFIN_CLK>;
|
||||||
|
- clock-names = "pclk", "refclk";
|
||||||
|
-};
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..b9b0863c5723
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.yaml
|
||||||
|
@@ -0,0 +1,84 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,axg-spdifin.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic Audio AXG SPDIF Input
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ $nodename:
|
||||||
|
+ pattern: "^audio-controller@.*"
|
||||||
|
+
|
||||||
|
+ "#sound-dai-cells":
|
||||||
|
+ const: 0
|
||||||
|
+
|
||||||
|
+ compatible:
|
||||||
|
+ oneOf:
|
||||||
|
+ - items:
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-spdifin
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - amlogic,g12a-spdifin
|
||||||
|
+ - amlogic,sm1-spdifin
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-spdifin
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ items:
|
||||||
|
+ - description: Peripheral clock
|
||||||
|
+ - description: SPDIF input reference clock
|
||||||
|
+
|
||||||
|
+ clock-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: pclk
|
||||||
|
+ - const: refclk
|
||||||
|
+
|
||||||
|
+ interrupts:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ resets:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - "#sound-dai-cells"
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - interrupts
|
||||||
|
+ - clocks
|
||||||
|
+ - clock-names
|
||||||
|
+
|
||||||
|
+if:
|
||||||
|
+ properties:
|
||||||
|
+ compatible:
|
||||||
|
+ contains:
|
||||||
|
+ enum:
|
||||||
|
+ - amlogic,g12a-spdifin
|
||||||
|
+ - amlogic,sm1-spdifin
|
||||||
|
+then:
|
||||||
|
+ required:
|
||||||
|
+ - resets
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||||
|
+ #include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
+
|
||||||
|
+ spdifin: audio-controller@400 {
|
||||||
|
+ compatible = "amlogic,axg-spdifin";
|
||||||
|
+ reg = <0x0 0x400 0x0 0x30>;
|
||||||
|
+ #sound-dai-cells = <0>;
|
||||||
|
+ interrupts = <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
+ clocks = <&clkc_audio AUD_CLKID_SPDIFIN>,
|
||||||
|
+ <&clkc_audio AUD_CLKID_SPDIFIN_CLK>;
|
||||||
|
+ clock-names = "pclk", "refclk";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,130 @@
|
||||||
|
From 4c8c6dedc0943fcc7a58ea7a41cdd46eda3a69f7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Fri, 24 Jan 2020 15:58:18 +0100
|
||||||
|
Subject: [PATCH 039/101] WIP: ASoC: meson: convert axg spdif output to schema
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,axg-spdifout.txt | 25 ------
|
||||||
|
.../bindings/sound/amlogic,axg-spdifout.yaml | 77 +++++++++++++++++++
|
||||||
|
2 files changed, 77 insertions(+), 25 deletions(-)
|
||||||
|
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.txt
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.txt
|
||||||
|
deleted file mode 100644
|
||||||
|
index 28381dd1f633..000000000000
|
||||||
|
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.txt
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,25 +0,0 @@
|
||||||
|
-* Amlogic Audio SPDIF Output
|
||||||
|
-
|
||||||
|
-Required properties:
|
||||||
|
-- compatible: 'amlogic,axg-spdifout' or
|
||||||
|
- 'amlogic,g12a-spdifout' or
|
||||||
|
- 'amlogic,sm1-spdifout'
|
||||||
|
-- clocks: list of clock phandle, one for each entry clock-names.
|
||||||
|
-- clock-names: should contain the following:
|
||||||
|
- * "pclk" : peripheral clock.
|
||||||
|
- * "mclk" : master clock
|
||||||
|
-- #sound-dai-cells: must be 0.
|
||||||
|
-
|
||||||
|
-Optional property:
|
||||||
|
-- resets: phandle to the dedicated reset line of the spdif output.
|
||||||
|
-
|
||||||
|
-Example on the A113 SoC:
|
||||||
|
-
|
||||||
|
-spdifout: audio-controller@480 {
|
||||||
|
- compatible = "amlogic,axg-spdifout";
|
||||||
|
- reg = <0x0 0x480 0x0 0x50>;
|
||||||
|
- #sound-dai-cells = <0>;
|
||||||
|
- clocks = <&clkc_audio AUD_CLKID_SPDIFOUT>,
|
||||||
|
- <&clkc_audio AUD_CLKID_SPDIFOUT_CLK>;
|
||||||
|
- clock-names = "pclk", "mclk";
|
||||||
|
-};
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..9ac52916f88b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.yaml
|
||||||
|
@@ -0,0 +1,77 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,axg-spdifout.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic Audio AXG SPDIF Output
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ $nodename:
|
||||||
|
+ pattern: "^audio-controller@.*"
|
||||||
|
+
|
||||||
|
+ "#sound-dai-cells":
|
||||||
|
+ const: 0
|
||||||
|
+
|
||||||
|
+ compatible:
|
||||||
|
+ oneOf:
|
||||||
|
+ - items:
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-spdifout
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - amlogic,g12a-spdifout
|
||||||
|
+ - amlogic,sm1-spdifout
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,axg-spdifout
|
||||||
|
+
|
||||||
|
+ clocks:
|
||||||
|
+ items:
|
||||||
|
+ - description: Peripheral clock
|
||||||
|
+ - description: SPDIF output master clock
|
||||||
|
+
|
||||||
|
+ clock-names:
|
||||||
|
+ items:
|
||||||
|
+ - const: pclk
|
||||||
|
+ - const: mclk
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ resets:
|
||||||
|
+ items:
|
||||||
|
+ - description: dedicated device reset line
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - "#sound-dai-cells"
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - clocks
|
||||||
|
+ - clock-names
|
||||||
|
+
|
||||||
|
+if:
|
||||||
|
+ properties:
|
||||||
|
+ compatible:
|
||||||
|
+ contains:
|
||||||
|
+ enum:
|
||||||
|
+ - amlogic,g12a-spdifout
|
||||||
|
+ - amlogic,sm1-spdifout
|
||||||
|
+then:
|
||||||
|
+ required:
|
||||||
|
+ - resets
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||||
|
+
|
||||||
|
+ spdifout: audio-controller@480 {
|
||||||
|
+ compatible = "amlogic,axg-spdifout";
|
||||||
|
+ reg = <0x0 0x480 0x0 0x50>;
|
||||||
|
+ #sound-dai-cells = <0>;
|
||||||
|
+ clocks = <&clkc_audio AUD_CLKID_SPDIFOUT>,
|
||||||
|
+ <&clkc_audio AUD_CLKID_SPDIFOUT_CLK>;
|
||||||
|
+ clock-names = "pclk", "mclk";
|
||||||
|
+ };
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
From 2c10c55e9061c3ebfb059a54e531c512a9d19aa3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Fri, 24 Jan 2020 16:02:43 +0100
|
||||||
|
Subject: [PATCH 040/101] WIP: ASoC: meson: convert g12a tohdmitx control to
|
||||||
|
schema
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,g12a-tohdmitx.txt | 58 -------------------
|
||||||
|
.../bindings/sound/amlogic,g12a-tohdmitx.yaml | 53 +++++++++++++++++
|
||||||
|
2 files changed, 53 insertions(+), 58 deletions(-)
|
||||||
|
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.txt
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.txt b/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.txt
|
||||||
|
deleted file mode 100644
|
||||||
|
index 4e8cd7eb7cec..000000000000
|
||||||
|
--- a/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.txt
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,58 +0,0 @@
|
||||||
|
-* Amlogic HDMI Tx control glue
|
||||||
|
-
|
||||||
|
-Required properties:
|
||||||
|
-- compatible: "amlogic,g12a-tohdmitx" or
|
||||||
|
- "amlogic,sm1-tohdmitx"
|
||||||
|
-- reg: physical base address of the controller and length of memory
|
||||||
|
- mapped region.
|
||||||
|
-- #sound-dai-cells: should be 1.
|
||||||
|
-- resets: phandle to the dedicated reset line of the hdmitx glue.
|
||||||
|
-
|
||||||
|
-Example on the S905X2 SoC:
|
||||||
|
-
|
||||||
|
-tohdmitx: audio-controller@744 {
|
||||||
|
- compatible = "amlogic,g12a-tohdmitx";
|
||||||
|
- reg = <0x0 0x744 0x0 0x4>;
|
||||||
|
- #sound-dai-cells = <1>;
|
||||||
|
- resets = <&clkc_audio AUD_RESET_TOHDMITX>;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-Example of an 'amlogic,axg-sound-card':
|
||||||
|
-
|
||||||
|
-sound {
|
||||||
|
- compatible = "amlogic,axg-sound-card";
|
||||||
|
-
|
||||||
|
-[...]
|
||||||
|
-
|
||||||
|
- dai-link-x {
|
||||||
|
- sound-dai = <&tdmif_a>;
|
||||||
|
- dai-format = "i2s";
|
||||||
|
- dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||||
|
-
|
||||||
|
- codec-0 {
|
||||||
|
- sound-dai = <&tohdmitx TOHDMITX_I2S_IN_A>;
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- codec-1 {
|
||||||
|
- sound-dai = <&external_dac>;
|
||||||
|
- };
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- dai-link-y {
|
||||||
|
- sound-dai = <&tdmif_c>;
|
||||||
|
- dai-format = "i2s";
|
||||||
|
- dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||||
|
-
|
||||||
|
- codec {
|
||||||
|
- sound-dai = <&tohdmitx TOHDMITX_I2S_IN_C>;
|
||||||
|
- };
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- dai-link-z {
|
||||||
|
- sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
|
||||||
|
-
|
||||||
|
- codec {
|
||||||
|
- sound-dai = <&hdmi_tx>;
|
||||||
|
- };
|
||||||
|
- };
|
||||||
|
-};
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.yaml b/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..fdd64d103f33
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.yaml
|
||||||
|
@@ -0,0 +1,53 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,g12a-tohdmitx.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic G12a HDMI Tx Control Glue
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ $nodename:
|
||||||
|
+ pattern: "^audio-controller@.*"
|
||||||
|
+
|
||||||
|
+ "#sound-dai-cells":
|
||||||
|
+ const: 1
|
||||||
|
+
|
||||||
|
+ compatible:
|
||||||
|
+ oneOf:
|
||||||
|
+ - items:
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,g12a-tohdmitx
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - amlogic,sm1-tohdmitx
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,g12a-tohdmitx
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ resets:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - "#sound-dai-cells"
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - resets
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
|
||||||
|
+
|
||||||
|
+ tohdmitx: audio-controller@744 {
|
||||||
|
+ compatible = "amlogic,g12a-tohdmitx";
|
||||||
|
+ reg = <0x0 0x744 0x0 0x4>;
|
||||||
|
+ #sound-dai-cells = <1>;
|
||||||
|
+ resets = <&clkc_audio AUD_RESET_TOHDMITX>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,334 @@
|
||||||
|
From 3b0d0fb9fb7faf1b00703693500a666be85209a0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Fri, 24 Jan 2020 18:23:36 +0100
|
||||||
|
Subject: [PATCH 041/101] WIP: ASoC: meson: convert axg sound card control to
|
||||||
|
schema
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,axg-sound-card.txt | 124 ------------
|
||||||
|
.../sound/amlogic,axg-sound-card.yaml | 181 ++++++++++++++++++
|
||||||
|
2 files changed, 181 insertions(+), 124 deletions(-)
|
||||||
|
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.txt
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.yaml
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.txt
|
||||||
|
deleted file mode 100644
|
||||||
|
index 80b411296480..000000000000
|
||||||
|
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.txt
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,124 +0,0 @@
|
||||||
|
-Amlogic AXG sound card:
|
||||||
|
-
|
||||||
|
-Required properties:
|
||||||
|
-
|
||||||
|
-- compatible: "amlogic,axg-sound-card"
|
||||||
|
-- model : User specified audio sound card name, one string
|
||||||
|
-
|
||||||
|
-Optional properties:
|
||||||
|
-
|
||||||
|
-- audio-aux-devs : List of phandles pointing to auxiliary devices
|
||||||
|
-- audio-widgets : Please refer to widgets.txt.
|
||||||
|
-- audio-routing : A list of the connections between audio components.
|
||||||
|
-
|
||||||
|
-Subnodes:
|
||||||
|
-
|
||||||
|
-- dai-link: Container for dai-link level properties and the CODEC
|
||||||
|
- sub-nodes. There should be at least one (and probably more)
|
||||||
|
- subnode of this type.
|
||||||
|
-
|
||||||
|
-Required dai-link properties:
|
||||||
|
-
|
||||||
|
-- sound-dai: phandle and port of the CPU DAI.
|
||||||
|
-
|
||||||
|
-Required TDM Backend dai-link properties:
|
||||||
|
-- dai-format : CPU/CODEC common audio format
|
||||||
|
-
|
||||||
|
-Optional TDM Backend dai-link properties:
|
||||||
|
-- dai-tdm-slot-rx-mask-{0,1,2,3}: Receive direction slot masks
|
||||||
|
-- dai-tdm-slot-tx-mask-{0,1,2,3}: Transmit direction slot masks
|
||||||
|
- When omitted, mask is assumed to have to no
|
||||||
|
- slots. A valid must have at one slot, so at
|
||||||
|
- least one these mask should be provided with
|
||||||
|
- an enabled slot.
|
||||||
|
-- dai-tdm-slot-num : Please refer to tdm-slot.txt.
|
||||||
|
- If omitted, slot number is set to accommodate the largest
|
||||||
|
- mask provided.
|
||||||
|
-- dai-tdm-slot-width : Please refer to tdm-slot.txt. default to 32 if omitted.
|
||||||
|
-- mclk-fs : Multiplication factor between stream rate and mclk
|
||||||
|
-
|
||||||
|
-Backend dai-link subnodes:
|
||||||
|
-
|
||||||
|
-- codec: dai-link representing backend links should have at least one subnode.
|
||||||
|
- One subnode for each codec of the dai-link.
|
||||||
|
- dai-link representing frontend links have no codec, therefore have no
|
||||||
|
- subnodes
|
||||||
|
-
|
||||||
|
-Required codec subnodes properties:
|
||||||
|
-
|
||||||
|
-- sound-dai: phandle and port of the CODEC DAI.
|
||||||
|
-
|
||||||
|
-Optional codec subnodes properties:
|
||||||
|
-
|
||||||
|
-- dai-tdm-slot-tx-mask : Please refer to tdm-slot.txt.
|
||||||
|
-- dai-tdm-slot-rx-mask : Please refer to tdm-slot.txt.
|
||||||
|
-
|
||||||
|
-Example:
|
||||||
|
-
|
||||||
|
-sound {
|
||||||
|
- compatible = "amlogic,axg-sound-card";
|
||||||
|
- model = "AXG-S420";
|
||||||
|
- audio-aux-devs = <&tdmin_a>, <&tdmout_c>;
|
||||||
|
- audio-widgets = "Line", "Lineout",
|
||||||
|
- "Line", "Linein",
|
||||||
|
- "Speaker", "Speaker1 Left",
|
||||||
|
- "Speaker", "Speaker1 Right";
|
||||||
|
- "Speaker", "Speaker2 Left",
|
||||||
|
- "Speaker", "Speaker2 Right";
|
||||||
|
- audio-routing = "TDMOUT_C IN 0", "FRDDR_A OUT 2",
|
||||||
|
- "SPDIFOUT IN 0", "FRDDR_A OUT 3",
|
||||||
|
- "TDM_C Playback", "TDMOUT_C OUT",
|
||||||
|
- "TDMIN_A IN 2", "TDM_C Capture",
|
||||||
|
- "TDMIN_A IN 5", "TDM_C Loopback",
|
||||||
|
- "TODDR_A IN 0", "TDMIN_A OUT",
|
||||||
|
- "Lineout", "Lineout AOUTL",
|
||||||
|
- "Lineout", "Lineout AOUTR",
|
||||||
|
- "Speaker1 Left", "SPK1 OUT_A",
|
||||||
|
- "Speaker2 Left", "SPK2 OUT_A",
|
||||||
|
- "Speaker1 Right", "SPK1 OUT_B",
|
||||||
|
- "Speaker2 Right", "SPK2 OUT_B",
|
||||||
|
- "Linein AINL", "Linein",
|
||||||
|
- "Linein AINR", "Linein";
|
||||||
|
-
|
||||||
|
- dai-link@0 {
|
||||||
|
- sound-dai = <&frddr_a>;
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- dai-link@1 {
|
||||||
|
- sound-dai = <&toddr_a>;
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- dai-link@2 {
|
||||||
|
- sound-dai = <&tdmif_c>;
|
||||||
|
- dai-format = "i2s";
|
||||||
|
- dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||||
|
- dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||||
|
- dai-tdm-slot-rx-mask-1 = <1 1>;
|
||||||
|
- mclk-fs = <256>;
|
||||||
|
-
|
||||||
|
- codec@0 {
|
||||||
|
- sound-dai = <&lineout>;
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- codec@1 {
|
||||||
|
- sound-dai = <&speaker_amp1>;
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- codec@2 {
|
||||||
|
- sound-dai = <&speaker_amp2>;
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- codec@3 {
|
||||||
|
- sound-dai = <&linein>;
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- dai-link@3 {
|
||||||
|
- sound-dai = <&spdifout>;
|
||||||
|
-
|
||||||
|
- codec {
|
||||||
|
- sound-dai = <&spdif_dit>;
|
||||||
|
- };
|
||||||
|
- };
|
||||||
|
-};
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..168d84b2dcb7
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.yaml
|
||||||
|
@@ -0,0 +1,181 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,axg-sound-card.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic AXG sound card
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ compatible:
|
||||||
|
+ items:
|
||||||
|
+ - const: amlogic,axg-sound-card
|
||||||
|
+
|
||||||
|
+ audio-aux-devs:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/phandle-array
|
||||||
|
+ description: list of auxiliary devices
|
||||||
|
+
|
||||||
|
+ audio-routing:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||||
|
+ minItems: 2
|
||||||
|
+ description: |-
|
||||||
|
+ A list of the connections between audio components. Each entry is a
|
||||||
|
+ pair of strings, the first being the connection's sink, the second
|
||||||
|
+ being the connection's source.
|
||||||
|
+
|
||||||
|
+ audio-widgets:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||||
|
+ minItems: 2
|
||||||
|
+ description: |-
|
||||||
|
+ A list off component DAPM widget. Each entry is a pair of strings,
|
||||||
|
+ the first being the widget type, the second being the widget name
|
||||||
|
+
|
||||||
|
+ model:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/string
|
||||||
|
+ description: User specified audio sound card name
|
||||||
|
+
|
||||||
|
+patternProperties:
|
||||||
|
+ "^dai-link-[0-9]+$":
|
||||||
|
+ type: object
|
||||||
|
+ description: |-
|
||||||
|
+ dai-link child nodes:
|
||||||
|
+ Container for dai-link level properties and the CODEC sub-nodes.
|
||||||
|
+ There should be at least one (and probably more) subnode of this type
|
||||||
|
+
|
||||||
|
+ properties:
|
||||||
|
+ dai-format:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/string
|
||||||
|
+ enum: [ i2s, left-j, dsp_a ]
|
||||||
|
+
|
||||||
|
+ dai-tdm-slot-num:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
+ description: |
|
||||||
|
+ Number of slots in use. If omitted, slot number is set to
|
||||||
|
+ accommodate the largest mask provided.
|
||||||
|
+ maximum: 32
|
||||||
|
+
|
||||||
|
+ dai-tdm-slot-width:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
+ description: Width in bits for each slot
|
||||||
|
+ enum: [ 8, 16, 20, 24, 32 ]
|
||||||
|
+ default: 32
|
||||||
|
+
|
||||||
|
+ mclk-fs:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
+ description: |-
|
||||||
|
+ Multiplication factor between the frame rate and master clock
|
||||||
|
+ rate
|
||||||
|
+
|
||||||
|
+ sound-dai:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
+ description: phandle of the CPU DAI
|
||||||
|
+
|
||||||
|
+ patternProperties:
|
||||||
|
+ "^dai-tdm-slot-(t|r)x-mask-[0-3]$":
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||||
|
+ description: |-
|
||||||
|
+ Transmit and receive cpu slot masks of each TDM lane
|
||||||
|
+ When omitted, mask is assumed to have to no slots. A valid must have
|
||||||
|
+ at one slot, so at least one these mask should be provided with
|
||||||
|
+ an enabled slot.
|
||||||
|
+
|
||||||
|
+ "^codec-[0-9]+$":
|
||||||
|
+ type: object
|
||||||
|
+ description: |-
|
||||||
|
+ Codecs:
|
||||||
|
+ dai-link representing backend links should have at least one subnode.
|
||||||
|
+ One subnode for each codec of the dai-link. dai-link representing
|
||||||
|
+ frontend links have no codec, therefore have no subnodes
|
||||||
|
+
|
||||||
|
+ properties:
|
||||||
|
+ sound-dai:
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
+ description: phandle of the codec DAI
|
||||||
|
+
|
||||||
|
+ patternProperties:
|
||||||
|
+ "^dai-tdm-slot-(t|r)x-mask$":
|
||||||
|
+ $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||||
|
+ description: Transmit and receive codec slot masks
|
||||||
|
+
|
||||||
|
+ required:
|
||||||
|
+ - sound-dai
|
||||||
|
+
|
||||||
|
+ required:
|
||||||
|
+ - sound-dai
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - model
|
||||||
|
+ - dai-link-0
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ sound {
|
||||||
|
+ compatible = "amlogic,axg-sound-card";
|
||||||
|
+ model = "AXG-S420";
|
||||||
|
+ audio-aux-devs = <&tdmin_a>, <&tdmout_c>;
|
||||||
|
+ audio-widgets = "Line", "Lineout",
|
||||||
|
+ "Line", "Linein",
|
||||||
|
+ "Speaker", "Speaker1 Left",
|
||||||
|
+ "Speaker", "Speaker1 Right",
|
||||||
|
+ "Speaker", "Speaker2 Left",
|
||||||
|
+ "Speaker", "Speaker2 Right";
|
||||||
|
+ audio-routing = "TDMOUT_C IN 0", "FRDDR_A OUT 2",
|
||||||
|
+ "SPDIFOUT IN 0", "FRDDR_A OUT 3",
|
||||||
|
+ "TDM_C Playback", "TDMOUT_C OUT",
|
||||||
|
+ "TDMIN_A IN 2", "TDM_C Capture",
|
||||||
|
+ "TDMIN_A IN 5", "TDM_C Loopback",
|
||||||
|
+ "TODDR_A IN 0", "TDMIN_A OUT",
|
||||||
|
+ "Lineout", "Lineout AOUTL",
|
||||||
|
+ "Lineout", "Lineout AOUTR",
|
||||||
|
+ "Speaker1 Left", "SPK1 OUT_A",
|
||||||
|
+ "Speaker2 Left", "SPK2 OUT_A",
|
||||||
|
+ "Speaker1 Right", "SPK1 OUT_B",
|
||||||
|
+ "Speaker2 Right", "SPK2 OUT_B",
|
||||||
|
+ "Linein AINL", "Linein",
|
||||||
|
+ "Linein AINR", "Linein";
|
||||||
|
+
|
||||||
|
+ dai-link-0 {
|
||||||
|
+ sound-dai = <&frddr_a>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-1 {
|
||||||
|
+ sound-dai = <&toddr_a>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-2 {
|
||||||
|
+ sound-dai = <&tdmif_c>;
|
||||||
|
+ dai-format = "i2s";
|
||||||
|
+ dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||||
|
+ dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||||
|
+ dai-tdm-slot-rx-mask-1 = <1 1>;
|
||||||
|
+ mclk-fs = <256>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&lineout>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ codec-1 {
|
||||||
|
+ sound-dai = <&speaker_amp1>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ codec-2 {
|
||||||
|
+ sound-dai = <&speaker_amp2>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ codec-3 {
|
||||||
|
+ sound-dai = <&linein>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link@3 {
|
||||||
|
+ sound-dai = <&spdifout>;
|
||||||
|
+
|
||||||
|
+ codec {
|
||||||
|
+ sound-dai = <&spdif_dit>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
From d90703dc8cb5ec80bcd92a2065a25208819ddb69 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Tue, 28 Jan 2020 13:37:39 +0100
|
||||||
|
Subject: [PATCH 042/101] FROMLIST: ASoC: meson: add g12a-toacodec dt-binding
|
||||||
|
documentation
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../bindings/sound/amlogic,g12a-toacodec.yaml | 53 +++++++++++++++++++
|
||||||
|
.../dt-bindings/sound/meson-g12a-toacodec.h | 10 ++++
|
||||||
|
2 files changed, 63 insertions(+)
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml
|
||||||
|
create mode 100644 include/dt-bindings/sound/meson-g12a-toacodec.h
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml b/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..cbd33ba99e58
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml
|
||||||
|
@@ -0,0 +1,53 @@
|
||||||
|
+# SPDX-License-Identifier: GPL-2.0
|
||||||
|
+%YAML 1.2
|
||||||
|
+---
|
||||||
|
+$id: http://devicetree.org/schemas/sound/amlogic,g12a-toacodec.yaml#
|
||||||
|
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
+
|
||||||
|
+title: Amlogic G12a Internal DAC Control Glue
|
||||||
|
+
|
||||||
|
+maintainers:
|
||||||
|
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+properties:
|
||||||
|
+ $nodename:
|
||||||
|
+ pattern: "^audio-controller@.*"
|
||||||
|
+
|
||||||
|
+ "#sound-dai-cells":
|
||||||
|
+ const: 1
|
||||||
|
+
|
||||||
|
+ compatible:
|
||||||
|
+ oneOf:
|
||||||
|
+ - items:
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,g12a-toacodec
|
||||||
|
+ - items:
|
||||||
|
+ - enum:
|
||||||
|
+ - amlogic,sm1-toacodec
|
||||||
|
+ - const:
|
||||||
|
+ amlogic,g12a-toacodec
|
||||||
|
+
|
||||||
|
+ reg:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+ resets:
|
||||||
|
+ maxItems: 1
|
||||||
|
+
|
||||||
|
+required:
|
||||||
|
+ - "#sound-dai-cells"
|
||||||
|
+ - compatible
|
||||||
|
+ - reg
|
||||||
|
+ - resets
|
||||||
|
+
|
||||||
|
+examples:
|
||||||
|
+ - |
|
||||||
|
+ #include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
|
||||||
|
+
|
||||||
|
+ toacodec: audio-controller@740 {
|
||||||
|
+ compatible = "amlogic,g12a-toacodec";
|
||||||
|
+ reg = <0x0 0x740 0x0 0x4>;
|
||||||
|
+ #sound-dai-cells = <1>;
|
||||||
|
+ resets = <&clkc_audio AUD_RESET_TOACODEC>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+
|
||||||
|
diff --git a/include/dt-bindings/sound/meson-g12a-toacodec.h b/include/dt-bindings/sound/meson-g12a-toacodec.h
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..69d7a75592a2
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/include/dt-bindings/sound/meson-g12a-toacodec.h
|
||||||
|
@@ -0,0 +1,10 @@
|
||||||
|
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
+#ifndef __DT_MESON_G12A_TOACODEC_H
|
||||||
|
+#define __DT_MESON_G12A_TOACODEC_H
|
||||||
|
+
|
||||||
|
+#define TOACODEC_IN_A 0
|
||||||
|
+#define TOACODEC_IN_B 1
|
||||||
|
+#define TOACODEC_IN_C 2
|
||||||
|
+#define TOACODEC_OUT 3
|
||||||
|
+
|
||||||
|
+#endif /* __DT_MESON_G12A_TOACODEC_H */
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,301 @@
|
||||||
|
From 937f0a899a466aa9f00ad16d24dd4a25ba4ee345 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Mon, 12 Aug 2019 11:45:16 +0200
|
||||||
|
Subject: [PATCH 043/101] FROMLIST: ASoC: meson: add g12 internal DAC glue
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/Kconfig | 9 ++
|
||||||
|
sound/soc/meson/Makefile | 2 +
|
||||||
|
sound/soc/meson/g12a-toacodec.c | 240 ++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 251 insertions(+)
|
||||||
|
create mode 100644 sound/soc/meson/g12a-toacodec.c
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/Kconfig b/sound/soc/meson/Kconfig
|
||||||
|
index 897a706dcda0..85ab77ff0399 100644
|
||||||
|
--- a/sound/soc/meson/Kconfig
|
||||||
|
+++ b/sound/soc/meson/Kconfig
|
||||||
|
@@ -109,6 +109,15 @@ config SND_MESON_GX_SOUND_CARD
|
||||||
|
help
|
||||||
|
Select Y or M to add support for the GXBB/GXL SoC sound card
|
||||||
|
|
||||||
|
+config SND_MESON_G12A_TOACODEC
|
||||||
|
+ tristate "Amlogic G12A To Internal DAC Control Support"
|
||||||
|
+ select SND_MESON_CODEC_GLUE
|
||||||
|
+ select REGMAP_MMIO
|
||||||
|
+ imply SND_SOC_MESON_T9015
|
||||||
|
+ help
|
||||||
|
+ Select Y or M to add support for the internal audio DAC on the
|
||||||
|
+ g12a SoC family
|
||||||
|
+
|
||||||
|
config SND_MESON_G12A_TOHDMITX
|
||||||
|
tristate "Amlogic G12A To HDMI TX Control Support"
|
||||||
|
select REGMAP_MMIO
|
||||||
|
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||||
|
index 3c9d48846816..e446bc980481 100644
|
||||||
|
--- a/sound/soc/meson/Makefile
|
||||||
|
+++ b/sound/soc/meson/Makefile
|
||||||
|
@@ -22,6 +22,7 @@ snd-soc-meson-axg-pdm-objs := axg-pdm.o
|
||||||
|
snd-soc-meson-card-utils-objs := meson-card-utils.o
|
||||||
|
snd-soc-meson-codec-glue-objs := meson-codec-glue.o
|
||||||
|
snd-soc-meson-gx-sound-card-objs := gx-card.o
|
||||||
|
+snd-soc-meson-g12a-toacodec-objs := g12a-toacodec.o
|
||||||
|
snd-soc-meson-g12a-tohdmitx-objs := g12a-tohdmitx.o
|
||||||
|
snd-soc-meson-t9015-objs := t9015.o
|
||||||
|
|
||||||
|
@@ -40,5 +41,6 @@ obj-$(CONFIG_SND_MESON_AXG_PDM) += snd-soc-meson-axg-pdm.o
|
||||||
|
obj-$(CONFIG_SND_MESON_CARD_UTILS) += snd-soc-meson-card-utils.o
|
||||||
|
obj-$(CONFIG_SND_MESON_CODEC_GLUE) += snd-soc-meson-codec-glue.o
|
||||||
|
obj-$(CONFIG_SND_MESON_GX_SOUND_CARD) += snd-soc-meson-gx-sound-card.o
|
||||||
|
+obj-$(CONFIG_SND_MESON_G12A_TOACODEC) += snd-soc-meson-g12a-toacodec.o
|
||||||
|
obj-$(CONFIG_SND_MESON_G12A_TOHDMITX) += snd-soc-meson-g12a-tohdmitx.o
|
||||||
|
obj-$(CONFIG_SND_SOC_MESON_T9015) += snd-soc-meson-t9015.o
|
||||||
|
diff --git a/sound/soc/meson/g12a-toacodec.c b/sound/soc/meson/g12a-toacodec.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..0ee074f6fc87
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sound/soc/meson/g12a-toacodec.c
|
||||||
|
@@ -0,0 +1,240 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+//
|
||||||
|
+// Copyright (c) 2020 BayLibre, SAS.
|
||||||
|
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
+
|
||||||
|
+#include <linux/bitfield.h>
|
||||||
|
+#include <linux/clk.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <sound/pcm_params.h>
|
||||||
|
+#include <linux/regmap.h>
|
||||||
|
+#include <linux/regulator/consumer.h>
|
||||||
|
+#include <linux/reset.h>
|
||||||
|
+#include <sound/soc.h>
|
||||||
|
+#include <sound/soc-dai.h>
|
||||||
|
+
|
||||||
|
+#include <dt-bindings/sound/meson-g12a-toacodec.h>
|
||||||
|
+#include "axg-tdm.h"
|
||||||
|
+#include "meson-codec-glue.h"
|
||||||
|
+
|
||||||
|
+#define G12A_TOACODEC_DRV_NAME "g12a-toacodec"
|
||||||
|
+
|
||||||
|
+#define TOACODEC_CTRL0 0x0
|
||||||
|
+#define CTRL0_ENABLE_SHIFT 31
|
||||||
|
+#define CTRL0_DAT_SEL GENMASK(15, 14)
|
||||||
|
+#define CTRL0_LANE_SEL 12
|
||||||
|
+#define CTRL0_LRCLK_SEL GENMASK(9, 8)
|
||||||
|
+#define CTRL0_BLK_CAP_INV BIT(7)
|
||||||
|
+#define CTRL0_BCLK_O_INV BIT(6)
|
||||||
|
+#define CTRL0_BCLK_SEL GENMASK(5, 4)
|
||||||
|
+#define CTRL0_MCLK_SEL GENMASK(2, 0)
|
||||||
|
+
|
||||||
|
+#define TOACODEC_OUT_CHMAX 2
|
||||||
|
+
|
||||||
|
+static const char * const g12a_toacodec_mux_texts[] = {
|
||||||
|
+ "I2S A", "I2S B", "I2S C",
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int g12a_toacodec_get_mux(struct snd_soc_component *component)
|
||||||
|
+{
|
||||||
|
+ unsigned int val;
|
||||||
|
+
|
||||||
|
+ snd_soc_component_read(component, TOACODEC_CTRL0, &val);
|
||||||
|
+ return FIELD_GET(CTRL0_DAT_SEL, val);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int g12a_toacodec_put_mux(struct snd_soc_component *component,
|
||||||
|
+ unsigned int mux)
|
||||||
|
+{
|
||||||
|
+ snd_soc_component_update_bits(component, TOACODEC_CTRL0,
|
||||||
|
+ CTRL0_DAT_SEL |
|
||||||
|
+ CTRL0_LRCLK_SEL |
|
||||||
|
+ CTRL0_BCLK_SEL,
|
||||||
|
+ FIELD_PREP(CTRL0_DAT_SEL, mux) |
|
||||||
|
+ FIELD_PREP(CTRL0_LRCLK_SEL, mux) |
|
||||||
|
+ FIELD_PREP(CTRL0_BCLK_SEL, mux));
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * FIXME:
|
||||||
|
+ * On this soc, the glue gets the MCLK directly from the clock
|
||||||
|
+ * controller instead of going the through the TDM interface.
|
||||||
|
+ *
|
||||||
|
+ * Here we assume interface A uses clock A, etc ... While it is
|
||||||
|
+ * true for now, it could be different. Instead the glue should
|
||||||
|
+ * find out the clock used by the interface and select the same
|
||||||
|
+ * source. For that, we will need regmap backed clock mux which
|
||||||
|
+ * is a work in progress
|
||||||
|
+ */
|
||||||
|
+ snd_soc_component_update_bits(component, TOACODEC_CTRL0,
|
||||||
|
+ CTRL0_MCLK_SEL,
|
||||||
|
+ FIELD_PREP(CTRL0_MCLK_SEL, mux));
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static MESON_CODEC_GLUE_ENUM_DECL(g12a_toacodec_mux_glue,
|
||||||
|
+ g12a_toacodec_mux_texts,
|
||||||
|
+ g12a_toacodec_get_mux,
|
||||||
|
+ g12a_toacodec_put_mux);
|
||||||
|
+
|
||||||
|
+static const struct snd_kcontrol_new g12a_toacodec_mux =
|
||||||
|
+ SOC_DAPM_ENUM_EXT("Source", g12a_toacodec_mux_enum,
|
||||||
|
+ snd_soc_dapm_get_enum_double,
|
||||||
|
+ g12a_toacodec_mux_put_enum);
|
||||||
|
+
|
||||||
|
+static const struct snd_kcontrol_new g12a_toacodec_out_enable =
|
||||||
|
+ SOC_DAPM_SINGLE_AUTODISABLE("Switch", TOACODEC_CTRL0,
|
||||||
|
+ CTRL0_ENABLE_SHIFT, 1, 0);
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dapm_widget g12a_toacodec_widgets[] = {
|
||||||
|
+ SND_SOC_DAPM_MUX("SRC", SND_SOC_NOPM, 0, 0,
|
||||||
|
+ &g12a_toacodec_mux),
|
||||||
|
+ SND_SOC_DAPM_SWITCH("OUT EN", SND_SOC_NOPM, 0, 0,
|
||||||
|
+ &g12a_toacodec_out_enable),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int g12a_toacodec_input_hw_params(struct snd_pcm_substream *substream,
|
||||||
|
+ struct snd_pcm_hw_params *params,
|
||||||
|
+ struct snd_soc_dai *dai)
|
||||||
|
+{
|
||||||
|
+ struct meson_codec_glue_input *data;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = meson_codec_glue_input_hw_params(substream, params, dai);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ /* The glue will provide 1 lane out of the 4 to the output */
|
||||||
|
+ data = meson_codec_glue_input_get_data(dai);
|
||||||
|
+ data->params.channels_min = min_t(unsigned int, TOACODEC_OUT_CHMAX,
|
||||||
|
+ data->params.channels_min);
|
||||||
|
+ data->params.channels_max = min_t(unsigned int, TOACODEC_OUT_CHMAX,
|
||||||
|
+ data->params.channels_max);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dai_ops g12a_toacodec_input_ops = {
|
||||||
|
+ .hw_params = g12a_toacodec_input_hw_params,
|
||||||
|
+ .set_fmt = meson_codec_glue_input_set_fmt,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dai_ops g12a_toacodec_output_ops = {
|
||||||
|
+ .startup = meson_codec_glue_output_startup,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+#define TOACODEC_STREAM(xname, xsuffix, xchmax) \
|
||||||
|
+{ \
|
||||||
|
+ .stream_name = xname " " xsuffix, \
|
||||||
|
+ .channels_min = 1, \
|
||||||
|
+ .channels_max = (xchmax), \
|
||||||
|
+ .rate_min = 5512, \
|
||||||
|
+ .rate_max = 192000, \
|
||||||
|
+ .formats = AXG_TDM_FORMATS, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define TOACODEC_INPUT(xname, xid) { \
|
||||||
|
+ .name = xname, \
|
||||||
|
+ .id = (xid), \
|
||||||
|
+ .playback = TOACODEC_STREAM(xname, "Playback", 8), \
|
||||||
|
+ .ops = &g12a_toacodec_input_ops, \
|
||||||
|
+ .probe = meson_codec_glue_input_dai_probe, \
|
||||||
|
+ .remove = meson_codec_glue_input_dai_remove, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define TOACODEC_OUTPUT(xname, xid) { \
|
||||||
|
+ .name = xname, \
|
||||||
|
+ .id = (xid), \
|
||||||
|
+ .capture = TOACODEC_STREAM(xname, "Capture", TOACODEC_OUT_CHMAX), \
|
||||||
|
+ .ops = &g12a_toacodec_output_ops, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct snd_soc_dai_driver g12a_toacodec_dai_drv[] = {
|
||||||
|
+ TOACODEC_INPUT("I2S IN A", TOACODEC_IN_A),
|
||||||
|
+ TOACODEC_INPUT("I2S IN B", TOACODEC_IN_B),
|
||||||
|
+ TOACODEC_INPUT("I2S IN C", TOACODEC_IN_C),
|
||||||
|
+ TOACODEC_OUTPUT("I2S OUT", TOACODEC_OUT),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int g12a_toacodec_component_probe(struct snd_soc_component *c)
|
||||||
|
+{
|
||||||
|
+ /* Initialize the static clock parameters */
|
||||||
|
+ return snd_soc_component_write(c, TOACODEC_CTRL0,
|
||||||
|
+ CTRL0_BLK_CAP_INV);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_dapm_route g12a_toacodec_routes[] = {
|
||||||
|
+ { "I2S SRC", "I2S A", "I2S IN A Playback" },
|
||||||
|
+ { "I2S SRC", "I2S B", "I2S IN B Playback" },
|
||||||
|
+ { "I2S SRC", "I2S C", "I2S IN C Playback" },
|
||||||
|
+ { "I2S OUT EN", "Switch", "I2S SRC" },
|
||||||
|
+ { "I2S OUT Capture", NULL, "I2S OUT EN" },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_kcontrol_new g12a_toacodec_controls[] = {
|
||||||
|
+ SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL, 3, 0),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct snd_soc_component_driver g12a_toacodec_component_drv = {
|
||||||
|
+ .probe = g12a_toacodec_component_probe,
|
||||||
|
+ .controls = g12a_toacodec_controls,
|
||||||
|
+ .num_controls = ARRAY_SIZE(g12a_toacodec_controls),
|
||||||
|
+ .dapm_widgets = g12a_toacodec_widgets,
|
||||||
|
+ .num_dapm_widgets = ARRAY_SIZE(g12a_toacodec_widgets),
|
||||||
|
+ .dapm_routes = g12a_toacodec_routes,
|
||||||
|
+ .num_dapm_routes = ARRAY_SIZE(g12a_toacodec_routes),
|
||||||
|
+ .endianness = 1,
|
||||||
|
+ .non_legacy_dai_naming = 1,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct regmap_config g12a_toacodec_regmap_cfg = {
|
||||||
|
+ .reg_bits = 32,
|
||||||
|
+ .val_bits = 32,
|
||||||
|
+ .reg_stride = 4,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct of_device_id g12a_toacodec_of_match[] = {
|
||||||
|
+ { .compatible = "amlogic,g12a-toacodec", },
|
||||||
|
+ {}
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, g12a_toacodec_of_match);
|
||||||
|
+
|
||||||
|
+static int g12a_toacodec_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &pdev->dev;
|
||||||
|
+ void __iomem *regs;
|
||||||
|
+ struct regmap *map;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = device_reset(dev);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ regs = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(regs))
|
||||||
|
+ return PTR_ERR(regs);
|
||||||
|
+
|
||||||
|
+ map = devm_regmap_init_mmio(dev, regs, &g12a_toacodec_regmap_cfg);
|
||||||
|
+ if (IS_ERR(map)) {
|
||||||
|
+ dev_err(dev, "failed to init regmap: %ld\n",
|
||||||
|
+ PTR_ERR(map));
|
||||||
|
+ return PTR_ERR(map);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return devm_snd_soc_register_component(dev,
|
||||||
|
+ &g12a_toacodec_component_drv, g12a_toacodec_dai_drv,
|
||||||
|
+ ARRAY_SIZE(g12a_toacodec_dai_drv));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct platform_driver g12a_toacodec_pdrv = {
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = G12A_TOACODEC_DRV_NAME,
|
||||||
|
+ .of_match_table = g12a_toacodec_of_match,
|
||||||
|
+ },
|
||||||
|
+ .probe = g12a_toacodec_probe,
|
||||||
|
+};
|
||||||
|
+module_platform_driver(g12a_toacodec_pdrv);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
|
||||||
|
+MODULE_DESCRIPTION("Amlogic G12a To Internal DAC Codec Driver");
|
||||||
|
+MODULE_LICENSE("GPL v2");
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
From 6dde9f07187b5fe5c5e6b73ca575849c61603127 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Wed, 14 Aug 2019 17:27:12 +0200
|
||||||
|
Subject: [PATCH 044/101] FROMLIST: ASoC: meson: axg-card: add toacodec support
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
sound/soc/meson/axg-card.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/sound/soc/meson/axg-card.c b/sound/soc/meson/axg-card.c
|
||||||
|
index 372dc696cc8e..48651631bdcf 100644
|
||||||
|
--- a/sound/soc/meson/axg-card.c
|
||||||
|
+++ b/sound/soc/meson/axg-card.c
|
||||||
|
@@ -303,7 +303,8 @@ static int axg_card_cpu_is_tdm_iface(struct device_node *np)
|
||||||
|
|
||||||
|
static int axg_card_cpu_is_codec(struct device_node *np)
|
||||||
|
{
|
||||||
|
- return of_device_is_compatible(np, DT_PREFIX "g12a-tohdmitx");
|
||||||
|
+ return of_device_is_compatible(np, DT_PREFIX "g12a-tohdmitx") ||
|
||||||
|
+ of_device_is_compatible(np, DT_PREFIX "g12a-toacodec");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int axg_card_add_link(struct snd_soc_card *card, struct device_node *np,
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
From 8806ec73307d4e244ba1f1f66e41ee21305f0261 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Tue, 25 Feb 2020 06:40:40 +0000
|
||||||
|
Subject: [PATCH 045/101] FROMLIST: arm64: dts: meson: add pdm reset line
|
||||||
|
|
||||||
|
Add the reset line of the PDM device to g12 and sm1 SoCs.
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/amlogic/meson-g12.dtsi | 1 +
|
||||||
|
arch/arm64/boot/dts/amlogic/meson-sm1.dtsi | 1 +
|
||||||
|
2 files changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12.dtsi
|
||||||
|
index 03054c478896..55d39020ec72 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-g12.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-g12.dtsi
|
||||||
|
@@ -56,6 +56,7 @@
|
||||||
|
<&clkc_audio AUD_CLKID_PDM_DCLK>,
|
||||||
|
<&clkc_audio AUD_CLKID_PDM_SYSCLK>;
|
||||||
|
clock-names = "pclk", "dclk", "sysclk";
|
||||||
|
+ resets = <&clkc_audio AUD_RESET_PDM>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi b/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi
|
||||||
|
index d847a3fcbc85..d4ec735fb1a5 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi
|
||||||
|
@@ -448,6 +448,7 @@
|
||||||
|
<&clkc_audio AUD_CLKID_PDM_DCLK>,
|
||||||
|
<&clkc_audio AUD_CLKID_PDM_SYSCLK>;
|
||||||
|
clock-names = "pclk", "dclk", "sysclk";
|
||||||
|
+ resets = <&clkc_audio AUD_RESET_PDM>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
From 2db0e3b62c2e6dbe5880197f7b8cf58a5e0663c7 Mon Sep 17 00:00:00 2001
|
From a5d7742c52142711f1179bbfdb764387436757c7 Mon Sep 17 00:00:00 2001
|
||||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
Date: Wed, 14 Aug 2019 17:28:21 +0200
|
Date: Wed, 14 Aug 2019 17:28:21 +0200
|
||||||
Subject: [PATCH] WIP: arm64: dts: meson: g12a: add internal DAC
|
Subject: [PATCH 047/101] WIP: arm64: dts: meson: g12a: add internal DAC
|
||||||
|
|
||||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
---
|
---
|
||||||
|
@ -9,7 +9,7 @@ Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
1 file changed, 11 insertions(+)
|
1 file changed, 11 insertions(+)
|
||||||
|
|
||||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||||
index 87b9a47a51b92..b241512dd3b9d 100644
|
index abe04f4ad7d8..4625bdd08c07 100644
|
||||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
+++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||||
@@ -250,6 +250,17 @@
|
@@ -250,6 +250,17 @@
|
||||||
|
@ -30,3 +30,6 @@ index 87b9a47a51b92..b241512dd3b9d 100644
|
||||||
periphs: bus@34400 {
|
periphs: bus@34400 {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
reg = <0x0 0x34400 0x0 0x400>;
|
reg = <0x0 0x34400 0x0 0x400>;
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
From 99161be37c5e8eeca93b0d2d6f0f600e3eed15fd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Wed, 14 Aug 2019 17:28:36 +0200
|
||||||
|
Subject: [PATCH 048/101] WIP: arm64: dts: meson: g12a: add internal DAC glue
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/amlogic/meson-g12.dtsi | 9 +++++
|
||||||
|
sound/soc/meson/g12a-toacodec.c | 42 ++++++++++++++--------
|
||||||
|
2 files changed, 36 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12.dtsi
|
||||||
|
index 55d39020ec72..0d14409f509c 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-g12.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-g12.dtsi
|
||||||
|
@@ -343,6 +343,15 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ toacodec: audio-controller@740 {
|
||||||
|
+ compatible = "amlogic,g12a-toacodec";
|
||||||
|
+ reg = <0x0 0x740 0x0 0x4>;
|
||||||
|
+ #sound-dai-cells = <1>;
|
||||||
|
+ sound-name-prefix = "TOACODEC";
|
||||||
|
+ resets = <&clkc_audio AUD_RESET_TOACODEC>;
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
tohdmitx: audio-controller@744 {
|
||||||
|
compatible = "amlogic,g12a-tohdmitx";
|
||||||
|
reg = <0x0 0x744 0x0 0x4>;
|
||||||
|
diff --git a/sound/soc/meson/g12a-toacodec.c b/sound/soc/meson/g12a-toacodec.c
|
||||||
|
index 0ee074f6fc87..4e29528a8cb4 100644
|
||||||
|
--- a/sound/soc/meson/g12a-toacodec.c
|
||||||
|
+++ b/sound/soc/meson/g12a-toacodec.c
|
||||||
|
@@ -21,7 +21,8 @@
|
||||||
|
|
||||||
|
#define TOACODEC_CTRL0 0x0
|
||||||
|
#define CTRL0_ENABLE_SHIFT 31
|
||||||
|
-#define CTRL0_DAT_SEL GENMASK(15, 14)
|
||||||
|
+#define CTRL0_DAT_SEL_SHIFT 14
|
||||||
|
+#define CTRL0_DAT_SEL (0x3 << CTRL0_DAT_SEL_SHIFT)
|
||||||
|
#define CTRL0_LANE_SEL 12
|
||||||
|
#define CTRL0_LRCLK_SEL GENMASK(9, 8)
|
||||||
|
#define CTRL0_BLK_CAP_INV BIT(7)
|
||||||
|
@@ -35,18 +36,28 @@ static const char * const g12a_toacodec_mux_texts[] = {
|
||||||
|
"I2S A", "I2S B", "I2S C",
|
||||||
|
};
|
||||||
|
|
||||||
|
-static int g12a_toacodec_get_mux(struct snd_soc_component *component)
|
||||||
|
+static int g12a_toacodec_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||||
|
+ struct snd_ctl_elem_value *ucontrol)
|
||||||
|
{
|
||||||
|
- unsigned int val;
|
||||||
|
+ struct snd_soc_component *component =
|
||||||
|
+ snd_soc_dapm_kcontrol_component(kcontrol);
|
||||||
|
+ struct snd_soc_dapm_context *dapm =
|
||||||
|
+ snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||||
|
+ struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||||
|
+ unsigned int mux, changed;
|
||||||
|
|
||||||
|
- snd_soc_component_read(component, TOACODEC_CTRL0, &val);
|
||||||
|
- return FIELD_GET(CTRL0_DAT_SEL, val);
|
||||||
|
-}
|
||||||
|
+ mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||||
|
+ changed = snd_soc_component_test_bits(component, e->reg,
|
||||||
|
+ CTRL0_DAT_SEL,
|
||||||
|
+ FIELD_PREP(CTRL0_DAT_SEL, mux));
|
||||||
|
|
||||||
|
-static int g12a_toacodec_put_mux(struct snd_soc_component *component,
|
||||||
|
- unsigned int mux)
|
||||||
|
-{
|
||||||
|
- snd_soc_component_update_bits(component, TOACODEC_CTRL0,
|
||||||
|
+ if (!changed)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ /* Force disconnect of the mux while updating */
|
||||||
|
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||||
|
+
|
||||||
|
+ snd_soc_component_update_bits(component, e->reg,
|
||||||
|
CTRL0_DAT_SEL |
|
||||||
|
CTRL0_LRCLK_SEL |
|
||||||
|
CTRL0_BCLK_SEL,
|
||||||
|
@@ -65,17 +76,18 @@ static int g12a_toacodec_put_mux(struct snd_soc_component *component,
|
||||||
|
* source. For that, we will need regmap backed clock mux which
|
||||||
|
* is a work in progress
|
||||||
|
*/
|
||||||
|
- snd_soc_component_update_bits(component, TOACODEC_CTRL0,
|
||||||
|
+ snd_soc_component_update_bits(component, e->reg,
|
||||||
|
CTRL0_MCLK_SEL,
|
||||||
|
FIELD_PREP(CTRL0_MCLK_SEL, mux));
|
||||||
|
|
||||||
|
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static MESON_CODEC_GLUE_ENUM_DECL(g12a_toacodec_mux_glue,
|
||||||
|
- g12a_toacodec_mux_texts,
|
||||||
|
- g12a_toacodec_get_mux,
|
||||||
|
- g12a_toacodec_put_mux);
|
||||||
|
+static SOC_ENUM_SINGLE_DECL(g12a_toacodec_mux_enum, TOACODEC_CTRL0,
|
||||||
|
+ CTRL0_DAT_SEL_SHIFT,
|
||||||
|
+ g12a_toacodec_mux_texts);
|
||||||
|
|
||||||
|
static const struct snd_kcontrol_new g12a_toacodec_mux =
|
||||||
|
SOC_DAPM_ENUM_EXT("Source", g12a_toacodec_mux_enum,
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
From 884f16bf7d65d4666b0ee2b381a6adc810b0584d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Tue, 22 Oct 2019 18:15:43 +0200
|
||||||
|
Subject: [PATCH 049/101] WIP: arm64: dts: meson-gx: add playback audio devices
|
||||||
|
|
||||||
|
FIXME: Missing gxbb ATM
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 13 +++++++++
|
||||||
|
arch/arm64/boot/dts/amlogic/meson-gxl.dtsi | 34 ++++++++++++++++++++++
|
||||||
|
2 files changed, 47 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||||
|
index 40db06e28b66..962a56e0e8b4 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||||
|
@@ -226,6 +226,17 @@
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ aiu: audio-controller@5400 {
|
||||||
|
+ compatible = "amlogic,aiu";
|
||||||
|
+ #sound-dai-cells = <2>;
|
||||||
|
+ sound-name-prefix = "AIU";
|
||||||
|
+ reg = <0x0 0x5400 0x0 0x2ac>;
|
||||||
|
+ interrupts = <GIC_SPI 48 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
+ <GIC_SPI 50 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
+ interrupt-names = "i2s", "spdif";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
uart_A: serial@84c0 {
|
||||||
|
compatible = "amlogic,meson-gx-uart";
|
||||||
|
reg = <0x0 0x84c0 0x0 0x18>;
|
||||||
|
@@ -574,6 +585,8 @@
|
||||||
|
interrupts = <GIC_SPI 57 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
+ #sound-dai-cells = <0>;
|
||||||
|
+ sound-name-prefix = "HDMITX";
|
||||||
|
status = "disabled";
|
||||||
|
|
||||||
|
/* VPU VENC Input */
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
|
||||||
|
index 259d86399390..ec50e93470f9 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
|
||||||
|
@@ -14,6 +14,17 @@
|
||||||
|
compatible = "amlogic,meson-gxl";
|
||||||
|
|
||||||
|
soc {
|
||||||
|
+ acodec: audio-controller@c8832000 {
|
||||||
|
+ compatible = "amlogic,t9015";
|
||||||
|
+ reg = <0x0 0xc8832000 0x0 0x14>;
|
||||||
|
+ #sound-dai-cells = <0>;
|
||||||
|
+ sound-name-prefix = "ACODEC";
|
||||||
|
+ clocks = <&clkc CLKID_ACODEC>;
|
||||||
|
+ clock-names = "pclk";
|
||||||
|
+ resets = <&reset RESET_ACODEC>;
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
usb0: usb@c9000000 {
|
||||||
|
status = "disabled";
|
||||||
|
compatible = "amlogic,meson-gxl-dwc3";
|
||||||
|
@@ -49,6 +60,29 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+&aiu {
|
||||||
|
+ compatible = "amlogic,aiu-gxl", "amlogic,aiu";
|
||||||
|
+ clocks = <&clkc CLKID_AIU_GLUE>,
|
||||||
|
+ <&clkc CLKID_I2S_OUT>,
|
||||||
|
+ <&clkc CLKID_AOCLK_GATE>,
|
||||||
|
+ <&clkc CLKID_CTS_AMCLK>,
|
||||||
|
+ <&clkc CLKID_MIXER_IFACE>,
|
||||||
|
+ <&clkc CLKID_IEC958>,
|
||||||
|
+ <&clkc CLKID_IEC958_GATE>,
|
||||||
|
+ <&clkc CLKID_CTS_MCLK_I958>,
|
||||||
|
+ <&clkc CLKID_CTS_I958>;
|
||||||
|
+ clock-names = "pclk",
|
||||||
|
+ "i2s_pclk",
|
||||||
|
+ "i2s_aoclk",
|
||||||
|
+ "i2s_mclk",
|
||||||
|
+ "i2s_mixer",
|
||||||
|
+ "spdif_pclk",
|
||||||
|
+ "spdif_aoclk",
|
||||||
|
+ "spdif_mclk",
|
||||||
|
+ "spdif_mclk_sel";
|
||||||
|
+ resets = <&reset RESET_AIU>;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
&apb {
|
||||||
|
usb2_phy0: phy@78000 {
|
||||||
|
compatible = "amlogic,meson-gxl-usb2-phy";
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,133 @@
|
||||||
|
From 35237879c2fc46ab5b90dc0ea8e5af656b846f6d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
Date: Tue, 22 Oct 2019 18:18:32 +0200
|
||||||
|
Subject: [PATCH 050/101] WIP: arm64: dts: meson: enable audio playback on
|
||||||
|
p230/q200
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||||
|
---
|
||||||
|
.../boot/dts/amlogic/meson-gx-p23x-q20x.dtsi | 95 +++++++++++++++++++
|
||||||
|
1 file changed, 95 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi
|
||||||
|
index 12d5e333e5f2..f294430d6b19 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi
|
||||||
|
@@ -8,12 +8,28 @@
|
||||||
|
* the pin-compatible S912 (GXM) or S905D (GXL) SoCs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#include <dt-bindings/sound/meson-aiu.h>
|
||||||
|
+
|
||||||
|
/ {
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart_AO;
|
||||||
|
ethernet0 = ðmac;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ dio2133: analog-amplifier {
|
||||||
|
+ compatible = "simple-audio-amplifier";
|
||||||
|
+ sound-name-prefix = "AU2";
|
||||||
|
+ VCC-supply = <&hdmi_5v>;
|
||||||
|
+ enable-gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ spdif_dit: audio-codec-0 {
|
||||||
|
+ #sound-dai-cells = <0>;
|
||||||
|
+ compatible = "linux,spdif-dit";
|
||||||
|
+ status = "okay";
|
||||||
|
+ sound-name-prefix = "DIT";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
chosen {
|
||||||
|
stdout-path = "serial0:115200n8";
|
||||||
|
};
|
||||||
|
@@ -102,6 +118,85 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ sound {
|
||||||
|
+ compatible = "amlogic,gx-sound-card";
|
||||||
|
+ model = "GX-P230-Q200";
|
||||||
|
+ audio-aux-devs = <&dio2133>;
|
||||||
|
+ audio-widgets = "Line", "Lineout";
|
||||||
|
+ audio-routing = "AU2 INL", "ACODEC LOLP",
|
||||||
|
+ "AU2 INR", "ACODEC LORP",
|
||||||
|
+ "AU2 INL", "ACODEC LOLN",
|
||||||
|
+ "AU2 INR", "ACODEC LORN",
|
||||||
|
+ "Lineout", "AU2 OUTL",
|
||||||
|
+ "Lineout", "AU2 OUTR";
|
||||||
|
+ assigned-clocks = <&clkc CLKID_MPLL2>,
|
||||||
|
+ <&clkc CLKID_MPLL0>,
|
||||||
|
+ <&clkc CLKID_MPLL1>;
|
||||||
|
+ assigned-clock-parents = <0>, <0>, <0>;
|
||||||
|
+ assigned-clock-rates = <294912000>,
|
||||||
|
+ <270950400>,
|
||||||
|
+ <393216000>;
|
||||||
|
+ status = "okay";
|
||||||
|
+
|
||||||
|
+ dai-link-0 {
|
||||||
|
+ sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-1 {
|
||||||
|
+ sound-dai = <&aiu AIU_CPU CPU_SPDIF_FIFO>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-2 {
|
||||||
|
+ sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>;
|
||||||
|
+ dai-format = "i2s";
|
||||||
|
+ mclk-fs = <256>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&aiu AIU_HDMI CTRL_I2S>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ codec-1 {
|
||||||
|
+ sound-dai = <&aiu AIU_ACODEC CTRL_I2S>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-3 {
|
||||||
|
+ sound-dai = <&aiu AIU_CPU CPU_SPDIF_ENCODER>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&spdif_dit>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-4 {
|
||||||
|
+ sound-dai = <&aiu AIU_HDMI CTRL_OUT>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&hdmi_tx>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-5 {
|
||||||
|
+ sound-dai = <&aiu AIU_ACODEC CTRL_OUT>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&acodec>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&acodec {
|
||||||
|
+ AVDD-supply = <&vddio_ao18>;
|
||||||
|
+ status = "okay";
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&aiu {
|
||||||
|
+ status = "okay";
|
||||||
|
+ pinctrl-0 = <&spdif_out_h_pins>;
|
||||||
|
+ pinctrl-names = "default";
|
||||||
|
+
|
||||||
|
};
|
||||||
|
|
||||||
|
&cec_AO {
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
From 86a08466dd986507bbd4d609d2d81d9bfc300999 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
Date: Tue, 18 Feb 2020 03:54:58 +0000
|
||||||
|
Subject: [PATCH 051/101] WIP: arm64: dts: meson: add audio playback to
|
||||||
|
s905x-p212 dtsi
|
||||||
|
|
||||||
|
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
---
|
||||||
|
.../dts/amlogic/meson-gxl-s905x-p212.dtsi | 70 +++++++++++++++++++
|
||||||
|
1 file changed, 70 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi
|
||||||
|
index 43eb7d149e36..ba74f54c5b3f 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi
|
||||||
|
@@ -11,6 +11,7 @@
|
||||||
|
/* Common DTSI for devices which are based on the P212 reference board. */
|
||||||
|
|
||||||
|
#include "meson-gxl-s905x.dtsi"
|
||||||
|
+#include <dt-bindings/sound/meson-aiu.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
aliases {
|
||||||
|
@@ -23,6 +24,13 @@
|
||||||
|
stdout-path = "serial0:115200n8";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ dio2133: analog-amplifier {
|
||||||
|
+ compatible = "simple-audio-amplifier";
|
||||||
|
+ sound-name-prefix = "AU2";
|
||||||
|
+ VCC-supply = <&hdmi_5v>;
|
||||||
|
+ enable-gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
memory@0 {
|
||||||
|
device_type = "memory";
|
||||||
|
reg = <0x0 0x0 0x0 0x80000000>;
|
||||||
|
@@ -86,6 +94,68 @@
|
||||||
|
clocks = <&wifi32k>;
|
||||||
|
clock-names = "ext_clock";
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ sound {
|
||||||
|
+ compatible = "amlogic,gx-sound-card";
|
||||||
|
+ model = "GXL-S905X-P212";
|
||||||
|
+ audio-aux-devs = <&dio2133>;
|
||||||
|
+ audio-widgets = "Line", "Lineout";
|
||||||
|
+ audio-routing = "AU2 INL", "ACODEC LOLN",
|
||||||
|
+ "AU2 INR", "ACODEC LORN",
|
||||||
|
+ "Lineout", "AU2 OUTL",
|
||||||
|
+ "Lineout", "AU2 OUTR";
|
||||||
|
+ assigned-clocks = <&clkc CLKID_MPLL2>,
|
||||||
|
+ <&clkc CLKID_MPLL0>,
|
||||||
|
+ <&clkc CLKID_MPLL1>;
|
||||||
|
+ assigned-clock-parents = <0>, <0>, <0>;
|
||||||
|
+ assigned-clock-rates = <294912000>,
|
||||||
|
+ <270950400>,
|
||||||
|
+ <393216000>;
|
||||||
|
+ status = "okay";
|
||||||
|
+
|
||||||
|
+ dai-link-0 {
|
||||||
|
+ sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-1 {
|
||||||
|
+ sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>;
|
||||||
|
+ dai-format = "i2s";
|
||||||
|
+ mclk-fs = <512>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&aiu AIU_HDMI CTRL_I2S>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ codec-1 {
|
||||||
|
+ sound-dai = <&aiu AIU_ACODEC CTRL_I2S>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-2 {
|
||||||
|
+ sound-dai = <&aiu AIU_HDMI CTRL_OUT>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&hdmi_tx>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-3 {
|
||||||
|
+ sound-dai = <&aiu AIU_ACODEC CTRL_OUT>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&acodec>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&acodec {
|
||||||
|
+ AVDD-supply = <&vddio_ao18>;
|
||||||
|
+ status = "okay";
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&aiu {
|
||||||
|
+ status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
ðmac {
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
From 3209810b2baa64c431a115116d7cde1f440efd2e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
Date: Wed, 19 Feb 2020 04:27:30 +0000
|
||||||
|
Subject: [PATCH 052/101] WIP: arm64: dts: meson: add audio playback to khadas
|
||||||
|
vim2
|
||||||
|
|
||||||
|
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
---
|
||||||
|
.../dts/amlogic/meson-gxm-khadas-vim2.dts | 70 +++++++++++++++++++
|
||||||
|
1 file changed, 70 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||||
|
index d5dc12878dfe..dfa2abc55918 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||||
|
@@ -8,6 +8,7 @@
|
||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
#include <dt-bindings/input/input.h>
|
||||||
|
+#include <dt-bindings/sound/meson-aiu.h>
|
||||||
|
#include <dt-bindings/thermal/thermal.h>
|
||||||
|
|
||||||
|
#include "meson-gxm.dtsi"
|
||||||
|
@@ -25,6 +26,13 @@
|
||||||
|
stdout-path = "serial0:115200n8";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ dio2133: analog-amplifier {
|
||||||
|
+ compatible = "simple-audio-amplifier";
|
||||||
|
+ sound-name-prefix = "AU2";
|
||||||
|
+ VCC-supply = <&hdmi_5v>;
|
||||||
|
+ enable-gpios = <&gpio GPIOH_5 GPIO_ACTIVE_HIGH>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
memory@0 {
|
||||||
|
device_type = "memory";
|
||||||
|
reg = <0x0 0x0 0x0 0x80000000>;
|
||||||
|
@@ -189,6 +197,68 @@
|
||||||
|
clock-frequency = <32768>;
|
||||||
|
pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ sound {
|
||||||
|
+ compatible = "amlogic,gx-sound-card";
|
||||||
|
+ model = "GXM-KHADAS-VIM2";
|
||||||
|
+ audio-aux-devs = <&dio2133>;
|
||||||
|
+ audio-widgets = "Line", "Lineout";
|
||||||
|
+ audio-routing = "AU2 INL", "ACODEC LOLN",
|
||||||
|
+ "AU2 INR", "ACODEC LORN",
|
||||||
|
+ "Lineout", "AU2 OUTL",
|
||||||
|
+ "Lineout", "AU2 OUTR";
|
||||||
|
+ assigned-clocks = <&clkc CLKID_MPLL2>,
|
||||||
|
+ <&clkc CLKID_MPLL0>,
|
||||||
|
+ <&clkc CLKID_MPLL1>;
|
||||||
|
+ assigned-clock-parents = <0>, <0>, <0>;
|
||||||
|
+ assigned-clock-rates = <294912000>,
|
||||||
|
+ <270950400>,
|
||||||
|
+ <393216000>;
|
||||||
|
+ status = "okay";
|
||||||
|
+
|
||||||
|
+ dai-link-0 {
|
||||||
|
+ sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-1 {
|
||||||
|
+ sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>;
|
||||||
|
+ dai-format = "i2s";
|
||||||
|
+ mclk-fs = <512>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&aiu AIU_HDMI CTRL_I2S>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ codec-1 {
|
||||||
|
+ sound-dai = <&aiu AIU_ACODEC CTRL_I2S>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-2 {
|
||||||
|
+ sound-dai = <&aiu AIU_HDMI CTRL_OUT>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&hdmi_tx>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ dai-link-3 {
|
||||||
|
+ sound-dai = <&aiu AIU_ACODEC CTRL_OUT>;
|
||||||
|
+
|
||||||
|
+ codec-0 {
|
||||||
|
+ sound-dai = <&acodec>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&acodec {
|
||||||
|
+ AVDD-supply = <&vddio_ao18>;
|
||||||
|
+ status = "okay";
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&aiu {
|
||||||
|
+ status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&cec_AO {
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
From f31c2092f357f1c7ec4931418dc6dfa849c45b81 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
Date: Tue, 18 Feb 2020 12:23:31 +0000
|
||||||
|
Subject: [PATCH 053/101] WIP: arm64: dts: meson-gxbb: add playback audio
|
||||||
|
devices
|
||||||
|
|
||||||
|
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 23 +++++++++++++++++++++
|
||||||
|
1 file changed, 23 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
|
||||||
|
index 0cb40326b0d3..ccaa1a8e28c5 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
|
||||||
|
@@ -241,6 +241,29 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+&aiu {
|
||||||
|
+ compatible = "amlogic,aiu-gxbb", "amlogic,aiu";
|
||||||
|
+ clocks = <&clkc CLKID_AIU_GLUE>,
|
||||||
|
+ <&clkc CLKID_I2S_OUT>,
|
||||||
|
+ <&clkc CLKID_AOCLK_GATE>,
|
||||||
|
+ <&clkc CLKID_CTS_AMCLK>,
|
||||||
|
+ <&clkc CLKID_MIXER_IFACE>,
|
||||||
|
+ <&clkc CLKID_IEC958>,
|
||||||
|
+ <&clkc CLKID_IEC958_GATE>,
|
||||||
|
+ <&clkc CLKID_CTS_MCLK_I958>,
|
||||||
|
+ <&clkc CLKID_CTS_I958>;
|
||||||
|
+ clock-names = "pclk",
|
||||||
|
+ "i2s_pclk",
|
||||||
|
+ "i2s_aoclk",
|
||||||
|
+ "i2s_mclk",
|
||||||
|
+ "i2s_mixer",
|
||||||
|
+ "spdif_pclk",
|
||||||
|
+ "spdif_aoclk",
|
||||||
|
+ "spdif_mclk",
|
||||||
|
+ "spdif_mclk_sel";
|
||||||
|
+ resets = <&reset RESET_AIU>;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
&apb {
|
||||||
|
mali: gpu@c0000 {
|
||||||
|
compatible = "amlogic,meson-gxbb-mali", "arm,mali-450";
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
From a81be34416a320dbf7ccf359f2b082653e43c436 Mon Sep 17 00:00:00 2001
|
||||||
|
From: chewitt <github@chrishewitt.net>
|
||||||
|
Date: Sat, 13 Apr 2019 05:45:18 +0000
|
||||||
|
Subject: [PATCH 054/101] HACK: fix Kodi sysinfo CPU information
|
||||||
|
|
||||||
|
This allows the CPU information to show in the Kodi sysinfo screen, e.g.
|
||||||
|
|
||||||
|
"ARMv8 Processor rev 4 (v81)" on S905* devices
|
||||||
|
|
||||||
|
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/kernel/cpuinfo.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c
|
||||||
|
index 86136075ae41..f321dc2d8129 100644
|
||||||
|
--- a/arch/arm64/kernel/cpuinfo.c
|
||||||
|
+++ b/arch/arm64/kernel/cpuinfo.c
|
||||||
|
@@ -147,8 +147,7 @@ static int c_show(struct seq_file *m, void *v)
|
||||||
|
* "processor". Give glibc what it expects.
|
||||||
|
*/
|
||||||
|
seq_printf(m, "processor\t: %d\n", i);
|
||||||
|
- if (compat)
|
||||||
|
- seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n",
|
||||||
|
+ seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n",
|
||||||
|
MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);
|
||||||
|
|
||||||
|
seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
From 03bfb3f6a703d7671508b698c5a552d0a0e0197b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
Date: Tue, 7 Jan 2020 07:12:47 +0000
|
||||||
|
Subject: [PATCH 055/101] HACK: media: cec: silence CEC timeout message
|
||||||
|
|
||||||
|
If testing with an AVR that does not pass-through CEC state the system
|
||||||
|
log fills with timeout messages. Silence this to stop the log rotation
|
||||||
|
and ensure other issues are visible.
|
||||||
|
|
||||||
|
[ 42.718009] cec-meson_ao_cec: message ff 84 50 00 01 timed out
|
||||||
|
[ 45.021994] cec-meson_ao_cec: message ff 87 00 15 82 timed out
|
||||||
|
[ 47.325965] cec-meson_ao_cec: message 10 timed out
|
||||||
|
[ 49.630023] cec-meson_ao_cec: message 10 timed out
|
||||||
|
[ 51.933960] cec-meson_ao_cec: message 10 timed out
|
||||||
|
|
||||||
|
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/media/cec/cec-adap.c | 6 +++---
|
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c
|
||||||
|
index 6c95dc471d4c..8613cc93eb93 100644
|
||||||
|
--- a/drivers/media/cec/cec-adap.c
|
||||||
|
+++ b/drivers/media/cec/cec-adap.c
|
||||||
|
@@ -510,9 +510,9 @@ int cec_thread_func(void *_adap)
|
||||||
|
* unable to transmit for CEC_XFER_TIMEOUT_MS (2.1s).
|
||||||
|
*/
|
||||||
|
if (adap->transmitting) {
|
||||||
|
- pr_warn("cec-%s: message %*ph timed out\n", adap->name,
|
||||||
|
- adap->transmitting->msg.len,
|
||||||
|
- adap->transmitting->msg.msg);
|
||||||
|
+ //pr_warn("cec-%s: message %*ph timed out\n", adap->name,
|
||||||
|
+ // adap->transmitting->msg.len,
|
||||||
|
+ // adap->transmitting->msg.msg);
|
||||||
|
/* Just give up on this. */
|
||||||
|
cec_data_cancel(adap->transmitting,
|
||||||
|
CEC_TX_STATUS_TIMEOUT);
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
From 4430c1295e48c617757c1293b1b3457928162ab9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: chewitt <christianshewitt@gmail.com>
|
||||||
|
Date: Thu, 12 Dec 2019 13:48:45 +0000
|
||||||
|
Subject: [PATCH 056/101] HACK: revert mm: emit tracepoint when RSS changes
|
||||||
|
|
||||||
|
---
|
||||||
|
include/linux/mm.h | 14 +++-----------
|
||||||
|
include/trace/events/kmem.h | 28 ----------------------------
|
||||||
|
mm/memory.c | 6 ------
|
||||||
|
3 files changed, 3 insertions(+), 45 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/linux/mm.h b/include/linux/mm.h
|
||||||
|
index c54fb96cb1e6..db55e0dea9a5 100644
|
||||||
|
--- a/include/linux/mm.h
|
||||||
|
+++ b/include/linux/mm.h
|
||||||
|
@@ -1629,27 +1629,19 @@ static inline unsigned long get_mm_counter(struct mm_struct *mm, int member)
|
||||||
|
return (unsigned long)val;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void mm_trace_rss_stat(struct mm_struct *mm, int member, long count);
|
||||||
|
-
|
||||||
|
static inline void add_mm_counter(struct mm_struct *mm, int member, long value)
|
||||||
|
{
|
||||||
|
- long count = atomic_long_add_return(value, &mm->rss_stat.count[member]);
|
||||||
|
-
|
||||||
|
- mm_trace_rss_stat(mm, member, count);
|
||||||
|
+ atomic_long_add(value, &mm->rss_stat.count[member]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void inc_mm_counter(struct mm_struct *mm, int member)
|
||||||
|
{
|
||||||
|
- long count = atomic_long_inc_return(&mm->rss_stat.count[member]);
|
||||||
|
-
|
||||||
|
- mm_trace_rss_stat(mm, member, count);
|
||||||
|
+ atomic_long_inc(&mm->rss_stat.count[member]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void dec_mm_counter(struct mm_struct *mm, int member)
|
||||||
|
{
|
||||||
|
- long count = atomic_long_dec_return(&mm->rss_stat.count[member]);
|
||||||
|
-
|
||||||
|
- mm_trace_rss_stat(mm, member, count);
|
||||||
|
+ atomic_long_dec(&mm->rss_stat.count[member]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Optimized variant when page is already known not to be PageAnon */
|
||||||
|
diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h
|
||||||
|
index f65b1f6db22d..788e049f899c 100644
|
||||||
|
--- a/include/trace/events/kmem.h
|
||||||
|
+++ b/include/trace/events/kmem.h
|
||||||
|
@@ -335,34 +335,6 @@ static unsigned int __maybe_unused mm_ptr_to_hash(const void *ptr)
|
||||||
|
#define __PTR_TO_HASHVAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-TRACE_EVENT(rss_stat,
|
||||||
|
-
|
||||||
|
- TP_PROTO(struct mm_struct *mm,
|
||||||
|
- int member,
|
||||||
|
- long count),
|
||||||
|
-
|
||||||
|
- TP_ARGS(mm, member, count),
|
||||||
|
-
|
||||||
|
- TP_STRUCT__entry(
|
||||||
|
- __field(unsigned int, mm_id)
|
||||||
|
- __field(unsigned int, curr)
|
||||||
|
- __field(int, member)
|
||||||
|
- __field(long, size)
|
||||||
|
- ),
|
||||||
|
-
|
||||||
|
- TP_fast_assign(
|
||||||
|
- __entry->mm_id = mm_ptr_to_hash(mm);
|
||||||
|
- __entry->curr = !!(current->mm == mm);
|
||||||
|
- __entry->member = member;
|
||||||
|
- __entry->size = (count << PAGE_SHIFT);
|
||||||
|
- ),
|
||||||
|
-
|
||||||
|
- TP_printk("mm_id=%u curr=%d member=%d size=%ldB",
|
||||||
|
- __entry->mm_id,
|
||||||
|
- __entry->curr,
|
||||||
|
- __entry->member,
|
||||||
|
- __entry->size)
|
||||||
|
- );
|
||||||
|
#endif /* _TRACE_KMEM_H */
|
||||||
|
|
||||||
|
/* This part must be outside protection */
|
||||||
|
diff --git a/mm/memory.c b/mm/memory.c
|
||||||
|
index e8bfdf0d9d1d..889bfbb49e19 100644
|
||||||
|
--- a/mm/memory.c
|
||||||
|
+++ b/mm/memory.c
|
||||||
|
@@ -72,8 +72,6 @@
|
||||||
|
#include <linux/oom.h>
|
||||||
|
#include <linux/numa.h>
|
||||||
|
|
||||||
|
-#include <trace/events/kmem.h>
|
||||||
|
-
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/mmu_context.h>
|
||||||
|
#include <asm/pgalloc.h>
|
||||||
|
@@ -154,10 +152,6 @@ static int __init init_zero_pfn(void)
|
||||||
|
}
|
||||||
|
core_initcall(init_zero_pfn);
|
||||||
|
|
||||||
|
-void mm_trace_rss_stat(struct mm_struct *mm, int member, long count)
|
||||||
|
-{
|
||||||
|
- trace_rss_stat(mm, member, count);
|
||||||
|
-}
|
||||||
|
|
||||||
|
#if defined(SPLIT_RSS_COUNTING)
|
||||||
|
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
From a5f6913dd6b3e22a30cc79a22d7e6e3365bd17bb Mon Sep 17 00:00:00 2001
|
||||||
|
From: chewitt <christianshewitt@gmail.com>
|
||||||
|
Date: Tue, 24 Dec 2019 05:50:45 +0000
|
||||||
|
Subject: [PATCH 057/101] HACK: mmc: meson-gx: force max_segs/max_blk_count
|
||||||
|
values in dram access quirk
|
||||||
|
|
||||||
|
Temporary workaround for the G12A and G12B SDIO chip bug that causes sdio
|
||||||
|
issues with brcmfmac. Patch is based on [1] by @hyphop (Khadas) and hints
|
||||||
|
from @superna9999.
|
||||||
|
|
||||||
|
[1] https://github.com/hyphop/khadas-linux-kernel/blob/master/patches/linux-5.4.5/0005-VIM3_wifi_hack.patch
|
||||||
|
|
||||||
|
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/mmc/host/meson-gx-mmc.c | 6 ++++--
|
||||||
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
|
||||||
|
index 35400cf2a2e4..a49f63791b0e 100644
|
||||||
|
--- a/drivers/mmc/host/meson-gx-mmc.c
|
||||||
|
+++ b/drivers/mmc/host/meson-gx-mmc.c
|
||||||
|
@@ -1144,8 +1144,10 @@ static int meson_mmc_probe(struct platform_device *pdev)
|
||||||
|
mmc->caps |= MMC_CAP_CMD23;
|
||||||
|
if (host->dram_access_quirk) {
|
||||||
|
/* Limit to the available sram memory */
|
||||||
|
- mmc->max_segs = SD_EMMC_SRAM_DATA_BUF_LEN / mmc->max_blk_size;
|
||||||
|
- mmc->max_blk_count = mmc->max_segs;
|
||||||
|
+ //mmc->max_segs = SD_EMMC_SRAM_DATA_BUF_LEN / mmc->max_blk_size;
|
||||||
|
+ //mmc->max_blk_count = mmc->max_segs;
|
||||||
|
+ mmc->max_segs = 1;
|
||||||
|
+ mmc->max_blk_count = 2;
|
||||||
|
} else {
|
||||||
|
mmc->max_blk_count = CMD_CFG_LENGTH_MASK;
|
||||||
|
mmc->max_segs = SD_EMMC_DESC_BUF_LEN /
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
From 0a8fc3cde0e3435d8253544ada3dcb80ea1821fa Mon Sep 17 00:00:00 2001
|
||||||
|
From: kszaq <kszaquitto@gmail.com>
|
||||||
|
Date: Sat, 6 Jul 2019 07:54:44 +0000
|
||||||
|
Subject: [PATCH 058/101] HACK: arm64: dts: meson-gx: add ATF BL32 reserved
|
||||||
|
memory region
|
||||||
|
|
||||||
|
Vendor firmware/uboot has an additional reserved region for BL32 trusted
|
||||||
|
firmware. If a board uses BL32 firmware, booting kernel without knowledge
|
||||||
|
of this region would cause an immediate kernel panic on SError Interrupt.
|
||||||
|
|
||||||
|
TODO: This should be enabled only for boards actually requiring it.
|
||||||
|
|
||||||
|
Signed-off-by: kszaq <kszaquitto@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||||
|
index 962a56e0e8b4..3f55ef2ae021 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||||
|
@@ -41,6 +41,12 @@
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ /* 32 MiB reserved for ARM Trusted Firmware (BL32) */
|
||||||
|
+ secmon_reserved_bl32: secmon@5300000 {
|
||||||
|
+ reg = <0x0 0x05300000 0x0 0x2000000>;
|
||||||
|
+ no-map;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
linux,cma {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reusable;
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
From 11323b220e5ac629618f1d5d156a1e10d709ff0a Mon Sep 17 00:00:00 2001
|
||||||
|
From: chewitt <github@chrishewitt.net>
|
||||||
|
Date: Sat, 13 Apr 2019 05:41:51 +0000
|
||||||
|
Subject: [PATCH 059/101] HACK: set meson-gx cma pool to 896MB
|
||||||
|
|
||||||
|
This change sets the CMA pool to a larger 896MB! value for (WIP) vdec use
|
||||||
|
|
||||||
|
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||||
|
index 3f55ef2ae021..807db6e73a49 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||||
|
@@ -50,7 +50,7 @@
|
||||||
|
linux,cma {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reusable;
|
||||||
|
- size = <0x0 0x10000000>;
|
||||||
|
+ size = <0x0 0x38000000>;
|
||||||
|
alignment = <0x0 0x400000>;
|
||||||
|
linux,cma-default;
|
||||||
|
};
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
From 0190b87a051b588bd2a7845a858e455bc9ff1af5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: chewitt <github@chrishewitt.net>
|
||||||
|
Date: Wed, 14 Aug 2019 19:58:14 +0000
|
||||||
|
Subject: [PATCH 060/101] HACK: set meson-g12 cma pool to 896MB
|
||||||
|
|
||||||
|
This change sets the CMA pool to a larger 896MB! value for (WIP) vdec use
|
||||||
|
|
||||||
|
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||||
|
index 4625bdd08c07..3deace05d345 100644
|
||||||
|
--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||||
|
@@ -71,7 +71,7 @@
|
||||||
|
linux,cma {
|
||||||
|
compatible = "shared-dma-pool";
|
||||||
|
reusable;
|
||||||
|
- size = <0x0 0x10000000>;
|
||||||
|
+ size = <0x0 0x38000000>;
|
||||||
|
alignment = <0x0 0x400000>;
|
||||||
|
linux,cma-default;
|
||||||
|
};
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
From c29896e00637c84a719c51dee7ee3837ad4e9908 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Igor Vavro <afl2001@gmail.com>
|
||||||
|
Date: Sat, 10 Aug 2019 13:55:34 +0000
|
||||||
|
Subject: [PATCH 061/101] FROMLIST: pinctrl: meson: add missing tsin pinctrl
|
||||||
|
for meson gxbb/gxl
|
||||||
|
|
||||||
|
This patch adds missing tsin pinctrl definitions for meson gxbb and gxl/gxm
|
||||||
|
|
||||||
|
Signed-off-by: Igor Vavro <afl2001@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 43 ++++++++++++++++++++--
|
||||||
|
drivers/pinctrl/meson/pinctrl-meson-gxl.c | 27 ++++++++++++++
|
||||||
|
2 files changed, 66 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
|
||||||
|
index 926b9997159a..25325235d82f 100644
|
||||||
|
--- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
|
||||||
|
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
|
||||||
|
@@ -231,10 +231,24 @@ static const unsigned int hdmi_hpd_pins[] = { GPIOH_0 };
|
||||||
|
static const unsigned int hdmi_sda_pins[] = { GPIOH_1 };
|
||||||
|
static const unsigned int hdmi_scl_pins[] = { GPIOH_2 };
|
||||||
|
|
||||||
|
+static const unsigned int tsin_a_d_valid_pins[] = { GPIOY_0 };
|
||||||
|
+static const unsigned int tsin_a_sop_pins[] = { GPIOY_1 };
|
||||||
|
+static const unsigned int tsin_a_clk_pins[] = { GPIOY_2 };
|
||||||
|
+static const unsigned int tsin_a_d0_pins[] = { GPIOY_3 };
|
||||||
|
+static const unsigned int tsin_a_dp_pins[] = {
|
||||||
|
+ GPIOY_4, GPIOY_5, GPIOY_6, GPIOY_7, GPIOY_8, GPIOY_9, GPIOY_10
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const unsigned int tsin_a_fail_pins[] = { GPIOY_11 };
|
||||||
|
static const unsigned int i2s_out_ch23_y_pins[] = { GPIOY_8 };
|
||||||
|
static const unsigned int i2s_out_ch45_y_pins[] = { GPIOY_9 };
|
||||||
|
static const unsigned int i2s_out_ch67_y_pins[] = { GPIOY_10 };
|
||||||
|
|
||||||
|
+static const unsigned int tsin_b_d_valid_pins[] = { GPIOX_6 };
|
||||||
|
+static const unsigned int tsin_b_sop_pins[] = { GPIOX_7 };
|
||||||
|
+static const unsigned int tsin_b_clk_pins[] = { GPIOX_8 };
|
||||||
|
+static const unsigned int tsin_b_d0_pins[] = { GPIOX_9 };
|
||||||
|
+
|
||||||
|
static const unsigned int spdif_out_y_pins[] = { GPIOY_12 };
|
||||||
|
|
||||||
|
static const unsigned int gen_clk_out_pins[] = { GPIOY_15 };
|
||||||
|
@@ -437,12 +451,22 @@ static struct meson_pmx_group meson_gxbb_periphs_groups[] = {
|
||||||
|
GROUP(pwm_a_x, 3, 17),
|
||||||
|
GROUP(pwm_e, 2, 30),
|
||||||
|
GROUP(pwm_f_x, 3, 18),
|
||||||
|
+ GROUP(tsin_b_d_valid, 3, 9),
|
||||||
|
+ GROUP(tsin_b_sop, 3, 8),
|
||||||
|
+ GROUP(tsin_b_clk, 3, 10),
|
||||||
|
+ GROUP(tsin_b_d0, 3, 7),
|
||||||
|
|
||||||
|
/* Bank Y */
|
||||||
|
- GROUP(uart_cts_c, 1, 17),
|
||||||
|
- GROUP(uart_rts_c, 1, 16),
|
||||||
|
- GROUP(uart_tx_c, 1, 19),
|
||||||
|
- GROUP(uart_rx_c, 1, 18),
|
||||||
|
+ GROUP(tsin_a_fail, 3, 3),
|
||||||
|
+ GROUP(tsin_a_d_valid, 3, 2),
|
||||||
|
+ GROUP(tsin_a_sop, 3, 1),
|
||||||
|
+ GROUP(tsin_a_clk, 3, 0),
|
||||||
|
+ GROUP(tsin_a_d0, 3, 4),
|
||||||
|
+ GROUP(tsin_a_dp, 3, 5),
|
||||||
|
+ GROUP(uart_cts_c, 1, 19),
|
||||||
|
+ GROUP(uart_rts_c, 1, 18),
|
||||||
|
+ GROUP(uart_tx_c, 1, 17),
|
||||||
|
+ GROUP(uart_rx_c, 1, 16),
|
||||||
|
GROUP(pwm_a_y, 1, 21),
|
||||||
|
GROUP(pwm_f_y, 1, 20),
|
||||||
|
GROUP(i2s_out_ch23_y, 1, 5),
|
||||||
|
@@ -601,6 +625,15 @@ static const char * const gpio_periphs_groups[] = {
|
||||||
|
"GPIOX_20", "GPIOX_21", "GPIOX_22",
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const char * const tsin_a_groups[] = {
|
||||||
|
+ "tsin_a_clk", "tsin_a_sop", "tsin_a_d_valid", "tsin_a_d0",
|
||||||
|
+ "tsin_a_dp", "tsin_a_fail",
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const char * const tsin_b_groups[] = {
|
||||||
|
+ "tsin_b_clk", "tsin_b_sop", "tsin_b_d_valid", "tsin_b_d0",
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const char * const emmc_groups[] = {
|
||||||
|
"emmc_nand_d07", "emmc_clk", "emmc_cmd", "emmc_ds",
|
||||||
|
};
|
||||||
|
@@ -792,6 +825,8 @@ static struct meson_pmx_func meson_gxbb_periphs_functions[] = {
|
||||||
|
FUNCTION(i2s_out),
|
||||||
|
FUNCTION(spdif_out),
|
||||||
|
FUNCTION(gen_clk_out),
|
||||||
|
+ FUNCTION(tsin_a),
|
||||||
|
+ FUNCTION(tsin_b),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct meson_pmx_func meson_gxbb_aobus_functions[] = {
|
||||||
|
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
|
||||||
|
index 2ac921c83da9..32552d795bb2 100644
|
||||||
|
--- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
|
||||||
|
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
|
||||||
|
@@ -241,6 +241,17 @@ static const unsigned int tsin_a_dp_pins[] = {
|
||||||
|
GPIODV_1, GPIODV_2, GPIODV_3, GPIODV_4, GPIODV_5, GPIODV_6, GPIODV_7,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const unsigned int tsin_b_clk_pins[] = { GPIOH_6 };
|
||||||
|
+static const unsigned int tsin_b_d0_pins[] = { GPIOH_7 };
|
||||||
|
+static const unsigned int tsin_b_sop_pins[] = { GPIOH_8 };
|
||||||
|
+static const unsigned int tsin_b_d_valid_pins[] = { GPIOH_9 };
|
||||||
|
+
|
||||||
|
+static const unsigned int tsin_b_fail_z4_pins[] = { GPIOZ_4 };
|
||||||
|
+static const unsigned int tsin_b_clk_z3_pins[] = { GPIOZ_3 };
|
||||||
|
+static const unsigned int tsin_b_d0_z2_pins[] = { GPIOZ_2 };
|
||||||
|
+static const unsigned int tsin_b_sop_z1_pins[] = { GPIOZ_1 };
|
||||||
|
+static const unsigned int tsin_b_d_valid_z0_pins[] = { GPIOZ_0 };
|
||||||
|
+
|
||||||
|
static const struct pinctrl_pin_desc meson_gxl_aobus_pins[] = {
|
||||||
|
MESON_PIN(GPIOAO_0),
|
||||||
|
MESON_PIN(GPIOAO_1),
|
||||||
|
@@ -438,6 +449,11 @@ static struct meson_pmx_group meson_gxl_periphs_groups[] = {
|
||||||
|
GROUP(eth_txd1, 4, 12),
|
||||||
|
GROUP(eth_txd2, 4, 11),
|
||||||
|
GROUP(eth_txd3, 4, 10),
|
||||||
|
+ GROUP(tsin_b_fail_z4, 3, 15),
|
||||||
|
+ GROUP(tsin_b_clk_z3, 3, 16),
|
||||||
|
+ GROUP(tsin_b_d0_z2, 3, 17),
|
||||||
|
+ GROUP(tsin_b_sop_z1, 3, 18),
|
||||||
|
+ GROUP(tsin_b_d_valid_z0, 3, 19),
|
||||||
|
GROUP(pwm_c, 3, 20),
|
||||||
|
GROUP(i2s_out_ch23_z, 3, 26),
|
||||||
|
GROUP(i2s_out_ch45_z, 3, 25),
|
||||||
|
@@ -454,6 +470,10 @@ static struct meson_pmx_group meson_gxl_periphs_groups[] = {
|
||||||
|
GROUP(i2s_out_lr_clk, 6, 24),
|
||||||
|
GROUP(i2s_out_ch01, 6, 23),
|
||||||
|
GROUP(spdif_out_h, 6, 28),
|
||||||
|
+ GROUP(tsin_b_d0, 6, 17),
|
||||||
|
+ GROUP(tsin_b_sop, 6, 18),
|
||||||
|
+ GROUP(tsin_b_d_valid, 6, 19),
|
||||||
|
+ GROUP(tsin_b_clk, 6, 20),
|
||||||
|
|
||||||
|
/* Bank DV */
|
||||||
|
GROUP(uart_tx_b, 2, 16),
|
||||||
|
@@ -689,6 +709,12 @@ static const char * const tsin_a_groups[] = {
|
||||||
|
"tsin_a_dp", "tsin_a_fail",
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const char * const tsin_b_groups[] = {
|
||||||
|
+ "tsin_b_clk", "tsin_b_sop", "tsin_b_d_valid", "tsin_b_d0",
|
||||||
|
+ "tsin_b_clk_z3", "tsin_b_sop_z1", "tsin_b_d_valid_z0", "tsin_b_d0_z2",
|
||||||
|
+ "tsin_b_fail_z4",
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const char * const gpio_aobus_groups[] = {
|
||||||
|
"GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3", "GPIOAO_4",
|
||||||
|
"GPIOAO_5", "GPIOAO_6", "GPIOAO_7", "GPIOAO_8", "GPIOAO_9",
|
||||||
|
@@ -764,6 +790,7 @@ static struct meson_pmx_func meson_gxl_periphs_functions[] = {
|
||||||
|
FUNCTION(spdif_out),
|
||||||
|
FUNCTION(eth_led),
|
||||||
|
FUNCTION(tsin_a),
|
||||||
|
+ FUNCTION(tsin_b),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct meson_pmx_func meson_gxl_aobus_functions[] = {
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
From 8b237e5aed372ee3d9db07bfb083ed2e02065055 Mon Sep 17 00:00:00 2001
|
From 2bc15afcf4a5485a1428f29e3d01136824288e1e Mon Sep 17 00:00:00 2001
|
||||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
Date: Mon, 14 Oct 2019 16:17:16 +0200
|
Date: Thu, 17 Oct 2019 21:03:22 +0000
|
||||||
Subject: [PATCH] doc: dt: bindings: usb: dwc3: Update entries for disabling SS
|
Subject: [PATCH 062/101] FROMLIST: doc: dt: bindings: usb: dwc3: Update
|
||||||
instances in park mode
|
entries for disabling SS instances in park mode
|
||||||
|
|
||||||
This patch updates the documentation with the information related
|
This patch updates the documentation with the information related
|
||||||
to the quirks that needs to be added for disabling all SuperSpeed XHCi
|
to the quirks that needs to be added for disabling all SuperSpeed XHCi
|
||||||
|
@ -12,13 +12,12 @@ CC: Dongjin Kim <tobetter@gmail.com>
|
||||||
Cc: Jianxin Pan <jianxin.pan@amlogic.com>
|
Cc: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||||
Reported-by: Tim <elatllat@gmail.com>
|
Reported-by: Tim <elatllat@gmail.com>
|
||||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
Acked-by: Rob Herring <robh@kernel.org>
|
|
||||||
---
|
---
|
||||||
Documentation/devicetree/bindings/usb/dwc3.txt | 2 ++
|
Documentation/devicetree/bindings/usb/dwc3.txt | 2 ++
|
||||||
1 file changed, 2 insertions(+)
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt
|
diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt
|
||||||
index 66780a47ad859..c977a3ba2f35c 100644
|
index 66780a47ad85..c977a3ba2f35 100644
|
||||||
--- a/Documentation/devicetree/bindings/usb/dwc3.txt
|
--- a/Documentation/devicetree/bindings/usb/dwc3.txt
|
||||||
+++ b/Documentation/devicetree/bindings/usb/dwc3.txt
|
+++ b/Documentation/devicetree/bindings/usb/dwc3.txt
|
||||||
@@ -75,6 +75,8 @@ Optional properties:
|
@@ -75,6 +75,8 @@ Optional properties:
|
||||||
|
@ -30,3 +29,6 @@ index 66780a47ad859..c977a3ba2f35c 100644
|
||||||
- snps,dis_metastability_quirk: when set, disable metastability workaround.
|
- snps,dis_metastability_quirk: when set, disable metastability workaround.
|
||||||
CAUTION: use only if you are absolutely sure of it.
|
CAUTION: use only if you are absolutely sure of it.
|
||||||
- snps,is-utmi-l1-suspend: true when DWC3 asserts output signal
|
- snps,is-utmi-l1-suspend: true when DWC3 asserts output signal
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
From 763f3438359ec0b4a84c70295ddca6f6e67ab323 Mon Sep 17 00:00:00 2001
|
From 71833fa01ebf2e460ced652ccfb9ce17ef2801de Mon Sep 17 00:00:00 2001
|
||||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
Date: Mon, 14 Oct 2019 16:17:18 +0200
|
Date: Thu, 17 Oct 2019 21:05:34 +0000
|
||||||
Subject: [PATCH] arm64: dts: g12-common: add parkmode_disable_ss_quirk on DWC3
|
Subject: [PATCH 064/101] FROMLIST: arm64: dts: g12-common: add
|
||||||
controller
|
parkmode_disable_ss_quirk on DWC3 controller
|
||||||
|
|
||||||
When high load on the DWC3 SuperSpee port, the controller crashed as:
|
When high load on the DWC3 SuperSpee port, the controller crashed as:
|
||||||
[ 221.141621] xhci-hcd xhci-hcd.0.auto: xHCI host not responding to stop endpoint command.
|
[ 221.141621] xhci-hcd xhci-hcd.0.auto: xHCI host not responding to stop endpoint command.
|
||||||
|
@ -24,10 +24,10 @@ Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
1 file changed, 1 insertion(+)
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||||
index 3f39e020f74e62..4b002e799e5c2f 100644
|
index 3deace05d345..d66b9ad9c966 100644
|
||||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
+++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||||
@@ -2381,6 +2381,7 @@
|
@@ -2231,6 +2231,7 @@
|
||||||
dr_mode = "host";
|
dr_mode = "host";
|
||||||
snps,dis_u2_susphy_quirk;
|
snps,dis_u2_susphy_quirk;
|
||||||
snps,quirk-frame-length-adjustment;
|
snps,quirk-frame-length-adjustment;
|
||||||
|
@ -35,3 +35,6 @@ index 3f39e020f74e62..4b002e799e5c2f 100644
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
From a248c9db1deae60a1d77d094599a81a1639976d1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Boris Brezillon <boris.brezillon@collabora.com>
|
||||||
|
Date: Tue, 22 Oct 2019 16:15:50 +0200
|
||||||
|
Subject: [PATCH 065/101] FROMLIST: dt-bindings: display: bridge: lvds-codec:
|
||||||
|
Add new bus-width prop
|
||||||
|
|
||||||
|
Add the bus-width property to describe the input bus format.
|
||||||
|
|
||||||
|
v10:
|
||||||
|
* Add changelog to the commit message
|
||||||
|
* Add Rob's R-b
|
||||||
|
|
||||||
|
v8 -> v9:
|
||||||
|
* No changes
|
||||||
|
|
||||||
|
v7:
|
||||||
|
* Rebase on top of lvds-codec changes
|
||||||
|
* Drop the data-mapping property
|
||||||
|
|
||||||
|
v4 -> v6:
|
||||||
|
* Not part of the series
|
||||||
|
|
||||||
|
v3:
|
||||||
|
* New patch
|
||||||
|
|
||||||
|
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
|
||||||
|
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||||
|
---
|
||||||
|
.../devicetree/bindings/display/bridge/lvds-codec.yaml | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/display/bridge/lvds-codec.yaml b/Documentation/devicetree/bindings/display/bridge/lvds-codec.yaml
|
||||||
|
index 8f373029f5d2..7c4e42f4de61 100644
|
||||||
|
--- a/Documentation/devicetree/bindings/display/bridge/lvds-codec.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/display/bridge/lvds-codec.yaml
|
||||||
|
@@ -55,6 +55,14 @@ properties:
|
||||||
|
description: |
|
||||||
|
For LVDS encoders, port 0 is the parallel input
|
||||||
|
For LVDS decoders, port 0 is the LVDS input
|
||||||
|
+ properties:
|
||||||
|
+ bus-width:
|
||||||
|
+ allOf:
|
||||||
|
+ - $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
+ - enum: [18, 24]
|
||||||
|
+ - default: 24
|
||||||
|
+ description:
|
||||||
|
+ Number of data lines used to transmit the RGB data.
|
||||||
|
|
||||||
|
port@1:
|
||||||
|
type: object
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,363 @@
|
||||||
|
From 3a0cad646aeee924b91d4215161e771f2499b5d6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
Date: Wed, 14 Aug 2019 10:52:52 +0200
|
||||||
|
Subject: [PATCH 066/101] FROMLIST: drm/meson: vclk: add support for YUV420
|
||||||
|
setup
|
||||||
|
|
||||||
|
This patch adds clocking support for the YUV420 output from the
|
||||||
|
Amlogic Meson SoCs Video Processing Unit to the HDMI Controller.
|
||||||
|
|
||||||
|
The YUV420 is obtained by generating a YUV444 pixel stream like
|
||||||
|
the classic HDMI display modes, but then the Video Encoder output
|
||||||
|
can be configured to down-sample the YUV444 pixel stream to a YUV420
|
||||||
|
stream.
|
||||||
|
|
||||||
|
This mode needs a different clock generation scheme since the TMDS PHY
|
||||||
|
clock must match the 10x ratio with the YUV420 pixel clock, but
|
||||||
|
the video encoder must run at 2x the pixel clock.
|
||||||
|
|
||||||
|
This patch adds the TMDS PHY clock value in all the video clock setup
|
||||||
|
in order to better support these specific uses cases and switch
|
||||||
|
to the Common Clock framework for clocks handling in the future.
|
||||||
|
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/meson/meson_dw_hdmi.c | 24 ++++---
|
||||||
|
drivers/gpu/drm/meson/meson_vclk.c | 93 +++++++++++++++++++------
|
||||||
|
drivers/gpu/drm/meson/meson_vclk.h | 7 +-
|
||||||
|
drivers/gpu/drm/meson/meson_venc_cvbs.c | 6 +-
|
||||||
|
4 files changed, 95 insertions(+), 35 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
||||||
|
index 3bb7ffe5fc39..65d1925202c0 100644
|
||||||
|
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
||||||
|
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
||||||
|
@@ -372,15 +372,19 @@ static void dw_hdmi_set_vclk(struct meson_dw_hdmi *dw_hdmi,
|
||||||
|
{
|
||||||
|
struct meson_drm *priv = dw_hdmi->priv;
|
||||||
|
int vic = drm_match_cea_mode(mode);
|
||||||
|
+ unsigned int phy_freq;
|
||||||
|
unsigned int vclk_freq;
|
||||||
|
unsigned int venc_freq;
|
||||||
|
unsigned int hdmi_freq;
|
||||||
|
|
||||||
|
vclk_freq = mode->clock;
|
||||||
|
|
||||||
|
+ /* TMDS clock is pixel_clock * 10 */
|
||||||
|
+ phy_freq = vclk_freq * 10;
|
||||||
|
+
|
||||||
|
if (!vic) {
|
||||||
|
- meson_vclk_setup(priv, MESON_VCLK_TARGET_DMT, vclk_freq,
|
||||||
|
- vclk_freq, vclk_freq, false);
|
||||||
|
+ meson_vclk_setup(priv, MESON_VCLK_TARGET_DMT, phy_freq,
|
||||||
|
+ vclk_freq, vclk_freq, vclk_freq, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -398,11 +402,11 @@ static void dw_hdmi_set_vclk(struct meson_dw_hdmi *dw_hdmi,
|
||||||
|
if (mode->flags & DRM_MODE_FLAG_DBLCLK)
|
||||||
|
venc_freq /= 2;
|
||||||
|
|
||||||
|
- DRM_DEBUG_DRIVER("vclk:%d venc=%d hdmi=%d enci=%d\n",
|
||||||
|
- vclk_freq, venc_freq, hdmi_freq,
|
||||||
|
+ DRM_DEBUG_DRIVER("vclk:%d phy=%d venc=%d hdmi=%d enci=%d\n",
|
||||||
|
+ phy_freq, vclk_freq, venc_freq, hdmi_freq,
|
||||||
|
priv->venc.hdmi_use_enci);
|
||||||
|
|
||||||
|
- meson_vclk_setup(priv, MESON_VCLK_TARGET_HDMI, vclk_freq,
|
||||||
|
+ meson_vclk_setup(priv, MESON_VCLK_TARGET_HDMI, phy_freq, vclk_freq,
|
||||||
|
venc_freq, hdmi_freq, priv->venc.hdmi_use_enci);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -613,6 +617,7 @@ dw_hdmi_mode_valid(struct drm_connector *connector,
|
||||||
|
const struct drm_display_mode *mode)
|
||||||
|
{
|
||||||
|
struct meson_drm *priv = connector->dev->dev_private;
|
||||||
|
+ unsigned int phy_freq;
|
||||||
|
unsigned int vclk_freq;
|
||||||
|
unsigned int venc_freq;
|
||||||
|
unsigned int hdmi_freq;
|
||||||
|
@@ -639,6 +644,9 @@ dw_hdmi_mode_valid(struct drm_connector *connector,
|
||||||
|
|
||||||
|
vclk_freq = mode->clock;
|
||||||
|
|
||||||
|
+ /* TMDS clock is pixel_clock * 10 */
|
||||||
|
+ phy_freq = vclk_freq * 10;
|
||||||
|
+
|
||||||
|
/* 480i/576i needs global pixel doubling */
|
||||||
|
if (mode->flags & DRM_MODE_FLAG_DBLCLK)
|
||||||
|
vclk_freq *= 2;
|
||||||
|
@@ -655,10 +663,10 @@ dw_hdmi_mode_valid(struct drm_connector *connector,
|
||||||
|
if (mode->flags & DRM_MODE_FLAG_DBLCLK)
|
||||||
|
venc_freq /= 2;
|
||||||
|
|
||||||
|
- dev_dbg(connector->dev->dev, "%s: vclk:%d venc=%d hdmi=%d\n", __func__,
|
||||||
|
- vclk_freq, venc_freq, hdmi_freq);
|
||||||
|
+ dev_dbg(connector->dev->dev, "%s: vclk:%d phy=%d venc=%d hdmi=%d\n",
|
||||||
|
+ __func__, phy_freq, vclk_freq, venc_freq, hdmi_freq);
|
||||||
|
|
||||||
|
- return meson_vclk_vic_supported_freq(vclk_freq);
|
||||||
|
+ return meson_vclk_vic_supported_freq(phy_freq, vclk_freq);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encoder */
|
||||||
|
diff --git a/drivers/gpu/drm/meson/meson_vclk.c b/drivers/gpu/drm/meson/meson_vclk.c
|
||||||
|
index f690793ae2d5..fdf26dac9fa8 100644
|
||||||
|
--- a/drivers/gpu/drm/meson/meson_vclk.c
|
||||||
|
+++ b/drivers/gpu/drm/meson/meson_vclk.c
|
||||||
|
@@ -354,12 +354,17 @@ enum {
|
||||||
|
/* 2970 /1 /1 /1 /5 /2 => /1 /1 */
|
||||||
|
MESON_VCLK_HDMI_297000,
|
||||||
|
/* 5940 /1 /1 /2 /5 /1 => /1 /1 */
|
||||||
|
- MESON_VCLK_HDMI_594000
|
||||||
|
+ MESON_VCLK_HDMI_594000,
|
||||||
|
+/* 2970 /1 /1 /1 /5 /1 => /1 /2 */
|
||||||
|
+ MESON_VCLK_HDMI_594000_YUV420,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct meson_vclk_params {
|
||||||
|
+ unsigned int pll_freq;
|
||||||
|
+ unsigned int phy_freq;
|
||||||
|
+ unsigned int vclk_freq;
|
||||||
|
+ unsigned int venc_freq;
|
||||||
|
unsigned int pixel_freq;
|
||||||
|
- unsigned int pll_base_freq;
|
||||||
|
unsigned int pll_od1;
|
||||||
|
unsigned int pll_od2;
|
||||||
|
unsigned int pll_od3;
|
||||||
|
@@ -367,8 +372,11 @@ struct meson_vclk_params {
|
||||||
|
unsigned int vclk_div;
|
||||||
|
} params[] = {
|
||||||
|
[MESON_VCLK_HDMI_ENCI_54000] = {
|
||||||
|
+ .pll_freq = 4320000,
|
||||||
|
+ .phy_freq = 270000,
|
||||||
|
+ .vclk_freq = 54000,
|
||||||
|
+ .venc_freq = 54000,
|
||||||
|
.pixel_freq = 54000,
|
||||||
|
- .pll_base_freq = 4320000,
|
||||||
|
.pll_od1 = 4,
|
||||||
|
.pll_od2 = 4,
|
||||||
|
.pll_od3 = 1,
|
||||||
|
@@ -376,8 +384,11 @@ struct meson_vclk_params {
|
||||||
|
.vclk_div = 1,
|
||||||
|
},
|
||||||
|
[MESON_VCLK_HDMI_DDR_54000] = {
|
||||||
|
- .pixel_freq = 54000,
|
||||||
|
- .pll_base_freq = 4320000,
|
||||||
|
+ .pll_freq = 4320000,
|
||||||
|
+ .phy_freq = 270000,
|
||||||
|
+ .vclk_freq = 54000,
|
||||||
|
+ .venc_freq = 54000,
|
||||||
|
+ .pixel_freq = 27000,
|
||||||
|
.pll_od1 = 4,
|
||||||
|
.pll_od2 = 4,
|
||||||
|
.pll_od3 = 1,
|
||||||
|
@@ -385,8 +396,11 @@ struct meson_vclk_params {
|
||||||
|
.vclk_div = 1,
|
||||||
|
},
|
||||||
|
[MESON_VCLK_HDMI_DDR_148500] = {
|
||||||
|
- .pixel_freq = 148500,
|
||||||
|
- .pll_base_freq = 2970000,
|
||||||
|
+ .pll_freq = 2970000,
|
||||||
|
+ .phy_freq = 742500,
|
||||||
|
+ .vclk_freq = 148500,
|
||||||
|
+ .venc_freq = 148500,
|
||||||
|
+ .pixel_freq = 74250,
|
||||||
|
.pll_od1 = 4,
|
||||||
|
.pll_od2 = 1,
|
||||||
|
.pll_od3 = 1,
|
||||||
|
@@ -394,8 +408,11 @@ struct meson_vclk_params {
|
||||||
|
.vclk_div = 1,
|
||||||
|
},
|
||||||
|
[MESON_VCLK_HDMI_74250] = {
|
||||||
|
+ .pll_freq = 2970000,
|
||||||
|
+ .phy_freq = 742500,
|
||||||
|
+ .vclk_freq = 74250,
|
||||||
|
+ .venc_freq = 74250,
|
||||||
|
.pixel_freq = 74250,
|
||||||
|
- .pll_base_freq = 2970000,
|
||||||
|
.pll_od1 = 2,
|
||||||
|
.pll_od2 = 2,
|
||||||
|
.pll_od3 = 2,
|
||||||
|
@@ -403,8 +420,11 @@ struct meson_vclk_params {
|
||||||
|
.vclk_div = 1,
|
||||||
|
},
|
||||||
|
[MESON_VCLK_HDMI_148500] = {
|
||||||
|
+ .pll_freq = 2970000,
|
||||||
|
+ .phy_freq = 1485000,
|
||||||
|
+ .vclk_freq = 148500,
|
||||||
|
+ .venc_freq = 148500,
|
||||||
|
.pixel_freq = 148500,
|
||||||
|
- .pll_base_freq = 2970000,
|
||||||
|
.pll_od1 = 1,
|
||||||
|
.pll_od2 = 2,
|
||||||
|
.pll_od3 = 2,
|
||||||
|
@@ -412,8 +432,11 @@ struct meson_vclk_params {
|
||||||
|
.vclk_div = 1,
|
||||||
|
},
|
||||||
|
[MESON_VCLK_HDMI_297000] = {
|
||||||
|
+ .pll_freq = 5940000,
|
||||||
|
+ .phy_freq = 2970000,
|
||||||
|
+ .venc_freq = 297000,
|
||||||
|
+ .vclk_freq = 297000,
|
||||||
|
.pixel_freq = 297000,
|
||||||
|
- .pll_base_freq = 5940000,
|
||||||
|
.pll_od1 = 2,
|
||||||
|
.pll_od2 = 1,
|
||||||
|
.pll_od3 = 1,
|
||||||
|
@@ -421,14 +444,29 @@ struct meson_vclk_params {
|
||||||
|
.vclk_div = 2,
|
||||||
|
},
|
||||||
|
[MESON_VCLK_HDMI_594000] = {
|
||||||
|
+ .pll_freq = 5940000,
|
||||||
|
+ .phy_freq = 5940000,
|
||||||
|
+ .venc_freq = 594000,
|
||||||
|
+ .vclk_freq = 594000,
|
||||||
|
.pixel_freq = 594000,
|
||||||
|
- .pll_base_freq = 5940000,
|
||||||
|
.pll_od1 = 1,
|
||||||
|
.pll_od2 = 1,
|
||||||
|
.pll_od3 = 2,
|
||||||
|
.vid_pll_div = VID_PLL_DIV_5,
|
||||||
|
.vclk_div = 1,
|
||||||
|
},
|
||||||
|
+ [MESON_VCLK_HDMI_594000_YUV420] = {
|
||||||
|
+ .pll_freq = 5940000,
|
||||||
|
+ .phy_freq = 2970000,
|
||||||
|
+ .venc_freq = 594000,
|
||||||
|
+ .vclk_freq = 594000,
|
||||||
|
+ .pixel_freq = 297000,
|
||||||
|
+ .pll_od1 = 2,
|
||||||
|
+ .pll_od2 = 1,
|
||||||
|
+ .pll_od3 = 1,
|
||||||
|
+ .vid_pll_div = VID_PLL_DIV_5,
|
||||||
|
+ .vclk_div = 1,
|
||||||
|
+ },
|
||||||
|
{ /* sentinel */ },
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -701,6 +739,7 @@ static void meson_hdmi_pll_generic_set(struct meson_drm *priv,
|
||||||
|
unsigned int od, m, frac, od1, od2, od3;
|
||||||
|
|
||||||
|
if (meson_hdmi_pll_find_params(priv, pll_freq, &m, &frac, &od)) {
|
||||||
|
+ /* OD2 goes to the PHY, and needs to be *10, so keep OD3=1 */
|
||||||
|
od3 = 1;
|
||||||
|
if (od < 4) {
|
||||||
|
od1 = 2;
|
||||||
|
@@ -723,21 +762,28 @@ static void meson_hdmi_pll_generic_set(struct meson_drm *priv,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum drm_mode_status
|
||||||
|
-meson_vclk_vic_supported_freq(unsigned int freq)
|
||||||
|
+meson_vclk_vic_supported_freq(unsigned int phy_freq,
|
||||||
|
+ unsigned int vclk_freq)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- DRM_DEBUG_DRIVER("freq = %d\n", freq);
|
||||||
|
+ DRM_DEBUG_DRIVER("phy_freq = %d vclk_freq = %d\n",
|
||||||
|
+ phy_freq, vclk_freq);
|
||||||
|
|
||||||
|
for (i = 0 ; params[i].pixel_freq ; ++i) {
|
||||||
|
DRM_DEBUG_DRIVER("i = %d pixel_freq = %d alt = %d\n",
|
||||||
|
i, params[i].pixel_freq,
|
||||||
|
FREQ_1000_1001(params[i].pixel_freq));
|
||||||
|
+ DRM_DEBUG_DRIVER("i = %d phy_freq = %d alt = %d\n",
|
||||||
|
+ i, params[i].phy_freq,
|
||||||
|
+ FREQ_1000_1001(params[i].phy_freq/10)*10);
|
||||||
|
/* Match strict frequency */
|
||||||
|
- if (freq == params[i].pixel_freq)
|
||||||
|
+ if (phy_freq == params[i].phy_freq &&
|
||||||
|
+ vclk_freq == params[i].vclk_freq)
|
||||||
|
return MODE_OK;
|
||||||
|
/* Match 1000/1001 variant */
|
||||||
|
- if (freq == FREQ_1000_1001(params[i].pixel_freq))
|
||||||
|
+ if (phy_freq == (FREQ_1000_1001(params[i].phy_freq/10)*10) &&
|
||||||
|
+ vclk_freq == FREQ_1000_1001(params[i].vclk_freq))
|
||||||
|
return MODE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -965,8 +1011,9 @@ static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq,
|
||||||
|
}
|
||||||
|
|
||||||
|
void meson_vclk_setup(struct meson_drm *priv, unsigned int target,
|
||||||
|
- unsigned int vclk_freq, unsigned int venc_freq,
|
||||||
|
- unsigned int dac_freq, bool hdmi_use_enci)
|
||||||
|
+ unsigned int phy_freq, unsigned int vclk_freq,
|
||||||
|
+ unsigned int venc_freq, unsigned int dac_freq,
|
||||||
|
+ bool hdmi_use_enci)
|
||||||
|
{
|
||||||
|
bool vic_alternate_clock = false;
|
||||||
|
unsigned int freq;
|
||||||
|
@@ -986,7 +1033,7 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target,
|
||||||
|
* - venc_div = 1
|
||||||
|
* - encp encoder
|
||||||
|
*/
|
||||||
|
- meson_vclk_set(priv, vclk_freq * 10, 0, 0, 0,
|
||||||
|
+ meson_vclk_set(priv, phy_freq, 0, 0, 0,
|
||||||
|
VID_PLL_DIV_5, 2, 1, 1, false, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@@ -1008,9 +1055,11 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target,
|
||||||
|
}
|
||||||
|
|
||||||
|
for (freq = 0 ; params[freq].pixel_freq ; ++freq) {
|
||||||
|
- if (vclk_freq == params[freq].pixel_freq ||
|
||||||
|
- vclk_freq == FREQ_1000_1001(params[freq].pixel_freq)) {
|
||||||
|
- if (vclk_freq != params[freq].pixel_freq)
|
||||||
|
+ if ((phy_freq == params[freq].phy_freq ||
|
||||||
|
+ phy_freq == FREQ_1000_1001(params[freq].phy_freq/10)*10) &&
|
||||||
|
+ (vclk_freq == params[freq].vclk_freq ||
|
||||||
|
+ vclk_freq == FREQ_1000_1001(params[freq].vclk_freq))) {
|
||||||
|
+ if (vclk_freq != params[freq].vclk_freq)
|
||||||
|
vic_alternate_clock = true;
|
||||||
|
else
|
||||||
|
vic_alternate_clock = false;
|
||||||
|
@@ -1039,7 +1088,7 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target,
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- meson_vclk_set(priv, params[freq].pll_base_freq,
|
||||||
|
+ meson_vclk_set(priv, params[freq].pll_freq,
|
||||||
|
params[freq].pll_od1, params[freq].pll_od2,
|
||||||
|
params[freq].pll_od3, params[freq].vid_pll_div,
|
||||||
|
params[freq].vclk_div, hdmi_tx_div, venc_div,
|
||||||
|
diff --git a/drivers/gpu/drm/meson/meson_vclk.h b/drivers/gpu/drm/meson/meson_vclk.h
|
||||||
|
index b62125540aef..aed0ab2efa71 100644
|
||||||
|
--- a/drivers/gpu/drm/meson/meson_vclk.h
|
||||||
|
+++ b/drivers/gpu/drm/meson/meson_vclk.h
|
||||||
|
@@ -25,10 +25,11 @@ enum {
|
||||||
|
enum drm_mode_status
|
||||||
|
meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned int freq);
|
||||||
|
enum drm_mode_status
|
||||||
|
-meson_vclk_vic_supported_freq(unsigned int freq);
|
||||||
|
+meson_vclk_vic_supported_freq(unsigned int phy_freq, unsigned int vclk_freq);
|
||||||
|
|
||||||
|
void meson_vclk_setup(struct meson_drm *priv, unsigned int target,
|
||||||
|
- unsigned int vclk_freq, unsigned int venc_freq,
|
||||||
|
- unsigned int dac_freq, bool hdmi_use_enci);
|
||||||
|
+ unsigned int phy_freq, unsigned int vclk_freq,
|
||||||
|
+ unsigned int venc_freq, unsigned int dac_freq,
|
||||||
|
+ bool hdmi_use_enci);
|
||||||
|
|
||||||
|
#endif /* __MESON_VCLK_H */
|
||||||
|
diff --git a/drivers/gpu/drm/meson/meson_venc_cvbs.c b/drivers/gpu/drm/meson/meson_venc_cvbs.c
|
||||||
|
index 1bd6b6d15ffb..541f9eb2a135 100644
|
||||||
|
--- a/drivers/gpu/drm/meson/meson_venc_cvbs.c
|
||||||
|
+++ b/drivers/gpu/drm/meson/meson_venc_cvbs.c
|
||||||
|
@@ -213,8 +213,10 @@ static void meson_venc_cvbs_encoder_mode_set(struct drm_encoder *encoder,
|
||||||
|
meson_venci_cvbs_mode_set(priv, meson_mode->enci);
|
||||||
|
|
||||||
|
/* Setup 27MHz vclk2 for ENCI and VDAC */
|
||||||
|
- meson_vclk_setup(priv, MESON_VCLK_TARGET_CVBS, MESON_VCLK_CVBS,
|
||||||
|
- MESON_VCLK_CVBS, MESON_VCLK_CVBS, true);
|
||||||
|
+ meson_vclk_setup(priv, MESON_VCLK_TARGET_CVBS,
|
||||||
|
+ MESON_VCLK_CVBS, MESON_VCLK_CVBS,
|
||||||
|
+ MESON_VCLK_CVBS, MESON_VCLK_CVBS,
|
||||||
|
+ true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,387 @@
|
||||||
|
From c1946f0dda27a0a00853a5f6368e9d504f597368 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
Date: Fri, 6 Dec 2019 16:23:23 +0100
|
||||||
|
Subject: [PATCH 067/101] FROMLIST: media: v4l2-mem2mem: handle draining,
|
||||||
|
stopped and next-buf-is-last states
|
||||||
|
|
||||||
|
Since the draining and stop phase of the HW decoder mem2mem bahaviour is
|
||||||
|
now clearly defined, we can move handling of the following states to the
|
||||||
|
common v4l2-mem2mem core code:
|
||||||
|
- draining
|
||||||
|
- stopped
|
||||||
|
- next-buf-is-last
|
||||||
|
|
||||||
|
By introducing the following v4l2-mem2mem APIS:
|
||||||
|
- v4l2_m2m_encoder_cmd/v4l2_m2m_ioctl_encoder_cmd to handle start/stop command
|
||||||
|
- v4l2_m2m_decoder_cmd/v4l2_m2m_ioctl_decoder_cmd to handle start/stop command
|
||||||
|
- v4l2_m2m_start_streaming to handle start of streaming of the de/encoder queue
|
||||||
|
- v4l2_m2m_stop_streaming to handle stop of streaming of the de/encoder queue
|
||||||
|
- v4l2_m2m_last_buffer_done to maek the current dest buffer as the last one
|
||||||
|
|
||||||
|
And inline helpers:
|
||||||
|
- v4l2_m2m_mark_stopped to mark the de/encoding process as stopped
|
||||||
|
- v4l2_m2m_clear_state to clear the de/encoding state
|
||||||
|
- v4l2_m2m_dst_buf_is_last to detect the current dequeud dst_buf is the last
|
||||||
|
- v4l2_m2m_has_stopped to detect the de/encoding stopped state
|
||||||
|
- v4l2_m2m_is_last_draining_src_buf to detect the currect source buffer should
|
||||||
|
be the last processing before stopping the de/encoding process
|
||||||
|
|
||||||
|
The special next-buf-is-last when min_buffers != 1 case is also handled
|
||||||
|
in v4l2_m2m_qbuf() by reusing the other introduced APIs.
|
||||||
|
|
||||||
|
This state management has been stolen from the vicodec implementation,
|
||||||
|
and is no-op for drivers not calling the v4l2_m2m_encoder_cmd or
|
||||||
|
v4l2_m2m_decoder_cmd and v4l2_m2m_start_streaming/v4l2_m2m_stop_streaming.
|
||||||
|
|
||||||
|
The vicodec will be the first one to be converted as an example.
|
||||||
|
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
drivers/media/v4l2-core/v4l2-mem2mem.c | 172 ++++++++++++++++++++++++-
|
||||||
|
include/media/v4l2-mem2mem.h | 95 ++++++++++++++
|
||||||
|
2 files changed, 265 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
||||||
|
index cc34c5ab7009..4788919c8ce4 100644
|
||||||
|
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
|
||||||
|
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
||||||
|
@@ -340,6 +340,11 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev,
|
||||||
|
m2m_ctx->new_frame = !dst->vb2_buf.copied_timestamp ||
|
||||||
|
dst->vb2_buf.timestamp != src->vb2_buf.timestamp;
|
||||||
|
|
||||||
|
+ if (m2m_ctx->has_stopped) {
|
||||||
|
+ dprintk("Device has stopped\n");
|
||||||
|
+ goto job_unlock;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (m2m_dev->m2m_ops->job_ready
|
||||||
|
&& (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) {
|
||||||
|
dprintk("Driver not ready\n");
|
||||||
|
@@ -556,6 +561,99 @@ int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(v4l2_m2m_querybuf);
|
||||||
|
|
||||||
|
+void v4l2_m2m_last_buffer_done(struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
+ struct vb2_v4l2_buffer *vbuf)
|
||||||
|
+{
|
||||||
|
+ vbuf->flags |= V4L2_BUF_FLAG_LAST;
|
||||||
|
+ vb2_buffer_done(&vbuf->vb2_buf, VB2_BUF_STATE_DONE);
|
||||||
|
+
|
||||||
|
+ v4l2_m2m_mark_stopped(m2m_ctx);
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(v4l2_m2m_last_buffer_done);
|
||||||
|
+
|
||||||
|
+static int v4l2_mark_last_buf(struct v4l2_m2m_ctx *m2m_ctx)
|
||||||
|
+{
|
||||||
|
+ struct vb2_v4l2_buffer *next_dst_buf;
|
||||||
|
+
|
||||||
|
+ if (m2m_ctx->is_draining)
|
||||||
|
+ return -EBUSY;
|
||||||
|
+
|
||||||
|
+ if (m2m_ctx->has_stopped)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ m2m_ctx->last_src_buf = v4l2_m2m_last_src_buf(m2m_ctx);
|
||||||
|
+ m2m_ctx->is_draining = true;
|
||||||
|
+
|
||||||
|
+ if (m2m_ctx->last_src_buf)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ next_dst_buf = v4l2_m2m_dst_buf_remove(m2m_ctx);
|
||||||
|
+ if (!next_dst_buf) {
|
||||||
|
+ m2m_ctx->next_buf_last = true;
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ v4l2_m2m_last_buffer_done(m2m_ctx, next_dst_buf);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void v4l2_m2m_start_streaming(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_queue *q)
|
||||||
|
+{
|
||||||
|
+ if (V4L2_TYPE_IS_OUTPUT(q->type))
|
||||||
|
+ m2m_ctx->last_src_buf = NULL;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(v4l2_m2m_start_streaming);
|
||||||
|
+
|
||||||
|
+void v4l2_m2m_stop_streaming(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_queue *q)
|
||||||
|
+{
|
||||||
|
+ if (V4L2_TYPE_IS_OUTPUT(q->type)) {
|
||||||
|
+ if (m2m_ctx->is_draining) {
|
||||||
|
+ struct vb2_v4l2_buffer *next_dst_buf;
|
||||||
|
+
|
||||||
|
+ m2m_ctx->last_src_buf = NULL;
|
||||||
|
+ next_dst_buf = v4l2_m2m_dst_buf_remove(m2m_ctx);
|
||||||
|
+ if (!next_dst_buf)
|
||||||
|
+ m2m_ctx->next_buf_last = true;
|
||||||
|
+ else
|
||||||
|
+ v4l2_m2m_last_buffer_done(m2m_ctx,
|
||||||
|
+ next_dst_buf);
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ v4l2_m2m_clear_state(m2m_ctx);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(v4l2_m2m_stop_streaming);
|
||||||
|
+
|
||||||
|
+static void v4l2_m2m_force_last_buf_done(struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
+ struct vb2_queue *q)
|
||||||
|
+{
|
||||||
|
+ struct vb2_buffer *vb;
|
||||||
|
+ struct vb2_v4l2_buffer *vbuf;
|
||||||
|
+ unsigned int i;
|
||||||
|
+
|
||||||
|
+ if (WARN_ON(q->is_output))
|
||||||
|
+ return;
|
||||||
|
+ if (list_empty(&q->queued_list))
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ vb = list_first_entry(&q->queued_list, struct vb2_buffer, queued_entry);
|
||||||
|
+ for (i = 0; i < vb->num_planes; i++)
|
||||||
|
+ vb2_set_plane_payload(vb, i, 0);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Since the buffer hasn't been queued to the ready queue,
|
||||||
|
+ * mark is active and owned before marking it LAST and DONE
|
||||||
|
+ */
|
||||||
|
+ vb->state = VB2_BUF_STATE_ACTIVE;
|
||||||
|
+ atomic_inc(&q->owned_by_drv_count);
|
||||||
|
+
|
||||||
|
+ vbuf = to_vb2_v4l2_buffer(vb);
|
||||||
|
+ vbuf->field = V4L2_FIELD_NONE;
|
||||||
|
+
|
||||||
|
+ v4l2_m2m_last_buffer_done(m2m_ctx, vbuf);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
struct v4l2_buffer *buf)
|
||||||
|
{
|
||||||
|
@@ -570,11 +668,25 @@ int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
__func__);
|
||||||
|
return -EPERM;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
ret = vb2_qbuf(vq, vdev->v4l2_dev->mdev, buf);
|
||||||
|
- if (!ret && !(buf->flags & V4L2_BUF_FLAG_IN_REQUEST))
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * If the capture queue is streaming, but streaming hasn't started
|
||||||
|
+ * on the device, but was asked to stop, mark the previously queued
|
||||||
|
+ * buffer as DONE with LAST flag since it won't be queued on the
|
||||||
|
+ * device.
|
||||||
|
+ */
|
||||||
|
+ if (!V4L2_TYPE_IS_OUTPUT(vq->type) &&
|
||||||
|
+ vb2_is_streaming(vq) && !vb2_start_streaming_called(vq) &&
|
||||||
|
+ (v4l2_m2m_has_stopped(m2m_ctx) || v4l2_m2m_dst_buf_is_last(m2m_ctx)))
|
||||||
|
+ v4l2_m2m_force_last_buf_done(m2m_ctx, vq);
|
||||||
|
+ else if (!(buf->flags & V4L2_BUF_FLAG_IN_REQUEST))
|
||||||
|
v4l2_m2m_try_schedule(m2m_ctx);
|
||||||
|
|
||||||
|
- return ret;
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(v4l2_m2m_qbuf);
|
||||||
|
|
||||||
|
@@ -1225,6 +1337,62 @@ int v4l2_m2m_ioctl_try_decoder_cmd(struct file *file, void *fh,
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_try_decoder_cmd);
|
||||||
|
|
||||||
|
+int v4l2_m2m_encoder_cmd(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
+ struct v4l2_encoder_cmd *ec)
|
||||||
|
+{
|
||||||
|
+ if (ec->cmd != V4L2_ENC_CMD_STOP && ec->cmd != V4L2_ENC_CMD_START)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ if (ec->cmd == V4L2_ENC_CMD_STOP)
|
||||||
|
+ return v4l2_mark_last_buf(m2m_ctx);
|
||||||
|
+
|
||||||
|
+ if (m2m_ctx->is_draining)
|
||||||
|
+ return -EBUSY;
|
||||||
|
+
|
||||||
|
+ if (m2m_ctx->has_stopped)
|
||||||
|
+ m2m_ctx->has_stopped = false;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(v4l2_m2m_encoder_cmd);
|
||||||
|
+
|
||||||
|
+int v4l2_m2m_decoder_cmd(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
+ struct v4l2_decoder_cmd *dc)
|
||||||
|
+{
|
||||||
|
+ if (dc->cmd != V4L2_DEC_CMD_STOP && dc->cmd != V4L2_DEC_CMD_START)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ if (dc->cmd == V4L2_DEC_CMD_STOP)
|
||||||
|
+ return v4l2_mark_last_buf(m2m_ctx);
|
||||||
|
+
|
||||||
|
+ if (m2m_ctx->is_draining)
|
||||||
|
+ return -EBUSY;
|
||||||
|
+
|
||||||
|
+ if (m2m_ctx->has_stopped)
|
||||||
|
+ m2m_ctx->has_stopped = false;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(v4l2_m2m_decoder_cmd);
|
||||||
|
+
|
||||||
|
+int v4l2_m2m_ioctl_encoder_cmd(struct file *file, void *priv,
|
||||||
|
+ struct v4l2_encoder_cmd *ec)
|
||||||
|
+{
|
||||||
|
+ struct v4l2_fh *fh = file->private_data;
|
||||||
|
+
|
||||||
|
+ return v4l2_m2m_encoder_cmd(file, fh->m2m_ctx, ec);
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_encoder_cmd);
|
||||||
|
+
|
||||||
|
+int v4l2_m2m_ioctl_decoder_cmd(struct file *file, void *priv,
|
||||||
|
+ struct v4l2_decoder_cmd *dc)
|
||||||
|
+{
|
||||||
|
+ struct v4l2_fh *fh = file->private_data;
|
||||||
|
+
|
||||||
|
+ return v4l2_m2m_decoder_cmd(file, fh->m2m_ctx, dc);
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_decoder_cmd);
|
||||||
|
+
|
||||||
|
int v4l2_m2m_ioctl_stateless_try_decoder_cmd(struct file *file, void *fh,
|
||||||
|
struct v4l2_decoder_cmd *dc)
|
||||||
|
{
|
||||||
|
diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h
|
||||||
|
index 1d85e24791e4..3476889af46c 100644
|
||||||
|
--- a/include/media/v4l2-mem2mem.h
|
||||||
|
+++ b/include/media/v4l2-mem2mem.h
|
||||||
|
@@ -80,6 +80,10 @@ struct v4l2_m2m_queue_ctx {
|
||||||
|
* for an existing frame. This is always true unless
|
||||||
|
* V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF is set, which
|
||||||
|
* indicates slicing support.
|
||||||
|
+ * @is_draining: indicates device is in draining phase
|
||||||
|
+ * @last_src_buf: indicate the last source buffer for draining
|
||||||
|
+ * @next_buf_last: next capture queud buffer will be tagged as last
|
||||||
|
+ * @has_stopped: indicate the device has been stopped
|
||||||
|
* @m2m_dev: opaque pointer to the internal data to handle M2M context
|
||||||
|
* @cap_q_ctx: Capture (output to memory) queue context
|
||||||
|
* @out_q_ctx: Output (input from memory) queue context
|
||||||
|
@@ -98,6 +102,11 @@ struct v4l2_m2m_ctx {
|
||||||
|
|
||||||
|
bool new_frame;
|
||||||
|
|
||||||
|
+ bool is_draining;
|
||||||
|
+ struct vb2_v4l2_buffer *last_src_buf;
|
||||||
|
+ bool next_buf_last;
|
||||||
|
+ bool has_stopped;
|
||||||
|
+
|
||||||
|
/* internal use only */
|
||||||
|
struct v4l2_m2m_dev *m2m_dev;
|
||||||
|
|
||||||
|
@@ -215,6 +224,50 @@ v4l2_m2m_buf_done(struct vb2_v4l2_buffer *buf, enum vb2_buffer_state state)
|
||||||
|
vb2_buffer_done(&buf->vb2_buf, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static inline void
|
||||||
|
+v4l2_m2m_clear_state(struct v4l2_m2m_ctx *m2m_ctx)
|
||||||
|
+{
|
||||||
|
+ m2m_ctx->next_buf_last = false;
|
||||||
|
+ m2m_ctx->is_draining = false;
|
||||||
|
+ m2m_ctx->has_stopped = false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void
|
||||||
|
+v4l2_m2m_mark_stopped(struct v4l2_m2m_ctx *m2m_ctx)
|
||||||
|
+{
|
||||||
|
+ m2m_ctx->next_buf_last = false;
|
||||||
|
+ m2m_ctx->is_draining = false;
|
||||||
|
+ m2m_ctx->has_stopped = true;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline bool
|
||||||
|
+v4l2_m2m_dst_buf_is_last(struct v4l2_m2m_ctx *m2m_ctx)
|
||||||
|
+{
|
||||||
|
+ return m2m_ctx->is_draining && m2m_ctx->next_buf_last;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline bool
|
||||||
|
+v4l2_m2m_has_stopped(struct v4l2_m2m_ctx *m2m_ctx)
|
||||||
|
+{
|
||||||
|
+ return m2m_ctx->has_stopped;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline bool
|
||||||
|
+v4l2_m2m_is_last_draining_src_buf(struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
+ struct vb2_v4l2_buffer *buf)
|
||||||
|
+{
|
||||||
|
+ return m2m_ctx->is_draining && buf == m2m_ctx->last_src_buf;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * v4l2_m2m_last_buffer_done() - marks the buffer with LAST flag and DONE
|
||||||
|
+ *
|
||||||
|
+ * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
|
||||||
|
+ * @vbuf: pointer to struct &v4l2_buffer
|
||||||
|
+ */
|
||||||
|
+void v4l2_m2m_last_buffer_done(struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
+ struct vb2_v4l2_buffer *vbuf);
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* v4l2_m2m_reqbufs() - multi-queue-aware REQBUFS multiplexer
|
||||||
|
*
|
||||||
|
@@ -312,6 +365,44 @@ int v4l2_m2m_streamon(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
int v4l2_m2m_streamoff(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
enum v4l2_buf_type type);
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * v4l2_m2m_start_streaming() - handle start of streaming of a video queue
|
||||||
|
+ *
|
||||||
|
+ * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
|
||||||
|
+ * @q: queue
|
||||||
|
+ */
|
||||||
|
+void v4l2_m2m_start_streaming(struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
+ struct vb2_queue *q);
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * v4l2_m2m_stop_streaming() - handle stop of streaming of a video queue
|
||||||
|
+ *
|
||||||
|
+ * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
|
||||||
|
+ * @q: queue
|
||||||
|
+ */
|
||||||
|
+void v4l2_m2m_stop_streaming(struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
+ struct vb2_queue *q);
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * v4l2_m2m_encoder_cmd() - execute an encoder command
|
||||||
|
+ *
|
||||||
|
+ * @file: pointer to struct &file
|
||||||
|
+ * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
|
||||||
|
+ * @ec: pointer to the encoder command
|
||||||
|
+ */
|
||||||
|
+int v4l2_m2m_encoder_cmd(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
+ struct v4l2_encoder_cmd *ec);
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * v4l2_m2m_decoder_cmd() - execute a decoder command
|
||||||
|
+ *
|
||||||
|
+ * @file: pointer to struct &file
|
||||||
|
+ * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
|
||||||
|
+ * @dc: pointer to the decoder command
|
||||||
|
+ */
|
||||||
|
+int v4l2_m2m_decoder_cmd(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
||||||
|
+ struct v4l2_decoder_cmd *dc);
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* v4l2_m2m_poll() - poll replacement, for destination buffers only
|
||||||
|
*
|
||||||
|
@@ -704,6 +795,10 @@ int v4l2_m2m_ioctl_streamon(struct file *file, void *fh,
|
||||||
|
enum v4l2_buf_type type);
|
||||||
|
int v4l2_m2m_ioctl_streamoff(struct file *file, void *fh,
|
||||||
|
enum v4l2_buf_type type);
|
||||||
|
+int v4l2_m2m_ioctl_encoder_cmd(struct file *file, void *fh,
|
||||||
|
+ struct v4l2_encoder_cmd *ec);
|
||||||
|
+int v4l2_m2m_ioctl_decoder_cmd(struct file *file, void *fh,
|
||||||
|
+ struct v4l2_decoder_cmd *dc);
|
||||||
|
int v4l2_m2m_ioctl_try_encoder_cmd(struct file *file, void *fh,
|
||||||
|
struct v4l2_encoder_cmd *ec);
|
||||||
|
int v4l2_m2m_ioctl_try_decoder_cmd(struct file *file, void *fh,
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,304 @@
|
||||||
|
From f0ccf5d77eab794fa6fdb491b9db82e8465ef635 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
Date: Fri, 6 Dec 2019 16:24:16 +0100
|
||||||
|
Subject: [PATCH 068/101] FROMLIST: media: vicodec: use v4l2-mem2mem draining,
|
||||||
|
stopped and next-buf-is-last states handling
|
||||||
|
|
||||||
|
Use the previously introduced v4l2-mem2mem core APIs to handle the drainig,
|
||||||
|
stopped and next-buf-is-last states.
|
||||||
|
|
||||||
|
With these changes, the v4l2-compliance still passes with the following
|
||||||
|
commands :
|
||||||
|
v4l2-ctl --stream-mmap --stream-out-mmap --stream-to-hdr out.comp --stream-from in.yuv
|
||||||
|
>>>><><><><><><><><><><><><><><><><>< 15.53 fps
|
||||||
|
15.53 fps
|
||||||
|
><><><><><><><><><><><><>< 13.99 fps
|
||||||
|
13.99 fps
|
||||||
|
><><><><><><><><><><><>< 13.52 fps
|
||||||
|
13.52 fps
|
||||||
|
><><><><><><><><><><><><>< 13.41 fps
|
||||||
|
13.41 fps
|
||||||
|
><><><><><><><><><><><><>< 13.21 fps
|
||||||
|
13.21 fps
|
||||||
|
><><><><><><><><><><><>< 13.09 fps
|
||||||
|
13.09 fps
|
||||||
|
><><><><><><><
|
||||||
|
STOP ENCODER
|
||||||
|
<<<
|
||||||
|
EOS EVENT
|
||||||
|
|
||||||
|
v4l2-compliance --stream-from in.yuv -s
|
||||||
|
|
||||||
|
The output is available at [1]
|
||||||
|
|
||||||
|
v4l2-compliance -d1 --stream-from-hdr out.comp -s
|
||||||
|
|
||||||
|
The output is available at [2]
|
||||||
|
|
||||||
|
No functional changes should be noticed.
|
||||||
|
|
||||||
|
[1] https://termbin.com/25nn
|
||||||
|
[2] https://termbin.com/dza4
|
||||||
|
|
||||||
|
Suggested-by: Hans Verkuil <hverkuil@xs4all.nl>
|
||||||
|
Suggested-by: Maxime Jourdan <mjourdan@baylibre.com>
|
||||||
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
---
|
||||||
|
drivers/media/platform/vicodec/vicodec-core.c | 162 ++++++------------
|
||||||
|
1 file changed, 52 insertions(+), 110 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/media/platform/vicodec/vicodec-core.c b/drivers/media/platform/vicodec/vicodec-core.c
|
||||||
|
index 82350097503e..425c47216dae 100644
|
||||||
|
--- a/drivers/media/platform/vicodec/vicodec-core.c
|
||||||
|
+++ b/drivers/media/platform/vicodec/vicodec-core.c
|
||||||
|
@@ -117,15 +117,10 @@ struct vicodec_ctx {
|
||||||
|
struct vicodec_dev *dev;
|
||||||
|
bool is_enc;
|
||||||
|
bool is_stateless;
|
||||||
|
- bool is_draining;
|
||||||
|
- bool next_is_last;
|
||||||
|
- bool has_stopped;
|
||||||
|
spinlock_t *lock;
|
||||||
|
|
||||||
|
struct v4l2_ctrl_handler hdl;
|
||||||
|
|
||||||
|
- struct vb2_v4l2_buffer *last_src_buf;
|
||||||
|
-
|
||||||
|
/* Source and destination queue data */
|
||||||
|
struct vicodec_q_data q_data[2];
|
||||||
|
struct v4l2_fwht_state state;
|
||||||
|
@@ -431,11 +426,11 @@ static void device_run(void *priv)
|
||||||
|
v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, false);
|
||||||
|
|
||||||
|
spin_lock(ctx->lock);
|
||||||
|
- if (!ctx->comp_has_next_frame && src_buf == ctx->last_src_buf) {
|
||||||
|
+ if (!ctx->comp_has_next_frame &&
|
||||||
|
+ v4l2_m2m_is_last_draining_src_buf(ctx->fh.m2m_ctx, src_buf)) {
|
||||||
|
dst_buf->flags |= V4L2_BUF_FLAG_LAST;
|
||||||
|
v4l2_event_queue_fh(&ctx->fh, &vicodec_eos_event);
|
||||||
|
- ctx->is_draining = false;
|
||||||
|
- ctx->has_stopped = true;
|
||||||
|
+ v4l2_m2m_mark_stopped(ctx->fh.m2m_ctx);
|
||||||
|
}
|
||||||
|
if (ctx->is_enc || ctx->is_stateless) {
|
||||||
|
src_buf->sequence = q_src->sequence++;
|
||||||
|
@@ -586,8 +581,6 @@ static int job_ready(void *priv)
|
||||||
|
unsigned int max_to_copy;
|
||||||
|
unsigned int comp_frame_size;
|
||||||
|
|
||||||
|
- if (ctx->has_stopped)
|
||||||
|
- return 0;
|
||||||
|
if (ctx->source_changed)
|
||||||
|
return 0;
|
||||||
|
if (ctx->is_stateless || ctx->is_enc || ctx->comp_has_frame)
|
||||||
|
@@ -607,7 +600,8 @@ static int job_ready(void *priv)
|
||||||
|
if (ctx->header_size < sizeof(struct fwht_cframe_hdr)) {
|
||||||
|
state = get_next_header(ctx, &p, p_src + sz - p);
|
||||||
|
if (ctx->header_size < sizeof(struct fwht_cframe_hdr)) {
|
||||||
|
- if (ctx->is_draining && src_buf == ctx->last_src_buf)
|
||||||
|
+ if (v4l2_m2m_is_last_draining_src_buf(ctx->fh.m2m_ctx,
|
||||||
|
+ src_buf))
|
||||||
|
return 1;
|
||||||
|
job_remove_src_buf(ctx, state);
|
||||||
|
goto restart;
|
||||||
|
@@ -636,7 +630,8 @@ static int job_ready(void *priv)
|
||||||
|
p += copy;
|
||||||
|
ctx->comp_size += copy;
|
||||||
|
if (ctx->comp_size < max_to_copy) {
|
||||||
|
- if (ctx->is_draining && src_buf == ctx->last_src_buf)
|
||||||
|
+ if (v4l2_m2m_is_last_draining_src_buf(ctx->fh.m2m_ctx,
|
||||||
|
+ src_buf))
|
||||||
|
return 1;
|
||||||
|
job_remove_src_buf(ctx, state);
|
||||||
|
goto restart;
|
||||||
|
@@ -1219,41 +1214,6 @@ static int vidioc_s_selection(struct file *file, void *priv,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int vicodec_mark_last_buf(struct vicodec_ctx *ctx)
|
||||||
|
-{
|
||||||
|
- struct vb2_v4l2_buffer *next_dst_buf;
|
||||||
|
- int ret = 0;
|
||||||
|
-
|
||||||
|
- spin_lock(ctx->lock);
|
||||||
|
- if (ctx->is_draining) {
|
||||||
|
- ret = -EBUSY;
|
||||||
|
- goto unlock;
|
||||||
|
- }
|
||||||
|
- if (ctx->has_stopped)
|
||||||
|
- goto unlock;
|
||||||
|
-
|
||||||
|
- ctx->last_src_buf = v4l2_m2m_last_src_buf(ctx->fh.m2m_ctx);
|
||||||
|
- ctx->is_draining = true;
|
||||||
|
- if (ctx->last_src_buf)
|
||||||
|
- goto unlock;
|
||||||
|
-
|
||||||
|
- next_dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
|
||||||
|
- if (!next_dst_buf) {
|
||||||
|
- ctx->next_is_last = true;
|
||||||
|
- goto unlock;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- next_dst_buf->flags |= V4L2_BUF_FLAG_LAST;
|
||||||
|
- vb2_buffer_done(&next_dst_buf->vb2_buf, VB2_BUF_STATE_DONE);
|
||||||
|
- ctx->is_draining = false;
|
||||||
|
- ctx->has_stopped = true;
|
||||||
|
- v4l2_event_queue_fh(&ctx->fh, &vicodec_eos_event);
|
||||||
|
-
|
||||||
|
-unlock:
|
||||||
|
- spin_unlock(ctx->lock);
|
||||||
|
- return ret;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static int vicodec_encoder_cmd(struct file *file, void *fh,
|
||||||
|
struct v4l2_encoder_cmd *ec)
|
||||||
|
{
|
||||||
|
@@ -1268,18 +1228,19 @@ static int vicodec_encoder_cmd(struct file *file, void *fh,
|
||||||
|
!vb2_is_streaming(&ctx->fh.m2m_ctx->out_q_ctx.q))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- if (ec->cmd == V4L2_ENC_CMD_STOP)
|
||||||
|
- return vicodec_mark_last_buf(ctx);
|
||||||
|
- ret = 0;
|
||||||
|
- spin_lock(ctx->lock);
|
||||||
|
- if (ctx->is_draining) {
|
||||||
|
- ret = -EBUSY;
|
||||||
|
- } else if (ctx->has_stopped) {
|
||||||
|
- ctx->has_stopped = false;
|
||||||
|
+ ret = v4l2_m2m_ioctl_encoder_cmd(file, fh, ec);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ if (ec->cmd == V4L2_ENC_CMD_STOP &&
|
||||||
|
+ v4l2_m2m_has_stopped(ctx->fh.m2m_ctx))
|
||||||
|
+ v4l2_event_queue_fh(&ctx->fh, &vicodec_eos_event);
|
||||||
|
+
|
||||||
|
+ if (ec->cmd == V4L2_ENC_CMD_START &&
|
||||||
|
+ v4l2_m2m_has_stopped(ctx->fh.m2m_ctx))
|
||||||
|
vb2_clear_last_buffer_dequeued(&ctx->fh.m2m_ctx->cap_q_ctx.q);
|
||||||
|
- }
|
||||||
|
- spin_unlock(ctx->lock);
|
||||||
|
- return ret;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int vicodec_decoder_cmd(struct file *file, void *fh,
|
||||||
|
@@ -1296,18 +1257,19 @@ static int vicodec_decoder_cmd(struct file *file, void *fh,
|
||||||
|
!vb2_is_streaming(&ctx->fh.m2m_ctx->out_q_ctx.q))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- if (dc->cmd == V4L2_DEC_CMD_STOP)
|
||||||
|
- return vicodec_mark_last_buf(ctx);
|
||||||
|
- ret = 0;
|
||||||
|
- spin_lock(ctx->lock);
|
||||||
|
- if (ctx->is_draining) {
|
||||||
|
- ret = -EBUSY;
|
||||||
|
- } else if (ctx->has_stopped) {
|
||||||
|
- ctx->has_stopped = false;
|
||||||
|
+ ret = v4l2_m2m_ioctl_decoder_cmd(file, fh, dc);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ if (dc->cmd == V4L2_DEC_CMD_STOP &&
|
||||||
|
+ v4l2_m2m_has_stopped(ctx->fh.m2m_ctx))
|
||||||
|
+ v4l2_event_queue_fh(&ctx->fh, &vicodec_eos_event);
|
||||||
|
+
|
||||||
|
+ if (dc->cmd == V4L2_DEC_CMD_START &&
|
||||||
|
+ v4l2_m2m_has_stopped(ctx->fh.m2m_ctx))
|
||||||
|
vb2_clear_last_buffer_dequeued(&ctx->fh.m2m_ctx->cap_q_ctx.q);
|
||||||
|
- }
|
||||||
|
- spin_unlock(ctx->lock);
|
||||||
|
- return ret;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int vicodec_enum_framesizes(struct file *file, void *fh,
|
||||||
|
@@ -1480,23 +1442,21 @@ static void vicodec_buf_queue(struct vb2_buffer *vb)
|
||||||
|
.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
|
||||||
|
};
|
||||||
|
|
||||||
|
- if (vb2_is_streaming(vq_cap)) {
|
||||||
|
- if (!V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type) &&
|
||||||
|
- ctx->next_is_last) {
|
||||||
|
- unsigned int i;
|
||||||
|
+ if (!V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type) &&
|
||||||
|
+ vb2_is_streaming(vb->vb2_queue) &&
|
||||||
|
+ v4l2_m2m_dst_buf_is_last(ctx->fh.m2m_ctx)) {
|
||||||
|
+ unsigned int i;
|
||||||
|
|
||||||
|
- for (i = 0; i < vb->num_planes; i++)
|
||||||
|
- vb->planes[i].bytesused = 0;
|
||||||
|
- vbuf->flags = V4L2_BUF_FLAG_LAST;
|
||||||
|
- vbuf->field = V4L2_FIELD_NONE;
|
||||||
|
- vbuf->sequence = get_q_data(ctx, vb->vb2_queue->type)->sequence++;
|
||||||
|
- vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
|
||||||
|
- ctx->is_draining = false;
|
||||||
|
- ctx->has_stopped = true;
|
||||||
|
- ctx->next_is_last = false;
|
||||||
|
- v4l2_event_queue_fh(&ctx->fh, &vicodec_eos_event);
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
+ for (i = 0; i < vb->num_planes; i++)
|
||||||
|
+ vb->planes[i].bytesused = 0;
|
||||||
|
+
|
||||||
|
+ vbuf->field = V4L2_FIELD_NONE;
|
||||||
|
+ vbuf->sequence =
|
||||||
|
+ get_q_data(ctx, vb->vb2_queue->type)->sequence++;
|
||||||
|
+
|
||||||
|
+ v4l2_m2m_last_buffer_done(ctx->fh.m2m_ctx, vbuf);
|
||||||
|
+ v4l2_event_queue_fh(&ctx->fh, &vicodec_eos_event);
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* buf_queue handles only the first source change event */
|
||||||
|
@@ -1609,8 +1569,7 @@ static int vicodec_start_streaming(struct vb2_queue *q,
|
||||||
|
chroma_div = info->width_div * info->height_div;
|
||||||
|
q_data->sequence = 0;
|
||||||
|
|
||||||
|
- if (V4L2_TYPE_IS_OUTPUT(q->type))
|
||||||
|
- ctx->last_src_buf = NULL;
|
||||||
|
+ v4l2_m2m_start_streaming(ctx->fh.m2m_ctx, q);
|
||||||
|
|
||||||
|
state->gop_cnt = 0;
|
||||||
|
|
||||||
|
@@ -1689,29 +1648,12 @@ static void vicodec_stop_streaming(struct vb2_queue *q)
|
||||||
|
|
||||||
|
vicodec_return_bufs(q, VB2_BUF_STATE_ERROR);
|
||||||
|
|
||||||
|
- if (V4L2_TYPE_IS_OUTPUT(q->type)) {
|
||||||
|
- if (ctx->is_draining) {
|
||||||
|
- struct vb2_v4l2_buffer *next_dst_buf;
|
||||||
|
-
|
||||||
|
- spin_lock(ctx->lock);
|
||||||
|
- ctx->last_src_buf = NULL;
|
||||||
|
- next_dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
|
||||||
|
- if (!next_dst_buf) {
|
||||||
|
- ctx->next_is_last = true;
|
||||||
|
- } else {
|
||||||
|
- next_dst_buf->flags |= V4L2_BUF_FLAG_LAST;
|
||||||
|
- vb2_buffer_done(&next_dst_buf->vb2_buf, VB2_BUF_STATE_DONE);
|
||||||
|
- ctx->is_draining = false;
|
||||||
|
- ctx->has_stopped = true;
|
||||||
|
- v4l2_event_queue_fh(&ctx->fh, &vicodec_eos_event);
|
||||||
|
- }
|
||||||
|
- spin_unlock(ctx->lock);
|
||||||
|
- }
|
||||||
|
- } else {
|
||||||
|
- ctx->is_draining = false;
|
||||||
|
- ctx->has_stopped = false;
|
||||||
|
- ctx->next_is_last = false;
|
||||||
|
- }
|
||||||
|
+ v4l2_m2m_stop_streaming(ctx->fh.m2m_ctx, q);
|
||||||
|
+
|
||||||
|
+ if (V4L2_TYPE_IS_OUTPUT(q->type) &&
|
||||||
|
+ v4l2_m2m_has_stopped(ctx->fh.m2m_ctx))
|
||||||
|
+ v4l2_event_queue_fh(&ctx->fh, &vicodec_eos_event);
|
||||||
|
+
|
||||||
|
if (!ctx->is_enc && V4L2_TYPE_IS_OUTPUT(q->type))
|
||||||
|
ctx->first_source_change_sent = false;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
From 7e98de40a9470f5eed6fe93ffd6b787d9f5628ca Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maxime Jourdan <mjourdan@baylibre.com>
|
||||||
|
Date: Mon, 7 Oct 2019 16:59:08 +0200
|
||||||
|
Subject: [PATCH 069/101] FROMLIST: media: meson: vdec: bring up to compliance
|
||||||
|
|
||||||
Add all the necessary bits to pass v4l2-compliance in stateful decoding
|
Add all the necessary bits to pass v4l2-compliance in stateful decoding
|
||||||
mode.
|
mode.
|
||||||
|
@ -11,12 +15,12 @@ Signed-off-by: Maxime Jourdan <mjourdan@baylibre.com>
|
||||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
---
|
---
|
||||||
drivers/staging/media/meson/vdec/esparser.c | 58 +++++-------
|
drivers/staging/media/meson/vdec/esparser.c | 58 +++++-------
|
||||||
drivers/staging/media/meson/vdec/vdec.c | 92 ++++++++++++-------
|
drivers/staging/media/meson/vdec/vdec.c | 90 ++++++++++++-------
|
||||||
drivers/staging/media/meson/vdec/vdec.h | 14 ++-
|
drivers/staging/media/meson/vdec/vdec.h | 14 ++-
|
||||||
.../staging/media/meson/vdec/vdec_helpers.c | 85 ++++++++---------
|
.../staging/media/meson/vdec/vdec_helpers.c | 88 +++++++++---------
|
||||||
.../staging/media/meson/vdec/vdec_helpers.h | 6 +-
|
.../staging/media/meson/vdec/vdec_helpers.h | 6 +-
|
||||||
.../staging/media/meson/vdec/vdec_platform.c | 10 ++
|
.../staging/media/meson/vdec/vdec_platform.c | 10 +++
|
||||||
6 files changed, 148 insertions(+), 117 deletions(-)
|
6 files changed, 149 insertions(+), 117 deletions(-)
|
||||||
|
|
||||||
diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
|
diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
|
||||||
index 95102a4bdc62..adc5c1e81a4c 100644
|
index 95102a4bdc62..adc5c1e81a4c 100644
|
||||||
|
@ -122,10 +126,10 @@ index 95102a4bdc62..adc5c1e81a4c 100644
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
diff --git a/drivers/staging/media/meson/vdec/vdec.c b/drivers/staging/media/meson/vdec/vdec.c
|
diff --git a/drivers/staging/media/meson/vdec/vdec.c b/drivers/staging/media/meson/vdec/vdec.c
|
||||||
index a8a4c380ccc9..f03d9eba6e23 100644
|
index 5c5dabed2f09..92f0258868b1 100644
|
||||||
--- a/drivers/staging/media/meson/vdec/vdec.c
|
--- a/drivers/staging/media/meson/vdec/vdec.c
|
||||||
+++ b/drivers/staging/media/meson/vdec/vdec.c
|
+++ b/drivers/staging/media/meson/vdec/vdec.c
|
||||||
@@ -166,7 +166,10 @@ static void process_num_buffers(struct vb2_queue *q,
|
@@ -168,7 +168,10 @@ static void process_num_buffers(struct vb2_queue *q,
|
||||||
{
|
{
|
||||||
const struct amvdec_format *fmt_out = sess->fmt_out;
|
const struct amvdec_format *fmt_out = sess->fmt_out;
|
||||||
unsigned int buffers_total = q->num_buffers + *num_buffers;
|
unsigned int buffers_total = q->num_buffers + *num_buffers;
|
||||||
|
@ -136,7 +140,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
if (is_reqbufs && buffers_total < fmt_out->min_buffers)
|
if (is_reqbufs && buffers_total < fmt_out->min_buffers)
|
||||||
*num_buffers = fmt_out->min_buffers - q->num_buffers;
|
*num_buffers = fmt_out->min_buffers - q->num_buffers;
|
||||||
if (buffers_total > fmt_out->max_buffers)
|
if (buffers_total > fmt_out->max_buffers)
|
||||||
@@ -191,7 +194,8 @@ static int vdec_queue_setup(struct vb2_queue *q, unsigned int *num_buffers,
|
@@ -193,7 +196,8 @@ static int vdec_queue_setup(struct vb2_queue *q, unsigned int *num_buffers,
|
||||||
if (*num_planes) {
|
if (*num_planes) {
|
||||||
switch (q->type) {
|
switch (q->type) {
|
||||||
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
||||||
|
@ -146,7 +150,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
break;
|
break;
|
||||||
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
||||||
@@ -222,7 +226,7 @@ static int vdec_queue_setup(struct vb2_queue *q, unsigned int *num_buffers,
|
@@ -224,7 +228,7 @@ static int vdec_queue_setup(struct vb2_queue *q, unsigned int *num_buffers,
|
||||||
|
|
||||||
switch (q->type) {
|
switch (q->type) {
|
||||||
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
||||||
|
@ -155,7 +159,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
*num_planes = 1;
|
*num_planes = 1;
|
||||||
break;
|
break;
|
||||||
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
||||||
@@ -248,6 +252,7 @@ static int vdec_queue_setup(struct vb2_queue *q, unsigned int *num_buffers,
|
@@ -250,6 +254,7 @@ static int vdec_queue_setup(struct vb2_queue *q, unsigned int *num_buffers,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,7 +167,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,10 +264,11 @@ static void vdec_vb2_buf_queue(struct vb2_buffer *vb)
|
@@ -261,10 +266,11 @@ static void vdec_vb2_buf_queue(struct vb2_buffer *vb)
|
||||||
|
|
||||||
v4l2_m2m_buf_queue(m2m_ctx, vbuf);
|
v4l2_m2m_buf_queue(m2m_ctx, vbuf);
|
||||||
|
|
||||||
|
@ -177,7 +181,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
vdec_codec_needs_recycle(sess))
|
vdec_codec_needs_recycle(sess))
|
||||||
vdec_queue_recycle(sess, vb);
|
vdec_queue_recycle(sess, vb);
|
||||||
|
|
||||||
@@ -287,16 +293,22 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count)
|
@@ -289,16 +295,22 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count)
|
||||||
else
|
else
|
||||||
sess->streamon_cap = 1;
|
sess->streamon_cap = 1;
|
||||||
|
|
||||||
|
@ -202,7 +206,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
sess->vififo_size = SIZE_VIFIFO;
|
sess->vififo_size = SIZE_VIFIFO;
|
||||||
sess->vififo_vaddr =
|
sess->vififo_vaddr =
|
||||||
dma_alloc_coherent(sess->core->dev, sess->vififo_size,
|
dma_alloc_coherent(sess->core->dev, sess->vififo_size,
|
||||||
@@ -321,13 +333,14 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count)
|
@@ -323,13 +335,14 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count)
|
||||||
goto vififo_free;
|
goto vififo_free;
|
||||||
|
|
||||||
sess->sequence_cap = 0;
|
sess->sequence_cap = 0;
|
||||||
|
@ -219,7 +223,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
vififo_free:
|
vififo_free:
|
||||||
@@ -384,6 +397,7 @@ static void vdec_stop_streaming(struct vb2_queue *q)
|
@@ -386,6 +399,7 @@ static void vdec_stop_streaming(struct vb2_queue *q)
|
||||||
struct vb2_v4l2_buffer *buf;
|
struct vb2_v4l2_buffer *buf;
|
||||||
|
|
||||||
if (sess->status == STATUS_RUNNING ||
|
if (sess->status == STATUS_RUNNING ||
|
||||||
|
@ -227,7 +231,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
(sess->status == STATUS_NEEDS_RESUME &&
|
(sess->status == STATUS_NEEDS_RESUME &&
|
||||||
(!sess->streamon_out || !sess->streamon_cap))) {
|
(!sess->streamon_out || !sess->streamon_cap))) {
|
||||||
if (vdec_codec_needs_recycle(sess))
|
if (vdec_codec_needs_recycle(sess))
|
||||||
@@ -474,20 +488,33 @@ vdec_try_fmt_common(struct amvdec_session *sess, u32 size,
|
@@ -476,20 +490,34 @@ vdec_try_fmt_common(struct amvdec_session *sess, u32 size,
|
||||||
struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;
|
struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;
|
||||||
struct v4l2_plane_pix_format *pfmt = pixmp->plane_fmt;
|
struct v4l2_plane_pix_format *pfmt = pixmp->plane_fmt;
|
||||||
const struct amvdec_format *fmts = sess->core->platform->formats;
|
const struct amvdec_format *fmts = sess->core->platform->formats;
|
||||||
|
@ -261,11 +265,12 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
+ output_size = get_output_size(pixmp->width, pixmp->height);
|
+ output_size = get_output_size(pixmp->width, pixmp->height);
|
||||||
+
|
+
|
||||||
+ if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
|
+ if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
|
||||||
+ pfmt[0].sizeimage = sess->src_buffer_size;
|
+ if (!pfmt[0].sizeimage)
|
||||||
|
+ pfmt[0].sizeimage = sess->src_buffer_size;
|
||||||
pfmt[0].bytesperline = 0;
|
pfmt[0].bytesperline = 0;
|
||||||
pixmp->num_planes = 1;
|
pixmp->num_planes = 1;
|
||||||
} else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
|
} else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
|
||||||
@@ -497,35 +524,25 @@ vdec_try_fmt_common(struct amvdec_session *sess, u32 size,
|
@@ -499,35 +527,25 @@ vdec_try_fmt_common(struct amvdec_session *sess, u32 size,
|
||||||
|
|
||||||
memset(pfmt[1].reserved, 0, sizeof(pfmt[1].reserved));
|
memset(pfmt[1].reserved, 0, sizeof(pfmt[1].reserved));
|
||||||
if (pixmp->pixelformat == V4L2_PIX_FMT_NV12M) {
|
if (pixmp->pixelformat == V4L2_PIX_FMT_NV12M) {
|
||||||
|
@ -306,7 +311,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
if (pixmp->field == V4L2_FIELD_ANY)
|
if (pixmp->field == V4L2_FIELD_ANY)
|
||||||
pixmp->field = V4L2_FIELD_NONE;
|
pixmp->field = V4L2_FIELD_NONE;
|
||||||
|
|
||||||
@@ -584,6 +601,8 @@ static int vdec_s_fmt(struct file *file, void *fh, struct v4l2_format *f)
|
@@ -586,6 +604,8 @@ static int vdec_s_fmt(struct file *file, void *fh, struct v4l2_format *f)
|
||||||
orig_pixmp = *pixmp;
|
orig_pixmp = *pixmp;
|
||||||
|
|
||||||
fmt_out = vdec_try_fmt_common(sess, num_formats, f);
|
fmt_out = vdec_try_fmt_common(sess, num_formats, f);
|
||||||
|
@ -315,7 +320,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
|
|
||||||
if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
|
if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
|
||||||
pixfmt_out = pixmp->pixelformat;
|
pixfmt_out = pixmp->pixelformat;
|
||||||
@@ -608,6 +627,7 @@ static int vdec_s_fmt(struct file *file, void *fh, struct v4l2_format *f)
|
@@ -610,6 +630,7 @@ static int vdec_s_fmt(struct file *file, void *fh, struct v4l2_format *f)
|
||||||
sess->ycbcr_enc = pixmp->ycbcr_enc;
|
sess->ycbcr_enc = pixmp->ycbcr_enc;
|
||||||
sess->quantization = pixmp->quantization;
|
sess->quantization = pixmp->quantization;
|
||||||
sess->xfer_func = pixmp->xfer_func;
|
sess->xfer_func = pixmp->xfer_func;
|
||||||
|
@ -323,14 +328,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&format, 0, sizeof(format));
|
memset(&format, 0, sizeof(format));
|
||||||
@@ -696,32 +716,35 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
|
@@ -701,29 +722,31 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
+ ret = v4l2_m2m_ioctl_decoder_cmd(file, fh, cmd);
|
|
||||||
+ if (ret)
|
|
||||||
+ return ret;
|
|
||||||
+
|
|
||||||
if (!(sess->streamon_out & sess->streamon_cap))
|
if (!(sess->streamon_out & sess->streamon_cap))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -340,6 +338,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
- */
|
- */
|
||||||
- if (cmd->cmd == V4L2_DEC_CMD_START)
|
- if (cmd->cmd == V4L2_DEC_CMD_START)
|
||||||
+ if (cmd->cmd == V4L2_DEC_CMD_START) {
|
+ if (cmd->cmd == V4L2_DEC_CMD_START) {
|
||||||
|
+ v4l2_m2m_clear_state(sess->m2m_ctx);
|
||||||
+ sess->should_stop = 0;
|
+ sess->should_stop = 0;
|
||||||
return 0;
|
return 0;
|
||||||
+ }
|
+ }
|
||||||
|
@ -349,10 +348,11 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
dev_dbg(dev, "Received V4L2_DEC_CMD_STOP\n");
|
dev_dbg(dev, "Received V4L2_DEC_CMD_STOP\n");
|
||||||
- sess->should_stop = 1;
|
+
|
||||||
|
sess->should_stop = 1;
|
||||||
|
|
||||||
- vdec_wait_inactive(sess);
|
- vdec_wait_inactive(sess);
|
||||||
+ sess->should_stop = 1;
|
+ v4l2_m2m_mark_stopped(sess->m2m_ctx);
|
||||||
|
|
||||||
if (codec_ops->drain) {
|
if (codec_ops->drain) {
|
||||||
+ vdec_wait_inactive(sess);
|
+ vdec_wait_inactive(sess);
|
||||||
|
@ -366,7 +366,7 @@ index a8a4c380ccc9..f03d9eba6e23 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -881,6 +904,7 @@ static int vdec_open(struct file *file)
|
@@ -883,6 +906,7 @@ static int vdec_open(struct file *file)
|
||||||
sess->height = 720;
|
sess->height = 720;
|
||||||
sess->pixelaspect.numerator = 1;
|
sess->pixelaspect.numerator = 1;
|
||||||
sess->pixelaspect.denominator = 1;
|
sess->pixelaspect.denominator = 1;
|
||||||
|
@ -437,7 +437,7 @@ index 0faa1ec4858e..f95445ac0658 100644
|
||||||
u8 canvas_alloc[MAX_CANVAS];
|
u8 canvas_alloc[MAX_CANVAS];
|
||||||
u32 canvas_num;
|
u32 canvas_num;
|
||||||
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.c b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.c b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||||
index f16948bdbf2f..ff4333074197 100644
|
index f16948bdbf2f..a4970ec1bf2e 100644
|
||||||
--- a/drivers/staging/media/meson/vdec/vdec_helpers.c
|
--- a/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||||
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||||
@@ -200,33 +200,23 @@ int amvdec_set_canvases(struct amvdec_session *sess,
|
@@ -200,33 +200,23 @@ int amvdec_set_canvases(struct amvdec_session *sess,
|
||||||
|
@ -609,7 +609,7 @@ index f16948bdbf2f..ff4333074197 100644
|
||||||
if (match)
|
if (match)
|
||||||
atomic_dec(&sess->esparser_queued_bufs);
|
atomic_dec(&sess->esparser_queued_bufs);
|
||||||
}
|
}
|
||||||
@@ -420,7 +413,8 @@ void amvdec_src_change(struct amvdec_session *sess, u32 width,
|
@@ -420,16 +413,19 @@ void amvdec_src_change(struct amvdec_session *sess, u32 width,
|
||||||
|
|
||||||
v4l2_ctrl_s_ctrl(sess->ctrl_min_buf_capture, dpb_size);
|
v4l2_ctrl_s_ctrl(sess->ctrl_min_buf_capture, dpb_size);
|
||||||
|
|
||||||
|
@ -618,8 +618,12 @@ index f16948bdbf2f..ff4333074197 100644
|
||||||
+ * Check if the capture queue is already configured well for our
|
+ * Check if the capture queue is already configured well for our
|
||||||
* usecase. If so, keep decoding with it and do not send the event
|
* usecase. If so, keep decoding with it and do not send the event
|
||||||
*/
|
*/
|
||||||
if (sess->width == width &&
|
- if (sess->width == width &&
|
||||||
@@ -430,6 +424,7 @@ void amvdec_src_change(struct amvdec_session *sess, u32 width,
|
+ if (sess->streamon_cap &&
|
||||||
|
+ sess->width == width &&
|
||||||
|
sess->height == height &&
|
||||||
|
dpb_size <= sess->num_dst_bufs) {
|
||||||
|
sess->fmt_out->codec_ops->resume(sess);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -733,3 +737,6 @@ index ea39f8209ec7..066d4a055894 100644
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
From 8da23dde82b2860f71b332168d6292800fd88aa0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maxime Jourdan <mjourdan@baylibre.com>
|
||||||
|
Date: Mon, 7 Oct 2019 16:59:09 +0200
|
||||||
|
Subject: [PATCH 070/101] FROMLIST: media: meson: vdec: add H.264 decoding
|
||||||
|
support
|
||||||
|
|
||||||
Add support for the H264 compressed format (V4L2_PIX_FMT_H264).
|
Add support for the H264 compressed format (V4L2_PIX_FMT_H264).
|
||||||
|
|
||||||
|
@ -635,3 +640,6 @@ index 066d4a055894..e9356a46828f 100644
|
||||||
.pixfmt = V4L2_PIX_FMT_MPEG1,
|
.pixfmt = V4L2_PIX_FMT_MPEG1,
|
||||||
.min_buffers = 8,
|
.min_buffers = 8,
|
||||||
.max_buffers = 8,
|
.max_buffers = 8,
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
From 9ed0f54432f6ef39cd94245b8578b664bf3f3a98 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
Date: Wed, 4 Dec 2019 10:40:13 +0100
|
||||||
|
Subject: [PATCH 071/101] FROMLIST: media: meson: vdec: align stride on 32
|
||||||
|
bytes
|
||||||
|
|
||||||
The HEVC/VP9 aligns the plane stride on 32, so align the planes stride
|
The HEVC/VP9 aligns the plane stride on 32, so align the planes stride
|
||||||
for all codecs to 32 to satisfy HEVC/VP9 decoding using the "HEVC" HW.
|
for all codecs to 32 to satisfy HEVC/VP9 decoding using the "HEVC" HW.
|
||||||
|
@ -23,10 +28,10 @@ Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
2 files changed, 7 insertions(+), 7 deletions(-)
|
2 files changed, 7 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
diff --git a/drivers/staging/media/meson/vdec/vdec.c b/drivers/staging/media/meson/vdec/vdec.c
|
diff --git a/drivers/staging/media/meson/vdec/vdec.c b/drivers/staging/media/meson/vdec/vdec.c
|
||||||
index f03d9eba6e23..bd59d32b92ae 100644
|
index 92f0258868b1..bfca4c82aa56 100644
|
||||||
--- a/drivers/staging/media/meson/vdec/vdec.c
|
--- a/drivers/staging/media/meson/vdec/vdec.c
|
||||||
+++ b/drivers/staging/media/meson/vdec/vdec.c
|
+++ b/drivers/staging/media/meson/vdec/vdec.c
|
||||||
@@ -525,20 +525,20 @@ vdec_try_fmt_common(struct amvdec_session *sess, u32 size,
|
@@ -528,20 +528,20 @@ vdec_try_fmt_common(struct amvdec_session *sess, u32 size,
|
||||||
memset(pfmt[1].reserved, 0, sizeof(pfmt[1].reserved));
|
memset(pfmt[1].reserved, 0, sizeof(pfmt[1].reserved));
|
||||||
if (pixmp->pixelformat == V4L2_PIX_FMT_NV12M) {
|
if (pixmp->pixelformat == V4L2_PIX_FMT_NV12M) {
|
||||||
pfmt[0].sizeimage = output_size;
|
pfmt[0].sizeimage = output_size;
|
||||||
|
@ -53,7 +58,7 @@ index f03d9eba6e23..bd59d32b92ae 100644
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.c b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.c b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||||
index ff4333074197..fc59d8801643 100644
|
index a4970ec1bf2e..3f7929c54dc6 100644
|
||||||
--- a/drivers/staging/media/meson/vdec/vdec_helpers.c
|
--- a/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||||
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||||
@@ -154,8 +154,8 @@ int amvdec_set_canvases(struct amvdec_session *sess,
|
@@ -154,8 +154,8 @@ int amvdec_set_canvases(struct amvdec_session *sess,
|
||||||
|
@ -67,3 +72,6 @@ index ff4333074197..fc59d8801643 100644
|
||||||
u32 reg_cur = reg_base[0];
|
u32 reg_cur = reg_base[0];
|
||||||
u32 reg_num_cur = 0;
|
u32 reg_num_cur = 0;
|
||||||
u32 reg_base_cur = 0;
|
u32 reg_base_cur = 0;
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
|
From 3e45cf374d1354be91a6034c5429d8dcf6855a42 Mon Sep 17 00:00:00 2001
|
||||||
From: Maxime Jourdan <mjourdan@baylibre.com>
|
From: Maxime Jourdan <mjourdan@baylibre.com>
|
||||||
|
Date: Sun, 21 Oct 2018 15:15:26 +0200
|
||||||
|
Subject: [PATCH 072/101] FROMLIST: media: meson: vdec: add helpers for
|
||||||
|
lossless framebuffer compression buffers
|
||||||
|
|
||||||
Add helpers to support the lossless framebuffer compression format that
|
Add helpers to support the lossless framebuffer compression format that
|
||||||
will be used in HEVC & VP9 decoders when decoding 10bit content for
|
will be used in HEVC & VP9 decoders when decoding 10bit content for
|
||||||
|
@ -13,7 +16,7 @@ Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
2 files changed, 31 insertions(+)
|
2 files changed, 31 insertions(+)
|
||||||
|
|
||||||
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.c b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.c b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||||
index fc59d8801643..818064b6b4d0 100644
|
index 3f7929c54dc6..caec0fb60338 100644
|
||||||
--- a/drivers/staging/media/meson/vdec/vdec_helpers.c
|
--- a/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||||
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||||
@@ -50,6 +50,33 @@ void amvdec_write_parser(struct amvdec_core *core, u32 reg, u32 val)
|
@@ -50,6 +50,33 @@ void amvdec_write_parser(struct amvdec_core *core, u32 reg, u32 val)
|
||||||
|
@ -65,3 +68,6 @@ index 165e6293ffba..cfaed52ab526 100644
|
||||||
/**
|
/**
|
||||||
* amvdec_dst_buf_done_idx() - Signal that a buffer is done decoding
|
* amvdec_dst_buf_done_idx() - Signal that a buffer is done decoding
|
||||||
*
|
*
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
From 35e5d799faf9c46c69ab0f93141ea6669d22217c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maxime Jourdan <mjourdan@baylibre.com>
|
||||||
|
Date: Wed, 29 Aug 2018 18:48:35 +0200
|
||||||
|
Subject: [PATCH 073/101] FROMLIST: media: meson: vdec: add common HEVC decoder
|
||||||
|
support
|
||||||
|
|
||||||
Add support for the HEVC & VP9 common decoder support, handling
|
Add support for the HEVC & VP9 common decoder support, handling
|
||||||
Amlogic GXBB, GXL, G12A and SM1 platforms.
|
Amlogic GXBB, GXL, G12A and SM1 platforms.
|
||||||
|
@ -9,12 +14,12 @@ Signed-off-by: Maxime Jourdan <mjourdan@baylibre.com>
|
||||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
---
|
---
|
||||||
drivers/staging/media/meson/vdec/Makefile | 4 +-
|
drivers/staging/media/meson/vdec/Makefile | 4 +-
|
||||||
.../media/meson/vdec/codec_hevc_common.c | 285 ++++++++++++++++++
|
.../media/meson/vdec/codec_hevc_common.c | 286 ++++++++++++++++++
|
||||||
.../media/meson/vdec/codec_hevc_common.h | 77 +++++
|
.../media/meson/vdec/codec_hevc_common.h | 77 +++++
|
||||||
drivers/staging/media/meson/vdec/hevc_regs.h | 211 +++++++++++++
|
drivers/staging/media/meson/vdec/hevc_regs.h | 211 +++++++++++++
|
||||||
drivers/staging/media/meson/vdec/vdec_hevc.c | 231 ++++++++++++++
|
drivers/staging/media/meson/vdec/vdec_hevc.c | 231 ++++++++++++++
|
||||||
drivers/staging/media/meson/vdec/vdec_hevc.h | 13 +
|
drivers/staging/media/meson/vdec/vdec_hevc.h | 13 +
|
||||||
6 files changed, 819 insertions(+), 2 deletions(-)
|
6 files changed, 820 insertions(+), 2 deletions(-)
|
||||||
create mode 100644 drivers/staging/media/meson/vdec/codec_hevc_common.c
|
create mode 100644 drivers/staging/media/meson/vdec/codec_hevc_common.c
|
||||||
create mode 100644 drivers/staging/media/meson/vdec/codec_hevc_common.h
|
create mode 100644 drivers/staging/media/meson/vdec/codec_hevc_common.h
|
||||||
create mode 100644 drivers/staging/media/meson/vdec/hevc_regs.h
|
create mode 100644 drivers/staging/media/meson/vdec/hevc_regs.h
|
||||||
|
@ -37,10 +42,10 @@ index 711d990c760e..f55b6e625034 100644
|
||||||
obj-$(CONFIG_VIDEO_MESON_VDEC) += meson-vdec.o
|
obj-$(CONFIG_VIDEO_MESON_VDEC) += meson-vdec.o
|
||||||
diff --git a/drivers/staging/media/meson/vdec/codec_hevc_common.c b/drivers/staging/media/meson/vdec/codec_hevc_common.c
|
diff --git a/drivers/staging/media/meson/vdec/codec_hevc_common.c b/drivers/staging/media/meson/vdec/codec_hevc_common.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 000000000000..72a4e38a42dc
|
index 000000000000..335bcba062ac
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/drivers/staging/media/meson/vdec/codec_hevc_common.c
|
+++ b/drivers/staging/media/meson/vdec/codec_hevc_common.c
|
||||||
@@ -0,0 +1,285 @@
|
@@ -0,0 +1,286 @@
|
||||||
+// SPDX-License-Identifier: GPL-2.0+
|
+// SPDX-License-Identifier: GPL-2.0+
|
||||||
+/*
|
+/*
|
||||||
+ * Copyright (C) 2018 Maxime Jourdan <mjourdan@baylibre.com>
|
+ * Copyright (C) 2018 Maxime Jourdan <mjourdan@baylibre.com>
|
||||||
|
@ -75,7 +80,8 @@ index 000000000000..72a4e38a42dc
|
||||||
+ else
|
+ else
|
||||||
+ amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, 0);
|
+ amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, 0);
|
||||||
+
|
+
|
||||||
+ amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL2, body_size / 32);
|
+ if (core->platform->revision < VDEC_REVISION_SM1)
|
||||||
|
+ amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL2, body_size / 32);
|
||||||
+ amvdec_write_dos(core, HEVC_CM_BODY_LENGTH, body_size);
|
+ amvdec_write_dos(core, HEVC_CM_BODY_LENGTH, body_size);
|
||||||
+ amvdec_write_dos(core, HEVC_CM_HEADER_OFFSET, body_size);
|
+ amvdec_write_dos(core, HEVC_CM_HEADER_OFFSET, body_size);
|
||||||
+ amvdec_write_dos(core, HEVC_CM_HEADER_LENGTH, head_size);
|
+ amvdec_write_dos(core, HEVC_CM_HEADER_LENGTH, head_size);
|
||||||
|
@ -882,3 +888,6 @@ index 000000000000..cd576a73a966
|
||||||
+extern struct amvdec_ops vdec_hevc_ops;
|
+extern struct amvdec_ops vdec_hevc_ops;
|
||||||
+
|
+
|
||||||
+#endif
|
+#endif
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -1,15 +1,24 @@
|
||||||
|
From e5bdd55cfa544e1f5e74917dbfb9cc8a0635dcfe Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maxime Jourdan <mjourdan@baylibre.com>
|
||||||
|
Date: Thu, 17 Jan 2019 16:59:11 +0100
|
||||||
|
Subject: [PATCH 074/101] FROMLIST: media: meson: vdec: add VP9 input support
|
||||||
|
|
||||||
Amlogic VP9 decoder requires an additional 16-byte payload before every
|
Amlogic VP9 decoder requires an additional 16-byte payload before every
|
||||||
frame header.
|
frame header.
|
||||||
|
|
||||||
|
The source buffer is updated in-place, then given to the Parser FIFO DMA.
|
||||||
|
|
||||||
|
The FIFO DMA copies the blocks into the 16MiB parser ring buffer, then parses
|
||||||
|
and copies the slice into the decoder "workspace".
|
||||||
|
|
||||||
Signed-off-by: Maxime Jourdan <mjourdan@baylibre.com>
|
Signed-off-by: Maxime Jourdan <mjourdan@baylibre.com>
|
||||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
---
|
---
|
||||||
drivers/staging/media/meson/vdec/esparser.c | 142 +++++++++++++++++++-
|
drivers/staging/media/meson/vdec/esparser.c | 150 +++++++++++++++++++-
|
||||||
1 file changed, 138 insertions(+), 4 deletions(-)
|
1 file changed, 146 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
|
diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
|
||||||
index adc5c1e81a4c..aeb68f6c732a 100644
|
index adc5c1e81a4c..4a9aad3fafeb 100644
|
||||||
--- a/drivers/staging/media/meson/vdec/esparser.c
|
--- a/drivers/staging/media/meson/vdec/esparser.c
|
||||||
+++ b/drivers/staging/media/meson/vdec/esparser.c
|
+++ b/drivers/staging/media/meson/vdec/esparser.c
|
||||||
@@ -52,6 +52,7 @@
|
@@ -52,6 +52,7 @@
|
||||||
|
@ -144,7 +153,7 @@ index adc5c1e81a4c..aeb68f6c732a 100644
|
||||||
u32 pad_size = 0;
|
u32 pad_size = 0;
|
||||||
u8 *vaddr = vb2_plane_vaddr(vb, 0);
|
u8 *vaddr = vb2_plane_vaddr(vb, 0);
|
||||||
|
|
||||||
@@ -186,13 +294,27 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
@@ -186,13 +294,35 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
||||||
int ret;
|
int ret;
|
||||||
struct vb2_buffer *vb = &vbuf->vb2_buf;
|
struct vb2_buffer *vb = &vbuf->vb2_buf;
|
||||||
struct amvdec_core *core = sess->core;
|
struct amvdec_core *core = sess->core;
|
||||||
|
@ -156,13 +165,21 @@ index adc5c1e81a4c..aeb68f6c732a 100644
|
||||||
u32 pad_size;
|
u32 pad_size;
|
||||||
|
|
||||||
- if (esparser_vififo_get_free_space(sess) < payload_size)
|
- if (esparser_vififo_get_free_space(sess) < payload_size)
|
||||||
|
+ /*
|
||||||
|
+ * When max ref frame is held by VP9, this should be -= 3 to prevent a
|
||||||
|
+ * shortage of CAPTURE buffers on the decoder side.
|
||||||
|
+ * For the future, a good enhancement of the way this is handled could
|
||||||
|
+ * be to notify new capture buffers to the decoding modules, so that
|
||||||
|
+ * they could pause when there is no capture buffer available and
|
||||||
|
+ * resume on this notification.
|
||||||
|
+ */
|
||||||
+ if (sess->fmt_out->pixfmt == V4L2_PIX_FMT_VP9) {
|
+ if (sess->fmt_out->pixfmt == V4L2_PIX_FMT_VP9) {
|
||||||
+ if (codec_ops->num_pending_bufs)
|
+ if (codec_ops->num_pending_bufs)
|
||||||
+ num_dst_bufs = codec_ops->num_pending_bufs(sess);
|
+ num_dst_bufs = codec_ops->num_pending_bufs(sess);
|
||||||
+
|
+
|
||||||
+ num_dst_bufs += v4l2_m2m_num_dst_bufs_ready(sess->m2m_ctx);
|
+ num_dst_bufs += v4l2_m2m_num_dst_bufs_ready(sess->m2m_ctx);
|
||||||
+ if (sess->fmt_out->pixfmt == V4L2_PIX_FMT_VP9)
|
+ if (sess->fmt_out->pixfmt == V4L2_PIX_FMT_VP9)
|
||||||
+ num_dst_bufs -= 2;
|
+ num_dst_bufs -= 3;
|
||||||
+
|
+
|
||||||
+ if (esparser_vififo_get_free_space(sess) < payload_size ||
|
+ if (esparser_vififo_get_free_space(sess) < payload_size ||
|
||||||
+ atomic_read(&sess->esparser_queued_bufs) >= num_dst_bufs)
|
+ atomic_read(&sess->esparser_queued_bufs) >= num_dst_bufs)
|
||||||
|
@ -173,7 +190,7 @@ index adc5c1e81a4c..aeb68f6c732a 100644
|
||||||
|
|
||||||
v4l2_m2m_src_buf_remove_by_buf(sess->m2m_ctx, vbuf);
|
v4l2_m2m_src_buf_remove_by_buf(sess->m2m_ctx, vbuf);
|
||||||
|
|
||||||
@@ -206,7 +328,19 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
@@ -206,7 +336,19 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
||||||
vbuf->field = V4L2_FIELD_NONE;
|
vbuf->field = V4L2_FIELD_NONE;
|
||||||
vbuf->sequence = sess->sequence_out++;
|
vbuf->sequence = sess->sequence_out++;
|
||||||
|
|
||||||
|
@ -194,3 +211,6 @@ index adc5c1e81a4c..aeb68f6c732a 100644
|
||||||
ret = esparser_write_data(core, phy, payload_size + pad_size);
|
ret = esparser_write_data(core, phy, payload_size + pad_size);
|
||||||
|
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue