이 코드는 어떤 문제를 푸나요?
SoC 내부 장치는 PCI처럼 하드웨어 스스로 모든 정보를 알려주지 못하는 경우가 많습니다. platform 장치 모델은 Device Tree·ACPI·보드 정보 등으로 만들어진 장치를 드라이버와 연결합니다. platform_match 전체는 override, OF, ACPI, id 표와 이름 비교가 어떤 순서로 적용되는지 보여 줍니다. 매칭 결과는 probe를 시도할 근거이지 자원 설정 성공의 증거는 아닙니다.
읽을 범위: v6.18.37 · drivers/base/platform.c · platform_match 1305–1330행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.
먼저 알아둘 개념
platform_device
메모리 주소 범위·IRQ 등 장치 인스턴스의 자원을 나타내는 platform 쪽 구조체입니다. 공통 device를 내부에 포함합니다.
platform_driver
platform 장치를 다룰 probe와 매칭 정보를 담는 구현입니다. 공통 device_driver를 포함하므로 공통 버스 계층에서 함께 다룰 수 있습니다.
driver_override
장치를 특정 드라이버에 연결하도록 일반 매칭 규칙보다 우선하는 조건입니다. 코드의 반환값을 확인해 override 적용 여부와 일치 여부를 구분합니다.
probe와 자원
매칭 뒤 probe에서 MMIO·IRQ·클록·전원 등을 얻고 장치를 준비합니다. 자원이 아직 없으면 지연된 probe가 필요할 수 있습니다.
처음 읽을 때
Device Tree가 있는 보드의 전형적 흐름과 이름으로만 연결하는 오래된 흐름을 구분하십시오. 이 함수는 가능한 방법을 순서대로 시도하되 앞에서 결정되면 뒤를 실행하지 않습니다.
더 깊이 살펴볼 때
id_table이 존재하지만 일치하지 않는 경우에는 바로 거짓을 반환하므로 마지막 이름 비교까지 내려가지 않습니다. 단순히 모든 매칭 조건을 OR로 합친 함수로 읽으면 이 차이를 놓칩니다.
그림으로 보는 변화

1. 공통 객체를 해석합니다
device와 device_driver에서 platform 전용 정보를 얻고 override를 검사합니다.
화살표는 포함 관계를 이용한 구조체 포인터 변환입니다.
2. 펌웨어 정보로 맞춥니다
OF 매칭을 먼저 보고 실패하면 ACPI 매칭을 시도합니다.
화살표는 후보 검사 순서이며 probe 호출 자체가 아닙니다.
3. id 표 또는 이름으로 판단합니다
id 표가 있으면 그 결과로 끝내고, 표가 없을 때만 이름 비교를 사용합니다.
갈라지는 화살표는 서로 다른 최종 판정 경로입니다.
platform_match를 한 줄씩 읽기
줄 번호는 v6.18.37 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.
static int platform_match(struct device *dev, const struct device_driver *drv)
{
struct platform_device *pdev = to_platform_device(dev);
struct platform_driver *pdrv = to_platform_driver(drv);
int ret;
/* When driver_override is set, only bind to the matching driver */
ret = device_match_driver_override(dev, drv);
if (ret >= 0)
return ret;
/* Attempt an OF style match first */
if (of_driver_match_device(dev, drv))
return 1;
/* Then try ACPI style match */
if (acpi_driver_match_device(dev, drv))
return 1;
/* Then try to match against the id table */
if (pdrv->id_table)
return platform_match_id(pdrv->id_table, pdev) != NULL;
/* fall-back to driver name match */
return (strcmp(pdev->name, drv->name) == 0);
}static int platform_match(struct device *dev, const struct device_driver *drv)공통 장치와 드라이버가 platform 규칙에 따라 맞는지 정수로 판정합니다.
struct platform_device *pdev = to_platform_device(dev);포함된 공통 device를 바탕으로 이를 감싼 platform_device를 얻습니다. 새 장치를 만드는 할당은 아닙니다.
struct platform_driver *pdrv = to_platform_driver(drv);공통 device_driver에서 platform_driver를 얻어 id 표 등을 볼 수 있게 합니다.
int ret;override 검사 결과를 저장합니다.
ret = device_match_driver_override(dev, drv);장치가 특정 드라이버로 강제 지정됐는지와 일치 여부를 확인합니다.
if (ret >= 0)override 처리에서 이미 판정 가능한 0 이상의 결과가 나왔는지 확인합니다.
return ret;override 판정이 있으면 일반 매칭보다 우선하여 바로 반환합니다.
if (of_driver_match_device(dev, drv))Device Tree의 호환성 정보로 이 장치와 드라이버가 맞는지 검사합니다.
return 1;OF 정보가 맞으면 일치값 1을 반환합니다.
if (acpi_driver_match_device(dev, drv))OF에서 결정되지 않았으면 ACPI 방식의 매칭을 시도합니다.
return 1;ACPI 정보가 맞으면 일치값을 반환합니다.
if (pdrv->id_table)드라이버가 platform id 표를 제공하는지 확인합니다.
return platform_match_id(pdrv->id_table, pdev) != NULL;id 표에 장치 이름이 있으면 참, 없으면 거짓을 바로 반환합니다. 표가 있는 경우 여기서 판정이 끝납니다.
return (strcmp(pdev->name, drv->name) == 0);별도 id 표도 없을 때 장치와 드라이버 이름의 완전 일치를 마지막 기준으로 사용합니다. strcmp의 0을 참으로 바꾸어 반환합니다.
함께 생각해 볼 질문
id 표가 있는데 안 맞으면 드라이버 이름도 비교하나요?
이 코드에서는 id 표의 일치 여부를 바로 반환하므로 이름 비교로 내려가지 않습니다.
매칭이 1이면 IRQ를 이미 요청했나요?
아닙니다. 장치와 드라이버가 맞는다는 판정이며 자원 획득은 probe 등의 후속 단계입니다.
to_platform_device는 새 객체를 할당하나요?
아닙니다. 내부에 포함된 공통 device에서 이를 감싸는 platform_device를 찾아 포인터를 변환합니다.
출처와 읽은 범위
Linux stable v6.18.37 · drivers/base/platform.c
해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고
