# 플랫폼 드라이버: 장치와 구현이 만나는 매칭 순서

v6.6 / drivers/base/platform.c

SoC 내부 장치는 PCI처럼 하드웨어 스스로 모든 정보를 알려주지 못하는 경우가 많습니다. platform 장치 모델은 Device Tree·ACPI·보드 정보 등으로 만들어진 장치를 드라이버와 연결합니다. platform_match 전체는 override, OF, ACPI, id 표와 이름 비교가 어떤 순서로 적용되는지 보여 줍니다. 매칭 결과는 probe를 시도할 근거이지 자원 설정 성공의 증거는 아닙니다.

## platform_match

```c

static int platform_match(struct device *dev, struct device_driver *drv)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct platform_driver *pdrv = to_platform_driver(drv);

	/* When driver_override is set, only bind to the matching driver */
	if (pdev->driver_override)
		return !strcmp(pdev->driver_override, drv->name);

	/* 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);
}

```

### 1335행

```c

static int platform_match(struct device *dev, struct device_driver *drv)

```

공통 장치와 드라이버가 platform 규칙에 따라 맞는지 판정합니다. v6.6 선언의 드라이버 포인터는 const로 한정되어 있지 않습니다.

### 1337행

```c

	struct platform_device *pdev = to_platform_device(dev);

```

포함된 공통 device를 바탕으로 이를 감싼 platform_device를 얻습니다. 새 장치를 만드는 할당은 아닙니다.

### 1338행

```c

	struct platform_driver *pdrv = to_platform_driver(drv);

```

공통 device_driver에서 platform_driver를 얻어 id 표 등을 볼 수 있게 합니다.

### 1341행

```c

	if (pdev->driver_override)

```

platform 장치에 특정 드라이버 이름을 지정하는 override 문자열이 있는지 확인합니다.

### 1342행

```c

		return !strcmp(pdev->driver_override, drv->name);

```

override 문자열과 드라이버 이름이 완전히 같은지 strcmp로 비교해 바로 반환합니다. override가 있으면 불일치해도 일반 매칭으로 내려가지 않습니다.

### 1345행

```c

	if (of_driver_match_device(dev, drv))

```

Device Tree의 호환성 정보로 이 장치와 드라이버가 맞는지 검사합니다.

### 1346행

```c

		return 1;

```

OF 정보가 맞으면 일치값 1을 반환합니다.

### 1349행

```c

	if (acpi_driver_match_device(dev, drv))

```

OF에서 결정되지 않았으면 ACPI 방식의 매칭을 시도합니다.

### 1350행

```c

		return 1;

```

ACPI 정보가 맞으면 일치값을 반환합니다.

### 1353행

```c

	if (pdrv->id_table)

```

드라이버가 platform id 표를 제공하는지 확인합니다.

### 1354행

```c

		return platform_match_id(pdrv->id_table, pdev) != NULL;

```

id 표에 장치 이름이 있으면 참, 없으면 거짓을 바로 반환합니다. 표가 있는 경우 여기서 판정이 끝납니다.

### 1357행

```c

	return (strcmp(pdev->name, drv->name) == 0);

```

별도 id 표도 없을 때 장치와 드라이버 이름의 완전 일치를 마지막 기준으로 사용합니다. strcmp의 0을 참으로 바꾸어 반환합니다.

