diff --git a/arch/arm64/boot/dts/apple/t6030.dtsi b/arch/arm64/boot/dts/apple/t6030.dtsi index 6918f022faab8a..0de0f31068020f 100644 --- a/arch/arm64/boot/dts/apple/t6030.dtsi +++ b/arch/arm64/boot/dts/apple/t6030.dtsi @@ -13,6 +13,8 @@ #include #include +#define NO_ISP_YET 1 + / { #address-cells = <2>; #size-cells = <2>; diff --git a/arch/arm64/boot/dts/apple/t6031-die0.dtsi b/arch/arm64/boot/dts/apple/t6031-die0.dtsi index e0d1c50c23d2ea..8dd38e5c68b522 100644 --- a/arch/arm64/boot/dts/apple/t6031-die0.dtsi +++ b/arch/arm64/boot/dts/apple/t6031-die0.dtsi @@ -238,6 +238,60 @@ }; }; + isp_dart0: iommu@38e4a8000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x3 0x8e4a8000 0x0 0x4000>; + #iommu-cells = <1>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_isp_sys>; + + apple,dma-range = <0x100 0x0 0x1 0x0>; + status = "disabled"; + }; + + isp_dart1: iommu@38e4b4000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x3 0x8e4b4000 0x0 0x4000>; + #iommu-cells = <1>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_isp_sys>; + + apple,dma-range = <0x100 0x0 0x1 0x0>; + status = "disabled"; + }; + + isp_dart2: iommu@38e4bc000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x3 0x8e4bc000 0x0 0x4000>; + #iommu-cells = <1>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_isp_sys>; + + apple,dma-range = <0x100 0x0 0x1 0x0>; + status = "disabled"; + }; + + isp: isp@38c000000 { + compatible = "apple,t6031-isp"; + iommus = <&isp_dart0 0>, <&isp_dart1 0>, <&isp_dart2 0>; + reg-names = "coproc", "mbox", "gpio", "mbox2"; + reg = <0x3 0x8c000000 0x0 0x2000000>, + <0x3 0x8e4c4000 0x0 0x100>, + <0x3 0x8e4c41d0 0x0 0x100>, + <0x3 0x8e4c4458 0x0 0x100>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_isp_cpu>, <&ps_isp_fe>, + <&ps_dprx>, <&ps_isp_secure>, <&ps_isp_be>, + <&ps_isp_clr>; + apple,dart-vm-size = <0x0 0xa0000000>; + + status = "disabled"; + }; + i2c0: i2c@391010000 { compatible = "apple,t6031-i2c", "apple,t8103-i2c"; reg = <0x3 0x91010000 0x0 0x4000>; diff --git a/arch/arm64/boot/dts/apple/t6032.dtsi b/arch/arm64/boot/dts/apple/t6032.dtsi index dbbce59da2de41..03393258240c41 100644 --- a/arch/arm64/boot/dts/apple/t6032.dtsi +++ b/arch/arm64/boot/dts/apple/t6032.dtsi @@ -367,6 +367,10 @@ /delete-node/ &ps_disp_sys_die1; /* delete non-present ISP power-states */ +/delete-node/ &isp_dart0; +/delete-node/ &isp_dart1; +/delete-node/ &isp_dart2; +/delete-node/ &isp; /delete-node/ &ps_dprx; /delete-node/ &ps_dprx_die1; /delete-node/ &ps_isp_be; diff --git a/arch/arm64/boot/dts/apple/t603x-j514-j516.dtsi b/arch/arm64/boot/dts/apple/t603x-j514-j516.dtsi index 9afac0db13ea21..282109b4b907a2 100644 --- a/arch/arm64/boot/dts/apple/t603x-j514-j516.dtsi +++ b/arch/arm64/boot/dts/apple/t603x-j514-j516.dtsi @@ -289,6 +289,14 @@ }; }; +#ifndef NO_ISP_YET +&isp { + apple,platform-id = <9>; +}; + +#include "isp-imx558-cfg0.dtsi" +#endif + #include "spi1-nvram.dtsi" #include "hwmon-common.dtsi" #include "hwmon-fan-dual.dtsi" diff --git a/drivers/media/platform/apple/isp/isp-drv.c b/drivers/media/platform/apple/isp/isp-drv.c index 848f7abd535a7f..c8169a4f99125e 100644 --- a/drivers/media/platform/apple/isp/isp-drv.c +++ b/drivers/media/platform/apple/isp/isp-drv.c @@ -17,6 +17,7 @@ #include "isp-cam.h" #include "isp-fw.h" #include "isp-iommu.h" +#include "isp-regs.h" #include "isp-v4l2.h" static void apple_isp_detach_genpd(struct apple_isp *isp) @@ -224,6 +225,8 @@ static const char * isp_fw2str(enum isp_firmware_version version) return "12.4"; case ISP_FIRMWARE_V_13_5: return "13.5"; + case ISP_FIRMWARE_V_14_7: + return "14.7"; default: return "unknown"; } @@ -248,6 +251,8 @@ static enum isp_firmware_version isp_read_fw_version(struct device *dev, return ISP_FIRMWARE_V_12_4; else if (ver[0] == 13 && ver[1] == 5 && ver[2] == 0) return ISP_FIRMWARE_V_13_5; + else if (ver[0] == 14 && ver[1] == 7 && ver[2] == 0) + return ISP_FIRMWARE_V_14_7; dev_warn(dev, "unknown %s: %d.%d.%d\n", name, ver[0], ver[1], ver[2]); break; @@ -454,6 +459,7 @@ static const struct apple_isp_hw apple_isp_hw_t8103 = { .bandwidth_base = 0x23bc3c000, .bandwidth_bit = 0x0, .bandwidth_size = 0x4, + .mbox_irq_enable = ISP_MBOX_IRQ_ENABLE, .scl1 = false, .lpdp = false, @@ -482,6 +488,7 @@ static const struct apple_isp_hw apple_isp_hw_t6000 = { .bandwidth_base = 0x0, .bandwidth_bit = 0x0, .bandwidth_size = 0x8, + .mbox_irq_enable = ISP_MBOX_IRQ_ENABLE, .scl1 = false, .lpdp = false, @@ -504,6 +511,7 @@ static const struct apple_isp_hw apple_isp_hw_t8112 = { .bandwidth_base = 0x0, .bandwidth_bit = 0x0, .bandwidth_size = 0x8, + .mbox_irq_enable = ISP_MBOX_IRQ_ENABLE, .scl1 = false, .lpdp = false, @@ -526,17 +534,35 @@ static const struct apple_isp_hw apple_isp_hw_t6020 = { .bandwidth_base = 0x0, .bandwidth_bit = 0x0, .bandwidth_size = 0x8, + .mbox_irq_enable = ISP_MBOX_IRQ_ENABLE, .scl1 = true, .lpdp = true, .meta_size = ISP_META_SIZE_T8112, }; +static const struct apple_isp_hw apple_isp_hw_t6031 = { + .gen = ISP_GEN_T6031, + .pmu_base = 0x292284008, + + .dsid_count = 1, + .dsid_clr_base0 = 0x200f14000, + .dsid_clr_range0 = 0x1000, + + .clock_scratch = 0x0, + .mbox_irq_enable = ISP_MBOX_IRQ_ENABLE_T6031, + + .scl1 = true, + .lpdp = false, + .meta_size = ISP_META_SIZE_T6031, +}; + static const struct of_device_id apple_isp_of_match[] = { { .compatible = "apple,t8103-isp", .data = &apple_isp_hw_t8103 }, { .compatible = "apple,t8112-isp", .data = &apple_isp_hw_t8112 }, { .compatible = "apple,t6000-isp", .data = &apple_isp_hw_t6000 }, { .compatible = "apple,t6020-isp", .data = &apple_isp_hw_t6020 }, + { .compatible = "apple,t6031-isp", .data = &apple_isp_hw_t6031 }, {}, }; MODULE_DEVICE_TABLE(of, apple_isp_of_match); diff --git a/drivers/media/platform/apple/isp/isp-drv.h b/drivers/media/platform/apple/isp/isp-drv.h index 96a1d0b39f860d..227e5af4cde7ab 100644 --- a/drivers/media/platform/apple/isp/isp-drv.h +++ b/drivers/media/platform/apple/isp/isp-drv.h @@ -21,8 +21,9 @@ #define ISP_MAX_CHANNELS 6 #define ISP_IPC_MESSAGE_SIZE 64 #define ISP_IPC_FLAG_ACK 0x1 -#define ISP_META_SIZE_T8103 0x4640 -#define ISP_META_SIZE_T8112 0x4840 +#define ISP_META_SIZE_T8103 0x4640 +#define ISP_META_SIZE_T8112 0x4840 +#define ISP_META_SIZE_T6031 0x4a40 /* used to limit the user space buffers to the buffer_pool_config */ #define ISP_MAX_BUFFERS 16 @@ -30,6 +31,7 @@ enum isp_generation { ISP_GEN_T8103, ISP_GEN_T8112, + ISP_GEN_T6031, }; enum isp_firmware_version { @@ -37,6 +39,7 @@ enum isp_firmware_version { ISP_FIRMWARE_V_12_3, ISP_FIRMWARE_V_12_4, ISP_FIRMWARE_V_13_5, + ISP_FIRMWARE_V_14_7, }; struct isp_surf { @@ -118,6 +121,7 @@ struct apple_isp_hw { u8 bandwidth_bit; u8 bandwidth_size; + u32 mbox_irq_enable; u32 meta_size; bool scl1; bool lpdp; diff --git a/drivers/media/platform/apple/isp/isp-fw.c b/drivers/media/platform/apple/isp/isp-fw.c index 962f99d2d4d433..87433669526b12 100644 --- a/drivers/media/platform/apple/isp/isp-fw.c +++ b/drivers/media/platform/apple/isp/isp-fw.c @@ -189,7 +189,7 @@ static irqreturn_t apple_isp_isr_thread(int irq, void *dev) static void isp_disable_irq(struct apple_isp *isp) { - isp_mbox_write32(isp, ISP_MBOX_IRQ_ENABLE, 0x0); + isp_mbox_write32(isp, isp->hw->mbox_irq_enable, 0x0); free_irq(isp->irq, isp); isp_gpio_write32(isp, ISP_GPIO_1, 0xfeedbabe); /* real funny */ } @@ -207,7 +207,7 @@ static int isp_enable_irq(struct apple_isp *isp) isp_dbg(isp, "about to enable interrupts...\n"); - isp_mbox_write32(isp, ISP_MBOX_IRQ_ENABLE, 0xf); + isp_mbox_write32(isp, isp->hw->mbox_irq_enable, 0xf); return 0; } @@ -303,7 +303,7 @@ static int isp_firmware_boot_stage1(struct apple_isp *isp) isp_gpio_write32(isp, ISP_GPIO_6, 0x0); isp_gpio_write32(isp, ISP_GPIO_7, 0x0); - isp_mbox_write32(isp, ISP_MBOX_IRQ_ENABLE, 0x0); + isp_mbox_write32(isp, isp->hw->mbox_irq_enable, 0x0); isp_coproc_write32(isp, ISP_COPROC_CONTROL, 0x0); isp_coproc_write32(isp, ISP_COPROC_CONTROL, 0x10); @@ -672,13 +672,15 @@ static int isp_start_command_processor(struct apple_isp *isp) return err; } - err = isp_cmd_pmp_ctrl_set( - isp, isp->hw->clock_scratch, isp->hw->clock_base, - isp->hw->clock_bit, isp->hw->clock_size, - isp->hw->bandwidth_scratch, isp->hw->bandwidth_base, - isp->hw->bandwidth_bit, isp->hw->bandwidth_size); - if (err) - return err; + if (isp->hw->clock_scratch) { + err = isp_cmd_pmp_ctrl_set( + isp, isp->hw->clock_scratch, isp->hw->clock_base, + isp->hw->clock_bit, isp->hw->clock_size, + isp->hw->bandwidth_scratch, isp->hw->bandwidth_base, + isp->hw->bandwidth_bit, isp->hw->bandwidth_size); + if (err) + return err; + } err = isp_cmd_start(isp, 0); if (err) diff --git a/drivers/media/platform/apple/isp/isp-regs.h b/drivers/media/platform/apple/isp/isp-regs.h index 7357fa10fa5483..2cf902028a6a4f 100644 --- a/drivers/media/platform/apple/isp/isp-regs.h +++ b/drivers/media/platform/apple/isp/isp-regs.h @@ -23,10 +23,11 @@ #define ISP_COPROC_IRQ_MASK_4 0x1400a10 #define ISP_COPROC_IRQ_MASK_5 0x1400a14 -#define ISP_MBOX_IRQ_INTERRUPT 0x00 -#define ISP_MBOX_IRQ_ENABLE 0x04 -#define ISP_MBOX2_IRQ_DOORBELL 0x00 -#define ISP_MBOX2_IRQ_ACK 0x0c +#define ISP_MBOX_IRQ_INTERRUPT 0x00 +#define ISP_MBOX_IRQ_ENABLE 0x04 +#define ISP_MBOX_IRQ_ENABLE_T6031 0x08 +#define ISP_MBOX2_IRQ_DOORBELL 0x00 +#define ISP_MBOX2_IRQ_ACK 0x0c #define ISP_GPIO_0 0x00 #define ISP_GPIO_1 0x04