diff options
-rw-r--r-- | arch/arm/mach-ux500/board-mop500.c | 5 | ||||
-rw-r--r-- | arch/arm/mach-ux500/cpu-db8500.c | 7 | ||||
-rw-r--r-- | arch/arm/mach-ux500/devices-db8500.c | 44 | ||||
-rw-r--r-- | arch/arm/mach-ux500/devices-db8500.h | 5 | ||||
-rw-r--r-- | drivers/cpufreq/db8500-cpufreq.c | 1 | ||||
-rw-r--r-- | drivers/mfd/db8500-prcmu.c | 122 | ||||
-rw-r--r-- | include/linux/mfd/db8500-prcmu.h | 14 | ||||
-rw-r--r-- | include/linux/mfd/dbx500-prcmu.h | 46 |
8 files changed, 180 insertions, 64 deletions
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 0e928d281759..bf04b783b6d0 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -214,7 +214,7 @@ static struct platform_device snowball_sbnet_dev = { | |||
214 | }, | 214 | }, |
215 | }; | 215 | }; |
216 | 216 | ||
217 | static struct ab8500_platform_data ab8500_platdata = { | 217 | struct ab8500_platform_data ab8500_platdata = { |
218 | .irq_base = MOP500_AB8500_IRQ_BASE, | 218 | .irq_base = MOP500_AB8500_IRQ_BASE, |
219 | .regulator_reg_init = ab8500_regulator_reg_init, | 219 | .regulator_reg_init = ab8500_regulator_reg_init, |
220 | .num_regulator_reg_init = ARRAY_SIZE(ab8500_regulator_reg_init), | 220 | .num_regulator_reg_init = ARRAY_SIZE(ab8500_regulator_reg_init), |
@@ -650,6 +650,7 @@ static void __init mop500_init_machine(void) | |||
650 | int i2c0_devs; | 650 | int i2c0_devs; |
651 | int i; | 651 | int i; |
652 | 652 | ||
653 | platform_device_register(&db8500_prcmu_device); | ||
653 | mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR; | 654 | mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR; |
654 | 655 | ||
655 | mop500_pinmaps_init(); | 656 | mop500_pinmaps_init(); |
@@ -684,6 +685,7 @@ static void __init snowball_init_machine(void) | |||
684 | struct device *parent = NULL; | 685 | struct device *parent = NULL; |
685 | int i; | 686 | int i; |
686 | 687 | ||
688 | platform_device_register(&db8500_prcmu_device); | ||
687 | snowball_pinmaps_init(); | 689 | snowball_pinmaps_init(); |
688 | parent = u8500_init_devices(&ab8500_platdata); | 690 | parent = u8500_init_devices(&ab8500_platdata); |
689 | 691 | ||
@@ -709,6 +711,7 @@ static void __init hrefv60_init_machine(void) | |||
709 | int i2c0_devs; | 711 | int i2c0_devs; |
710 | int i; | 712 | int i; |
711 | 713 | ||
714 | platform_device_register(&db8500_prcmu_device); | ||
712 | /* | 715 | /* |
713 | * The HREFv60 board removed a GPIO expander and routed | 716 | * The HREFv60 board removed a GPIO expander and routed |
714 | * all these GPIO pins to the internal GPIO controller | 717 | * all these GPIO pins to the internal GPIO controller |
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index d614d7150dcb..6f42b6087df5 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -138,14 +138,9 @@ static struct platform_device db8500_pmu_device = { | |||
138 | .dev.platform_data = &db8500_pmu_platdata, | 138 | .dev.platform_data = &db8500_pmu_platdata, |
139 | }; | 139 | }; |
140 | 140 | ||
141 | static struct platform_device db8500_prcmu_device = { | ||
142 | .name = "db8500-prcmu", | ||
143 | }; | ||
144 | |||
145 | static struct platform_device *platform_devs[] __initdata = { | 141 | static struct platform_device *platform_devs[] __initdata = { |
146 | &u8500_dma40_device, | 142 | &u8500_dma40_device, |
147 | &db8500_pmu_device, | 143 | &db8500_pmu_device, |
148 | &db8500_prcmu_device, | ||
149 | }; | 144 | }; |
150 | 145 | ||
151 | static resource_size_t __initdata db8500_gpio_base[] = { | 146 | static resource_size_t __initdata db8500_gpio_base[] = { |
@@ -285,6 +280,8 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | |||
285 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80128000, "nmk-i2c.2", NULL), | 280 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80128000, "nmk-i2c.2", NULL), |
286 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL), | 281 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL), |
287 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL), | 282 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL), |
283 | OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu", | ||
284 | &db8500_prcmu_pdata), | ||
288 | /* Requires device name bindings. */ | 285 | /* Requires device name bindings. */ |
289 | OF_DEV_AUXDATA("stericsson,nmk_pinctrl", U8500_PRCMU_BASE, | 286 | OF_DEV_AUXDATA("stericsson,nmk_pinctrl", U8500_PRCMU_BASE, |
290 | "pinctrl-db8500", NULL), | 287 | "pinctrl-db8500", NULL), |
diff --git a/arch/arm/mach-ux500/devices-db8500.c b/arch/arm/mach-ux500/devices-db8500.c index 318d49020894..f3d9419f75d3 100644 --- a/arch/arm/mach-ux500/devices-db8500.c +++ b/arch/arm/mach-ux500/devices-db8500.c | |||
@@ -13,11 +13,13 @@ | |||
13 | #include <linux/amba/bus.h> | 13 | #include <linux/amba/bus.h> |
14 | #include <linux/amba/pl022.h> | 14 | #include <linux/amba/pl022.h> |
15 | #include <linux/platform_data/dma-ste-dma40.h> | 15 | #include <linux/platform_data/dma-ste-dma40.h> |
16 | #include <linux/mfd/dbx500-prcmu.h> | ||
16 | 17 | ||
17 | #include <mach/hardware.h> | 18 | #include <mach/hardware.h> |
18 | #include <mach/setup.h> | 19 | #include <mach/setup.h> |
19 | #include <mach/irqs.h> | 20 | #include <mach/irqs.h> |
20 | 21 | ||
22 | #include "devices-db8500.h" | ||
21 | #include "ste-dma40-db8500.h" | 23 | #include "ste-dma40-db8500.h" |
22 | 24 | ||
23 | static struct resource dma40_resources[] = { | 25 | static struct resource dma40_resources[] = { |
@@ -194,3 +196,45 @@ struct platform_device u8500_ske_keypad_device = { | |||
194 | .num_resources = ARRAY_SIZE(keypad_resources), | 196 | .num_resources = ARRAY_SIZE(keypad_resources), |
195 | .resource = keypad_resources, | 197 | .resource = keypad_resources, |
196 | }; | 198 | }; |
199 | |||
200 | struct prcmu_pdata db8500_prcmu_pdata = { | ||
201 | .ab_platdata = &ab8500_platdata, | ||
202 | .version_offset = DB8500_PRCMU_FW_VERSION_OFFSET, | ||
203 | .legacy_offset = DB8500_PRCMU_LEGACY_OFFSET, | ||
204 | }; | ||
205 | |||
206 | static struct resource db8500_prcmu_res[] = { | ||
207 | { | ||
208 | .name = "prcmu", | ||
209 | .start = U8500_PRCMU_BASE, | ||
210 | .end = U8500_PRCMU_BASE + SZ_8K - 1, | ||
211 | .flags = IORESOURCE_MEM, | ||
212 | }, | ||
213 | { | ||
214 | .name = "prcmu-tcdm", | ||
215 | .start = U8500_PRCMU_TCDM_BASE, | ||
216 | .end = U8500_PRCMU_TCDM_BASE + SZ_4K - 1, | ||
217 | .flags = IORESOURCE_MEM, | ||
218 | }, | ||
219 | { | ||
220 | .name = "irq", | ||
221 | .start = IRQ_DB8500_PRCMU1, | ||
222 | .end = IRQ_DB8500_PRCMU1, | ||
223 | .flags = IORESOURCE_IRQ, | ||
224 | }, | ||
225 | { | ||
226 | .name = "prcmu-tcpm", | ||
227 | .start = U8500_PRCMU_TCPM_BASE, | ||
228 | .end = U8500_PRCMU_TCPM_BASE + SZ_4K - 1, | ||
229 | .flags = IORESOURCE_MEM, | ||
230 | }, | ||
231 | }; | ||
232 | |||
233 | struct platform_device db8500_prcmu_device = { | ||
234 | .name = "db8500-prcmu", | ||
235 | .resource = db8500_prcmu_res, | ||
236 | .num_resources = ARRAY_SIZE(db8500_prcmu_res), | ||
237 | .dev = { | ||
238 | .platform_data = &db8500_prcmu_pdata, | ||
239 | }, | ||
240 | }; | ||
diff --git a/arch/arm/mach-ux500/devices-db8500.h b/arch/arm/mach-ux500/devices-db8500.h index a5e05f6e256f..dbcb35c48f06 100644 --- a/arch/arm/mach-ux500/devices-db8500.h +++ b/arch/arm/mach-ux500/devices-db8500.h | |||
@@ -14,6 +14,11 @@ | |||
14 | 14 | ||
15 | struct ske_keypad_platform_data; | 15 | struct ske_keypad_platform_data; |
16 | struct pl022_ssp_controller; | 16 | struct pl022_ssp_controller; |
17 | struct platform_device; | ||
18 | |||
19 | extern struct ab8500_platform_data ab8500_platdata; | ||
20 | extern struct prcmu_pdata db8500_prcmu_pdata; | ||
21 | extern struct platform_device db8500_prcmu_device; | ||
17 | 22 | ||
18 | static inline struct platform_device * | 23 | static inline struct platform_device * |
19 | db8500_add_ske_keypad(struct device *parent, | 24 | db8500_add_ske_keypad(struct device *parent, |
diff --git a/drivers/cpufreq/db8500-cpufreq.c b/drivers/cpufreq/db8500-cpufreq.c index 523c9403bfce..87130e219505 100644 --- a/drivers/cpufreq/db8500-cpufreq.c +++ b/drivers/cpufreq/db8500-cpufreq.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | #include <linux/clk.h> | 17 | #include <linux/clk.h> |
18 | #include <mach/id.h> | ||
19 | 18 | ||
20 | static struct cpufreq_frequency_table *freq_table; | 19 | static struct cpufreq_frequency_table *freq_table; |
21 | static struct clk *armss_clk; | 20 | static struct clk *armss_clk; |
diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index 6658f3cb0832..1192518e1aca 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c | |||
@@ -38,9 +38,6 @@ | |||
38 | #include <mach/db8500-regs.h> | 38 | #include <mach/db8500-regs.h> |
39 | #include "dbx500-prcmu-regs.h" | 39 | #include "dbx500-prcmu-regs.h" |
40 | 40 | ||
41 | /* Offset for the firmware version within the TCPM */ | ||
42 | #define PRCMU_FW_VERSION_OFFSET 0xA4 | ||
43 | |||
44 | /* Index of different voltages to be used when accessing AVSData */ | 41 | /* Index of different voltages to be used when accessing AVSData */ |
45 | #define PRCM_AVS_BASE 0x2FC | 42 | #define PRCM_AVS_BASE 0x2FC |
46 | #define PRCM_AVS_VBB_RET (PRCM_AVS_BASE + 0x0) | 43 | #define PRCM_AVS_VBB_RET (PRCM_AVS_BASE + 0x0) |
@@ -2704,21 +2701,43 @@ static struct irq_chip prcmu_irq_chip = { | |||
2704 | .irq_unmask = prcmu_irq_unmask, | 2701 | .irq_unmask = prcmu_irq_unmask, |
2705 | }; | 2702 | }; |
2706 | 2703 | ||
2707 | static char *fw_project_name(u8 project) | 2704 | static __init char *fw_project_name(u32 project) |
2708 | { | 2705 | { |
2709 | switch (project) { | 2706 | switch (project) { |
2710 | case PRCMU_FW_PROJECT_U8500: | 2707 | case PRCMU_FW_PROJECT_U8500: |
2711 | return "U8500"; | 2708 | return "U8500"; |
2712 | case PRCMU_FW_PROJECT_U8500_C2: | 2709 | case PRCMU_FW_PROJECT_U8400: |
2713 | return "U8500 C2"; | 2710 | return "U8400"; |
2714 | case PRCMU_FW_PROJECT_U9500: | 2711 | case PRCMU_FW_PROJECT_U9500: |
2715 | return "U9500"; | 2712 | return "U9500"; |
2716 | case PRCMU_FW_PROJECT_U9500_C2: | 2713 | case PRCMU_FW_PROJECT_U8500_MBB: |
2717 | return "U9500 C2"; | 2714 | return "U8500 MBB"; |
2715 | case PRCMU_FW_PROJECT_U8500_C1: | ||
2716 | return "U8500 C1"; | ||
2717 | case PRCMU_FW_PROJECT_U8500_C2: | ||
2718 | return "U8500 C2"; | ||
2719 | case PRCMU_FW_PROJECT_U8500_C3: | ||
2720 | return "U8500 C3"; | ||
2721 | case PRCMU_FW_PROJECT_U8500_C4: | ||
2722 | return "U8500 C4"; | ||
2723 | case PRCMU_FW_PROJECT_U9500_MBL: | ||
2724 | return "U9500 MBL"; | ||
2725 | case PRCMU_FW_PROJECT_U8500_MBL: | ||
2726 | return "U8500 MBL"; | ||
2727 | case PRCMU_FW_PROJECT_U8500_MBL2: | ||
2728 | return "U8500 MBL2"; | ||
2718 | case PRCMU_FW_PROJECT_U8520: | 2729 | case PRCMU_FW_PROJECT_U8520: |
2719 | return "U8520"; | 2730 | return "U8520 MBL"; |
2720 | case PRCMU_FW_PROJECT_U8420: | 2731 | case PRCMU_FW_PROJECT_U8420: |
2721 | return "U8420"; | 2732 | return "U8420"; |
2733 | case PRCMU_FW_PROJECT_U9540: | ||
2734 | return "U9540"; | ||
2735 | case PRCMU_FW_PROJECT_A9420: | ||
2736 | return "A9420"; | ||
2737 | case PRCMU_FW_PROJECT_L8540: | ||
2738 | return "L8540"; | ||
2739 | case PRCMU_FW_PROJECT_L8580: | ||
2740 | return "L8580"; | ||
2722 | default: | 2741 | default: |
2723 | return "Unknown"; | 2742 | return "Unknown"; |
2724 | } | 2743 | } |
@@ -2764,37 +2783,44 @@ static int db8500_irq_init(struct device_node *np) | |||
2764 | return 0; | 2783 | return 0; |
2765 | } | 2784 | } |
2766 | 2785 | ||
2767 | void __init db8500_prcmu_early_init(void) | 2786 | static void dbx500_fw_version_init(struct platform_device *pdev, |
2787 | u32 version_offset) | ||
2768 | { | 2788 | { |
2769 | if (cpu_is_u8500v2() || cpu_is_u9540()) { | 2789 | struct resource *res; |
2770 | void *tcpm_base = ioremap_nocache(U8500_PRCMU_TCPM_BASE, SZ_4K); | 2790 | void __iomem *tcpm_base; |
2771 | |||
2772 | if (tcpm_base != NULL) { | ||
2773 | u32 version; | ||
2774 | version = readl(tcpm_base + PRCMU_FW_VERSION_OFFSET); | ||
2775 | fw_info.version.project = version & 0xFF; | ||
2776 | fw_info.version.api_version = (version >> 8) & 0xFF; | ||
2777 | fw_info.version.func_version = (version >> 16) & 0xFF; | ||
2778 | fw_info.version.errata = (version >> 24) & 0xFF; | ||
2779 | fw_info.valid = true; | ||
2780 | pr_info("PRCMU firmware: %s, version %d.%d.%d\n", | ||
2781 | fw_project_name(fw_info.version.project), | ||
2782 | (version >> 8) & 0xFF, (version >> 16) & 0xFF, | ||
2783 | (version >> 24) & 0xFF); | ||
2784 | iounmap(tcpm_base); | ||
2785 | } | ||
2786 | 2791 | ||
2787 | if (cpu_is_u9540()) | 2792 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
2788 | tcdm_base = ioremap_nocache(U8500_PRCMU_TCDM_BASE, | 2793 | "prcmu-tcpm"); |
2789 | SZ_4K + SZ_8K) + SZ_8K; | 2794 | if (!res) { |
2790 | else | 2795 | dev_err(&pdev->dev, |
2791 | tcdm_base = __io_address(U8500_PRCMU_TCDM_BASE); | 2796 | "Error: no prcmu tcpm memory region provided\n"); |
2792 | } else { | 2797 | return; |
2793 | pr_err("prcmu: Unsupported chip version\n"); | 2798 | } |
2794 | BUG(); | 2799 | tcpm_base = ioremap(res->start, resource_size(res)); |
2800 | if (tcpm_base != NULL) { | ||
2801 | u32 version; | ||
2802 | |||
2803 | version = readl(tcpm_base + version_offset); | ||
2804 | fw_info.version.project = (version & 0xFF); | ||
2805 | fw_info.version.api_version = (version >> 8) & 0xFF; | ||
2806 | fw_info.version.func_version = (version >> 16) & 0xFF; | ||
2807 | fw_info.version.errata = (version >> 24) & 0xFF; | ||
2808 | strncpy(fw_info.version.project_name, | ||
2809 | fw_project_name(fw_info.version.project), | ||
2810 | PRCMU_FW_PROJECT_NAME_LEN); | ||
2811 | fw_info.valid = true; | ||
2812 | pr_info("PRCMU firmware: %s(%d), version %d.%d.%d\n", | ||
2813 | fw_info.version.project_name, | ||
2814 | fw_info.version.project, | ||
2815 | fw_info.version.api_version, | ||
2816 | fw_info.version.func_version, | ||
2817 | fw_info.version.errata); | ||
2818 | iounmap(tcpm_base); | ||
2795 | } | 2819 | } |
2796 | tcdm_base = __io_address(U8500_PRCMU_TCDM_BASE); | 2820 | } |
2797 | 2821 | ||
2822 | void __init db8500_prcmu_early_init(void) | ||
2823 | { | ||
2798 | spin_lock_init(&mb0_transfer.lock); | 2824 | spin_lock_init(&mb0_transfer.lock); |
2799 | spin_lock_init(&mb0_transfer.dbb_irqs_lock); | 2825 | spin_lock_init(&mb0_transfer.dbb_irqs_lock); |
2800 | mutex_init(&mb0_transfer.ac_wake_lock); | 2826 | mutex_init(&mb0_transfer.ac_wake_lock); |
@@ -3104,20 +3130,30 @@ static void db8500_prcmu_update_cpufreq(void) | |||
3104 | */ | 3130 | */ |
3105 | static int db8500_prcmu_probe(struct platform_device *pdev) | 3131 | static int db8500_prcmu_probe(struct platform_device *pdev) |
3106 | { | 3132 | { |
3107 | struct ab8500_platform_data *ab8500_platdata = pdev->dev.platform_data; | ||
3108 | struct device_node *np = pdev->dev.of_node; | 3133 | struct device_node *np = pdev->dev.of_node; |
3134 | struct prcmu_pdata *pdata = dev_get_platdata(&pdev->dev); | ||
3109 | int irq = 0, err = 0, i; | 3135 | int irq = 0, err = 0, i; |
3136 | struct resource *res; | ||
3110 | 3137 | ||
3111 | init_prcm_registers(); | 3138 | init_prcm_registers(); |
3112 | 3139 | ||
3140 | dbx500_fw_version_init(pdev, pdata->version_offset); | ||
3141 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "prcmu-tcdm"); | ||
3142 | if (!res) { | ||
3143 | dev_err(&pdev->dev, "no prcmu tcdm region provided\n"); | ||
3144 | return -ENOENT; | ||
3145 | } | ||
3146 | tcdm_base = devm_ioremap(&pdev->dev, res->start, | ||
3147 | resource_size(res)); | ||
3148 | |||
3113 | /* Clean up the mailbox interrupts after pre-kernel code. */ | 3149 | /* Clean up the mailbox interrupts after pre-kernel code. */ |
3114 | writel(ALL_MBOX_BITS, PRCM_ARM_IT1_CLR); | 3150 | writel(ALL_MBOX_BITS, PRCM_ARM_IT1_CLR); |
3115 | 3151 | ||
3116 | if (np) | 3152 | irq = platform_get_irq(pdev, 0); |
3117 | irq = platform_get_irq(pdev, 0); | 3153 | if (irq <= 0) { |
3118 | 3154 | dev_err(&pdev->dev, "no prcmu irq provided\n"); | |
3119 | if (!np || irq <= 0) | 3155 | return -ENOENT; |
3120 | irq = IRQ_DB8500_PRCMU1; | 3156 | } |
3121 | 3157 | ||
3122 | err = request_threaded_irq(irq, prcmu_irq_handler, | 3158 | err = request_threaded_irq(irq, prcmu_irq_handler, |
3123 | prcmu_irq_thread_fn, IRQF_NO_SUSPEND, "prcmu", NULL); | 3159 | prcmu_irq_thread_fn, IRQF_NO_SUSPEND, "prcmu", NULL); |
@@ -3131,7 +3167,7 @@ static int db8500_prcmu_probe(struct platform_device *pdev) | |||
3131 | 3167 | ||
3132 | for (i = 0; i < ARRAY_SIZE(db8500_prcmu_devs); i++) { | 3168 | for (i = 0; i < ARRAY_SIZE(db8500_prcmu_devs); i++) { |
3133 | if (!strcmp(db8500_prcmu_devs[i].name, "ab8500-core")) { | 3169 | if (!strcmp(db8500_prcmu_devs[i].name, "ab8500-core")) { |
3134 | db8500_prcmu_devs[i].platform_data = ab8500_platdata; | 3170 | db8500_prcmu_devs[i].platform_data = pdata->ab_platdata; |
3135 | db8500_prcmu_devs[i].pdata_size = sizeof(struct ab8500_platform_data); | 3171 | db8500_prcmu_devs[i].pdata_size = sizeof(struct ab8500_platform_data); |
3136 | } | 3172 | } |
3137 | } | 3173 | } |
diff --git a/include/linux/mfd/db8500-prcmu.h b/include/linux/mfd/db8500-prcmu.h index a65deddede2f..77a46ae2fc17 100644 --- a/include/linux/mfd/db8500-prcmu.h +++ b/include/linux/mfd/db8500-prcmu.h | |||
@@ -487,20 +487,6 @@ struct prcmu_auto_pm_config { | |||
487 | u8 sva_policy; | 487 | u8 sva_policy; |
488 | }; | 488 | }; |
489 | 489 | ||
490 | #define PRCMU_FW_PROJECT_U8500 2 | ||
491 | #define PRCMU_FW_PROJECT_U9500 4 | ||
492 | #define PRCMU_FW_PROJECT_U8500_C2 7 | ||
493 | #define PRCMU_FW_PROJECT_U9500_C2 11 | ||
494 | #define PRCMU_FW_PROJECT_U8520 13 | ||
495 | #define PRCMU_FW_PROJECT_U8420 14 | ||
496 | |||
497 | struct prcmu_fw_version { | ||
498 | u8 project; | ||
499 | u8 api_version; | ||
500 | u8 func_version; | ||
501 | u8 errata; | ||
502 | }; | ||
503 | |||
504 | #ifdef CONFIG_MFD_DB8500_PRCMU | 490 | #ifdef CONFIG_MFD_DB8500_PRCMU |
505 | 491 | ||
506 | void db8500_prcmu_early_init(void); | 492 | void db8500_prcmu_early_init(void); |
diff --git a/include/linux/mfd/dbx500-prcmu.h b/include/linux/mfd/dbx500-prcmu.h index 155280642583..f8bac7cfc25f 100644 --- a/include/linux/mfd/dbx500-prcmu.h +++ b/include/linux/mfd/dbx500-prcmu.h | |||
@@ -12,6 +12,10 @@ | |||
12 | #include <linux/notifier.h> | 12 | #include <linux/notifier.h> |
13 | #include <linux/err.h> | 13 | #include <linux/err.h> |
14 | 14 | ||
15 | /* Offset for the firmware version within the TCPM */ | ||
16 | #define DB8500_PRCMU_FW_VERSION_OFFSET 0xA4 | ||
17 | #define DBX540_PRCMU_FW_VERSION_OFFSET 0xA8 | ||
18 | |||
15 | /* PRCMU Wakeup defines */ | 19 | /* PRCMU Wakeup defines */ |
16 | enum prcmu_wakeup_index { | 20 | enum prcmu_wakeup_index { |
17 | PRCMU_WAKEUP_INDEX_RTC, | 21 | PRCMU_WAKEUP_INDEX_RTC, |
@@ -214,6 +218,48 @@ enum ddr_pwrst { | |||
214 | DDR_PWR_STATE_OFFHIGHLAT = 0x03 | 218 | DDR_PWR_STATE_OFFHIGHLAT = 0x03 |
215 | }; | 219 | }; |
216 | 220 | ||
221 | #define DB8500_PRCMU_LEGACY_OFFSET 0xDD4 | ||
222 | |||
223 | struct prcmu_pdata | ||
224 | { | ||
225 | bool enable_set_ddr_opp; | ||
226 | bool enable_ape_opp_100_voltage; | ||
227 | struct ab8500_platform_data *ab_platdata; | ||
228 | u32 version_offset; | ||
229 | u32 legacy_offset; | ||
230 | u32 adt_offset; | ||
231 | }; | ||
232 | |||
233 | #define PRCMU_FW_PROJECT_U8500 2 | ||
234 | #define PRCMU_FW_PROJECT_U8400 3 | ||
235 | #define PRCMU_FW_PROJECT_U9500 4 /* Customer specific */ | ||
236 | #define PRCMU_FW_PROJECT_U8500_MBB 5 | ||
237 | #define PRCMU_FW_PROJECT_U8500_C1 6 | ||
238 | #define PRCMU_FW_PROJECT_U8500_C2 7 | ||
239 | #define PRCMU_FW_PROJECT_U8500_C3 8 | ||
240 | #define PRCMU_FW_PROJECT_U8500_C4 9 | ||
241 | #define PRCMU_FW_PROJECT_U9500_MBL 10 | ||
242 | #define PRCMU_FW_PROJECT_U8500_MBL 11 /* Customer specific */ | ||
243 | #define PRCMU_FW_PROJECT_U8500_MBL2 12 /* Customer specific */ | ||
244 | #define PRCMU_FW_PROJECT_U8520 13 | ||
245 | #define PRCMU_FW_PROJECT_U8420 14 | ||
246 | #define PRCMU_FW_PROJECT_A9420 20 | ||
247 | /* [32..63] 9540 and derivatives */ | ||
248 | #define PRCMU_FW_PROJECT_U9540 32 | ||
249 | /* [64..95] 8540 and derivatives */ | ||
250 | #define PRCMU_FW_PROJECT_L8540 64 | ||
251 | /* [96..126] 8580 and derivatives */ | ||
252 | #define PRCMU_FW_PROJECT_L8580 96 | ||
253 | |||
254 | #define PRCMU_FW_PROJECT_NAME_LEN 20 | ||
255 | struct prcmu_fw_version { | ||
256 | u32 project; /* Notice, project shifted with 8 on ux540 */ | ||
257 | u8 api_version; | ||
258 | u8 func_version; | ||
259 | u8 errata; | ||
260 | char project_name[PRCMU_FW_PROJECT_NAME_LEN]; | ||
261 | }; | ||
262 | |||
217 | #include <linux/mfd/db8500-prcmu.h> | 263 | #include <linux/mfd/db8500-prcmu.h> |
218 | 264 | ||
219 | #if defined(CONFIG_UX500_SOC_DB8500) | 265 | #if defined(CONFIG_UX500_SOC_DB8500) |