mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 22:26:55 +00:00
media: rkisp1: Store IRQ lines
Store the IRQ lines used by the driver for easy access. These are needed in future patches which fix IRQ race issues. Link: https://lore.kernel.org/r/20231207-rkisp-irq-fix-v3-3-358a2c871a3c@ideasonboard.com Tested-by: Adam Ford <aford173@gmail.com> #imx8mp-beacon Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
3eb7910e1b
commit
0753874617
2 changed files with 23 additions and 5 deletions
|
@ -61,6 +61,14 @@ struct dentry;
|
||||||
RKISP1_CIF_ISP_EXP_END | \
|
RKISP1_CIF_ISP_EXP_END | \
|
||||||
RKISP1_CIF_ISP_HIST_MEASURE_RDY)
|
RKISP1_CIF_ISP_HIST_MEASURE_RDY)
|
||||||
|
|
||||||
|
/* IRQ lines */
|
||||||
|
enum rkisp1_irq_line {
|
||||||
|
RKISP1_IRQ_ISP = 0,
|
||||||
|
RKISP1_IRQ_MI,
|
||||||
|
RKISP1_IRQ_MIPI,
|
||||||
|
RKISP1_NUM_IRQS,
|
||||||
|
};
|
||||||
|
|
||||||
/* enum for the resizer pads */
|
/* enum for the resizer pads */
|
||||||
enum rkisp1_rsz_pad {
|
enum rkisp1_rsz_pad {
|
||||||
RKISP1_RSZ_PAD_SINK,
|
RKISP1_RSZ_PAD_SINK,
|
||||||
|
@ -423,7 +431,6 @@ struct rkisp1_debug {
|
||||||
* struct rkisp1_device - ISP platform device
|
* struct rkisp1_device - ISP platform device
|
||||||
*
|
*
|
||||||
* @base_addr: base register address
|
* @base_addr: base register address
|
||||||
* @irq: the irq number
|
|
||||||
* @dev: a pointer to the struct device
|
* @dev: a pointer to the struct device
|
||||||
* @clk_size: number of clocks
|
* @clk_size: number of clocks
|
||||||
* @clks: array of clocks
|
* @clks: array of clocks
|
||||||
|
@ -441,6 +448,7 @@ struct rkisp1_debug {
|
||||||
* @stream_lock: serializes {start/stop}_streaming callbacks between the capture devices.
|
* @stream_lock: serializes {start/stop}_streaming callbacks between the capture devices.
|
||||||
* @debug: debug params to be exposed on debugfs
|
* @debug: debug params to be exposed on debugfs
|
||||||
* @info: version-specific ISP information
|
* @info: version-specific ISP information
|
||||||
|
* @irqs: IRQ line numbers
|
||||||
*/
|
*/
|
||||||
struct rkisp1_device {
|
struct rkisp1_device {
|
||||||
void __iomem *base_addr;
|
void __iomem *base_addr;
|
||||||
|
@ -461,6 +469,7 @@ struct rkisp1_device {
|
||||||
struct mutex stream_lock; /* serialize {start/stop}_streaming cb between capture devices */
|
struct mutex stream_lock; /* serialize {start/stop}_streaming cb between capture devices */
|
||||||
struct rkisp1_debug debug;
|
struct rkisp1_debug debug;
|
||||||
const struct rkisp1_info *info;
|
const struct rkisp1_info *info;
|
||||||
|
int irqs[RKISP1_NUM_IRQS];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -114,6 +114,7 @@
|
||||||
struct rkisp1_isr_data {
|
struct rkisp1_isr_data {
|
||||||
const char *name;
|
const char *name;
|
||||||
irqreturn_t (*isr)(int irq, void *ctx);
|
irqreturn_t (*isr)(int irq, void *ctx);
|
||||||
|
u32 line_mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
||||||
|
@ -471,9 +472,9 @@ static const char * const px30_isp_clks[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct rkisp1_isr_data px30_isp_isrs[] = {
|
static const struct rkisp1_isr_data px30_isp_isrs[] = {
|
||||||
{ "isp", rkisp1_isp_isr },
|
{ "isp", rkisp1_isp_isr, BIT(RKISP1_IRQ_ISP) },
|
||||||
{ "mi", rkisp1_capture_isr },
|
{ "mi", rkisp1_capture_isr, BIT(RKISP1_IRQ_MI) },
|
||||||
{ "mipi", rkisp1_csi_isr },
|
{ "mipi", rkisp1_csi_isr, BIT(RKISP1_IRQ_MIPI) },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct rkisp1_info px30_isp_info = {
|
static const struct rkisp1_info px30_isp_info = {
|
||||||
|
@ -492,7 +493,7 @@ static const char * const rk3399_isp_clks[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct rkisp1_isr_data rk3399_isp_isrs[] = {
|
static const struct rkisp1_isr_data rk3399_isp_isrs[] = {
|
||||||
{ NULL, rkisp1_isr },
|
{ NULL, rkisp1_isr, BIT(RKISP1_IRQ_ISP) | BIT(RKISP1_IRQ_MI) | BIT(RKISP1_IRQ_MIPI) },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct rkisp1_info rk3399_isp_info = {
|
static const struct rkisp1_info rk3399_isp_info = {
|
||||||
|
@ -543,6 +544,9 @@ static int rkisp1_probe(struct platform_device *pdev)
|
||||||
if (IS_ERR(rkisp1->base_addr))
|
if (IS_ERR(rkisp1->base_addr))
|
||||||
return PTR_ERR(rkisp1->base_addr);
|
return PTR_ERR(rkisp1->base_addr);
|
||||||
|
|
||||||
|
for (unsigned int il = 0; il < ARRAY_SIZE(rkisp1->irqs); ++il)
|
||||||
|
rkisp1->irqs[il] = -1;
|
||||||
|
|
||||||
for (i = 0; i < info->isr_size; i++) {
|
for (i = 0; i < info->isr_size; i++) {
|
||||||
irq = info->isrs[i].name
|
irq = info->isrs[i].name
|
||||||
? platform_get_irq_byname(pdev, info->isrs[i].name)
|
? platform_get_irq_byname(pdev, info->isrs[i].name)
|
||||||
|
@ -550,6 +554,11 @@ static int rkisp1_probe(struct platform_device *pdev)
|
||||||
if (irq < 0)
|
if (irq < 0)
|
||||||
return irq;
|
return irq;
|
||||||
|
|
||||||
|
for (unsigned int il = 0; il < ARRAY_SIZE(rkisp1->irqs); ++il) {
|
||||||
|
if (info->isrs[i].line_mask & BIT(il))
|
||||||
|
rkisp1->irqs[il] = irq;
|
||||||
|
}
|
||||||
|
|
||||||
ret = devm_request_irq(dev, irq, info->isrs[i].isr, 0,
|
ret = devm_request_irq(dev, irq, info->isrs[i].isr, 0,
|
||||||
dev_driver_string(dev), dev);
|
dev_driver_string(dev), dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
Loading…
Reference in a new issue