drm/ast: Prepare per-Gen device initialization

Switch device creation by hardware Gen. Return the value from the
call to ast_detect_chip(). All generations are still initialized
by ast_device_create().

Also add ast_device_init() for setting some common fields in struct
ast_device.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Link: https://lore.kernel.org/r/20250922083708.45564-5-tzimmermann@suse.de
This commit is contained in:
Thomas Zimmermann 2025-09-22 10:36:04 +02:00
parent 59fedf46f7
commit ff721b545b
3 changed files with 28 additions and 7 deletions

View File

@ -47,6 +47,18 @@ static int ast_modeset = -1;
MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
module_param_named(modeset, ast_modeset, int, 0400);
void ast_device_init(struct ast_device *ast,
enum ast_chip chip,
enum ast_config_mode config_mode,
void __iomem *regs,
void __iomem *ioregs)
{
ast->chip = chip;
ast->config_mode = config_mode;
ast->regs = regs;
ast->ioregs = ioregs;
}
void __ast_device_set_tx_chip(struct ast_device *ast, enum ast_tx_chip tx_chip)
{
static const char * const info_str[] = {
@ -281,7 +293,7 @@ static int ast_detect_chip(struct pci_dev *pdev,
*chip_out = chip;
*config_mode_out = config_mode;
return 0;
return __AST_CHIP_GEN(chip);
}
static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
@ -292,6 +304,7 @@ static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
void __iomem *ioregs;
enum ast_config_mode config_mode;
enum ast_chip chip;
unsigned int chip_gen;
struct drm_device *drm;
bool need_post = false;
@ -364,10 +377,16 @@ static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
return ret;
ret = ast_detect_chip(pdev, regs, ioregs, &chip, &config_mode);
if (ret)
if (ret < 0)
return ret;
chip_gen = ret;
drm = ast_device_create(pdev, &ast_driver, chip, config_mode, regs, ioregs, need_post);
switch (chip_gen) {
default:
drm = ast_device_create(pdev, &ast_driver, chip, config_mode, regs, ioregs,
need_post);
break;
}
if (IS_ERR(drm))
return PTR_ERR(drm);
pci_set_drvdata(pdev, drm);

View File

@ -416,6 +416,11 @@ struct ast_crtc_state {
int ast_mm_init(struct ast_device *ast);
/* ast_drv.c */
void ast_device_init(struct ast_device *ast,
enum ast_chip chip,
enum ast_config_mode config_mode,
void __iomem *regs,
void __iomem *ioregs);
void __ast_device_set_tx_chip(struct ast_device *ast, enum ast_tx_chip tx_chip);
/* ast_2000.c */

View File

@ -112,10 +112,7 @@ struct drm_device *ast_device_create(struct pci_dev *pdev,
return ERR_CAST(ast);
dev = &ast->base;
ast->chip = chip;
ast->config_mode = config_mode;
ast->regs = regs;
ast->ioregs = ioregs;
ast_device_init(ast, chip, config_mode, regs, ioregs);
if (AST_GEN(ast) >= 4)
ast_2300_detect_tx_chip(ast);