writel_relaxed(val, i2c->base + reg);
static irqreturn_t gx_disp_irq(int irq, void *dev_id)
can occur if status register is not cleared exactly once. 6. Debugging GX Drivers Without Vendor Support 6.1 Tools & Methods | Tool | Purpose | |------|---------| | devmem2 | Read/write raw registers (e.g., devmem2 0xF0000020 ) | | strace | Trace ioctl calls to DRM/V4L2 | | dmesg -w | Watch driver prints (enable with DYNAMIC_DEBUG ) | | cat /sys/kernel/debug/dri/*/state | DRM state | | gdb + KGDB | Kernel debugging over serial | 6.2 Common Errors & Fixes Error: gx_vpu: timeout waiting for interrupt → Check VPU clock (is it enabled?), firmware loaded? Try clk_enable(vpu_clk) . gx chip driver
If you can avoid GX for a new design, do so. If you're stuck, copy working register dumps from a known-good Android build and compare to your driver’s init sequence.
struct gx_mem_region phys_addr_t start; size_t size; void *cookie; struct list_head list; ; // Allocation from reserved CMA pool void *gx_mem_alloc(size_t size, u32 align); void gx_mem_free(void *handle); Try clk_enable(vpu_clk)
Example (display vsync):
// In gx_i2c_xfer(), add recovery if (status & I2C_STAT_BUS_BUSY) gx_i2c_reset(adap); mdelay(1); struct gx_mem_region phys_addr_t start
#define I2C_CON 0x00 #define I2C_TAR 0x04 #define I2C_DATA_CMD 0x10 #define I2C_ENABLE 0x6C static inline void gx_i2c_writel(struct gx_i2c *i2c, u32 val, u32 reg)