Skip to content

Commit 2bcf154

Browse files
eilnjannau
authored andcommitted
media: apple: isp: Split gpio/mbox MMIO range
Offsets differ across socs. Makes more sense than "core" too. Signed-off-by: Eileen Yoon <eyn@gmx.com>
1 parent d0c4553 commit 2bcf154

5 files changed

Lines changed: 75 additions & 69 deletions

File tree

drivers/media/platform/apple/isp/isp-drv.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,15 @@ static int apple_isp_probe(struct platform_device *pdev)
164164
goto detach_genpd;
165165
}
166166

167-
isp->core = devm_platform_ioremap_resource_byname(pdev, "core");
168-
if (IS_ERR(isp->core)) {
169-
err = PTR_ERR(isp->core);
167+
isp->mbox = devm_platform_ioremap_resource_byname(pdev, "mbox");
168+
if (IS_ERR(isp->mbox)) {
169+
err = PTR_ERR(isp->mbox);
170+
goto detach_genpd;
171+
}
172+
173+
isp->gpio = devm_platform_ioremap_resource_byname(pdev, "gpio");
174+
if (IS_ERR(isp->gpio)) {
175+
err = PTR_ERR(isp->gpio);
170176
goto detach_genpd;
171177
}
172178

drivers/media/platform/apple/isp/isp-drv.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ struct apple_isp {
185185
int irq;
186186

187187
void __iomem *asc;
188-
void __iomem *core;
188+
void __iomem *mbox;
189+
void __iomem *gpio;
189190
void __iomem *dart0;
190191
void __iomem *dart1;
191192
void __iomem *dart2;

drivers/media/platform/apple/isp/isp-fw.c

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@ static inline void isp_asc_write32(struct apple_isp *isp, u32 reg, u32 val)
2626
writel(val, isp->asc + reg);
2727
}
2828

29+
static inline u32 isp_gpio_read32(struct apple_isp *isp, u32 reg)
30+
{
31+
return readl(isp->gpio + reg);
32+
}
33+
34+
static inline void isp_gpio_write32(struct apple_isp *isp, u32 reg, u32 val)
35+
{
36+
writel(val, isp->gpio + reg);
37+
}
38+
2939
struct isp_firmware_bootargs {
3040
u32 pad_0[2];
3141
u64 ipc_iova;
@@ -76,8 +86,8 @@ static irqreturn_t apple_isp_isr(int irq, void *dev)
7686
{
7787
struct apple_isp *isp = dev;
7888

79-
isp_core_write32(isp, ISP_CORE_IRQ_ACK,
80-
isp_core_read32(isp, ISP_CORE_IRQ_INTERRUPT));
89+
isp_mbox_write32(isp, ISP_MBOX_IRQ_ACK,
90+
isp_mbox_read32(isp, ISP_MBOX_IRQ_INTERRUPT));
8191

8292
wake_up_interruptible_all(&isp->wait);
8393

@@ -94,9 +104,9 @@ static irqreturn_t apple_isp_isr(int irq, void *dev)
94104

95105
static void isp_disable_irq(struct apple_isp *isp)
96106
{
97-
isp_core_write32(isp, ISP_CORE_IRQ_ENABLE, 0x0);
107+
isp_mbox_write32(isp, ISP_MBOX_IRQ_ENABLE, 0x0);
98108
free_irq(isp->irq, isp);
99-
isp_core_write32(isp, ISP_CORE_GPIO_1, 0xfeedbabe); /* real funny */
109+
isp_gpio_write32(isp, ISP_GPIO_1, 0xfeedbabe); /* real funny */
100110
}
101111

102112
static int isp_enable_irq(struct apple_isp *isp)
@@ -111,7 +121,7 @@ static int isp_enable_irq(struct apple_isp *isp)
111121

112122
isp_dbg(isp, "about to enable interrupts...\n");
113123

114-
isp_core_write32(isp, ISP_CORE_IRQ_ENABLE, 0xf);
124+
isp_mbox_write32(isp, ISP_MBOX_IRQ_ENABLE, 0xf);
115125

116126
return 0;
117127
}
@@ -165,26 +175,26 @@ static int isp_firmware_boot_stage1(struct apple_isp *isp)
165175
if (err < 0)
166176
return err;
167177

168-
isp_core_write32(isp, ISP_CORE_CLOCK_EN, 0x1);
178+
isp_gpio_write32(isp, ISP_GPIO_CLOCK_EN, 0x1);
169179

170-
isp_core_write32(isp, ISP_CORE_GPIO_0, 0x0);
171-
isp_core_write32(isp, ISP_CORE_GPIO_1, 0x0);
172-
isp_core_write32(isp, ISP_CORE_GPIO_2, 0x0);
173-
isp_core_write32(isp, ISP_CORE_GPIO_3, 0x0);
174-
isp_core_write32(isp, ISP_CORE_GPIO_4, 0x0);
175-
isp_core_write32(isp, ISP_CORE_GPIO_5, 0x0);
176-
isp_core_write32(isp, ISP_CORE_GPIO_6, 0x0);
177-
isp_core_write32(isp, ISP_CORE_GPIO_7, 0x0);
180+
isp_gpio_write32(isp, ISP_GPIO_0, 0x0);
181+
isp_gpio_write32(isp, ISP_GPIO_1, 0x0);
182+
isp_gpio_write32(isp, ISP_GPIO_2, 0x0);
183+
isp_gpio_write32(isp, ISP_GPIO_3, 0x0);
184+
isp_gpio_write32(isp, ISP_GPIO_4, 0x0);
185+
isp_gpio_write32(isp, ISP_GPIO_5, 0x0);
186+
isp_gpio_write32(isp, ISP_GPIO_6, 0x0);
187+
isp_gpio_write32(isp, ISP_GPIO_7, 0x0);
178188

179-
isp_core_write32(isp, ISP_CORE_IRQ_ENABLE, 0x0);
189+
isp_mbox_write32(isp, ISP_MBOX_IRQ_ENABLE, 0x0);
180190

181191
isp_asc_write32(isp, ISP_ASC_CONTROL, 0x0);
182192
isp_asc_write32(isp, ISP_ASC_CONTROL, 0x10);
183193

184-
/* Wait for ISP_CORE_GPIO_7 to 0x0 -> 0x8042006 */
185-
isp_core_write32(isp, ISP_CORE_GPIO_7, 0x0);
194+
/* Wait for ISP_GPIO_7 to 0x0 -> 0x8042006 */
195+
isp_gpio_write32(isp, ISP_GPIO_7, 0x0);
186196
for (retries = 0; retries < ISP_FIRMWARE_MAX_TRIES; retries++) {
187-
u32 val = isp_core_read32(isp, ISP_CORE_GPIO_7);
197+
u32 val = isp_gpio_read32(isp, ISP_GPIO_7);
188198
if (val == 0x8042006) {
189199
isp_dbg(isp,
190200
"got first magic number (0x%x) from firmware\n",
@@ -215,9 +225,9 @@ static int isp_firmware_boot_stage2(struct apple_isp *isp)
215225
dma_addr_t args_iova;
216226
int err, retries;
217227

218-
u32 num_ipc_chans = isp_core_read32(isp, ISP_CORE_GPIO_0);
219-
u32 args_offset = isp_core_read32(isp, ISP_CORE_GPIO_1);
220-
u32 extra_size = isp_core_read32(isp, ISP_CORE_GPIO_3);
228+
u32 num_ipc_chans = isp_gpio_read32(isp, ISP_GPIO_0);
229+
u32 args_offset = isp_gpio_read32(isp, ISP_GPIO_1);
230+
u32 extra_size = isp_gpio_read32(isp, ISP_GPIO_3);
221231
isp->num_ipc_chans = num_ipc_chans;
222232

223233
if (!isp->num_ipc_chans) {
@@ -264,14 +274,14 @@ static int isp_firmware_boot_stage2(struct apple_isp *isp)
264274
args.unk9 = 0x3;
265275
isp_iowrite(isp, args_iova, &args, sizeof(args));
266276

267-
isp_core_write32(isp, ISP_CORE_GPIO_0, args_iova);
268-
isp_core_write32(isp, ISP_CORE_GPIO_1, 0x0);
277+
isp_gpio_write32(isp, ISP_GPIO_0, args_iova);
278+
isp_gpio_write32(isp, ISP_GPIO_1, 0x0);
269279

270-
/* Wait for ISP_CORE_GPIO_7 to 0xf7fbdff9 -> 0x8042006 */
271-
isp_core_write32(isp, ISP_CORE_GPIO_7, 0xf7fbdff9);
280+
/* Wait for ISP_GPIO_7 to 0xf7fbdff9 -> 0x8042006 */
281+
isp_gpio_write32(isp, ISP_GPIO_7, 0xf7fbdff9);
272282

273283
for (retries = 0; retries < ISP_FIRMWARE_MAX_TRIES; retries++) {
274-
u32 val = isp_core_read32(isp, ISP_CORE_GPIO_7);
284+
u32 val = isp_gpio_read32(isp, ISP_GPIO_7);
275285
if (val == 0x8042006) {
276286
isp_dbg(isp,
277287
"got second magic number (0x%x) from firmware\n",
@@ -324,7 +334,7 @@ static void isp_free_channel_info(struct apple_isp *isp)
324334

325335
static int isp_fill_channel_info(struct apple_isp *isp)
326336
{
327-
u32 table_iova = isp_core_read32(isp, ISP_CORE_GPIO_0);
337+
u32 table_iova = isp_gpio_read32(isp, ISP_GPIO_0);
328338

329339
isp->ipc_chans = kcalloc(isp->num_ipc_chans,
330340
sizeof(struct isp_channel *), GFP_KERNEL);
@@ -416,11 +426,11 @@ static int isp_firmware_boot_stage3(struct apple_isp *isp)
416426
}
417427
}
418428

419-
/* Wait for ISP_CORE_GPIO_3 to 0x8042006 -> 0x0 */
420-
isp_core_write32(isp, ISP_CORE_GPIO_3, 0x8042006);
429+
/* Wait for ISP_GPIO_3 to 0x8042006 -> 0x0 */
430+
isp_gpio_write32(isp, ISP_GPIO_3, 0x8042006);
421431

422432
for (retries = 0; retries < ISP_FIRMWARE_MAX_TRIES; retries++) {
423-
u32 val = isp_core_read32(isp, ISP_CORE_GPIO_3);
433+
u32 val = isp_gpio_read32(isp, ISP_GPIO_3);
424434
if (val == 0x0) {
425435
isp_dbg(isp,
426436
"got third magic number (0x%x) from firmware\n",
@@ -445,14 +455,14 @@ static int isp_stop_command_processor(struct apple_isp *isp)
445455
{
446456
int retries;
447457

448-
/* Wait for ISP_CORE_GPIO_0 to 0xf7fbdff9 -> 0x8042006 */
449-
isp_core_write32(isp, ISP_CORE_GPIO_0, 0xf7fbdff9);
458+
/* Wait for ISP_GPIO_0 to 0xf7fbdff9 -> 0x8042006 */
459+
isp_gpio_write32(isp, ISP_GPIO_0, 0xf7fbdff9);
450460

451461
/* Their CISP_CMD_STOP implementation is buggy */
452462
isp_cmd_suspend(isp);
453463

454464
for (retries = 0; retries < ISP_FIRMWARE_MAX_TRIES; retries++) {
455-
u32 val = isp_core_read32(isp, ISP_CORE_GPIO_0);
465+
u32 val = isp_gpio_read32(isp, ISP_GPIO_0);
456466
if (val == 0x8042006) {
457467
isp_dbg(isp, "got magic number (0x%x) from firmware\n",
458468
val);

drivers/media/platform/apple/isp/isp-ipc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ static int chan_handle_once(struct apple_isp *isp, struct isp_channel *chan)
110110

111111
chan_write_msg(isp, chan, &chan->rsp);
112112

113-
isp_core_write32(isp, ISP_CORE_IRQ_DOORBELL, chan->doorbell);
113+
isp_mbox_write32(isp, ISP_MBOX_IRQ_DOORBELL, chan->doorbell);
114114

115115
chan_update_cursor(chan);
116116

@@ -165,7 +165,7 @@ int ipc_chan_send(struct apple_isp *isp, struct isp_channel *chan,
165165
chan_write_msg(isp, chan, &chan->req);
166166
wmb();
167167

168-
isp_core_write32(isp, ISP_CORE_IRQ_DOORBELL, chan->doorbell);
168+
isp_mbox_write32(isp, ISP_MBOX_IRQ_DOORBELL, chan->doorbell);
169169

170170
t = wait_event_interruptible_timeout(isp->wait, chan_tx_done(isp, chan),
171171
timeout);

drivers/media/platform/apple/isp/isp-regs.h

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -23,40 +23,29 @@
2323
#define ISP_ASC_IRQ_MASK_4 0x1400a10
2424
#define ISP_ASC_IRQ_MASK_5 0x1400a14
2525

26-
#define ISP_CORE_IRQ_INTERRUPT 0x2104000
27-
#define ISP_CORE_IRQ_ENABLE 0x2104004
28-
#define ISP_CORE_IRQ_DOORBELL 0x21043f0
29-
#define ISP_CORE_IRQ_ACK 0x21043fc
30-
31-
#define ISP_CORE_GPIO_0 0x2104170
32-
#define ISP_CORE_GPIO_1 0x2104174
33-
#define ISP_CORE_GPIO_2 0x2104178
34-
#define ISP_CORE_GPIO_3 0x210417c
35-
#define ISP_CORE_GPIO_4 0x2104180
36-
#define ISP_CORE_GPIO_5 0x2104184
37-
#define ISP_CORE_GPIO_6 0x2104188
38-
#define ISP_CORE_GPIO_7 0x210418c
39-
40-
#define ISP_CORE_CLOCK_EN 0x2104190
41-
42-
#define ISP_CORE_DPE_CTRL_0 0x2504000
43-
#define ISP_CORE_DPE_CTRL_1 0x2508000
44-
45-
static inline u32 isp_core_read32(struct apple_isp *isp, u32 reg)
26+
#define ISP_MBOX_IRQ_INTERRUPT 0x000
27+
#define ISP_MBOX_IRQ_ENABLE 0x004
28+
#define ISP_MBOX_IRQ_DOORBELL 0x3f0
29+
#define ISP_MBOX_IRQ_ACK 0x3fc
30+
31+
#define ISP_GPIO_0 0x00
32+
#define ISP_GPIO_1 0x04
33+
#define ISP_GPIO_2 0x08
34+
#define ISP_GPIO_3 0x0c
35+
#define ISP_GPIO_4 0x10
36+
#define ISP_GPIO_5 0x14
37+
#define ISP_GPIO_6 0x18
38+
#define ISP_GPIO_7 0x1c
39+
#define ISP_GPIO_CLOCK_EN 0x20
40+
41+
static inline u32 isp_mbox_read32(struct apple_isp *isp, u32 reg)
4642
{
47-
return readl(isp->core + reg - 0x2104000); // TODO this sucks
43+
return readl(isp->mbox + reg);
4844
}
4945

50-
static inline void isp_core_write32(struct apple_isp *isp, u32 reg, u32 val)
46+
static inline void isp_mbox_write32(struct apple_isp *isp, u32 reg, u32 val)
5147
{
52-
writel(val, isp->core + reg - 0x2104000);
53-
}
54-
55-
static inline void isp_core_mask32(struct apple_isp *isp, u32 reg, u32 clear,
56-
u32 set)
57-
{
58-
isp_core_write32(isp, reg, isp_core_read32(isp, reg) & ~clear);
59-
isp_core_write32(isp, reg, isp_core_read32(isp, reg) | set);
48+
writel(val, isp->mbox + reg);
6049
}
6150

6251
#endif /* __ISP_REGS_H__ */

0 commit comments

Comments
 (0)