Skip to content

Commit 7f97756

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 0a6e1a5 commit 7f97756

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
@@ -27,6 +27,16 @@ static inline void isp_asc_write32(struct apple_isp *isp, u32 reg, u32 val)
2727
writel(val, isp->asc + reg);
2828
}
2929

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

80-
isp_core_write32(isp, ISP_CORE_IRQ_ACK,
81-
isp_core_read32(isp, ISP_CORE_IRQ_INTERRUPT));
90+
isp_mbox_write32(isp, ISP_MBOX_IRQ_ACK,
91+
isp_mbox_read32(isp, ISP_MBOX_IRQ_INTERRUPT));
8292

8393
wake_up_interruptible_all(&isp->wait);
8494

@@ -95,9 +105,9 @@ static irqreturn_t apple_isp_isr(int irq, void *dev)
95105

96106
static void isp_disable_irq(struct apple_isp *isp)
97107
{
98-
isp_core_write32(isp, ISP_CORE_IRQ_ENABLE, 0x0);
108+
isp_mbox_write32(isp, ISP_MBOX_IRQ_ENABLE, 0x0);
99109
free_irq(isp->irq, isp);
100-
isp_core_write32(isp, ISP_CORE_GPIO_1, 0xfeedbabe); /* real funny */
110+
isp_gpio_write32(isp, ISP_GPIO_1, 0xfeedbabe); /* real funny */
101111
}
102112

103113
static int isp_enable_irq(struct apple_isp *isp)
@@ -112,7 +122,7 @@ static int isp_enable_irq(struct apple_isp *isp)
112122

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

115-
isp_core_write32(isp, ISP_CORE_IRQ_ENABLE, 0xf);
125+
isp_mbox_write32(isp, ISP_MBOX_IRQ_ENABLE, 0xf);
116126

117127
return 0;
118128
}
@@ -166,26 +176,26 @@ static int isp_firmware_boot_stage1(struct apple_isp *isp)
166176
if (err < 0)
167177
return err;
168178

169-
isp_core_write32(isp, ISP_CORE_CLOCK_EN, 0x1);
179+
isp_gpio_write32(isp, ISP_GPIO_CLOCK_EN, 0x1);
170180

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

180-
isp_core_write32(isp, ISP_CORE_IRQ_ENABLE, 0x0);
190+
isp_mbox_write32(isp, ISP_MBOX_IRQ_ENABLE, 0x0);
181191

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

185-
/* Wait for ISP_CORE_GPIO_7 to 0x0 -> 0x8042006 */
186-
isp_core_write32(isp, ISP_CORE_GPIO_7, 0x0);
195+
/* Wait for ISP_GPIO_7 to 0x0 -> 0x8042006 */
196+
isp_gpio_write32(isp, ISP_GPIO_7, 0x0);
187197
for (retries = 0; retries < ISP_FIRMWARE_MAX_TRIES; retries++) {
188-
u32 val = isp_core_read32(isp, ISP_CORE_GPIO_7);
198+
u32 val = isp_gpio_read32(isp, ISP_GPIO_7);
189199
if (val == 0x8042006) {
190200
isp_dbg(isp,
191201
"got first magic number (0x%x) from firmware\n",
@@ -216,9 +226,9 @@ static int isp_firmware_boot_stage2(struct apple_isp *isp)
216226
dma_addr_t args_iova;
217227
int err, retries;
218228

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

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

268-
isp_core_write32(isp, ISP_CORE_GPIO_0, args_iova);
269-
isp_core_write32(isp, ISP_CORE_GPIO_1, 0x0);
278+
isp_gpio_write32(isp, ISP_GPIO_0, args_iova);
279+
isp_gpio_write32(isp, ISP_GPIO_1, 0x0);
270280

271-
/* Wait for ISP_CORE_GPIO_7 to 0xf7fbdff9 -> 0x8042006 */
272-
isp_core_write32(isp, ISP_CORE_GPIO_7, 0xf7fbdff9);
281+
/* Wait for ISP_GPIO_7 to 0xf7fbdff9 -> 0x8042006 */
282+
isp_gpio_write32(isp, ISP_GPIO_7, 0xf7fbdff9);
273283

274284
for (retries = 0; retries < ISP_FIRMWARE_MAX_TRIES; retries++) {
275-
u32 val = isp_core_read32(isp, ISP_CORE_GPIO_7);
285+
u32 val = isp_gpio_read32(isp, ISP_GPIO_7);
276286
if (val == 0x8042006) {
277287
isp_dbg(isp,
278288
"got second magic number (0x%x) from firmware\n",
@@ -325,7 +335,7 @@ static void isp_free_channel_info(struct apple_isp *isp)
325335

326336
static int isp_fill_channel_info(struct apple_isp *isp)
327337
{
328-
u32 table_iova = isp_core_read32(isp, ISP_CORE_GPIO_0);
338+
u32 table_iova = isp_gpio_read32(isp, ISP_GPIO_0);
329339

330340
isp->ipc_chans = kcalloc(isp->num_ipc_chans,
331341
sizeof(struct isp_channel *), GFP_KERNEL);
@@ -417,11 +427,11 @@ static int isp_firmware_boot_stage3(struct apple_isp *isp)
417427
}
418428
}
419429

420-
/* Wait for ISP_CORE_GPIO_3 to 0x8042006 -> 0x0 */
421-
isp_core_write32(isp, ISP_CORE_GPIO_3, 0x8042006);
430+
/* Wait for ISP_GPIO_3 to 0x8042006 -> 0x0 */
431+
isp_gpio_write32(isp, ISP_GPIO_3, 0x8042006);
422432

423433
for (retries = 0; retries < ISP_FIRMWARE_MAX_TRIES; retries++) {
424-
u32 val = isp_core_read32(isp, ISP_CORE_GPIO_3);
434+
u32 val = isp_gpio_read32(isp, ISP_GPIO_3);
425435
if (val == 0x0) {
426436
isp_dbg(isp,
427437
"got third magic number (0x%x) from firmware\n",
@@ -446,14 +456,14 @@ static int isp_stop_command_processor(struct apple_isp *isp)
446456
{
447457
int retries;
448458

449-
/* Wait for ISP_CORE_GPIO_0 to 0xf7fbdff9 -> 0x8042006 */
450-
isp_core_write32(isp, ISP_CORE_GPIO_0, 0xf7fbdff9);
459+
/* Wait for ISP_GPIO_0 to 0xf7fbdff9 -> 0x8042006 */
460+
isp_gpio_write32(isp, ISP_GPIO_0, 0xf7fbdff9);
451461

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

455465
for (retries = 0; retries < ISP_FIRMWARE_MAX_TRIES; retries++) {
456-
u32 val = isp_core_read32(isp, ISP_CORE_GPIO_0);
466+
u32 val = isp_gpio_read32(isp, ISP_GPIO_0);
457467
if (val == 0x8042006) {
458468
isp_dbg(isp, "got magic number (0x%x) from firmware\n",
459469
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)